[
  {
    "path": ".gitignore",
    "content": ".idea/"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2022 高永立\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# kratos-shop\nkratos 框架写商品微服务\n\n本项目是一个使用 Kratos 框架创建的很简单的微服务商城项目。\n> 注: 本项目中但凡 kratos 提供包,就不会自己封装第三方的包。\n\n主要是为了学习 kratos 如何使用,尤其各种中间件之间的调用,包括微服务的一些技术点。\n\n项目具体目录结构初步设计如下:\n\n```\n|-- kratos-shop\n    |-- service\n        |-- user // 用户服务 grpc\n        |-- goods // 商品服务 grpc\n        |-- cart // 购物车服务 grpc\n        |-- order // 订单服务 grpc\n        |-- inventory // 库存服务服务 grpc\n    |-- shop // shop 商城服务 http (后期会考虑把订单单独拆出来)\n        ├── api  // 商城 api\n        │   ├── service\n        │   │   └── user \n        │   │       └── v1 // 用户服务的 proto\n        │   │   └── goods\n        │   │       └── v1 // 商品服务的 proto\n        │   │           \n        │   └── shop\n        │       └── v1\n        │           ├── error_reason.proto \n        │           ├── shop.proto\n        │── cmd \n        │── internal\n        │.....  \n    |-- admin // 后端管理系统 web \n```\n\n\n* 有任何建议，请扫码添加我微信进行交流。\n\n![扫码提建议](https://cdn.jsdelivr.net/gh/aliliin/blog-image@main/uPic/扫码_搜索联合传播样式-白色版.png)\n\n\n\n"
  },
  {
    "path": "admin/.gitignore",
    "content": "# Reference https://github.com/github/gitignore/blob/master/Go.gitignore\n# Binaries for programs and plugins\n*.exe\n*.exe~\n*.dll\n*.so\n*.dylib\n\n# Test binary, built with `go test -c`\n*.test\n\n# Output of the go coverage tool, specifically when used with LiteIDE\n*.out\n\n# Dependency directories (remove the comment below to include it)\nvendor/\n\n# Compiled Object files, Static and Dynamic libs (Shared Objects)\n*.o\n*.a\n*.so\n\n# OS General\nThumbs.db\n.DS_Store\n\n# project\n*.cert\n*.key\n*.log\nbin/\n\n# Develop tools\n.vscode/\n.idea/\n*.swp\n"
  },
  {
    "path": "admin/Dockerfile",
    "content": "FROM golang:1.16 AS builder\n\nCOPY . /src\nWORKDIR /src\n\nRUN GOPROXY=https://goproxy.cn make build\n\nFROM debian:stable-slim\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n\t\tca-certificates  \\\n        netbase \\\n        && rm -rf /var/lib/apt/lists/ \\\n        && apt-get autoremove -y && apt-get autoclean -y\n\nCOPY --from=builder /src/bin /app\n\nWORKDIR /app\n\nEXPOSE 8000\nEXPOSE 9000\nVOLUME /data/conf\n\nCMD [\"./server\", \"-conf\", \"/data/conf\"]\n"
  },
  {
    "path": "admin/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2020 go-kratos\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "admin/Makefile",
    "content": "GOPATH:=$(shell go env GOPATH)\nVERSION=$(shell git describe --tags --always)\nINTERNAL_PROTO_FILES=$(shell find internal -name *.proto)\nAPI_PROTO_FILES=$(shell find api -name *.proto)\n\n.PHONY: init\n# init env\ninit:\n\tgo install google.golang.org/protobuf/cmd/protoc-gen-go@latest\n\tgo install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest\n\tgo install github.com/go-kratos/kratos/cmd/kratos/v2@latest\n\tgo install github.com/go-kratos/kratos/cmd/protoc-gen-go-http/v2@latest\n\tgo install github.com/go-kratos/kratos/cmd/protoc-gen-go-errors/v2@latest\n\tgo install github.com/google/gnostic/cmd/protoc-gen-openapi@v0.6.1\n\n.PHONY: errors\n# generate errors code\nerrors:\n\tprotoc --proto_path=. \\\n               --proto_path=./third_party \\\n               --go_out=paths=source_relative:. \\\n               --go-errors_out=paths=source_relative:. \\\n               $(API_PROTO_FILES)\n\n.PHONY: config\n# generate internal proto\nconfig:\n\tprotoc --proto_path=. \\\n\t       --proto_path=./third_party \\\n \t       --go_out=paths=source_relative:. \\\n\t       $(INTERNAL_PROTO_FILES)\n\n.PHONY: api\n# generate api proto\napi:\n\tprotoc --proto_path=. \\\n\t       --proto_path=./third_party \\\n \t       --go_out=paths=source_relative:. \\\n \t       --go-http_out=paths=source_relative:. \\\n \t       --go-grpc_out=paths=source_relative:. \\\n \t       --openapi_out==paths=source_relative:. \\\n \t       --validate_out=paths=source_relative,lang=go:. \\\n\t       $(API_PROTO_FILES)\n\n.PHONY: build\n# build\nbuild:\n\tmkdir -p bin/ && go build -ldflags \"-X main.Version=$(VERSION)\" -o ./bin/ ./...\n\n.PHONY: generate\n# generate\ngenerate:\n\tgo generate ./...\n\n# wire\nwire:\n\tcd cmd/admin/ && wire\n\n.PHONY: test # 快速测试，运行repo以外的所有测试\ntest:\n\tginkgo -r -cover -v .\n\n.PHONY: all\n# generate all\nall:\n\tmake api;\n\tmake errors;\n\tmake config;\n\tmake generate;\n\n# show help\nhelp:\n\t@echo ''\n\t@echo 'Usage:'\n\t@echo ' make [target]'\n\t@echo ''\n\t@echo 'Targets:'\n\t@awk '/^[a-zA-Z\\-\\_0-9]+:/ { \\\n\thelpMessage = match(lastLine, /^# (.*)/); \\\n\t\tif (helpMessage) { \\\n\t\t\thelpCommand = substr($$1, 0, index($$1, \":\")-1); \\\n\t\t\thelpMessage = substr(lastLine, RSTART + 2, RLENGTH); \\\n\t\t\tprintf \"\\033[36m%-22s\\033[0m %s\\n\", helpCommand,helpMessage; \\\n\t\t} \\\n\t} \\\n\t{ lastLine = $$0 }' $(MAKEFILE_LIST)\n\n.DEFAULT_GOAL := help\n"
  },
  {
    "path": "admin/api/admin/v1/admin.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.27.1\n// \tprotoc        v3.17.3\n// source: api/admin/v1/admin.proto\n\npackage v1\n\nimport (\n\t_ \"github.com/envoyproxy/protoc-gen-validate/validate\"\n\t_ \"google.golang.org/genproto/googleapis/api/annotations\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\temptypb \"google.golang.org/protobuf/types/known/emptypb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CreateAddressReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUid       int64  `protobuf:\"varint,1,opt,name=uid,proto3\" json:\"uid,omitempty\"`\n\tName      string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tMobile    string `protobuf:\"bytes,3,opt,name=mobile,proto3\" json:\"mobile,omitempty\"`\n\tProvince  string `protobuf:\"bytes,4,opt,name=Province,proto3\" json:\"Province,omitempty\"`\n\tCity      string `protobuf:\"bytes,5,opt,name=City,proto3\" json:\"City,omitempty\"`\n\tDistricts string `protobuf:\"bytes,6,opt,name=Districts,proto3\" json:\"Districts,omitempty\"`\n\tAddress   string `protobuf:\"bytes,7,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tPostCode  string `protobuf:\"bytes,8,opt,name=post_code,json=postCode,proto3\" json:\"post_code,omitempty\"`\n\tIsDefault int32  `protobuf:\"varint,9,opt,name=is_default,json=isDefault,proto3\" json:\"is_default,omitempty\"`\n}\n\nfunc (x *CreateAddressReq) Reset() {\n\t*x = CreateAddressReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_admin_v1_admin_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CreateAddressReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreateAddressReq) ProtoMessage() {}\n\nfunc (x *CreateAddressReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_admin_v1_admin_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreateAddressReq.ProtoReflect.Descriptor instead.\nfunc (*CreateAddressReq) Descriptor() ([]byte, []int) {\n\treturn file_api_admin_v1_admin_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CreateAddressReq) GetUid() int64 {\n\tif x != nil {\n\t\treturn x.Uid\n\t}\n\treturn 0\n}\n\nfunc (x *CreateAddressReq) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetMobile() string {\n\tif x != nil {\n\t\treturn x.Mobile\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetProvince() string {\n\tif x != nil {\n\t\treturn x.Province\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetCity() string {\n\tif x != nil {\n\t\treturn x.City\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetDistricts() string {\n\tif x != nil {\n\t\treturn x.Districts\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetAddress() string {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetPostCode() string {\n\tif x != nil {\n\t\treturn x.PostCode\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetIsDefault() int32 {\n\tif x != nil {\n\t\treturn x.IsDefault\n\t}\n\treturn 0\n}\n\ntype UpdateAddressReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUid       int64  `protobuf:\"varint,1,opt,name=uid,proto3\" json:\"uid,omitempty\"`\n\tName      string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tMobile    string `protobuf:\"bytes,3,opt,name=mobile,proto3\" json:\"mobile,omitempty\"`\n\tProvince  string `protobuf:\"bytes,4,opt,name=Province,proto3\" json:\"Province,omitempty\"`\n\tCity      string `protobuf:\"bytes,5,opt,name=City,proto3\" json:\"City,omitempty\"`\n\tDistricts string `protobuf:\"bytes,6,opt,name=Districts,proto3\" json:\"Districts,omitempty\"`\n\tAddress   string `protobuf:\"bytes,7,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tPostCode  string `protobuf:\"bytes,8,opt,name=post_code,json=postCode,proto3\" json:\"post_code,omitempty\"`\n\tIsDefault int32  `protobuf:\"varint,9,opt,name=is_default,json=isDefault,proto3\" json:\"is_default,omitempty\"`\n\tId        int64  `protobuf:\"varint,10,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *UpdateAddressReq) Reset() {\n\t*x = UpdateAddressReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_admin_v1_admin_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *UpdateAddressReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UpdateAddressReq) ProtoMessage() {}\n\nfunc (x *UpdateAddressReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_admin_v1_admin_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UpdateAddressReq.ProtoReflect.Descriptor instead.\nfunc (*UpdateAddressReq) Descriptor() ([]byte, []int) {\n\treturn file_api_admin_v1_admin_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *UpdateAddressReq) GetUid() int64 {\n\tif x != nil {\n\t\treturn x.Uid\n\t}\n\treturn 0\n}\n\nfunc (x *UpdateAddressReq) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetMobile() string {\n\tif x != nil {\n\t\treturn x.Mobile\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetProvince() string {\n\tif x != nil {\n\t\treturn x.Province\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetCity() string {\n\tif x != nil {\n\t\treturn x.City\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetDistricts() string {\n\tif x != nil {\n\t\treturn x.Districts\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetAddress() string {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetPostCode() string {\n\tif x != nil {\n\t\treturn x.PostCode\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetIsDefault() int32 {\n\tif x != nil {\n\t\treturn x.IsDefault\n\t}\n\treturn 0\n}\n\nfunc (x *UpdateAddressReq) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\ntype AddressInfo struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId        int64  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName      string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tMobile    string `protobuf:\"bytes,3,opt,name=mobile,proto3\" json:\"mobile,omitempty\"`\n\tProvince  string `protobuf:\"bytes,4,opt,name=Province,proto3\" json:\"Province,omitempty\"`\n\tCity      string `protobuf:\"bytes,5,opt,name=City,proto3\" json:\"City,omitempty\"`\n\tDistricts string `protobuf:\"bytes,6,opt,name=Districts,proto3\" json:\"Districts,omitempty\"`\n\tAddress   string `protobuf:\"bytes,7,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tPostCode  string `protobuf:\"bytes,8,opt,name=post_code,json=postCode,proto3\" json:\"post_code,omitempty\"`\n\tIsDefault int32  `protobuf:\"varint,9,opt,name=is_default,json=isDefault,proto3\" json:\"is_default,omitempty\"`\n}\n\nfunc (x *AddressInfo) Reset() {\n\t*x = AddressInfo{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_admin_v1_admin_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AddressInfo) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AddressInfo) ProtoMessage() {}\n\nfunc (x *AddressInfo) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_admin_v1_admin_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AddressInfo.ProtoReflect.Descriptor instead.\nfunc (*AddressInfo) Descriptor() ([]byte, []int) {\n\treturn file_api_admin_v1_admin_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *AddressInfo) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *AddressInfo) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetMobile() string {\n\tif x != nil {\n\t\treturn x.Mobile\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetProvince() string {\n\tif x != nil {\n\t\treturn x.Province\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetCity() string {\n\tif x != nil {\n\t\treturn x.City\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetDistricts() string {\n\tif x != nil {\n\t\treturn x.Districts\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetAddress() string {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetPostCode() string {\n\tif x != nil {\n\t\treturn x.PostCode\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetIsDefault() int32 {\n\tif x != nil {\n\t\treturn x.IsDefault\n\t}\n\treturn 0\n}\n\ntype ListAddressReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUid int64 `protobuf:\"varint,1,opt,name=uid,proto3\" json:\"uid,omitempty\"`\n}\n\nfunc (x *ListAddressReq) Reset() {\n\t*x = ListAddressReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_admin_v1_admin_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListAddressReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListAddressReq) ProtoMessage() {}\n\nfunc (x *ListAddressReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_admin_v1_admin_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListAddressReq.ProtoReflect.Descriptor instead.\nfunc (*ListAddressReq) Descriptor() ([]byte, []int) {\n\treturn file_api_admin_v1_admin_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *ListAddressReq) GetUid() int64 {\n\tif x != nil {\n\t\treturn x.Uid\n\t}\n\treturn 0\n}\n\ntype ListAddressReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tResults []*AddressInfo `protobuf:\"bytes,1,rep,name=results,proto3\" json:\"results,omitempty\"`\n}\n\nfunc (x *ListAddressReply) Reset() {\n\t*x = ListAddressReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_admin_v1_admin_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListAddressReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListAddressReply) ProtoMessage() {}\n\nfunc (x *ListAddressReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_admin_v1_admin_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListAddressReply.ProtoReflect.Descriptor instead.\nfunc (*ListAddressReply) Descriptor() ([]byte, []int) {\n\treturn file_api_admin_v1_admin_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *ListAddressReply) GetResults() []*AddressInfo {\n\tif x != nil {\n\t\treturn x.Results\n\t}\n\treturn nil\n}\n\ntype AddressReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId  int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tUid int64 `protobuf:\"varint,2,opt,name=uid,proto3\" json:\"uid,omitempty\"`\n}\n\nfunc (x *AddressReq) Reset() {\n\t*x = AddressReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_admin_v1_admin_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AddressReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AddressReq) ProtoMessage() {}\n\nfunc (x *AddressReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_admin_v1_admin_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AddressReq.ProtoReflect.Descriptor instead.\nfunc (*AddressReq) Descriptor() ([]byte, []int) {\n\treturn file_api_admin_v1_admin_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *AddressReq) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *AddressReq) GetUid() int64 {\n\tif x != nil {\n\t\treturn x.Uid\n\t}\n\treturn 0\n}\n\ntype CheckResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tSuccess bool `protobuf:\"varint,1,opt,name=success,proto3\" json:\"success,omitempty\"`\n}\n\nfunc (x *CheckResponse) Reset() {\n\t*x = CheckResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_admin_v1_admin_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CheckResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CheckResponse) ProtoMessage() {}\n\nfunc (x *CheckResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_admin_v1_admin_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CheckResponse.ProtoReflect.Descriptor instead.\nfunc (*CheckResponse) Descriptor() ([]byte, []int) {\n\treturn file_api_admin_v1_admin_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *CheckResponse) GetSuccess() bool {\n\tif x != nil {\n\t\treturn x.Success\n\t}\n\treturn false\n}\n\n// Data returned by registration and login\ntype RegisterReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId        int64  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tMobile    string `protobuf:\"bytes,3,opt,name=mobile,proto3\" json:\"mobile,omitempty\"`\n\tUsername  string `protobuf:\"bytes,4,opt,name=username,proto3\" json:\"username,omitempty\"`\n\tToken     string `protobuf:\"bytes,5,opt,name=token,proto3\" json:\"token,omitempty\"`\n\tExpiredAt int64  `protobuf:\"varint,6,opt,name=expiredAt,proto3\" json:\"expiredAt,omitempty\"`\n}\n\nfunc (x *RegisterReply) Reset() {\n\t*x = RegisterReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_admin_v1_admin_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RegisterReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RegisterReply) ProtoMessage() {}\n\nfunc (x *RegisterReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_admin_v1_admin_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RegisterReply.ProtoReflect.Descriptor instead.\nfunc (*RegisterReply) Descriptor() ([]byte, []int) {\n\treturn file_api_admin_v1_admin_proto_rawDescGZIP(), []int{7}\n}\n\nfunc (x *RegisterReply) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *RegisterReply) GetMobile() string {\n\tif x != nil {\n\t\treturn x.Mobile\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReply) GetUsername() string {\n\tif x != nil {\n\t\treturn x.Username\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReply) GetToken() string {\n\tif x != nil {\n\t\treturn x.Token\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReply) GetExpiredAt() int64 {\n\tif x != nil {\n\t\treturn x.ExpiredAt\n\t}\n\treturn 0\n}\n\ntype RegisterReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMobile   string `protobuf:\"bytes,1,opt,name=mobile,proto3\" json:\"mobile,omitempty\"`\n\tUsername string `protobuf:\"bytes,2,opt,name=username,proto3\" json:\"username,omitempty\"`\n\tPassword string `protobuf:\"bytes,3,opt,name=password,proto3\" json:\"password,omitempty\"`\n}\n\nfunc (x *RegisterReq) Reset() {\n\t*x = RegisterReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_admin_v1_admin_proto_msgTypes[8]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RegisterReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RegisterReq) ProtoMessage() {}\n\nfunc (x *RegisterReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_admin_v1_admin_proto_msgTypes[8]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RegisterReq.ProtoReflect.Descriptor instead.\nfunc (*RegisterReq) Descriptor() ([]byte, []int) {\n\treturn file_api_admin_v1_admin_proto_rawDescGZIP(), []int{8}\n}\n\nfunc (x *RegisterReq) GetMobile() string {\n\tif x != nil {\n\t\treturn x.Mobile\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetUsername() string {\n\tif x != nil {\n\t\treturn x.Username\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\ntype LoginReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUsername string `protobuf:\"bytes,1,opt,name=username,proto3\" json:\"username,omitempty\"`\n\tPassword string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\"`\n}\n\nfunc (x *LoginReq) Reset() {\n\t*x = LoginReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_admin_v1_admin_proto_msgTypes[9]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *LoginReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*LoginReq) ProtoMessage() {}\n\nfunc (x *LoginReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_admin_v1_admin_proto_msgTypes[9]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use LoginReq.ProtoReflect.Descriptor instead.\nfunc (*LoginReq) Descriptor() ([]byte, []int) {\n\treturn file_api_admin_v1_admin_proto_rawDescGZIP(), []int{9}\n}\n\nfunc (x *LoginReq) GetUsername() string {\n\tif x != nil {\n\t\treturn x.Username\n\t}\n\treturn \"\"\n}\n\nfunc (x *LoginReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\n// user Detail returned\ntype UserDetailResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId       int64  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tMobile   string `protobuf:\"bytes,2,opt,name=mobile,proto3\" json:\"mobile,omitempty\"`\n\tNickName string `protobuf:\"bytes,3,opt,name=nickName,proto3\" json:\"nickName,omitempty\"`\n\tBirthday int64  `protobuf:\"varint,4,opt,name=birthday,proto3\" json:\"birthday,omitempty\"`\n\tGender   string `protobuf:\"bytes,5,opt,name=gender,proto3\" json:\"gender,omitempty\"`\n\tRole     int32  `protobuf:\"varint,6,opt,name=role,proto3\" json:\"role,omitempty\"`\n}\n\nfunc (x *UserDetailResponse) Reset() {\n\t*x = UserDetailResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_admin_v1_admin_proto_msgTypes[10]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *UserDetailResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UserDetailResponse) ProtoMessage() {}\n\nfunc (x *UserDetailResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_admin_v1_admin_proto_msgTypes[10]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UserDetailResponse.ProtoReflect.Descriptor instead.\nfunc (*UserDetailResponse) Descriptor() ([]byte, []int) {\n\treturn file_api_admin_v1_admin_proto_rawDescGZIP(), []int{10}\n}\n\nfunc (x *UserDetailResponse) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *UserDetailResponse) GetMobile() string {\n\tif x != nil {\n\t\treturn x.Mobile\n\t}\n\treturn \"\"\n}\n\nfunc (x *UserDetailResponse) GetNickName() string {\n\tif x != nil {\n\t\treturn x.NickName\n\t}\n\treturn \"\"\n}\n\nfunc (x *UserDetailResponse) GetBirthday() int64 {\n\tif x != nil {\n\t\treturn x.Birthday\n\t}\n\treturn 0\n}\n\nfunc (x *UserDetailResponse) GetGender() string {\n\tif x != nil {\n\t\treturn x.Gender\n\t}\n\treturn \"\"\n}\n\nfunc (x *UserDetailResponse) GetRole() int32 {\n\tif x != nil {\n\t\treturn x.Role\n\t}\n\treturn 0\n}\n\ntype CaptchaReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tCaptchaId string `protobuf:\"bytes,1,opt,name=captchaId,proto3\" json:\"captchaId,omitempty\"`\n\tPicPath   string `protobuf:\"bytes,2,opt,name=picPath,proto3\" json:\"picPath,omitempty\"`\n}\n\nfunc (x *CaptchaReply) Reset() {\n\t*x = CaptchaReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_admin_v1_admin_proto_msgTypes[11]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CaptchaReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CaptchaReply) ProtoMessage() {}\n\nfunc (x *CaptchaReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_admin_v1_admin_proto_msgTypes[11]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CaptchaReply.ProtoReflect.Descriptor instead.\nfunc (*CaptchaReply) Descriptor() ([]byte, []int) {\n\treturn file_api_admin_v1_admin_proto_rawDescGZIP(), []int{11}\n}\n\nfunc (x *CaptchaReply) GetCaptchaId() string {\n\tif x != nil {\n\t\treturn x.CaptchaId\n\t}\n\treturn \"\"\n}\n\nfunc (x *CaptchaReply) GetPicPath() string {\n\tif x != nil {\n\t\treturn x.PicPath\n\t}\n\treturn \"\"\n}\n\nvar File_api_admin_v1_admin_proto protoreflect.FileDescriptor\n\nvar file_api_admin_v1_admin_proto_rawDesc = []byte{\n\t0x0a, 0x18, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2f, 0x76, 0x31, 0x2f, 0x61,\n\t0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x61, 0x64, 0x6d, 0x69,\n\t0x6e, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69,\n\t0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f,\n\t0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,\n\t0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xab,\n\t0x02, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,\n\t0x52, 0x65, 0x71, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03,\n\t0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x12, 0x20, 0x0a, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x98, 0x01, 0x0b, 0x52, 0x06, 0x6d, 0x6f,\n\t0x62, 0x69, 0x6c, 0x65, 0x12, 0x23, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65,\n\t0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52,\n\t0x08, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x04, 0x43, 0x69, 0x74,\n\t0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01,\n\t0x52, 0x04, 0x43, 0x69, 0x74, 0x79, 0x12, 0x25, 0x0a, 0x09, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69,\n\t0x63, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02,\n\t0x10, 0x01, 0x52, 0x09, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x73, 0x12, 0x21, 0x0a,\n\t0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07,\n\t0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,\n\t0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1d, 0x0a,\n\t0x0a, 0x69, 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28,\n\t0x05, 0x52, 0x09, 0x69, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0xbb, 0x02, 0x0a,\n\t0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65,\n\t0x71, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03,\n\t0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c,\n\t0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x98, 0x01,\n\t0x0b, 0x52, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x12, 0x23, 0x0a, 0x08, 0x50, 0x72, 0x6f,\n\t0x76, 0x69, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04,\n\t0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x1b,\n\t0x0a, 0x04, 0x43, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42,\n\t0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x43, 0x69, 0x74, 0x79, 0x12, 0x25, 0x0a, 0x09, 0x44,\n\t0x69, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07,\n\t0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x63,\n\t0x74, 0x73, 0x12, 0x21, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x07, 0x20,\n\t0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x61, 0x64,\n\t0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x73, 0x74, 0x5f, 0x63, 0x6f,\n\t0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x74, 0x43, 0x6f,\n\t0x64, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74,\n\t0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x69, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c,\n\t0x74, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa,\n\t0x42, 0x04, 0x22, 0x02, 0x28, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0x80, 0x02, 0x0a, 0x0b, 0x41,\n\t0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10,\n\t0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c,\n\t0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x98, 0x01,\n\t0x0b, 0x52, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f,\n\t0x76, 0x69, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f,\n\t0x76, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x04, 0x43, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x69, 0x73,\n\t0x74, 0x72, 0x69, 0x63, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x69,\n\t0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65,\n\t0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73,\n\t0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x08,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1d,\n\t0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x09, 0x20, 0x01,\n\t0x28, 0x05, 0x52, 0x09, 0x69, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x22, 0x0a,\n\t0x0e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x12,\n\t0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x75, 0x69,\n\t0x64, 0x22, 0x49, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,\n\t0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x35, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73,\n\t0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61,\n\t0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49,\n\t0x6e, 0x66, 0x6f, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x37, 0x0a, 0x0a,\n\t0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x28, 0x01, 0x52,\n\t0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03,\n\t0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0x29, 0x0a, 0x0d, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65,\n\t0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73,\n\t0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73,\n\t0x22, 0x87, 0x01, 0x0a, 0x0d, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x70,\n\t0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02,\n\t0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73,\n\t0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73,\n\t0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18,\n\t0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1c, 0x0a, 0x09,\n\t0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x41, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52,\n\t0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x41, 0x74, 0x22, 0x7b, 0x0a, 0x0b, 0x52, 0x65,\n\t0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x20, 0x0a, 0x06, 0x6d, 0x6f, 0x62,\n\t0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03,\n\t0x98, 0x01, 0x0b, 0x52, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x12, 0x25, 0x0a, 0x08, 0x75,\n\t0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xfa,\n\t0x42, 0x06, 0x72, 0x04, 0x10, 0x03, 0x18, 0x0f, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61,\n\t0x6d, 0x65, 0x12, 0x23, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x08, 0x52, 0x08, 0x70,\n\t0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x54, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x69, 0x6e,\n\t0x52, 0x65, 0x71, 0x12, 0x23, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x03, 0x52, 0x08,\n\t0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73,\n\t0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72,\n\t0x02, 0x10, 0x08, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0xa0, 0x01,\n\t0x0a, 0x12, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70,\n\t0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03,\n\t0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08,\n\t0x6e, 0x69, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,\n\t0x6e, 0x69, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x69, 0x72, 0x74,\n\t0x68, 0x64, 0x61, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x62, 0x69, 0x72, 0x74,\n\t0x68, 0x64, 0x61, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x67, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x05,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x67, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04,\n\t0x72, 0x6f, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65,\n\t0x22, 0x46, 0x0a, 0x0c, 0x43, 0x61, 0x70, 0x74, 0x63, 0x68, 0x61, 0x52, 0x65, 0x70, 0x6c, 0x79,\n\t0x12, 0x1c, 0x0a, 0x09, 0x63, 0x61, 0x70, 0x74, 0x63, 0x68, 0x61, 0x49, 0x64, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x61, 0x70, 0x74, 0x63, 0x68, 0x61, 0x49, 0x64, 0x12, 0x18,\n\t0x0a, 0x07, 0x70, 0x69, 0x63, 0x50, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x07, 0x70, 0x69, 0x63, 0x50, 0x61, 0x74, 0x68, 0x32, 0xb2, 0x07, 0x0a, 0x05, 0x61, 0x64, 0x6d,\n\t0x69, 0x6e, 0x12, 0x66, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1b,\n\t0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e,\n\t0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1d, 0x2e, 0x61, 0x64,\n\t0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67,\n\t0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93,\n\t0x02, 0x18, 0x22, 0x13, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x72,\n\t0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x5d, 0x0a, 0x05, 0x4c, 0x6f,\n\t0x67, 0x69, 0x6e, 0x12, 0x18, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x64, 0x6d, 0x69,\n\t0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1d, 0x2e,\n\t0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x52,\n\t0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1b, 0x82, 0xd3,\n\t0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73,\n\t0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x07, 0x43, 0x61, 0x70,\n\t0x74, 0x63, 0x68, 0x61, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1c, 0x2e, 0x61,\n\t0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61,\n\t0x70, 0x74, 0x63, 0x68, 0x61, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93,\n\t0x02, 0x14, 0x12, 0x12, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x63,\n\t0x61, 0x70, 0x74, 0x63, 0x68, 0x61, 0x12, 0x5f, 0x0a, 0x06, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c,\n\t0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,\n\t0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e,\n\t0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65,\n\t0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x82, 0xd3,\n\t0xe4, 0x93, 0x02, 0x13, 0x12, 0x11, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73,\n\t0x2f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x6e, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74,\n\t0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e,\n\t0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,\n\t0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x61, 0x64, 0x6d,\n\t0x69, 0x6e, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72,\n\t0x65, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22,\n\t0x13, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2f, 0x63, 0x72,\n\t0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x10, 0x41, 0x64, 0x64, 0x72, 0x65,\n\t0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x79, 0x55, 0x69, 0x64, 0x12, 0x16, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d,\n\t0x70, 0x74, 0x79, 0x1a, 0x20, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x64, 0x6d, 0x69,\n\t0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,\n\t0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f,\n\t0x61, 0x70, 0x69, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74,\n\t0x2f, 0x75, 0x69, 0x64, 0x12, 0x70, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x64,\n\t0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x64,\n\t0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x64, 0x64,\n\t0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1d, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e,\n\t0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65,\n\t0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13,\n\t0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2f, 0x75, 0x70, 0x64,\n\t0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c,\n\t0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e,\n\t0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73,\n\t0x73, 0x52, 0x65, 0x71, 0x1a, 0x1d, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x64, 0x6d,\n\t0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f,\n\t0x6e, 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x1a, 0x14, 0x2f, 0x61, 0x70,\n\t0x69, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c,\n\t0x74, 0x3a, 0x01, 0x2a, 0x12, 0x67, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x64,\n\t0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x64,\n\t0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65,\n\t0x71, 0x1a, 0x1d, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e,\n\t0x76, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61,\n\t0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x17, 0x5a,\n\t0x15, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x64, 0x6d, 0x69, 0x6e,\n\t0x2f, 0x76, 0x31, 0x3b, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_api_admin_v1_admin_proto_rawDescOnce sync.Once\n\tfile_api_admin_v1_admin_proto_rawDescData = file_api_admin_v1_admin_proto_rawDesc\n)\n\nfunc file_api_admin_v1_admin_proto_rawDescGZIP() []byte {\n\tfile_api_admin_v1_admin_proto_rawDescOnce.Do(func() {\n\t\tfile_api_admin_v1_admin_proto_rawDescData = protoimpl.X.CompressGZIP(file_api_admin_v1_admin_proto_rawDescData)\n\t})\n\treturn file_api_admin_v1_admin_proto_rawDescData\n}\n\nvar file_api_admin_v1_admin_proto_msgTypes = make([]protoimpl.MessageInfo, 12)\nvar file_api_admin_v1_admin_proto_goTypes = []interface{}{\n\t(*CreateAddressReq)(nil),   // 0: admin.admin.v1.CreateAddressReq\n\t(*UpdateAddressReq)(nil),   // 1: admin.admin.v1.UpdateAddressReq\n\t(*AddressInfo)(nil),        // 2: admin.admin.v1.AddressInfo\n\t(*ListAddressReq)(nil),     // 3: admin.admin.v1.ListAddressReq\n\t(*ListAddressReply)(nil),   // 4: admin.admin.v1.ListAddressReply\n\t(*AddressReq)(nil),         // 5: admin.admin.v1.AddressReq\n\t(*CheckResponse)(nil),      // 6: admin.admin.v1.CheckResponse\n\t(*RegisterReply)(nil),      // 7: admin.admin.v1.RegisterReply\n\t(*RegisterReq)(nil),        // 8: admin.admin.v1.RegisterReq\n\t(*LoginReq)(nil),           // 9: admin.admin.v1.LoginReq\n\t(*UserDetailResponse)(nil), // 10: admin.admin.v1.UserDetailResponse\n\t(*CaptchaReply)(nil),       // 11: admin.admin.v1.CaptchaReply\n\t(*emptypb.Empty)(nil),      // 12: google.protobuf.Empty\n}\nvar file_api_admin_v1_admin_proto_depIdxs = []int32{\n\t2,  // 0: admin.admin.v1.ListAddressReply.results:type_name -> admin.admin.v1.AddressInfo\n\t8,  // 1: admin.admin.v1.admin.Register:input_type -> admin.admin.v1.RegisterReq\n\t9,  // 2: admin.admin.v1.admin.Login:input_type -> admin.admin.v1.LoginReq\n\t12, // 3: admin.admin.v1.admin.Captcha:input_type -> google.protobuf.Empty\n\t12, // 4: admin.admin.v1.admin.Detail:input_type -> google.protobuf.Empty\n\t0,  // 5: admin.admin.v1.admin.CreateAddress:input_type -> admin.admin.v1.CreateAddressReq\n\t12, // 6: admin.admin.v1.admin.AddressListByUid:input_type -> google.protobuf.Empty\n\t1,  // 7: admin.admin.v1.admin.UpdateAddress:input_type -> admin.admin.v1.UpdateAddressReq\n\t5,  // 8: admin.admin.v1.admin.DefaultAddress:input_type -> admin.admin.v1.AddressReq\n\t5,  // 9: admin.admin.v1.admin.DeleteAddress:input_type -> admin.admin.v1.AddressReq\n\t7,  // 10: admin.admin.v1.admin.Register:output_type -> admin.admin.v1.RegisterReply\n\t7,  // 11: admin.admin.v1.admin.Login:output_type -> admin.admin.v1.RegisterReply\n\t11, // 12: admin.admin.v1.admin.Captcha:output_type -> admin.admin.v1.CaptchaReply\n\t10, // 13: admin.admin.v1.admin.Detail:output_type -> admin.admin.v1.UserDetailResponse\n\t2,  // 14: admin.admin.v1.admin.CreateAddress:output_type -> admin.admin.v1.AddressInfo\n\t4,  // 15: admin.admin.v1.admin.AddressListByUid:output_type -> admin.admin.v1.ListAddressReply\n\t6,  // 16: admin.admin.v1.admin.UpdateAddress:output_type -> admin.admin.v1.CheckResponse\n\t6,  // 17: admin.admin.v1.admin.DefaultAddress:output_type -> admin.admin.v1.CheckResponse\n\t6,  // 18: admin.admin.v1.admin.DeleteAddress:output_type -> admin.admin.v1.CheckResponse\n\t10, // [10:19] is the sub-list for method output_type\n\t1,  // [1:10] is the sub-list for method input_type\n\t1,  // [1:1] is the sub-list for extension type_name\n\t1,  // [1:1] is the sub-list for extension extendee\n\t0,  // [0:1] is the sub-list for field type_name\n}\n\nfunc init() { file_api_admin_v1_admin_proto_init() }\nfunc file_api_admin_v1_admin_proto_init() {\n\tif File_api_admin_v1_admin_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_api_admin_v1_admin_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CreateAddressReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_admin_v1_admin_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*UpdateAddressReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_admin_v1_admin_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AddressInfo); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_admin_v1_admin_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListAddressReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_admin_v1_admin_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListAddressReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_admin_v1_admin_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AddressReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_admin_v1_admin_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CheckResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_admin_v1_admin_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RegisterReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_admin_v1_admin_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RegisterReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_admin_v1_admin_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*LoginReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_admin_v1_admin_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*UserDetailResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_admin_v1_admin_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CaptchaReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_api_admin_v1_admin_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   12,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_api_admin_v1_admin_proto_goTypes,\n\t\tDependencyIndexes: file_api_admin_v1_admin_proto_depIdxs,\n\t\tMessageInfos:      file_api_admin_v1_admin_proto_msgTypes,\n\t}.Build()\n\tFile_api_admin_v1_admin_proto = out.File\n\tfile_api_admin_v1_admin_proto_rawDesc = nil\n\tfile_api_admin_v1_admin_proto_goTypes = nil\n\tfile_api_admin_v1_admin_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "admin/api/admin/v1/admin.pb.validate.go",
    "content": "// Code generated by protoc-gen-validate. DO NOT EDIT.\n// source: api/admin/v1/admin.proto\n\npackage v1\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"net/mail\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"sort\"\n\t\"strings\"\n\t\"time\"\n\t\"unicode/utf8\"\n\n\t\"google.golang.org/protobuf/types/known/anypb\"\n)\n\n// ensure the imports are used\nvar (\n\t_ = bytes.MinRead\n\t_ = errors.New(\"\")\n\t_ = fmt.Print\n\t_ = utf8.UTFMax\n\t_ = (*regexp.Regexp)(nil)\n\t_ = (*strings.Reader)(nil)\n\t_ = net.IPv4len\n\t_ = time.Duration(0)\n\t_ = (*url.URL)(nil)\n\t_ = (*mail.Address)(nil)\n\t_ = anypb.Any{}\n\t_ = sort.Sort\n)\n\n// Validate checks the field values on CreateAddressReq with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *CreateAddressReq) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CreateAddressReq with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// CreateAddressReqMultiError, or nil if none found.\nfunc (m *CreateAddressReq) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CreateAddressReq) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Uid\n\n\tif utf8.RuneCountInString(m.GetName()) < 1 {\n\t\terr := CreateAddressReqValidationError{\n\t\t\tfield:  \"Name\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetMobile()) != 11 {\n\t\terr := CreateAddressReqValidationError{\n\t\t\tfield:  \"Mobile\",\n\t\t\treason: \"value length must be 11 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\n\t}\n\n\tif utf8.RuneCountInString(m.GetProvince()) < 1 {\n\t\terr := CreateAddressReqValidationError{\n\t\t\tfield:  \"Province\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetCity()) < 1 {\n\t\terr := CreateAddressReqValidationError{\n\t\t\tfield:  \"City\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetDistricts()) < 1 {\n\t\terr := CreateAddressReqValidationError{\n\t\t\tfield:  \"Districts\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetAddress()) < 1 {\n\t\terr := CreateAddressReqValidationError{\n\t\t\tfield:  \"Address\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\t// no validation rules for PostCode\n\n\t// no validation rules for IsDefault\n\n\tif len(errors) > 0 {\n\t\treturn CreateAddressReqMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CreateAddressReqMultiError is an error wrapping multiple validation errors\n// returned by CreateAddressReq.ValidateAll() if the designated constraints\n// aren't met.\ntype CreateAddressReqMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CreateAddressReqMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CreateAddressReqMultiError) AllErrors() []error { return m }\n\n// CreateAddressReqValidationError is the validation error returned by\n// CreateAddressReq.Validate if the designated constraints aren't met.\ntype CreateAddressReqValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CreateAddressReqValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CreateAddressReqValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CreateAddressReqValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CreateAddressReqValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CreateAddressReqValidationError) ErrorName() string { return \"CreateAddressReqValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e CreateAddressReqValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCreateAddressReq.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CreateAddressReqValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CreateAddressReqValidationError{}\n\n// Validate checks the field values on UpdateAddressReq with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *UpdateAddressReq) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on UpdateAddressReq with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// UpdateAddressReqMultiError, or nil if none found.\nfunc (m *UpdateAddressReq) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *UpdateAddressReq) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Uid\n\n\t// no validation rules for Name\n\n\tif utf8.RuneCountInString(m.GetMobile()) != 11 {\n\t\terr := UpdateAddressReqValidationError{\n\t\t\tfield:  \"Mobile\",\n\t\t\treason: \"value length must be 11 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\n\t}\n\n\tif utf8.RuneCountInString(m.GetProvince()) < 1 {\n\t\terr := UpdateAddressReqValidationError{\n\t\t\tfield:  \"Province\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetCity()) < 1 {\n\t\terr := UpdateAddressReqValidationError{\n\t\t\tfield:  \"City\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetDistricts()) < 1 {\n\t\terr := UpdateAddressReqValidationError{\n\t\t\tfield:  \"Districts\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetAddress()) < 1 {\n\t\terr := UpdateAddressReqValidationError{\n\t\t\tfield:  \"Address\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\t// no validation rules for PostCode\n\n\t// no validation rules for IsDefault\n\n\tif m.GetId() < 1 {\n\t\terr := UpdateAddressReqValidationError{\n\t\t\tfield:  \"Id\",\n\t\t\treason: \"value must be greater than or equal to 1\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn UpdateAddressReqMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// UpdateAddressReqMultiError is an error wrapping multiple validation errors\n// returned by UpdateAddressReq.ValidateAll() if the designated constraints\n// aren't met.\ntype UpdateAddressReqMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m UpdateAddressReqMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m UpdateAddressReqMultiError) AllErrors() []error { return m }\n\n// UpdateAddressReqValidationError is the validation error returned by\n// UpdateAddressReq.Validate if the designated constraints aren't met.\ntype UpdateAddressReqValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e UpdateAddressReqValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e UpdateAddressReqValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e UpdateAddressReqValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e UpdateAddressReqValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e UpdateAddressReqValidationError) ErrorName() string { return \"UpdateAddressReqValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e UpdateAddressReqValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sUpdateAddressReq.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = UpdateAddressReqValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = UpdateAddressReqValidationError{}\n\n// Validate checks the field values on AddressInfo with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *AddressInfo) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on AddressInfo with the rules defined in\n// the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in AddressInfoMultiError, or\n// nil if none found.\nfunc (m *AddressInfo) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *AddressInfo) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\tif utf8.RuneCountInString(m.GetName()) < 1 {\n\t\terr := AddressInfoValidationError{\n\t\t\tfield:  \"Name\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetMobile()) != 11 {\n\t\terr := AddressInfoValidationError{\n\t\t\tfield:  \"Mobile\",\n\t\t\treason: \"value length must be 11 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\n\t}\n\n\t// no validation rules for Province\n\n\t// no validation rules for City\n\n\t// no validation rules for Districts\n\n\t// no validation rules for Address\n\n\t// no validation rules for PostCode\n\n\t// no validation rules for IsDefault\n\n\tif len(errors) > 0 {\n\t\treturn AddressInfoMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// AddressInfoMultiError is an error wrapping multiple validation errors\n// returned by AddressInfo.ValidateAll() if the designated constraints aren't met.\ntype AddressInfoMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m AddressInfoMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m AddressInfoMultiError) AllErrors() []error { return m }\n\n// AddressInfoValidationError is the validation error returned by\n// AddressInfo.Validate if the designated constraints aren't met.\ntype AddressInfoValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e AddressInfoValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e AddressInfoValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e AddressInfoValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e AddressInfoValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e AddressInfoValidationError) ErrorName() string { return \"AddressInfoValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e AddressInfoValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sAddressInfo.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = AddressInfoValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = AddressInfoValidationError{}\n\n// Validate checks the field values on ListAddressReq with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *ListAddressReq) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on ListAddressReq with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in ListAddressReqMultiError,\n// or nil if none found.\nfunc (m *ListAddressReq) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *ListAddressReq) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Uid\n\n\tif len(errors) > 0 {\n\t\treturn ListAddressReqMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// ListAddressReqMultiError is an error wrapping multiple validation errors\n// returned by ListAddressReq.ValidateAll() if the designated constraints\n// aren't met.\ntype ListAddressReqMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m ListAddressReqMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m ListAddressReqMultiError) AllErrors() []error { return m }\n\n// ListAddressReqValidationError is the validation error returned by\n// ListAddressReq.Validate if the designated constraints aren't met.\ntype ListAddressReqValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e ListAddressReqValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e ListAddressReqValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e ListAddressReqValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e ListAddressReqValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e ListAddressReqValidationError) ErrorName() string { return \"ListAddressReqValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e ListAddressReqValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sListAddressReq.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = ListAddressReqValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = ListAddressReqValidationError{}\n\n// Validate checks the field values on ListAddressReply with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *ListAddressReply) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on ListAddressReply with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// ListAddressReplyMultiError, or nil if none found.\nfunc (m *ListAddressReply) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *ListAddressReply) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\tfor idx, item := range m.GetResults() {\n\t\t_, _ = idx, item\n\n\t\tif all {\n\t\t\tswitch v := interface{}(item).(type) {\n\t\t\tcase interface{ ValidateAll() error }:\n\t\t\t\tif err := v.ValidateAll(); err != nil {\n\t\t\t\t\terrors = append(errors, ListAddressReplyValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"Results[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\tcase interface{ Validate() error }:\n\t\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\t\terrors = append(errors, ListAddressReplyValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"Results[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t} else if v, ok := interface{}(item).(interface{ Validate() error }); ok {\n\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\treturn ListAddressReplyValidationError{\n\t\t\t\t\tfield:  fmt.Sprintf(\"Results[%v]\", idx),\n\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\tcause:  err,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn ListAddressReplyMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// ListAddressReplyMultiError is an error wrapping multiple validation errors\n// returned by ListAddressReply.ValidateAll() if the designated constraints\n// aren't met.\ntype ListAddressReplyMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m ListAddressReplyMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m ListAddressReplyMultiError) AllErrors() []error { return m }\n\n// ListAddressReplyValidationError is the validation error returned by\n// ListAddressReply.Validate if the designated constraints aren't met.\ntype ListAddressReplyValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e ListAddressReplyValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e ListAddressReplyValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e ListAddressReplyValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e ListAddressReplyValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e ListAddressReplyValidationError) ErrorName() string { return \"ListAddressReplyValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e ListAddressReplyValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sListAddressReply.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = ListAddressReplyValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = ListAddressReplyValidationError{}\n\n// Validate checks the field values on AddressReq with the rules defined in the\n// proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *AddressReq) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on AddressReq with the rules defined in\n// the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in AddressReqMultiError, or\n// nil if none found.\nfunc (m *AddressReq) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *AddressReq) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\tif m.GetId() < 1 {\n\t\terr := AddressReqValidationError{\n\t\t\tfield:  \"Id\",\n\t\t\treason: \"value must be greater than or equal to 1\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\t// no validation rules for Uid\n\n\tif len(errors) > 0 {\n\t\treturn AddressReqMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// AddressReqMultiError is an error wrapping multiple validation errors\n// returned by AddressReq.ValidateAll() if the designated constraints aren't met.\ntype AddressReqMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m AddressReqMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m AddressReqMultiError) AllErrors() []error { return m }\n\n// AddressReqValidationError is the validation error returned by\n// AddressReq.Validate if the designated constraints aren't met.\ntype AddressReqValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e AddressReqValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e AddressReqValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e AddressReqValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e AddressReqValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e AddressReqValidationError) ErrorName() string { return \"AddressReqValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e AddressReqValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sAddressReq.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = AddressReqValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = AddressReqValidationError{}\n\n// Validate checks the field values on CheckResponse with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *CheckResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CheckResponse with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in CheckResponseMultiError, or\n// nil if none found.\nfunc (m *CheckResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CheckResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Success\n\n\tif len(errors) > 0 {\n\t\treturn CheckResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CheckResponseMultiError is an error wrapping multiple validation errors\n// returned by CheckResponse.ValidateAll() if the designated constraints\n// aren't met.\ntype CheckResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CheckResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CheckResponseMultiError) AllErrors() []error { return m }\n\n// CheckResponseValidationError is the validation error returned by\n// CheckResponse.Validate if the designated constraints aren't met.\ntype CheckResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CheckResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CheckResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CheckResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CheckResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CheckResponseValidationError) ErrorName() string { return \"CheckResponseValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e CheckResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCheckResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CheckResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CheckResponseValidationError{}\n\n// Validate checks the field values on RegisterReply with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *RegisterReply) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on RegisterReply with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in RegisterReplyMultiError, or\n// nil if none found.\nfunc (m *RegisterReply) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *RegisterReply) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for Mobile\n\n\t// no validation rules for Username\n\n\t// no validation rules for Token\n\n\t// no validation rules for ExpiredAt\n\n\tif len(errors) > 0 {\n\t\treturn RegisterReplyMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// RegisterReplyMultiError is an error wrapping multiple validation errors\n// returned by RegisterReply.ValidateAll() if the designated constraints\n// aren't met.\ntype RegisterReplyMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m RegisterReplyMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m RegisterReplyMultiError) AllErrors() []error { return m }\n\n// RegisterReplyValidationError is the validation error returned by\n// RegisterReply.Validate if the designated constraints aren't met.\ntype RegisterReplyValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e RegisterReplyValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e RegisterReplyValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e RegisterReplyValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e RegisterReplyValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e RegisterReplyValidationError) ErrorName() string { return \"RegisterReplyValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e RegisterReplyValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sRegisterReply.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = RegisterReplyValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = RegisterReplyValidationError{}\n\n// Validate checks the field values on RegisterReq with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *RegisterReq) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on RegisterReq with the rules defined in\n// the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in RegisterReqMultiError, or\n// nil if none found.\nfunc (m *RegisterReq) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *RegisterReq) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\tif utf8.RuneCountInString(m.GetMobile()) != 11 {\n\t\terr := RegisterReqValidationError{\n\t\t\tfield:  \"Mobile\",\n\t\t\treason: \"value length must be 11 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\n\t}\n\n\tif l := utf8.RuneCountInString(m.GetUsername()); l < 3 || l > 15 {\n\t\terr := RegisterReqValidationError{\n\t\t\tfield:  \"Username\",\n\t\t\treason: \"value length must be between 3 and 15 runes, inclusive\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetPassword()) < 8 {\n\t\terr := RegisterReqValidationError{\n\t\t\tfield:  \"Password\",\n\t\t\treason: \"value length must be at least 8 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn RegisterReqMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// RegisterReqMultiError is an error wrapping multiple validation errors\n// returned by RegisterReq.ValidateAll() if the designated constraints aren't met.\ntype RegisterReqMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m RegisterReqMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m RegisterReqMultiError) AllErrors() []error { return m }\n\n// RegisterReqValidationError is the validation error returned by\n// RegisterReq.Validate if the designated constraints aren't met.\ntype RegisterReqValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e RegisterReqValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e RegisterReqValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e RegisterReqValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e RegisterReqValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e RegisterReqValidationError) ErrorName() string { return \"RegisterReqValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e RegisterReqValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sRegisterReq.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = RegisterReqValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = RegisterReqValidationError{}\n\n// Validate checks the field values on LoginReq with the rules defined in the\n// proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *LoginReq) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on LoginReq with the rules defined in\n// the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in LoginReqMultiError, or nil\n// if none found.\nfunc (m *LoginReq) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *LoginReq) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\tif utf8.RuneCountInString(m.GetUsername()) < 3 {\n\t\terr := LoginReqValidationError{\n\t\t\tfield:  \"Username\",\n\t\t\treason: \"value length must be at least 3 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetPassword()) < 8 {\n\t\terr := LoginReqValidationError{\n\t\t\tfield:  \"Password\",\n\t\t\treason: \"value length must be at least 8 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn LoginReqMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// LoginReqMultiError is an error wrapping multiple validation errors returned\n// by LoginReq.ValidateAll() if the designated constraints aren't met.\ntype LoginReqMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m LoginReqMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m LoginReqMultiError) AllErrors() []error { return m }\n\n// LoginReqValidationError is the validation error returned by\n// LoginReq.Validate if the designated constraints aren't met.\ntype LoginReqValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e LoginReqValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e LoginReqValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e LoginReqValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e LoginReqValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e LoginReqValidationError) ErrorName() string { return \"LoginReqValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e LoginReqValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sLoginReq.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = LoginReqValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = LoginReqValidationError{}\n\n// Validate checks the field values on UserDetailResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the first error encountered is returned, or nil if there are no violations.\nfunc (m *UserDetailResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on UserDetailResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// UserDetailResponseMultiError, or nil if none found.\nfunc (m *UserDetailResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *UserDetailResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for Mobile\n\n\t// no validation rules for NickName\n\n\t// no validation rules for Birthday\n\n\t// no validation rules for Gender\n\n\t// no validation rules for Role\n\n\tif len(errors) > 0 {\n\t\treturn UserDetailResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// UserDetailResponseMultiError is an error wrapping multiple validation errors\n// returned by UserDetailResponse.ValidateAll() if the designated constraints\n// aren't met.\ntype UserDetailResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m UserDetailResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m UserDetailResponseMultiError) AllErrors() []error { return m }\n\n// UserDetailResponseValidationError is the validation error returned by\n// UserDetailResponse.Validate if the designated constraints aren't met.\ntype UserDetailResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e UserDetailResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e UserDetailResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e UserDetailResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e UserDetailResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e UserDetailResponseValidationError) ErrorName() string {\n\treturn \"UserDetailResponseValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e UserDetailResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sUserDetailResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = UserDetailResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = UserDetailResponseValidationError{}\n\n// Validate checks the field values on CaptchaReply with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *CaptchaReply) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CaptchaReply with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in CaptchaReplyMultiError, or\n// nil if none found.\nfunc (m *CaptchaReply) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CaptchaReply) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for CaptchaId\n\n\t// no validation rules for PicPath\n\n\tif len(errors) > 0 {\n\t\treturn CaptchaReplyMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CaptchaReplyMultiError is an error wrapping multiple validation errors\n// returned by CaptchaReply.ValidateAll() if the designated constraints aren't met.\ntype CaptchaReplyMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CaptchaReplyMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CaptchaReplyMultiError) AllErrors() []error { return m }\n\n// CaptchaReplyValidationError is the validation error returned by\n// CaptchaReply.Validate if the designated constraints aren't met.\ntype CaptchaReplyValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CaptchaReplyValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CaptchaReplyValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CaptchaReplyValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CaptchaReplyValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CaptchaReplyValidationError) ErrorName() string { return \"CaptchaReplyValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e CaptchaReplyValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCaptchaReply.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CaptchaReplyValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CaptchaReplyValidationError{}\n"
  },
  {
    "path": "admin/api/admin/v1/admin.proto",
    "content": "syntax = \"proto3\";\n\npackage admin.admin.v1;\n// 这里可以把 proto 文件下载下来，放到项目的 third_party 目录下\nimport \"validate/validate.proto\";\nimport \"google/api/annotations.proto\";\nimport \"google/protobuf/empty.proto\";\n\noption go_package = \"admin/api/admin/v1;v1\";\n// The admin service definition.\nservice admin {\n  rpc Register (RegisterReq) returns (RegisterReply) {\n    option (google.api.http) = {\n      post: \"/api/users/register\",\n      body: \"*\",\n    };\n  }\n  rpc Login (LoginReq) returns (RegisterReply) {\n    option (google.api.http) = {\n      post: \"/api/users/login\",\n      body: \"*\",\n    };\n  }\n  rpc Captcha (google.protobuf.Empty) returns (CaptchaReply) {\n    option (google.api.http) = {\n      get: \"/api/users/captcha\",\n    };\n  }\n  rpc Detail (google.protobuf.Empty) returns (UserDetailResponse) {\n    option (google.api.http) = {\n      get: \"/api/users/detail\",\n    };\n  }\n  rpc CreateAddress (CreateAddressReq) returns (AddressInfo) {\n    option (google.api.http) = {\n      post: \"/api/address/create\",\n      body: \"*\",\n    };\n  }\n  rpc AddressListByUid (google.protobuf.Empty) returns (ListAddressReply) {\n    option (google.api.http) = {\n      get: \"/api/address/list/uid\",\n    };\n  }\n  rpc UpdateAddress (UpdateAddressReq) returns (CheckResponse) {\n    option (google.api.http) = {\n      put: \"/api/address/update\",\n      body: \"*\",\n    };\n  }\n  rpc DefaultAddress (AddressReq) returns (CheckResponse) {\n    option (google.api.http) = {\n      put: \"/api/address/default\",\n      body: \"*\",\n    };\n  }\n  rpc DeleteAddress (AddressReq) returns (CheckResponse) {\n    option (google.api.http) = {\n      delete: \"/api/address/delete\",\n    };\n  }\n}\n\nmessage CreateAddressReq {\n  int64 uid = 1;\n  string name = 2 [(validate.rules).string ={min_len: 1}];\n  string mobile = 3 [(validate.rules).string.len = 11];\n  string Province = 4 [(validate.rules).string ={min_len: 1}];\n  string City = 5 [(validate.rules).string ={min_len: 1}];\n  string Districts = 6 [(validate.rules).string ={min_len: 1}];\n  string address = 7 [(validate.rules).string ={min_len: 1}];\n  string post_code = 8;\n  int32 is_default = 9;\n}\n\nmessage UpdateAddressReq {\n  int64 uid = 1;\n  string name = 2;\n  string mobile = 3 [(validate.rules).string.len = 11];\n  string Province = 4 [(validate.rules).string ={min_len: 1}];\n  string City = 5 [(validate.rules).string ={min_len: 1}];\n  string Districts = 6 [(validate.rules).string ={min_len: 1}];\n  string address = 7 [(validate.rules).string ={min_len: 1}];\n  string post_code = 8;\n  int32 is_default = 9;\n  int64 id = 10 [(validate.rules).int64.gte = 1];\n}\n\nmessage AddressInfo {\n  int64 id = 1;\n  string name = 2 [(validate.rules).string ={min_len: 1}];\n  string mobile = 3 [(validate.rules).string.len = 11];\n  string Province = 4;\n  string City = 5;\n  string Districts = 6;\n  string address = 7;\n  string post_code = 8;\n  int32 is_default = 9;\n}\n\nmessage ListAddressReq {\n  int64 uid = 1;\n}\n\nmessage ListAddressReply {\n  repeated AddressInfo results = 1;\n}\n\nmessage AddressReq {\n  int64 id = 1 [(validate.rules).int64.gte = 1];\n  int64 uid = 2;\n}\n\nmessage CheckResponse{\n  bool success = 1;\n}\n\n// Data returned by registration and login\nmessage RegisterReply {\n  int64 id = 1;\n  string mobile = 3;\n  string username = 4;\n  string token = 5;\n  int64 expiredAt = 6;\n}\n\nmessage RegisterReq {\n  string mobile = 1 [(validate.rules).string.len = 11];\n  string username = 2 [(validate.rules).string = {min_len: 3, max_len: 15}];\n  string password = 3 [(validate.rules).string = {min_len: 8}];\n}\n\nmessage LoginReq {\n  string username = 1 [(validate.rules).string = {min_len: 3}];\n  string password = 2 [(validate.rules).string = {min_len: 8}];\n//  string captcha = 3 [(validate.rules).string = {min_len: 5,max_len:5}];\n//  string captchaId = 4  [(validate.rules).string ={min_len: 1}];\n}\n\n// user Detail returned\nmessage UserDetailResponse{\n  int64 id = 1;\n  string mobile = 2;\n  string nickName = 3;\n  int64 birthday = 4;\n  string gender = 5;\n  int32 role = 6;\n}\n\nmessage CaptchaReply{\n  string captchaId = 1;\n  string picPath = 2;\n}"
  },
  {
    "path": "admin/api/admin/v1/admin_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.2.0\n// - protoc             v3.17.3\n// source: api/admin/v1/admin.proto\n\npackage v1\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n\temptypb \"google.golang.org/protobuf/types/known/emptypb\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\n// AdminClient is the client API for Admin service.\n//\n// 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.\ntype AdminClient interface {\n\tRegister(ctx context.Context, in *RegisterReq, opts ...grpc.CallOption) (*RegisterReply, error)\n\tLogin(ctx context.Context, in *LoginReq, opts ...grpc.CallOption) (*RegisterReply, error)\n\tCaptcha(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*CaptchaReply, error)\n\tDetail(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*UserDetailResponse, error)\n\tCreateAddress(ctx context.Context, in *CreateAddressReq, opts ...grpc.CallOption) (*AddressInfo, error)\n\tAddressListByUid(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ListAddressReply, error)\n\tUpdateAddress(ctx context.Context, in *UpdateAddressReq, opts ...grpc.CallOption) (*CheckResponse, error)\n\tDefaultAddress(ctx context.Context, in *AddressReq, opts ...grpc.CallOption) (*CheckResponse, error)\n\tDeleteAddress(ctx context.Context, in *AddressReq, opts ...grpc.CallOption) (*CheckResponse, error)\n}\n\ntype adminClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewAdminClient(cc grpc.ClientConnInterface) AdminClient {\n\treturn &adminClient{cc}\n}\n\nfunc (c *adminClient) Register(ctx context.Context, in *RegisterReq, opts ...grpc.CallOption) (*RegisterReply, error) {\n\tout := new(RegisterReply)\n\terr := c.cc.Invoke(ctx, \"/admin.admin.v1.admin/Register\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *adminClient) Login(ctx context.Context, in *LoginReq, opts ...grpc.CallOption) (*RegisterReply, error) {\n\tout := new(RegisterReply)\n\terr := c.cc.Invoke(ctx, \"/admin.admin.v1.admin/Login\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *adminClient) Captcha(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*CaptchaReply, error) {\n\tout := new(CaptchaReply)\n\terr := c.cc.Invoke(ctx, \"/admin.admin.v1.admin/Captcha\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *adminClient) Detail(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*UserDetailResponse, error) {\n\tout := new(UserDetailResponse)\n\terr := c.cc.Invoke(ctx, \"/admin.admin.v1.admin/Detail\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *adminClient) CreateAddress(ctx context.Context, in *CreateAddressReq, opts ...grpc.CallOption) (*AddressInfo, error) {\n\tout := new(AddressInfo)\n\terr := c.cc.Invoke(ctx, \"/admin.admin.v1.admin/CreateAddress\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *adminClient) AddressListByUid(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ListAddressReply, error) {\n\tout := new(ListAddressReply)\n\terr := c.cc.Invoke(ctx, \"/admin.admin.v1.admin/AddressListByUid\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *adminClient) UpdateAddress(ctx context.Context, in *UpdateAddressReq, opts ...grpc.CallOption) (*CheckResponse, error) {\n\tout := new(CheckResponse)\n\terr := c.cc.Invoke(ctx, \"/admin.admin.v1.admin/UpdateAddress\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *adminClient) DefaultAddress(ctx context.Context, in *AddressReq, opts ...grpc.CallOption) (*CheckResponse, error) {\n\tout := new(CheckResponse)\n\terr := c.cc.Invoke(ctx, \"/admin.admin.v1.admin/DefaultAddress\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *adminClient) DeleteAddress(ctx context.Context, in *AddressReq, opts ...grpc.CallOption) (*CheckResponse, error) {\n\tout := new(CheckResponse)\n\terr := c.cc.Invoke(ctx, \"/admin.admin.v1.admin/DeleteAddress\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// AdminServer is the s API for Admin service.\n// All implementations must embed UnimplementedAdminServer\n// for forward compatibility\ntype AdminServer interface {\n\tRegister(context.Context, *RegisterReq) (*RegisterReply, error)\n\tLogin(context.Context, *LoginReq) (*RegisterReply, error)\n\tCaptcha(context.Context, *emptypb.Empty) (*CaptchaReply, error)\n\tDetail(context.Context, *emptypb.Empty) (*UserDetailResponse, error)\n\tCreateAddress(context.Context, *CreateAddressReq) (*AddressInfo, error)\n\tAddressListByUid(context.Context, *emptypb.Empty) (*ListAddressReply, error)\n\tUpdateAddress(context.Context, *UpdateAddressReq) (*CheckResponse, error)\n\tDefaultAddress(context.Context, *AddressReq) (*CheckResponse, error)\n\tDeleteAddress(context.Context, *AddressReq) (*CheckResponse, error)\n\tmustEmbedUnimplementedAdminServer()\n}\n\n// UnimplementedAdminServer must be embedded to have forward compatible implementations.\ntype UnimplementedAdminServer struct {\n}\n\nfunc (UnimplementedAdminServer) Register(context.Context, *RegisterReq) (*RegisterReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method Register not implemented\")\n}\nfunc (UnimplementedAdminServer) Login(context.Context, *LoginReq) (*RegisterReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method Login not implemented\")\n}\nfunc (UnimplementedAdminServer) Captcha(context.Context, *emptypb.Empty) (*CaptchaReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method Captcha not implemented\")\n}\nfunc (UnimplementedAdminServer) Detail(context.Context, *emptypb.Empty) (*UserDetailResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method Detail not implemented\")\n}\nfunc (UnimplementedAdminServer) CreateAddress(context.Context, *CreateAddressReq) (*AddressInfo, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method CreateAddress not implemented\")\n}\nfunc (UnimplementedAdminServer) AddressListByUid(context.Context, *emptypb.Empty) (*ListAddressReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method AddressListByUid not implemented\")\n}\nfunc (UnimplementedAdminServer) UpdateAddress(context.Context, *UpdateAddressReq) (*CheckResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method UpdateAddress not implemented\")\n}\nfunc (UnimplementedAdminServer) DefaultAddress(context.Context, *AddressReq) (*CheckResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method DefaultAddress not implemented\")\n}\nfunc (UnimplementedAdminServer) DeleteAddress(context.Context, *AddressReq) (*CheckResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method DeleteAddress not implemented\")\n}\nfunc (UnimplementedAdminServer) mustEmbedUnimplementedAdminServer() {}\n\n// UnsafeAdminServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to AdminServer will\n// result in compilation errors.\ntype UnsafeAdminServer interface {\n\tmustEmbedUnimplementedAdminServer()\n}\n\nfunc RegisterAdminServer(s grpc.ServiceRegistrar, srv AdminServer) {\n\ts.RegisterService(&Admin_ServiceDesc, srv)\n}\n\nfunc _Admin_Register_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(RegisterReq)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(AdminServer).Register(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/admin.admin.v1.admin/Register\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(AdminServer).Register(ctx, req.(*RegisterReq))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Admin_Login_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(LoginReq)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(AdminServer).Login(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/admin.admin.v1.admin/Login\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(AdminServer).Login(ctx, req.(*LoginReq))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Admin_Captcha_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(emptypb.Empty)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(AdminServer).Captcha(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/admin.admin.v1.admin/Captcha\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(AdminServer).Captcha(ctx, req.(*emptypb.Empty))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Admin_Detail_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(emptypb.Empty)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(AdminServer).Detail(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/admin.admin.v1.admin/Detail\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(AdminServer).Detail(ctx, req.(*emptypb.Empty))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Admin_CreateAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(CreateAddressReq)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(AdminServer).CreateAddress(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/admin.admin.v1.admin/CreateAddress\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(AdminServer).CreateAddress(ctx, req.(*CreateAddressReq))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Admin_AddressListByUid_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(emptypb.Empty)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(AdminServer).AddressListByUid(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/admin.admin.v1.admin/AddressListByUid\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(AdminServer).AddressListByUid(ctx, req.(*emptypb.Empty))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Admin_UpdateAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(UpdateAddressReq)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(AdminServer).UpdateAddress(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/admin.admin.v1.admin/UpdateAddress\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(AdminServer).UpdateAddress(ctx, req.(*UpdateAddressReq))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Admin_DefaultAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(AddressReq)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(AdminServer).DefaultAddress(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/admin.admin.v1.admin/DefaultAddress\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(AdminServer).DefaultAddress(ctx, req.(*AddressReq))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Admin_DeleteAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(AddressReq)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(AdminServer).DeleteAddress(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/admin.admin.v1.admin/DeleteAddress\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(AdminServer).DeleteAddress(ctx, req.(*AddressReq))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// Admin_ServiceDesc is the grpc.ServiceDesc for Admin service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar Admin_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"admin.admin.v1.admin\",\n\tHandlerType: (*AdminServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"Register\",\n\t\t\tHandler:    _Admin_Register_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"Login\",\n\t\t\tHandler:    _Admin_Login_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"Captcha\",\n\t\t\tHandler:    _Admin_Captcha_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"Detail\",\n\t\t\tHandler:    _Admin_Detail_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"CreateAddress\",\n\t\t\tHandler:    _Admin_CreateAddress_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"AddressListByUid\",\n\t\t\tHandler:    _Admin_AddressListByUid_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"UpdateAddress\",\n\t\t\tHandler:    _Admin_UpdateAddress_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"DefaultAddress\",\n\t\t\tHandler:    _Admin_DefaultAddress_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"DeleteAddress\",\n\t\t\tHandler:    _Admin_DeleteAddress_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"api/admin/v1/admin.proto\",\n}\n"
  },
  {
    "path": "admin/api/admin/v1/admin_http.pb.go",
    "content": "// Code generated by protoc-gen-go-http. DO NOT EDIT.\n// versions:\n// protoc-gen-go-http v2.1.4\n\npackage v1\n\nimport (\n\tcontext \"context\"\n\thttp \"github.com/go-kratos/kratos/v2/transport/http\"\n\tbinding \"github.com/go-kratos/kratos/v2/transport/http/binding\"\n\temptypb \"google.golang.org/protobuf/types/known/emptypb\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the kratos package it is being compiled against.\nvar _ = new(context.Context)\nvar _ = binding.EncodeURL\n\nconst _ = http.SupportPackageIsVersion1\n\ntype AdminHTTPServer interface {\n\tAddressListByUid(context.Context, *emptypb.Empty) (*ListAddressReply, error)\n\tCaptcha(context.Context, *emptypb.Empty) (*CaptchaReply, error)\n\tCreateAddress(context.Context, *CreateAddressReq) (*AddressInfo, error)\n\tDefaultAddress(context.Context, *AddressReq) (*CheckResponse, error)\n\tDeleteAddress(context.Context, *AddressReq) (*CheckResponse, error)\n\tDetail(context.Context, *emptypb.Empty) (*UserDetailResponse, error)\n\tLogin(context.Context, *LoginReq) (*RegisterReply, error)\n\tRegister(context.Context, *RegisterReq) (*RegisterReply, error)\n\tUpdateAddress(context.Context, *UpdateAddressReq) (*CheckResponse, error)\n}\n\nfunc RegisterAdminHTTPServer(s *http.Server, srv AdminHTTPServer) {\n\tr := s.Route(\"/\")\n\tr.POST(\"/api/users/register\", _Admin_Register0_HTTP_Handler(srv))\n\tr.POST(\"/api/users/login\", _Admin_Login0_HTTP_Handler(srv))\n\tr.GET(\"/api/users/captcha\", _Admin_Captcha0_HTTP_Handler(srv))\n\tr.GET(\"/api/users/detail\", _Admin_Detail0_HTTP_Handler(srv))\n\tr.POST(\"/api/address/create\", _Admin_CreateAddress0_HTTP_Handler(srv))\n\tr.GET(\"/api/address/list/uid\", _Admin_AddressListByUid0_HTTP_Handler(srv))\n\tr.PUT(\"/api/address/update\", _Admin_UpdateAddress0_HTTP_Handler(srv))\n\tr.PUT(\"/api/address/default\", _Admin_DefaultAddress0_HTTP_Handler(srv))\n\tr.DELETE(\"/api/address/delete\", _Admin_DeleteAddress0_HTTP_Handler(srv))\n}\n\nfunc _Admin_Register0_HTTP_Handler(srv AdminHTTPServer) func(ctx http.Context) error {\n\treturn func(ctx http.Context) error {\n\t\tvar in RegisterReq\n\t\tif err := ctx.Bind(&in); err != nil {\n\t\t\treturn err\n\t\t}\n\t\thttp.SetOperation(ctx, \"/admin.admin.v1.admin/Register\")\n\t\th := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\t\treturn srv.Register(ctx, req.(*RegisterReq))\n\t\t})\n\t\tout, err := h(ctx, &in)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treply := out.(*RegisterReply)\n\t\treturn ctx.Result(200, reply)\n\t}\n}\n\nfunc _Admin_Login0_HTTP_Handler(srv AdminHTTPServer) func(ctx http.Context) error {\n\treturn func(ctx http.Context) error {\n\t\tvar in LoginReq\n\t\tif err := ctx.Bind(&in); err != nil {\n\t\t\treturn err\n\t\t}\n\t\thttp.SetOperation(ctx, \"/admin.admin.v1.admin/Login\")\n\t\th := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\t\treturn srv.Login(ctx, req.(*LoginReq))\n\t\t})\n\t\tout, err := h(ctx, &in)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treply := out.(*RegisterReply)\n\t\treturn ctx.Result(200, reply)\n\t}\n}\n\nfunc _Admin_Captcha0_HTTP_Handler(srv AdminHTTPServer) func(ctx http.Context) error {\n\treturn func(ctx http.Context) error {\n\t\tvar in emptypb.Empty\n\t\tif err := ctx.BindQuery(&in); err != nil {\n\t\t\treturn err\n\t\t}\n\t\thttp.SetOperation(ctx, \"/admin.admin.v1.admin/Captcha\")\n\t\th := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\t\treturn srv.Captcha(ctx, req.(*emptypb.Empty))\n\t\t})\n\t\tout, err := h(ctx, &in)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treply := out.(*CaptchaReply)\n\t\treturn ctx.Result(200, reply)\n\t}\n}\n\nfunc _Admin_Detail0_HTTP_Handler(srv AdminHTTPServer) func(ctx http.Context) error {\n\treturn func(ctx http.Context) error {\n\t\tvar in emptypb.Empty\n\t\tif err := ctx.BindQuery(&in); err != nil {\n\t\t\treturn err\n\t\t}\n\t\thttp.SetOperation(ctx, \"/admin.admin.v1.admin/Detail\")\n\t\th := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\t\treturn srv.Detail(ctx, req.(*emptypb.Empty))\n\t\t})\n\t\tout, err := h(ctx, &in)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treply := out.(*UserDetailResponse)\n\t\treturn ctx.Result(200, reply)\n\t}\n}\n\nfunc _Admin_CreateAddress0_HTTP_Handler(srv AdminHTTPServer) func(ctx http.Context) error {\n\treturn func(ctx http.Context) error {\n\t\tvar in CreateAddressReq\n\t\tif err := ctx.Bind(&in); err != nil {\n\t\t\treturn err\n\t\t}\n\t\thttp.SetOperation(ctx, \"/admin.admin.v1.admin/CreateAddress\")\n\t\th := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\t\treturn srv.CreateAddress(ctx, req.(*CreateAddressReq))\n\t\t})\n\t\tout, err := h(ctx, &in)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treply := out.(*AddressInfo)\n\t\treturn ctx.Result(200, reply)\n\t}\n}\n\nfunc _Admin_AddressListByUid0_HTTP_Handler(srv AdminHTTPServer) func(ctx http.Context) error {\n\treturn func(ctx http.Context) error {\n\t\tvar in emptypb.Empty\n\t\tif err := ctx.BindQuery(&in); err != nil {\n\t\t\treturn err\n\t\t}\n\t\thttp.SetOperation(ctx, \"/admin.admin.v1.admin/AddressListByUid\")\n\t\th := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\t\treturn srv.AddressListByUid(ctx, req.(*emptypb.Empty))\n\t\t})\n\t\tout, err := h(ctx, &in)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treply := out.(*ListAddressReply)\n\t\treturn ctx.Result(200, reply)\n\t}\n}\n\nfunc _Admin_UpdateAddress0_HTTP_Handler(srv AdminHTTPServer) func(ctx http.Context) error {\n\treturn func(ctx http.Context) error {\n\t\tvar in UpdateAddressReq\n\t\tif err := ctx.Bind(&in); err != nil {\n\t\t\treturn err\n\t\t}\n\t\thttp.SetOperation(ctx, \"/admin.admin.v1.admin/UpdateAddress\")\n\t\th := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\t\treturn srv.UpdateAddress(ctx, req.(*UpdateAddressReq))\n\t\t})\n\t\tout, err := h(ctx, &in)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treply := out.(*CheckResponse)\n\t\treturn ctx.Result(200, reply)\n\t}\n}\n\nfunc _Admin_DefaultAddress0_HTTP_Handler(srv AdminHTTPServer) func(ctx http.Context) error {\n\treturn func(ctx http.Context) error {\n\t\tvar in AddressReq\n\t\tif err := ctx.Bind(&in); err != nil {\n\t\t\treturn err\n\t\t}\n\t\thttp.SetOperation(ctx, \"/admin.admin.v1.admin/DefaultAddress\")\n\t\th := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\t\treturn srv.DefaultAddress(ctx, req.(*AddressReq))\n\t\t})\n\t\tout, err := h(ctx, &in)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treply := out.(*CheckResponse)\n\t\treturn ctx.Result(200, reply)\n\t}\n}\n\nfunc _Admin_DeleteAddress0_HTTP_Handler(srv AdminHTTPServer) func(ctx http.Context) error {\n\treturn func(ctx http.Context) error {\n\t\tvar in AddressReq\n\t\tif err := ctx.BindQuery(&in); err != nil {\n\t\t\treturn err\n\t\t}\n\t\thttp.SetOperation(ctx, \"/admin.admin.v1.admin/DeleteAddress\")\n\t\th := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\t\treturn srv.DeleteAddress(ctx, req.(*AddressReq))\n\t\t})\n\t\tout, err := h(ctx, &in)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treply := out.(*CheckResponse)\n\t\treturn ctx.Result(200, reply)\n\t}\n}\n\ntype AdminHTTPClient interface {\n\tAddressListByUid(ctx context.Context, req *emptypb.Empty, opts ...http.CallOption) (rsp *ListAddressReply, err error)\n\tCaptcha(ctx context.Context, req *emptypb.Empty, opts ...http.CallOption) (rsp *CaptchaReply, err error)\n\tCreateAddress(ctx context.Context, req *CreateAddressReq, opts ...http.CallOption) (rsp *AddressInfo, err error)\n\tDefaultAddress(ctx context.Context, req *AddressReq, opts ...http.CallOption) (rsp *CheckResponse, err error)\n\tDeleteAddress(ctx context.Context, req *AddressReq, opts ...http.CallOption) (rsp *CheckResponse, err error)\n\tDetail(ctx context.Context, req *emptypb.Empty, opts ...http.CallOption) (rsp *UserDetailResponse, err error)\n\tLogin(ctx context.Context, req *LoginReq, opts ...http.CallOption) (rsp *RegisterReply, err error)\n\tRegister(ctx context.Context, req *RegisterReq, opts ...http.CallOption) (rsp *RegisterReply, err error)\n\tUpdateAddress(ctx context.Context, req *UpdateAddressReq, opts ...http.CallOption) (rsp *CheckResponse, err error)\n}\n\ntype AdminHTTPClientImpl struct {\n\tcc *http.Client\n}\n\nfunc NewAdminHTTPClient(client *http.Client) AdminHTTPClient {\n\treturn &AdminHTTPClientImpl{client}\n}\n\nfunc (c *AdminHTTPClientImpl) AddressListByUid(ctx context.Context, in *emptypb.Empty, opts ...http.CallOption) (*ListAddressReply, error) {\n\tvar out ListAddressReply\n\tpattern := \"/api/address/list/uid\"\n\tpath := binding.EncodeURL(pattern, in, true)\n\topts = append(opts, http.Operation(\"/admin.admin.v1.admin/AddressListByUid\"))\n\topts = append(opts, http.PathTemplate(pattern))\n\terr := c.cc.Invoke(ctx, \"GET\", path, nil, &out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &out, err\n}\n\nfunc (c *AdminHTTPClientImpl) Captcha(ctx context.Context, in *emptypb.Empty, opts ...http.CallOption) (*CaptchaReply, error) {\n\tvar out CaptchaReply\n\tpattern := \"/api/users/captcha\"\n\tpath := binding.EncodeURL(pattern, in, true)\n\topts = append(opts, http.Operation(\"/admin.admin.v1.admin/Captcha\"))\n\topts = append(opts, http.PathTemplate(pattern))\n\terr := c.cc.Invoke(ctx, \"GET\", path, nil, &out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &out, err\n}\n\nfunc (c *AdminHTTPClientImpl) CreateAddress(ctx context.Context, in *CreateAddressReq, opts ...http.CallOption) (*AddressInfo, error) {\n\tvar out AddressInfo\n\tpattern := \"/api/address/create\"\n\tpath := binding.EncodeURL(pattern, in, false)\n\topts = append(opts, http.Operation(\"/admin.admin.v1.admin/CreateAddress\"))\n\topts = append(opts, http.PathTemplate(pattern))\n\terr := c.cc.Invoke(ctx, \"POST\", path, in, &out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &out, err\n}\n\nfunc (c *AdminHTTPClientImpl) DefaultAddress(ctx context.Context, in *AddressReq, opts ...http.CallOption) (*CheckResponse, error) {\n\tvar out CheckResponse\n\tpattern := \"/api/address/default\"\n\tpath := binding.EncodeURL(pattern, in, false)\n\topts = append(opts, http.Operation(\"/admin.admin.v1.admin/DefaultAddress\"))\n\topts = append(opts, http.PathTemplate(pattern))\n\terr := c.cc.Invoke(ctx, \"PUT\", path, in, &out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &out, err\n}\n\nfunc (c *AdminHTTPClientImpl) DeleteAddress(ctx context.Context, in *AddressReq, opts ...http.CallOption) (*CheckResponse, error) {\n\tvar out CheckResponse\n\tpattern := \"/api/address/delete\"\n\tpath := binding.EncodeURL(pattern, in, true)\n\topts = append(opts, http.Operation(\"/admin.admin.v1.admin/DeleteAddress\"))\n\topts = append(opts, http.PathTemplate(pattern))\n\terr := c.cc.Invoke(ctx, \"DELETE\", path, nil, &out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &out, err\n}\n\nfunc (c *AdminHTTPClientImpl) Detail(ctx context.Context, in *emptypb.Empty, opts ...http.CallOption) (*UserDetailResponse, error) {\n\tvar out UserDetailResponse\n\tpattern := \"/api/users/detail\"\n\tpath := binding.EncodeURL(pattern, in, true)\n\topts = append(opts, http.Operation(\"/admin.admin.v1.admin/Detail\"))\n\topts = append(opts, http.PathTemplate(pattern))\n\terr := c.cc.Invoke(ctx, \"GET\", path, nil, &out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &out, err\n}\n\nfunc (c *AdminHTTPClientImpl) Login(ctx context.Context, in *LoginReq, opts ...http.CallOption) (*RegisterReply, error) {\n\tvar out RegisterReply\n\tpattern := \"/api/users/login\"\n\tpath := binding.EncodeURL(pattern, in, false)\n\topts = append(opts, http.Operation(\"/admin.admin.v1.admin/Login\"))\n\topts = append(opts, http.PathTemplate(pattern))\n\terr := c.cc.Invoke(ctx, \"POST\", path, in, &out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &out, err\n}\n\nfunc (c *AdminHTTPClientImpl) Register(ctx context.Context, in *RegisterReq, opts ...http.CallOption) (*RegisterReply, error) {\n\tvar out RegisterReply\n\tpattern := \"/api/users/register\"\n\tpath := binding.EncodeURL(pattern, in, false)\n\topts = append(opts, http.Operation(\"/admin.admin.v1.admin/Register\"))\n\topts = append(opts, http.PathTemplate(pattern))\n\terr := c.cc.Invoke(ctx, \"POST\", path, in, &out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &out, err\n}\n\nfunc (c *AdminHTTPClientImpl) UpdateAddress(ctx context.Context, in *UpdateAddressReq, opts ...http.CallOption) (*CheckResponse, error) {\n\tvar out CheckResponse\n\tpattern := \"/api/address/update\"\n\tpath := binding.EncodeURL(pattern, in, false)\n\topts = append(opts, http.Operation(\"/admin.admin.v1.admin/UpdateAddress\"))\n\topts = append(opts, http.PathTemplate(pattern))\n\terr := c.cc.Invoke(ctx, \"PUT\", path, in, &out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &out, err\n}\n"
  },
  {
    "path": "admin/api/admin/v1/error_reason.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.27.1\n// \tprotoc        v3.17.3\n// source: api/admin/v1/error_reason.proto\n\npackage v1\n\nimport (\n\t_ \"github.com/go-kratos/kratos/v2/errors\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype ErrorReason int32\n\nconst (\n\tErrorReason_USER_NOT_FOUND  ErrorReason = 0\n\tErrorReason_CONTENT_MISSING ErrorReason = 1\n)\n\n// Enum value maps for ErrorReason.\nvar (\n\tErrorReason_name = map[int32]string{\n\t\t0: \"USER_NOT_FOUND\",\n\t\t1: \"CONTENT_MISSING\",\n\t}\n\tErrorReason_value = map[string]int32{\n\t\t\"USER_NOT_FOUND\":  0,\n\t\t\"CONTENT_MISSING\": 1,\n\t}\n)\n\nfunc (x ErrorReason) Enum() *ErrorReason {\n\tp := new(ErrorReason)\n\t*p = x\n\treturn p\n}\n\nfunc (x ErrorReason) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (ErrorReason) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_api_admin_v1_error_reason_proto_enumTypes[0].Descriptor()\n}\n\nfunc (ErrorReason) Type() protoreflect.EnumType {\n\treturn &file_api_admin_v1_error_reason_proto_enumTypes[0]\n}\n\nfunc (x ErrorReason) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use ErrorReason.Descriptor instead.\nfunc (ErrorReason) EnumDescriptor() ([]byte, []int) {\n\treturn file_api_admin_v1_error_reason_proto_rawDescGZIP(), []int{0}\n}\n\nvar File_api_admin_v1_error_reason_proto protoreflect.FileDescriptor\n\nvar file_api_admin_v1_error_reason_proto_rawDesc = []byte{\n\t0x0a, 0x1f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2f, 0x76, 0x31, 0x2f, 0x65,\n\t0x72, 0x72, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x0d, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x2e, 0x76, 0x31,\n\t0x1a, 0x13, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2a, 0x48, 0x0a, 0x0b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65,\n\t0x61, 0x73, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x0e, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x4e, 0x4f, 0x54,\n\t0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x00, 0x1a, 0x04, 0xa8, 0x45, 0x94, 0x03, 0x12, 0x19,\n\t0x0a, 0x0f, 0x43, 0x4f, 0x4e, 0x54, 0x45, 0x4e, 0x54, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e,\n\t0x47, 0x10, 0x01, 0x1a, 0x04, 0xa8, 0x45, 0x90, 0x03, 0x1a, 0x04, 0xa0, 0x45, 0xf4, 0x03, 0x42,\n\t0x40, 0x0a, 0x0f, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x65, 0x72, 0x72, 0x6f,\n\t0x72, 0x73, 0x50, 0x01, 0x5a, 0x15, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f,\n\t0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2f, 0x76, 0x31, 0x3b, 0x76, 0x31, 0xa2, 0x02, 0x13, 0x41, 0x50,\n\t0x49, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x45, 0x72, 0x72, 0x6f, 0x72,\n\t0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_api_admin_v1_error_reason_proto_rawDescOnce sync.Once\n\tfile_api_admin_v1_error_reason_proto_rawDescData = file_api_admin_v1_error_reason_proto_rawDesc\n)\n\nfunc file_api_admin_v1_error_reason_proto_rawDescGZIP() []byte {\n\tfile_api_admin_v1_error_reason_proto_rawDescOnce.Do(func() {\n\t\tfile_api_admin_v1_error_reason_proto_rawDescData = protoimpl.X.CompressGZIP(file_api_admin_v1_error_reason_proto_rawDescData)\n\t})\n\treturn file_api_admin_v1_error_reason_proto_rawDescData\n}\n\nvar file_api_admin_v1_error_reason_proto_enumTypes = make([]protoimpl.EnumInfo, 1)\nvar file_api_admin_v1_error_reason_proto_goTypes = []interface{}{\n\t(ErrorReason)(0), // 0: helloworld.v1.ErrorReason\n}\nvar file_api_admin_v1_error_reason_proto_depIdxs = []int32{\n\t0, // [0:0] is the sub-list for method output_type\n\t0, // [0:0] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_api_admin_v1_error_reason_proto_init() }\nfunc file_api_admin_v1_error_reason_proto_init() {\n\tif File_api_admin_v1_error_reason_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_api_admin_v1_error_reason_proto_rawDesc,\n\t\t\tNumEnums:      1,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_api_admin_v1_error_reason_proto_goTypes,\n\t\tDependencyIndexes: file_api_admin_v1_error_reason_proto_depIdxs,\n\t\tEnumInfos:         file_api_admin_v1_error_reason_proto_enumTypes,\n\t}.Build()\n\tFile_api_admin_v1_error_reason_proto = out.File\n\tfile_api_admin_v1_error_reason_proto_rawDesc = nil\n\tfile_api_admin_v1_error_reason_proto_goTypes = nil\n\tfile_api_admin_v1_error_reason_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "admin/api/admin/v1/error_reason.pb.validate.go",
    "content": "// Code generated by protoc-gen-validate. DO NOT EDIT.\n// source: api/admin/v1/error_reason.proto\n\npackage v1\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"net/mail\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"sort\"\n\t\"strings\"\n\t\"time\"\n\t\"unicode/utf8\"\n\n\t\"google.golang.org/protobuf/types/known/anypb\"\n)\n\n// ensure the imports are used\nvar (\n\t_ = bytes.MinRead\n\t_ = errors.New(\"\")\n\t_ = fmt.Print\n\t_ = utf8.UTFMax\n\t_ = (*regexp.Regexp)(nil)\n\t_ = (*strings.Reader)(nil)\n\t_ = net.IPv4len\n\t_ = time.Duration(0)\n\t_ = (*url.URL)(nil)\n\t_ = (*mail.Address)(nil)\n\t_ = anypb.Any{}\n\t_ = sort.Sort\n)\n"
  },
  {
    "path": "admin/api/admin/v1/error_reason.proto",
    "content": "syntax = \"proto3\";\n\npackage helloworld.v1;\nimport \"errors/errors.proto\";\n\noption go_package = \"admin/api/admin/v1;v1\";\noption java_multiple_files = true;\noption java_package = \"admin.v1.errors\";\noption objc_class_prefix = \"APIHelloworldErrors\";\n\nenum ErrorReason {\n  option (errors.default_code) = 500;\n\n  USER_NOT_FOUND = 0 [(errors.code) = 404];\n  CONTENT_MISSING = 1 [(errors.code) = 400];\n}\n"
  },
  {
    "path": "admin/api/admin/v1/error_reason_errors.pb.go",
    "content": "// Code generated by protoc-gen-go-errors. DO NOT EDIT.\n\npackage v1\n\nimport (\n\tfmt \"fmt\"\n\terrors \"github.com/go-kratos/kratos/v2/errors\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the kratos package it is being compiled against.\nconst _ = errors.SupportPackageIsVersion1\n\nfunc IsUserNotFound(err error) bool {\n\te := errors.FromError(err)\n\treturn e.Reason == ErrorReason_USER_NOT_FOUND.String() && e.Code == 404\n}\n\nfunc ErrorUserNotFound(format string, args ...interface{}) *errors.Error {\n\treturn errors.New(404, ErrorReason_USER_NOT_FOUND.String(), fmt.Sprintf(format, args...))\n}\n\nfunc IsContentMissing(err error) bool {\n\te := errors.FromError(err)\n\treturn e.Reason == ErrorReason_CONTENT_MISSING.String() && e.Code == 400\n}\n\nfunc ErrorContentMissing(format string, args ...interface{}) *errors.Error {\n\treturn errors.New(400, ErrorReason_CONTENT_MISSING.String(), fmt.Sprintf(format, args...))\n}\n"
  },
  {
    "path": "admin/api/service/user/v1/user.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.27.1\n// \tprotoc        v3.17.3\n// source: api/service/user/v1/user.proto\n\npackage v1\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\temptypb \"google.golang.org/protobuf/types/known/emptypb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype ListAddressReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUid int64 `protobuf:\"varint,1,opt,name=uid,proto3\" json:\"uid,omitempty\"`\n}\n\nfunc (x *ListAddressReq) Reset() {\n\t*x = ListAddressReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_service_user_v1_user_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListAddressReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListAddressReq) ProtoMessage() {}\n\nfunc (x *ListAddressReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_service_user_v1_user_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListAddressReq.ProtoReflect.Descriptor instead.\nfunc (*ListAddressReq) Descriptor() ([]byte, []int) {\n\treturn file_api_service_user_v1_user_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *ListAddressReq) GetUid() int64 {\n\tif x != nil {\n\t\treturn x.Uid\n\t}\n\treturn 0\n}\n\ntype AddressInfo struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId        int64  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName      string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tMobile    string `protobuf:\"bytes,3,opt,name=mobile,proto3\" json:\"mobile,omitempty\"`\n\tProvince  string `protobuf:\"bytes,4,opt,name=Province,proto3\" json:\"Province,omitempty\"`\n\tCity      string `protobuf:\"bytes,5,opt,name=City,proto3\" json:\"City,omitempty\"`\n\tDistricts string `protobuf:\"bytes,6,opt,name=Districts,proto3\" json:\"Districts,omitempty\"`\n\tAddress   string `protobuf:\"bytes,7,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tPostCode  string `protobuf:\"bytes,8,opt,name=post_code,json=postCode,proto3\" json:\"post_code,omitempty\"`\n\tIsDefault int32  `protobuf:\"varint,9,opt,name=is_default,json=isDefault,proto3\" json:\"is_default,omitempty\"`\n}\n\nfunc (x *AddressInfo) Reset() {\n\t*x = AddressInfo{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_service_user_v1_user_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AddressInfo) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AddressInfo) ProtoMessage() {}\n\nfunc (x *AddressInfo) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_service_user_v1_user_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AddressInfo.ProtoReflect.Descriptor instead.\nfunc (*AddressInfo) Descriptor() ([]byte, []int) {\n\treturn file_api_service_user_v1_user_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *AddressInfo) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *AddressInfo) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetMobile() string {\n\tif x != nil {\n\t\treturn x.Mobile\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetProvince() string {\n\tif x != nil {\n\t\treturn x.Province\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetCity() string {\n\tif x != nil {\n\t\treturn x.City\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetDistricts() string {\n\tif x != nil {\n\t\treturn x.Districts\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetAddress() string {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetPostCode() string {\n\tif x != nil {\n\t\treturn x.PostCode\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetIsDefault() int32 {\n\tif x != nil {\n\t\treturn x.IsDefault\n\t}\n\treturn 0\n}\n\ntype ListAddressReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tResults []*AddressInfo `protobuf:\"bytes,1,rep,name=results,proto3\" json:\"results,omitempty\"`\n}\n\nfunc (x *ListAddressReply) Reset() {\n\t*x = ListAddressReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_service_user_v1_user_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListAddressReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListAddressReply) ProtoMessage() {}\n\nfunc (x *ListAddressReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_service_user_v1_user_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListAddressReply.ProtoReflect.Descriptor instead.\nfunc (*ListAddressReply) Descriptor() ([]byte, []int) {\n\treturn file_api_service_user_v1_user_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *ListAddressReply) GetResults() []*AddressInfo {\n\tif x != nil {\n\t\treturn x.Results\n\t}\n\treturn nil\n}\n\ntype CreateAddressReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUid       int64  `protobuf:\"varint,1,opt,name=uid,proto3\" json:\"uid,omitempty\"`\n\tName      string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tMobile    string `protobuf:\"bytes,3,opt,name=mobile,proto3\" json:\"mobile,omitempty\"`\n\tProvince  string `protobuf:\"bytes,4,opt,name=Province,proto3\" json:\"Province,omitempty\"`\n\tCity      string `protobuf:\"bytes,5,opt,name=City,proto3\" json:\"City,omitempty\"`\n\tDistricts string `protobuf:\"bytes,6,opt,name=Districts,proto3\" json:\"Districts,omitempty\"`\n\tAddress   string `protobuf:\"bytes,7,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tPostCode  string `protobuf:\"bytes,8,opt,name=post_code,json=postCode,proto3\" json:\"post_code,omitempty\"`\n\tIsDefault int32  `protobuf:\"varint,9,opt,name=is_default,json=isDefault,proto3\" json:\"is_default,omitempty\"`\n}\n\nfunc (x *CreateAddressReq) Reset() {\n\t*x = CreateAddressReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_service_user_v1_user_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CreateAddressReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreateAddressReq) ProtoMessage() {}\n\nfunc (x *CreateAddressReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_service_user_v1_user_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreateAddressReq.ProtoReflect.Descriptor instead.\nfunc (*CreateAddressReq) Descriptor() ([]byte, []int) {\n\treturn file_api_service_user_v1_user_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *CreateAddressReq) GetUid() int64 {\n\tif x != nil {\n\t\treturn x.Uid\n\t}\n\treturn 0\n}\n\nfunc (x *CreateAddressReq) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetMobile() string {\n\tif x != nil {\n\t\treturn x.Mobile\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetProvince() string {\n\tif x != nil {\n\t\treturn x.Province\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetCity() string {\n\tif x != nil {\n\t\treturn x.City\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetDistricts() string {\n\tif x != nil {\n\t\treturn x.Districts\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetAddress() string {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetPostCode() string {\n\tif x != nil {\n\t\treturn x.PostCode\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetIsDefault() int32 {\n\tif x != nil {\n\t\treturn x.IsDefault\n\t}\n\treturn 0\n}\n\ntype UpdateAddressReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUid       int64  `protobuf:\"varint,1,opt,name=uid,proto3\" json:\"uid,omitempty\"`\n\tName      string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tMobile    string `protobuf:\"bytes,3,opt,name=mobile,proto3\" json:\"mobile,omitempty\"`\n\tProvince  string `protobuf:\"bytes,4,opt,name=Province,proto3\" json:\"Province,omitempty\"`\n\tCity      string `protobuf:\"bytes,5,opt,name=City,proto3\" json:\"City,omitempty\"`\n\tDistricts string `protobuf:\"bytes,6,opt,name=Districts,proto3\" json:\"Districts,omitempty\"`\n\tAddress   string `protobuf:\"bytes,7,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tPostCode  string `protobuf:\"bytes,8,opt,name=post_code,json=postCode,proto3\" json:\"post_code,omitempty\"`\n\tIsDefault int32  `protobuf:\"varint,9,opt,name=is_default,json=isDefault,proto3\" json:\"is_default,omitempty\"`\n\tId        int64  `protobuf:\"varint,10,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *UpdateAddressReq) Reset() {\n\t*x = UpdateAddressReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_service_user_v1_user_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *UpdateAddressReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UpdateAddressReq) ProtoMessage() {}\n\nfunc (x *UpdateAddressReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_service_user_v1_user_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UpdateAddressReq.ProtoReflect.Descriptor instead.\nfunc (*UpdateAddressReq) Descriptor() ([]byte, []int) {\n\treturn file_api_service_user_v1_user_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *UpdateAddressReq) GetUid() int64 {\n\tif x != nil {\n\t\treturn x.Uid\n\t}\n\treturn 0\n}\n\nfunc (x *UpdateAddressReq) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetMobile() string {\n\tif x != nil {\n\t\treturn x.Mobile\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetProvince() string {\n\tif x != nil {\n\t\treturn x.Province\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetCity() string {\n\tif x != nil {\n\t\treturn x.City\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetDistricts() string {\n\tif x != nil {\n\t\treturn x.Districts\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetAddress() string {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetPostCode() string {\n\tif x != nil {\n\t\treturn x.PostCode\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetIsDefault() int32 {\n\tif x != nil {\n\t\treturn x.IsDefault\n\t}\n\treturn 0\n}\n\nfunc (x *UpdateAddressReq) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\ntype AddressReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId  int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tUid int64 `protobuf:\"varint,2,opt,name=uid,proto3\" json:\"uid,omitempty\"`\n}\n\nfunc (x *AddressReq) Reset() {\n\t*x = AddressReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_service_user_v1_user_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AddressReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AddressReq) ProtoMessage() {}\n\nfunc (x *AddressReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_service_user_v1_user_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AddressReq.ProtoReflect.Descriptor instead.\nfunc (*AddressReq) Descriptor() ([]byte, []int) {\n\treturn file_api_service_user_v1_user_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *AddressReq) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *AddressReq) GetUid() int64 {\n\tif x != nil {\n\t\treturn x.Uid\n\t}\n\treturn 0\n}\n\ntype CheckResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tSuccess bool `protobuf:\"varint,1,opt,name=success,proto3\" json:\"success,omitempty\"`\n}\n\nfunc (x *CheckResponse) Reset() {\n\t*x = CheckResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_service_user_v1_user_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CheckResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CheckResponse) ProtoMessage() {}\n\nfunc (x *CheckResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_service_user_v1_user_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CheckResponse.ProtoReflect.Descriptor instead.\nfunc (*CheckResponse) Descriptor() ([]byte, []int) {\n\treturn file_api_service_user_v1_user_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *CheckResponse) GetSuccess() bool {\n\tif x != nil {\n\t\treturn x.Success\n\t}\n\treturn false\n}\n\n// 分页\ntype PageInfo struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPn    uint32 `protobuf:\"varint,1,opt,name=pn,proto3\" json:\"pn,omitempty\"`\n\tPSize uint32 `protobuf:\"varint,2,opt,name=pSize,proto3\" json:\"pSize,omitempty\"`\n}\n\nfunc (x *PageInfo) Reset() {\n\t*x = PageInfo{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_service_user_v1_user_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *PageInfo) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*PageInfo) ProtoMessage() {}\n\nfunc (x *PageInfo) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_service_user_v1_user_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use PageInfo.ProtoReflect.Descriptor instead.\nfunc (*PageInfo) Descriptor() ([]byte, []int) {\n\treturn file_api_service_user_v1_user_proto_rawDescGZIP(), []int{7}\n}\n\nfunc (x *PageInfo) GetPn() uint32 {\n\tif x != nil {\n\t\treturn x.Pn\n\t}\n\treturn 0\n}\n\nfunc (x *PageInfo) GetPSize() uint32 {\n\tif x != nil {\n\t\treturn x.PSize\n\t}\n\treturn 0\n}\n\n// 用户信息\ntype UserInfoResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId       int64  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tPassword string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\"`\n\tMobile   string `protobuf:\"bytes,3,opt,name=mobile,proto3\" json:\"mobile,omitempty\"`\n\tNickName string `protobuf:\"bytes,4,opt,name=nickName,proto3\" json:\"nickName,omitempty\"`\n\tBirthday uint64 `protobuf:\"varint,5,opt,name=birthday,proto3\" json:\"birthday,omitempty\"`\n\tGender   string `protobuf:\"bytes,6,opt,name=gender,proto3\" json:\"gender,omitempty\"`\n\tRole     int32  `protobuf:\"varint,7,opt,name=role,proto3\" json:\"role,omitempty\"`\n}\n\nfunc (x *UserInfoResponse) Reset() {\n\t*x = UserInfoResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_service_user_v1_user_proto_msgTypes[8]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *UserInfoResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UserInfoResponse) ProtoMessage() {}\n\nfunc (x *UserInfoResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_service_user_v1_user_proto_msgTypes[8]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UserInfoResponse.ProtoReflect.Descriptor instead.\nfunc (*UserInfoResponse) Descriptor() ([]byte, []int) {\n\treturn file_api_service_user_v1_user_proto_rawDescGZIP(), []int{8}\n}\n\nfunc (x *UserInfoResponse) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *UserInfoResponse) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *UserInfoResponse) GetMobile() string {\n\tif x != nil {\n\t\treturn x.Mobile\n\t}\n\treturn \"\"\n}\n\nfunc (x *UserInfoResponse) GetNickName() string {\n\tif x != nil {\n\t\treturn x.NickName\n\t}\n\treturn \"\"\n}\n\nfunc (x *UserInfoResponse) GetBirthday() uint64 {\n\tif x != nil {\n\t\treturn x.Birthday\n\t}\n\treturn 0\n}\n\nfunc (x *UserInfoResponse) GetGender() string {\n\tif x != nil {\n\t\treturn x.Gender\n\t}\n\treturn \"\"\n}\n\nfunc (x *UserInfoResponse) GetRole() int32 {\n\tif x != nil {\n\t\treturn x.Role\n\t}\n\treturn 0\n}\n\n// 用户列表\ntype UserListResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tTotal int32               `protobuf:\"varint,1,opt,name=total,proto3\" json:\"total,omitempty\"`\n\tData  []*UserInfoResponse `protobuf:\"bytes,2,rep,name=data,proto3\" json:\"data,omitempty\"`\n}\n\nfunc (x *UserListResponse) Reset() {\n\t*x = UserListResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_service_user_v1_user_proto_msgTypes[9]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *UserListResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UserListResponse) ProtoMessage() {}\n\nfunc (x *UserListResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_service_user_v1_user_proto_msgTypes[9]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UserListResponse.ProtoReflect.Descriptor instead.\nfunc (*UserListResponse) Descriptor() ([]byte, []int) {\n\treturn file_api_service_user_v1_user_proto_rawDescGZIP(), []int{9}\n}\n\nfunc (x *UserListResponse) GetTotal() int32 {\n\tif x != nil {\n\t\treturn x.Total\n\t}\n\treturn 0\n}\n\nfunc (x *UserListResponse) GetData() []*UserInfoResponse {\n\tif x != nil {\n\t\treturn x.Data\n\t}\n\treturn nil\n}\n\ntype MobileRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMobile string `protobuf:\"bytes,1,opt,name=mobile,proto3\" json:\"mobile,omitempty\"`\n}\n\nfunc (x *MobileRequest) Reset() {\n\t*x = MobileRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_service_user_v1_user_proto_msgTypes[10]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MobileRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MobileRequest) ProtoMessage() {}\n\nfunc (x *MobileRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_service_user_v1_user_proto_msgTypes[10]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MobileRequest.ProtoReflect.Descriptor instead.\nfunc (*MobileRequest) Descriptor() ([]byte, []int) {\n\treturn file_api_service_user_v1_user_proto_rawDescGZIP(), []int{10}\n}\n\nfunc (x *MobileRequest) GetMobile() string {\n\tif x != nil {\n\t\treturn x.Mobile\n\t}\n\treturn \"\"\n}\n\ntype IdRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *IdRequest) Reset() {\n\t*x = IdRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_service_user_v1_user_proto_msgTypes[11]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *IdRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*IdRequest) ProtoMessage() {}\n\nfunc (x *IdRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_service_user_v1_user_proto_msgTypes[11]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use IdRequest.ProtoReflect.Descriptor instead.\nfunc (*IdRequest) Descriptor() ([]byte, []int) {\n\treturn file_api_service_user_v1_user_proto_rawDescGZIP(), []int{11}\n}\n\nfunc (x *IdRequest) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\n// 创建用户\ntype CreateUserInfo struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tNickName string `protobuf:\"bytes,1,opt,name=nickName,proto3\" json:\"nickName,omitempty\"`\n\tPassword string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\"`\n\tMobile   string `protobuf:\"bytes,3,opt,name=mobile,proto3\" json:\"mobile,omitempty\"`\n}\n\nfunc (x *CreateUserInfo) Reset() {\n\t*x = CreateUserInfo{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_service_user_v1_user_proto_msgTypes[12]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CreateUserInfo) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreateUserInfo) ProtoMessage() {}\n\nfunc (x *CreateUserInfo) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_service_user_v1_user_proto_msgTypes[12]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreateUserInfo.ProtoReflect.Descriptor instead.\nfunc (*CreateUserInfo) Descriptor() ([]byte, []int) {\n\treturn file_api_service_user_v1_user_proto_rawDescGZIP(), []int{12}\n}\n\nfunc (x *CreateUserInfo) GetNickName() string {\n\tif x != nil {\n\t\treturn x.NickName\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateUserInfo) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateUserInfo) GetMobile() string {\n\tif x != nil {\n\t\treturn x.Mobile\n\t}\n\treturn \"\"\n}\n\ntype UpdateUserInfo struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId       int64  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tNickName string `protobuf:\"bytes,2,opt,name=nickName,proto3\" json:\"nickName,omitempty\"`\n\tGender   string `protobuf:\"bytes,3,opt,name=gender,proto3\" json:\"gender,omitempty\"`\n\tBirthday uint64 `protobuf:\"varint,4,opt,name=birthday,proto3\" json:\"birthday,omitempty\"`\n}\n\nfunc (x *UpdateUserInfo) Reset() {\n\t*x = UpdateUserInfo{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_service_user_v1_user_proto_msgTypes[13]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *UpdateUserInfo) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UpdateUserInfo) ProtoMessage() {}\n\nfunc (x *UpdateUserInfo) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_service_user_v1_user_proto_msgTypes[13]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UpdateUserInfo.ProtoReflect.Descriptor instead.\nfunc (*UpdateUserInfo) Descriptor() ([]byte, []int) {\n\treturn file_api_service_user_v1_user_proto_rawDescGZIP(), []int{13}\n}\n\nfunc (x *UpdateUserInfo) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *UpdateUserInfo) GetNickName() string {\n\tif x != nil {\n\t\treturn x.NickName\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateUserInfo) GetGender() string {\n\tif x != nil {\n\t\treturn x.Gender\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateUserInfo) GetBirthday() uint64 {\n\tif x != nil {\n\t\treturn x.Birthday\n\t}\n\treturn 0\n}\n\ntype PasswordCheckInfo struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPassword          string `protobuf:\"bytes,1,opt,name=password,proto3\" json:\"password,omitempty\"`\n\tEncryptedPassword string `protobuf:\"bytes,2,opt,name=encryptedPassword,proto3\" json:\"encryptedPassword,omitempty\"`\n}\n\nfunc (x *PasswordCheckInfo) Reset() {\n\t*x = PasswordCheckInfo{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_service_user_v1_user_proto_msgTypes[14]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *PasswordCheckInfo) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*PasswordCheckInfo) ProtoMessage() {}\n\nfunc (x *PasswordCheckInfo) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_service_user_v1_user_proto_msgTypes[14]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use PasswordCheckInfo.ProtoReflect.Descriptor instead.\nfunc (*PasswordCheckInfo) Descriptor() ([]byte, []int) {\n\treturn file_api_service_user_v1_user_proto_rawDescGZIP(), []int{14}\n}\n\nfunc (x *PasswordCheckInfo) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *PasswordCheckInfo) GetEncryptedPassword() string {\n\tif x != nil {\n\t\treturn x.EncryptedPassword\n\t}\n\treturn \"\"\n}\n\nvar File_api_service_user_v1_user_proto protoreflect.FileDescriptor\n\nvar file_api_service_user_v1_user_proto_rawDesc = []byte{\n\t0x0a, 0x1e, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x75, 0x73,\n\t0x65, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x12, 0x07, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x22, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x64,\n\t0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0xed, 0x01, 0x0a, 0x0b, 0x41,\n\t0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16,\n\t0x0a, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,\n\t0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e,\n\t0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e,\n\t0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x04, 0x43, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69,\n\t0x63, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x69, 0x73, 0x74, 0x72,\n\t0x69, 0x63, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18,\n\t0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1b,\n\t0x0a, 0x09, 0x70, 0x6f, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x69,\n\t0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52,\n\t0x09, 0x69, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x42, 0x0a, 0x10, 0x4c, 0x69,\n\t0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e,\n\t0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x14, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73,\n\t0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0xf4,\n\t0x01, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,\n\t0x52, 0x65, 0x71, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03,\n\t0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x6f, 0x62,\n\t0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c,\n\t0x65, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a,\n\t0x04, 0x43, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x43, 0x69, 0x74,\n\t0x79, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x73, 0x18, 0x06,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x73, 0x12,\n\t0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x73,\n\t0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f,\n\t0x73, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x64, 0x65, 0x66,\n\t0x61, 0x75, 0x6c, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x69, 0x73, 0x44, 0x65,\n\t0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x84, 0x02, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,\n\t0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69,\n\t0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65,\n\t0x12, 0x16, 0x0a, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x76,\n\t0x69, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x76,\n\t0x69, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x04, 0x43, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x69, 0x73, 0x74,\n\t0x72, 0x69, 0x63, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x69, 0x73,\n\t0x74, 0x72, 0x69, 0x63, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73,\n\t0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,\n\t0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1d, 0x0a,\n\t0x0a, 0x69, 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28,\n\t0x05, 0x52, 0x09, 0x69, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x0e, 0x0a, 0x02,\n\t0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x22, 0x2e, 0x0a, 0x0a,\n\t0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69,\n\t0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0x29, 0x0a, 0x0d,\n\t0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a,\n\t0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07,\n\t0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x30, 0x0a, 0x08, 0x50, 0x61, 0x67, 0x65, 0x49,\n\t0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x70, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52,\n\t0x02, 0x70, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x0d, 0x52, 0x05, 0x70, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xba, 0x01, 0x0a, 0x10, 0x55, 0x73,\n\t0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e,\n\t0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a,\n\t0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x6f,\n\t0x62, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x6f, 0x62, 0x69,\n\t0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a,\n\t0x0a, 0x08, 0x62, 0x69, 0x72, 0x74, 0x68, 0x64, 0x61, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04,\n\t0x52, 0x08, 0x62, 0x69, 0x72, 0x74, 0x68, 0x64, 0x61, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x67, 0x65,\n\t0x6e, 0x64, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x67, 0x65, 0x6e, 0x64,\n\t0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05,\n\t0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x57, 0x0a, 0x10, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69,\n\t0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f,\n\t0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c,\n\t0x12, 0x2d, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19,\n\t0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66,\n\t0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22,\n\t0x27, 0x0a, 0x0d, 0x4d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x12, 0x16, 0x0a, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x22, 0x1b, 0x0a, 0x09, 0x49, 0x64, 0x52, 0x65,\n\t0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x03, 0x52, 0x02, 0x69, 0x64, 0x22, 0x60, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55,\n\t0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x4e,\n\t0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x4e,\n\t0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12,\n\t0x16, 0x0a, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x22, 0x70, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74,\n\t0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x69, 0x63,\n\t0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x69, 0x63,\n\t0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x67, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18,\n\t0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x67, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x1a, 0x0a,\n\t0x08, 0x62, 0x69, 0x72, 0x74, 0x68, 0x64, 0x61, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52,\n\t0x08, 0x62, 0x69, 0x72, 0x74, 0x68, 0x64, 0x61, 0x79, 0x22, 0x5d, 0x0a, 0x11, 0x50, 0x61, 0x73,\n\t0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a,\n\t0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x2c, 0x0a, 0x11, 0x65, 0x6e,\n\t0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64,\n\t0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x32, 0xe9, 0x05, 0x0a, 0x04, 0x55, 0x73, 0x65,\n\t0x72, 0x12, 0x3d, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74,\n\t0x12, 0x11, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x49,\n\t0x6e, 0x66, 0x6f, 0x1a, 0x19, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73,\n\t0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00,\n\t0x12, 0x46, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x42, 0x79, 0x4d, 0x6f, 0x62,\n\t0x69, 0x6c, 0x65, 0x12, 0x16, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f,\n\t0x62, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x75, 0x73,\n\t0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65,\n\t0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x55,\n\t0x73, 0x65, 0x72, 0x42, 0x79, 0x49, 0x64, 0x12, 0x12, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76,\n\t0x31, 0x2e, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x75, 0x73,\n\t0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65,\n\t0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61,\n\t0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x17, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31,\n\t0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x1a,\n\t0x19, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e,\n\t0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x0a,\n\t0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x17, 0x2e, 0x75, 0x73, 0x65,\n\t0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49,\n\t0x6e, 0x66, 0x6f, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a,\n\t0x0d, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1a,\n\t0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72,\n\t0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0x16, 0x2e, 0x75, 0x73, 0x65,\n\t0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,\n\t0x73, 0x65, 0x22, 0x00, 0x12, 0x43, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72,\n\t0x65, 0x73, 0x73, 0x12, 0x17, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69,\n\t0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x75,\n\t0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65,\n\t0x73, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0d, 0x43, 0x72, 0x65,\n\t0x61, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x19, 0x2e, 0x75, 0x73, 0x65,\n\t0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65,\n\t0x73, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e,\n\t0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x00, 0x12, 0x44, 0x0a,\n\t0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x19,\n\t0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41,\n\t0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x75, 0x73, 0x65, 0x72,\n\t0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,\n\t0x65, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x0e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x41, 0x64,\n\t0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x13, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e,\n\t0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x75, 0x73, 0x65,\n\t0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,\n\t0x73, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x64,\n\t0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x13, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e,\n\t0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x75, 0x73, 0x65,\n\t0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,\n\t0x73, 0x65, 0x22, 0x00, 0x42, 0x15, 0x5a, 0x13, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x61, 0x70, 0x69,\n\t0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x3b, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_api_service_user_v1_user_proto_rawDescOnce sync.Once\n\tfile_api_service_user_v1_user_proto_rawDescData = file_api_service_user_v1_user_proto_rawDesc\n)\n\nfunc file_api_service_user_v1_user_proto_rawDescGZIP() []byte {\n\tfile_api_service_user_v1_user_proto_rawDescOnce.Do(func() {\n\t\tfile_api_service_user_v1_user_proto_rawDescData = protoimpl.X.CompressGZIP(file_api_service_user_v1_user_proto_rawDescData)\n\t})\n\treturn file_api_service_user_v1_user_proto_rawDescData\n}\n\nvar file_api_service_user_v1_user_proto_msgTypes = make([]protoimpl.MessageInfo, 15)\nvar file_api_service_user_v1_user_proto_goTypes = []interface{}{\n\t(*ListAddressReq)(nil),    // 0: user.v1.ListAddressReq\n\t(*AddressInfo)(nil),       // 1: user.v1.AddressInfo\n\t(*ListAddressReply)(nil),  // 2: user.v1.ListAddressReply\n\t(*CreateAddressReq)(nil),  // 3: user.v1.CreateAddressReq\n\t(*UpdateAddressReq)(nil),  // 4: user.v1.UpdateAddressReq\n\t(*AddressReq)(nil),        // 5: user.v1.AddressReq\n\t(*CheckResponse)(nil),     // 6: user.v1.CheckResponse\n\t(*PageInfo)(nil),          // 7: user.v1.PageInfo\n\t(*UserInfoResponse)(nil),  // 8: user.v1.UserInfoResponse\n\t(*UserListResponse)(nil),  // 9: user.v1.UserListResponse\n\t(*MobileRequest)(nil),     // 10: user.v1.MobileRequest\n\t(*IdRequest)(nil),         // 11: user.v1.IdRequest\n\t(*CreateUserInfo)(nil),    // 12: user.v1.CreateUserInfo\n\t(*UpdateUserInfo)(nil),    // 13: user.v1.UpdateUserInfo\n\t(*PasswordCheckInfo)(nil), // 14: user.v1.PasswordCheckInfo\n\t(*emptypb.Empty)(nil),     // 15: google.protobuf.Empty\n}\nvar file_api_service_user_v1_user_proto_depIdxs = []int32{\n\t1,  // 0: user.v1.ListAddressReply.results:type_name -> user.v1.AddressInfo\n\t8,  // 1: user.v1.UserListResponse.data:type_name -> user.v1.UserInfoResponse\n\t7,  // 2: user.v1.User.GetUserList:input_type -> user.v1.PageInfo\n\t10, // 3: user.v1.User.GetUserByMobile:input_type -> user.v1.MobileRequest\n\t11, // 4: user.v1.User.GetUserById:input_type -> user.v1.IdRequest\n\t12, // 5: user.v1.User.CreateUser:input_type -> user.v1.CreateUserInfo\n\t13, // 6: user.v1.User.UpdateUser:input_type -> user.v1.UpdateUserInfo\n\t14, // 7: user.v1.User.CheckPassword:input_type -> user.v1.PasswordCheckInfo\n\t0,  // 8: user.v1.User.ListAddress:input_type -> user.v1.ListAddressReq\n\t3,  // 9: user.v1.User.CreateAddress:input_type -> user.v1.CreateAddressReq\n\t4,  // 10: user.v1.User.UpdateAddress:input_type -> user.v1.UpdateAddressReq\n\t5,  // 11: user.v1.User.DefaultAddress:input_type -> user.v1.AddressReq\n\t5,  // 12: user.v1.User.DeleteAddress:input_type -> user.v1.AddressReq\n\t9,  // 13: user.v1.User.GetUserList:output_type -> user.v1.UserListResponse\n\t8,  // 14: user.v1.User.GetUserByMobile:output_type -> user.v1.UserInfoResponse\n\t8,  // 15: user.v1.User.GetUserById:output_type -> user.v1.UserInfoResponse\n\t8,  // 16: user.v1.User.CreateUser:output_type -> user.v1.UserInfoResponse\n\t15, // 17: user.v1.User.UpdateUser:output_type -> google.protobuf.Empty\n\t6,  // 18: user.v1.User.CheckPassword:output_type -> user.v1.CheckResponse\n\t2,  // 19: user.v1.User.ListAddress:output_type -> user.v1.ListAddressReply\n\t1,  // 20: user.v1.User.CreateAddress:output_type -> user.v1.AddressInfo\n\t6,  // 21: user.v1.User.UpdateAddress:output_type -> user.v1.CheckResponse\n\t6,  // 22: user.v1.User.DefaultAddress:output_type -> user.v1.CheckResponse\n\t6,  // 23: user.v1.User.DeleteAddress:output_type -> user.v1.CheckResponse\n\t13, // [13:24] is the sub-list for method output_type\n\t2,  // [2:13] is the sub-list for method input_type\n\t2,  // [2:2] is the sub-list for extension type_name\n\t2,  // [2:2] is the sub-list for extension extendee\n\t0,  // [0:2] is the sub-list for field type_name\n}\n\nfunc init() { file_api_service_user_v1_user_proto_init() }\nfunc file_api_service_user_v1_user_proto_init() {\n\tif File_api_service_user_v1_user_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_api_service_user_v1_user_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListAddressReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_service_user_v1_user_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AddressInfo); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_service_user_v1_user_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListAddressReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_service_user_v1_user_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CreateAddressReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_service_user_v1_user_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*UpdateAddressReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_service_user_v1_user_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AddressReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_service_user_v1_user_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CheckResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_service_user_v1_user_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*PageInfo); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_service_user_v1_user_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*UserInfoResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_service_user_v1_user_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*UserListResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_service_user_v1_user_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MobileRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_service_user_v1_user_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*IdRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_service_user_v1_user_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CreateUserInfo); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_service_user_v1_user_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*UpdateUserInfo); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_service_user_v1_user_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*PasswordCheckInfo); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_api_service_user_v1_user_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   15,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_api_service_user_v1_user_proto_goTypes,\n\t\tDependencyIndexes: file_api_service_user_v1_user_proto_depIdxs,\n\t\tMessageInfos:      file_api_service_user_v1_user_proto_msgTypes,\n\t}.Build()\n\tFile_api_service_user_v1_user_proto = out.File\n\tfile_api_service_user_v1_user_proto_rawDesc = nil\n\tfile_api_service_user_v1_user_proto_goTypes = nil\n\tfile_api_service_user_v1_user_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "admin/api/service/user/v1/user.pb.validate.go",
    "content": "// Code generated by protoc-gen-validate. DO NOT EDIT.\n// source: api/service/user/v1/user.proto\n\npackage v1\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"net/mail\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"sort\"\n\t\"strings\"\n\t\"time\"\n\t\"unicode/utf8\"\n\n\t\"google.golang.org/protobuf/types/known/anypb\"\n)\n\n// ensure the imports are used\nvar (\n\t_ = bytes.MinRead\n\t_ = errors.New(\"\")\n\t_ = fmt.Print\n\t_ = utf8.UTFMax\n\t_ = (*regexp.Regexp)(nil)\n\t_ = (*strings.Reader)(nil)\n\t_ = net.IPv4len\n\t_ = time.Duration(0)\n\t_ = (*url.URL)(nil)\n\t_ = (*mail.Address)(nil)\n\t_ = anypb.Any{}\n\t_ = sort.Sort\n)\n\n// Validate checks the field values on ListAddressReq with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *ListAddressReq) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on ListAddressReq with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in ListAddressReqMultiError,\n// or nil if none found.\nfunc (m *ListAddressReq) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *ListAddressReq) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Uid\n\n\tif len(errors) > 0 {\n\t\treturn ListAddressReqMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// ListAddressReqMultiError is an error wrapping multiple validation errors\n// returned by ListAddressReq.ValidateAll() if the designated constraints\n// aren't met.\ntype ListAddressReqMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m ListAddressReqMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m ListAddressReqMultiError) AllErrors() []error { return m }\n\n// ListAddressReqValidationError is the validation error returned by\n// ListAddressReq.Validate if the designated constraints aren't met.\ntype ListAddressReqValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e ListAddressReqValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e ListAddressReqValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e ListAddressReqValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e ListAddressReqValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e ListAddressReqValidationError) ErrorName() string { return \"ListAddressReqValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e ListAddressReqValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sListAddressReq.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = ListAddressReqValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = ListAddressReqValidationError{}\n\n// Validate checks the field values on AddressInfo with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *AddressInfo) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on AddressInfo with the rules defined in\n// the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in AddressInfoMultiError, or\n// nil if none found.\nfunc (m *AddressInfo) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *AddressInfo) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for Name\n\n\t// no validation rules for Mobile\n\n\t// no validation rules for Province\n\n\t// no validation rules for City\n\n\t// no validation rules for Districts\n\n\t// no validation rules for Address\n\n\t// no validation rules for PostCode\n\n\t// no validation rules for IsDefault\n\n\tif len(errors) > 0 {\n\t\treturn AddressInfoMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// AddressInfoMultiError is an error wrapping multiple validation errors\n// returned by AddressInfo.ValidateAll() if the designated constraints aren't met.\ntype AddressInfoMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m AddressInfoMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m AddressInfoMultiError) AllErrors() []error { return m }\n\n// AddressInfoValidationError is the validation error returned by\n// AddressInfo.Validate if the designated constraints aren't met.\ntype AddressInfoValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e AddressInfoValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e AddressInfoValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e AddressInfoValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e AddressInfoValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e AddressInfoValidationError) ErrorName() string { return \"AddressInfoValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e AddressInfoValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sAddressInfo.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = AddressInfoValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = AddressInfoValidationError{}\n\n// Validate checks the field values on ListAddressReply with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *ListAddressReply) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on ListAddressReply with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// ListAddressReplyMultiError, or nil if none found.\nfunc (m *ListAddressReply) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *ListAddressReply) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\tfor idx, item := range m.GetResults() {\n\t\t_, _ = idx, item\n\n\t\tif all {\n\t\t\tswitch v := interface{}(item).(type) {\n\t\t\tcase interface{ ValidateAll() error }:\n\t\t\t\tif err := v.ValidateAll(); err != nil {\n\t\t\t\t\terrors = append(errors, ListAddressReplyValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"Results[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\tcase interface{ Validate() error }:\n\t\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\t\terrors = append(errors, ListAddressReplyValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"Results[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t} else if v, ok := interface{}(item).(interface{ Validate() error }); ok {\n\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\treturn ListAddressReplyValidationError{\n\t\t\t\t\tfield:  fmt.Sprintf(\"Results[%v]\", idx),\n\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\tcause:  err,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn ListAddressReplyMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// ListAddressReplyMultiError is an error wrapping multiple validation errors\n// returned by ListAddressReply.ValidateAll() if the designated constraints\n// aren't met.\ntype ListAddressReplyMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m ListAddressReplyMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m ListAddressReplyMultiError) AllErrors() []error { return m }\n\n// ListAddressReplyValidationError is the validation error returned by\n// ListAddressReply.Validate if the designated constraints aren't met.\ntype ListAddressReplyValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e ListAddressReplyValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e ListAddressReplyValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e ListAddressReplyValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e ListAddressReplyValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e ListAddressReplyValidationError) ErrorName() string { return \"ListAddressReplyValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e ListAddressReplyValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sListAddressReply.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = ListAddressReplyValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = ListAddressReplyValidationError{}\n\n// Validate checks the field values on CreateAddressReq with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *CreateAddressReq) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CreateAddressReq with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// CreateAddressReqMultiError, or nil if none found.\nfunc (m *CreateAddressReq) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CreateAddressReq) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Uid\n\n\t// no validation rules for Name\n\n\t// no validation rules for Mobile\n\n\t// no validation rules for Province\n\n\t// no validation rules for City\n\n\t// no validation rules for Districts\n\n\t// no validation rules for Address\n\n\t// no validation rules for PostCode\n\n\t// no validation rules for IsDefault\n\n\tif len(errors) > 0 {\n\t\treturn CreateAddressReqMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CreateAddressReqMultiError is an error wrapping multiple validation errors\n// returned by CreateAddressReq.ValidateAll() if the designated constraints\n// aren't met.\ntype CreateAddressReqMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CreateAddressReqMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CreateAddressReqMultiError) AllErrors() []error { return m }\n\n// CreateAddressReqValidationError is the validation error returned by\n// CreateAddressReq.Validate if the designated constraints aren't met.\ntype CreateAddressReqValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CreateAddressReqValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CreateAddressReqValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CreateAddressReqValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CreateAddressReqValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CreateAddressReqValidationError) ErrorName() string { return \"CreateAddressReqValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e CreateAddressReqValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCreateAddressReq.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CreateAddressReqValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CreateAddressReqValidationError{}\n\n// Validate checks the field values on UpdateAddressReq with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *UpdateAddressReq) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on UpdateAddressReq with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// UpdateAddressReqMultiError, or nil if none found.\nfunc (m *UpdateAddressReq) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *UpdateAddressReq) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Uid\n\n\t// no validation rules for Name\n\n\t// no validation rules for Mobile\n\n\t// no validation rules for Province\n\n\t// no validation rules for City\n\n\t// no validation rules for Districts\n\n\t// no validation rules for Address\n\n\t// no validation rules for PostCode\n\n\t// no validation rules for IsDefault\n\n\t// no validation rules for Id\n\n\tif len(errors) > 0 {\n\t\treturn UpdateAddressReqMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// UpdateAddressReqMultiError is an error wrapping multiple validation errors\n// returned by UpdateAddressReq.ValidateAll() if the designated constraints\n// aren't met.\ntype UpdateAddressReqMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m UpdateAddressReqMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m UpdateAddressReqMultiError) AllErrors() []error { return m }\n\n// UpdateAddressReqValidationError is the validation error returned by\n// UpdateAddressReq.Validate if the designated constraints aren't met.\ntype UpdateAddressReqValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e UpdateAddressReqValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e UpdateAddressReqValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e UpdateAddressReqValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e UpdateAddressReqValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e UpdateAddressReqValidationError) ErrorName() string { return \"UpdateAddressReqValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e UpdateAddressReqValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sUpdateAddressReq.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = UpdateAddressReqValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = UpdateAddressReqValidationError{}\n\n// Validate checks the field values on AddressReq with the rules defined in the\n// proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *AddressReq) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on AddressReq with the rules defined in\n// the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in AddressReqMultiError, or\n// nil if none found.\nfunc (m *AddressReq) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *AddressReq) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for Uid\n\n\tif len(errors) > 0 {\n\t\treturn AddressReqMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// AddressReqMultiError is an error wrapping multiple validation errors\n// returned by AddressReq.ValidateAll() if the designated constraints aren't met.\ntype AddressReqMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m AddressReqMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m AddressReqMultiError) AllErrors() []error { return m }\n\n// AddressReqValidationError is the validation error returned by\n// AddressReq.Validate if the designated constraints aren't met.\ntype AddressReqValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e AddressReqValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e AddressReqValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e AddressReqValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e AddressReqValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e AddressReqValidationError) ErrorName() string { return \"AddressReqValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e AddressReqValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sAddressReq.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = AddressReqValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = AddressReqValidationError{}\n\n// Validate checks the field values on CheckResponse with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *CheckResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CheckResponse with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in CheckResponseMultiError, or\n// nil if none found.\nfunc (m *CheckResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CheckResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Success\n\n\tif len(errors) > 0 {\n\t\treturn CheckResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CheckResponseMultiError is an error wrapping multiple validation errors\n// returned by CheckResponse.ValidateAll() if the designated constraints\n// aren't met.\ntype CheckResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CheckResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CheckResponseMultiError) AllErrors() []error { return m }\n\n// CheckResponseValidationError is the validation error returned by\n// CheckResponse.Validate if the designated constraints aren't met.\ntype CheckResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CheckResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CheckResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CheckResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CheckResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CheckResponseValidationError) ErrorName() string { return \"CheckResponseValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e CheckResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCheckResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CheckResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CheckResponseValidationError{}\n\n// Validate checks the field values on PageInfo with the rules defined in the\n// proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *PageInfo) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on PageInfo with the rules defined in\n// the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in PageInfoMultiError, or nil\n// if none found.\nfunc (m *PageInfo) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *PageInfo) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Pn\n\n\t// no validation rules for PSize\n\n\tif len(errors) > 0 {\n\t\treturn PageInfoMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// PageInfoMultiError is an error wrapping multiple validation errors returned\n// by PageInfo.ValidateAll() if the designated constraints aren't met.\ntype PageInfoMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m PageInfoMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m PageInfoMultiError) AllErrors() []error { return m }\n\n// PageInfoValidationError is the validation error returned by\n// PageInfo.Validate if the designated constraints aren't met.\ntype PageInfoValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e PageInfoValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e PageInfoValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e PageInfoValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e PageInfoValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e PageInfoValidationError) ErrorName() string { return \"PageInfoValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e PageInfoValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sPageInfo.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = PageInfoValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = PageInfoValidationError{}\n\n// Validate checks the field values on UserInfoResponse with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *UserInfoResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on UserInfoResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// UserInfoResponseMultiError, or nil if none found.\nfunc (m *UserInfoResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *UserInfoResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for Password\n\n\t// no validation rules for Mobile\n\n\t// no validation rules for NickName\n\n\t// no validation rules for Birthday\n\n\t// no validation rules for Gender\n\n\t// no validation rules for Role\n\n\tif len(errors) > 0 {\n\t\treturn UserInfoResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// UserInfoResponseMultiError is an error wrapping multiple validation errors\n// returned by UserInfoResponse.ValidateAll() if the designated constraints\n// aren't met.\ntype UserInfoResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m UserInfoResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m UserInfoResponseMultiError) AllErrors() []error { return m }\n\n// UserInfoResponseValidationError is the validation error returned by\n// UserInfoResponse.Validate if the designated constraints aren't met.\ntype UserInfoResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e UserInfoResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e UserInfoResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e UserInfoResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e UserInfoResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e UserInfoResponseValidationError) ErrorName() string { return \"UserInfoResponseValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e UserInfoResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sUserInfoResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = UserInfoResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = UserInfoResponseValidationError{}\n\n// Validate checks the field values on UserListResponse with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *UserListResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on UserListResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// UserListResponseMultiError, or nil if none found.\nfunc (m *UserListResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *UserListResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Total\n\n\tfor idx, item := range m.GetData() {\n\t\t_, _ = idx, item\n\n\t\tif all {\n\t\t\tswitch v := interface{}(item).(type) {\n\t\t\tcase interface{ ValidateAll() error }:\n\t\t\t\tif err := v.ValidateAll(); err != nil {\n\t\t\t\t\terrors = append(errors, UserListResponseValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"Data[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\tcase interface{ Validate() error }:\n\t\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\t\terrors = append(errors, UserListResponseValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"Data[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t} else if v, ok := interface{}(item).(interface{ Validate() error }); ok {\n\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\treturn UserListResponseValidationError{\n\t\t\t\t\tfield:  fmt.Sprintf(\"Data[%v]\", idx),\n\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\tcause:  err,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn UserListResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// UserListResponseMultiError is an error wrapping multiple validation errors\n// returned by UserListResponse.ValidateAll() if the designated constraints\n// aren't met.\ntype UserListResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m UserListResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m UserListResponseMultiError) AllErrors() []error { return m }\n\n// UserListResponseValidationError is the validation error returned by\n// UserListResponse.Validate if the designated constraints aren't met.\ntype UserListResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e UserListResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e UserListResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e UserListResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e UserListResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e UserListResponseValidationError) ErrorName() string { return \"UserListResponseValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e UserListResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sUserListResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = UserListResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = UserListResponseValidationError{}\n\n// Validate checks the field values on MobileRequest with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *MobileRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on MobileRequest with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in MobileRequestMultiError, or\n// nil if none found.\nfunc (m *MobileRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *MobileRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Mobile\n\n\tif len(errors) > 0 {\n\t\treturn MobileRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// MobileRequestMultiError is an error wrapping multiple validation errors\n// returned by MobileRequest.ValidateAll() if the designated constraints\n// aren't met.\ntype MobileRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m MobileRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m MobileRequestMultiError) AllErrors() []error { return m }\n\n// MobileRequestValidationError is the validation error returned by\n// MobileRequest.Validate if the designated constraints aren't met.\ntype MobileRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e MobileRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e MobileRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e MobileRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e MobileRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e MobileRequestValidationError) ErrorName() string { return \"MobileRequestValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e MobileRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sMobileRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = MobileRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = MobileRequestValidationError{}\n\n// Validate checks the field values on IdRequest with the rules defined in the\n// proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *IdRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on IdRequest with the rules defined in\n// the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in IdRequestMultiError, or nil\n// if none found.\nfunc (m *IdRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *IdRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\tif len(errors) > 0 {\n\t\treturn IdRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// IdRequestMultiError is an error wrapping multiple validation errors returned\n// by IdRequest.ValidateAll() if the designated constraints aren't met.\ntype IdRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m IdRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m IdRequestMultiError) AllErrors() []error { return m }\n\n// IdRequestValidationError is the validation error returned by\n// IdRequest.Validate if the designated constraints aren't met.\ntype IdRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e IdRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e IdRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e IdRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e IdRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e IdRequestValidationError) ErrorName() string { return \"IdRequestValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e IdRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sIdRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = IdRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = IdRequestValidationError{}\n\n// Validate checks the field values on CreateUserInfo with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *CreateUserInfo) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CreateUserInfo with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in CreateUserInfoMultiError,\n// or nil if none found.\nfunc (m *CreateUserInfo) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CreateUserInfo) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for NickName\n\n\t// no validation rules for Password\n\n\t// no validation rules for Mobile\n\n\tif len(errors) > 0 {\n\t\treturn CreateUserInfoMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CreateUserInfoMultiError is an error wrapping multiple validation errors\n// returned by CreateUserInfo.ValidateAll() if the designated constraints\n// aren't met.\ntype CreateUserInfoMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CreateUserInfoMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CreateUserInfoMultiError) AllErrors() []error { return m }\n\n// CreateUserInfoValidationError is the validation error returned by\n// CreateUserInfo.Validate if the designated constraints aren't met.\ntype CreateUserInfoValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CreateUserInfoValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CreateUserInfoValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CreateUserInfoValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CreateUserInfoValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CreateUserInfoValidationError) ErrorName() string { return \"CreateUserInfoValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e CreateUserInfoValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCreateUserInfo.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CreateUserInfoValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CreateUserInfoValidationError{}\n\n// Validate checks the field values on UpdateUserInfo with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *UpdateUserInfo) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on UpdateUserInfo with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in UpdateUserInfoMultiError,\n// or nil if none found.\nfunc (m *UpdateUserInfo) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *UpdateUserInfo) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for NickName\n\n\t// no validation rules for Gender\n\n\t// no validation rules for Birthday\n\n\tif len(errors) > 0 {\n\t\treturn UpdateUserInfoMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// UpdateUserInfoMultiError is an error wrapping multiple validation errors\n// returned by UpdateUserInfo.ValidateAll() if the designated constraints\n// aren't met.\ntype UpdateUserInfoMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m UpdateUserInfoMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m UpdateUserInfoMultiError) AllErrors() []error { return m }\n\n// UpdateUserInfoValidationError is the validation error returned by\n// UpdateUserInfo.Validate if the designated constraints aren't met.\ntype UpdateUserInfoValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e UpdateUserInfoValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e UpdateUserInfoValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e UpdateUserInfoValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e UpdateUserInfoValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e UpdateUserInfoValidationError) ErrorName() string { return \"UpdateUserInfoValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e UpdateUserInfoValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sUpdateUserInfo.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = UpdateUserInfoValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = UpdateUserInfoValidationError{}\n\n// Validate checks the field values on PasswordCheckInfo with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *PasswordCheckInfo) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on PasswordCheckInfo with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// PasswordCheckInfoMultiError, or nil if none found.\nfunc (m *PasswordCheckInfo) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *PasswordCheckInfo) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Password\n\n\t// no validation rules for EncryptedPassword\n\n\tif len(errors) > 0 {\n\t\treturn PasswordCheckInfoMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// PasswordCheckInfoMultiError is an error wrapping multiple validation errors\n// returned by PasswordCheckInfo.ValidateAll() if the designated constraints\n// aren't met.\ntype PasswordCheckInfoMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m PasswordCheckInfoMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m PasswordCheckInfoMultiError) AllErrors() []error { return m }\n\n// PasswordCheckInfoValidationError is the validation error returned by\n// PasswordCheckInfo.Validate if the designated constraints aren't met.\ntype PasswordCheckInfoValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e PasswordCheckInfoValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e PasswordCheckInfoValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e PasswordCheckInfoValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e PasswordCheckInfoValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e PasswordCheckInfoValidationError) ErrorName() string {\n\treturn \"PasswordCheckInfoValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e PasswordCheckInfoValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sPasswordCheckInfo.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = PasswordCheckInfoValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = PasswordCheckInfoValidationError{}\n"
  },
  {
    "path": "admin/api/service/user/v1/user.proto",
    "content": "syntax = \"proto3\";\n\npackage user.v1;\n\nimport \"google/protobuf/empty.proto\";\n\noption go_package = \"user/api/user/v1;v1\";\n\nservice User{\n  rpc GetUserList(PageInfo) returns (UserListResponse){}; // 用户列表\n  rpc GetUserByMobile(MobileRequest) returns (UserInfoResponse){}; // 通过 mobile 查询用户\n  rpc GetUserById(IdRequest) returns (UserInfoResponse){}; // 通过 Id 查询用户\n  rpc CreateUser(CreateUserInfo) returns (UserInfoResponse){}; // 创建用户\n  rpc UpdateUser(UpdateUserInfo) returns (google.protobuf.Empty){}; // 更新用户\n  rpc CheckPassword(PasswordCheckInfo) returns (CheckResponse){}; // 检查用户密码\n\n  // 收货地址\n  rpc ListAddress(ListAddressReq) returns (ListAddressReply) {} // 所有收货地址列表\n  rpc CreateAddress(CreateAddressReq) returns (AddressInfo) {} // 新增收货地址\n  rpc UpdateAddress(UpdateAddressReq) returns (CheckResponse) {} // 修改收货地址\n  rpc DefaultAddress(AddressReq) returns (CheckResponse) {} // 设置默认地址\n  rpc DeleteAddress(AddressReq) returns (CheckResponse) {} // 删除收货地址\n\n}\n\nmessage ListAddressReq {\n  int64 uid = 1;\n}\n\nmessage AddressInfo {\n  int64 id = 1;\n  string name = 2;\n  string mobile = 3;\n  string Province = 4;\n  string City = 5;\n  string Districts = 6;\n  string address = 7;\n  string post_code = 8;\n  int32 is_default = 9;\n}\nmessage ListAddressReply {\n  repeated AddressInfo results = 1;\n}\n\nmessage CreateAddressReq {\n  int64 uid = 1;\n  string name = 2;\n  string mobile = 3;\n  string Province = 4;\n  string City = 5;\n  string Districts = 6;\n  string address = 7;\n  string post_code = 8;\n  int32 is_default = 9;\n}\n\nmessage UpdateAddressReq {\n  int64 uid = 1;\n  string name = 2;\n  string mobile = 3;\n  string Province = 4;\n  string City = 5;\n  string Districts = 6;\n  string address = 7;\n  string post_code = 8;\n  int32 is_default = 9;\n  int64 id = 10;\n}\n\nmessage AddressReq {\n  int64 id = 1;\n  int64 uid = 2;\n}\n\nmessage CheckResponse{\n  bool success = 1;\n}\n\n// 分页\nmessage PageInfo{\n  uint32 pn = 1;\n  uint32 pSize = 2;\n}\n\n// 用户信息\nmessage UserInfoResponse{\n  int64 id = 1;\n  string password = 2;\n  string mobile = 3;\n  string nickName = 4;\n  uint64 birthday = 5;\n  string gender = 6;\n  int32 role = 7;\n}\n\n// 用户列表\nmessage UserListResponse{\n  int32 total = 1;\n  repeated UserInfoResponse data = 2;\n}\n\nmessage MobileRequest{\n  string mobile = 1;\n}\n\nmessage IdRequest{\n  int64 id = 1;\n}\n\n// 创建用户\nmessage  CreateUserInfo{\n  string nickName = 1;\n  string password = 2;\n  string mobile = 3;\n}\n\nmessage  UpdateUserInfo{\n  int64 id = 1;\n  string nickName = 2;\n  string gender = 3;\n  uint64 birthday = 4;\n}\n\nmessage PasswordCheckInfo{\n  string password = 1;\n  string encryptedPassword = 2;\n}"
  },
  {
    "path": "admin/api/service/user/v1/user_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.2.0\n// - protoc             v3.17.3\n// source: api/service/user/v1/user.proto\n\npackage v1\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n\temptypb \"google.golang.org/protobuf/types/known/emptypb\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\n// UserClient is the client API for User service.\n//\n// 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.\ntype UserClient interface {\n\tGetUserList(ctx context.Context, in *PageInfo, opts ...grpc.CallOption) (*UserListResponse, error)\n\tGetUserByMobile(ctx context.Context, in *MobileRequest, opts ...grpc.CallOption) (*UserInfoResponse, error)\n\tGetUserById(ctx context.Context, in *IdRequest, opts ...grpc.CallOption) (*UserInfoResponse, error)\n\tCreateUser(ctx context.Context, in *CreateUserInfo, opts ...grpc.CallOption) (*UserInfoResponse, error)\n\tUpdateUser(ctx context.Context, in *UpdateUserInfo, opts ...grpc.CallOption) (*emptypb.Empty, error)\n\tCheckPassword(ctx context.Context, in *PasswordCheckInfo, opts ...grpc.CallOption) (*CheckResponse, error)\n\t// 收货地址\n\tListAddress(ctx context.Context, in *ListAddressReq, opts ...grpc.CallOption) (*ListAddressReply, error)\n\tCreateAddress(ctx context.Context, in *CreateAddressReq, opts ...grpc.CallOption) (*AddressInfo, error)\n\tUpdateAddress(ctx context.Context, in *UpdateAddressReq, opts ...grpc.CallOption) (*CheckResponse, error)\n\tDefaultAddress(ctx context.Context, in *AddressReq, opts ...grpc.CallOption) (*CheckResponse, error)\n\tDeleteAddress(ctx context.Context, in *AddressReq, opts ...grpc.CallOption) (*CheckResponse, error)\n}\n\ntype userClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewUserClient(cc grpc.ClientConnInterface) UserClient {\n\treturn &userClient{cc}\n}\n\nfunc (c *userClient) GetUserList(ctx context.Context, in *PageInfo, opts ...grpc.CallOption) (*UserListResponse, error) {\n\tout := new(UserListResponse)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/GetUserList\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) GetUserByMobile(ctx context.Context, in *MobileRequest, opts ...grpc.CallOption) (*UserInfoResponse, error) {\n\tout := new(UserInfoResponse)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/GetUserByMobile\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) GetUserById(ctx context.Context, in *IdRequest, opts ...grpc.CallOption) (*UserInfoResponse, error) {\n\tout := new(UserInfoResponse)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/GetUserById\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) CreateUser(ctx context.Context, in *CreateUserInfo, opts ...grpc.CallOption) (*UserInfoResponse, error) {\n\tout := new(UserInfoResponse)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/CreateUser\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) UpdateUser(ctx context.Context, in *UpdateUserInfo, opts ...grpc.CallOption) (*emptypb.Empty, error) {\n\tout := new(emptypb.Empty)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/UpdateUser\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) CheckPassword(ctx context.Context, in *PasswordCheckInfo, opts ...grpc.CallOption) (*CheckResponse, error) {\n\tout := new(CheckResponse)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/CheckPassword\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) ListAddress(ctx context.Context, in *ListAddressReq, opts ...grpc.CallOption) (*ListAddressReply, error) {\n\tout := new(ListAddressReply)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/ListAddress\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) CreateAddress(ctx context.Context, in *CreateAddressReq, opts ...grpc.CallOption) (*AddressInfo, error) {\n\tout := new(AddressInfo)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/CreateAddress\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) UpdateAddress(ctx context.Context, in *UpdateAddressReq, opts ...grpc.CallOption) (*CheckResponse, error) {\n\tout := new(CheckResponse)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/UpdateAddress\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) DefaultAddress(ctx context.Context, in *AddressReq, opts ...grpc.CallOption) (*CheckResponse, error) {\n\tout := new(CheckResponse)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/DefaultAddress\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) DeleteAddress(ctx context.Context, in *AddressReq, opts ...grpc.CallOption) (*CheckResponse, error) {\n\tout := new(CheckResponse)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/DeleteAddress\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// UserServer is the s API for User service.\n// All implementations must embed UnimplementedUserServer\n// for forward compatibility\ntype UserServer interface {\n\tGetUserList(context.Context, *PageInfo) (*UserListResponse, error)\n\tGetUserByMobile(context.Context, *MobileRequest) (*UserInfoResponse, error)\n\tGetUserById(context.Context, *IdRequest) (*UserInfoResponse, error)\n\tCreateUser(context.Context, *CreateUserInfo) (*UserInfoResponse, error)\n\tUpdateUser(context.Context, *UpdateUserInfo) (*emptypb.Empty, error)\n\tCheckPassword(context.Context, *PasswordCheckInfo) (*CheckResponse, error)\n\t// 收货地址\n\tListAddress(context.Context, *ListAddressReq) (*ListAddressReply, error)\n\tCreateAddress(context.Context, *CreateAddressReq) (*AddressInfo, error)\n\tUpdateAddress(context.Context, *UpdateAddressReq) (*CheckResponse, error)\n\tDefaultAddress(context.Context, *AddressReq) (*CheckResponse, error)\n\tDeleteAddress(context.Context, *AddressReq) (*CheckResponse, error)\n\tmustEmbedUnimplementedUserServer()\n}\n\n// UnimplementedUserServer must be embedded to have forward compatible implementations.\ntype UnimplementedUserServer struct {\n}\n\nfunc (UnimplementedUserServer) GetUserList(context.Context, *PageInfo) (*UserListResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetUserList not implemented\")\n}\nfunc (UnimplementedUserServer) GetUserByMobile(context.Context, *MobileRequest) (*UserInfoResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetUserByMobile not implemented\")\n}\nfunc (UnimplementedUserServer) GetUserById(context.Context, *IdRequest) (*UserInfoResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetUserById not implemented\")\n}\nfunc (UnimplementedUserServer) CreateUser(context.Context, *CreateUserInfo) (*UserInfoResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method CreateUser not implemented\")\n}\nfunc (UnimplementedUserServer) UpdateUser(context.Context, *UpdateUserInfo) (*emptypb.Empty, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method UpdateUser not implemented\")\n}\nfunc (UnimplementedUserServer) CheckPassword(context.Context, *PasswordCheckInfo) (*CheckResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method CheckPassword not implemented\")\n}\nfunc (UnimplementedUserServer) ListAddress(context.Context, *ListAddressReq) (*ListAddressReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method ListAddress not implemented\")\n}\nfunc (UnimplementedUserServer) CreateAddress(context.Context, *CreateAddressReq) (*AddressInfo, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method CreateAddress not implemented\")\n}\nfunc (UnimplementedUserServer) UpdateAddress(context.Context, *UpdateAddressReq) (*CheckResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method UpdateAddress not implemented\")\n}\nfunc (UnimplementedUserServer) DefaultAddress(context.Context, *AddressReq) (*CheckResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method DefaultAddress not implemented\")\n}\nfunc (UnimplementedUserServer) DeleteAddress(context.Context, *AddressReq) (*CheckResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method DeleteAddress not implemented\")\n}\nfunc (UnimplementedUserServer) mustEmbedUnimplementedUserServer() {}\n\n// UnsafeUserServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to UserServer will\n// result in compilation errors.\ntype UnsafeUserServer interface {\n\tmustEmbedUnimplementedUserServer()\n}\n\nfunc RegisterUserServer(s grpc.ServiceRegistrar, srv UserServer) {\n\ts.RegisterService(&User_ServiceDesc, srv)\n}\n\nfunc _User_GetUserList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(PageInfo)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).GetUserList(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/GetUserList\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).GetUserList(ctx, req.(*PageInfo))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_GetUserByMobile_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(MobileRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).GetUserByMobile(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/GetUserByMobile\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).GetUserByMobile(ctx, req.(*MobileRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_GetUserById_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(IdRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).GetUserById(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/GetUserById\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).GetUserById(ctx, req.(*IdRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_CreateUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(CreateUserInfo)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).CreateUser(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/CreateUser\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).CreateUser(ctx, req.(*CreateUserInfo))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_UpdateUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(UpdateUserInfo)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).UpdateUser(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/UpdateUser\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).UpdateUser(ctx, req.(*UpdateUserInfo))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_CheckPassword_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(PasswordCheckInfo)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).CheckPassword(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/CheckPassword\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).CheckPassword(ctx, req.(*PasswordCheckInfo))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_ListAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(ListAddressReq)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).ListAddress(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/ListAddress\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).ListAddress(ctx, req.(*ListAddressReq))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_CreateAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(CreateAddressReq)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).CreateAddress(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/CreateAddress\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).CreateAddress(ctx, req.(*CreateAddressReq))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_UpdateAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(UpdateAddressReq)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).UpdateAddress(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/UpdateAddress\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).UpdateAddress(ctx, req.(*UpdateAddressReq))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_DefaultAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(AddressReq)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).DefaultAddress(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/DefaultAddress\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).DefaultAddress(ctx, req.(*AddressReq))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_DeleteAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(AddressReq)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).DeleteAddress(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/DeleteAddress\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).DeleteAddress(ctx, req.(*AddressReq))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// User_ServiceDesc is the grpc.ServiceDesc for User service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar User_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"user.v1.User\",\n\tHandlerType: (*UserServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetUserList\",\n\t\t\tHandler:    _User_GetUserList_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetUserByMobile\",\n\t\t\tHandler:    _User_GetUserByMobile_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetUserById\",\n\t\t\tHandler:    _User_GetUserById_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"CreateUser\",\n\t\t\tHandler:    _User_CreateUser_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"UpdateUser\",\n\t\t\tHandler:    _User_UpdateUser_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"CheckPassword\",\n\t\t\tHandler:    _User_CheckPassword_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"ListAddress\",\n\t\t\tHandler:    _User_ListAddress_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"CreateAddress\",\n\t\t\tHandler:    _User_CreateAddress_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"UpdateAddress\",\n\t\t\tHandler:    _User_UpdateAddress_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"DefaultAddress\",\n\t\t\tHandler:    _User_DefaultAddress_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"DeleteAddress\",\n\t\t\tHandler:    _User_DeleteAddress_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"api/service/user/v1/user.proto\",\n}\n"
  },
  {
    "path": "admin/cmd/admin/main.go",
    "content": "package main\n\nimport (\n\t\"flag\"\n\t\"os\"\n\n\t\"github.com/go-kratos/kratos/v2\"\n\t\"github.com/go-kratos/kratos/v2/config\"\n\t\"github.com/go-kratos/kratos/v2/config/file\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"github.com/go-kratos/kratos/v2/middleware/tracing\"\n\t\"github.com/go-kratos/kratos/v2/registry\"\n\t\"github.com/go-kratos/kratos/v2/transport/http\"\n\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/exporters/jaeger\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\ttracesdk \"go.opentelemetry.io/otel/sdk/trace\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.7.0\"\n\n\t\"admin/internal/conf\"\n)\n\n// go build -ldflags \"-X main.Version=x.y.z\"\nvar (\n\t// Name is the name of the compiled software.\n\tName = \"admin.api\"\n\t// Version is the version of the compiled software.\n\tVersion = \"admin.api.v1\"\n\t// flagconf is the config flag.\n\tflagconf string\n\n\tid, _ = os.Hostname()\n)\n\nfunc init() {\n\tflag.StringVar(&flagconf, \"conf\", \"../../configs\", \"config path, eg: -conf config.yaml\")\n}\n\nfunc newApp(logger log.Logger, hs *http.Server, rr registry.Registrar) *kratos.App {\n\treturn kratos.New(\n\t\tkratos.ID(id+\"admin.api\"),\n\t\tkratos.Name(Name),\n\t\tkratos.Version(Version),\n\t\tkratos.Metadata(map[string]string{}),\n\t\tkratos.Logger(logger),\n\t\tkratos.Server(\n\t\t\ths,\n\t\t),\n\t\tkratos.Registrar(rr),\n\t)\n}\n\nfunc main() {\n\tflag.Parse()\n\tlogger := log.With(log.NewStdLogger(os.Stdout),\n\t\t\"ts\", log.DefaultTimestamp,\n\t\t\"caller\", log.DefaultCaller,\n\t\t\"service.id\", id,\n\t\t\"service.name\", Name,\n\t\t\"service.version\", Version,\n\t\t\"trace_id\", tracing.TraceID(),\n\t\t\"span_id\", tracing.SpanID(),\n\t)\n\tc := config.New(\n\t\tconfig.WithSource(\n\t\t\tfile.NewSource(flagconf),\n\t\t),\n\t)\n\tdefer c.Close()\n\n\tif err := c.Load(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tvar bc conf.Bootstrap\n\tif err := c.Scan(&bc); err != nil {\n\t\tpanic(err)\n\t}\n\n\tvar rc conf.Registry\n\tif err := c.Scan(&rc); err != nil {\n\t\tpanic(err)\n\t}\n\n\terr := setTracerProvider(bc.Trace.Endpoint)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tapp, cleanup, err := initApp(bc.Server, bc.Data, bc.Auth, bc.Service, &rc, logger)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdefer cleanup()\n\n\t// start and wait for stop signal\n\tif err := app.Run(); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc setTracerProvider(url string) error {\n\t// Create the Jaeger exporter\n\texp, err := jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(url)))\n\tif err != nil {\n\t\treturn err\n\t}\n\ttp := tracesdk.NewTracerProvider(\n\t\t// Set the sampling rate based on the parent span to 100%\n\t\ttracesdk.WithSampler(tracesdk.ParentBased(tracesdk.TraceIDRatioBased(1.0))),\n\t\t// Always be sure to batch in production.\n\t\ttracesdk.WithBatcher(exp),\n\t\t// Record information about this application in an Resource.\n\t\ttracesdk.WithResource(resource.NewSchemaless(\n\t\t\tsemconv.ServiceNameKey.String(Name),\n\t\t\tattribute.String(\"env\", \"dev\"),\n\t\t)),\n\t)\n\totel.SetTracerProvider(tp)\n\treturn nil\n}\n"
  },
  {
    "path": "admin/cmd/admin/wire.go",
    "content": "//go:build wireinject\n// +build wireinject\n\n// The build tag makes sure the stub is not built in the final build.\n\npackage main\n\nimport (\n\t\"github.com/go-kratos/kratos/v2\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"github.com/google/wire\"\n\t\"admin/internal/biz\"\n\t\"admin/internal/conf\"\n\t\"admin/internal/data\"\n\t\"admin/internal/server\"\n\t\"admin/internal/service\"\n)\n\n// initApp init admin application.\nfunc initApp(*conf.Server, *conf.Data, *conf.Auth, *conf.Service, *conf.Registry, log.Logger) (*kratos.App, func(), error) {\n\tpanic(wire.Build(server.ProviderSet, data.ProviderSet, biz.ProviderSet, service.ProviderSet, newApp))\n}\n"
  },
  {
    "path": "admin/cmd/admin/wire_gen.go",
    "content": "// Code generated by Wire. DO NOT EDIT.\n\n//go:generate go run github.com/google/wire/cmd/wire\n//go:build !wireinject\n// +build !wireinject\n\npackage main\n\nimport (\n\t\"admin/internal/biz\"\n\t\"admin/internal/conf\"\n\t\"admin/internal/data\"\n\t\"admin/internal/server\"\n\t\"admin/internal/service\"\n\t\"github.com/go-kratos/kratos/v2\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n)\n\n// Injectors from wire.go:\n\n// initApp init admin application.\nfunc initApp(confServer *conf.Server, confData *conf.Data, auth *conf.Auth, confService *conf.Service, registry *conf.Registry, logger log.Logger) (*kratos.App, func(), error) {\n\tdiscovery := data.NewDiscovery(registry)\n\tuserClient := data.NewUserServiceClient(auth, confService, discovery)\n\tdataData, err := data.NewData(confData, userClient, logger)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\tuserRepo := data.NewUserRepo(dataData, logger)\n\tuserUsecase := biz.NewUserUsecase(userRepo, logger, auth)\n\taddressRepo := data.NewAddressRepo(dataData, logger)\n\taddressUsecase := biz.NewAddressUsecase(userRepo, addressRepo, logger, auth)\n\tadminService := service.NewAdminService(userUsecase, addressUsecase, logger)\n\thttpServer := server.NewHTTPServer(confServer, auth, adminService, logger)\n\tregistrar := data.NewRegistrar(registry)\n\tapp := newApp(logger, httpServer, registrar)\n\treturn app, func() {\n\t}, nil\n}\n"
  },
  {
    "path": "admin/configs/config.yaml",
    "content": "name: admin.api\nserver:\n  http:\n    addr: 0.0.0.0:9099\n    timeout: 1s\ndata:\n  database:\n    driver: mysql\n    source: root:root@tcp(127.0.0.1:3306)/test\n  redis:\n    addr: 127.0.0.1:6379\n    read_timeout: 0.2s\n    write_timeout: 0.2s\ntrace:\n  endpoint: http://127.0.0.1:14268/api/traces\nauth:\n  jwt_key: hqFr%3ddt32DGlSTOI5cO6@TH#Admin\nservice:\n  user:\n    endpoint: discovery:///shop.user.service\n  goods:\n    endpoint: discovery:///shop.goods.service"
  },
  {
    "path": "admin/configs/registry.yaml",
    "content": "consul:\n  address: 127.0.0.1:8500\n  scheme: http"
  },
  {
    "path": "admin/generate.go",
    "content": "package generate\n\n//go:generate kratos proto client api\n"
  },
  {
    "path": "admin/go.mod",
    "content": "module admin\n\ngo 1.16\n\nrequire (\n\tgithub.com/envoyproxy/protoc-gen-validate v0.6.3\n\tgithub.com/go-kratos/kratos/contrib/registry/consul/v2 v2.0.0-20220209030627-9662ef3c213d\n\tgithub.com/go-kratos/kratos/v2 v2.1.5\n\tgithub.com/golang-jwt/jwt/v4 v4.0.0\n\tgithub.com/google/wire v0.5.0\n\tgithub.com/gorilla/handlers v1.5.1\n\tgithub.com/hashicorp/consul/api v1.12.0\n\tgithub.com/mojocn/base64Captcha v1.3.5\n\tgo.opentelemetry.io/otel v1.4.0\n\tgo.opentelemetry.io/otel/exporters/jaeger v1.4.0\n\tgo.opentelemetry.io/otel/sdk v1.4.0\n\tgoogle.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb\n\tgoogle.golang.org/grpc v1.43.0\n\tgoogle.golang.org/protobuf v1.27.1\n\tgopkg.in/yaml.v2 v2.4.0 // indirect\n)\n"
  },
  {
    "path": "admin/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=\ngithub.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8=\ngithub.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=\ngithub.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=\ngithub.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/envoyproxy/protoc-gen-validate v0.6.3 h1:HkntewfZJ9RofA/FX38zBCeIAqlLDFLbAI6eTpZqFJw=\ngithub.com/envoyproxy/protoc-gen-validate v0.6.3/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ=\ngithub.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=\ngithub.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=\ngithub.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=\ngithub.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=\ngithub.com/go-kratos/aegis v0.1.1/go.mod h1:jYeSQ3Gesba478zEnujOiG5QdsyF3Xk/8owFUeKcHxw=\ngithub.com/go-kratos/kratos/contrib/registry/consul/v2 v2.0.0-20220209030627-9662ef3c213d h1:UHNb0QKaftYtQhvcD3o7xlZbMIQs5SPB9NPKZsoqUtU=\ngithub.com/go-kratos/kratos/contrib/registry/consul/v2 v2.0.0-20220209030627-9662ef3c213d/go.mod h1:gCxmEdB6yLypq2c14QMH6JgvbNxsF4eqxqHQTMogVKA=\ngithub.com/go-kratos/kratos/v2 v2.1.5 h1:q8kTXyY1KkNJS3tmhvGUJfysipM5AIuoJaXBEvDBnFI=\ngithub.com/go-kratos/kratos/v2 v2.1.5/go.mod h1:zMonCKAf8+He4b9NQ/QHr20tMznd4NO5XrNds36w/5k=\ngithub.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.2.2 h1:ahHml/yUpnlb96Rp8HCvtYVPY8ZYpxq3g7UYchIYwbs=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=\ngithub.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=\ngithub.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=\ngithub.com/go-playground/form/v4 v4.2.0 h1:N1wh+Goz61e6w66vo8vJkQt+uwZSoLz50kZPJWR8eic=\ngithub.com/go-playground/form/v4 v4.2.0/go.mod h1:q1a2BY+AQUUzhl6xA/6hBetay6dEIhMHjgvJiGo6K7U=\ngithub.com/golang-jwt/jwt/v4 v4.0.0 h1:RAqyYixv1p7uEnocuy8P1nru5wprCh/MH2BIlW5z5/o=\ngithub.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=\ngithub.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/wire v0.5.0 h1:I7ELFeVBr3yfPIcc8+MWvrjk+3VjbcSzoXm3JVa+jD8=\ngithub.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU=\ngithub.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4=\ngithub.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q=\ngithub.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=\ngithub.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=\ngithub.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=\ngithub.com/hashicorp/consul/api v1.9.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M=\ngithub.com/hashicorp/consul/api v1.12.0 h1:k3y1FYv6nuKyNTqj6w9gXOx5r5CfLj/k/euUeBXj1OY=\ngithub.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0=\ngithub.com/hashicorp/consul/sdk v0.8.0 h1:OJtKBtEjboEZvG6AOUdh4Z1Zbyu0WcxQ0qatRrZHTVU=\ngithub.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms=\ngithub.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-hclog v0.12.0 h1:d4QkX8FRTYaKaCZBoXYY8zJX2BXjWxurN/GA2tkrmZM=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/golang-lru v0.5.0 h1:CL2msUPvZTLb5O648aiLNJw3hnBxN2+1Jq8rCOH9wdo=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=\ngithub.com/hashicorp/memberlist v0.3.0 h1:8+567mCcFDnS5ADl7lrpxPMWiFCElyUEeW0gtj34fMA=\ngithub.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=\ngithub.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk=\ngithub.com/hashicorp/serf v0.9.6 h1:uuEX1kLR6aoda1TBttmJQKDLZE1Ob7KN0NPdE7EtCDc=\ngithub.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=\ngithub.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=\ngithub.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=\ngithub.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0=\ngithub.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=\ngithub.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mojocn/base64Captcha v1.3.5 h1:Qeilr7Ta6eDtG4S+tQuZ5+hO+QHbiGAJdi4PfoagaA0=\ngithub.com/mojocn/base64Captcha v1.3.5/go.mod h1:/tTTXn4WTpX9CfrmipqRytCpJ27Uw3G6I7NcP2WwcmY=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/shirou/gopsutil/v3 v3.21.8/go.mod h1:YWp/H8Qs5fVmf17v7JNZzA0mPJ+mS2e9JdiUF9LlKzQ=\ngithub.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=\ngithub.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4=\ngithub.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=\ngithub.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs=\ngithub.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngo.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs=\ngo.opentelemetry.io/otel v1.4.0 h1:7ESuKPq6zpjRaY5nvVDGiuwK7VAJ8MwkKnmNJ9whNZ4=\ngo.opentelemetry.io/otel v1.4.0/go.mod h1:jeAqMFKy2uLIxCtKxoFj0FAL5zAPKQagc3+GtBWakzk=\ngo.opentelemetry.io/otel/exporters/jaeger v1.4.0 h1:EX/spHhVkHbobTeSozT1zpbuc3oO70CISkw+dspgR9M=\ngo.opentelemetry.io/otel/exporters/jaeger v1.4.0/go.mod h1:C4UfuVfyi7qAk/PAz6QodaEkES7RnLNHeAAj6QOu2gI=\ngo.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs=\ngo.opentelemetry.io/otel/sdk v1.4.0 h1:LJE4SW3jd4lQTESnlpQZcBhQ3oci0U2MLR5uhicfTHQ=\ngo.opentelemetry.io/otel/sdk v1.4.0/go.mod h1:71GJPNJh4Qju6zJuYl1CrYtXbrgfau/M9UAggqiy1UE=\ngo.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk=\ngo.opentelemetry.io/otel/trace v1.4.0 h1:4OOUrPZdVFQkbzl/JSdvGCWIdw5ONXXxzHlaLlWppmo=\ngo.opentelemetry.io/otel/trace v1.4.0/go.mod h1:uc3eRsqDfWs9R7b92xbQbU42/eTNz4N+gLP8qJCi4aE=\ngo.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=\ngolang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/image v0.0.0-20190501045829-6d32002ffd75 h1:TbGuee8sSq15Iguxu4deQ7+Bqq/d2rsQejGcEtADAMQ=\ngolang.org/x/image v0.0.0-20190501045829-6d32002ffd75/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210813160813-60bc85c4be6d h1:LO7XpTYMwTqxjLcGWPijK3vRXg1aWdlNOVOHRq45d7c=\ngolang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210816183151-1e6c022a8912 h1:uCLL3g5wH2xjxVREVuAbP9JM5PPKjRbXKRa6IBjkzmU=\ngolang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190422233926-fe54fb35175b/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb h1:ZrsicilzPCS/Xr8qtBZZLpy4P9TYXAfl49ctG1/5tgw=\ngoogle.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=\ngoogle.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=\ngoogle.golang.org/grpc v1.43.0 h1:Eeu7bZtDZ2DpRCsLhUlcrLnvYaMK1Gz86a+hMVvELmM=\ngoogle.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\n"
  },
  {
    "path": "admin/internal/biz/README.md",
    "content": "# Biz\n"
  },
  {
    "path": "admin/internal/biz/address.go",
    "content": "package biz\n\nimport (\n\t\"context\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"github.com/go-kratos/kratos/v2/middleware/auth/jwt\"\n\tjwt2 \"github.com/golang-jwt/jwt/v4\"\n\tv1 \"admin/api/admin/v1\"\n\t\"admin/internal/conf\"\n)\n\ntype Address struct {\n\tID        int64\n\tUserID    int64\n\tIsDefault int32\n\tMobile    string\n\tName      string\n\tProvince  string\n\tCity      string\n\tDistricts string\n\tAddress   string\n\tPostCode  string\n}\n\ntype AddressRepo interface {\n\tCreateAddress(ctx context.Context, a *Address) (*Address, error)\n\tAddressListByUid(ctx context.Context, uid int64) ([]*Address, error)\n\tUpdateAddress(ctx context.Context, a *Address) error\n\tDefaultAddress(ctx context.Context, a *Address) error\n\tDeleteAddress(ctx context.Context, a *Address) error\n}\n\ntype AddressUsecase struct {\n\tuRepo      UserRepo\n\taRepo      AddressRepo\n\tlog        *log.Helper\n\tsigningKey string\n}\n\nfunc NewAddressUsecase(repo UserRepo, arepo AddressRepo, logger log.Logger, conf *conf.Auth) *AddressUsecase {\n\thelper := log.NewHelper(log.With(logger, \"module\", \"usecase/admin\"))\n\treturn &AddressUsecase{\n\t\tuRepo:      repo,\n\t\taRepo:      arepo,\n\t\tlog:        helper,\n\t\tsigningKey: conf.JwtKey}\n}\n\nfunc (ua *AddressUsecase) CreateAddress(ctx context.Context, r *v1.CreateAddressReq) (*v1.AddressInfo, error) {\n\t// 在上下文 context 中取出 claims 对象\n\tuId, err := getUid(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treq := Address{\n\t\tUserID:    uId,\n\t\tIsDefault: 0,\n\t\tMobile:    r.Mobile,\n\t\tName:      r.Name,\n\t\tProvince:  r.Province,\n\t\tCity:      r.City,\n\t\tDistricts: r.Districts,\n\t\tAddress:   r.Address,\n\t\tPostCode:  r.PostCode,\n\t}\n\tres, err := ua.aRepo.CreateAddress(ctx, &req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tresult := &v1.AddressInfo{\n\t\tId:        res.ID,\n\t\tName:      res.Name,\n\t\tMobile:    res.Mobile,\n\t\tProvince:  res.Province,\n\t\tCity:      res.City,\n\t\tDistricts: res.Districts,\n\t\tAddress:   res.Address,\n\t\tPostCode:  res.PostCode,\n\t\tIsDefault: int32(res.IsDefault),\n\t}\n\treturn result, nil\n}\n\nfunc (ua *AddressUsecase) AddressListByUid(ctx context.Context) (*v1.ListAddressReply, error) {\n\t// 在上下文 context 中取出 claims 对象\n\tuId, err := getUid(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\taddressList, err := ua.aRepo.AddressListByUid(ctx, uId)\n\tvar res v1.ListAddressReply\n\tfor _, v := range addressList {\n\t\taddressInfoTmp := &v1.AddressInfo{\n\t\t\tId:        v.ID,\n\t\t\tName:      v.Name,\n\t\t\tMobile:    v.Mobile,\n\t\t\tProvince:  v.Province,\n\t\t\tCity:      v.City,\n\t\t\tDistricts: v.Districts,\n\t\t\tAddress:   v.Address,\n\t\t\tPostCode:  v.PostCode,\n\t\t\tIsDefault: v.IsDefault,\n\t\t}\n\t\tres.Results = append(res.Results, addressInfoTmp)\n\t}\n\treturn &res, err\n}\n\nfunc (ua *AddressUsecase) UpdateAddress(ctx context.Context, a *Address) (bool, error) {\n\tuId, err := getUid(ctx)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\ta.UserID = uId\n\tif err := ua.aRepo.UpdateAddress(ctx, a); err != nil {\n\t\treturn false, err\n\t}\n\treturn true, nil\n}\n\nfunc getUid(ctx context.Context) (int64, error) {\n\t// 在上下文 context 中取出 claims 对象\n\tvar uId int64\n\tif claims, ok := jwt.FromContext(ctx); ok {\n\t\tc := claims.(jwt2.MapClaims)\n\t\tv, ok := c[\"ID\"]\n\n\t\tif !ok {\n\t\t\treturn 0, ErrAuthFailed\n\t\t}\n\t\tuId = int64(v.(float64))\n\t}\n\treturn uId, nil\n}\n\nfunc (ua *AddressUsecase) DefaultAddress(ctx context.Context, a *Address) (bool, error) {\n\tuId, err := getUid(ctx)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\ta.UserID = uId\n\tif err := ua.aRepo.DefaultAddress(ctx, a); err != nil {\n\t\treturn false, err\n\t}\n\treturn true, nil\n}\n\nfunc (ua *AddressUsecase) DeleteAddress(ctx context.Context, a *Address) (bool, error) {\n\tuId, err := getUid(ctx)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\ta.UserID = uId\n\tif err := ua.aRepo.DeleteAddress(ctx, a); err != nil {\n\t\treturn false, err\n\t}\n\treturn true, nil\n}\n"
  },
  {
    "path": "admin/internal/biz/biz.go",
    "content": "package biz\n\nimport \"github.com/google/wire\"\n\n// ProviderSet is biz providers.\nvar ProviderSet = wire.NewSet(NewUserUsecase, NewAddressUsecase)\n"
  },
  {
    "path": "admin/internal/biz/user.go",
    "content": "package biz\n\nimport (\n\tv1 \"admin/api/admin/v1\"\n\t\"admin/internal/conf\"\n\t\"admin/internal/pkg/captcha\"\n\t\"admin/internal/pkg/middleware/auth\"\n\t\"context\"\n\t\"errors\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"github.com/go-kratos/kratos/v2/middleware/auth/jwt\"\n\tjwt2 \"github.com/golang-jwt/jwt/v4\"\n\t\"time\"\n)\n\nvar (\n\tErrPasswordInvalid     = errors.New(\"password invalid\")\n\tErrUsernameInvalid     = errors.New(\"username invalid\")\n\tErrCaptchaInvalid      = errors.New(\"verification code error\")\n\tErrMobileInvalid       = errors.New(\"mobile invalid\")\n\tErrUserNotFound        = errors.New(\"user not found\")\n\tErrLoginFailed         = errors.New(\"login failed\")\n\tErrGenerateTokenFailed = errors.New(\"generate token failed\")\n\tErrAuthFailed          = errors.New(\"authentication failed\")\n)\n\ntype User struct {\n\tID        int64\n\tMobile    string\n\tPassword  string\n\tNickName  string\n\tBirthday  int64\n\tGender    string\n\tRole      int\n\tCreatedAt time.Time\n}\n\ntype UserRepo interface {\n\tCreateUser(c context.Context, u *User) (*User, error)\n\tUserByMobile(ctx context.Context, mobile string) (*User, error)\n\tUserById(ctx context.Context, Id int64) (*User, error)\n\tCheckPassword(ctx context.Context, password, encryptedPassword string) (bool, error)\n\t//ListUser(ctx context.Context, pageNum, pageSize int) ([]*User, int, error)\n\t//UpdateUser(context.Context, *User) (bool, error)\n}\n\ntype UserUsecase struct {\n\tuRepo      UserRepo\n\tlog        *log.Helper\n\tsigningKey string\n}\n\nfunc NewUserUsecase(repo UserRepo, logger log.Logger, conf *conf.Auth) *UserUsecase {\n\thelper := log.NewHelper(log.With(logger, \"module\", \"usecase/admin\"))\n\treturn &UserUsecase{uRepo: repo, log: helper, signingKey: conf.JwtKey}\n}\n\n// GetCaptcha 验证码\nfunc (uc *UserUsecase) GetCaptcha(ctx context.Context) (*v1.CaptchaReply, error) {\n\tcaptchaInfo, err := captcha.GetCaptcha(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &v1.CaptchaReply{\n\t\tCaptchaId: captchaInfo.CaptchaId,\n\t\tPicPath:   captchaInfo.PicPath,\n\t}, nil\n}\n\nfunc (uc *UserUsecase) UserDetailByID(ctx context.Context) (*v1.UserDetailResponse, error) {\n\t// 在上下文 context 中取出 claims 对象\n\tvar uId int64\n\tif claims, ok := jwt.FromContext(ctx); ok {\n\t\tc := claims.(jwt2.MapClaims)\n\t\ti, ok := c[\"ID\"].(float64)\n\t\tif !ok {\n\t\t\treturn nil, ErrAuthFailed\n\t\t}\n\t\tuId = int64(i)\n\t}\n\n\tuser, err := uc.uRepo.UserById(ctx, uId)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &v1.UserDetailResponse{\n\t\tId:       user.ID,\n\t\tNickName: user.NickName,\n\t\tMobile:   user.Mobile,\n\t}, nil\n}\n\nfunc (uc *UserUsecase) PassWordLogin(ctx context.Context, req *v1.LoginReq) (*v1.RegisterReply, error) {\n\t// 表单验证\n\tif len(req.Username) <= 0 {\n\t\treturn nil, ErrMobileInvalid\n\t}\n\tif len(req.Password) <= 0 {\n\t\treturn nil, ErrUsernameInvalid\n\t}\n\t// 验证验证码是否正确\n\t//if !captcha.Store.Verify(req.CaptchaId, req.Captcha, true) {\n\t//\treturn nil, ErrCaptchaInvalid\n\t//}\n\tmobile := \"13501167215\"\n\tif user, err := uc.uRepo.UserByMobile(ctx, mobile); err != nil {\n\t\treturn nil, ErrUserNotFound\n\t} else {\n\t\t// 用户存在检查密码\n\t\tif passRsp, pasErr := uc.uRepo.CheckPassword(ctx, req.Password, user.Password); pasErr != nil {\n\t\t\treturn nil, ErrPasswordInvalid\n\t\t} else {\n\t\t\tif passRsp {\n\t\t\t\tclaims := auth.CustomClaims{\n\t\t\t\t\tID:          user.ID,\n\t\t\t\t\tNickName:    user.NickName,\n\t\t\t\t\tAuthorityId: user.Role,\n\t\t\t\t\tStandardClaims: jwt2.StandardClaims{\n\t\t\t\t\t\tNotBefore: time.Now().Unix(),               // 签名的生效时间\n\t\t\t\t\t\tExpiresAt: time.Now().Unix() + 60*60*24*30, // 30天过期\n\t\t\t\t\t\tIssuer:    \"Gyl\",\n\t\t\t\t\t},\n\t\t\t\t}\n\n\t\t\t\ttoken, err := auth.CreateToken(claims, uc.signingKey)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, ErrGenerateTokenFailed\n\t\t\t\t}\n\t\t\t\treturn &v1.RegisterReply{\n\t\t\t\t\tId:        user.ID,\n\t\t\t\t\tMobile:    user.Mobile,\n\t\t\t\t\tUsername:  user.NickName,\n\t\t\t\t\tToken:     token,\n\t\t\t\t\tExpiredAt: time.Now().Unix() + 60*60*24*30,\n\t\t\t\t}, nil\n\t\t\t} else {\n\t\t\t\treturn nil, ErrLoginFailed\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (uc *UserUsecase) CreateUser(ctx context.Context, req *v1.RegisterReq) (*v1.RegisterReply, error) {\n\tnewUser, err := NewUser(req.Mobile, req.Username, req.Password)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcreateUser, err := uc.uRepo.CreateUser(ctx, &newUser)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tclaims := auth.CustomClaims{\n\t\tID:          createUser.ID,\n\t\tNickName:    createUser.NickName,\n\t\tAuthorityId: createUser.Role,\n\t\tStandardClaims: jwt2.StandardClaims{\n\t\t\tNotBefore: time.Now().Unix(),               // 签名的生效时间\n\t\t\tExpiresAt: time.Now().Unix() + 60*60*24*30, // 30天过期\n\t\t\tIssuer:    \"Gyl\",\n\t\t},\n\t}\n\ttoken, err := auth.CreateToken(claims, uc.signingKey)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &v1.RegisterReply{\n\t\tId:        createUser.ID,\n\t\tMobile:    createUser.Mobile,\n\t\tUsername:  createUser.NickName,\n\t\tToken:     token,\n\t\tExpiredAt: time.Now().Unix() + 60*60*24*30,\n\t}, nil\n}\n\nfunc NewUser(mobile, username, password string) (User, error) {\n\t// check mobile\n\tif len(mobile) <= 0 {\n\t\treturn User{}, ErrMobileInvalid\n\t}\n\t// check username\n\tif len(username) <= 0 {\n\t\treturn User{}, ErrUsernameInvalid\n\t}\n\t// check password\n\tif len(password) <= 0 {\n\t\treturn User{}, ErrPasswordInvalid\n\t}\n\treturn User{\n\t\tMobile:   mobile,\n\t\tNickName: username,\n\t\tPassword: password,\n\t}, nil\n}\n"
  },
  {
    "path": "admin/internal/conf/conf.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.27.1\n// \tprotoc        v3.17.3\n// source: internal/conf/conf.proto\n\npackage conf\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tdurationpb \"google.golang.org/protobuf/types/known/durationpb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Bootstrap struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tServer  *Server  `protobuf:\"bytes,1,opt,name=s,proto3\" json:\"s,omitempty\"`\n\tData    *Data    `protobuf:\"bytes,2,opt,name=data,proto3\" json:\"data,omitempty\"`\n\tTrace   *Trace   `protobuf:\"bytes,3,opt,name=trace,proto3\" json:\"trace,omitempty\"`\n\tAuth    *Auth    `protobuf:\"bytes,4,opt,name=auth,proto3\" json:\"auth,omitempty\"`\n\tService *Service `protobuf:\"bytes,5,opt,name=service,proto3\" json:\"service,omitempty\"`\n}\n\nfunc (x *Bootstrap) Reset() {\n\t*x = Bootstrap{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Bootstrap) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Bootstrap) ProtoMessage() {}\n\nfunc (x *Bootstrap) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Bootstrap.ProtoReflect.Descriptor instead.\nfunc (*Bootstrap) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Bootstrap) GetServer() *Server {\n\tif x != nil {\n\t\treturn x.Server\n\t}\n\treturn nil\n}\n\nfunc (x *Bootstrap) GetData() *Data {\n\tif x != nil {\n\t\treturn x.Data\n\t}\n\treturn nil\n}\n\nfunc (x *Bootstrap) GetTrace() *Trace {\n\tif x != nil {\n\t\treturn x.Trace\n\t}\n\treturn nil\n}\n\nfunc (x *Bootstrap) GetAuth() *Auth {\n\tif x != nil {\n\t\treturn x.Auth\n\t}\n\treturn nil\n}\n\nfunc (x *Bootstrap) GetService() *Service {\n\tif x != nil {\n\t\treturn x.Service\n\t}\n\treturn nil\n}\n\ntype Server struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tHttp *Server_HTTP `protobuf:\"bytes,1,opt,name=http,proto3\" json:\"http,omitempty\"`\n}\n\nfunc (x *Server) Reset() {\n\t*x = Server{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Server) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Server) ProtoMessage() {}\n\nfunc (x *Server) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Server.ProtoReflect.Descriptor instead.\nfunc (*Server) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Server) GetHttp() *Server_HTTP {\n\tif x != nil {\n\t\treturn x.Http\n\t}\n\treturn nil\n}\n\ntype Data struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tDatabase *Data_Database `protobuf:\"bytes,1,opt,name=database,proto3\" json:\"database,omitempty\"`\n\tRedis    *Data_Redis    `protobuf:\"bytes,2,opt,name=redis,proto3\" json:\"redis,omitempty\"`\n}\n\nfunc (x *Data) Reset() {\n\t*x = Data{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Data) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Data) ProtoMessage() {}\n\nfunc (x *Data) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Data.ProtoReflect.Descriptor instead.\nfunc (*Data) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *Data) GetDatabase() *Data_Database {\n\tif x != nil {\n\t\treturn x.Database\n\t}\n\treturn nil\n}\n\nfunc (x *Data) GetRedis() *Data_Redis {\n\tif x != nil {\n\t\treturn x.Redis\n\t}\n\treturn nil\n}\n\ntype Service struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUser  *Service_User  `protobuf:\"bytes,1,opt,name=user,proto3\" json:\"user,omitempty\"`\n\tGoods *Service_Goods `protobuf:\"bytes,2,opt,name=goods,proto3\" json:\"goods,omitempty\"`\n}\n\nfunc (x *Service) Reset() {\n\t*x = Service{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Service) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Service) ProtoMessage() {}\n\nfunc (x *Service) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Service.ProtoReflect.Descriptor instead.\nfunc (*Service) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *Service) GetUser() *Service_User {\n\tif x != nil {\n\t\treturn x.User\n\t}\n\treturn nil\n}\n\nfunc (x *Service) GetGoods() *Service_Goods {\n\tif x != nil {\n\t\treturn x.Goods\n\t}\n\treturn nil\n}\n\ntype Trace struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEndpoint string `protobuf:\"bytes,1,opt,name=endpoint,proto3\" json:\"endpoint,omitempty\"`\n}\n\nfunc (x *Trace) Reset() {\n\t*x = Trace{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Trace) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Trace) ProtoMessage() {}\n\nfunc (x *Trace) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Trace.ProtoReflect.Descriptor instead.\nfunc (*Trace) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *Trace) GetEndpoint() string {\n\tif x != nil {\n\t\treturn x.Endpoint\n\t}\n\treturn \"\"\n}\n\ntype Registry struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tConsul *Registry_Consul `protobuf:\"bytes,1,opt,name=consul,proto3\" json:\"consul,omitempty\"`\n}\n\nfunc (x *Registry) Reset() {\n\t*x = Registry{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Registry) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Registry) ProtoMessage() {}\n\nfunc (x *Registry) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Registry.ProtoReflect.Descriptor instead.\nfunc (*Registry) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *Registry) GetConsul() *Registry_Consul {\n\tif x != nil {\n\t\treturn x.Consul\n\t}\n\treturn nil\n}\n\ntype Auth struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tJwtKey string `protobuf:\"bytes,1,opt,name=jwt_key,json=jwtKey,proto3\" json:\"jwt_key,omitempty\"`\n}\n\nfunc (x *Auth) Reset() {\n\t*x = Auth{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Auth) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Auth) ProtoMessage() {}\n\nfunc (x *Auth) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Auth.ProtoReflect.Descriptor instead.\nfunc (*Auth) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *Auth) GetJwtKey() string {\n\tif x != nil {\n\t\treturn x.JwtKey\n\t}\n\treturn \"\"\n}\n\ntype Server_HTTP struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tNetwork string               `protobuf:\"bytes,1,opt,name=network,proto3\" json:\"network,omitempty\"`\n\tAddr    string               `protobuf:\"bytes,2,opt,name=addr,proto3\" json:\"addr,omitempty\"`\n\tTimeout *durationpb.Duration `protobuf:\"bytes,3,opt,name=timeout,proto3\" json:\"timeout,omitempty\"`\n}\n\nfunc (x *Server_HTTP) Reset() {\n\t*x = Server_HTTP{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Server_HTTP) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Server_HTTP) ProtoMessage() {}\n\nfunc (x *Server_HTTP) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Server_HTTP.ProtoReflect.Descriptor instead.\nfunc (*Server_HTTP) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{1, 0}\n}\n\nfunc (x *Server_HTTP) GetNetwork() string {\n\tif x != nil {\n\t\treturn x.Network\n\t}\n\treturn \"\"\n}\n\nfunc (x *Server_HTTP) GetAddr() string {\n\tif x != nil {\n\t\treturn x.Addr\n\t}\n\treturn \"\"\n}\n\nfunc (x *Server_HTTP) GetTimeout() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.Timeout\n\t}\n\treturn nil\n}\n\ntype Data_Database struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tDriver string `protobuf:\"bytes,1,opt,name=driver,proto3\" json:\"driver,omitempty\"`\n\tSource string `protobuf:\"bytes,2,opt,name=source,proto3\" json:\"source,omitempty\"`\n}\n\nfunc (x *Data_Database) Reset() {\n\t*x = Data_Database{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[8]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Data_Database) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Data_Database) ProtoMessage() {}\n\nfunc (x *Data_Database) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[8]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Data_Database.ProtoReflect.Descriptor instead.\nfunc (*Data_Database) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{2, 0}\n}\n\nfunc (x *Data_Database) GetDriver() string {\n\tif x != nil {\n\t\treturn x.Driver\n\t}\n\treturn \"\"\n}\n\nfunc (x *Data_Database) GetSource() string {\n\tif x != nil {\n\t\treturn x.Source\n\t}\n\treturn \"\"\n}\n\ntype Data_Redis struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tNetwork      string               `protobuf:\"bytes,1,opt,name=network,proto3\" json:\"network,omitempty\"`\n\tAddr         string               `protobuf:\"bytes,2,opt,name=addr,proto3\" json:\"addr,omitempty\"`\n\tReadTimeout  *durationpb.Duration `protobuf:\"bytes,3,opt,name=read_timeout,json=readTimeout,proto3\" json:\"read_timeout,omitempty\"`\n\tWriteTimeout *durationpb.Duration `protobuf:\"bytes,4,opt,name=write_timeout,json=writeTimeout,proto3\" json:\"write_timeout,omitempty\"`\n}\n\nfunc (x *Data_Redis) Reset() {\n\t*x = Data_Redis{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[9]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Data_Redis) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Data_Redis) ProtoMessage() {}\n\nfunc (x *Data_Redis) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[9]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Data_Redis.ProtoReflect.Descriptor instead.\nfunc (*Data_Redis) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{2, 1}\n}\n\nfunc (x *Data_Redis) GetNetwork() string {\n\tif x != nil {\n\t\treturn x.Network\n\t}\n\treturn \"\"\n}\n\nfunc (x *Data_Redis) GetAddr() string {\n\tif x != nil {\n\t\treturn x.Addr\n\t}\n\treturn \"\"\n}\n\nfunc (x *Data_Redis) GetReadTimeout() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.ReadTimeout\n\t}\n\treturn nil\n}\n\nfunc (x *Data_Redis) GetWriteTimeout() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.WriteTimeout\n\t}\n\treturn nil\n}\n\ntype Service_User struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEndpoint string `protobuf:\"bytes,1,opt,name=endpoint,proto3\" json:\"endpoint,omitempty\"`\n}\n\nfunc (x *Service_User) Reset() {\n\t*x = Service_User{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[10]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Service_User) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Service_User) ProtoMessage() {}\n\nfunc (x *Service_User) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[10]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Service_User.ProtoReflect.Descriptor instead.\nfunc (*Service_User) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{3, 0}\n}\n\nfunc (x *Service_User) GetEndpoint() string {\n\tif x != nil {\n\t\treturn x.Endpoint\n\t}\n\treturn \"\"\n}\n\ntype Service_Goods struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEndpoint string `protobuf:\"bytes,1,opt,name=endpoint,proto3\" json:\"endpoint,omitempty\"`\n}\n\nfunc (x *Service_Goods) Reset() {\n\t*x = Service_Goods{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[11]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Service_Goods) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Service_Goods) ProtoMessage() {}\n\nfunc (x *Service_Goods) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[11]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Service_Goods.ProtoReflect.Descriptor instead.\nfunc (*Service_Goods) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{3, 1}\n}\n\nfunc (x *Service_Goods) GetEndpoint() string {\n\tif x != nil {\n\t\treturn x.Endpoint\n\t}\n\treturn \"\"\n}\n\ntype Registry_Consul struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tAddress string `protobuf:\"bytes,1,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tScheme  string `protobuf:\"bytes,2,opt,name=scheme,proto3\" json:\"scheme,omitempty\"`\n}\n\nfunc (x *Registry_Consul) Reset() {\n\t*x = Registry_Consul{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[12]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Registry_Consul) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Registry_Consul) ProtoMessage() {}\n\nfunc (x *Registry_Consul) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[12]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Registry_Consul.ProtoReflect.Descriptor instead.\nfunc (*Registry_Consul) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{5, 0}\n}\n\nfunc (x *Registry_Consul) GetAddress() string {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn \"\"\n}\n\nfunc (x *Registry_Consul) GetScheme() string {\n\tif x != nil {\n\t\treturn x.Scheme\n\t}\n\treturn \"\"\n}\n\nvar File_internal_conf_conf_proto protoreflect.FileDescriptor\n\nvar file_internal_conf_conf_proto_rawDesc = []byte{\n\t0x0a, 0x18, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x2f,\n\t0x63, 0x6f, 0x6e, 0x66, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x09, 0x61, 0x64, 0x6d, 0x69,\n\t0x6e, 0x2e, 0x61, 0x70, 0x69, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd6, 0x01, 0x0a, 0x09, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74,\n\t0x72, 0x61, 0x70, 0x12, 0x29, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e,\n\t0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x23,\n\t0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61,\n\t0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x64,\n\t0x61, 0x74, 0x61, 0x12, 0x26, 0x0a, 0x05, 0x74, 0x72, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x54,\n\t0x72, 0x61, 0x63, 0x65, 0x52, 0x05, 0x74, 0x72, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x04, 0x61,\n\t0x75, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x64, 0x6d, 0x69,\n\t0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x52, 0x04, 0x61, 0x75, 0x74, 0x68,\n\t0x12, 0x2c, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x12, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65,\n\t0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x9f,\n\t0x01, 0x0a, 0x06, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x04, 0x68, 0x74, 0x74,\n\t0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e,\n\t0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x52,\n\t0x04, 0x68, 0x74, 0x74, 0x70, 0x1a, 0x69, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x12, 0x18, 0x0a,\n\t0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,\n\t0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x33, 0x0a, 0x07, 0x74,\n\t0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44,\n\t0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74,\n\t0x22, 0xdb, 0x02, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x34, 0x0a, 0x08, 0x64, 0x61, 0x74,\n\t0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x64,\n\t0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x61, 0x74,\n\t0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12,\n\t0x2b, 0x0a, 0x05, 0x72, 0x65, 0x64, 0x69, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15,\n\t0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x2e,\n\t0x52, 0x65, 0x64, 0x69, 0x73, 0x52, 0x05, 0x72, 0x65, 0x64, 0x69, 0x73, 0x1a, 0x3a, 0x0a, 0x08,\n\t0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x72, 0x69, 0x76,\n\t0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72,\n\t0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0xb3, 0x01, 0x0a, 0x05, 0x52, 0x65, 0x64,\n\t0x69, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04,\n\t0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72,\n\t0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x52, 0x0b, 0x72, 0x65, 0x61, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x3e,\n\t0x0a, 0x0d, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18,\n\t0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x52, 0x0c, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0xaf,\n\t0x01, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x75, 0x73,\n\t0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e,\n\t0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x55, 0x73, 0x65,\n\t0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x2e, 0x0a, 0x05, 0x67, 0x6f, 0x6f, 0x64, 0x73,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61,\n\t0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x47, 0x6f, 0x6f, 0x64, 0x73,\n\t0x52, 0x05, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x1a, 0x22, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12,\n\t0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x1a, 0x23, 0x0a, 0x05, 0x47,\n\t0x6f, 0x6f, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74,\n\t0x22, 0x23, 0x0a, 0x05, 0x54, 0x72, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64,\n\t0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64,\n\t0x70, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0x7a, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72,\n\t0x79, 0x12, 0x32, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65,\n\t0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x52, 0x06, 0x63,\n\t0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x1a, 0x3a, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x12,\n\t0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68,\n\t0x65, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d,\n\t0x65, 0x22, 0x1f, 0x0a, 0x04, 0x41, 0x75, 0x74, 0x68, 0x12, 0x17, 0x0a, 0x07, 0x6a, 0x77, 0x74,\n\t0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6a, 0x77, 0x74, 0x4b,\n\t0x65, 0x79, 0x42, 0x1a, 0x5a, 0x18, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2f, 0x69, 0x6e, 0x74, 0x65,\n\t0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x3b, 0x63, 0x6f, 0x6e, 0x66, 0x62, 0x06,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_internal_conf_conf_proto_rawDescOnce sync.Once\n\tfile_internal_conf_conf_proto_rawDescData = file_internal_conf_conf_proto_rawDesc\n)\n\nfunc file_internal_conf_conf_proto_rawDescGZIP() []byte {\n\tfile_internal_conf_conf_proto_rawDescOnce.Do(func() {\n\t\tfile_internal_conf_conf_proto_rawDescData = protoimpl.X.CompressGZIP(file_internal_conf_conf_proto_rawDescData)\n\t})\n\treturn file_internal_conf_conf_proto_rawDescData\n}\n\nvar file_internal_conf_conf_proto_msgTypes = make([]protoimpl.MessageInfo, 13)\nvar file_internal_conf_conf_proto_goTypes = []interface{}{\n\t(*Bootstrap)(nil),           // 0: admin.api.Bootstrap\n\t(*Server)(nil),              // 1: admin.api.Server\n\t(*Data)(nil),                // 2: admin.api.Data\n\t(*Service)(nil),             // 3: admin.api.Service\n\t(*Trace)(nil),               // 4: admin.api.Trace\n\t(*Registry)(nil),            // 5: admin.api.Registry\n\t(*Auth)(nil),                // 6: admin.api.Auth\n\t(*Server_HTTP)(nil),         // 7: admin.api.Server.HTTP\n\t(*Data_Database)(nil),       // 8: admin.api.Data.Database\n\t(*Data_Redis)(nil),          // 9: admin.api.Data.Redis\n\t(*Service_User)(nil),        // 10: admin.api.Service.User\n\t(*Service_Goods)(nil),       // 11: admin.api.Service.Goods\n\t(*Registry_Consul)(nil),     // 12: admin.api.Registry.Consul\n\t(*durationpb.Duration)(nil), // 13: google.protobuf.Duration\n}\nvar file_internal_conf_conf_proto_depIdxs = []int32{\n\t1,  // 0: admin.api.Bootstrap.s:type_name -> admin.api.Server\n\t2,  // 1: admin.api.Bootstrap.data:type_name -> admin.api.Data\n\t4,  // 2: admin.api.Bootstrap.trace:type_name -> admin.api.Trace\n\t6,  // 3: admin.api.Bootstrap.auth:type_name -> admin.api.Auth\n\t3,  // 4: admin.api.Bootstrap.service:type_name -> admin.api.Service\n\t7,  // 5: admin.api.Server.http:type_name -> admin.api.Server.HTTP\n\t8,  // 6: admin.api.Data.database:type_name -> admin.api.Data.Database\n\t9,  // 7: admin.api.Data.redis:type_name -> admin.api.Data.Redis\n\t10, // 8: admin.api.Service.user:type_name -> admin.api.Service.User\n\t11, // 9: admin.api.Service.goods:type_name -> admin.api.Service.Goods\n\t12, // 10: admin.api.Registry.consul:type_name -> admin.api.Registry.Consul\n\t13, // 11: admin.api.Server.HTTP.timeout:type_name -> google.protobuf.Duration\n\t13, // 12: admin.api.Data.Redis.read_timeout:type_name -> google.protobuf.Duration\n\t13, // 13: admin.api.Data.Redis.write_timeout:type_name -> google.protobuf.Duration\n\t14, // [14:14] is the sub-list for method output_type\n\t14, // [14:14] is the sub-list for method input_type\n\t14, // [14:14] is the sub-list for extension type_name\n\t14, // [14:14] is the sub-list for extension extendee\n\t0,  // [0:14] is the sub-list for field type_name\n}\n\nfunc init() { file_internal_conf_conf_proto_init() }\nfunc file_internal_conf_conf_proto_init() {\n\tif File_internal_conf_conf_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_internal_conf_conf_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Bootstrap); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Server); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Data); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Service); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Trace); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Registry); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Auth); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Server_HTTP); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Data_Database); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Data_Redis); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Service_User); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Service_Goods); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Registry_Consul); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_internal_conf_conf_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   13,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_internal_conf_conf_proto_goTypes,\n\t\tDependencyIndexes: file_internal_conf_conf_proto_depIdxs,\n\t\tMessageInfos:      file_internal_conf_conf_proto_msgTypes,\n\t}.Build()\n\tFile_internal_conf_conf_proto = out.File\n\tfile_internal_conf_conf_proto_rawDesc = nil\n\tfile_internal_conf_conf_proto_goTypes = nil\n\tfile_internal_conf_conf_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "admin/internal/conf/conf.proto",
    "content": "syntax = \"proto3\";\npackage admin.api;\n\noption go_package = \"admin/internal/conf;conf\";\n\nimport \"google/protobuf/duration.proto\";\n\nmessage Bootstrap {\n  Server server = 1;\n  Data data = 2;\n  Trace trace = 3;\n  Auth auth = 4;\n  Service service = 5;\n}\n\nmessage Server {\n  message HTTP {\n    string network = 1;\n    string addr = 2;\n    google.protobuf.Duration timeout = 3;\n  }\n  HTTP http = 1;\n}\n\nmessage Data {\n  message Database {\n    string driver = 1;\n    string source = 2;\n  }\n  message Redis {\n    string network = 1;\n    string addr = 2;\n    google.protobuf.Duration read_timeout = 3;\n    google.protobuf.Duration write_timeout = 4;\n  }\n  Database database = 1;\n  Redis redis = 2;\n}\n\nmessage Service {\n  message User {\n    string endpoint = 1;\n  }\n  message Goods {\n    string endpoint = 1;\n  }\n  User user = 1;\n  Goods goods = 2;\n}\n\nmessage Trace {\n  string endpoint = 1;\n}\n\n\nmessage Registry {\n  message Consul {\n    string address = 1;\n    string scheme = 2;\n  }\n  Consul consul = 1;\n}\n\nmessage Auth {\n  string jwt_key = 1;\n}\n"
  },
  {
    "path": "admin/internal/data/README.md",
    "content": "# Data\n"
  },
  {
    "path": "admin/internal/data/address.go",
    "content": "package data\n\nimport (\n\t\"context\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\taddressService \"admin/api/service/user/v1\"\n\t\"admin/internal/biz\"\n)\n\ntype addressRepo struct {\n\tdata *Data\n\tlog  *log.Helper\n}\n\nfunc NewAddressRepo(data *Data, logger log.Logger) biz.AddressRepo {\n\treturn &addressRepo{\n\t\tdata: data,\n\t\tlog:  log.NewHelper(log.With(logger, \"module\", \"repo/address\")),\n\t}\n}\n\nfunc (a *addressRepo) CreateAddress(c context.Context, address *biz.Address) (*biz.Address, error) {\n\tcreateAddress, err := a.data.uc.CreateAddress(c, &addressService.CreateAddressReq{\n\t\tUid:       address.UserID,\n\t\tName:      address.Name,\n\t\tMobile:    address.Mobile,\n\t\tProvince:  address.Province,\n\t\tCity:      address.City,\n\t\tDistricts: address.Districts,\n\t\tAddress:   address.Address,\n\t\tPostCode:  address.PostCode,\n\t\tIsDefault: int32(address.IsDefault),\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tres := &biz.Address{\n\t\tID:        createAddress.Id,\n\t\tIsDefault: createAddress.IsDefault,\n\t\tMobile:    createAddress.Mobile,\n\t\tName:      createAddress.Name,\n\t\tProvince:  createAddress.Province,\n\t\tCity:      createAddress.City,\n\t\tDistricts: createAddress.Districts,\n\t\tAddress:   createAddress.Address,\n\t\tPostCode:  createAddress.PostCode,\n\t}\n\treturn res, nil\n}\n\nfunc (a *addressRepo) DeleteAddress(ctx context.Context, address *biz.Address) error {\n\t_, err := a.data.uc.DeleteAddress(ctx, &addressService.AddressReq{\n\t\tId:  address.ID,\n\t\tUid: address.UserID,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (a *addressRepo) DefaultAddress(ctx context.Context, address *biz.Address) error {\n\t_, err := a.data.uc.DefaultAddress(ctx, &addressService.AddressReq{\n\t\tId:  address.ID,\n\t\tUid: address.UserID,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (a *addressRepo) UpdateAddress(c context.Context, address *biz.Address) error {\n\t_, err := a.data.uc.UpdateAddress(c, &addressService.UpdateAddressReq{\n\t\tId:        address.ID,\n\t\tUid:       address.UserID,\n\t\tName:      address.Name,\n\t\tMobile:    address.Mobile,\n\t\tProvince:  address.Province,\n\t\tCity:      address.City,\n\t\tDistricts: address.Districts,\n\t\tAddress:   address.Address,\n\t\tPostCode:  address.PostCode,\n\t\tIsDefault: int32(address.IsDefault),\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (a *addressRepo) AddressListByUid(ctx context.Context, uid int64) ([]*biz.Address, error) {\n\taddressList, err := a.data.uc.ListAddress(ctx, &addressService.ListAddressReq{\n\t\tUid: uid,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvar res []*biz.Address\n\tfor _, v := range addressList.Results {\n\t\taddressTmp := &biz.Address{\n\t\t\tID:        v.Id,\n\t\t\tUserID:    uid,\n\t\t\tIsDefault: v.IsDefault,\n\t\t\tMobile:    v.Mobile,\n\t\t\tName:      v.Name,\n\t\t\tProvince:  v.Province,\n\t\t\tCity:      v.City,\n\t\t\tDistricts: v.Districts,\n\t\t\tAddress:   v.Address,\n\t\t\tPostCode:  v.PostCode,\n\t\t}\n\t\tres = append(res, addressTmp)\n\t}\n\treturn res, nil\n}\n"
  },
  {
    "path": "admin/internal/data/data.go",
    "content": "package data\n\nimport (\n\tuserV1 \"admin/api/service/user/v1\"\n\t\"admin/internal/conf\"\n\t\"context\"\n\tconsul \"github.com/go-kratos/kratos/contrib/registry/consul/v2\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"github.com/go-kratos/kratos/v2/middleware/recovery\"\n\t\"github.com/go-kratos/kratos/v2/middleware/tracing\"\n\t\"github.com/go-kratos/kratos/v2/registry\"\n\t\"github.com/go-kratos/kratos/v2/transport/grpc\"\n\t\"github.com/google/wire\"\n\tconsulAPI \"github.com/hashicorp/consul/api\"\n\tgrpcx \"google.golang.org/grpc\"\n\t\"time\"\n)\n\n// ProviderSet is data providers.\nvar ProviderSet = wire.NewSet(NewData, NewUserRepo, NewAddressRepo, NewUserServiceClient, NewRegistrar, NewDiscovery)\n\n// Data .\ntype Data struct {\n\tlog *log.Helper\n\tuc  userV1.UserClient\n}\n\n// NewData .\nfunc NewData(c *conf.Data, uc userV1.UserClient, logger log.Logger) (*Data, error) {\n\tl := log.NewHelper(log.With(logger, \"module\", \"data\"))\n\treturn &Data{log: l, uc: uc}, nil\n}\n\n// NewUserServiceClient 链接用户服务 grpc\nfunc NewUserServiceClient(ac *conf.Auth, sr *conf.Service, rr registry.Discovery) userV1.UserClient {\n\tconn, err := grpc.DialInsecure(\n\t\tcontext.Background(),\n\t\tgrpc.WithEndpoint(sr.User.Endpoint),\n\t\tgrpc.WithDiscovery(rr),\n\t\tgrpc.WithMiddleware(\n\t\t\ttracing.Client(),\n\t\t\trecovery.Recovery(),\n\t\t),\n\t\tgrpc.WithTimeout(2*time.Second),\n\t\tgrpc.WithOptions(grpcx.WithStatsHandler(&tracing.ClientHandler{})),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tc := userV1.NewUserClient(conn)\n\treturn c\n}\n\n// NewRegistrar add consul\nfunc NewRegistrar(conf *conf.Registry) registry.Registrar {\n\tc := consulAPI.DefaultConfig()\n\tc.Address = conf.Consul.Address\n\tc.Scheme = conf.Consul.Scheme\n\tcli, err := consulAPI.NewClient(c)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tr := consul.New(cli, consul.WithHealthCheck(false))\n\treturn r\n}\n\nfunc NewDiscovery(conf *conf.Registry) registry.Discovery {\n\tc := consulAPI.DefaultConfig()\n\tc.Address = conf.Consul.Address\n\tc.Scheme = conf.Consul.Scheme\n\tcli, err := consulAPI.NewClient(c)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tr := consul.New(cli, consul.WithHealthCheck(false))\n\treturn r\n}\n"
  },
  {
    "path": "admin/internal/data/user.go",
    "content": "package data\n\nimport (\n\t\"context\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\tuserService \"admin/api/service/user/v1\"\n\t\"admin/internal/biz\"\n)\n\ntype userRepo struct {\n\tdata *Data\n\tlog  *log.Helper\n}\n\n// NewUserRepo .\nfunc NewUserRepo(data *Data, logger log.Logger) biz.UserRepo {\n\treturn &userRepo{\n\t\tdata: data,\n\t\tlog:  log.NewHelper(log.With(logger, \"module\", \"repo/user\")),\n\t}\n}\n\nfunc (u *userRepo) CreateUser(c context.Context, user *biz.User) (*biz.User, error) {\n\tcreateUser, err := u.data.uc.CreateUser(c, &userService.CreateUserInfo{\n\t\tNickName: user.NickName,\n\t\tPassword: user.Password,\n\t\tMobile:   user.Mobile,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &biz.User{\n\t\tID:       createUser.Id,\n\t\tMobile:   createUser.Mobile,\n\t\tNickName: createUser.NickName,\n\t}, nil\n}\n\nfunc (u *userRepo) UserByMobile(c context.Context, mobile string) (*biz.User, error) {\n\tbyMobile, err := u.data.uc.GetUserByMobile(c, &userService.MobileRequest{Mobile: mobile})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &biz.User{\n\t\tMobile:   byMobile.Mobile,\n\t\tID:       byMobile.Id,\n\t\tPassword: byMobile.Password,\n\t\tNickName: byMobile.NickName,\n\t}, nil\n}\n\nfunc (u *userRepo) CheckPassword(c context.Context, password, encryptedPassword string) (bool, error) {\n\tif byMobile, err := u.data.uc.CheckPassword(c, &userService.PasswordCheckInfo{Password: password, EncryptedPassword: encryptedPassword}); err != nil {\n\t\treturn false, err\n\t} else {\n\t\treturn byMobile.Success, nil\n\t}\n}\n\nfunc (u *userRepo) UserById(c context.Context, id int64) (*biz.User, error) {\n\tuser, err := u.data.uc.GetUserById(c, &userService.IdRequest{Id: id})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &biz.User{\n\t\tID:       user.Id,\n\t\tMobile:   user.Mobile,\n\t\tNickName: user.NickName,\n\t\tGender:   user.Gender,\n\t\tRole:     int(user.Role),\n\t\tBirthday: int64(user.Birthday),\n\t}, nil\n}\n"
  },
  {
    "path": "admin/internal/pkg/captcha/captcha.go",
    "content": "package captcha\n\nimport (\n\t\"context\"\n\t\"github.com/mojocn/base64Captcha\"\n)\n\nvar Store = base64Captcha.DefaultMemStore\n\ntype CaptchaInfo struct {\n\tCaptchaId string\n\tPicPath   string\n}\n\n// GetCaptcha 生成验证码\nfunc GetCaptcha(ctx context.Context) (*CaptchaInfo, error) {\n\tdriver := base64Captcha.NewDriverDigit(80, 250, 5, 0.7, 80)\n\tcp := base64Captcha.NewCaptcha(driver, Store)\n\tid, b64s, err := cp.Generate()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &CaptchaInfo{\n\t\tCaptchaId: id,\n\t\tPicPath:   b64s,\n\t}, nil\n}\n"
  },
  {
    "path": "admin/internal/pkg/middleware/auth/auth.go",
    "content": "package auth\n\nimport (\n\t\"errors\"\n\t\"github.com/golang-jwt/jwt/v4\"\n)\n\ntype CustomClaims struct {\n\tID          int64\n\tNickName    string\n\tAuthorityId int\n\tjwt.StandardClaims\n}\n\n// CreateToken generate token\nfunc CreateToken(c CustomClaims, key string) (string, error) {\n\tclaims := jwt.NewWithClaims(jwt.SigningMethodHS256, c)\n\tsignedString, err := claims.SignedString([]byte(key))\n\tif err != nil {\n\t\treturn \"\", errors.New(\"generate token failed\" + err.Error())\n\t}\n\treturn signedString, nil\n}\n"
  },
  {
    "path": "admin/internal/server/http.go",
    "content": "package server\n\nimport (\n\tv1 \"admin/api/admin/v1\"\n\t\"admin/internal/conf\"\n\t\"admin/internal/service\"\n\t\"context\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"github.com/go-kratos/kratos/v2/middleware/auth/jwt\"\n\t\"github.com/go-kratos/kratos/v2/middleware/logging\"\n\t\"github.com/go-kratos/kratos/v2/middleware/recovery\"\n\t\"github.com/go-kratos/kratos/v2/middleware/selector\"\n\t\"github.com/go-kratos/kratos/v2/middleware/tracing\"\n\t\"github.com/go-kratos/kratos/v2/middleware/validate\"\n\t\"github.com/go-kratos/kratos/v2/transport/http\"\n\tjwt2 \"github.com/golang-jwt/jwt/v4\"\n\t\"github.com/gorilla/handlers\"\n)\n\n// NewHTTPServer new an HTTP s.\nfunc NewHTTPServer(c *conf.Server, ac *conf.Auth, s *service.AdminService, logger log.Logger) *http.Server {\n\tvar opts = []http.ServerOption{\n\t\thttp.Middleware(\n\t\t\trecovery.Recovery(),\n\t\t\tvalidate.Validator(),\n\t\t\ttracing.Server(),\n\t\t\tselector.Server(\n\t\t\t\tjwt.Server(func(token *jwt2.Token) (interface{}, error) {\n\t\t\t\t\treturn []byte(ac.JwtKey), nil\n\t\t\t\t}, jwt.WithSigningMethod(jwt2.SigningMethodHS256)),\n\t\t\t).Match(NewWhiteListMatcher()).Build(),\n\t\t\tlogging.Server(logger),\n\t\t),\n\t\thttp.Filter(handlers.CORS(\n\t\t\thandlers.AllowedHeaders([]string{\"X-Requested-With\", \"Content-Type\", \"Authorization\"}),\n\t\t\thandlers.AllowedMethods([]string{\"GET\", \"POST\", \"PUT\", \"HEAD\", \"OPTIONS\"}),\n\t\t\thandlers.AllowedOrigins([]string{\"*\"}),\n\t\t)),\n\t}\n\tif c.Http.Network != \"\" {\n\t\topts = append(opts, http.Network(c.Http.Network))\n\t}\n\tif c.Http.Addr != \"\" {\n\t\topts = append(opts, http.Address(c.Http.Addr))\n\t}\n\tif c.Http.Timeout != nil {\n\t\topts = append(opts, http.Timeout(c.Http.Timeout.AsDuration()))\n\t}\n\tsrv := http.NewServer(opts...)\n\tv1.RegisterAdminHTTPServer(srv, s)\n\treturn srv\n}\n\n// NewWhiteListMatcher 白名单不需要token验证的接口\nfunc NewWhiteListMatcher() selector.MatchFunc {\n\twhiteList := make(map[string]struct{})\n\twhiteList[\"/admin.admin.v1.admin/Captcha\"] = struct{}{}\n\twhiteList[\"/admin.admin.v1.admin/Login\"] = struct{}{}\n\twhiteList[\"/admin.admin.v1.admin/Register\"] = struct{}{}\n\treturn func(ctx context.Context, operation string) bool {\n\t\tif _, ok := whiteList[operation]; ok {\n\t\t\treturn false\n\t\t}\n\t\treturn true\n\t}\n}\n"
  },
  {
    "path": "admin/internal/server/server.go",
    "content": "package server\n\nimport (\n\t\"github.com/google/wire\"\n)\n\n// ProviderSet is s providers.\nvar ProviderSet = wire.NewSet(NewHTTPServer)\n"
  },
  {
    "path": "admin/internal/service/README.md",
    "content": "# Service\n"
  },
  {
    "path": "admin/internal/service/service.go",
    "content": "package service\n\nimport (\n\tv1 \"admin/api/admin/v1\"\n\t\"admin/internal/biz\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"github.com/google/wire\"\n)\n\n// ProviderSet is service providers.\nvar ProviderSet = wire.NewSet(NewAdminService)\n\n// AdminService is a admin service.\ntype AdminService struct {\n\tv1.UnimplementedAdminServer\n\n\tuc  *biz.UserUsecase\n\tua  *biz.AddressUsecase\n\tlog *log.Helper\n}\n\n// NewAdminService new a admin service.\nfunc NewAdminService(uc *biz.UserUsecase, ua *biz.AddressUsecase, logger log.Logger) *AdminService {\n\treturn &AdminService{\n\t\tuc:  uc,\n\t\tua:  ua,\n\t\tlog: log.NewHelper(log.With(logger, \"module\", \"service/admin\")),\n\t}\n}\n"
  },
  {
    "path": "admin/internal/service/user.go",
    "content": "package service\n\nimport (\n\t\"admin/internal/biz\"\n\t\"context\"\n\t\"go.opentelemetry.io/otel\"\n\t\"google.golang.org/protobuf/types/known/emptypb\"\n\n\tv1 \"admin/api/admin/v1\"\n)\n\nfunc (s *AdminService) Register(ctx context.Context, req *v1.RegisterReq) (*v1.RegisterReply, error) {\n\t//  add trace\n\ttr := otel.Tracer(\"service\")\n\tctx, span := tr.Start(ctx, \"get user info by mobile\")\n\tspan.SpanContext()\n\tdefer span.End()\n\n\treturn s.uc.CreateUser(ctx, req)\n}\n\nfunc (s *AdminService) Login(ctx context.Context, req *v1.LoginReq) (*v1.RegisterReply, error) {\n\treturn s.uc.PassWordLogin(ctx, req)\n}\n\nfunc (s *AdminService) Captcha(ctx context.Context, r *emptypb.Empty) (*v1.CaptchaReply, error) {\n\treturn s.uc.GetCaptcha(ctx)\n}\n\nfunc (s *AdminService) Detail(ctx context.Context, r *emptypb.Empty) (*v1.UserDetailResponse, error) {\n\treturn s.uc.UserDetailByID(ctx)\n}\n\nfunc (s *AdminService) CreateAddress(ctx context.Context, r *v1.CreateAddressReq) (*v1.AddressInfo, error) {\n\treturn s.ua.CreateAddress(ctx, r)\n}\n\nfunc (s *AdminService) AddressListByUid(ctx context.Context, empty *emptypb.Empty) (*v1.ListAddressReply, error) {\n\treturn s.ua.AddressListByUid(ctx)\n}\n\nfunc (s *AdminService) UpdateAddress(ctx context.Context, r *v1.UpdateAddressReq) (*v1.CheckResponse, error) {\n\treq := toBizAddress(r)\n\taddress, err := s.ua.UpdateAddress(ctx, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &v1.CheckResponse{Success: address}, nil\n}\n\nfunc toBizAddress(r *v1.UpdateAddressReq) *biz.Address {\n\treturn &biz.Address{\n\t\tID:        r.Id,\n\t\tIsDefault: r.IsDefault,\n\t\tMobile:    r.Mobile,\n\t\tName:      r.Name,\n\t\tProvince:  r.Province,\n\t\tCity:      r.City,\n\t\tDistricts: r.Districts,\n\t\tAddress:   r.Address,\n\t\tPostCode:  r.PostCode,\n\t}\n}\n\nfunc (s *AdminService) DefaultAddress(ctx context.Context, r *v1.AddressReq) (*v1.CheckResponse, error) {\n\n\taddress, err := s.ua.DefaultAddress(ctx, &biz.Address{\n\t\tID: r.Id,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &v1.CheckResponse{Success: address}, nil\n}\n\nfunc (s *AdminService) DeleteAddress(ctx context.Context, r *v1.AddressReq) (*v1.CheckResponse, error) {\n\taddress, err := s.ua.DeleteAddress(ctx, &biz.Address{\n\t\tID: r.Id,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &v1.CheckResponse{Success: address}, nil\n}\n"
  },
  {
    "path": "admin/openapi.yaml",
    "content": "# Generated with protoc-gen-openapi\n# https://github.com/google/gnostic/tree/master/apps/protoc-gen-openapi\n\nopenapi: 3.0.3\ninfo:\n    title: Admin API\n    description: The admin service definition.\n    version: 0.0.1\npaths:\n    /api/address/create:\n        post:\n            tags:\n                - Admin\n            operationId: Admin_CreateAddress\n            requestBody:\n                content:\n                    application/json:\n                        schema:\n                            $ref: '#/components/schemas/CreateAddressReq'\n                required: true\n            responses:\n                \"200\":\n                    description: OK\n                    content:\n                        application/json:\n                            schema:\n                                $ref: '#/components/schemas/AddressInfo'\n    /api/address/default:\n        put:\n            tags:\n                - Admin\n            operationId: Admin_DefaultAddress\n            requestBody:\n                content:\n                    application/json:\n                        schema:\n                            $ref: '#/components/schemas/AddressReq'\n                required: true\n            responses:\n                \"200\":\n                    description: OK\n                    content:\n                        application/json:\n                            schema:\n                                $ref: '#/components/schemas/CheckResponse'\n    /api/address/delete:\n        delete:\n            tags:\n                - Admin\n            operationId: Admin_DeleteAddress\n            parameters:\n                - name: id\n                  in: query\n                  schema:\n                    type: integer\n                    format: int64\n                - name: uid\n                  in: query\n                  schema:\n                    type: integer\n                    format: int64\n            responses:\n                \"200\":\n                    description: OK\n                    content:\n                        application/json:\n                            schema:\n                                $ref: '#/components/schemas/CheckResponse'\n    /api/address/list/uid:\n        get:\n            tags:\n                - Admin\n            operationId: Admin_AddressListByUid\n            responses:\n                \"200\":\n                    description: OK\n                    content:\n                        application/json:\n                            schema:\n                                $ref: '#/components/schemas/ListAddressReply'\n    /api/address/update:\n        put:\n            tags:\n                - Admin\n            operationId: Admin_UpdateAddress\n            requestBody:\n                content:\n                    application/json:\n                        schema:\n                            $ref: '#/components/schemas/UpdateAddressReq'\n                required: true\n            responses:\n                \"200\":\n                    description: OK\n                    content:\n                        application/json:\n                            schema:\n                                $ref: '#/components/schemas/CheckResponse'\n    /api/users/captcha:\n        get:\n            tags:\n                - Admin\n            operationId: Admin_Captcha\n            responses:\n                \"200\":\n                    description: OK\n                    content:\n                        application/json:\n                            schema:\n                                $ref: '#/components/schemas/CaptchaReply'\n    /api/users/detail:\n        get:\n            tags:\n                - Admin\n            operationId: Admin_Detail\n            responses:\n                \"200\":\n                    description: OK\n                    content:\n                        application/json:\n                            schema:\n                                $ref: '#/components/schemas/UserDetailResponse'\n    /api/users/login:\n        post:\n            tags:\n                - Admin\n            operationId: Admin_Login\n            requestBody:\n                content:\n                    application/json:\n                        schema:\n                            $ref: '#/components/schemas/LoginReq'\n                required: true\n            responses:\n                \"200\":\n                    description: OK\n                    content:\n                        application/json:\n                            schema:\n                                $ref: '#/components/schemas/RegisterReply'\n    /api/users/register:\n        post:\n            tags:\n                - Admin\n            operationId: Admin_Register\n            requestBody:\n                content:\n                    application/json:\n                        schema:\n                            $ref: '#/components/schemas/RegisterReq'\n                required: true\n            responses:\n                \"200\":\n                    description: OK\n                    content:\n                        application/json:\n                            schema:\n                                $ref: '#/components/schemas/RegisterReply'\ncomponents:\n    schemas:\n        AddressInfo:\n            type: object\n            properties:\n                id:\n                    type: integer\n                    format: int64\n                name:\n                    type: string\n                mobile:\n                    type: string\n                Province:\n                    type: string\n                City:\n                    type: string\n                Districts:\n                    type: string\n                address:\n                    type: string\n                postCode:\n                    type: string\n                isDefault:\n                    type: integer\n                    format: int32\n        AddressReq:\n            type: object\n            properties:\n                id:\n                    type: integer\n                    format: int64\n                uid:\n                    type: integer\n                    format: int64\n        CaptchaReply:\n            type: object\n            properties:\n                captchaId:\n                    type: string\n                picPath:\n                    type: string\n        CheckResponse:\n            type: object\n            properties:\n                success:\n                    type: boolean\n        CreateAddressReq:\n            type: object\n            properties:\n                uid:\n                    type: integer\n                    format: int64\n                name:\n                    type: string\n                mobile:\n                    type: string\n                Province:\n                    type: string\n                City:\n                    type: string\n                Districts:\n                    type: string\n                address:\n                    type: string\n                postCode:\n                    type: string\n                isDefault:\n                    type: integer\n                    format: int32\n        ListAddressReply:\n            type: object\n            properties:\n                results:\n                    type: array\n                    items:\n                        $ref: '#/components/schemas/AddressInfo'\n        LoginReq:\n            type: object\n            properties:\n                username:\n                    type: string\n                password:\n                    type: string\n        RegisterReply:\n            type: object\n            properties:\n                id:\n                    type: integer\n                    format: int64\n                mobile:\n                    type: string\n                username:\n                    type: string\n                token:\n                    type: string\n                expiredAt:\n                    type: integer\n                    format: int64\n            description: Data returned by registration and login\n        RegisterReq:\n            type: object\n            properties:\n                mobile:\n                    type: string\n                username:\n                    type: string\n                password:\n                    type: string\n        UpdateAddressReq:\n            type: object\n            properties:\n                uid:\n                    type: integer\n                    format: int64\n                name:\n                    type: string\n                mobile:\n                    type: string\n                Province:\n                    type: string\n                City:\n                    type: string\n                Districts:\n                    type: string\n                address:\n                    type: string\n                postCode:\n                    type: string\n                isDefault:\n                    type: integer\n                    format: int32\n                id:\n                    type: integer\n                    format: int64\n        UserDetailResponse:\n            type: object\n            properties:\n                id:\n                    type: integer\n                    format: int64\n                mobile:\n                    type: string\n                nickName:\n                    type: string\n                birthday:\n                    type: integer\n                    format: int64\n                gender:\n                    type: string\n                role:\n                    type: integer\n                    format: int32\n            description: user Detail returned\ntags:\n    - name: Admin\n"
  },
  {
    "path": "admin/third_party/README.md",
    "content": "# third_party\n"
  },
  {
    "path": "admin/third_party/errors/errors.proto",
    "content": "syntax = \"proto3\";\n\npackage errors;\n\noption go_package = \"github.com/go-kratos/kratos/v2/errors;errors\";\noption java_multiple_files = true;\noption java_package = \"com.github.kratos.errors\";\noption objc_class_prefix = \"KratosErrors\";\n\nimport \"google/protobuf/descriptor.proto\";\n\nextend google.protobuf.EnumOptions {\n  int32 default_code = 1108;\n}\n\nextend google.protobuf.EnumValueOptions {\n  int32 code = 1109;\n}"
  },
  {
    "path": "admin/third_party/google/api/annotations.proto",
    "content": "// Copyright (c) 2015, Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\npackage google.api;\n\nimport \"google/api/http.proto\";\nimport \"google/protobuf/descriptor.proto\";\n\noption go_package = \"google.golang.org/genproto/googleapis/api/annotations;annotations\";\noption java_multiple_files = true;\noption java_outer_classname = \"AnnotationsProto\";\noption java_package = \"com.google.api\";\noption objc_class_prefix = \"GAPI\";\n\nextend google.protobuf.MethodOptions {\n  // See `HttpRule`.\n  HttpRule http = 72295728;\n}\n"
  },
  {
    "path": "admin/third_party/google/api/client.proto",
    "content": "// Copyright 2019 Google LLC.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\npackage google.api;\n\nimport \"google/protobuf/descriptor.proto\";\n\noption go_package = \"google.golang.org/genproto/googleapis/api/annotations;annotations\";\noption java_multiple_files = true;\noption java_outer_classname = \"ClientProto\";\noption java_package = \"com.google.api\";\noption objc_class_prefix = \"GAPI\";\n\n\nextend google.protobuf.ServiceOptions {\n  // The hostname for this service.\n  // This should be specified with no prefix or protocol.\n  //\n  // Example:\n  //\n  //   service Foo {\n  //     option (google.api.default_host) = \"foo.googleapi.com\";\n  //     ...\n  //   }\n  string default_host = 1049;\n\n  // OAuth scopes needed for the client.\n  //\n  // Example:\n  //\n  //   service Foo {\n  //     option (google.api.oauth_scopes) = \\\n  //       \"https://www.googleapis.com/auth/cloud-platform\";\n  //     ...\n  //   }\n  //\n  // If there is more than one scope, use a comma-separated string:\n  //\n  // Example:\n  //\n  //   service Foo {\n  //     option (google.api.oauth_scopes) = \\\n  //       \"https://www.googleapis.com/auth/cloud-platform,\"\n  //       \"https://www.googleapis.com/auth/monitoring\";\n  //     ...\n  //   }\n  string oauth_scopes = 1050;\n}\n\n\nextend google.protobuf.MethodOptions {\n  // A definition of a client library method signature.\n  //\n  // In client libraries, each proto RPC corresponds to one or more methods\n  // which the end user is able to call, and calls the underlying RPC.\n  // Normally, this method receives a single argument (a struct or instance\n  // corresponding to the RPC request object). Defining this field will\n  // add one or more overloads providing flattened or simpler method signatures\n  // in some languages.\n  //\n  // The fields on the method signature are provided as a comma-separated\n  // string.\n  //\n  // For example, the proto RPC and annotation:\n  //\n  //   rpc CreateSubscription(CreateSubscriptionRequest)\n  //       returns (Subscription) {\n  //     option (google.api.method_signature) = \"name,topic\";\n  //   }\n  //\n  // Would add the following Java overload (in addition to the method accepting\n  // the request object):\n  //\n  //   public final Subscription createSubscription(String name, String topic)\n  //\n  // The following backwards-compatibility guidelines apply:\n  //\n  //   * Adding this annotation to an unannotated method is backwards\n  //     compatible.\n  //   * Adding this annotation to a method which already has existing\n  //     method signature annotations is backwards compatible if and only if\n  //     the new method signature annotation is last in the sequence.\n  //   * Modifying or removing an existing method signature annotation is\n  //     a breaking change.\n  //   * Re-ordering existing method signature annotations is a breaking\n  //     change.\n  repeated string method_signature = 1051;\n}"
  },
  {
    "path": "admin/third_party/google/api/field_behavior.proto",
    "content": "// Copyright 2019 Google LLC.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\npackage google.api;\n\nimport \"google/protobuf/descriptor.proto\";\n\noption go_package = \"google.golang.org/genproto/googleapis/api/annotations;annotations\";\noption java_multiple_files = true;\noption java_outer_classname = \"FieldBehaviorProto\";\noption java_package = \"com.google.api\";\noption objc_class_prefix = \"GAPI\";\n\n\n// An indicator of the behavior of a given field (for example, that a field\n// is required in requests, or given as output but ignored as input).\n// This **does not** change the behavior in protocol buffers itself; it only\n// denotes the behavior and may affect how API tooling handles the field.\n//\n// Note: This enum **may** receive new values in the future.\nenum FieldBehavior {\n  // Conventional default for enums. Do not use this.\n  FIELD_BEHAVIOR_UNSPECIFIED = 0;\n\n  // Specifically denotes a field as optional.\n  // While all fields in protocol buffers are optional, this may be specified\n  // for emphasis if appropriate.\n  OPTIONAL = 1;\n\n  // Denotes a field as required.\n  // This indicates that the field **must** be provided as part of the request,\n  // and failure to do so will cause an error (usually `INVALID_ARGUMENT`).\n  REQUIRED = 2;\n\n  // Denotes a field as output only.\n  // This indicates that the field is provided in responses, but including the\n  // field in a request does nothing (the server *must* ignore it and\n  // *must not* throw an error as a result of the field's presence).\n  OUTPUT_ONLY = 3;\n\n  // Denotes a field as input only.\n  // This indicates that the field is provided in requests, and the\n  // corresponding field is not included in output.\n  INPUT_ONLY = 4;\n\n  // Denotes a field as immutable.\n  // This indicates that the field may be set once in a request to create a\n  // resource, but may not be changed thereafter.\n  IMMUTABLE = 5;\n}\n\n\nextend google.protobuf.FieldOptions {\n  // A designation of a specific field behavior (required, output only, etc.)\n  // in protobuf messages.\n  //\n  // Examples:\n  //\n  //   string name = 1 [(google.api.field_behavior) = REQUIRED];\n  //   State state = 1 [(google.api.field_behavior) = OUTPUT_ONLY];\n  //   google.protobuf.Duration ttl = 1\n  //     [(google.api.field_behavior) = INPUT_ONLY];\n  //   google.protobuf.Timestamp expire_time = 1\n  //     [(google.api.field_behavior) = OUTPUT_ONLY,\n  //      (google.api.field_behavior) = IMMUTABLE];\n  repeated FieldBehavior field_behavior = 1052;\n}"
  },
  {
    "path": "admin/third_party/google/api/http.proto",
    "content": "// Copyright 2020 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\npackage google.api;\n\noption cc_enable_arenas = true;\noption go_package = \"google.golang.org/genproto/googleapis/api/annotations;annotations\";\noption java_multiple_files = true;\noption java_outer_classname = \"HttpProto\";\noption java_package = \"com.google.api\";\noption objc_class_prefix = \"GAPI\";\n\n// Defines the HTTP configuration for an API service. It contains a list of\n// [HttpRule][google.api.HttpRule], each specifying the mapping of an RPC method\n// to one or more HTTP REST API methods.\nmessage Http {\n  // A list of HTTP configuration rules that apply to individual API methods.\n  //\n  // **NOTE:** All service configuration rules follow \"last one wins\" order.\n  repeated HttpRule rules = 1;\n\n  // When set to true, URL path parameters will be fully URI-decoded except in\n  // cases of single segment matches in reserved expansion, where \"%2F\" will be\n  // left encoded.\n  //\n  // The default behavior is to not decode RFC 6570 reserved characters in multi\n  // segment matches.\n  bool fully_decode_reserved_expansion = 2;\n}\n\n// # gRPC Transcoding\n//\n// gRPC Transcoding is a feature for mapping between a gRPC method and one or\n// more HTTP REST endpoints. It allows developers to build a single API service\n// that supports both gRPC APIs and REST APIs. Many systems, including [Google\n// APIs](https://github.com/googleapis/googleapis),\n// [Cloud Endpoints](https://cloud.google.com/endpoints), [gRPC\n// Gateway](https://github.com/grpc-ecosystem/grpc-gateway),\n// and [Envoy](https://github.com/envoyproxy/envoy) proxy support this feature\n// and use it for large scale production services.\n//\n// `HttpRule` defines the schema of the gRPC/REST mapping. The mapping specifies\n// how different portions of the gRPC request message are mapped to the URL\n// path, URL query parameters, and HTTP request body. It also controls how the\n// gRPC response message is mapped to the HTTP response body. `HttpRule` is\n// typically specified as an `google.api.http` annotation on the gRPC method.\n//\n// Each mapping specifies a URL path template and an HTTP method. The path\n// template may refer to one or more fields in the gRPC request message, as long\n// as each field is a non-repeated field with a primitive (non-message) type.\n// The path template controls how fields of the request message are mapped to\n// the URL path.\n//\n// Example:\n//\n//     service Messaging {\n//       rpc GetMessage(GetMessageRequest) returns (Message) {\n//         option (google.api.http) = {\n//             get: \"/v1/{name=messages/*}\"\n//         };\n//       }\n//     }\n//     message GetMessageRequest {\n//       string name = 1; // Mapped to URL path.\n//     }\n//     message Message {\n//       string text = 1; // The resource content.\n//     }\n//\n// This enables an HTTP REST to gRPC mapping as below:\n//\n// HTTP | gRPC\n// -----|-----\n// `GET /v1/messages/123456`  | `GetMessage(name: \"messages/123456\")`\n//\n// Any fields in the request message which are not bound by the path template\n// automatically become HTTP query parameters if there is no HTTP request body.\n// For example:\n//\n//     service Messaging {\n//       rpc GetMessage(GetMessageRequest) returns (Message) {\n//         option (google.api.http) = {\n//             get:\"/v1/messages/{message_id}\"\n//         };\n//       }\n//     }\n//     message GetMessageRequest {\n//       message SubMessage {\n//         string subfield = 1;\n//       }\n//       string message_id = 1; // Mapped to URL path.\n//       int64 revision = 2;    // Mapped to URL query parameter `revision`.\n//       SubMessage sub = 3;    // Mapped to URL query parameter `sub.subfield`.\n//     }\n//\n// This enables a HTTP JSON to RPC mapping as below:\n//\n// HTTP | gRPC\n// -----|-----\n// `GET /v1/messages/123456?revision=2&sub.subfield=foo` |\n// `GetMessage(message_id: \"123456\" revision: 2 sub: SubMessage(subfield:\n// \"foo\"))`\n//\n// Note that fields which are mapped to URL query parameters must have a\n// primitive type or a repeated primitive type or a non-repeated message type.\n// In the case of a repeated type, the parameter can be repeated in the URL\n// as `...?param=A&param=B`. In the case of a message type, each field of the\n// message is mapped to a separate parameter, such as\n// `...?foo.a=A&foo.b=B&foo.c=C`.\n//\n// For HTTP methods that allow a request body, the `body` field\n// specifies the mapping. Consider a REST update method on the\n// message resource collection:\n//\n//     service Messaging {\n//       rpc UpdateMessage(UpdateMessageRequest) returns (Message) {\n//         option (google.api.http) = {\n//           patch: \"/v1/messages/{message_id}\"\n//           body: \"message\"\n//         };\n//       }\n//     }\n//     message UpdateMessageRequest {\n//       string message_id = 1; // mapped to the URL\n//       Message message = 2;   // mapped to the body\n//     }\n//\n// The following HTTP JSON to RPC mapping is enabled, where the\n// representation of the JSON in the request body is determined by\n// protos JSON encoding:\n//\n// HTTP | gRPC\n// -----|-----\n// `PATCH /v1/messages/123456 { \"text\": \"Hi!\" }` | `UpdateMessage(message_id:\n// \"123456\" message { text: \"Hi!\" })`\n//\n// The special name `*` can be used in the body mapping to define that\n// every field not bound by the path template should be mapped to the\n// request body.  This enables the following alternative definition of\n// the update method:\n//\n//     service Messaging {\n//       rpc UpdateMessage(Message) returns (Message) {\n//         option (google.api.http) = {\n//           patch: \"/v1/messages/{message_id}\"\n//           body: \"*\"\n//         };\n//       }\n//     }\n//     message Message {\n//       string message_id = 1;\n//       string text = 2;\n//     }\n//\n//\n// The following HTTP JSON to RPC mapping is enabled:\n//\n// HTTP | gRPC\n// -----|-----\n// `PATCH /v1/messages/123456 { \"text\": \"Hi!\" }` | `UpdateMessage(message_id:\n// \"123456\" text: \"Hi!\")`\n//\n// Note that when using `*` in the body mapping, it is not possible to\n// have HTTP parameters, as all fields not bound by the path end in\n// the body. This makes this option more rarely used in practice when\n// defining REST APIs. The common usage of `*` is in custom methods\n// which don't use the URL at all for transferring data.\n//\n// It is possible to define multiple HTTP methods for one RPC by using\n// the `additional_bindings` option. Example:\n//\n//     service Messaging {\n//       rpc GetMessage(GetMessageRequest) returns (Message) {\n//         option (google.api.http) = {\n//           get: \"/v1/messages/{message_id}\"\n//           additional_bindings {\n//             get: \"/v1/users/{user_id}/messages/{message_id}\"\n//           }\n//         };\n//       }\n//     }\n//     message GetMessageRequest {\n//       string message_id = 1;\n//       string user_id = 2;\n//     }\n//\n// This enables the following two alternative HTTP JSON to RPC mappings:\n//\n// HTTP | gRPC\n// -----|-----\n// `GET /v1/messages/123456` | `GetMessage(message_id: \"123456\")`\n// `GET /v1/users/me/messages/123456` | `GetMessage(user_id: \"me\" message_id:\n// \"123456\")`\n//\n// ## Rules for HTTP mapping\n//\n// 1. Leaf request fields (recursive expansion nested messages in the request\n//    message) are classified into three categories:\n//    - Fields referred by the path template. They are passed via the URL path.\n//    - Fields referred by the [HttpRule.body][google.api.HttpRule.body]. They are passed via the HTTP\n//      request body.\n//    - All other fields are passed via the URL query parameters, and the\n//      parameter name is the field path in the request message. A repeated\n//      field can be represented as multiple query parameters under the same\n//      name.\n//  2. If [HttpRule.body][google.api.HttpRule.body] is \"*\", there is no URL query parameter, all fields\n//     are passed via URL path and HTTP request body.\n//  3. If [HttpRule.body][google.api.HttpRule.body] is omitted, there is no HTTP request body, all\n//     fields are passed via URL path and URL query parameters.\n//\n// ### Path template syntax\n//\n//     Template = \"/\" Segments [ Verb ] ;\n//     Segments = Segment { \"/\" Segment } ;\n//     Segment  = \"*\" | \"**\" | LITERAL | Variable ;\n//     Variable = \"{\" FieldPath [ \"=\" Segments ] \"}\" ;\n//     FieldPath = IDENT { \".\" IDENT } ;\n//     Verb     = \":\" LITERAL ;\n//\n// The syntax `*` matches a single URL path segment. The syntax `**` matches\n// zero or more URL path segments, which must be the last part of the URL path\n// except the `Verb`.\n//\n// The syntax `Variable` matches part of the URL path as specified by its\n// template. A variable template must not contain other variables. If a variable\n// matches a single path segment, its template may be omitted, e.g. `{var}`\n// is equivalent to `{var=*}`.\n//\n// The syntax `LITERAL` matches literal text in the URL path. If the `LITERAL`\n// contains any reserved character, such characters should be percent-encoded\n// before the matching.\n//\n// If a variable contains exactly one path segment, such as `\"{var}\"` or\n// `\"{var=*}\"`, when such a variable is expanded into a URL path on the client\n// side, all characters except `[-_.~0-9a-zA-Z]` are percent-encoded. The\n// server side does the reverse decoding. Such variables show up in the\n// [Discovery\n// Document](https://developers.google.com/discovery/v1/reference/apis) as\n// `{var}`.\n//\n// If a variable contains multiple path segments, such as `\"{var=foo/*}\"`\n// or `\"{var=**}\"`, when such a variable is expanded into a URL path on the\n// client side, all characters except `[-_.~/0-9a-zA-Z]` are percent-encoded.\n// The server side does the reverse decoding, except \"%2F\" and \"%2f\" are left\n// unchanged. Such variables show up in the\n// [Discovery\n// Document](https://developers.google.com/discovery/v1/reference/apis) as\n// `{+var}`.\n//\n// ## Using gRPC API Service Configuration\n//\n// gRPC API Service Configuration (service config) is a configuration language\n// for configuring a gRPC service to become a user-facing product. The\n// service config is simply the YAML representation of the `google.api.Service`\n// proto message.\n//\n// As an alternative to annotating your proto file, you can configure gRPC\n// transcoding in your service config YAML files. You do this by specifying a\n// `HttpRule` that maps the gRPC method to a REST endpoint, achieving the same\n// effect as the proto annotation. This can be particularly useful if you\n// have a proto that is reused in multiple services. Note that any transcoding\n// specified in the service config will override any matching transcoding\n// configuration in the proto.\n//\n// Example:\n//\n//     http:\n//       rules:\n//         # Selects a gRPC method and applies HttpRule to it.\n//         - selector: example.v1.Messaging.GetMessage\n//           get: /v1/messages/{message_id}/{sub.subfield}\n//\n// ## Special notes\n//\n// When gRPC Transcoding is used to map a gRPC to JSON REST endpoints, the\n// proto to JSON conversion must follow the [proto3\n// specification](https://developers.google.com/protocol-buffers/docs/proto3#json).\n//\n// While the single segment variable follows the semantics of\n// [RFC 6570](https://tools.ietf.org/html/rfc6570) Section 3.2.2 Simple String\n// Expansion, the multi segment variable **does not** follow RFC 6570 Section\n// 3.2.3 Reserved Expansion. The reason is that the Reserved Expansion\n// does not expand special characters like `?` and `#`, which would lead\n// to invalid URLs. As the result, gRPC Transcoding uses a custom encoding\n// for multi segment variables.\n//\n// The path variables **must not** refer to any repeated or mapped field,\n// because client libraries are not capable of handling such variable expansion.\n//\n// The path variables **must not** capture the leading \"/\" character. The reason\n// is that the most common use case \"{var}\" does not capture the leading \"/\"\n// character. For consistency, all path variables must share the same behavior.\n//\n// Repeated message fields must not be mapped to URL query parameters, because\n// no client library can support such complicated mapping.\n//\n// If an API needs to use a JSON array for request or response body, it can map\n// the request or response body to a repeated field. However, some gRPC\n// Transcoding implementations may not support this feature.\nmessage HttpRule {\n  // Selects a method to which this rule applies.\n  //\n  // Refer to [selector][google.api.DocumentationRule.selector] for syntax details.\n  string selector = 1;\n\n  // Determines the URL pattern is matched by this rules. This pattern can be\n  // used with any of the {get|put|post|delete|patch} methods. A custom method\n  // can be defined using the 'custom' field.\n  oneof pattern {\n    // Maps to HTTP GET. Used for listing and getting information about\n    // resources.\n    string get = 2;\n\n    // Maps to HTTP PUT. Used for replacing a resource.\n    string put = 3;\n\n    // Maps to HTTP POST. Used for creating a resource or performing an action.\n    string post = 4;\n\n    // Maps to HTTP DELETE. Used for deleting a resource.\n    string delete = 5;\n\n    // Maps to HTTP PATCH. Used for updating a resource.\n    string patch = 6;\n\n    // The custom pattern is used for specifying an HTTP method that is not\n    // included in the `pattern` field, such as HEAD, or \"*\" to leave the\n    // HTTP method unspecified for this rule. The wild-card rule is useful\n    // for services that provide content to Web (HTML) clients.\n    CustomHttpPattern custom = 8;\n  }\n\n  // The name of the request field whose value is mapped to the HTTP request\n  // body, or `*` for mapping all request fields not captured by the path\n  // pattern to the HTTP body, or omitted for not having any HTTP request body.\n  //\n  // NOTE: the referred field must be present at the top-level of the request\n  // message type.\n  string body = 7;\n\n  // Optional. The name of the response field whose value is mapped to the HTTP\n  // response body. When omitted, the entire response message will be used\n  // as the HTTP response body.\n  //\n  // NOTE: The referred field must be present at the top-level of the response\n  // message type.\n  string response_body = 12;\n\n  // Additional HTTP bindings for the selector. Nested bindings must\n  // not contain an `additional_bindings` field themselves (that is,\n  // the nesting may only be one level deep).\n  repeated HttpRule additional_bindings = 11;\n}\n\n// A custom pattern is used for defining custom HTTP verb.\nmessage CustomHttpPattern {\n  // The name of this custom HTTP verb.\n  string kind = 1;\n\n  // The path matched by this custom verb.\n  string path = 2;\n}\n"
  },
  {
    "path": "admin/third_party/google/api/httpbody.proto",
    "content": "// Copyright 2020 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\npackage google.api;\n\nimport \"google/protobuf/any.proto\";\n\noption cc_enable_arenas = true;\noption go_package = \"google.golang.org/genproto/googleapis/api/httpbody;httpbody\";\noption java_multiple_files = true;\noption java_outer_classname = \"HttpBodyProto\";\noption java_package = \"com.google.api\";\noption objc_class_prefix = \"GAPI\";\n\n// Message that represents an arbitrary HTTP body. It should only be used for\n// payload formats that can't be represented as JSON, such as raw binary or\n// an HTML page.\n//\n//\n// This message can be used both in streaming and non-streaming API methods in\n// the request as well as the response.\n//\n// It can be used as a top-level request field, which is convenient if one\n// wants to extract parameters from either the URL or HTTP template into the\n// request fields and also want access to the raw HTTP body.\n//\n// Example:\n//\n//     message GetResourceRequest {\n//       // A unique request id.\n//       string request_id = 1;\n//\n//       // The raw HTTP body is bound to this field.\n//       google.api.HttpBody http_body = 2;\n//     }\n//\n//     service ResourceService {\n//       rpc GetResource(GetResourceRequest) returns (google.api.HttpBody);\n//       rpc UpdateResource(google.api.HttpBody) returns\n//       (google.protobuf.Empty);\n//     }\n//\n// Example with streaming methods:\n//\n//     service CaldavService {\n//       rpc GetCalendar(stream google.api.HttpBody)\n//         returns (stream google.api.HttpBody);\n//       rpc UpdateCalendar(stream google.api.HttpBody)\n//         returns (stream google.api.HttpBody);\n//     }\n//\n// Use of this type only changes how the request and response bodies are\n// handled, all other features will continue to work unchanged.\nmessage HttpBody {\n  // The HTTP Content-Type header value specifying the content type of the body.\n  string content_type = 1;\n\n  // The HTTP request/response body as raw binary.\n  bytes data = 2;\n\n  // Application specific response metadata. Must be set in the first response\n  // for streaming APIs.\n  repeated google.protobuf.Any extensions = 3;\n}\n"
  },
  {
    "path": "admin/third_party/google/protobuf/descriptor.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// The messages in this file describe the definitions found in .proto files.\n// A valid .proto file can be translated directly to a FileDescriptorProto\n// without any other information (e.g. without reading its imports).\n\n\nsyntax = \"proto2\";\n\npackage google.protobuf;\n\noption go_package = \"google.golang.org/protobuf/types/descriptorpb\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"DescriptorProtos\";\noption csharp_namespace = \"Google.Protobuf.Reflection\";\noption objc_class_prefix = \"GPB\";\noption cc_enable_arenas = true;\n\n// descriptor.proto must be optimized for speed because reflection-based\n// algorithms don't work during bootstrapping.\noption optimize_for = SPEED;\n\n// The protocol compiler can output a FileDescriptorSet containing the .proto\n// files it parses.\nmessage FileDescriptorSet {\n  repeated FileDescriptorProto file = 1;\n}\n\n// Describes a complete .proto file.\nmessage FileDescriptorProto {\n  optional string name = 1;     // file name, relative to root of source tree\n  optional string package = 2;  // e.g. \"foo\", \"foo.bar\", etc.\n\n  // Names of files imported by this file.\n  repeated string dependency = 3;\n  // Indexes of the public imported files in the dependency list above.\n  repeated int32 public_dependency = 10;\n  // Indexes of the weak imported files in the dependency list.\n  // For Google-internal migration only. Do not use.\n  repeated int32 weak_dependency = 11;\n\n  // All top-level definitions in this file.\n  repeated DescriptorProto message_type = 4;\n  repeated EnumDescriptorProto enum_type = 5;\n  repeated ServiceDescriptorProto service = 6;\n  repeated FieldDescriptorProto extension = 7;\n\n  optional FileOptions options = 8;\n\n  // This field contains optional information about the original source code.\n  // You may safely remove this entire field without harming runtime\n  // functionality of the descriptors -- the information is needed only by\n  // development tools.\n  optional SourceCodeInfo source_code_info = 9;\n\n  // The syntax of the proto file.\n  // The supported values are \"proto2\" and \"proto3\".\n  optional string syntax = 12;\n}\n\n// Describes a message type.\nmessage DescriptorProto {\n  optional string name = 1;\n\n  repeated FieldDescriptorProto field = 2;\n  repeated FieldDescriptorProto extension = 6;\n\n  repeated DescriptorProto nested_type = 3;\n  repeated EnumDescriptorProto enum_type = 4;\n\n  message ExtensionRange {\n    optional int32 start = 1;  // Inclusive.\n    optional int32 end = 2;    // Exclusive.\n\n    optional ExtensionRangeOptions options = 3;\n  }\n  repeated ExtensionRange extension_range = 5;\n\n  repeated OneofDescriptorProto oneof_decl = 8;\n\n  optional MessageOptions options = 7;\n\n  // Range of reserved tag numbers. Reserved tag numbers may not be used by\n  // fields or extension ranges in the same message. Reserved ranges may\n  // not overlap.\n  message ReservedRange {\n    optional int32 start = 1;  // Inclusive.\n    optional int32 end = 2;    // Exclusive.\n  }\n  repeated ReservedRange reserved_range = 9;\n  // Reserved field names, which may not be used by fields in the same message.\n  // A given name may only be reserved once.\n  repeated string reserved_name = 10;\n}\n\nmessage ExtensionRangeOptions {\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\n// Describes a field within a message.\nmessage FieldDescriptorProto {\n  enum Type {\n    // 0 is reserved for errors.\n    // Order is weird for historical reasons.\n    TYPE_DOUBLE = 1;\n    TYPE_FLOAT = 2;\n    // Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT64 if\n    // negative values are likely.\n    TYPE_INT64 = 3;\n    TYPE_UINT64 = 4;\n    // Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT32 if\n    // negative values are likely.\n    TYPE_INT32 = 5;\n    TYPE_FIXED64 = 6;\n    TYPE_FIXED32 = 7;\n    TYPE_BOOL = 8;\n    TYPE_STRING = 9;\n    // Tag-delimited aggregate.\n    // Group type is deprecated and not supported in proto3. However, Proto3\n    // implementations should still be able to parse the group wire format and\n    // treat group fields as unknown fields.\n    TYPE_GROUP = 10;\n    TYPE_MESSAGE = 11;  // Length-delimited aggregate.\n\n    // New in version 2.\n    TYPE_BYTES = 12;\n    TYPE_UINT32 = 13;\n    TYPE_ENUM = 14;\n    TYPE_SFIXED32 = 15;\n    TYPE_SFIXED64 = 16;\n    TYPE_SINT32 = 17;  // Uses ZigZag encoding.\n    TYPE_SINT64 = 18;  // Uses ZigZag encoding.\n  }\n\n  enum Label {\n    // 0 is reserved for errors\n    LABEL_OPTIONAL = 1;\n    LABEL_REQUIRED = 2;\n    LABEL_REPEATED = 3;\n  }\n\n  optional string name = 1;\n  optional int32 number = 3;\n  optional Label label = 4;\n\n  // If type_name is set, this need not be set.  If both this and type_name\n  // are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP.\n  optional Type type = 5;\n\n  // For message and enum types, this is the name of the type.  If the name\n  // starts with a '.', it is fully-qualified.  Otherwise, C++-like scoping\n  // rules are used to find the type (i.e. first the nested types within this\n  // message are searched, then within the parent, on up to the root\n  // namespace).\n  optional string type_name = 6;\n\n  // For extensions, this is the name of the type being extended.  It is\n  // resolved in the same manner as type_name.\n  optional string extendee = 2;\n\n  // For numeric types, contains the original text representation of the value.\n  // For booleans, \"true\" or \"false\".\n  // For strings, contains the default text contents (not escaped in any way).\n  // For bytes, contains the C escaped value.  All bytes >= 128 are escaped.\n  // TODO(kenton):  Base-64 encode?\n  optional string default_value = 7;\n\n  // If set, gives the index of a oneof in the containing type's oneof_decl\n  // list.  This field is a member of that oneof.\n  optional int32 oneof_index = 9;\n\n  // JSON name of this field. The value is set by protocol compiler. If the\n  // user has set a \"json_name\" option on this field, that option's value\n  // will be used. Otherwise, it's deduced from the field's name by converting\n  // it to camelCase.\n  optional string json_name = 10;\n\n  optional FieldOptions options = 8;\n\n  // If true, this is a proto3 \"optional\". When a proto3 field is optional, it\n  // tracks presence regardless of field type.\n  //\n  // When proto3_optional is true, this field must be belong to a oneof to\n  // signal to old proto3 clients that presence is tracked for this field. This\n  // oneof is known as a \"synthetic\" oneof, and this field must be its sole\n  // member (each proto3 optional field gets its own synthetic oneof). Synthetic\n  // oneofs exist in the descriptor only, and do not generate any API. Synthetic\n  // oneofs must be ordered after all \"real\" oneofs.\n  //\n  // For message fields, proto3_optional doesn't create any semantic change,\n  // since non-repeated message fields always track presence. However it still\n  // indicates the semantic detail of whether the user wrote \"optional\" or not.\n  // This can be useful for round-tripping the .proto file. For consistency we\n  // give message fields a synthetic oneof also, even though it is not required\n  // to track presence. This is especially important because the parser can't\n  // tell if a field is a message or an enum, so it must always create a\n  // synthetic oneof.\n  //\n  // Proto2 optional fields do not set this flag, because they already indicate\n  // optional with `LABEL_OPTIONAL`.\n  optional bool proto3_optional = 17;\n}\n\n// Describes a oneof.\nmessage OneofDescriptorProto {\n  optional string name = 1;\n  optional OneofOptions options = 2;\n}\n\n// Describes an enum type.\nmessage EnumDescriptorProto {\n  optional string name = 1;\n\n  repeated EnumValueDescriptorProto value = 2;\n\n  optional EnumOptions options = 3;\n\n  // Range of reserved numeric values. Reserved values may not be used by\n  // entries in the same enum. Reserved ranges may not overlap.\n  //\n  // Note that this is distinct from DescriptorProto.ReservedRange in that it\n  // is inclusive such that it can appropriately represent the entire int32\n  // domain.\n  message EnumReservedRange {\n    optional int32 start = 1;  // Inclusive.\n    optional int32 end = 2;    // Inclusive.\n  }\n\n  // Range of reserved numeric values. Reserved numeric values may not be used\n  // by enum values in the same enum declaration. Reserved ranges may not\n  // overlap.\n  repeated EnumReservedRange reserved_range = 4;\n\n  // Reserved enum value names, which may not be reused. A given name may only\n  // be reserved once.\n  repeated string reserved_name = 5;\n}\n\n// Describes a value within an enum.\nmessage EnumValueDescriptorProto {\n  optional string name = 1;\n  optional int32 number = 2;\n\n  optional EnumValueOptions options = 3;\n}\n\n// Describes a service.\nmessage ServiceDescriptorProto {\n  optional string name = 1;\n  repeated MethodDescriptorProto method = 2;\n\n  optional ServiceOptions options = 3;\n}\n\n// Describes a method of a service.\nmessage MethodDescriptorProto {\n  optional string name = 1;\n\n  // Input and output type names.  These are resolved in the same way as\n  // FieldDescriptorProto.type_name, but must refer to a message type.\n  optional string input_type = 2;\n  optional string output_type = 3;\n\n  optional MethodOptions options = 4;\n\n  // Identifies if client streams multiple client messages\n  optional bool client_streaming = 5 [default = false];\n  // Identifies if server streams multiple server messages\n  optional bool server_streaming = 6 [default = false];\n}\n\n\n// ===================================================================\n// Options\n\n// Each of the definitions above may have \"options\" attached.  These are\n// just annotations which may cause code to be generated slightly differently\n// or may contain hints for code that manipulates protocol messages.\n//\n// Clients may define custom options as extensions of the *Options messages.\n// These extensions may not yet be known at parsing time, so the parser cannot\n// store the values in them.  Instead it stores them in a field in the *Options\n// message called uninterpreted_option. This field must have the same name\n// across all *Options messages. We then use this field to populate the\n// extensions when we build a descriptor, at which point all protos have been\n// parsed and so all extensions are known.\n//\n// Extension numbers for custom options may be chosen as follows:\n// * For options which will only be used within a single application or\n//   organization, or for experimental options, use field numbers 50000\n//   through 99999.  It is up to you to ensure that you do not use the\n//   same number for multiple options.\n// * For options which will be published and used publicly by multiple\n//   independent entities, e-mail protobuf-global-extension-registry@google.com\n//   to reserve extension numbers. Simply provide your project name (e.g.\n//   Objective-C plugin) and your project website (if available) -- there's no\n//   need to explain how you intend to use them. Usually you only need one\n//   extension number. You can declare multiple options with only one extension\n//   number by putting them in a sub-message. See the Custom Options section of\n//   the docs for examples:\n//   https://developers.google.com/protocol-buffers/docs/proto#options\n//   If this turns out to be popular, a web service will be set up\n//   to automatically assign option numbers.\n\nmessage FileOptions {\n\n  // Sets the Java package where classes generated from this .proto will be\n  // placed.  By default, the proto package is used, but this is often\n  // inappropriate because proto packages do not normally start with backwards\n  // domain names.\n  optional string java_package = 1;\n\n\n  // Controls the name of the wrapper Java class generated for the .proto file.\n  // That class will always contain the .proto file's getDescriptor() method as\n  // well as any top-level extensions defined in the .proto file.\n  // If java_multiple_files is disabled, then all the other classes from the\n  // .proto file will be nested inside the single wrapper outer class.\n  optional string java_outer_classname = 8;\n\n  // If enabled, then the Java code generator will generate a separate .java\n  // file for each top-level message, enum, and service defined in the .proto\n  // file.  Thus, these types will *not* be nested inside the wrapper class\n  // named by java_outer_classname.  However, the wrapper class will still be\n  // generated to contain the file's getDescriptor() method as well as any\n  // top-level extensions defined in the file.\n  optional bool java_multiple_files = 10 [default = false];\n\n  // This option does nothing.\n  optional bool java_generate_equals_and_hash = 20 [deprecated=true];\n\n  // If set true, then the Java2 code generator will generate code that\n  // throws an exception whenever an attempt is made to assign a non-UTF-8\n  // byte sequence to a string field.\n  // Message reflection will do the same.\n  // However, an extension field still accepts non-UTF-8 byte sequences.\n  // This option has no effect on when used with the lite runtime.\n  optional bool java_string_check_utf8 = 27 [default = false];\n\n\n  // Generated classes can be optimized for speed or code size.\n  enum OptimizeMode {\n    SPEED = 1;         // Generate complete code for parsing, serialization,\n    // etc.\n    CODE_SIZE = 2;     // Use ReflectionOps to implement these methods.\n    LITE_RUNTIME = 3;  // Generate code using MessageLite and the lite runtime.\n  }\n  optional OptimizeMode optimize_for = 9 [default = SPEED];\n\n  // Sets the Go package where structs generated from this .proto will be\n  // placed. If omitted, the Go package will be derived from the following:\n  //   - The basename of the package import path, if provided.\n  //   - Otherwise, the package statement in the .proto file, if present.\n  //   - Otherwise, the basename of the .proto file, without extension.\n  optional string go_package = 11;\n\n\n\n\n  // Should generic services be generated in each language?  \"Generic\" services\n  // are not specific to any particular RPC system.  They are generated by the\n  // main code generators in each language (without additional plugins).\n  // Generic services were the only kind of service generation supported by\n  // early versions of google.protobuf.\n  //\n  // Generic services are now considered deprecated in favor of using plugins\n  // that generate code specific to your particular RPC system.  Therefore,\n  // these default to false.  Old code which depends on generic services should\n  // explicitly set them to true.\n  optional bool cc_generic_services = 16 [default = false];\n  optional bool java_generic_services = 17 [default = false];\n  optional bool py_generic_services = 18 [default = false];\n  optional bool php_generic_services = 42 [default = false];\n\n  // Is this file deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for everything in the file, or it will be completely ignored; in the very\n  // least, this is a formalization for deprecating files.\n  optional bool deprecated = 23 [default = false];\n\n  // Enables the use of arenas for the proto messages in this file. This applies\n  // only to generated classes for C++.\n  optional bool cc_enable_arenas = 31 [default = true];\n\n\n  // Sets the objective c class prefix which is prepended to all objective c\n  // generated classes from this .proto. There is no default.\n  optional string objc_class_prefix = 36;\n\n  // Namespace for generated classes; defaults to the package.\n  optional string csharp_namespace = 37;\n\n  // By default Swift generators will take the proto package and CamelCase it\n  // replacing '.' with underscore and use that to prefix the types/symbols\n  // defined. When this options is provided, they will use this value instead\n  // to prefix the types/symbols defined.\n  optional string swift_prefix = 39;\n\n  // Sets the php class prefix which is prepended to all php generated classes\n  // from this .proto. Default is empty.\n  optional string php_class_prefix = 40;\n\n  // Use this option to change the namespace of php generated classes. Default\n  // is empty. When this option is empty, the package name will be used for\n  // determining the namespace.\n  optional string php_namespace = 41;\n\n  // Use this option to change the namespace of php generated metadata classes.\n  // Default is empty. When this option is empty, the proto file name will be\n  // used for determining the namespace.\n  optional string php_metadata_namespace = 44;\n\n  // Use this option to change the package of ruby generated classes. Default\n  // is empty. When this option is not set, the package name will be used for\n  // determining the ruby package.\n  optional string ruby_package = 45;\n\n\n  // The parser stores options it doesn't recognize here.\n  // See the documentation for the \"Options\" section above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message.\n  // See the documentation for the \"Options\" section above.\n  extensions 1000 to max;\n\n  reserved 38;\n}\n\nmessage MessageOptions {\n  // Set true to use the old proto1 MessageSet wire format for extensions.\n  // This is provided for backwards-compatibility with the MessageSet wire\n  // format.  You should not use this for any other reason:  It's less\n  // efficient, has fewer features, and is more complicated.\n  //\n  // The message must be defined exactly as follows:\n  //   message Foo {\n  //     option message_set_wire_format = true;\n  //     extensions 4 to max;\n  //   }\n  // Note that the message cannot have any defined fields; MessageSets only\n  // have extensions.\n  //\n  // All extensions of your type must be singular messages; e.g. they cannot\n  // be int32s, enums, or repeated messages.\n  //\n  // Because this is an option, the above two restrictions are not enforced by\n  // the protocol compiler.\n  optional bool message_set_wire_format = 1 [default = false];\n\n  // Disables the generation of the standard \"descriptor()\" accessor, which can\n  // conflict with a field of the same name.  This is meant to make migration\n  // from proto1 easier; new code should avoid fields named \"descriptor\".\n  optional bool no_standard_descriptor_accessor = 2 [default = false];\n\n  // Is this message deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for the message, or it will be completely ignored; in the very least,\n  // this is a formalization for deprecating messages.\n  optional bool deprecated = 3 [default = false];\n\n  reserved 4, 5, 6;\n\n  // Whether the message is an automatically generated map entry type for the\n  // maps field.\n  //\n  // For maps fields:\n  //     map<KeyType, ValueType> map_field = 1;\n  // The parsed descriptor looks like:\n  //     message MapFieldEntry {\n  //         option map_entry = true;\n  //         optional KeyType key = 1;\n  //         optional ValueType value = 2;\n  //     }\n  //     repeated MapFieldEntry map_field = 1;\n  //\n  // Implementations may choose not to generate the map_entry=true message, but\n  // use a native map in the target language to hold the keys and values.\n  // The reflection APIs in such implementations still need to work as\n  // if the field is a repeated message field.\n  //\n  // NOTE: Do not set the option in .proto files. Always use the maps syntax\n  // instead. The option should only be implicitly set by the proto compiler\n  // parser.\n  optional bool map_entry = 7;\n\n  reserved 8;  // javalite_serializable\n  reserved 9;  // javanano_as_lite\n\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\nmessage FieldOptions {\n  // The ctype option instructs the C++ code generator to use a different\n  // representation of the field than it normally would.  See the specific\n  // options below.  This option is not yet implemented in the open source\n  // release -- sorry, we'll try to include it in a future version!\n  optional CType ctype = 1 [default = STRING];\n  enum CType {\n    // Default mode.\n    STRING = 0;\n\n    CORD = 1;\n\n    STRING_PIECE = 2;\n  }\n  // The packed option can be enabled for repeated primitive fields to enable\n  // a more efficient representation on the wire. Rather than repeatedly\n  // writing the tag and type for each element, the entire array is encoded as\n  // a single length-delimited blob. In proto3, only explicit setting it to\n  // false will avoid using packed encoding.\n  optional bool packed = 2;\n\n  // The jstype option determines the JavaScript type used for values of the\n  // field.  The option is permitted only for 64 bit integral and fixed types\n  // (int64, uint64, sint64, fixed64, sfixed64).  A field with jstype JS_STRING\n  // is represented as JavaScript string, which avoids loss of precision that\n  // can happen when a large value is converted to a floating point JavaScript.\n  // Specifying JS_NUMBER for the jstype causes the generated JavaScript code to\n  // use the JavaScript \"number\" type.  The behavior of the default option\n  // JS_NORMAL is implementation dependent.\n  //\n  // This option is an enum to permit additional types to be added, e.g.\n  // goog.math.Integer.\n  optional JSType jstype = 6 [default = JS_NORMAL];\n  enum JSType {\n    // Use the default type.\n    JS_NORMAL = 0;\n\n    // Use JavaScript strings.\n    JS_STRING = 1;\n\n    // Use JavaScript numbers.\n    JS_NUMBER = 2;\n  }\n\n  // Should this field be parsed lazily?  Lazy applies only to message-type\n  // fields.  It means that when the outer message is initially parsed, the\n  // inner message's contents will not be parsed but instead stored in encoded\n  // form.  The inner message will actually be parsed when it is first accessed.\n  //\n  // This is only a hint.  Implementations are free to choose whether to use\n  // eager or lazy parsing regardless of the value of this option.  However,\n  // setting this option true suggests that the protocol author believes that\n  // using lazy parsing on this field is worth the additional bookkeeping\n  // overhead typically needed to implement it.\n  //\n  // This option does not affect the public interface of any generated code;\n  // all method signatures remain the same.  Furthermore, thread-safety of the\n  // interface is not affected by this option; const methods remain safe to\n  // call from multiple threads concurrently, while non-const methods continue\n  // to require exclusive access.\n  //\n  //\n  // Note that implementations may choose not to check required fields within\n  // a lazy sub-message.  That is, calling IsInitialized() on the outer message\n  // may return true even if the inner message has missing required fields.\n  // This is necessary because otherwise the inner message would have to be\n  // parsed in order to perform the check, defeating the purpose of lazy\n  // parsing.  An implementation which chooses not to check required fields\n  // must be consistent about it.  That is, for any particular sub-message, the\n  // implementation must either *always* check its required fields, or *never*\n  // check its required fields, regardless of whether or not the message has\n  // been parsed.\n  optional bool lazy = 5 [default = false];\n\n  // Is this field deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for accessors, or it will be completely ignored; in the very least, this\n  // is a formalization for deprecating fields.\n  optional bool deprecated = 3 [default = false];\n\n  // For Google-internal migration only. Do not use.\n  optional bool weak = 10 [default = false];\n\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n\n  reserved 4;  // removed jtype\n}\n\nmessage OneofOptions {\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\nmessage EnumOptions {\n\n  // Set this option to true to allow mapping different tag names to the same\n  // value.\n  optional bool allow_alias = 2;\n\n  // Is this enum deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for the enum, or it will be completely ignored; in the very least, this\n  // is a formalization for deprecating enums.\n  optional bool deprecated = 3 [default = false];\n\n  reserved 5;  // javanano_as_lite\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\nmessage EnumValueOptions {\n  // Is this enum value deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for the enum value, or it will be completely ignored; in the very least,\n  // this is a formalization for deprecating enum values.\n  optional bool deprecated = 1 [default = false];\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\nmessage ServiceOptions {\n\n  // Note:  Field numbers 1 through 32 are reserved for Google's internal RPC\n  //   framework.  We apologize for hoarding these numbers to ourselves, but\n  //   we were already using them long before we decided to release Protocol\n  //   Buffers.\n\n  // Is this service deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for the service, or it will be completely ignored; in the very least,\n  // this is a formalization for deprecating services.\n  optional bool deprecated = 33 [default = false];\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\nmessage MethodOptions {\n\n  // Note:  Field numbers 1 through 32 are reserved for Google's internal RPC\n  //   framework.  We apologize for hoarding these numbers to ourselves, but\n  //   we were already using them long before we decided to release Protocol\n  //   Buffers.\n\n  // Is this method deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for the method, or it will be completely ignored; in the very least,\n  // this is a formalization for deprecating methods.\n  optional bool deprecated = 33 [default = false];\n\n  // Is this method side-effect-free (or safe in HTTP parlance), or idempotent,\n  // or neither? HTTP based RPC implementation may choose GET verb for safe\n  // methods, and PUT verb for idempotent methods instead of the default POST.\n  enum IdempotencyLevel {\n    IDEMPOTENCY_UNKNOWN = 0;\n    NO_SIDE_EFFECTS = 1;  // implies idempotent\n    IDEMPOTENT = 2;       // idempotent, but may have side effects\n  }\n  optional IdempotencyLevel idempotency_level = 34\n  [default = IDEMPOTENCY_UNKNOWN];\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\n\n// A message representing a option the parser does not recognize. This only\n// appears in options protos created by the compiler::Parser class.\n// DescriptorPool resolves these when building Descriptor objects. Therefore,\n// options protos in descriptor objects (e.g. returned by Descriptor::options(),\n// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions\n// in them.\nmessage UninterpretedOption {\n  // The name of the uninterpreted option.  Each string represents a segment in\n  // a dot-separated name.  is_extension is true iff a segment represents an\n  // extension (denoted with parentheses in options specs in .proto files).\n  // E.g.,{ [\"foo\", false], [\"bar.baz\", true], [\"qux\", false] } represents\n  // \"foo.(bar.baz).qux\".\n  message NamePart {\n    required string name_part = 1;\n    required bool is_extension = 2;\n  }\n  repeated NamePart name = 2;\n\n  // The value of the uninterpreted option, in whatever type the tokenizer\n  // identified it as during parsing. Exactly one of these should be set.\n  optional string identifier_value = 3;\n  optional uint64 positive_int_value = 4;\n  optional int64 negative_int_value = 5;\n  optional double double_value = 6;\n  optional bytes string_value = 7;\n  optional string aggregate_value = 8;\n}\n\n// ===================================================================\n// Optional source code info\n\n// Encapsulates information about the original source file from which a\n// FileDescriptorProto was generated.\nmessage SourceCodeInfo {\n  // A Location identifies a piece of source code in a .proto file which\n  // corresponds to a particular definition.  This information is intended\n  // to be useful to IDEs, code indexers, documentation generators, and similar\n  // tools.\n  //\n  // For example, say we have a file like:\n  //   message Foo {\n  //     optional string foo = 1;\n  //   }\n  // Let's look at just the field definition:\n  //   optional string foo = 1;\n  //   ^       ^^     ^^  ^  ^^^\n  //   a       bc     de  f  ghi\n  // We have the following locations:\n  //   span   path               represents\n  //   [a,i)  [ 4, 0, 2, 0 ]     The whole field definition.\n  //   [a,b)  [ 4, 0, 2, 0, 4 ]  The label (optional).\n  //   [c,d)  [ 4, 0, 2, 0, 5 ]  The type (string).\n  //   [e,f)  [ 4, 0, 2, 0, 1 ]  The name (foo).\n  //   [g,h)  [ 4, 0, 2, 0, 3 ]  The number (1).\n  //\n  // Notes:\n  // - A location may refer to a repeated field itself (i.e. not to any\n  //   particular index within it).  This is used whenever a set of elements are\n  //   logically enclosed in a single code segment.  For example, an entire\n  //   extend block (possibly containing multiple extension definitions) will\n  //   have an outer location whose path refers to the \"extensions\" repeated\n  //   field without an index.\n  // - Multiple locations may have the same path.  This happens when a single\n  //   logical declaration is spread out across multiple places.  The most\n  //   obvious example is the \"extend\" block again -- there may be multiple\n  //   extend blocks in the same scope, each of which will have the same path.\n  // - A location's span is not always a subset of its parent's span.  For\n  //   example, the \"extendee\" of an extension declaration appears at the\n  //   beginning of the \"extend\" block and is shared by all extensions within\n  //   the block.\n  // - Just because a location's span is a subset of some other location's span\n  //   does not mean that it is a descendant.  For example, a \"group\" defines\n  //   both a type and a field in a single declaration.  Thus, the locations\n  //   corresponding to the type and field and their components will overlap.\n  // - Code which tries to interpret locations should probably be designed to\n  //   ignore those that it doesn't understand, as more types of locations could\n  //   be recorded in the future.\n  repeated Location location = 1;\n  message Location {\n    // Identifies which part of the FileDescriptorProto was defined at this\n    // location.\n    //\n    // Each element is a field number or an index.  They form a path from\n    // the root FileDescriptorProto to the place where the definition occurs.  For\n    // example, this path:\n    //   [ 4, 3, 2, 7, 1 ]\n    // refers to:\n    //   file.message_type(3)  // 4, 3\n    //       .field(7)         // 2, 7\n    //       .name()           // 1\n    // This is because FileDescriptorProto.message_type has field number 4:\n    //   repeated DescriptorProto message_type = 4;\n    // and DescriptorProto.field has field number 2:\n    //   repeated FieldDescriptorProto field = 2;\n    // and FieldDescriptorProto.name has field number 1:\n    //   optional string name = 1;\n    //\n    // Thus, the above path gives the location of a field name.  If we removed\n    // the last element:\n    //   [ 4, 3, 2, 7 ]\n    // this path refers to the whole field declaration (from the beginning\n    // of the label to the terminating semicolon).\n    repeated int32 path = 1 [packed = true];\n\n    // Always has exactly three or four elements: start line, start column,\n    // end line (optional, otherwise assumed same as start line), end column.\n    // These are packed into a single field for efficiency.  Note that line\n    // and column numbers are zero-based -- typically you will want to add\n    // 1 to each before displaying to a user.\n    repeated int32 span = 2 [packed = true];\n\n    // If this SourceCodeInfo represents a complete declaration, these are any\n    // comments appearing before and after the declaration which appear to be\n    // attached to the declaration.\n    //\n    // A series of line comments appearing on consecutive lines, with no other\n    // tokens appearing on those lines, will be treated as a single comment.\n    //\n    // leading_detached_comments will keep paragraphs of comments that appear\n    // before (but not connected to) the current element. Each paragraph,\n    // separated by empty lines, will be one comment element in the repeated\n    // field.\n    //\n    // Only the comment content is provided; comment markers (e.g. //) are\n    // stripped out.  For block comments, leading whitespace and an asterisk\n    // will be stripped from the beginning of each line other than the first.\n    // Newlines are included in the output.\n    //\n    // Examples:\n    //\n    //   optional int32 foo = 1;  // Comment attached to foo.\n    //   // Comment attached to bar.\n    //   optional int32 bar = 2;\n    //\n    //   optional string baz = 3;\n    //   // Comment attached to baz.\n    //   // Another line attached to baz.\n    //\n    //   // Comment attached to qux.\n    //   //\n    //   // Another line attached to qux.\n    //   optional double qux = 4;\n    //\n    //   // Detached comment for corge. This is not leading or trailing comments\n    //   // to qux or corge because there are blank lines separating it from\n    //   // both.\n    //\n    //   // Detached comment for corge paragraph 2.\n    //\n    //   optional string corge = 5;\n    //   /* Block comment attached\n    //    * to corge.  Leading asterisks\n    //    * will be removed. */\n    //   /* Block comment attached to\n    //    * grault. */\n    //   optional int32 grault = 6;\n    //\n    //   // ignored detached comments.\n    optional string leading_comments = 3;\n    optional string trailing_comments = 4;\n    repeated string leading_detached_comments = 6;\n  }\n}\n\n// Describes the relationship between generated code and its original source\n// file. A GeneratedCodeInfo message is associated with only one generated\n// source file, but may contain references to different source .proto files.\nmessage GeneratedCodeInfo {\n  // An Annotation connects some span of text in generated code to an element\n  // of its generating .proto file.\n  repeated Annotation annotation = 1;\n  message Annotation {\n    // Identifies the element in the original source .proto file. This field\n    // is formatted the same as SourceCodeInfo.Location.path.\n    repeated int32 path = 1 [packed = true];\n\n    // Identifies the filesystem path to the original source .proto.\n    optional string source_file = 2;\n\n    // Identifies the starting offset in bytes in the generated code\n    // that relates to the identified object.\n    optional int32 begin = 3;\n\n    // Identifies the ending offset in bytes in the generated code that\n    // relates to the identified offset. The end offset should be one past\n    // the last relevant byte (so the length of the text = end - begin).\n    optional int32 end = 4;\n  }\n}\n"
  },
  {
    "path": "admin/third_party/protoc-gen-openapiv2/options/annotations.proto",
    "content": "syntax = \"proto3\";\n\npackage grpc.gateway.protoc_gen_openapiv2.options;\n\noption go_package = \"github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options\";\n\nimport \"google/protobuf/descriptor.proto\";\nimport \"protoc-gen-openapiv2/options/openapiv2.proto\";\n\nextend google.protobuf.FileOptions {\n  // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project.\n  //\n  // All IDs are the same, as assigned. It is okay that they are the same, as they extend\n  // different descriptor messages.\n  Swagger openapiv2_swagger = 1042;\n}\nextend google.protobuf.MethodOptions {\n  // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project.\n  //\n  // All IDs are the same, as assigned. It is okay that they are the same, as they extend\n  // different descriptor messages.\n  Operation openapiv2_operation = 1042;\n}\nextend google.protobuf.MessageOptions {\n  // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project.\n  //\n  // All IDs are the same, as assigned. It is okay that they are the same, as they extend\n  // different descriptor messages.\n  Schema openapiv2_schema = 1042;\n}\nextend google.protobuf.ServiceOptions {\n  // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project.\n  //\n  // All IDs are the same, as assigned. It is okay that they are the same, as they extend\n  // different descriptor messages.\n  Tag openapiv2_tag = 1042;\n}\nextend google.protobuf.FieldOptions {\n  // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project.\n  //\n  // All IDs are the same, as assigned. It is okay that they are the same, as they extend\n  // different descriptor messages.\n  JSONSchema openapiv2_field = 1042;\n}\n"
  },
  {
    "path": "admin/third_party/protoc-gen-openapiv2/options/openapiv2.proto",
    "content": "syntax = \"proto3\";\n\npackage grpc.gateway.protoc_gen_openapiv2.options;\n\noption go_package = \"github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options\";\n\nimport \"google/protobuf/struct.proto\";\n\n// Scheme describes the schemes supported by the OpenAPI Swagger\n// and Operation objects.\nenum Scheme {\n  UNKNOWN = 0;\n  HTTP = 1;\n  HTTPS = 2;\n  WS = 3;\n  WSS = 4;\n}\n\n// `Swagger` is a representation of OpenAPI v2 specification's Swagger object.\n//\n// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#swaggerObject\n//\n// Example:\n//\n//  option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {\n//    info: {\n//      title: \"Echo API\";\n//      version: \"1.0\";\n//      description: \";\n//      contact: {\n//        name: \"gRPC-Gateway project\";\n//        url: \"https://github.com/grpc-ecosystem/grpc-gateway\";\n//        email: \"none@example.com\";\n//      };\n//      license: {\n//        name: \"BSD 3-Clause License\";\n//        url: \"https://github.com/grpc-ecosystem/grpc-gateway/blob/master/LICENSE.txt\";\n//      };\n//    };\n//    schemes: HTTPS;\n//    consumes: \"application/json\";\n//    produces: \"application/json\";\n//  };\n//\nmessage Swagger {\n  // Specifies the OpenAPI Specification version being used. It can be\n  // used by the OpenAPI UI and other clients to interpret the API listing. The \n  // value MUST be \"2.0\".\n  string swagger = 1;\n  // Provides metadata about the API. The metadata can be used by the \n  // clients if needed.\n  Info info = 2;\n  // The host (name or ip) serving the API. This MUST be the host only and does \n  // not include the scheme nor sub-paths. It MAY include a port. If the host is\n  // not included, the host serving the documentation is to be used (including\n  // the port). The host does not support path templating.\n  string host = 3;\n  // The base path on which the API is served, which is relative to the host. If\n  // it is not included, the API is served directly under the host. The value \n  // MUST start with a leading slash (/). The basePath does not support path\n  // templating.\n  // Note that using `base_path` does not change the endpoint paths that are \n  // generated in the resulting OpenAPI file. If you wish to use `base_path`\n  // with relatively generated OpenAPI paths, the `base_path` prefix must be \n  // manually removed from your `google.api.http` paths and your code changed to \n  // serve the API from the `base_path`.\n  string base_path = 4;\n  // The transfer protocol of the API. Values MUST be from the list: \"http\",\n  // \"https\", \"ws\", \"wss\". If the schemes is not included, the default scheme to\n  // be used is the one used to access the OpenAPI definition itself.\n  repeated Scheme schemes = 5;\n  // A list of MIME types the APIs can consume. This is global to all APIs but \n  // can be overridden on specific API calls. Value MUST be as described under\n  // Mime Types.\n  repeated string consumes = 6;\n  // A list of MIME types the APIs can produce. This is global to all APIs but\n  // can be overridden on specific API calls. Value MUST be as described under\n  // Mime Types.\n  repeated string produces = 7;\n  // field 8 is reserved for 'paths'.\n  reserved 8;\n  // field 9 is reserved for 'definitions', which at this time are already\n  // exposed as and customizable as proto messages.\n  reserved 9;\n  // An object to hold responses that can be used across operations. This\n  // property does not define global responses for all operations.\n  map<string, Response> responses = 10;\n  // Security scheme definitions that can be used across the specification.\n  SecurityDefinitions security_definitions = 11;\n  // A declaration of which security schemes are applied for the API as a whole.\n  // The list of values describes alternative security schemes that can be used \n  // (that is, there is a logical OR between the security requirements). \n  // Individual operations can override this definition.\n  repeated SecurityRequirement security = 12;\n  // field 13 is reserved for 'tags', which are supposed to be exposed as and\n  // customizable as proto services. TODO(ivucica): add processing of proto\n  // service objects into OpenAPI v2 Tag objects.\n  reserved 13;\n  // Additional external documentation.\n  ExternalDocumentation external_docs = 14;\n  map<string, google.protobuf.Value> extensions = 15;\n}\n\n// `Operation` is a representation of OpenAPI v2 specification's Operation object.\n//\n// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#operationObject\n//\n// Example:\n//\n//  service EchoService {\n//    rpc Echo(SimpleMessage) returns (SimpleMessage) {\n//      option (google.api.http) = {\n//        get: \"/v1/example/echo/{id}\"\n//      };\n//\n//      option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {\n//        summary: \"Get a message.\";\n//        operation_id: \"getMessage\";\n//        tags: \"echo\";\n//        responses: {\n//          key: \"200\"\n//            value: {\n//            description: \"OK\";\n//          }\n//        }\n//      };\n//    }\n//  }\nmessage Operation {\n  // A list of tags for API documentation control. Tags can be used for logical\n  // grouping of operations by resources or any other qualifier.\n  repeated string tags = 1;\n  // A short summary of what the operation does. For maximum readability in the\n  // swagger-ui, this field SHOULD be less than 120 characters.\n  string summary = 2;\n  // A verbose explanation of the operation behavior. GFM syntax can be used for\n  // rich text representation.\n  string description = 3;\n  // Additional external documentation for this operation.\n  ExternalDocumentation external_docs = 4;\n  // Unique string used to identify the operation. The id MUST be unique among\n  // all operations described in the API. Tools and libraries MAY use the\n  // operationId to uniquely identify an operation, therefore, it is recommended\n  // to follow common programming naming conventions.\n  string operation_id = 5;\n  // A list of MIME types the operation can consume. This overrides the consumes\n  // definition at the OpenAPI Object. An empty value MAY be used to clear the\n  // global definition. Value MUST be as described under Mime Types.\n  repeated string consumes = 6;\n  // A list of MIME types the operation can produce. This overrides the produces\n  // definition at the OpenAPI Object. An empty value MAY be used to clear the\n  // global definition. Value MUST be as described under Mime Types.\n  repeated string produces = 7;\n  // field 8 is reserved for 'parameters'.\n  reserved 8;\n  // The list of possible responses as they are returned from executing this\n  // operation.\n  map<string, Response> responses = 9;\n  // The transfer protocol for the operation. Values MUST be from the list:\n  // \"http\", \"https\", \"ws\", \"wss\". The value overrides the OpenAPI Object\n  // schemes definition.\n  repeated Scheme schemes = 10;\n  // Declares this operation to be deprecated. Usage of the declared operation\n  // should be refrained. Default value is false.\n  bool deprecated = 11;\n  // A declaration of which security schemes are applied for this operation. The\n  // list of values describes alternative security schemes that can be used\n  // (that is, there is a logical OR between the security requirements). This\n  // definition overrides any declared top-level security. To remove a top-level\n  // security declaration, an empty array can be used.\n  repeated SecurityRequirement security = 12;\n  map<string, google.protobuf.Value> extensions = 13;\n}\n\n// `Header` is a representation of OpenAPI v2 specification's Header object.\n//\n// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#headerObject\n//\nmessage Header {\n  // `Description` is a short description of the header.\n  string description = 1;\n  // The type of the object. The value MUST be one of \"string\", \"number\", \"integer\", or \"boolean\". The \"array\" type is not supported.\n  string type = 2;\n  // `Format` The extending format for the previously mentioned type.\n  string format = 3;\n  // field 4 is reserved for 'items', but in OpenAPI-specific way.\n  reserved 4;\n  // field 5 is reserved `Collection Format` Determines the format of the array if type array is used.\n  reserved 5;\n  // `Default` Declares the value of the header that the server will use if none is provided.\n  // See: https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-6.2.\n  // Unlike JSON Schema this value MUST conform to the defined type for the header.\n  string default = 6;\n  // field 7 is reserved for 'maximum'.\n  reserved 7;\n  // field 8 is reserved for 'exclusiveMaximum'.\n  reserved 8;\n  // field 9 is reserved for 'minimum'.\n  reserved 9;\n  // field 10 is reserved for 'exclusiveMinimum'.\n  reserved 10;\n  // field 11 is reserved for 'maxLength'.\n  reserved 11;\n  // field 12 is reserved for 'minLength'.\n  reserved 12;\n  // 'Pattern' See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.2.3.\n  string pattern = 13;\n  // field 14 is reserved for 'maxItems'.\n  reserved 14;\n  // field 15 is reserved for 'minItems'.\n  reserved 15;\n  // field 16 is reserved for 'uniqueItems'.\n  reserved 16;\n  // field 17 is reserved for 'enum'.\n  reserved 17;\n  // field 18 is reserved for 'multipleOf'.\n  reserved 18;\n}\n\n// `Response` is a representation of OpenAPI v2 specification's Response object.\n//\n// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#responseObject\n//\nmessage Response {\n  // `Description` is a short description of the response.\n  // GFM syntax can be used for rich text representation.\n  string description = 1;\n  // `Schema` optionally defines the structure of the response.\n  // If `Schema` is not provided, it means there is no content to the response.\n  Schema schema = 2;\n  // `Headers` A list of headers that are sent with the response.\n  // `Header` name is expected to be a string in the canonical format of the MIME header key\n  // See: https://golang.org/pkg/net/textproto/#CanonicalMIMEHeaderKey\n  map<string, Header> headers = 3;\n  // `Examples` gives per-mimetype response examples.\n  // See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#example-object\n  map<string, string> examples = 4;\n  map<string, google.protobuf.Value> extensions = 5;\n}\n\n// `Info` is a representation of OpenAPI v2 specification's Info object.\n//\n// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#infoObject\n//\n// Example:\n//\n//  option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {\n//    info: {\n//      title: \"Echo API\";\n//      version: \"1.0\";\n//      description: \";\n//      contact: {\n//        name: \"gRPC-Gateway project\";\n//        url: \"https://github.com/grpc-ecosystem/grpc-gateway\";\n//        email: \"none@example.com\";\n//      };\n//      license: {\n//        name: \"BSD 3-Clause License\";\n//        url: \"https://github.com/grpc-ecosystem/grpc-gateway/blob/master/LICENSE.txt\";\n//      };\n//    };\n//    ...\n//  };\n//\nmessage Info {\n  // The title of the application.\n  string title = 1;\n  // A short description of the application. GFM syntax can be used for rich\n  // text representation.\n  string description = 2;\n  // The Terms of Service for the API.\n  string terms_of_service = 3;\n  // The contact information for the exposed API.\n  Contact contact = 4;\n  // The license information for the exposed API.\n  License license = 5;\n  // Provides the version of the application API (not to be confused\n  // with the specification version).\n  string version = 6;\n  map<string, google.protobuf.Value> extensions = 7;\n}\n\n// `Contact` is a representation of OpenAPI v2 specification's Contact object.\n//\n// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#contactObject\n//\n// Example:\n//\n//  option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {\n//    info: {\n//      ...\n//      contact: {\n//        name: \"gRPC-Gateway project\";\n//        url: \"https://github.com/grpc-ecosystem/grpc-gateway\";\n//        email: \"none@example.com\";\n//      };\n//      ...\n//    };\n//    ...\n//  };\n//\nmessage Contact {\n  // The identifying name of the contact person/organization.\n  string name = 1;\n  // The URL pointing to the contact information. MUST be in the format of a\n  // URL.\n  string url = 2;\n  // The email address of the contact person/organization. MUST be in the format\n  // of an email address.\n  string email = 3;\n}\n\n// `License` is a representation of OpenAPI v2 specification's License object.\n//\n// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#licenseObject\n//\n// Example:\n//\n//  option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {\n//    info: {\n//      ...\n//      license: {\n//        name: \"BSD 3-Clause License\";\n//        url: \"https://github.com/grpc-ecosystem/grpc-gateway/blob/master/LICENSE.txt\";\n//      };\n//      ...\n//    };\n//    ...\n//  };\n//\nmessage License {\n  // The license name used for the API.\n  string name = 1;\n  // A URL to the license used for the API. MUST be in the format of a URL.\n  string url = 2;\n}\n\n// `ExternalDocumentation` is a representation of OpenAPI v2 specification's\n// ExternalDocumentation object.\n//\n// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#externalDocumentationObject\n//\n// Example:\n//\n//  option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {\n//    ...\n//    external_docs: {\n//      description: \"More about gRPC-Gateway\";\n//      url: \"https://github.com/grpc-ecosystem/grpc-gateway\";\n//    }\n//    ...\n//  };\n//\nmessage ExternalDocumentation {\n  // A short description of the target documentation. GFM syntax can be used for\n  // rich text representation.\n  string description = 1;\n  // The URL for the target documentation. Value MUST be in the format\n  // of a URL.\n  string url = 2;\n}\n\n// `Schema` is a representation of OpenAPI v2 specification's Schema object.\n//\n// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#schemaObject\n//\nmessage Schema {\n  JSONSchema json_schema = 1;\n  // Adds support for polymorphism. The discriminator is the schema property\n  // name that is used to differentiate between other schema that inherit this\n  // schema. The property name used MUST be defined at this schema and it MUST\n  // be in the required property list. When used, the value MUST be the name of\n  // this schema or any schema that inherits it.\n  string discriminator = 2;\n  // Relevant only for Schema \"properties\" definitions. Declares the property as\n  // \"read only\". This means that it MAY be sent as part of a response but MUST\n  // NOT be sent as part of the request. Properties marked as readOnly being\n  // true SHOULD NOT be in the required list of the defined schema. Default\n  // value is false.\n  bool read_only = 3;\n  // field 4 is reserved for 'xml'.\n  reserved 4;\n  // Additional external documentation for this schema.\n  ExternalDocumentation external_docs = 5;\n  // A free-form property to include an example of an instance for this schema in JSON.\n  // This is copied verbatim to the output.\n  string example = 6;\n}\n\n// `JSONSchema` represents properties from JSON Schema taken, and as used, in\n// the OpenAPI v2 spec.\n//\n// This includes changes made by OpenAPI v2.\n//\n// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#schemaObject\n//\n// See also: https://cswr.github.io/JsonSchema/spec/basic_types/,\n// https://github.com/json-schema-org/json-schema-spec/blob/master/schema.json\n//\n// Example:\n//\n//  message SimpleMessage {\n//    option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = {\n//      json_schema: {\n//        title: \"SimpleMessage\"\n//        description: \"A simple message.\"\n//        required: [\"id\"]\n//      }\n//    };\n//\n//    // Id represents the message identifier.\n//    string id = 1; [\n//        (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {\n//          {description: \"The unique identifier of the simple message.\"\n//        }];\n//  }\n//\nmessage JSONSchema {\n  // field 1 is reserved for '$id', omitted from OpenAPI v2.\n  reserved 1;\n  // field 2 is reserved for '$schema', omitted from OpenAPI v2.\n  reserved 2;\n  // Ref is used to define an external reference to include in the message.\n  // This could be a fully qualified proto message reference, and that type must\n  // be imported into the protofile. If no message is identified, the Ref will\n  // be used verbatim in the output.\n  // For example:\n  //  `ref: \".google.protobuf.Timestamp\"`.\n  string ref = 3;\n  // field 4 is reserved for '$comment', omitted from OpenAPI v2.\n  reserved 4;\n  // The title of the schema.\n  string title = 5;\n  // A short description of the schema.\n  string description = 6;\n  string default = 7;\n  bool read_only = 8;\n  // A free-form property to include a JSON example of this field. This is copied\n  // verbatim to the output swagger.json. Quotes must be escaped.\n  // This property is the same for 2.0 and 3.0.0 https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/3.0.0.md#schemaObject  https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#schemaObject\n  string example = 9;\n  double multiple_of = 10;\n  // Maximum represents an inclusive upper limit for a numeric instance. The \n  // value of MUST be a number, \n  double maximum = 11;\n  bool exclusive_maximum = 12;\n  // minimum represents an inclusive lower limit for a numeric instance. The \n  // value of MUST be a number, \n  double minimum = 13;\n  bool exclusive_minimum = 14;\n  uint64 max_length = 15;\n  uint64 min_length = 16;\n  string pattern = 17;\n  // field 18 is reserved for 'additionalItems', omitted from OpenAPI v2.\n  reserved 18;\n  // field 19 is reserved for 'items', but in OpenAPI-specific way.\n  // TODO(ivucica): add 'items'?\n  reserved 19;\n  uint64 max_items = 20;\n  uint64 min_items = 21;\n  bool unique_items = 22;\n  // field 23 is reserved for 'contains', omitted from OpenAPI v2.\n  reserved 23;\n  uint64 max_properties = 24;\n  uint64 min_properties = 25;\n  repeated string required = 26;\n  // field 27 is reserved for 'additionalProperties', but in OpenAPI-specific\n  // way. TODO(ivucica): add 'additionalProperties'?\n  reserved 27;\n  // field 28 is reserved for 'definitions', omitted from OpenAPI v2.\n  reserved 28;\n  // field 29 is reserved for 'properties', but in OpenAPI-specific way.\n  // TODO(ivucica): add 'additionalProperties'?\n  reserved 29;\n  // following fields are reserved, as the properties have been omitted from\n  // OpenAPI v2:\n  // patternProperties, dependencies, propertyNames, const\n  reserved 30 to 33;\n  // Items in 'array' must be unique.\n  repeated string array = 34;\n\n  enum JSONSchemaSimpleTypes {\n    UNKNOWN = 0;\n    ARRAY = 1;\n    BOOLEAN = 2;\n    INTEGER = 3;\n    NULL = 4;\n    NUMBER = 5;\n    OBJECT = 6;\n    STRING = 7;\n  }\n\n  repeated JSONSchemaSimpleTypes type = 35;\n  // `Format`\n  string format = 36;\n  // following fields are reserved, as the properties have been omitted from \n  // OpenAPI v2: contentMediaType, contentEncoding, if, then, else\n  reserved 37 to 41;\n  // field 42 is reserved for 'allOf', but in OpenAPI-specific way.\n  // TODO(ivucica): add 'allOf'?\n  reserved 42;\n  // following fields are reserved, as the properties have been omitted from\n  // OpenAPI v2:\n  // anyOf, oneOf, not\n  reserved 43 to 45;\n  // Items in `enum` must be unique https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.5.1\n  repeated string enum = 46;\n}\n\n// `Tag` is a representation of OpenAPI v2 specification's Tag object.\n//\n// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#tagObject\n//\nmessage Tag {\n  // field 1 is reserved for 'name'. In our generator, this is (to be) extracted\n  // from the name of proto service, and thus not exposed to the user, as\n  // changing tag object's name would break the link to the references to the\n  // tag in individual operation specifications.\n  //\n  // TODO(ivucica): Add 'name' property. Use it to allow override of the name of\n  // global Tag object, then use that name to reference the tag throughout the\n  // OpenAPI file.\n  reserved 1;\n  // A short description for the tag. GFM syntax can be used for rich text \n  // representation.\n  string description = 2;\n  // Additional external documentation for this tag.\n  ExternalDocumentation external_docs = 3;\n}\n\n// `SecurityDefinitions` is a representation of OpenAPI v2 specification's\n// Security Definitions object.\n//\n// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#securityDefinitionsObject\n//\n// A declaration of the security schemes available to be used in the\n// specification. This does not enforce the security schemes on the operations\n// and only serves to provide the relevant details for each scheme.\nmessage SecurityDefinitions {\n  // A single security scheme definition, mapping a \"name\" to the scheme it\n  // defines.\n  map<string, SecurityScheme> security = 1;\n}\n\n// `SecurityScheme` is a representation of OpenAPI v2 specification's\n// Security Scheme object.\n//\n// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#securitySchemeObject\n//\n// Allows the definition of a security scheme that can be used by the\n// operations. Supported schemes are basic authentication, an API key (either as\n// a header or as a query parameter) and OAuth2's common flows (implicit,\n// password, application and access code).\nmessage SecurityScheme {\n  // The type of the security scheme. Valid values are \"basic\",\n  // \"apiKey\" or \"oauth2\".\n  enum Type {\n    TYPE_INVALID = 0;\n    TYPE_BASIC = 1;\n    TYPE_API_KEY = 2;\n    TYPE_OAUTH2 = 3;\n  }\n\n  // The location of the API key. Valid values are \"query\" or \"header\".\n  enum In {\n    IN_INVALID = 0;\n    IN_QUERY = 1;\n    IN_HEADER = 2;\n  }\n\n  // The flow used by the OAuth2 security scheme. Valid values are\n  // \"implicit\", \"password\", \"application\" or \"accessCode\".\n  enum Flow {\n    FLOW_INVALID = 0;\n    FLOW_IMPLICIT = 1;\n    FLOW_PASSWORD = 2;\n    FLOW_APPLICATION = 3;\n    FLOW_ACCESS_CODE = 4;\n  }\n\n  // The type of the security scheme. Valid values are \"basic\",\n  // \"apiKey\" or \"oauth2\".\n  Type type = 1;\n  // A short description for security scheme.\n  string description = 2;\n  // The name of the header or query parameter to be used.\n  // Valid for apiKey.\n  string name = 3;\n  // The location of the API key. Valid values are \"query\" or\n  // \"header\".\n  // Valid for apiKey.\n  In in = 4;\n  // The flow used by the OAuth2 security scheme. Valid values are\n  // \"implicit\", \"password\", \"application\" or \"accessCode\".\n  // Valid for oauth2.\n  Flow flow = 5;\n  // The authorization URL to be used for this flow. This SHOULD be in\n  // the form of a URL.\n  // Valid for oauth2/implicit and oauth2/accessCode.\n  string authorization_url = 6;\n  // The token URL to be used for this flow. This SHOULD be in the\n  // form of a URL.\n  // Valid for oauth2/password, oauth2/application and oauth2/accessCode.\n  string token_url = 7;\n  // The available scopes for the OAuth2 security scheme.\n  // Valid for oauth2.\n  Scopes scopes = 8;\n  map<string, google.protobuf.Value> extensions = 9;\n}\n\n// `SecurityRequirement` is a representation of OpenAPI v2 specification's\n// Security Requirement object.\n//\n// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#securityRequirementObject\n//\n// Lists the required security schemes to execute this operation. The object can\n// have multiple security schemes declared in it which are all required (that\n// is, there is a logical AND between the schemes).\n//\n// The name used for each property MUST correspond to a security scheme\n// declared in the Security Definitions.\nmessage SecurityRequirement {\n  // If the security scheme is of type \"oauth2\", then the value is a list of\n  // scope names required for the execution. For other security scheme types,\n  // the array MUST be empty.\n  message SecurityRequirementValue {\n    repeated string scope = 1;\n  }\n  // Each name must correspond to a security scheme which is declared in\n  // the Security Definitions. If the security scheme is of type \"oauth2\",\n  // then the value is a list of scope names required for the execution.\n  // For other security scheme types, the array MUST be empty.\n  map<string, SecurityRequirementValue> security_requirement = 1;\n}\n\n// `Scopes` is a representation of OpenAPI v2 specification's Scopes object.\n//\n// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#scopesObject\n//\n// Lists the available scopes for an OAuth2 security scheme.\nmessage Scopes {\n  // Maps between a name of a scope to a short description of it (as the value\n  // of the property).\n  map<string, string> scope = 1;\n}"
  },
  {
    "path": "admin/third_party/validate/README.md",
    "content": "# protoc-gen-validate (PGV)\n\n* https://github.com/envoyproxy/protoc-gen-validate\n"
  },
  {
    "path": "admin/third_party/validate/validate.proto",
    "content": "syntax = \"proto2\";\npackage validate;\n\noption go_package = \"github.com/envoyproxy/protoc-gen-validate/validate\";\noption java_package = \"io.envoyproxy.pgv.validate\";\n\nimport \"google/protobuf/descriptor.proto\";\nimport \"google/protobuf/duration.proto\";\nimport \"google/protobuf/timestamp.proto\";\n\n// Validation rules applied at the message level\nextend google.protobuf.MessageOptions {\n    // Disabled nullifies any validation rules for this message, including any\n    // message fields associated with it that do support validation.\n    optional bool disabled = 1071;\n    // Ignore skips generation of validation methods for this message.\n    optional bool ignored = 1072;\n}\n\n// Validation rules applied at the oneof level\nextend google.protobuf.OneofOptions {\n    // Required ensures that exactly one the field options in a oneof is set;\n    // validation fails if no fields in the oneof are set.\n    optional bool required = 1071;\n}\n\n// Validation rules applied at the field level\nextend google.protobuf.FieldOptions {\n    // Rules specify the validations to be performed on this field. By default,\n    // no validation is performed against a field.\n    optional FieldRules rules = 1071;\n}\n\n// FieldRules encapsulates the rules for each type of field. Depending on the\n// field, the correct set should be used to ensure proper validations.\nmessage FieldRules {\n    optional MessageRules message = 17;\n    oneof type {\n        // Scalar Field Types\n        FloatRules    float    = 1;\n        DoubleRules   double   = 2;\n        Int32Rules    int32    = 3;\n        Int64Rules    int64    = 4;\n        UInt32Rules   uint32   = 5;\n        UInt64Rules   uint64   = 6;\n        SInt32Rules   sint32   = 7;\n        SInt64Rules   sint64   = 8;\n        Fixed32Rules  fixed32  = 9;\n        Fixed64Rules  fixed64  = 10;\n        SFixed32Rules sfixed32 = 11;\n        SFixed64Rules sfixed64 = 12;\n        BoolRules     bool     = 13;\n        StringRules   string   = 14;\n        BytesRules    bytes    = 15;\n\n        // Complex Field Types\n        EnumRules     enum     = 16;\n        RepeatedRules repeated = 18;\n        MapRules      map      = 19;\n\n        // Well-Known Field Types\n        AnyRules       any       = 20;\n        DurationRules  duration  = 21;\n        TimestampRules timestamp = 22;\n    }\n}\n\n// FloatRules describes the constraints applied to `float` values\nmessage FloatRules {\n    // Const specifies that this field must be exactly the specified value\n    optional float const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional float lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional float lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional float gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional float gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated float in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated float not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// DoubleRules describes the constraints applied to `double` values\nmessage DoubleRules {\n    // Const specifies that this field must be exactly the specified value\n    optional double const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional double lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional double lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional double gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional double gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated double in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated double not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// Int32Rules describes the constraints applied to `int32` values\nmessage Int32Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional int32 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional int32 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional int32 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional int32 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional int32 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated int32 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated int32 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// Int64Rules describes the constraints applied to `int64` values\nmessage Int64Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional int64 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional int64 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional int64 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional int64 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional int64 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated int64 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated int64 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// UInt32Rules describes the constraints applied to `uint32` values\nmessage UInt32Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional uint32 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional uint32 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional uint32 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional uint32 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional uint32 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated uint32 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated uint32 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// UInt64Rules describes the constraints applied to `uint64` values\nmessage UInt64Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional uint64 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional uint64 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional uint64 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional uint64 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional uint64 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated uint64 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated uint64 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// SInt32Rules describes the constraints applied to `sint32` values\nmessage SInt32Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional sint32 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional sint32 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional sint32 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional sint32 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional sint32 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated sint32 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated sint32 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// SInt64Rules describes the constraints applied to `sint64` values\nmessage SInt64Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional sint64 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional sint64 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional sint64 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional sint64 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional sint64 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated sint64 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated sint64 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// Fixed32Rules describes the constraints applied to `fixed32` values\nmessage Fixed32Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional fixed32 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional fixed32 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional fixed32 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional fixed32 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional fixed32 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated fixed32 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated fixed32 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// Fixed64Rules describes the constraints applied to `fixed64` values\nmessage Fixed64Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional fixed64 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional fixed64 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional fixed64 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional fixed64 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional fixed64 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated fixed64 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated fixed64 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// SFixed32Rules describes the constraints applied to `sfixed32` values\nmessage SFixed32Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional sfixed32 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional sfixed32 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional sfixed32 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional sfixed32 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional sfixed32 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated sfixed32 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated sfixed32 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// SFixed64Rules describes the constraints applied to `sfixed64` values\nmessage SFixed64Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional sfixed64 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional sfixed64 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional sfixed64 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional sfixed64 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional sfixed64 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated sfixed64 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated sfixed64 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// BoolRules describes the constraints applied to `bool` values\nmessage BoolRules {\n    // Const specifies that this field must be exactly the specified value\n    optional bool const = 1;\n}\n\n// StringRules describe the constraints applied to `string` values\nmessage StringRules {\n    // Const specifies that this field must be exactly the specified value\n    optional string const = 1;\n\n    // Len specifies that this field must be the specified number of\n    // characters (Unicode code points). Note that the number of\n    // characters may differ from the number of bytes in the string.\n    optional uint64 len = 19;\n\n    // MinLen specifies that this field must be the specified number of\n    // characters (Unicode code points) at a minimum. Note that the number of\n    // characters may differ from the number of bytes in the string.\n    optional uint64 min_len = 2;\n\n    // MaxLen specifies that this field must be the specified number of\n    // characters (Unicode code points) at a maximum. Note that the number of\n    // characters may differ from the number of bytes in the string.\n    optional uint64 max_len = 3;\n\n    // LenBytes specifies that this field must be the specified number of bytes\n    // at a minimum\n    optional uint64 len_bytes = 20;\n\n    // MinBytes specifies that this field must be the specified number of bytes\n    // at a minimum\n    optional uint64 min_bytes = 4;\n\n    // MaxBytes specifies that this field must be the specified number of bytes\n    // at a maximum\n    optional uint64 max_bytes = 5;\n\n    // Pattern specifes that this field must match against the specified\n    // regular expression (RE2 syntax). The included expression should elide\n    // any delimiters.\n    optional string pattern  = 6;\n\n    // Prefix specifies that this field must have the specified substring at\n    // the beginning of the string.\n    optional string prefix   = 7;\n\n    // Suffix specifies that this field must have the specified substring at\n    // the end of the string.\n    optional string suffix   = 8;\n\n    // Contains specifies that this field must have the specified substring\n    // anywhere in the string.\n    optional string contains = 9;\n\n    // NotContains specifies that this field cannot have the specified substring\n    // anywhere in the string.\n    optional string not_contains = 23;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated string in     = 10;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated string not_in = 11;\n\n    // WellKnown rules provide advanced constraints against common string\n    // patterns\n    oneof well_known {\n        // Email specifies that the field must be a valid email address as\n        // defined by RFC 5322\n        bool email    = 12;\n\n        // Hostname specifies that the field must be a valid hostname as\n        // defined by RFC 1034. This constraint does not support\n        // internationalized domain names (IDNs).\n        bool hostname = 13;\n\n        // Ip specifies that the field must be a valid IP (v4 or v6) address.\n        // Valid IPv6 addresses should not include surrounding square brackets.\n        bool ip       = 14;\n\n        // Ipv4 specifies that the field must be a valid IPv4 address.\n        bool ipv4     = 15;\n\n        // Ipv6 specifies that the field must be a valid IPv6 address. Valid\n        // IPv6 addresses should not include surrounding square brackets.\n        bool ipv6     = 16;\n\n        // Uri specifies that the field must be a valid, absolute URI as defined\n        // by RFC 3986\n        bool uri      = 17;\n\n        // UriRef specifies that the field must be a valid URI as defined by RFC\n        // 3986 and may be relative or absolute.\n        bool uri_ref  = 18;\n\n        // Address specifies that the field must be either a valid hostname as\n        // defined by RFC 1034 (which does not support internationalized domain\n        // names or IDNs), or it can be a valid IP (v4 or v6).\n        bool address  = 21;\n\n        // Uuid specifies that the field must be a valid UUID as defined by\n        // RFC 4122\n        bool uuid     = 22;\n\n        // WellKnownRegex specifies a common well known pattern defined as a regex.\n        KnownRegex well_known_regex = 24;\n    }\n\n  // This applies to regexes HTTP_HEADER_NAME and HTTP_HEADER_VALUE to enable\n  // strict header validation.\n  // By default, this is true, and HTTP header validations are RFC-compliant.\n  // Setting to false will enable a looser validations that only disallows\n  // \\r\\n\\0 characters, which can be used to bypass header matching rules.\n  optional bool strict = 25 [default = true];\n\n  // IgnoreEmpty specifies that the validation rules of this field should be\n  // evaluated only if the field is not empty\n  optional bool ignore_empty = 26;\n}\n\n// WellKnownRegex contain some well-known patterns.\nenum KnownRegex {\n  UNKNOWN = 0;\n\n  // HTTP header name as defined by RFC 7230.\n  HTTP_HEADER_NAME = 1;\n\n  // HTTP header value as defined by RFC 7230.\n  HTTP_HEADER_VALUE = 2;\n}\n\n// BytesRules describe the constraints applied to `bytes` values\nmessage BytesRules {\n    // Const specifies that this field must be exactly the specified value\n    optional bytes const = 1;\n\n    // Len specifies that this field must be the specified number of bytes\n    optional uint64 len = 13;\n\n    // MinLen specifies that this field must be the specified number of bytes\n    // at a minimum\n    optional uint64 min_len = 2;\n\n    // MaxLen specifies that this field must be the specified number of bytes\n    // at a maximum\n    optional uint64 max_len = 3;\n\n    // Pattern specifes that this field must match against the specified\n    // regular expression (RE2 syntax). The included expression should elide\n    // any delimiters.\n    optional string pattern  = 4;\n\n    // Prefix specifies that this field must have the specified bytes at the\n    // beginning of the string.\n    optional bytes  prefix   = 5;\n\n    // Suffix specifies that this field must have the specified bytes at the\n    // end of the string.\n    optional bytes  suffix   = 6;\n\n    // Contains specifies that this field must have the specified bytes\n    // anywhere in the string.\n    optional bytes  contains = 7;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated bytes in     = 8;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated bytes not_in = 9;\n\n    // WellKnown rules provide advanced constraints against common byte\n    // patterns\n    oneof well_known {\n        // Ip specifies that the field must be a valid IP (v4 or v6) address in\n        // byte format\n        bool ip   = 10;\n\n        // Ipv4 specifies that the field must be a valid IPv4 address in byte\n        // format\n        bool ipv4 = 11;\n\n        // Ipv6 specifies that the field must be a valid IPv6 address in byte\n        // format\n        bool ipv6 = 12;\n    }\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 14;\n}\n\n// EnumRules describe the constraints applied to enum values\nmessage EnumRules {\n    // Const specifies that this field must be exactly the specified value\n    optional int32 const        = 1;\n\n    // DefinedOnly specifies that this field must be only one of the defined\n    // values for this enum, failing on any undefined value.\n    optional bool  defined_only = 2;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated int32 in           = 3;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated int32 not_in       = 4;\n}\n\n// MessageRules describe the constraints applied to embedded message values.\n// For message-type fields, validation is performed recursively.\nmessage MessageRules {\n    // Skip specifies that the validation rules of this field should not be\n    // evaluated\n    optional bool skip     = 1;\n\n    // Required specifies that this field must be set\n    optional bool required = 2;\n}\n\n// RepeatedRules describe the constraints applied to `repeated` values\nmessage RepeatedRules {\n    // MinItems specifies that this field must have the specified number of\n    // items at a minimum\n    optional uint64 min_items = 1;\n\n    // MaxItems specifies that this field must have the specified number of\n    // items at a maximum\n    optional uint64 max_items = 2;\n\n    // Unique specifies that all elements in this field must be unique. This\n    // contraint is only applicable to scalar and enum types (messages are not\n    // supported).\n    optional bool   unique    = 3;\n\n    // Items specifies the contraints to be applied to each item in the field.\n    // Repeated message fields will still execute validation against each item\n    // unless skip is specified here.\n    optional FieldRules items = 4;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 5;\n}\n\n// MapRules describe the constraints applied to `map` values\nmessage MapRules {\n    // MinPairs specifies that this field must have the specified number of\n    // KVs at a minimum\n    optional uint64 min_pairs = 1;\n\n    // MaxPairs specifies that this field must have the specified number of\n    // KVs at a maximum\n    optional uint64 max_pairs = 2;\n\n    // NoSparse specifies values in this field cannot be unset. This only\n    // applies to map's with message value types.\n    optional bool no_sparse = 3;\n\n    // Keys specifies the constraints to be applied to each key in the field.\n    optional FieldRules keys   = 4;\n\n    // Values specifies the constraints to be applied to the value of each key\n    // in the field. Message values will still have their validations evaluated\n    // unless skip is specified here.\n    optional FieldRules values = 5;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 6;\n}\n\n// AnyRules describe constraints applied exclusively to the\n// `google.protobuf.Any` well-known type\nmessage AnyRules {\n    // Required specifies that this field must be set\n    optional bool required = 1;\n\n    // In specifies that this field's `type_url` must be equal to one of the\n    // specified values.\n    repeated string in     = 2;\n\n    // NotIn specifies that this field's `type_url` must not be equal to any of\n    // the specified values.\n    repeated string not_in = 3;\n}\n\n// DurationRules describe the constraints applied exclusively to the\n// `google.protobuf.Duration` well-known type\nmessage DurationRules {\n    // Required specifies that this field must be set\n    optional bool required = 1;\n\n    // Const specifies that this field must be exactly the specified value\n    optional google.protobuf.Duration const = 2;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional google.protobuf.Duration lt = 3;\n\n    // Lt specifies that this field must be less than the specified value,\n    // inclusive\n    optional google.protobuf.Duration lte = 4;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive\n    optional google.protobuf.Duration gt = 5;\n\n    // Gte specifies that this field must be greater than the specified value,\n    // inclusive\n    optional google.protobuf.Duration gte = 6;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated google.protobuf.Duration in = 7;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated google.protobuf.Duration not_in = 8;\n}\n\n// TimestampRules describe the constraints applied exclusively to the\n// `google.protobuf.Timestamp` well-known type\nmessage TimestampRules {\n    // Required specifies that this field must be set\n    optional bool required = 1;\n\n    // Const specifies that this field must be exactly the specified value\n    optional google.protobuf.Timestamp const = 2;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional google.protobuf.Timestamp lt = 3;\n\n    // Lte specifies that this field must be less than the specified value,\n    // inclusive\n    optional google.protobuf.Timestamp lte = 4;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive\n    optional google.protobuf.Timestamp gt = 5;\n\n    // Gte specifies that this field must be greater than the specified value,\n    // inclusive\n    optional google.protobuf.Timestamp gte = 6;\n\n    // LtNow specifies that this must be less than the current time. LtNow\n    // can only be used with the Within rule.\n    optional bool lt_now  = 7;\n\n    // GtNow specifies that this must be greater than the current time. GtNow\n    // can only be used with the Within rule.\n    optional bool gt_now  = 8;\n\n    // Within specifies that this field must be within this duration of the\n    // current time. This constraint can be used alone or with the LtNow and\n    // GtNow rules.\n    optional google.protobuf.Duration within = 9;\n}\n"
  },
  {
    "path": "service/cart/.gitignore",
    "content": "# Reference https://github.com/github/gitignore/blob/master/Go.gitignore\n# Binaries for programs and plugins\n*.exe\n*.exe~\n*.dll\n*.so\n*.dylib\n\n# Test binary, built with `go test -c`\n*.test\n\n# Output of the go coverage tool, specifically when used with LiteIDE\n*.out\n\n# Dependency directories (remove the comment below to include it)\nvendor/\n\n# Compiled Object files, Static and Dynamic libs (Shared Objects)\n*.o\n*.a\n*.so\n\n# OS General\nThumbs.db\n.DS_Store\n\n# project\n*.cert\n*.key\n*.log\nbin/\n\n# Develop tools\n.vscode/\n.idea/\n*.swp\n"
  },
  {
    "path": "service/cart/Dockerfile",
    "content": "FROM golang:1.16 AS builder\n\nCOPY . /src\nWORKDIR /src\n\nRUN GOPROXY=https://goproxy.cn make build\n\nFROM debian:stable-slim\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n\t\tca-certificates  \\\n        netbase \\\n        && rm -rf /var/lib/apt/lists/ \\\n        && apt-get autoremove -y && apt-get autoclean -y\n\nCOPY --from=builder /src/bin /app\n\nWORKDIR /app\n\nEXPOSE 8000\nEXPOSE 9000\nVOLUME /data/conf\n\nCMD [\"./server\", \"-conf\", \"/data/conf\"]\n"
  },
  {
    "path": "service/cart/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2020 go-kratos\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "service/cart/Makefile",
    "content": "GOPATH:=$(shell go env GOPATH)\nVERSION=$(shell git describe --tags --always)\nINTERNAL_PROTO_FILES=$(shell find internal -name *.proto)\nAPI_PROTO_FILES=$(shell find api -name *.proto)\n\n.PHONY: init\n# init env\ninit:\n\tgo install google.golang.org/protobuf/cmd/protoc-gen-go@latest\n\tgo install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest\n\tgo install github.com/go-kratos/kratos/cmd/kratos/v2@latest\n\tgo install github.com/go-kratos/kratos/cmd/protoc-gen-go-http/v2@latest\n\tgo install github.com/go-kratos/kratos/cmd/protoc-gen-go-errors/v2@latest\n\tgo install github.com/google/gnostic/cmd/protoc-gen-openapi@v0.6.1\n\n.PHONY: config\n# generate internal proto\nconfig:\n\tprotoc --proto_path=./internal \\\n\t       --proto_path=./third_party \\\n \t       --go_out=paths=source_relative:./internal \\\n\t       $(INTERNAL_PROTO_FILES)\n\n.PHONY: api\n# generate api proto\napi:\n\tprotoc --proto_path=./api \\\n\t       --proto_path=./third_party \\\n \t       --go_out=paths=source_relative:./api \\\n \t       --go-http_out=paths=source_relative:./api \\\n \t       --go-grpc_out=paths=source_relative:./api \\\n \t       --openapi_out==paths=source_relative:. \\\n \t       --validate_out=paths=source_relative,lang=go:./api \\\n\t       $(API_PROTO_FILES)\n\n.PHONY: build\n# build\nbuild:\n\tmkdir -p bin/ && go build -ldflags \"-X main.Version=$(VERSION)\" -o ./bin/ ./...\n\n.PHONY: generate\n# generate\ngenerate:\n\tgo mod tidy\n\tgo get github.com/google/wire/cmd/wire@latest\n\tgo generate ./...\n\n.PHONY: wire\n# wire\nwire:\n\tcd cmd/cart && wire\n\n\n.PHONY: all\n# generate all\nall:\n\tmake api;\n\tmake config;\n\tmake generate;\n\n# show help\nhelp:\n\t@echo ''\n\t@echo 'Usage:'\n\t@echo ' make [target]'\n\t@echo ''\n\t@echo 'Targets:'\n\t@awk '/^[a-zA-Z\\-\\_0-9]+:/ { \\\n\thelpMessage = match(lastLine, /^# (.*)/); \\\n\t\tif (helpMessage) { \\\n\t\t\thelpCommand = substr($$1, 0, index($$1, \":\")-1); \\\n\t\t\thelpMessage = substr(lastLine, RSTART + 2, RLENGTH); \\\n\t\t\tprintf \"\\033[36m%-22s\\033[0m %s\\n\", helpCommand,helpMessage; \\\n\t\t} \\\n\t} \\\n\t{ lastLine = $$0 }' $(MAKEFILE_LIST)\n\n.DEFAULT_GOAL := help\n"
  },
  {
    "path": "service/cart/README.md",
    "content": "# Kratos Project Template\n\n## Install Kratos\n```\ngo install github.com/go-kratos/kratos/cmd/kratos/v2@latest\n```\n## Create a service\n```\n# Create a template project\nkratos new server\n\ncd server\n# Add a proto template\nkratos proto add api/server/server.proto\n# Generate the proto code\nkratos proto client api/server/server.proto\n# Generate the source code of service by proto file\nkratos proto server api/server/server.proto -t internal/service\n\ngo generate ./...\ngo build -o ./bin/ ./...\n./bin/server -conf ./configs\n```\n## Generate other auxiliary files by Makefile\n```\n# Download and update dependencies\nmake init\n# Generate API files (include: pb.go, http, grpc, validate, swagger) by proto file\nmake api\n# Generate all files\nmake all\n```\n## Automated Initialization (wire)\n```\n# install wire\ngo get github.com/google/wire/cmd/wire\n\n# generate wire\ncd cmd/server\nwire\n```\n\n## Docker\n```bash\n# build\ndocker build -t <your-docker-image-name> .\n\n# run\ndocker run --rm -p 8000:8000 -p 9000:9000 -v </path/to/your/configs>:/data/conf <your-docker-image-name>\n```\n\n"
  },
  {
    "path": "service/cart/api/cart/v1/cart.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.0\n// \tprotoc        v3.19.4\n// source: cart/v1/cart.proto\n\npackage v1\n\nimport (\n\t_ \"github.com/envoyproxy/protoc-gen-validate/validate\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CartInfoReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId         int64  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tUserId     int64  `protobuf:\"varint,2,opt,name=userId,proto3\" json:\"userId,omitempty\"`\n\tGoodsId    int64  `protobuf:\"varint,3,opt,name=goodsId,proto3\" json:\"goodsId,omitempty\"`\n\tGoodsSn    string `protobuf:\"bytes,4,opt,name=goodsSn,proto3\" json:\"goodsSn,omitempty\"`\n\tGoodsName  string `protobuf:\"bytes,5,opt,name=goodsName,proto3\" json:\"goodsName,omitempty\"`\n\tSkuId      int64  `protobuf:\"varint,6,opt,name=skuId,proto3\" json:\"skuId,omitempty\"`\n\tGoodsPrice int64  `protobuf:\"varint,7,opt,name=goodsPrice,proto3\" json:\"goodsPrice,omitempty\"`\n\tGoodsNum   int32  `protobuf:\"varint,8,opt,name=goodsNum,proto3\" json:\"goodsNum,omitempty\"`\n\tIsSelect   bool   `protobuf:\"varint,9,opt,name=isSelect,proto3\" json:\"isSelect,omitempty\"`\n}\n\nfunc (x *CartInfoReply) Reset() {\n\t*x = CartInfoReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_v1_cart_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CartInfoReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CartInfoReply) ProtoMessage() {}\n\nfunc (x *CartInfoReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_v1_cart_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CartInfoReply.ProtoReflect.Descriptor instead.\nfunc (*CartInfoReply) Descriptor() ([]byte, []int) {\n\treturn file_cart_v1_cart_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CartInfoReply) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *CartInfoReply) GetUserId() int64 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *CartInfoReply) GetGoodsId() int64 {\n\tif x != nil {\n\t\treturn x.GoodsId\n\t}\n\treturn 0\n}\n\nfunc (x *CartInfoReply) GetGoodsSn() string {\n\tif x != nil {\n\t\treturn x.GoodsSn\n\t}\n\treturn \"\"\n}\n\nfunc (x *CartInfoReply) GetGoodsName() string {\n\tif x != nil {\n\t\treturn x.GoodsName\n\t}\n\treturn \"\"\n}\n\nfunc (x *CartInfoReply) GetSkuId() int64 {\n\tif x != nil {\n\t\treturn x.SkuId\n\t}\n\treturn 0\n}\n\nfunc (x *CartInfoReply) GetGoodsPrice() int64 {\n\tif x != nil {\n\t\treturn x.GoodsPrice\n\t}\n\treturn 0\n}\n\nfunc (x *CartInfoReply) GetGoodsNum() int32 {\n\tif x != nil {\n\t\treturn x.GoodsNum\n\t}\n\treturn 0\n}\n\nfunc (x *CartInfoReply) GetIsSelect() bool {\n\tif x != nil {\n\t\treturn x.IsSelect\n\t}\n\treturn false\n}\n\ntype CreateCartRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId         int64  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tUserId     int64  `protobuf:\"varint,2,opt,name=userId,proto3\" json:\"userId,omitempty\"`\n\tGoodsId    int64  `protobuf:\"varint,3,opt,name=goodsId,proto3\" json:\"goodsId,omitempty\"`\n\tGoodsSn    string `protobuf:\"bytes,4,opt,name=goodsSn,proto3\" json:\"goodsSn,omitempty\"`\n\tGoodsName  string `protobuf:\"bytes,5,opt,name=goodsName,proto3\" json:\"goodsName,omitempty\"`\n\tSkuId      int64  `protobuf:\"varint,6,opt,name=skuId,proto3\" json:\"skuId,omitempty\"`\n\tGoodsPrice int64  `protobuf:\"varint,7,opt,name=goodsPrice,proto3\" json:\"goodsPrice,omitempty\"`\n\tGoodsNum   int32  `protobuf:\"varint,8,opt,name=goodsNum,proto3\" json:\"goodsNum,omitempty\"`\n\tIsSelect   bool   `protobuf:\"varint,9,opt,name=isSelect,proto3\" json:\"isSelect,omitempty\"`\n}\n\nfunc (x *CreateCartRequest) Reset() {\n\t*x = CreateCartRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_v1_cart_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CreateCartRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreateCartRequest) ProtoMessage() {}\n\nfunc (x *CreateCartRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_v1_cart_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreateCartRequest.ProtoReflect.Descriptor instead.\nfunc (*CreateCartRequest) Descriptor() ([]byte, []int) {\n\treturn file_cart_v1_cart_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *CreateCartRequest) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *CreateCartRequest) GetUserId() int64 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *CreateCartRequest) GetGoodsId() int64 {\n\tif x != nil {\n\t\treturn x.GoodsId\n\t}\n\treturn 0\n}\n\nfunc (x *CreateCartRequest) GetGoodsSn() string {\n\tif x != nil {\n\t\treturn x.GoodsSn\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateCartRequest) GetGoodsName() string {\n\tif x != nil {\n\t\treturn x.GoodsName\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateCartRequest) GetSkuId() int64 {\n\tif x != nil {\n\t\treturn x.SkuId\n\t}\n\treturn 0\n}\n\nfunc (x *CreateCartRequest) GetGoodsPrice() int64 {\n\tif x != nil {\n\t\treturn x.GoodsPrice\n\t}\n\treturn 0\n}\n\nfunc (x *CreateCartRequest) GetGoodsNum() int32 {\n\tif x != nil {\n\t\treturn x.GoodsNum\n\t}\n\treturn 0\n}\n\nfunc (x *CreateCartRequest) GetIsSelect() bool {\n\tif x != nil {\n\t\treturn x.IsSelect\n\t}\n\treturn false\n}\n\ntype UpdateCartRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId       int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tGoodsNum int32 `protobuf:\"varint,2,opt,name=goodsNum,proto3\" json:\"goodsNum,omitempty\"`\n}\n\nfunc (x *UpdateCartRequest) Reset() {\n\t*x = UpdateCartRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_v1_cart_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *UpdateCartRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UpdateCartRequest) ProtoMessage() {}\n\nfunc (x *UpdateCartRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_v1_cart_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UpdateCartRequest.ProtoReflect.Descriptor instead.\nfunc (*UpdateCartRequest) Descriptor() ([]byte, []int) {\n\treturn file_cart_v1_cart_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *UpdateCartRequest) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *UpdateCartRequest) GetGoodsNum() int32 {\n\tif x != nil {\n\t\treturn x.GoodsNum\n\t}\n\treturn 0\n}\n\ntype UpdateCartReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *UpdateCartReply) Reset() {\n\t*x = UpdateCartReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_v1_cart_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *UpdateCartReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UpdateCartReply) ProtoMessage() {}\n\nfunc (x *UpdateCartReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_v1_cart_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UpdateCartReply.ProtoReflect.Descriptor instead.\nfunc (*UpdateCartReply) Descriptor() ([]byte, []int) {\n\treturn file_cart_v1_cart_proto_rawDescGZIP(), []int{3}\n}\n\ntype CheckResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tSuccess bool `protobuf:\"varint,1,opt,name=success,proto3\" json:\"success,omitempty\"`\n}\n\nfunc (x *CheckResponse) Reset() {\n\t*x = CheckResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_v1_cart_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CheckResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CheckResponse) ProtoMessage() {}\n\nfunc (x *CheckResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_v1_cart_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CheckResponse.ProtoReflect.Descriptor instead.\nfunc (*CheckResponse) Descriptor() ([]byte, []int) {\n\treturn file_cart_v1_cart_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *CheckResponse) GetSuccess() bool {\n\tif x != nil {\n\t\treturn x.Success\n\t}\n\treturn false\n}\n\ntype DeleteCartRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *DeleteCartRequest) Reset() {\n\t*x = DeleteCartRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_v1_cart_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *DeleteCartRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*DeleteCartRequest) ProtoMessage() {}\n\nfunc (x *DeleteCartRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_v1_cart_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use DeleteCartRequest.ProtoReflect.Descriptor instead.\nfunc (*DeleteCartRequest) Descriptor() ([]byte, []int) {\n\treturn file_cart_v1_cart_proto_rawDescGZIP(), []int{5}\n}\n\ntype DeleteCartReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *DeleteCartReply) Reset() {\n\t*x = DeleteCartReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_v1_cart_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *DeleteCartReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*DeleteCartReply) ProtoMessage() {}\n\nfunc (x *DeleteCartReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_v1_cart_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use DeleteCartReply.ProtoReflect.Descriptor instead.\nfunc (*DeleteCartReply) Descriptor() ([]byte, []int) {\n\treturn file_cart_v1_cart_proto_rawDescGZIP(), []int{6}\n}\n\ntype GetCartRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *GetCartRequest) Reset() {\n\t*x = GetCartRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_v1_cart_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetCartRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetCartRequest) ProtoMessage() {}\n\nfunc (x *GetCartRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_v1_cart_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetCartRequest.ProtoReflect.Descriptor instead.\nfunc (*GetCartRequest) Descriptor() ([]byte, []int) {\n\treturn file_cart_v1_cart_proto_rawDescGZIP(), []int{7}\n}\n\ntype GetCartReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *GetCartReply) Reset() {\n\t*x = GetCartReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_v1_cart_proto_msgTypes[8]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetCartReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetCartReply) ProtoMessage() {}\n\nfunc (x *GetCartReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_v1_cart_proto_msgTypes[8]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetCartReply.ProtoReflect.Descriptor instead.\nfunc (*GetCartReply) Descriptor() ([]byte, []int) {\n\treturn file_cart_v1_cart_proto_rawDescGZIP(), []int{8}\n}\n\ntype ListCartRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId int64 `protobuf:\"varint,1,opt,name=userId,proto3\" json:\"userId,omitempty\"`\n}\n\nfunc (x *ListCartRequest) Reset() {\n\t*x = ListCartRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_v1_cart_proto_msgTypes[9]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListCartRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListCartRequest) ProtoMessage() {}\n\nfunc (x *ListCartRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_v1_cart_proto_msgTypes[9]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListCartRequest.ProtoReflect.Descriptor instead.\nfunc (*ListCartRequest) Descriptor() ([]byte, []int) {\n\treturn file_cart_v1_cart_proto_rawDescGZIP(), []int{9}\n}\n\nfunc (x *ListCartRequest) GetUserId() int64 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype CartListReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tResults []*CartInfoReply `protobuf:\"bytes,1,rep,name=results,proto3\" json:\"results,omitempty\"`\n}\n\nfunc (x *CartListReply) Reset() {\n\t*x = CartListReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_v1_cart_proto_msgTypes[10]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CartListReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CartListReply) ProtoMessage() {}\n\nfunc (x *CartListReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_v1_cart_proto_msgTypes[10]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CartListReply.ProtoReflect.Descriptor instead.\nfunc (*CartListReply) Descriptor() ([]byte, []int) {\n\treturn file_cart_v1_cart_proto_rawDescGZIP(), []int{10}\n}\n\nfunc (x *CartListReply) GetResults() []*CartInfoReply {\n\tif x != nil {\n\t\treturn x.Results\n\t}\n\treturn nil\n}\n\nvar File_cart_v1_cart_proto protoreflect.FileDescriptor\n\nvar file_cart_v1_cart_proto_rawDesc = []byte{\n\t0x0a, 0x12, 0x63, 0x61, 0x72, 0x74, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x12, 0x07, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x76, 0x31, 0x1a, 0x17, 0x76,\n\t0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xf7, 0x01, 0x0a, 0x0d, 0x43, 0x61, 0x72, 0x74, 0x49,\n\t0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72,\n\t0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64,\n\t0x12, 0x18, 0x0a, 0x07, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x03, 0x52, 0x07, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x67, 0x6f,\n\t0x6f, 0x64, 0x73, 0x53, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x6f, 0x6f,\n\t0x64, 0x73, 0x53, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x4e, 0x61, 0x6d,\n\t0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x4e, 0x61,\n\t0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x6b, 0x75, 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28,\n\t0x03, 0x52, 0x05, 0x73, 0x6b, 0x75, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x67, 0x6f, 0x6f, 0x64,\n\t0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x67, 0x6f,\n\t0x6f, 0x64, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x67, 0x6f, 0x6f, 0x64,\n\t0x73, 0x4e, 0x75, 0x6d, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x67, 0x6f, 0x6f, 0x64,\n\t0x73, 0x4e, 0x75, 0x6d, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74,\n\t0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74,\n\t0x22, 0xc3, 0x02, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x61, 0x72, 0x74, 0x52,\n\t0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x20, 0x00, 0x52,\n\t0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x07, 0x67, 0x6f, 0x6f, 0x64, 0x73,\n\t0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x20,\n\t0x00, 0x52, 0x07, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x07, 0x67, 0x6f,\n\t0x6f, 0x64, 0x73, 0x53, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04,\n\t0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x53, 0x6e, 0x12, 0x25, 0x0a,\n\t0x09, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09,\n\t0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x67, 0x6f, 0x6f, 0x64, 0x73,\n\t0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x05, 0x73, 0x6b, 0x75, 0x49, 0x64, 0x18, 0x06, 0x20,\n\t0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x20, 0x00, 0x52, 0x05, 0x73, 0x6b,\n\t0x75, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0a, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x50, 0x72, 0x69, 0x63,\n\t0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x20, 0x00,\n\t0x52, 0x0a, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x08,\n\t0x67, 0x6f, 0x6f, 0x64, 0x73, 0x4e, 0x75, 0x6d, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07,\n\t0xfa, 0x42, 0x04, 0x1a, 0x02, 0x20, 0x00, 0x52, 0x08, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x4e, 0x75,\n\t0x6d, 0x12, 0x23, 0x0a, 0x08, 0x69, 0x73, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x18, 0x09, 0x20,\n\t0x01, 0x28, 0x08, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x6a, 0x02, 0x08, 0x01, 0x52, 0x08, 0x69, 0x73,\n\t0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x22, 0x3f, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,\n\t0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69,\n\t0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x67,\n\t0x6f, 0x6f, 0x64, 0x73, 0x4e, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x67,\n\t0x6f, 0x6f, 0x64, 0x73, 0x4e, 0x75, 0x6d, 0x22, 0x11, 0x0a, 0x0f, 0x55, 0x70, 0x64, 0x61, 0x74,\n\t0x65, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x29, 0x0a, 0x0d, 0x43, 0x68,\n\t0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73,\n\t0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75,\n\t0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x13, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43,\n\t0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x11, 0x0a, 0x0f, 0x44, 0x65,\n\t0x6c, 0x65, 0x74, 0x65, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x10, 0x0a,\n\t0x0e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22,\n\t0x0e, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22,\n\t0x29, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,\n\t0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x03, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x41, 0x0a, 0x0d, 0x43, 0x61,\n\t0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x30, 0x0a, 0x07, 0x72,\n\t0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63,\n\t0x61, 0x72, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52,\n\t0x65, 0x70, 0x6c, 0x79, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x32, 0x8a, 0x02,\n\t0x0a, 0x04, 0x43, 0x61, 0x72, 0x74, 0x12, 0x40, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,\n\t0x43, 0x61, 0x72, 0x74, 0x12, 0x1a, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43,\n\t0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x1a, 0x16, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x72, 0x74, 0x49,\n\t0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x40, 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61,\n\t0x74, 0x65, 0x43, 0x61, 0x72, 0x74, 0x12, 0x1a, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x76, 0x31,\n\t0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,\n\t0x73, 0x74, 0x1a, 0x16, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65,\n\t0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x0a, 0x44, 0x65,\n\t0x6c, 0x65, 0x74, 0x65, 0x43, 0x61, 0x72, 0x74, 0x12, 0x1a, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e,\n\t0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43,\n\t0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x08,\n\t0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x72, 0x74, 0x12, 0x18, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e,\n\t0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,\n\t0x73, 0x74, 0x1a, 0x16, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x72,\n\t0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x42, 0x15, 0x5a, 0x13, 0x63, 0x61,\n\t0x72, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x61, 0x72, 0x74, 0x2f, 0x76, 0x31, 0x3b, 0x76,\n\t0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_cart_v1_cart_proto_rawDescOnce sync.Once\n\tfile_cart_v1_cart_proto_rawDescData = file_cart_v1_cart_proto_rawDesc\n)\n\nfunc file_cart_v1_cart_proto_rawDescGZIP() []byte {\n\tfile_cart_v1_cart_proto_rawDescOnce.Do(func() {\n\t\tfile_cart_v1_cart_proto_rawDescData = protoimpl.X.CompressGZIP(file_cart_v1_cart_proto_rawDescData)\n\t})\n\treturn file_cart_v1_cart_proto_rawDescData\n}\n\nvar file_cart_v1_cart_proto_msgTypes = make([]protoimpl.MessageInfo, 11)\nvar file_cart_v1_cart_proto_goTypes = []interface{}{\n\t(*CartInfoReply)(nil),     // 0: cart.v1.CartInfoReply\n\t(*CreateCartRequest)(nil), // 1: cart.v1.CreateCartRequest\n\t(*UpdateCartRequest)(nil), // 2: cart.v1.UpdateCartRequest\n\t(*UpdateCartReply)(nil),   // 3: cart.v1.UpdateCartReply\n\t(*CheckResponse)(nil),     // 4: cart.v1.CheckResponse\n\t(*DeleteCartRequest)(nil), // 5: cart.v1.DeleteCartRequest\n\t(*DeleteCartReply)(nil),   // 6: cart.v1.DeleteCartReply\n\t(*GetCartRequest)(nil),    // 7: cart.v1.GetCartRequest\n\t(*GetCartReply)(nil),      // 8: cart.v1.GetCartReply\n\t(*ListCartRequest)(nil),   // 9: cart.v1.ListCartRequest\n\t(*CartListReply)(nil),     // 10: cart.v1.CartListReply\n}\nvar file_cart_v1_cart_proto_depIdxs = []int32{\n\t0,  // 0: cart.v1.CartListReply.results:type_name -> cart.v1.CartInfoReply\n\t1,  // 1: cart.v1.Cart.CreateCart:input_type -> cart.v1.CreateCartRequest\n\t2,  // 2: cart.v1.Cart.UpdateCart:input_type -> cart.v1.UpdateCartRequest\n\t5,  // 3: cart.v1.Cart.DeleteCart:input_type -> cart.v1.DeleteCartRequest\n\t9,  // 4: cart.v1.Cart.ListCart:input_type -> cart.v1.ListCartRequest\n\t0,  // 5: cart.v1.Cart.CreateCart:output_type -> cart.v1.CartInfoReply\n\t4,  // 6: cart.v1.Cart.UpdateCart:output_type -> cart.v1.CheckResponse\n\t4,  // 7: cart.v1.Cart.DeleteCart:output_type -> cart.v1.CheckResponse\n\t10, // 8: cart.v1.Cart.ListCart:output_type -> cart.v1.CartListReply\n\t5,  // [5:9] is the sub-list for method output_type\n\t1,  // [1:5] is the sub-list for method input_type\n\t1,  // [1:1] is the sub-list for extension type_name\n\t1,  // [1:1] is the sub-list for extension extendee\n\t0,  // [0:1] is the sub-list for field type_name\n}\n\nfunc init() { file_cart_v1_cart_proto_init() }\nfunc file_cart_v1_cart_proto_init() {\n\tif File_cart_v1_cart_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_cart_v1_cart_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CartInfoReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_v1_cart_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CreateCartRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_v1_cart_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*UpdateCartRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_v1_cart_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*UpdateCartReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_v1_cart_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CheckResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_v1_cart_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*DeleteCartRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_v1_cart_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*DeleteCartReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_v1_cart_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetCartRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_v1_cart_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetCartReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_v1_cart_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListCartRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_v1_cart_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CartListReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_cart_v1_cart_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   11,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_cart_v1_cart_proto_goTypes,\n\t\tDependencyIndexes: file_cart_v1_cart_proto_depIdxs,\n\t\tMessageInfos:      file_cart_v1_cart_proto_msgTypes,\n\t}.Build()\n\tFile_cart_v1_cart_proto = out.File\n\tfile_cart_v1_cart_proto_rawDesc = nil\n\tfile_cart_v1_cart_proto_goTypes = nil\n\tfile_cart_v1_cart_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "service/cart/api/cart/v1/cart.pb.validate.go",
    "content": "// Code generated by protoc-gen-validate. DO NOT EDIT.\n// source: cart/v1/cart.proto\n\npackage v1\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"net/mail\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"sort\"\n\t\"strings\"\n\t\"time\"\n\t\"unicode/utf8\"\n\n\t\"google.golang.org/protobuf/types/known/anypb\"\n)\n\n// ensure the imports are used\nvar (\n\t_ = bytes.MinRead\n\t_ = errors.New(\"\")\n\t_ = fmt.Print\n\t_ = utf8.UTFMax\n\t_ = (*regexp.Regexp)(nil)\n\t_ = (*strings.Reader)(nil)\n\t_ = net.IPv4len\n\t_ = time.Duration(0)\n\t_ = (*url.URL)(nil)\n\t_ = (*mail.Address)(nil)\n\t_ = anypb.Any{}\n\t_ = sort.Sort\n)\n\n// Validate checks the field values on CartInfoReply with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *CartInfoReply) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CartInfoReply with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in CartInfoReplyMultiError, or\n// nil if none found.\nfunc (m *CartInfoReply) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CartInfoReply) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for UserId\n\n\t// no validation rules for GoodsId\n\n\t// no validation rules for GoodsSn\n\n\t// no validation rules for GoodsName\n\n\t// no validation rules for SkuId\n\n\t// no validation rules for GoodsPrice\n\n\t// no validation rules for GoodsNum\n\n\t// no validation rules for IsSelect\n\n\tif len(errors) > 0 {\n\t\treturn CartInfoReplyMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CartInfoReplyMultiError is an error wrapping multiple validation errors\n// returned by CartInfoReply.ValidateAll() if the designated constraints\n// aren't met.\ntype CartInfoReplyMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CartInfoReplyMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CartInfoReplyMultiError) AllErrors() []error { return m }\n\n// CartInfoReplyValidationError is the validation error returned by\n// CartInfoReply.Validate if the designated constraints aren't met.\ntype CartInfoReplyValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CartInfoReplyValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CartInfoReplyValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CartInfoReplyValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CartInfoReplyValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CartInfoReplyValidationError) ErrorName() string { return \"CartInfoReplyValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e CartInfoReplyValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCartInfoReply.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CartInfoReplyValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CartInfoReplyValidationError{}\n\n// Validate checks the field values on CreateCartRequest with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *CreateCartRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CreateCartRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// CreateCartRequestMultiError, or nil if none found.\nfunc (m *CreateCartRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CreateCartRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\tif m.GetUserId() <= 0 {\n\t\terr := CreateCartRequestValidationError{\n\t\t\tfield:  \"UserId\",\n\t\t\treason: \"value must be greater than 0\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif m.GetGoodsId() <= 0 {\n\t\terr := CreateCartRequestValidationError{\n\t\t\tfield:  \"GoodsId\",\n\t\t\treason: \"value must be greater than 0\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetGoodsSn()) < 1 {\n\t\terr := CreateCartRequestValidationError{\n\t\t\tfield:  \"GoodsSn\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetGoodsName()) < 1 {\n\t\terr := CreateCartRequestValidationError{\n\t\t\tfield:  \"GoodsName\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif m.GetSkuId() <= 0 {\n\t\terr := CreateCartRequestValidationError{\n\t\t\tfield:  \"SkuId\",\n\t\t\treason: \"value must be greater than 0\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif m.GetGoodsPrice() <= 0 {\n\t\terr := CreateCartRequestValidationError{\n\t\t\tfield:  \"GoodsPrice\",\n\t\t\treason: \"value must be greater than 0\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif m.GetGoodsNum() <= 0 {\n\t\terr := CreateCartRequestValidationError{\n\t\t\tfield:  \"GoodsNum\",\n\t\t\treason: \"value must be greater than 0\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif m.GetIsSelect() != true {\n\t\terr := CreateCartRequestValidationError{\n\t\t\tfield:  \"IsSelect\",\n\t\t\treason: \"value must equal true\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn CreateCartRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CreateCartRequestMultiError is an error wrapping multiple validation errors\n// returned by CreateCartRequest.ValidateAll() if the designated constraints\n// aren't met.\ntype CreateCartRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CreateCartRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CreateCartRequestMultiError) AllErrors() []error { return m }\n\n// CreateCartRequestValidationError is the validation error returned by\n// CreateCartRequest.Validate if the designated constraints aren't met.\ntype CreateCartRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CreateCartRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CreateCartRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CreateCartRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CreateCartRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CreateCartRequestValidationError) ErrorName() string {\n\treturn \"CreateCartRequestValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e CreateCartRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCreateCartRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CreateCartRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CreateCartRequestValidationError{}\n\n// Validate checks the field values on UpdateCartRequest with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *UpdateCartRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on UpdateCartRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// UpdateCartRequestMultiError, or nil if none found.\nfunc (m *UpdateCartRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *UpdateCartRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for GoodsNum\n\n\tif len(errors) > 0 {\n\t\treturn UpdateCartRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// UpdateCartRequestMultiError is an error wrapping multiple validation errors\n// returned by UpdateCartRequest.ValidateAll() if the designated constraints\n// aren't met.\ntype UpdateCartRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m UpdateCartRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m UpdateCartRequestMultiError) AllErrors() []error { return m }\n\n// UpdateCartRequestValidationError is the validation error returned by\n// UpdateCartRequest.Validate if the designated constraints aren't met.\ntype UpdateCartRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e UpdateCartRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e UpdateCartRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e UpdateCartRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e UpdateCartRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e UpdateCartRequestValidationError) ErrorName() string {\n\treturn \"UpdateCartRequestValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e UpdateCartRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sUpdateCartRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = UpdateCartRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = UpdateCartRequestValidationError{}\n\n// Validate checks the field values on UpdateCartReply with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *UpdateCartReply) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on UpdateCartReply with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// UpdateCartReplyMultiError, or nil if none found.\nfunc (m *UpdateCartReply) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *UpdateCartReply) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\tif len(errors) > 0 {\n\t\treturn UpdateCartReplyMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// UpdateCartReplyMultiError is an error wrapping multiple validation errors\n// returned by UpdateCartReply.ValidateAll() if the designated constraints\n// aren't met.\ntype UpdateCartReplyMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m UpdateCartReplyMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m UpdateCartReplyMultiError) AllErrors() []error { return m }\n\n// UpdateCartReplyValidationError is the validation error returned by\n// UpdateCartReply.Validate if the designated constraints aren't met.\ntype UpdateCartReplyValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e UpdateCartReplyValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e UpdateCartReplyValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e UpdateCartReplyValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e UpdateCartReplyValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e UpdateCartReplyValidationError) ErrorName() string { return \"UpdateCartReplyValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e UpdateCartReplyValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sUpdateCartReply.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = UpdateCartReplyValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = UpdateCartReplyValidationError{}\n\n// Validate checks the field values on CheckResponse with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *CheckResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CheckResponse with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in CheckResponseMultiError, or\n// nil if none found.\nfunc (m *CheckResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CheckResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Success\n\n\tif len(errors) > 0 {\n\t\treturn CheckResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CheckResponseMultiError is an error wrapping multiple validation errors\n// returned by CheckResponse.ValidateAll() if the designated constraints\n// aren't met.\ntype CheckResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CheckResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CheckResponseMultiError) AllErrors() []error { return m }\n\n// CheckResponseValidationError is the validation error returned by\n// CheckResponse.Validate if the designated constraints aren't met.\ntype CheckResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CheckResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CheckResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CheckResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CheckResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CheckResponseValidationError) ErrorName() string { return \"CheckResponseValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e CheckResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCheckResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CheckResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CheckResponseValidationError{}\n\n// Validate checks the field values on DeleteCartRequest with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *DeleteCartRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on DeleteCartRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// DeleteCartRequestMultiError, or nil if none found.\nfunc (m *DeleteCartRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *DeleteCartRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\tif len(errors) > 0 {\n\t\treturn DeleteCartRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// DeleteCartRequestMultiError is an error wrapping multiple validation errors\n// returned by DeleteCartRequest.ValidateAll() if the designated constraints\n// aren't met.\ntype DeleteCartRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m DeleteCartRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m DeleteCartRequestMultiError) AllErrors() []error { return m }\n\n// DeleteCartRequestValidationError is the validation error returned by\n// DeleteCartRequest.Validate if the designated constraints aren't met.\ntype DeleteCartRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e DeleteCartRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e DeleteCartRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e DeleteCartRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e DeleteCartRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e DeleteCartRequestValidationError) ErrorName() string {\n\treturn \"DeleteCartRequestValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e DeleteCartRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sDeleteCartRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = DeleteCartRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = DeleteCartRequestValidationError{}\n\n// Validate checks the field values on DeleteCartReply with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *DeleteCartReply) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on DeleteCartReply with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// DeleteCartReplyMultiError, or nil if none found.\nfunc (m *DeleteCartReply) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *DeleteCartReply) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\tif len(errors) > 0 {\n\t\treturn DeleteCartReplyMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// DeleteCartReplyMultiError is an error wrapping multiple validation errors\n// returned by DeleteCartReply.ValidateAll() if the designated constraints\n// aren't met.\ntype DeleteCartReplyMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m DeleteCartReplyMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m DeleteCartReplyMultiError) AllErrors() []error { return m }\n\n// DeleteCartReplyValidationError is the validation error returned by\n// DeleteCartReply.Validate if the designated constraints aren't met.\ntype DeleteCartReplyValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e DeleteCartReplyValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e DeleteCartReplyValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e DeleteCartReplyValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e DeleteCartReplyValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e DeleteCartReplyValidationError) ErrorName() string { return \"DeleteCartReplyValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e DeleteCartReplyValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sDeleteCartReply.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = DeleteCartReplyValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = DeleteCartReplyValidationError{}\n\n// Validate checks the field values on GetCartRequest with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *GetCartRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on GetCartRequest with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in GetCartRequestMultiError,\n// or nil if none found.\nfunc (m *GetCartRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *GetCartRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\tif len(errors) > 0 {\n\t\treturn GetCartRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// GetCartRequestMultiError is an error wrapping multiple validation errors\n// returned by GetCartRequest.ValidateAll() if the designated constraints\n// aren't met.\ntype GetCartRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m GetCartRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m GetCartRequestMultiError) AllErrors() []error { return m }\n\n// GetCartRequestValidationError is the validation error returned by\n// GetCartRequest.Validate if the designated constraints aren't met.\ntype GetCartRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e GetCartRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e GetCartRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e GetCartRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e GetCartRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e GetCartRequestValidationError) ErrorName() string { return \"GetCartRequestValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e GetCartRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sGetCartRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = GetCartRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = GetCartRequestValidationError{}\n\n// Validate checks the field values on GetCartReply with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *GetCartReply) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on GetCartReply with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in GetCartReplyMultiError, or\n// nil if none found.\nfunc (m *GetCartReply) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *GetCartReply) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\tif len(errors) > 0 {\n\t\treturn GetCartReplyMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// GetCartReplyMultiError is an error wrapping multiple validation errors\n// returned by GetCartReply.ValidateAll() if the designated constraints aren't met.\ntype GetCartReplyMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m GetCartReplyMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m GetCartReplyMultiError) AllErrors() []error { return m }\n\n// GetCartReplyValidationError is the validation error returned by\n// GetCartReply.Validate if the designated constraints aren't met.\ntype GetCartReplyValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e GetCartReplyValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e GetCartReplyValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e GetCartReplyValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e GetCartReplyValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e GetCartReplyValidationError) ErrorName() string { return \"GetCartReplyValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e GetCartReplyValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sGetCartReply.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = GetCartReplyValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = GetCartReplyValidationError{}\n\n// Validate checks the field values on ListCartRequest with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *ListCartRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on ListCartRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// ListCartRequestMultiError, or nil if none found.\nfunc (m *ListCartRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *ListCartRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for UserId\n\n\tif len(errors) > 0 {\n\t\treturn ListCartRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// ListCartRequestMultiError is an error wrapping multiple validation errors\n// returned by ListCartRequest.ValidateAll() if the designated constraints\n// aren't met.\ntype ListCartRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m ListCartRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m ListCartRequestMultiError) AllErrors() []error { return m }\n\n// ListCartRequestValidationError is the validation error returned by\n// ListCartRequest.Validate if the designated constraints aren't met.\ntype ListCartRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e ListCartRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e ListCartRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e ListCartRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e ListCartRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e ListCartRequestValidationError) ErrorName() string { return \"ListCartRequestValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e ListCartRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sListCartRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = ListCartRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = ListCartRequestValidationError{}\n\n// Validate checks the field values on CartListReply with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *CartListReply) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CartListReply with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in CartListReplyMultiError, or\n// nil if none found.\nfunc (m *CartListReply) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CartListReply) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\tfor idx, item := range m.GetResults() {\n\t\t_, _ = idx, item\n\n\t\tif all {\n\t\t\tswitch v := interface{}(item).(type) {\n\t\t\tcase interface{ ValidateAll() error }:\n\t\t\t\tif err := v.ValidateAll(); err != nil {\n\t\t\t\t\terrors = append(errors, CartListReplyValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"Results[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\tcase interface{ Validate() error }:\n\t\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\t\terrors = append(errors, CartListReplyValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"Results[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t} else if v, ok := interface{}(item).(interface{ Validate() error }); ok {\n\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\treturn CartListReplyValidationError{\n\t\t\t\t\tfield:  fmt.Sprintf(\"Results[%v]\", idx),\n\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\tcause:  err,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn CartListReplyMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CartListReplyMultiError is an error wrapping multiple validation errors\n// returned by CartListReply.ValidateAll() if the designated constraints\n// aren't met.\ntype CartListReplyMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CartListReplyMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CartListReplyMultiError) AllErrors() []error { return m }\n\n// CartListReplyValidationError is the validation error returned by\n// CartListReply.Validate if the designated constraints aren't met.\ntype CartListReplyValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CartListReplyValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CartListReplyValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CartListReplyValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CartListReplyValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CartListReplyValidationError) ErrorName() string { return \"CartListReplyValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e CartListReplyValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCartListReply.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CartListReplyValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CartListReplyValidationError{}\n"
  },
  {
    "path": "service/cart/api/cart/v1/cart.proto",
    "content": "syntax = \"proto3\";\n\npackage cart.v1;\n\nimport \"validate/validate.proto\";\n\noption go_package = \"cart/api/cart/v1;v1\";\n\n// 购物车\nservice Cart {\n  rpc CreateCart (CreateCartRequest) returns (CartInfoReply); // 添加商品进购物车\n  rpc UpdateCart (UpdateCartRequest) returns (CheckResponse); // 修改购物车商品数量\n  rpc DeleteCart (DeleteCartRequest) returns (CheckResponse); // 删除购物车商品\n  rpc ListCart (ListCartRequest) returns (CartListReply); // 购物车商品列表\n}\n\nmessage CartInfoReply {\n  int64 id = 1;\n  int64 userId = 2;\n  int64 goodsId = 3;\n  string goodsSn = 4;\n  string goodsName = 5;\n  int64 skuId = 6;\n  int64 goodsPrice = 7;\n  int32 goodsNum = 8;\n  bool isSelect = 9;\n}\nmessage CreateCartRequest {\n  int64 id = 1;\n  int64 userId = 2 [(validate.rules).int64 = {gt:0}];\n  int64 goodsId = 3 [(validate.rules).int64 = {gt:0}];\n  string goodsSn = 4 [(validate.rules).string.min_len = 1];\n  string goodsName = 5 [(validate.rules).string.min_len = 1];\n  int64 skuId = 6 [(validate.rules).int64 = {gt:0}];\n  int64 goodsPrice = 7 [(validate.rules).int64 = {gt:0}];\n  int32 goodsNum = 8 [(validate.rules).int32 = {gt:0}];\n  bool isSelect = 9 [(validate.rules).bool.const = true];\n}\n\nmessage UpdateCartRequest {\n  int64 id = 1;\n  int32 goodsNum = 2;\n}\nmessage UpdateCartReply {}\n\nmessage CheckResponse{\n  bool success = 1;\n}\n\nmessage DeleteCartRequest {}\nmessage DeleteCartReply {}\n\nmessage GetCartRequest {}\nmessage GetCartReply {}\n\nmessage ListCartRequest {\n  int64 userId = 1;\n}\nmessage CartListReply {\n  repeated CartInfoReply results = 1;\n}"
  },
  {
    "path": "service/cart/api/cart/v1/cart_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.2.0\n// - protoc             v3.19.4\n// source: cart/v1/cart.proto\n\npackage v1\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\n// CartClient is the client API for Cart service.\n//\n// 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.\ntype CartClient interface {\n\tCreateCart(ctx context.Context, in *CreateCartRequest, opts ...grpc.CallOption) (*CartInfoReply, error)\n\tUpdateCart(ctx context.Context, in *UpdateCartRequest, opts ...grpc.CallOption) (*CheckResponse, error)\n\tDeleteCart(ctx context.Context, in *DeleteCartRequest, opts ...grpc.CallOption) (*CheckResponse, error)\n\tListCart(ctx context.Context, in *ListCartRequest, opts ...grpc.CallOption) (*CartListReply, error)\n}\n\ntype cartClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewCartClient(cc grpc.ClientConnInterface) CartClient {\n\treturn &cartClient{cc}\n}\n\nfunc (c *cartClient) CreateCart(ctx context.Context, in *CreateCartRequest, opts ...grpc.CallOption) (*CartInfoReply, error) {\n\tout := new(CartInfoReply)\n\terr := c.cc.Invoke(ctx, \"/cart.v1.Cart/CreateCart\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *cartClient) UpdateCart(ctx context.Context, in *UpdateCartRequest, opts ...grpc.CallOption) (*CheckResponse, error) {\n\tout := new(CheckResponse)\n\terr := c.cc.Invoke(ctx, \"/cart.v1.Cart/UpdateCart\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *cartClient) DeleteCart(ctx context.Context, in *DeleteCartRequest, opts ...grpc.CallOption) (*CheckResponse, error) {\n\tout := new(CheckResponse)\n\terr := c.cc.Invoke(ctx, \"/cart.v1.Cart/DeleteCart\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *cartClient) ListCart(ctx context.Context, in *ListCartRequest, opts ...grpc.CallOption) (*CartListReply, error) {\n\tout := new(CartListReply)\n\terr := c.cc.Invoke(ctx, \"/cart.v1.Cart/ListCart\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// CartServer is the server API for Cart service.\n// All implementations must embed UnimplementedCartServer\n// for forward compatibility\ntype CartServer interface {\n\tCreateCart(context.Context, *CreateCartRequest) (*CartInfoReply, error)\n\tUpdateCart(context.Context, *UpdateCartRequest) (*CheckResponse, error)\n\tDeleteCart(context.Context, *DeleteCartRequest) (*CheckResponse, error)\n\tListCart(context.Context, *ListCartRequest) (*CartListReply, error)\n\tmustEmbedUnimplementedCartServer()\n}\n\n// UnimplementedCartServer must be embedded to have forward compatible implementations.\ntype UnimplementedCartServer struct {\n}\n\nfunc (UnimplementedCartServer) CreateCart(context.Context, *CreateCartRequest) (*CartInfoReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method CreateCart not implemented\")\n}\nfunc (UnimplementedCartServer) UpdateCart(context.Context, *UpdateCartRequest) (*CheckResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method UpdateCart not implemented\")\n}\nfunc (UnimplementedCartServer) DeleteCart(context.Context, *DeleteCartRequest) (*CheckResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method DeleteCart not implemented\")\n}\nfunc (UnimplementedCartServer) ListCart(context.Context, *ListCartRequest) (*CartListReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method ListCart not implemented\")\n}\nfunc (UnimplementedCartServer) mustEmbedUnimplementedCartServer() {}\n\n// UnsafeCartServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to CartServer will\n// result in compilation errors.\ntype UnsafeCartServer interface {\n\tmustEmbedUnimplementedCartServer()\n}\n\nfunc RegisterCartServer(s grpc.ServiceRegistrar, srv CartServer) {\n\ts.RegisterService(&Cart_ServiceDesc, srv)\n}\n\nfunc _Cart_CreateCart_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(CreateCartRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(CartServer).CreateCart(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/cart.v1.Cart/CreateCart\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(CartServer).CreateCart(ctx, req.(*CreateCartRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Cart_UpdateCart_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(UpdateCartRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(CartServer).UpdateCart(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/cart.v1.Cart/UpdateCart\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(CartServer).UpdateCart(ctx, req.(*UpdateCartRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Cart_DeleteCart_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(DeleteCartRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(CartServer).DeleteCart(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/cart.v1.Cart/DeleteCart\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(CartServer).DeleteCart(ctx, req.(*DeleteCartRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Cart_ListCart_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(ListCartRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(CartServer).ListCart(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/cart.v1.Cart/ListCart\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(CartServer).ListCart(ctx, req.(*ListCartRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// Cart_ServiceDesc is the grpc.ServiceDesc for Cart service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar Cart_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"cart.v1.Cart\",\n\tHandlerType: (*CartServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"CreateCart\",\n\t\t\tHandler:    _Cart_CreateCart_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"UpdateCart\",\n\t\t\tHandler:    _Cart_UpdateCart_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"DeleteCart\",\n\t\t\tHandler:    _Cart_DeleteCart_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"ListCart\",\n\t\t\tHandler:    _Cart_ListCart_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"cart/v1/cart.proto\",\n}\n"
  },
  {
    "path": "service/cart/cmd/cart/main.go",
    "content": "package main\n\nimport (\n\t\"flag\"\n\t\"github.com/go-kratos/kratos/v2/registry\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/exporters/jaeger\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\ttracesdk \"go.opentelemetry.io/otel/sdk/trace\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.4.0\"\n\t\"os\"\n\n\t\"cart/internal/conf\"\n\t\"github.com/go-kratos/kratos/v2\"\n\t\"github.com/go-kratos/kratos/v2/config\"\n\t\"github.com/go-kratos/kratos/v2/config/file\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"github.com/go-kratos/kratos/v2/middleware/tracing\"\n\t\"github.com/go-kratos/kratos/v2/transport/grpc\"\n)\n\n// go build -ldflags \"-X main.Version=x.y.z\"\nvar (\n\t// Name is the name of the compiled software.\n\tName = \"shop.cart.service\"\n\t// Version is the version of the compiled software.\n\tVersion string\n\t// flagconf is the config flag.\n\tflagconf string\n\n\tid, _ = os.Hostname()\n)\n\nfunc init() {\n\tflag.StringVar(&flagconf, \"conf\", \"../../configs\", \"config path, eg: -conf config.yaml\")\n}\n\nfunc newApp(logger log.Logger, gs *grpc.Server, rr registry.Registrar) *kratos.App {\n\treturn kratos.New(\n\t\tkratos.ID(id+\"cart service\"),\n\t\tkratos.Name(Name),\n\t\tkratos.Version(Version),\n\t\tkratos.Metadata(map[string]string{}),\n\t\tkratos.Logger(logger),\n\t\tkratos.Server(\n\t\t\tgs,\n\t\t),\n\t\tkratos.Registrar(rr),\n\t)\n}\n\n\n// Set global trace provider\nfunc setTracerProvider(url string) error {\n\t// Create the Jaeger exporter\n\texp, err := jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(url)))\n\tif err != nil {\n\t\treturn err\n\t}\n\ttp := tracesdk.NewTracerProvider(\n\t\t// Set the sampling rate based on the parent span to 100%\n\t\ttracesdk.WithSampler(tracesdk.ParentBased(tracesdk.TraceIDRatioBased(1.0))),\n\t\t// Always be sure to batch in production.\n\t\ttracesdk.WithBatcher(exp),\n\t\t// Record information about this application in an Resource.\n\t\ttracesdk.WithResource(resource.NewSchemaless(\n\t\t\tsemconv.ServiceNameKey.String(Name),\n\t\t\tattribute.String(\"env\", \"dev\"),\n\t\t)),\n\t)\n\totel.SetTracerProvider(tp)\n\treturn nil\n}\n\nfunc main() {\n\tflag.Parse()\n\tlogger := log.With(log.NewStdLogger(os.Stdout),\n\t\t\"ts\", log.DefaultTimestamp,\n\t\t\"caller\", log.DefaultCaller,\n\t\t\"service.id\", id,\n\t\t\"service.name\", Name,\n\t\t\"service.version\", Version,\n\t\t\"trace_id\", tracing.TraceID(),\n\t\t\"span_id\", tracing.SpanID(),\n\t)\n\tc := config.New(\n\t\tconfig.WithSource(\n\t\t\tfile.NewSource(flagconf),\n\t\t),\n\t)\n\tdefer c.Close()\n\n\tif err := c.Load(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tvar bc conf.Bootstrap\n\tif err := c.Scan(&bc); err != nil {\n\t\tpanic(err)\n\t}\n\n\tif err := setTracerProvider(bc.Trace.Endpoint); err != nil {\n\t\tpanic(err)\n\t}\n\n\tvar rc conf.Registry\n\tif err := c.Scan(&rc); err != nil {\n\t\tpanic(err)\n\t}\n\n\tapp, cleanup, err := initApp(bc.Server, &rc, bc.Data, logger)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdefer cleanup()\n\n\t// start and wait for stop signal\n\tif err := app.Run(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "service/cart/cmd/cart/wire.go",
    "content": "// +build wireinject\n\n// The build tag makes sure the stub is not built in the final build.\n\npackage main\n\nimport (\n\t\"cart/internal/biz\"\n\t\"cart/internal/conf\"\n\t\"cart/internal/data\"\n\t\"cart/internal/server\"\n\t\"cart/internal/service\"\n\t\"github.com/go-kratos/kratos/v2\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"github.com/google/wire\"\n)\n\n// wireApp init kratos application.\nfunc initApp(*conf.Server,*conf.Registry, *conf.Data,  log.Logger) (*kratos.App, func(), error) {\n\tpanic(wire.Build(server.ProviderSet, data.ProviderSet, biz.ProviderSet, service.ProviderSet, newApp))\n}\n"
  },
  {
    "path": "service/cart/cmd/cart/wire_gen.go",
    "content": "// Code generated by Wire. DO NOT EDIT.\n\n//go:generate go run github.com/google/wire/cmd/wire\n//go:build !wireinject\n// +build !wireinject\n\npackage main\n\nimport (\n\t\"cart/internal/biz\"\n\t\"cart/internal/conf\"\n\t\"cart/internal/data\"\n\t\"cart/internal/server\"\n\t\"cart/internal/service\"\n\t\"github.com/go-kratos/kratos/v2\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n)\n\n// Injectors from wire.go:\n\n// wireApp init kratos application.\nfunc initApp(confServer *conf.Server, registry *conf.Registry, confData *conf.Data, logger log.Logger) (*kratos.App, func(), error) {\n\tdb := data.NewDB(confData)\n\tclient := data.NewRedis(confData)\n\tdataData, cleanup, err := data.NewData(confData, logger, db, client)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\tcartRepo := data.NewCartRepo(dataData, logger)\n\tcartUsecase := biz.NewCartUsecase(cartRepo, logger)\n\tcartService := service.NewCartService(cartUsecase)\n\tgrpcServer := server.NewGRPCServer(confServer, cartService, logger)\n\tregistrar := server.NewRegistrar(registry)\n\tapp := newApp(logger, grpcServer, registrar)\n\treturn app, func() {\n\t\tcleanup()\n\t}, nil\n}\n"
  },
  {
    "path": "service/cart/configs/config.yaml",
    "content": "server:\n  http:\n    addr: 0.0.0.0:8000\n    timeout: 1s\n  grpc:\n    addr: 0.0.0.0:50053\n    timeout: 1s\ndata:\n  database:\n    driver: mysql\n    source: root:root@tcp(127.0.0.1:3306)/shop_cart?charset=utf8mb4&parseTime=True&loc=Local\n  redis:\n    addr: 127.0.0.1:6379\n    dial_timeout: 1s\n    read_timeout: 0.2s\n    write_timeout: 0.2s\ntrace:\n  endpoint: http://127.0.0.1:14268/api/traces\n"
  },
  {
    "path": "service/cart/configs/registry.yaml",
    "content": "consul:\n    address: 127.0.0.1:8500\n    scheme: http"
  },
  {
    "path": "service/cart/go.mod",
    "content": "module cart\n\ngo 1.17\n\nrequire (\n\tgithub.com/envoyproxy/protoc-gen-validate v0.1.0\n\tgithub.com/go-kratos/kratos/contrib/registry/consul/v2 v2.0.0-20220414054820-d0b704b8f38d\n\tgithub.com/go-kratos/kratos/v2 v2.2.1\n\tgithub.com/go-redis/redis/extra/redisotel v0.3.0\n\tgithub.com/go-redis/redis/v8 v8.11.5\n\tgithub.com/google/wire v0.5.0\n\tgithub.com/hashicorp/consul/api v1.12.0\n\tgithub.com/onsi/ginkgo v1.16.5\n\tgithub.com/onsi/gomega v1.18.1\n\tgithub.com/ory/dockertest/v3 v3.8.1\n\tgithub.com/pkg/errors v0.9.1\n\tgo.opentelemetry.io/otel v1.6.3\n\tgo.opentelemetry.io/otel/exporters/jaeger v1.6.3\n\tgo.opentelemetry.io/otel/sdk v1.6.3\n\tgoogle.golang.org/grpc v1.44.0\n\tgoogle.golang.org/protobuf v1.27.1\n\tgorm.io/driver/mysql v1.3.3\n\tgorm.io/gorm v1.23.4\n)\n\nrequire (\n\tgithub.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 // indirect\n\tgithub.com/Microsoft/go-winio v0.5.1 // indirect\n\tgithub.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect\n\tgithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.1.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.1.2 // indirect\n\tgithub.com/containerd/continuity v0.0.0-20190827140505-75bee3e2ccb6 // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/docker/cli v20.10.11+incompatible // indirect\n\tgithub.com/docker/docker v20.10.7+incompatible // indirect\n\tgithub.com/docker/go-connections v0.4.0 // indirect\n\tgithub.com/docker/go-units v0.4.0 // indirect\n\tgithub.com/fatih/color v1.9.0 // indirect\n\tgithub.com/fsnotify/fsnotify v1.5.1 // indirect\n\tgithub.com/go-logr/logr v1.2.3 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/go-playground/form/v4 v4.2.0 // indirect\n\tgithub.com/go-redis/redis/extra/rediscmd v0.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.6.0 // indirect\n\tgithub.com/gogo/protobuf v1.3.2 // indirect\n\tgithub.com/golang/protobuf v1.5.2 // indirect\n\tgithub.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect\n\tgithub.com/google/uuid v1.3.0 // indirect\n\tgithub.com/gorilla/mux v1.8.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.1 // indirect\n\tgithub.com/hashicorp/go-hclog v0.12.0 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.0.0 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v0.5.0 // indirect\n\tgithub.com/hashicorp/serf v0.9.6 // indirect\n\tgithub.com/imdario/mergo v0.3.12 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.4 // indirect\n\tgithub.com/mattn/go-colorable v0.1.6 // indirect\n\tgithub.com/mattn/go-isatty v0.0.12 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.4.1 // indirect\n\tgithub.com/moby/term v0.0.0-20201216013528-df9cb8a40635 // indirect\n\tgithub.com/nxadm/tail v1.4.8 // indirect\n\tgithub.com/opencontainers/go-digest v1.0.0-rc1 // indirect\n\tgithub.com/opencontainers/image-spec v1.0.2 // indirect\n\tgithub.com/opencontainers/runc v1.0.2 // indirect\n\tgithub.com/sirupsen/logrus v1.8.1 // indirect\n\tgithub.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect\n\tgithub.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect\n\tgithub.com/xeipuuv/gojsonschema v1.2.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.6.3 // indirect\n\tgolang.org/x/net v0.0.0-20210428140749-89ef3d95e781 // indirect\n\tgolang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect\n\tgolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e // indirect\n\tgolang.org/x/text v0.3.6 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf // indirect\n\tgopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect\n\tgopkg.in/yaml.v2 v2.4.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect\n)\n"
  },
  {
    "path": "service/cart/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ngithub.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8=\ngithub.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/Microsoft/go-winio v0.5.1 h1:aPJp2QD7OOrhO5tQXqQoGSJc+DjDtWTGLOmNyAm6FgY=\ngithub.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=\ngithub.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw=\ngithub.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk=\ngithub.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=\ngithub.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8=\ngithub.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA=\ngithub.com/cenkalti/backoff/v4 v4.1.2 h1:6Yo7N8UP2K6LWZnW94DLVSSrbobcWdVzAYOisuDPIFo=\ngithub.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=\ngithub.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=\ngithub.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ=\ngithub.com/containerd/continuity v0.0.0-20190827140505-75bee3e2ccb6 h1:NmTXa/uVnDyp0TY5MKi197+3HWcnYWfnHGyaFthlnGw=\ngithub.com/containerd/continuity v0.0.0-20190827140505-75bee3e2ccb6/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=\ngithub.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=\ngithub.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=\ngithub.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw=\ngithub.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/docker/cli v20.10.11+incompatible h1:tXU1ezXcruZQRrMP8RN2z9N91h+6egZTS1gsPsKantc=\ngithub.com/docker/cli v20.10.11+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=\ngithub.com/docker/docker v20.10.7+incompatible h1:Z6O9Nhsjv+ayUEeI1IojKbYcsGdgYSNqxe1s2MYzUhQ=\ngithub.com/docker/docker v20.10.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=\ngithub.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=\ngithub.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=\ngithub.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw=\ngithub.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=\ngithub.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0 h1:EQciDnbrYxy13PgWoY8AqoxGiPrpgBZ1R8UNe3ddc+A=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=\ngithub.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=\ngithub.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=\ngithub.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI=\ngithub.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU=\ngithub.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=\ngithub.com/go-kratos/aegis v0.1.1/go.mod h1:jYeSQ3Gesba478zEnujOiG5QdsyF3Xk/8owFUeKcHxw=\ngithub.com/go-kratos/kratos/contrib/registry/consul/v2 v2.0.0-20220414054820-d0b704b8f38d h1:fLF0ALNq0KKahsDIJM7OcMwI0h+t4s7ONg1OzxIQ+5A=\ngithub.com/go-kratos/kratos/contrib/registry/consul/v2 v2.0.0-20220414054820-d0b704b8f38d/go.mod h1:CFHMR6oi+wIEdqxjH4TwKvPlMWUfRY3SMke9++r/dB8=\ngithub.com/go-kratos/kratos/v2 v2.2.1 h1:sm29txvyqiQw4v+MftnYWTMgEBjjzWHjrim8kaTVQWE=\ngithub.com/go-kratos/kratos/v2 v2.2.1/go.mod h1:yebXu5KMayLjXZzMTY5HWIPRDwcBehHpiNF/Ot8A2pA=\ngithub.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=\ngithub.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=\ngithub.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=\ngithub.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=\ngithub.com/go-playground/form/v4 v4.2.0 h1:N1wh+Goz61e6w66vo8vJkQt+uwZSoLz50kZPJWR8eic=\ngithub.com/go-playground/form/v4 v4.2.0/go.mod h1:q1a2BY+AQUUzhl6xA/6hBetay6dEIhMHjgvJiGo6K7U=\ngithub.com/go-redis/redis/extra/rediscmd v0.2.0 h1:A3bhCsCKsedClEH9/jYlcKqOuBoeeV+H0yDie5t+a6w=\ngithub.com/go-redis/redis/extra/rediscmd v0.2.0/go.mod h1:Z5bP1EHl9PvWhx/DupfCdZwB0JgOO3aVxWc/PFux+BE=\ngithub.com/go-redis/redis/extra/redisotel v0.3.0 h1:8rrizwFAUUeMgmelyiQi9KeFwmpQhay9E+/rE6qHsBM=\ngithub.com/go-redis/redis/extra/redisotel v0.3.0/go.mod h1:sGV3dQnPMBUuqzowEP2nZPhLXCMeh83nY64yaju249c=\ngithub.com/go-redis/redis/v8 v8.3.2/go.mod h1:jszGxBCez8QA1HWSmQxJO9Y82kNibbUmeYhKWrBejTU=\ngithub.com/go-redis/redis/v8 v8.5.0/go.mod h1:YmEcgBDttjnkbMzDAhDtQxY9yVA7jMN6PCR5HeMvqFE=\ngithub.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI=\ngithub.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo=\ngithub.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=\ngithub.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=\ngithub.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=\ngithub.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=\ngithub.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=\ngithub.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=\ngithub.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=\ngithub.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/wire v0.5.0 h1:I7ELFeVBr3yfPIcc8+MWvrjk+3VjbcSzoXm3JVa+jD8=\ngithub.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU=\ngithub.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=\ngithub.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=\ngithub.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=\ngithub.com/hashicorp/consul/api v1.9.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M=\ngithub.com/hashicorp/consul/api v1.12.0 h1:k3y1FYv6nuKyNTqj6w9gXOx5r5CfLj/k/euUeBXj1OY=\ngithub.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0=\ngithub.com/hashicorp/consul/sdk v0.8.0 h1:OJtKBtEjboEZvG6AOUdh4Z1Zbyu0WcxQ0qatRrZHTVU=\ngithub.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms=\ngithub.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-hclog v0.12.0 h1:d4QkX8FRTYaKaCZBoXYY8zJX2BXjWxurN/GA2tkrmZM=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/golang-lru v0.5.0 h1:CL2msUPvZTLb5O648aiLNJw3hnBxN2+1Jq8rCOH9wdo=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=\ngithub.com/hashicorp/memberlist v0.3.0 h1:8+567mCcFDnS5ADl7lrpxPMWiFCElyUEeW0gtj34fMA=\ngithub.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=\ngithub.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk=\ngithub.com/hashicorp/serf v0.9.6 h1:uuEX1kLR6aoda1TBttmJQKDLZE1Ob7KN0NPdE7EtCDc=\ngithub.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4=\ngithub.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=\ngithub.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=\ngithub.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.4 h1:tHnRBy1i5F2Dh8BAFxqFzxKqqvezXrL2OW1TnX+Mlas=\ngithub.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/lib/pq v0.0.0-20180327071824-d34b9ff171c2 h1:hRGSmZu7j271trc9sneMrpOW7GN5ngLm8YUZIPzf394=\ngithub.com/lib/pq v0.0.0-20180327071824-d34b9ff171c2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0=\ngithub.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A=\ngithub.com/moby/term v0.0.0-20201216013528-df9cb8a40635 h1:rzf0wL0CHVc8CEsgyygG0Mn9CNCCPZqOPaz8RiiHYQk=\ngithub.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc=\ngithub.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ=\ngithub.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=\ngithub.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=\ngithub.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=\ngithub.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=\ngithub.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=\ngithub.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=\ngithub.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg=\ngithub.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=\ngithub.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=\ngithub.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=\ngithub.com/onsi/ginkgo/v2 v2.0.0 h1:CcuG/HvWNkkaqCUpJifQY8z7qEMBJya6aLPx6ftGyjQ=\ngithub.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=\ngithub.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=\ngithub.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=\ngithub.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=\ngithub.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48=\ngithub.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=\ngithub.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE=\ngithub.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs=\ngithub.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ=\ngithub.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=\ngithub.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM=\ngithub.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=\ngithub.com/opencontainers/runc v1.0.2 h1:opHZMaswlyxz1OuGpBE53Dwe4/xF7EZTY0A2L/FpCOg=\ngithub.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0=\ngithub.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=\ngithub.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8=\ngithub.com/ory/dockertest/v3 v3.8.1 h1:vU/8d1We4qIad2YM0kOwRVtnyue7ExvacPiw1yDm17g=\ngithub.com/ory/dockertest/v3 v3.8.1/go.mod h1:wSRQ3wmkz+uSARYMk7kVJFDBGm8x5gSxIhI7NDc+BAQ=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=\ngithub.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo=\ngithub.com/shirou/gopsutil/v3 v3.21.8/go.mod h1:YWp/H8Qs5fVmf17v7JNZzA0mPJ+mS2e9JdiUF9LlKzQ=\ngithub.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=\ngithub.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=\ngithub.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=\ngithub.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=\ngithub.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=\ngithub.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=\ngithub.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=\ngithub.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs=\ngithub.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8=\ngithub.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=\ngithub.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE=\ngithub.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU=\ngithub.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c=\ngithub.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=\ngithub.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=\ngithub.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=\ngithub.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=\ngithub.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngo.opentelemetry.io/otel v0.13.0/go.mod h1:dlSNewoRYikTkotEnxdmuBHgzT+k/idJSfDv/FxEnOY=\ngo.opentelemetry.io/otel v0.16.0/go.mod h1:e4GKElweB8W2gWUqbghw0B8t5MCTccc9212eNHnOHwA=\ngo.opentelemetry.io/otel v0.17.0/go.mod h1:Oqtdxmf7UtEvL037ohlgnaYa1h7GtMh0NcSd9eqkC9s=\ngo.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs=\ngo.opentelemetry.io/otel v1.6.3 h1:FLOfo8f9JzFVFVyU+MSRJc2HdEAXQgm7pIv2uFKRSZE=\ngo.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI=\ngo.opentelemetry.io/otel/exporters/jaeger v1.6.3 h1:7tvBU1Ydbzq080efuepYYqC1Pv3/vOFBgCSrxLb24d0=\ngo.opentelemetry.io/otel/exporters/jaeger v1.6.3/go.mod h1:YgX3eZWbJzgrNyNHCK0otGreAMBTIAcObtZS2VRi6sU=\ngo.opentelemetry.io/otel/metric v0.17.0/go.mod h1:hUz9lH1rNXyEwWAhIWCMFWKhYtpASgSnObJFnU26dJ0=\ngo.opentelemetry.io/otel/oteltest v0.17.0/go.mod h1:JT/LGFxPwpN+nlsTiinSYjdIx3hZIGqHCpChcIZmdoE=\ngo.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs=\ngo.opentelemetry.io/otel/sdk v1.6.3 h1:prSHYdwCQOX5DrsEzxowH3nLhoAzEBdZhvrR79scfLs=\ngo.opentelemetry.io/otel/sdk v1.6.3/go.mod h1:A4iWF7HTXa+GWL/AaqESz28VuSBIcZ+0CV+IzJ5NMiQ=\ngo.opentelemetry.io/otel/trace v0.17.0/go.mod h1:bIujpqg6ZL6xUTubIUgziI1jSaUPthmabA/ygf/6Cfg=\ngo.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk=\ngo.opentelemetry.io/otel/trace v1.6.3 h1:IqN4L+5b0mPNjdXIiZ90Ni4Bl5BRkDQywePLWemd9bc=\ngo.opentelemetry.io/otel/trace v1.6.3/go.mod h1:GNJQusJlUgZl9/TQBPKU/Y/ty+0iVB5fjhKeJGZPGFs=\ngo.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=\ngolang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210428140749-89ef3d95e781 h1:DzZ89McO9/gWPsQXS/FVKAlG02ZjaQ6AlZRBimEYOd0=\ngolang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190422233926-fe54fb35175b/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=\ngoogle.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf h1:SVYXkUz2yZS9FWb2Gm8ivSlbNQzL2Z/NpPKE3RG2jWk=\ngoogle.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=\ngoogle.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=\ngoogle.golang.org/grpc v1.44.0 h1:weqSxi/TMs1SqFRMHCtBgXRs8k3X39QIDEZ0pRcttUg=\ngoogle.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=\ngopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=\ngopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.3.3 h1:jXG9ANrwBc4+bMvBcSl8zCfPBaVoPyBEBshA8dA93X8=\ngorm.io/driver/mysql v1.3.3/go.mod h1:ChK6AHbHgDCFZyJp0F+BmVGb06PSIoh9uVYKAlRbb2U=\ngorm.io/gorm v1.23.1/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=\ngorm.io/gorm v1.23.4 h1:1BKWM67O6CflSLcwGQR7ccfmC4ebOxQrTfOQGRE9wjg=\ngorm.io/gorm v1.23.4/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=\ngotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk=\ngotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0=\ngotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\n"
  },
  {
    "path": "service/cart/internal/biz/README.md",
    "content": "# Biz\n"
  },
  {
    "path": "service/cart/internal/biz/biz.go",
    "content": "package biz\n\nimport \"github.com/google/wire\"\n\n// ProviderSet is biz providers.\nvar ProviderSet = wire.NewSet(NewCartUsecase)\n"
  },
  {
    "path": "service/cart/internal/biz/cart.go",
    "content": "package biz\n\nimport (\n\t\"cart/internal/domain\"\n\t\"context\"\n\n\t\"github.com/go-kratos/kratos/v2/log\"\n)\n\ntype CartRepo interface {\n\tCreate(ctx context.Context, c *domain.ShopCart) (*domain.ShopCart, error)\n\tList(ctx context.Context, userId int64) (domain.ShopCartList, error)\n}\n\ntype CartUsecase struct {\n\trepo CartRepo\n\tlog  *log.Helper\n}\n\nfunc NewCartUsecase(repo CartRepo, logger log.Logger) *CartUsecase {\n\treturn &CartUsecase{repo: repo, log: log.NewHelper(logger)}\n}\n\nfunc (uc *CartUsecase) CreateCart(ctx context.Context, c *domain.ShopCart) (*domain.ShopCart, error) {\n\treturn uc.repo.Create(ctx, c)\n}\nfunc (uc *CartUsecase) List(ctx context.Context, userId int64) (domain.ShopCartList, error) {\n\treturn uc.repo.List(ctx, userId)\n}\n\nfunc (uc *CartUsecase) ListSelected(ctx context.Context, userId int64) (domain.ShopCartList, error) {\n\tres, err := uc.repo.List(ctx, userId)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tres = res.ListSelected()\n\treturn res, nil\n}\n"
  },
  {
    "path": "service/cart/internal/conf/conf.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.0\n// \tprotoc        v3.19.4\n// source: conf/conf.proto\n\npackage conf\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tdurationpb \"google.golang.org/protobuf/types/known/durationpb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Bootstrap struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tServer *Server `protobuf:\"bytes,1,opt,name=server,proto3\" json:\"server,omitempty\"`\n\tData   *Data   `protobuf:\"bytes,2,opt,name=data,proto3\" json:\"data,omitempty\"`\n\tTrace  *Trace  `protobuf:\"bytes,3,opt,name=trace,proto3\" json:\"trace,omitempty\"`\n}\n\nfunc (x *Bootstrap) Reset() {\n\t*x = Bootstrap{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_conf_conf_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Bootstrap) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Bootstrap) ProtoMessage() {}\n\nfunc (x *Bootstrap) ProtoReflect() protoreflect.Message {\n\tmi := &file_conf_conf_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Bootstrap.ProtoReflect.Descriptor instead.\nfunc (*Bootstrap) Descriptor() ([]byte, []int) {\n\treturn file_conf_conf_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Bootstrap) GetServer() *Server {\n\tif x != nil {\n\t\treturn x.Server\n\t}\n\treturn nil\n}\n\nfunc (x *Bootstrap) GetData() *Data {\n\tif x != nil {\n\t\treturn x.Data\n\t}\n\treturn nil\n}\n\nfunc (x *Bootstrap) GetTrace() *Trace {\n\tif x != nil {\n\t\treturn x.Trace\n\t}\n\treturn nil\n}\n\ntype Server struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tHttp *Server_HTTP `protobuf:\"bytes,1,opt,name=http,proto3\" json:\"http,omitempty\"`\n\tGrpc *Server_GRPC `protobuf:\"bytes,2,opt,name=grpc,proto3\" json:\"grpc,omitempty\"`\n}\n\nfunc (x *Server) Reset() {\n\t*x = Server{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_conf_conf_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Server) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Server) ProtoMessage() {}\n\nfunc (x *Server) ProtoReflect() protoreflect.Message {\n\tmi := &file_conf_conf_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Server.ProtoReflect.Descriptor instead.\nfunc (*Server) Descriptor() ([]byte, []int) {\n\treturn file_conf_conf_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Server) GetHttp() *Server_HTTP {\n\tif x != nil {\n\t\treturn x.Http\n\t}\n\treturn nil\n}\n\nfunc (x *Server) GetGrpc() *Server_GRPC {\n\tif x != nil {\n\t\treturn x.Grpc\n\t}\n\treturn nil\n}\n\ntype Data struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tDatabase *Data_Database `protobuf:\"bytes,1,opt,name=database,proto3\" json:\"database,omitempty\"`\n\tRedis    *Data_Redis    `protobuf:\"bytes,2,opt,name=redis,proto3\" json:\"redis,omitempty\"`\n}\n\nfunc (x *Data) Reset() {\n\t*x = Data{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_conf_conf_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Data) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Data) ProtoMessage() {}\n\nfunc (x *Data) ProtoReflect() protoreflect.Message {\n\tmi := &file_conf_conf_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Data.ProtoReflect.Descriptor instead.\nfunc (*Data) Descriptor() ([]byte, []int) {\n\treturn file_conf_conf_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *Data) GetDatabase() *Data_Database {\n\tif x != nil {\n\t\treturn x.Database\n\t}\n\treturn nil\n}\n\nfunc (x *Data) GetRedis() *Data_Redis {\n\tif x != nil {\n\t\treturn x.Redis\n\t}\n\treturn nil\n}\n\ntype Registry struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tConsul *Registry_Consul `protobuf:\"bytes,1,opt,name=consul,proto3\" json:\"consul,omitempty\"`\n}\n\nfunc (x *Registry) Reset() {\n\t*x = Registry{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_conf_conf_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Registry) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Registry) ProtoMessage() {}\n\nfunc (x *Registry) ProtoReflect() protoreflect.Message {\n\tmi := &file_conf_conf_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Registry.ProtoReflect.Descriptor instead.\nfunc (*Registry) Descriptor() ([]byte, []int) {\n\treturn file_conf_conf_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *Registry) GetConsul() *Registry_Consul {\n\tif x != nil {\n\t\treturn x.Consul\n\t}\n\treturn nil\n}\n\ntype Trace struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEndpoint string `protobuf:\"bytes,1,opt,name=endpoint,proto3\" json:\"endpoint,omitempty\"`\n}\n\nfunc (x *Trace) Reset() {\n\t*x = Trace{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_conf_conf_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Trace) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Trace) ProtoMessage() {}\n\nfunc (x *Trace) ProtoReflect() protoreflect.Message {\n\tmi := &file_conf_conf_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Trace.ProtoReflect.Descriptor instead.\nfunc (*Trace) Descriptor() ([]byte, []int) {\n\treturn file_conf_conf_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *Trace) GetEndpoint() string {\n\tif x != nil {\n\t\treturn x.Endpoint\n\t}\n\treturn \"\"\n}\n\ntype Server_HTTP struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tNetwork string               `protobuf:\"bytes,1,opt,name=network,proto3\" json:\"network,omitempty\"`\n\tAddr    string               `protobuf:\"bytes,2,opt,name=addr,proto3\" json:\"addr,omitempty\"`\n\tTimeout *durationpb.Duration `protobuf:\"bytes,3,opt,name=timeout,proto3\" json:\"timeout,omitempty\"`\n}\n\nfunc (x *Server_HTTP) Reset() {\n\t*x = Server_HTTP{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_conf_conf_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Server_HTTP) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Server_HTTP) ProtoMessage() {}\n\nfunc (x *Server_HTTP) ProtoReflect() protoreflect.Message {\n\tmi := &file_conf_conf_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Server_HTTP.ProtoReflect.Descriptor instead.\nfunc (*Server_HTTP) Descriptor() ([]byte, []int) {\n\treturn file_conf_conf_proto_rawDescGZIP(), []int{1, 0}\n}\n\nfunc (x *Server_HTTP) GetNetwork() string {\n\tif x != nil {\n\t\treturn x.Network\n\t}\n\treturn \"\"\n}\n\nfunc (x *Server_HTTP) GetAddr() string {\n\tif x != nil {\n\t\treturn x.Addr\n\t}\n\treturn \"\"\n}\n\nfunc (x *Server_HTTP) GetTimeout() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.Timeout\n\t}\n\treturn nil\n}\n\ntype Server_GRPC struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tNetwork string               `protobuf:\"bytes,1,opt,name=network,proto3\" json:\"network,omitempty\"`\n\tAddr    string               `protobuf:\"bytes,2,opt,name=addr,proto3\" json:\"addr,omitempty\"`\n\tTimeout *durationpb.Duration `protobuf:\"bytes,3,opt,name=timeout,proto3\" json:\"timeout,omitempty\"`\n}\n\nfunc (x *Server_GRPC) Reset() {\n\t*x = Server_GRPC{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_conf_conf_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Server_GRPC) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Server_GRPC) ProtoMessage() {}\n\nfunc (x *Server_GRPC) ProtoReflect() protoreflect.Message {\n\tmi := &file_conf_conf_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Server_GRPC.ProtoReflect.Descriptor instead.\nfunc (*Server_GRPC) Descriptor() ([]byte, []int) {\n\treturn file_conf_conf_proto_rawDescGZIP(), []int{1, 1}\n}\n\nfunc (x *Server_GRPC) GetNetwork() string {\n\tif x != nil {\n\t\treturn x.Network\n\t}\n\treturn \"\"\n}\n\nfunc (x *Server_GRPC) GetAddr() string {\n\tif x != nil {\n\t\treturn x.Addr\n\t}\n\treturn \"\"\n}\n\nfunc (x *Server_GRPC) GetTimeout() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.Timeout\n\t}\n\treturn nil\n}\n\ntype Data_Database struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tDriver string `protobuf:\"bytes,1,opt,name=driver,proto3\" json:\"driver,omitempty\"`\n\tSource string `protobuf:\"bytes,2,opt,name=source,proto3\" json:\"source,omitempty\"`\n}\n\nfunc (x *Data_Database) Reset() {\n\t*x = Data_Database{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_conf_conf_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Data_Database) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Data_Database) ProtoMessage() {}\n\nfunc (x *Data_Database) ProtoReflect() protoreflect.Message {\n\tmi := &file_conf_conf_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Data_Database.ProtoReflect.Descriptor instead.\nfunc (*Data_Database) Descriptor() ([]byte, []int) {\n\treturn file_conf_conf_proto_rawDescGZIP(), []int{2, 0}\n}\n\nfunc (x *Data_Database) GetDriver() string {\n\tif x != nil {\n\t\treturn x.Driver\n\t}\n\treturn \"\"\n}\n\nfunc (x *Data_Database) GetSource() string {\n\tif x != nil {\n\t\treturn x.Source\n\t}\n\treturn \"\"\n}\n\ntype Data_Redis struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tNetwork      string               `protobuf:\"bytes,1,opt,name=network,proto3\" json:\"network,omitempty\"`\n\tAddr         string               `protobuf:\"bytes,2,opt,name=addr,proto3\" json:\"addr,omitempty\"`\n\tPassword     string               `protobuf:\"bytes,3,opt,name=password,proto3\" json:\"password,omitempty\"`\n\tDb           int32                `protobuf:\"varint,4,opt,name=db,proto3\" json:\"db,omitempty\"`\n\tDialTimeout  *durationpb.Duration `protobuf:\"bytes,5,opt,name=dial_timeout,json=dialTimeout,proto3\" json:\"dial_timeout,omitempty\"`\n\tReadTimeout  *durationpb.Duration `protobuf:\"bytes,6,opt,name=read_timeout,json=readTimeout,proto3\" json:\"read_timeout,omitempty\"`\n\tWriteTimeout *durationpb.Duration `protobuf:\"bytes,7,opt,name=write_timeout,json=writeTimeout,proto3\" json:\"write_timeout,omitempty\"`\n}\n\nfunc (x *Data_Redis) Reset() {\n\t*x = Data_Redis{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_conf_conf_proto_msgTypes[8]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Data_Redis) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Data_Redis) ProtoMessage() {}\n\nfunc (x *Data_Redis) ProtoReflect() protoreflect.Message {\n\tmi := &file_conf_conf_proto_msgTypes[8]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Data_Redis.ProtoReflect.Descriptor instead.\nfunc (*Data_Redis) Descriptor() ([]byte, []int) {\n\treturn file_conf_conf_proto_rawDescGZIP(), []int{2, 1}\n}\n\nfunc (x *Data_Redis) GetNetwork() string {\n\tif x != nil {\n\t\treturn x.Network\n\t}\n\treturn \"\"\n}\n\nfunc (x *Data_Redis) GetAddr() string {\n\tif x != nil {\n\t\treturn x.Addr\n\t}\n\treturn \"\"\n}\n\nfunc (x *Data_Redis) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *Data_Redis) GetDb() int32 {\n\tif x != nil {\n\t\treturn x.Db\n\t}\n\treturn 0\n}\n\nfunc (x *Data_Redis) GetDialTimeout() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.DialTimeout\n\t}\n\treturn nil\n}\n\nfunc (x *Data_Redis) GetReadTimeout() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.ReadTimeout\n\t}\n\treturn nil\n}\n\nfunc (x *Data_Redis) GetWriteTimeout() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.WriteTimeout\n\t}\n\treturn nil\n}\n\ntype Registry_Consul struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tAddress string `protobuf:\"bytes,1,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tScheme  string `protobuf:\"bytes,2,opt,name=scheme,proto3\" json:\"scheme,omitempty\"`\n}\n\nfunc (x *Registry_Consul) Reset() {\n\t*x = Registry_Consul{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_conf_conf_proto_msgTypes[9]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Registry_Consul) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Registry_Consul) ProtoMessage() {}\n\nfunc (x *Registry_Consul) ProtoReflect() protoreflect.Message {\n\tmi := &file_conf_conf_proto_msgTypes[9]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Registry_Consul.ProtoReflect.Descriptor instead.\nfunc (*Registry_Consul) Descriptor() ([]byte, []int) {\n\treturn file_conf_conf_proto_rawDescGZIP(), []int{3, 0}\n}\n\nfunc (x *Registry_Consul) GetAddress() string {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn \"\"\n}\n\nfunc (x *Registry_Consul) GetScheme() string {\n\tif x != nil {\n\t\treturn x.Scheme\n\t}\n\treturn \"\"\n}\n\nvar File_conf_conf_proto protoreflect.FileDescriptor\n\nvar file_conf_conf_proto_rawDesc = []byte{\n\t0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x66, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x08, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x1a, 0x1e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x80, 0x01, 0x0a, 0x09,\n\t0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x12, 0x28, 0x0a, 0x06, 0x73, 0x65, 0x72,\n\t0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x61, 0x72, 0x74,\n\t0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x06, 0x73, 0x65, 0x72,\n\t0x76, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x61, 0x74,\n\t0x61, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x25, 0x0a, 0x05, 0x74, 0x72, 0x61, 0x63, 0x65,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x61, 0x70,\n\t0x69, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x52, 0x05, 0x74, 0x72, 0x61, 0x63, 0x65, 0x22, 0xb4,\n\t0x02, 0x0a, 0x06, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x29, 0x0a, 0x04, 0x68, 0x74, 0x74,\n\t0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x61,\n\t0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x52, 0x04,\n\t0x68, 0x74, 0x74, 0x70, 0x12, 0x29, 0x0a, 0x04, 0x67, 0x72, 0x70, 0x63, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65,\n\t0x72, 0x76, 0x65, 0x72, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x52, 0x04, 0x67, 0x72, 0x70, 0x63, 0x1a,\n\t0x69, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f,\n\t0x72, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72,\n\t0x6b, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x1a, 0x69, 0x0a, 0x04, 0x47, 0x52,\n\t0x50, 0x43, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04,\n\t0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72,\n\t0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x74, 0x69,\n\t0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0xc3, 0x03, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x33,\n\t0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x17, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x61, 0x74, 0x61,\n\t0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62,\n\t0x61, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x72, 0x65, 0x64, 0x69, 0x73, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x61,\n\t0x74, 0x61, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x52, 0x05, 0x72, 0x65, 0x64, 0x69, 0x73, 0x1a,\n\t0x3a, 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64,\n\t0x72, 0x69, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x72, 0x69,\n\t0x76, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0x9d, 0x02, 0x0a, 0x05,\n\t0x52, 0x65, 0x64, 0x69, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12,\n\t0x12, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61,\n\t0x64, 0x64, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18,\n\t0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12,\n\t0x0e, 0x0a, 0x02, 0x64, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x64, 0x62, 0x12,\n\t0x3c, 0x0a, 0x0c, 0x64, 0x69, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18,\n\t0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x52, 0x0b, 0x64, 0x69, 0x61, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x3c, 0x0a,\n\t0x0c, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x06, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b,\n\t0x72, 0x65, 0x61, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x3e, 0x0a, 0x0d, 0x77,\n\t0x72, 0x69, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x07, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x77,\n\t0x72, 0x69, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0x79, 0x0a, 0x08, 0x52,\n\t0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x12, 0x31, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x73, 0x75,\n\t0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x61,\n\t0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x73,\n\t0x75, 0x6c, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x1a, 0x3a, 0x0a, 0x06, 0x43, 0x6f,\n\t0x6e, 0x73, 0x75, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16,\n\t0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,\n\t0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x22, 0x23, 0x0a, 0x05, 0x54, 0x72, 0x61, 0x63, 0x65, 0x12,\n\t0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x42, 0x19, 0x5a, 0x17, 0x63,\n\t0x61, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x63, 0x6f, 0x6e,\n\t0x66, 0x3b, 0x63, 0x6f, 0x6e, 0x66, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_conf_conf_proto_rawDescOnce sync.Once\n\tfile_conf_conf_proto_rawDescData = file_conf_conf_proto_rawDesc\n)\n\nfunc file_conf_conf_proto_rawDescGZIP() []byte {\n\tfile_conf_conf_proto_rawDescOnce.Do(func() {\n\t\tfile_conf_conf_proto_rawDescData = protoimpl.X.CompressGZIP(file_conf_conf_proto_rawDescData)\n\t})\n\treturn file_conf_conf_proto_rawDescData\n}\n\nvar file_conf_conf_proto_msgTypes = make([]protoimpl.MessageInfo, 10)\nvar file_conf_conf_proto_goTypes = []interface{}{\n\t(*Bootstrap)(nil),           // 0: cart.api.Bootstrap\n\t(*Server)(nil),              // 1: cart.api.Server\n\t(*Data)(nil),                // 2: cart.api.Data\n\t(*Registry)(nil),            // 3: cart.api.Registry\n\t(*Trace)(nil),               // 4: cart.api.Trace\n\t(*Server_HTTP)(nil),         // 5: cart.api.Server.HTTP\n\t(*Server_GRPC)(nil),         // 6: cart.api.Server.GRPC\n\t(*Data_Database)(nil),       // 7: cart.api.Data.Database\n\t(*Data_Redis)(nil),          // 8: cart.api.Data.Redis\n\t(*Registry_Consul)(nil),     // 9: cart.api.Registry.Consul\n\t(*durationpb.Duration)(nil), // 10: google.protobuf.Duration\n}\nvar file_conf_conf_proto_depIdxs = []int32{\n\t1,  // 0: cart.api.Bootstrap.server:type_name -> cart.api.Server\n\t2,  // 1: cart.api.Bootstrap.data:type_name -> cart.api.Data\n\t4,  // 2: cart.api.Bootstrap.trace:type_name -> cart.api.Trace\n\t5,  // 3: cart.api.Server.http:type_name -> cart.api.Server.HTTP\n\t6,  // 4: cart.api.Server.grpc:type_name -> cart.api.Server.GRPC\n\t7,  // 5: cart.api.Data.database:type_name -> cart.api.Data.Database\n\t8,  // 6: cart.api.Data.redis:type_name -> cart.api.Data.Redis\n\t9,  // 7: cart.api.Registry.consul:type_name -> cart.api.Registry.Consul\n\t10, // 8: cart.api.Server.HTTP.timeout:type_name -> google.protobuf.Duration\n\t10, // 9: cart.api.Server.GRPC.timeout:type_name -> google.protobuf.Duration\n\t10, // 10: cart.api.Data.Redis.dial_timeout:type_name -> google.protobuf.Duration\n\t10, // 11: cart.api.Data.Redis.read_timeout:type_name -> google.protobuf.Duration\n\t10, // 12: cart.api.Data.Redis.write_timeout:type_name -> google.protobuf.Duration\n\t13, // [13:13] is the sub-list for method output_type\n\t13, // [13:13] is the sub-list for method input_type\n\t13, // [13:13] is the sub-list for extension type_name\n\t13, // [13:13] is the sub-list for extension extendee\n\t0,  // [0:13] is the sub-list for field type_name\n}\n\nfunc init() { file_conf_conf_proto_init() }\nfunc file_conf_conf_proto_init() {\n\tif File_conf_conf_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_conf_conf_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Bootstrap); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_conf_conf_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Server); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_conf_conf_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Data); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_conf_conf_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Registry); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_conf_conf_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Trace); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_conf_conf_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Server_HTTP); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_conf_conf_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Server_GRPC); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_conf_conf_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Data_Database); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_conf_conf_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Data_Redis); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_conf_conf_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Registry_Consul); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_conf_conf_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   10,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_conf_conf_proto_goTypes,\n\t\tDependencyIndexes: file_conf_conf_proto_depIdxs,\n\t\tMessageInfos:      file_conf_conf_proto_msgTypes,\n\t}.Build()\n\tFile_conf_conf_proto = out.File\n\tfile_conf_conf_proto_rawDesc = nil\n\tfile_conf_conf_proto_goTypes = nil\n\tfile_conf_conf_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "service/cart/internal/conf/conf.proto",
    "content": "syntax = \"proto3\";\npackage cart.api;\n\noption go_package = \"cart/internal/conf;conf\";\n\nimport \"google/protobuf/duration.proto\";\n\nmessage Bootstrap {\n  Server server = 1;\n  Data data = 2;\n  Trace trace = 3;\n}\n\nmessage Server {\n  message HTTP {\n    string network = 1;\n    string addr = 2;\n    google.protobuf.Duration timeout = 3;\n  }\n  message GRPC {\n    string network = 1;\n    string addr = 2;\n    google.protobuf.Duration timeout = 3;\n  }\n  HTTP http = 1;\n  GRPC grpc = 2;\n}\n\nmessage Data {\n  message Database {\n    string driver = 1;\n    string source = 2;\n  }\n  message Redis {\n    string network = 1;\n    string addr = 2;\n    string password = 3;\n    int32 db = 4;\n    google.protobuf.Duration dial_timeout = 5;\n    google.protobuf.Duration read_timeout = 6;\n    google.protobuf.Duration write_timeout = 7;\n  }\n  Database database = 1;\n  Redis redis = 2;\n}\n\nmessage Registry {\n  message Consul {\n    string address = 1;\n    string scheme = 2;\n  }\n  Consul consul = 1;\n}\n\nmessage Trace {\n  string endpoint = 1;\n}"
  },
  {
    "path": "service/cart/internal/data/README.md",
    "content": "# Data\n"
  },
  {
    "path": "service/cart/internal/data/cart.go",
    "content": "package data\n\nimport (\n\t\"cart/internal/domain\"\n\t\"context\"\n\t\"time\"\n\n\t\"github.com/go-kratos/kratos/v2/errors\"\n\t\"gorm.io/gorm\"\n\n\t\"cart/internal/biz\"\n\n\t\"github.com/go-kratos/kratos/v2/log\"\n)\n\ntype ShopCart struct {\n\tID         int64          `gorm:\"primarykey;type:int\" json:\"id\"`\n\tUserId     int64          `gorm:\"type:int;not null;comment:用户id\" json:\"user_id\"`\n\tGoodsId    int64          `gorm:\"type:int;not null;comment:商品id\" json:\"goods_id\"`\n\tSkuId      int64          `gorm:\"type:int;not null;comment:sku_id\" json:\"sku_id\"`\n\tGoodsPrice int64          `gorm:\"type:int;not null;comment:商品价格\" json:\"goods_price\"`\n\tGoodsNum   int32          `gorm:\"type:int;not null;comment:商品数量\" json:\"goods_num\"`\n\tGoodsSn    string         `gorm:\"type:varchar(500);default:;comment:商品编号\"`\n\tGoodsName  string         `gorm:\"type:varchar(500);default:;comment:商品名称\"`\n\tIsSelect   bool           `gorm:\"type:tinyint;comment:是否选中;default:false\" json:\"is_select\"`\n\tCreatedAt  time.Time      `gorm:\"column:add_time\" json:\"created_at\"`\n\tUpdatedAt  time.Time      `gorm:\"column:update_time\" json:\"updated_at\"`\n\tDeletedAt  gorm.DeletedAt `json:\"deleted_at\"`\n}\n\ntype cartRepo struct {\n\tdata *Data\n\tlog  *log.Helper\n}\n\nfunc NewCartRepo(data *Data, logger log.Logger) biz.CartRepo {\n\treturn &cartRepo{\n\t\tdata: data,\n\t\tlog:  log.NewHelper(logger),\n\t}\n}\n\nfunc (p *ShopCart) ToDomain() *domain.ShopCart {\n\treturn &domain.ShopCart{\n\t\tID:         p.ID,\n\t\tUserId:     p.UserId,\n\t\tGoodsId:    p.GoodsId,\n\t\tSkuId:      p.SkuId,\n\t\tGoodsPrice: p.GoodsPrice,\n\t\tGoodsNum:   p.GoodsNum,\n\t\tGoodsSn:    p.GoodsSn,\n\t\tGoodsName:  p.GoodsName,\n\t\tIsSelect:   p.IsSelect,\n\t}\n}\n\nfunc (r *cartRepo) Create(ctx context.Context, c *domain.ShopCart) (*domain.ShopCart, error) {\n\tvar shopCart ShopCart\n\tif result := r.data.db.Where(&ShopCart{UserId: c.UserId, SkuId: c.SkuId}).First(&shopCart); result.RowsAffected == 1 {\n\t\tshopCart.GoodsNum += c.GoodsNum\n\t} else {\n\t\tshopCart.UserId = c.UserId\n\t\tshopCart.GoodsId = c.GoodsId\n\t\tshopCart.SkuId = c.SkuId\n\t\tshopCart.GoodsPrice = c.GoodsPrice\n\t\tshopCart.GoodsNum = c.GoodsNum\n\t\tshopCart.GoodsSn = c.GoodsSn\n\t\tshopCart.GoodsName = c.GoodsName\n\t\tshopCart.IsSelect = c.IsSelect\n\t}\n\n\tif result := r.data.db.Save(&shopCart); result.Error != nil {\n\t\treturn nil, errors.InternalServer(\"CREATE_CART_NOT_FOUND\", \"创建购物车失败\")\n\t}\n\n\treturn shopCart.ToDomain(), nil\n}\n\nfunc (r *cartRepo) List(ctx context.Context, userId int64) (domain.ShopCartList, error) {\n\tvar shopCarts []ShopCart\n\tif result := r.data.db.Where(&ShopCart{UserId: userId}).Find(&shopCarts); result.Error != nil {\n\t\treturn nil, errors.InternalServer(\"SELECT_CART_ERROR\", \"用户购物车列表查询失败\")\n\t} else {\n\t\tvar rsp domain.ShopCartList\n\n\t\tfor _, cart := range shopCarts {\n\t\t\trsp = append(rsp, cart.ToDomain())\n\t\t}\n\t\treturn rsp, nil\n\t}\n}\n"
  },
  {
    "path": "service/cart/internal/data/cart_test.go",
    "content": "package data_test\n\nimport (\n\t\"cart/internal/biz\"\n\t\"cart/internal/data\"\n\t\"cart/internal/domain\"\n\n\t. \"github.com/onsi/ginkgo\"\n\t. \"github.com/onsi/gomega\"\n)\n\nvar _ = Describe(\"Cart\", func() {\n\tvar ro biz.CartRepo\n\tBeforeEach(func() {\n\t\tro = data.NewCartRepo(Db, nil)\n\t})\n\t// 设置 It 块来添加单个规格\n\tIt(\"CreateCart\", func() {\n\t\tcartData := domain.ShopCart{\n\t\t\tUserId:     1,\n\t\t\tGoodsId:    1,\n\t\t\tSkuId:      1,\n\t\t\tGoodsPrice: 1000,\n\t\t\tGoodsNum:   10,\n\t\t\tGoodsSn:    \"20232232231\",\n\t\t\tGoodsName:  \"Mate 40 Pro\",\n\t\t\tIsSelect:   true,\n\t\t}\n\t\tc, err := ro.Create(ctx, &cartData)\n\t\tΩ(err).ShouldNot(HaveOccurred())\n\t\tΩ(c.UserId).Should(Equal(int64(1)))\n\t\tΩ(c.GoodsNum).Should(Equal(int32(10)))\n\n\t\t// 二次验证创建相同商品的数据，只增加商品数量\n\t\tcartData2 := domain.ShopCart{\n\t\t\tUserId:     1,\n\t\t\tGoodsId:    1,\n\t\t\tSkuId:      1,\n\t\t\tGoodsPrice: 1000,\n\t\t\tGoodsNum:   10,\n\t\t\tGoodsSn:    \"20232232231\",\n\t\t\tGoodsName:  \"Mate 40 Pro\",\n\t\t\tIsSelect:   true,\n\t\t}\n\t\tc2, err := ro.Create(ctx, &cartData2)\n\t\tΩ(err).ShouldNot(HaveOccurred())\n\t\tΩ(c2.UserId).Should(Equal(int64(1)))\n\t\tΩ(c2.GoodsNum).Should(Equal(int32(20)))\n\t})\n\n})\n"
  },
  {
    "path": "service/cart/internal/data/data.go",
    "content": "package data\n\nimport (\n\t\"cart/internal/conf\"\n\tslog \"log\"\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/go-redis/redis/v8\"\n\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"github.com/go-redis/redis/extra/redisotel\"\n\t\"github.com/google/wire\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n\t\"gorm.io/gorm/logger\"\n\t\"gorm.io/gorm/schema\"\n)\n\n// ProviderSet is data providers.\nvar ProviderSet = wire.NewSet(\n\tNewData,\n\tNewDB, NewRedis, NewCartRepo,\n)\n\ntype Data struct {\n\tdb  *gorm.DB\n\trdb *redis.Client\n}\n\n// NewData .\nfunc NewData(c *conf.Data, logger log.Logger, db *gorm.DB, rdb *redis.Client) (*Data, func(), error) {\n\tcleanup := func() {\n\t\tlog.NewHelper(logger).Info(\"closing the data resources\")\n\t}\n\treturn &Data{\n\t\tdb:  db,\n\t\trdb: rdb,\n\t}, cleanup, nil\n}\n\n// NewDB .\nfunc NewDB(c *conf.Data) *gorm.DB {\n\t// 终端打印输入 sql 执行记录\n\tnewLogger := logger.New(\n\t\tslog.New(os.Stdout, \"\\r\\n\", slog.LstdFlags), // io writer\n\t\tlogger.Config{\n\t\t\tSlowThreshold: time.Second, // 慢查询 SQL 阈值\n\t\t\tColorful:      true,        // 禁用彩色打印\n\t\t\t//IgnoreRecordNotFoundError: false,\n\t\t\tLogLevel: logger.Info, // Log lever\n\t\t},\n\t)\n\n\tdb, err := gorm.Open(mysql.Open(c.Database.Source), &gorm.Config{\n\t\tLogger:                                   newLogger,\n\t\tDisableForeignKeyConstraintWhenMigrating: true,\n\t\tNamingStrategy:                           schema.NamingStrategy{\n\t\t\t//SingularTable: true, // 表名是否加 s\n\t\t},\n\t})\n\n\tif err != nil {\n\t\tlog.Errorf(\"failed opening connection to sqlite: %v\", err)\n\t\tpanic(\"failed to connect database\")\n\t}\n\t_ = db.AutoMigrate(&ShopCart{})\n\treturn db\n}\n\nfunc NewRedis(c *conf.Data) *redis.Client {\n\trdb := redis.NewClient(&redis.Options{\n\t\tAddr:         c.Redis.Addr,\n\t\tPassword:     c.Redis.Password,\n\t\tDB:           int(c.Redis.Db),\n\t\tDialTimeout:  c.Redis.DialTimeout.AsDuration(),\n\t\tWriteTimeout: c.Redis.WriteTimeout.AsDuration(),\n\t\tReadTimeout:  c.Redis.ReadTimeout.AsDuration(),\n\t})\n\trdb.AddHook(redisotel.TracingHook{})\n\tif err := rdb.Close(); err != nil {\n\t\tlog.Error(err)\n\t}\n\treturn rdb\n}\n"
  },
  {
    "path": "service/cart/internal/data/data_suite_test.go",
    "content": "package data_test\n\nimport (\n\t\"cart/internal/conf\"\n\t\"cart/internal/data\"\n\t\"context\"\n\t\"github.com/pkg/errors\"\n\t\"gorm.io/gorm\"\n\t\"testing\"\n\n\t. \"github.com/onsi/ginkgo\"\n\t. \"github.com/onsi/gomega\"\n)\n\n// 测试 data 方法\nfunc TestData(t *testing.T) {\n\t//  Ginkgo 测试通过调用 Fail(description string) 功能来表示失败\n\t// 使用 RegisterFailHandler 将此函数传递给 Gomega 。这是 Ginkgo 和 Gomega 之间的唯一连接点\n\tRegisterFailHandler(Fail)\n\t// 通知 Ginkgo 启动测试套件。如果您的任何 specs 失败，Ginkgo 将自动使 testing.T 失败。\n\tRunSpecs(t, \"biz data test user\")\n}\n\nvar cleaner func()      // 定义删除 mysql 容器的回调函数\nvar Db *data.Data       // 用于测试的 data\nvar ctx context.Context // 上下文\n\n// initialize  AutoMigrate gorm自动建表\nfunc initialize(db *gorm.DB) error {\n\terr := db.AutoMigrate(\n\t\t&data.ShopCart{},\n\t)\n\treturn errors.WithStack(err)\n}\n\n// ginkgo 使用 BeforeEach 为您的 Specs 设置状态\nvar _ = BeforeSuite(func() {\n\t// 执行测试数据库操作之前，链接之前 docker 容器创建的 mysql\n\t//con, f := data.DockerMysql(\"mysql\", \"latest\")\n\tcon, f := data.DockerMysql(\"mariadb\", \"latest\")\n\tcleaner = f // 测试完成，关闭容器的回调方法\n\tconfig := &conf.Data{Database: &conf.Data_Database{Driver: \"mysql\", Source: con}}\n\tdb := data.NewDB(config)\n\tmySQLDb, _, err := data.NewData(config, nil, db, nil)\n\tif err != nil {\n\t\treturn\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\tDb = mySQLDb\n\terr = initialize(db)\n\tif err != nil {\n\t\treturn\n\t}\n\tExpect(err).NotTo(HaveOccurred())\n})\n\n// 测试结束后 通过回调函数，关闭并删除 docker 创建的容器\nvar _ = AfterSuite(func() {\n\tcleaner()\n})\n"
  },
  {
    "path": "service/cart/internal/data/docker_mysql.go",
    "content": "package data\n\nimport (\n\t\"database/sql\"\n\t\"fmt\"\n\t\"github.com/ory/dockertest/v3\"\n\t\"log\"\n\t\"time\"\n)\n\nfunc DockerMysql(img, version string) (string, func()) {\n\treturn innerDockerMysql(img, version)\n}\n\nfunc innerDockerMysql(img, version string) (string, func()) {\n\t// uses a sensible default on windows (tcp/http) and linux/osx (socket)\n\tpool, err := dockertest.NewPool(\"\")\n\tpool.MaxWait = time.Minute * 2\n\tif err != nil {\n\t\tlog.Fatalf(\"Could not connect to docker: %s\", err)\n\t}\n\t//time.Sleep(time.Second * 20)\n\t// pulls an image, creates a container based on it and runs it\n\tresource, err := pool.Run(img, version, []string{\"MYSQL_ROOT_PASSWORD=secret\", \"MYSQL_ROOT_HOST=%\"})\n\tif err != nil {\n\t\tlog.Fatalf(\"Could not start resource: %s\", err)\n\t}\n\n\tconStr := fmt.Sprintf(\"root:secret@(localhost:%s)/mysql?parseTime=true\", resource.GetPort(\"3306/tcp\"))\n\t// exponential backoff-retry, because the application in the container might not be ready to accept connections yet\n\tif err := pool.Retry(func() error {\n\t\tvar err error\n\t\tdb, err := sql.Open(\"mysql\", conStr)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn db.Ping()\n\t}); err != nil {\n\t\tlog.Fatalf(\"Could not connect to docker: %s\", err)\n\t}\n\n\t// 关闭容器\n\treturn conStr, func() {\n\t\tif err = pool.Purge(resource); err != nil {\n\t\t\tlog.Fatalf(\"Could not purge resource: %s\", err)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "service/cart/internal/domain/cart.go",
    "content": "package domain\n\ntype ShopCart struct {\n\tID         int64\n\tUserId     int64\n\tGoodsId    int64\n\tSkuId      int64\n\tGoodsPrice int64\n\tGoodsNum   int32\n\tGoodsSn    string\n\tGoodsName  string\n\tIsSelect   bool\n}\n\ntype ShopCartList []*ShopCart\n\nfunc (p ShopCartList) ListSelected() ShopCartList {\n\tvar list ShopCartList\n\tfor _, cart := range p {\n\t\tif cart.IsSelect == true {\n\t\t\tlist = append(list, cart)\n\t\t}\n\t}\n\treturn list\n}\n"
  },
  {
    "path": "service/cart/internal/server/grpc.go",
    "content": "package server\n\nimport (\n\tv1 \"cart/api/cart/v1\"\n\t\"cart/internal/conf\"\n\t\"cart/internal/service\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"github.com/go-kratos/kratos/v2/middleware/recovery\"\n\t\"github.com/go-kratos/kratos/v2/middleware/validate\"\n\t\"github.com/go-kratos/kratos/v2/transport/grpc\"\n)\n\n// NewGRPCServer new a gRPC s.\nfunc NewGRPCServer(c *conf.Server, greeter *service.CartService, logger log.Logger) *grpc.Server {\n\tvar opts = []grpc.ServerOption{\n\t\tgrpc.Middleware(\n\t\t\trecovery.Recovery(),\n\t\t\tvalidate.Validator(),\n\t\t),\n\t}\n\tif c.Grpc.Network != \"\" {\n\t\topts = append(opts, grpc.Network(c.Grpc.Network))\n\t}\n\tif c.Grpc.Addr != \"\" {\n\t\topts = append(opts, grpc.Address(c.Grpc.Addr))\n\t}\n\tif c.Grpc.Timeout != nil {\n\t\topts = append(opts, grpc.Timeout(c.Grpc.Timeout.AsDuration()))\n\t}\n\tsrv := grpc.NewServer(opts...)\n\tv1.RegisterCartServer(srv, greeter)\n\treturn srv\n}\n"
  },
  {
    "path": "service/cart/internal/server/server.go",
    "content": "package server\n\nimport (\n\t\"cart/internal/conf\"\n\t\"github.com/go-kratos/kratos/v2/registry\"\n\t\"github.com/google/wire\"\n\n\tconsul \"github.com/go-kratos/kratos/contrib/registry/consul/v2\"\n\tconsulAPI \"github.com/hashicorp/consul/api\"\n)\n\n// ProviderSet is s providers.\nvar ProviderSet = wire.NewSet(NewGRPCServer, NewRegistrar)\n\n// NewRegistrar 引入 consul\nfunc NewRegistrar(conf *conf.Registry) registry.Registrar {\n\tc := consulAPI.DefaultConfig()\n\tc.Address = conf.Consul.Address\n\tc.Scheme = conf.Consul.Scheme\n\n\tcli, err := consulAPI.NewClient(c)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tr := consul.New(cli, consul.WithHealthCheck(false))\n\treturn r\n}\n"
  },
  {
    "path": "service/cart/internal/service/README.md",
    "content": "# Service\n"
  },
  {
    "path": "service/cart/internal/service/cart.go",
    "content": "package service\n\nimport (\n\t\"cart/internal/biz\"\n\t\"cart/internal/domain\"\n\t\"context\"\n\n\tv1 \"cart/api/cart/v1\"\n)\n\ntype CartService struct {\n\tv1.UnimplementedCartServer\n\tcart *biz.CartUsecase\n}\n\nfunc NewCartService(cart *biz.CartUsecase) *CartService {\n\treturn &CartService{cart: cart}\n}\n\nfunc (s *CartService) CreateCart(ctx context.Context, req *v1.CreateCartRequest) (*v1.CartInfoReply, error) {\n\n\trv, err := s.cart.CreateCart(ctx, &domain.ShopCart{\n\t\tUserId:     req.UserId,\n\t\tGoodsId:    req.GoodsId,\n\t\tSkuId:      req.SkuId,\n\t\tGoodsPrice: req.GoodsPrice,\n\t\tGoodsNum:   req.GoodsNum,\n\t\tGoodsSn:    req.GoodsSn,\n\t\tGoodsName:  req.GoodsName,\n\t\tIsSelect:   req.IsSelect,\n\t})\n\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &v1.CartInfoReply{\n\t\tId:         rv.ID,\n\t\tUserId:     rv.UserId,\n\t\tGoodsId:    rv.GoodsId,\n\t\tGoodsSn:    rv.GoodsSn,\n\t\tGoodsName:  rv.GoodsName,\n\t\tSkuId:      rv.SkuId,\n\t\tGoodsPrice: rv.GoodsPrice,\n\t\tGoodsNum:   rv.GoodsNum,\n\t\tIsSelect:   rv.IsSelect,\n\t}, nil\n}\n\nfunc (s *CartService) ListCart(ctx context.Context, req *v1.ListCartRequest) (*v1.CartListReply, error) {\n\tres, err := s.cart.List(ctx, req.UserId)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvar rsp v1.CartListReply\n\n\tfor _, cart := range res {\n\t\trsp.Results = append(rsp.Results, &v1.CartInfoReply{\n\t\t\tId:         cart.ID,\n\t\t\tUserId:     cart.UserId,\n\t\t\tGoodsId:    cart.GoodsId,\n\t\t\tGoodsSn:    cart.GoodsSn,\n\t\t\tGoodsName:  cart.GoodsName,\n\t\t\tSkuId:      cart.SkuId,\n\t\t\tGoodsPrice: cart.GoodsPrice,\n\t\t\tGoodsNum:   cart.GoodsNum,\n\t\t\tIsSelect:   cart.IsSelect,\n\t\t})\n\t}\n\n\treturn &rsp, nil\n}\n\n//func (s *CartService) UpdateCart(ctx context.Context, req *pb.UpdateCartRequest) (*pb.UpdateCartReply, error) {\n//\treturn &pb.UpdateCartReply{}, nil\n//}\n//func (s *CartService) DeleteCart(ctx context.Context, req *pb.DeleteCartRequest) (*pb.DeleteCartReply, error) {\n//\treturn &pb.DeleteCartReply{}, nil\n//}\n//func (s *CartService) GetCart(ctx context.Context, req *pb.GetCartRequest) (*pb.GetCartReply, error) {\n//\treturn &pb.GetCartReply{}, nil\n//}\n"
  },
  {
    "path": "service/cart/internal/service/service.go",
    "content": "package service\n\nimport \"github.com/google/wire\"\n\n// ProviderSet is service providers.\nvar ProviderSet = wire.NewSet(NewCartService)\n"
  },
  {
    "path": "service/cart/openapi.yaml",
    "content": "# Generated with protoc-gen-openapi\n# https://github.com/google/gnostic/tree/master/apps/protoc-gen-openapi\n\nopenapi: 3.0.3\ninfo:\n    title: \"\"\n    version: 0.0.1\npaths: {}\ncomponents:\n    schemas: {}\n"
  },
  {
    "path": "service/cart/third_party/README.md",
    "content": "# third_party\n"
  },
  {
    "path": "service/cart/third_party/errors/errors.proto",
    "content": "syntax = \"proto3\";\n\npackage errors;\n\noption go_package = \"github.com/go-kratos/kratos/v2/errors;errors\";\noption java_multiple_files = true;\noption java_package = \"com.github.kratos.errors\";\noption objc_class_prefix = \"KratosErrors\";\n\nimport \"google/protobuf/descriptor.proto\";\n\nextend google.protobuf.EnumOptions {\n  int32 default_code = 1108;\n}\n\nextend google.protobuf.EnumValueOptions {\n  int32 code = 1109;\n}"
  },
  {
    "path": "service/cart/third_party/google/api/annotations.proto",
    "content": "// Copyright (c) 2015, Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\npackage google.api;\n\nimport \"google/api/http.proto\";\nimport \"google/protobuf/descriptor.proto\";\n\noption go_package = \"google.golang.org/genproto/googleapis/api/annotations;annotations\";\noption java_multiple_files = true;\noption java_outer_classname = \"AnnotationsProto\";\noption java_package = \"com.google.api\";\noption objc_class_prefix = \"GAPI\";\n\nextend google.protobuf.MethodOptions {\n  // See `HttpRule`.\n  HttpRule http = 72295728;\n}\n"
  },
  {
    "path": "service/cart/third_party/google/api/client.proto",
    "content": "// Copyright 2019 Google LLC.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\npackage google.api;\n\nimport \"google/protobuf/descriptor.proto\";\n\noption go_package = \"google.golang.org/genproto/googleapis/api/annotations;annotations\";\noption java_multiple_files = true;\noption java_outer_classname = \"ClientProto\";\noption java_package = \"com.google.api\";\noption objc_class_prefix = \"GAPI\";\n\n\nextend google.protobuf.ServiceOptions {\n  // The hostname for this service.\n  // This should be specified with no prefix or protocol.\n  //\n  // Example:\n  //\n  //   service Foo {\n  //     option (google.api.default_host) = \"foo.googleapi.com\";\n  //     ...\n  //   }\n  string default_host = 1049;\n\n  // OAuth scopes needed for the client.\n  //\n  // Example:\n  //\n  //   service Foo {\n  //     option (google.api.oauth_scopes) = \\\n  //       \"https://www.googleapis.com/auth/cloud-platform\";\n  //     ...\n  //   }\n  //\n  // If there is more than one scope, use a comma-separated string:\n  //\n  // Example:\n  //\n  //   service Foo {\n  //     option (google.api.oauth_scopes) = \\\n  //       \"https://www.googleapis.com/auth/cloud-platform,\"\n  //       \"https://www.googleapis.com/auth/monitoring\";\n  //     ...\n  //   }\n  string oauth_scopes = 1050;\n}\n\n\nextend google.protobuf.MethodOptions {\n  // A definition of a client library method signature.\n  //\n  // In client libraries, each proto RPC corresponds to one or more methods\n  // which the end user is able to call, and calls the underlying RPC.\n  // Normally, this method receives a single argument (a struct or instance\n  // corresponding to the RPC request object). Defining this field will\n  // add one or more overloads providing flattened or simpler method signatures\n  // in some languages.\n  //\n  // The fields on the method signature are provided as a comma-separated\n  // string.\n  //\n  // For example, the proto RPC and annotation:\n  //\n  //   rpc CreateSubscription(CreateSubscriptionRequest)\n  //       returns (Subscription) {\n  //     option (google.api.method_signature) = \"name,topic\";\n  //   }\n  //\n  // Would add the following Java overload (in addition to the method accepting\n  // the request object):\n  //\n  //   public final Subscription createSubscription(String name, String topic)\n  //\n  // The following backwards-compatibility guidelines apply:\n  //\n  //   * Adding this annotation to an unannotated method is backwards\n  //     compatible.\n  //   * Adding this annotation to a method which already has existing\n  //     method signature annotations is backwards compatible if and only if\n  //     the new method signature annotation is last in the sequence.\n  //   * Modifying or removing an existing method signature annotation is\n  //     a breaking change.\n  //   * Re-ordering existing method signature annotations is a breaking\n  //     change.\n  repeated string method_signature = 1051;\n}"
  },
  {
    "path": "service/cart/third_party/google/api/field_behavior.proto",
    "content": "// Copyright 2019 Google LLC.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\npackage google.api;\n\nimport \"google/protobuf/descriptor.proto\";\n\noption go_package = \"google.golang.org/genproto/googleapis/api/annotations;annotations\";\noption java_multiple_files = true;\noption java_outer_classname = \"FieldBehaviorProto\";\noption java_package = \"com.google.api\";\noption objc_class_prefix = \"GAPI\";\n\n\n// An indicator of the behavior of a given field (for example, that a field\n// is required in requests, or given as output but ignored as input).\n// This **does not** change the behavior in protocol buffers itself; it only\n// denotes the behavior and may affect how API tooling handles the field.\n//\n// Note: This enum **may** receive new values in the future.\nenum FieldBehavior {\n  // Conventional default for enums. Do not use this.\n  FIELD_BEHAVIOR_UNSPECIFIED = 0;\n\n  // Specifically denotes a field as optional.\n  // While all fields in protocol buffers are optional, this may be specified\n  // for emphasis if appropriate.\n  OPTIONAL = 1;\n\n  // Denotes a field as required.\n  // This indicates that the field **must** be provided as part of the request,\n  // and failure to do so will cause an error (usually `INVALID_ARGUMENT`).\n  REQUIRED = 2;\n\n  // Denotes a field as output only.\n  // This indicates that the field is provided in responses, but including the\n  // field in a request does nothing (the server *must* ignore it and\n  // *must not* throw an error as a result of the field's presence).\n  OUTPUT_ONLY = 3;\n\n  // Denotes a field as input only.\n  // This indicates that the field is provided in requests, and the\n  // corresponding field is not included in output.\n  INPUT_ONLY = 4;\n\n  // Denotes a field as immutable.\n  // This indicates that the field may be set once in a request to create a\n  // resource, but may not be changed thereafter.\n  IMMUTABLE = 5;\n}\n\n\nextend google.protobuf.FieldOptions {\n  // A designation of a specific field behavior (required, output only, etc.)\n  // in protobuf messages.\n  //\n  // Examples:\n  //\n  //   string name = 1 [(google.api.field_behavior) = REQUIRED];\n  //   State state = 1 [(google.api.field_behavior) = OUTPUT_ONLY];\n  //   google.protobuf.Duration ttl = 1\n  //     [(google.api.field_behavior) = INPUT_ONLY];\n  //   google.protobuf.Timestamp expire_time = 1\n  //     [(google.api.field_behavior) = OUTPUT_ONLY,\n  //      (google.api.field_behavior) = IMMUTABLE];\n  repeated FieldBehavior field_behavior = 1052;\n}"
  },
  {
    "path": "service/cart/third_party/google/api/http.proto",
    "content": "// Copyright 2020 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\npackage google.api;\n\noption cc_enable_arenas = true;\noption go_package = \"google.golang.org/genproto/googleapis/api/annotations;annotations\";\noption java_multiple_files = true;\noption java_outer_classname = \"HttpProto\";\noption java_package = \"com.google.api\";\noption objc_class_prefix = \"GAPI\";\n\n// Defines the HTTP configuration for an API service. It contains a list of\n// [HttpRule][google.api.HttpRule], each specifying the mapping of an RPC method\n// to one or more HTTP REST API methods.\nmessage Http {\n  // A list of HTTP configuration rules that apply to individual API methods.\n  //\n  // **NOTE:** All service configuration rules follow \"last one wins\" order.\n  repeated HttpRule rules = 1;\n\n  // When set to true, URL path parameters will be fully URI-decoded except in\n  // cases of single segment matches in reserved expansion, where \"%2F\" will be\n  // left encoded.\n  //\n  // The default behavior is to not decode RFC 6570 reserved characters in multi\n  // segment matches.\n  bool fully_decode_reserved_expansion = 2;\n}\n\n// # gRPC Transcoding\n//\n// gRPC Transcoding is a feature for mapping between a gRPC method and one or\n// more HTTP REST endpoints. It allows developers to build a single API service\n// that supports both gRPC APIs and REST APIs. Many systems, including [Google\n// APIs](https://github.com/googleapis/googleapis),\n// [Cloud Endpoints](https://cloud.google.com/endpoints), [gRPC\n// Gateway](https://github.com/grpc-ecosystem/grpc-gateway),\n// and [Envoy](https://github.com/envoyproxy/envoy) proxy support this feature\n// and use it for large scale production services.\n//\n// `HttpRule` defines the schema of the gRPC/REST mapping. The mapping specifies\n// how different portions of the gRPC request message are mapped to the URL\n// path, URL query parameters, and HTTP request body. It also controls how the\n// gRPC response message is mapped to the HTTP response body. `HttpRule` is\n// typically specified as an `google.api.http` annotation on the gRPC method.\n//\n// Each mapping specifies a URL path template and an HTTP method. The path\n// template may refer to one or more fields in the gRPC request message, as long\n// as each field is a non-repeated field with a primitive (non-message) type.\n// The path template controls how fields of the request message are mapped to\n// the URL path.\n//\n// Example:\n//\n//     service Messaging {\n//       rpc GetMessage(GetMessageRequest) returns (Message) {\n//         option (google.api.http) = {\n//             get: \"/v1/{name=messages/*}\"\n//         };\n//       }\n//     }\n//     message GetMessageRequest {\n//       string name = 1; // Mapped to URL path.\n//     }\n//     message Message {\n//       string text = 1; // The resource content.\n//     }\n//\n// This enables an HTTP REST to gRPC mapping as below:\n//\n// HTTP | gRPC\n// -----|-----\n// `GET /v1/messages/123456`  | `GetMessage(name: \"messages/123456\")`\n//\n// Any fields in the request message which are not bound by the path template\n// automatically become HTTP query parameters if there is no HTTP request body.\n// For example:\n//\n//     service Messaging {\n//       rpc GetMessage(GetMessageRequest) returns (Message) {\n//         option (google.api.http) = {\n//             get:\"/v1/messages/{message_id}\"\n//         };\n//       }\n//     }\n//     message GetMessageRequest {\n//       message SubMessage {\n//         string subfield = 1;\n//       }\n//       string message_id = 1; // Mapped to URL path.\n//       int64 revision = 2;    // Mapped to URL query parameter `revision`.\n//       SubMessage sub = 3;    // Mapped to URL query parameter `sub.subfield`.\n//     }\n//\n// This enables a HTTP JSON to RPC mapping as below:\n//\n// HTTP | gRPC\n// -----|-----\n// `GET /v1/messages/123456?revision=2&sub.subfield=foo` |\n// `GetMessage(message_id: \"123456\" revision: 2 sub: SubMessage(subfield:\n// \"foo\"))`\n//\n// Note that fields which are mapped to URL query parameters must have a\n// primitive type or a repeated primitive type or a non-repeated message type.\n// In the case of a repeated type, the parameter can be repeated in the URL\n// as `...?param=A&param=B`. In the case of a message type, each field of the\n// message is mapped to a separate parameter, such as\n// `...?foo.a=A&foo.b=B&foo.c=C`.\n//\n// For HTTP methods that allow a request body, the `body` field\n// specifies the mapping. Consider a REST update method on the\n// message resource collection:\n//\n//     service Messaging {\n//       rpc UpdateMessage(UpdateMessageRequest) returns (Message) {\n//         option (google.api.http) = {\n//           patch: \"/v1/messages/{message_id}\"\n//           body: \"message\"\n//         };\n//       }\n//     }\n//     message UpdateMessageRequest {\n//       string message_id = 1; // mapped to the URL\n//       Message message = 2;   // mapped to the body\n//     }\n//\n// The following HTTP JSON to RPC mapping is enabled, where the\n// representation of the JSON in the request body is determined by\n// protos JSON encoding:\n//\n// HTTP | gRPC\n// -----|-----\n// `PATCH /v1/messages/123456 { \"text\": \"Hi!\" }` | `UpdateMessage(message_id:\n// \"123456\" message { text: \"Hi!\" })`\n//\n// The special name `*` can be used in the body mapping to define that\n// every field not bound by the path template should be mapped to the\n// request body.  This enables the following alternative definition of\n// the update method:\n//\n//     service Messaging {\n//       rpc UpdateMessage(Message) returns (Message) {\n//         option (google.api.http) = {\n//           patch: \"/v1/messages/{message_id}\"\n//           body: \"*\"\n//         };\n//       }\n//     }\n//     message Message {\n//       string message_id = 1;\n//       string text = 2;\n//     }\n//\n//\n// The following HTTP JSON to RPC mapping is enabled:\n//\n// HTTP | gRPC\n// -----|-----\n// `PATCH /v1/messages/123456 { \"text\": \"Hi!\" }` | `UpdateMessage(message_id:\n// \"123456\" text: \"Hi!\")`\n//\n// Note that when using `*` in the body mapping, it is not possible to\n// have HTTP parameters, as all fields not bound by the path end in\n// the body. This makes this option more rarely used in practice when\n// defining REST APIs. The common usage of `*` is in custom methods\n// which don't use the URL at all for transferring data.\n//\n// It is possible to define multiple HTTP methods for one RPC by using\n// the `additional_bindings` option. Example:\n//\n//     service Messaging {\n//       rpc GetMessage(GetMessageRequest) returns (Message) {\n//         option (google.api.http) = {\n//           get: \"/v1/messages/{message_id}\"\n//           additional_bindings {\n//             get: \"/v1/users/{user_id}/messages/{message_id}\"\n//           }\n//         };\n//       }\n//     }\n//     message GetMessageRequest {\n//       string message_id = 1;\n//       string user_id = 2;\n//     }\n//\n// This enables the following two alternative HTTP JSON to RPC mappings:\n//\n// HTTP | gRPC\n// -----|-----\n// `GET /v1/messages/123456` | `GetMessage(message_id: \"123456\")`\n// `GET /v1/users/me/messages/123456` | `GetMessage(user_id: \"me\" message_id:\n// \"123456\")`\n//\n// ## Rules for HTTP mapping\n//\n// 1. Leaf request fields (recursive expansion nested messages in the request\n//    message) are classified into three categories:\n//    - Fields referred by the path template. They are passed via the URL path.\n//    - Fields referred by the [HttpRule.body][google.api.HttpRule.body]. They are passed via the HTTP\n//      request body.\n//    - All other fields are passed via the URL query parameters, and the\n//      parameter name is the field path in the request message. A repeated\n//      field can be represented as multiple query parameters under the same\n//      name.\n//  2. If [HttpRule.body][google.api.HttpRule.body] is \"*\", there is no URL query parameter, all fields\n//     are passed via URL path and HTTP request body.\n//  3. If [HttpRule.body][google.api.HttpRule.body] is omitted, there is no HTTP request body, all\n//     fields are passed via URL path and URL query parameters.\n//\n// ### Path template syntax\n//\n//     Template = \"/\" Segments [ Verb ] ;\n//     Segments = Segment { \"/\" Segment } ;\n//     Segment  = \"*\" | \"**\" | LITERAL | Variable ;\n//     Variable = \"{\" FieldPath [ \"=\" Segments ] \"}\" ;\n//     FieldPath = IDENT { \".\" IDENT } ;\n//     Verb     = \":\" LITERAL ;\n//\n// The syntax `*` matches a single URL path segment. The syntax `**` matches\n// zero or more URL path segments, which must be the last part of the URL path\n// except the `Verb`.\n//\n// The syntax `Variable` matches part of the URL path as specified by its\n// template. A variable template must not contain other variables. If a variable\n// matches a single path segment, its template may be omitted, e.g. `{var}`\n// is equivalent to `{var=*}`.\n//\n// The syntax `LITERAL` matches literal text in the URL path. If the `LITERAL`\n// contains any reserved character, such characters should be percent-encoded\n// before the matching.\n//\n// If a variable contains exactly one path segment, such as `\"{var}\"` or\n// `\"{var=*}\"`, when such a variable is expanded into a URL path on the client\n// side, all characters except `[-_.~0-9a-zA-Z]` are percent-encoded. The\n// server side does the reverse decoding. Such variables show up in the\n// [Discovery\n// Document](https://developers.google.com/discovery/v1/reference/apis) as\n// `{var}`.\n//\n// If a variable contains multiple path segments, such as `\"{var=foo/*}\"`\n// or `\"{var=**}\"`, when such a variable is expanded into a URL path on the\n// client side, all characters except `[-_.~/0-9a-zA-Z]` are percent-encoded.\n// The server side does the reverse decoding, except \"%2F\" and \"%2f\" are left\n// unchanged. Such variables show up in the\n// [Discovery\n// Document](https://developers.google.com/discovery/v1/reference/apis) as\n// `{+var}`.\n//\n// ## Using gRPC API Service Configuration\n//\n// gRPC API Service Configuration (service config) is a configuration language\n// for configuring a gRPC service to become a user-facing product. The\n// service config is simply the YAML representation of the `google.api.Service`\n// proto message.\n//\n// As an alternative to annotating your proto file, you can configure gRPC\n// transcoding in your service config YAML files. You do this by specifying a\n// `HttpRule` that maps the gRPC method to a REST endpoint, achieving the same\n// effect as the proto annotation. This can be particularly useful if you\n// have a proto that is reused in multiple services. Note that any transcoding\n// specified in the service config will override any matching transcoding\n// configuration in the proto.\n//\n// Example:\n//\n//     http:\n//       rules:\n//         # Selects a gRPC method and applies HttpRule to it.\n//         - selector: example.v1.Messaging.GetMessage\n//           get: /v1/messages/{message_id}/{sub.subfield}\n//\n// ## Special notes\n//\n// When gRPC Transcoding is used to map a gRPC to JSON REST endpoints, the\n// proto to JSON conversion must follow the [proto3\n// specification](https://developers.google.com/protocol-buffers/docs/proto3#json).\n//\n// While the single segment variable follows the semantics of\n// [RFC 6570](https://tools.ietf.org/html/rfc6570) Section 3.2.2 Simple String\n// Expansion, the multi segment variable **does not** follow RFC 6570 Section\n// 3.2.3 Reserved Expansion. The reason is that the Reserved Expansion\n// does not expand special characters like `?` and `#`, which would lead\n// to invalid URLs. As the result, gRPC Transcoding uses a custom encoding\n// for multi segment variables.\n//\n// The path variables **must not** refer to any repeated or mapped field,\n// because client libraries are not capable of handling such variable expansion.\n//\n// The path variables **must not** capture the leading \"/\" character. The reason\n// is that the most common use case \"{var}\" does not capture the leading \"/\"\n// character. For consistency, all path variables must share the same behavior.\n//\n// Repeated message fields must not be mapped to URL query parameters, because\n// no client library can support such complicated mapping.\n//\n// If an API needs to use a JSON array for request or response body, it can map\n// the request or response body to a repeated field. However, some gRPC\n// Transcoding implementations may not support this feature.\nmessage HttpRule {\n  // Selects a method to which this rule applies.\n  //\n  // Refer to [selector][google.api.DocumentationRule.selector] for syntax details.\n  string selector = 1;\n\n  // Determines the URL pattern is matched by this rules. This pattern can be\n  // used with any of the {get|put|post|delete|patch} methods. A custom method\n  // can be defined using the 'custom' field.\n  oneof pattern {\n    // Maps to HTTP GET. Used for listing and getting information about\n    // resources.\n    string get = 2;\n\n    // Maps to HTTP PUT. Used for replacing a resource.\n    string put = 3;\n\n    // Maps to HTTP POST. Used for creating a resource or performing an action.\n    string post = 4;\n\n    // Maps to HTTP DELETE. Used for deleting a resource.\n    string delete = 5;\n\n    // Maps to HTTP PATCH. Used for updating a resource.\n    string patch = 6;\n\n    // The custom pattern is used for specifying an HTTP method that is not\n    // included in the `pattern` field, such as HEAD, or \"*\" to leave the\n    // HTTP method unspecified for this rule. The wild-card rule is useful\n    // for services that provide content to Web (HTML) clients.\n    CustomHttpPattern custom = 8;\n  }\n\n  // The name of the request field whose value is mapped to the HTTP request\n  // body, or `*` for mapping all request fields not captured by the path\n  // pattern to the HTTP body, or omitted for not having any HTTP request body.\n  //\n  // NOTE: the referred field must be present at the top-level of the request\n  // message type.\n  string body = 7;\n\n  // Optional. The name of the response field whose value is mapped to the HTTP\n  // response body. When omitted, the entire response message will be used\n  // as the HTTP response body.\n  //\n  // NOTE: The referred field must be present at the top-level of the response\n  // message type.\n  string response_body = 12;\n\n  // Additional HTTP bindings for the selector. Nested bindings must\n  // not contain an `additional_bindings` field themselves (that is,\n  // the nesting may only be one level deep).\n  repeated HttpRule additional_bindings = 11;\n}\n\n// A custom pattern is used for defining custom HTTP verb.\nmessage CustomHttpPattern {\n  // The name of this custom HTTP verb.\n  string kind = 1;\n\n  // The path matched by this custom verb.\n  string path = 2;\n}\n"
  },
  {
    "path": "service/cart/third_party/google/api/httpbody.proto",
    "content": "// Copyright 2020 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\npackage google.api;\n\nimport \"google/protobuf/any.proto\";\n\noption cc_enable_arenas = true;\noption go_package = \"google.golang.org/genproto/googleapis/api/httpbody;httpbody\";\noption java_multiple_files = true;\noption java_outer_classname = \"HttpBodyProto\";\noption java_package = \"com.google.api\";\noption objc_class_prefix = \"GAPI\";\n\n// Message that represents an arbitrary HTTP body. It should only be used for\n// payload formats that can't be represented as JSON, such as raw binary or\n// an HTML page.\n//\n//\n// This message can be used both in streaming and non-streaming API methods in\n// the request as well as the response.\n//\n// It can be used as a top-level request field, which is convenient if one\n// wants to extract parameters from either the URL or HTTP template into the\n// request fields and also want access to the raw HTTP body.\n//\n// Example:\n//\n//     message GetResourceRequest {\n//       // A unique request id.\n//       string request_id = 1;\n//\n//       // The raw HTTP body is bound to this field.\n//       google.api.HttpBody http_body = 2;\n//     }\n//\n//     service ResourceService {\n//       rpc GetResource(GetResourceRequest) returns (google.api.HttpBody);\n//       rpc UpdateResource(google.api.HttpBody) returns\n//       (google.protobuf.Empty);\n//     }\n//\n// Example with streaming methods:\n//\n//     service CaldavService {\n//       rpc GetCalendar(stream google.api.HttpBody)\n//         returns (stream google.api.HttpBody);\n//       rpc UpdateCalendar(stream google.api.HttpBody)\n//         returns (stream google.api.HttpBody);\n//     }\n//\n// Use of this type only changes how the request and response bodies are\n// handled, all other features will continue to work unchanged.\nmessage HttpBody {\n  // The HTTP Content-Type header value specifying the content type of the body.\n  string content_type = 1;\n\n  // The HTTP request/response body as raw binary.\n  bytes data = 2;\n\n  // Application specific response metadata. Must be set in the first response\n  // for streaming APIs.\n  repeated google.protobuf.Any extensions = 3;\n}\n"
  },
  {
    "path": "service/cart/third_party/google/protobuf/any.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption go_package = \"google.golang.org/protobuf/types/known/anypb\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"AnyProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\n\n// `Any` contains an arbitrary serialized protocol buffer message along with a\n// URL that describes the type of the serialized message.\n//\n// Protobuf library provides support to pack/unpack Any values in the form\n// of utility functions or additional generated methods of the Any type.\n//\n// Example 1: Pack and unpack a message in C++.\n//\n//     Foo foo = ...;\n//     Any any;\n//     any.PackFrom(foo);\n//     ...\n//     if (any.UnpackTo(&foo)) {\n//       ...\n//     }\n//\n// Example 2: Pack and unpack a message in Java.\n//\n//     Foo foo = ...;\n//     Any any = Any.pack(foo);\n//     ...\n//     if (any.is(Foo.class)) {\n//       foo = any.unpack(Foo.class);\n//     }\n//\n// Example 3: Pack and unpack a message in Python.\n//\n//     foo = Foo(...)\n//     any = Any()\n//     any.Pack(foo)\n//     ...\n//     if any.Is(Foo.DESCRIPTOR):\n//       any.Unpack(foo)\n//       ...\n//\n// Example 4: Pack and unpack a message in Go\n//\n//      foo := &pb.Foo{...}\n//      any, err := anypb.New(foo)\n//      if err != nil {\n//        ...\n//      }\n//      ...\n//      foo := &pb.Foo{}\n//      if err := any.UnmarshalTo(foo); err != nil {\n//        ...\n//      }\n//\n// The pack methods provided by protobuf library will by default use\n// 'type.googleapis.com/full.type.name' as the type URL and the unpack\n// methods only use the fully qualified type name after the last '/'\n// in the type URL, for example \"foo.bar.com/x/y.z\" will yield type\n// name \"y.z\".\n//\n//\n// JSON\n//\n// The JSON representation of an `Any` value uses the regular\n// representation of the deserialized, embedded message, with an\n// additional field `@type` which contains the type URL. Example:\n//\n//     package google.profile;\n//     message Person {\n//       string first_name = 1;\n//       string last_name = 2;\n//     }\n//\n//     {\n//       \"@type\": \"type.googleapis.com/google.profile.Person\",\n//       \"firstName\": <string>,\n//       \"lastName\": <string>\n//     }\n//\n// If the embedded message type is well-known and has a custom JSON\n// representation, that representation will be embedded adding a field\n// `value` which holds the custom JSON in addition to the `@type`\n// field. Example (for message [google.protobuf.Duration][]):\n//\n//     {\n//       \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n//       \"value\": \"1.212s\"\n//     }\n//\nmessage Any {\n  // A URL/resource name that uniquely identifies the type of the serialized\n  // protocol buffer message. This string must contain at least\n  // one \"/\" character. The last segment of the URL's path must represent\n  // the fully qualified name of the type (as in\n  // `path/google.protobuf.Duration`). The name should be in a canonical form\n  // (e.g., leading \".\" is not accepted).\n  //\n  // In practice, teams usually precompile into the binary all types that they\n  // expect it to use in the context of Any. However, for URLs which use the\n  // scheme `http`, `https`, or no scheme, one can optionally set up a type\n  // server that maps type URLs to message definitions as follows:\n  //\n  // * If no scheme is provided, `https` is assumed.\n  // * An HTTP GET on the URL must yield a [google.protobuf.Type][]\n  //   value in binary format, or produce an error.\n  // * Applications are allowed to cache lookup results based on the\n  //   URL, or have them precompiled into a binary to avoid any\n  //   lookup. Therefore, binary compatibility needs to be preserved\n  //   on changes to types. (Use versioned type names to manage\n  //   breaking changes.)\n  //\n  // Note: this functionality is not currently available in the official\n  // protobuf release, and it is not used for type URLs beginning with\n  // type.googleapis.com.\n  //\n  // Schemes other than `http`, `https` (or the empty scheme) might be\n  // used with implementation specific semantics.\n  //\n  string type_url = 1;\n\n  // Must be a valid serialized protocol buffer of the above specified type.\n  bytes value = 2;\n}\n"
  },
  {
    "path": "service/cart/third_party/google/protobuf/api.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\nimport \"google/protobuf/source_context.proto\";\nimport \"google/protobuf/type.proto\";\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"ApiProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\noption go_package = \"google.golang.org/protobuf/types/known/apipb\";\n\n// Api is a light-weight descriptor for an API Interface.\n//\n// Interfaces are also described as \"protocol buffer services\" in some contexts,\n// such as by the \"service\" keyword in a .proto file, but they are different\n// from API Services, which represent a concrete implementation of an interface\n// as opposed to simply a description of methods and bindings. They are also\n// sometimes simply referred to as \"APIs\" in other contexts, such as the name of\n// this message itself. See https://cloud.google.com/apis/design/glossary for\n// detailed terminology.\nmessage Api {\n  // The fully qualified name of this interface, including package name\n  // followed by the interface's simple name.\n  string name = 1;\n\n  // The methods of this interface, in unspecified order.\n  repeated Method methods = 2;\n\n  // Any metadata attached to the interface.\n  repeated Option options = 3;\n\n  // A version string for this interface. If specified, must have the form\n  // `major-version.minor-version`, as in `1.10`. If the minor version is\n  // omitted, it defaults to zero. If the entire version field is empty, the\n  // major version is derived from the package name, as outlined below. If the\n  // field is not empty, the version in the package name will be verified to be\n  // consistent with what is provided here.\n  //\n  // The versioning schema uses [semantic\n  // versioning](http://semver.org) where the major version number\n  // indicates a breaking change and the minor version an additive,\n  // non-breaking change. Both version numbers are signals to users\n  // what to expect from different versions, and should be carefully\n  // chosen based on the product plan.\n  //\n  // The major version is also reflected in the package name of the\n  // interface, which must end in `v<major-version>`, as in\n  // `google.feature.v1`. For major versions 0 and 1, the suffix can\n  // be omitted. Zero major versions must only be used for\n  // experimental, non-GA interfaces.\n  //\n  //\n  string version = 4;\n\n  // Source context for the protocol buffer service represented by this\n  // message.\n  SourceContext source_context = 5;\n\n  // Included interfaces. See [Mixin][].\n  repeated Mixin mixins = 6;\n\n  // The source syntax of the service.\n  Syntax syntax = 7;\n}\n\n// Method represents a method of an API interface.\nmessage Method {\n  // The simple name of this method.\n  string name = 1;\n\n  // A URL of the input message type.\n  string request_type_url = 2;\n\n  // If true, the request is streamed.\n  bool request_streaming = 3;\n\n  // The URL of the output message type.\n  string response_type_url = 4;\n\n  // If true, the response is streamed.\n  bool response_streaming = 5;\n\n  // Any metadata attached to the method.\n  repeated Option options = 6;\n\n  // The source syntax of this method.\n  Syntax syntax = 7;\n}\n\n// Declares an API Interface to be included in this interface. The including\n// interface must redeclare all the methods from the included interface, but\n// documentation and options are inherited as follows:\n//\n// - If after comment and whitespace stripping, the documentation\n//   string of the redeclared method is empty, it will be inherited\n//   from the original method.\n//\n// - Each annotation belonging to the service config (http,\n//   visibility) which is not set in the redeclared method will be\n//   inherited.\n//\n// - If an http annotation is inherited, the path pattern will be\n//   modified as follows. Any version prefix will be replaced by the\n//   version of the including interface plus the [root][] path if\n//   specified.\n//\n// Example of a simple mixin:\n//\n//     package google.acl.v1;\n//     service AccessControl {\n//       // Get the underlying ACL object.\n//       rpc GetAcl(GetAclRequest) returns (Acl) {\n//         option (google.api.http).get = \"/v1/{resource=**}:getAcl\";\n//       }\n//     }\n//\n//     package google.storage.v2;\n//     service Storage {\n//       rpc GetAcl(GetAclRequest) returns (Acl);\n//\n//       // Get a data record.\n//       rpc GetData(GetDataRequest) returns (Data) {\n//         option (google.api.http).get = \"/v2/{resource=**}\";\n//       }\n//     }\n//\n// Example of a mixin configuration:\n//\n//     apis:\n//     - name: google.storage.v2.Storage\n//       mixins:\n//       - name: google.acl.v1.AccessControl\n//\n// The mixin construct implies that all methods in `AccessControl` are\n// also declared with same name and request/response types in\n// `Storage`. A documentation generator or annotation processor will\n// see the effective `Storage.GetAcl` method after inheriting\n// documentation and annotations as follows:\n//\n//     service Storage {\n//       // Get the underlying ACL object.\n//       rpc GetAcl(GetAclRequest) returns (Acl) {\n//         option (google.api.http).get = \"/v2/{resource=**}:getAcl\";\n//       }\n//       ...\n//     }\n//\n// Note how the version in the path pattern changed from `v1` to `v2`.\n//\n// If the `root` field in the mixin is specified, it should be a\n// relative path under which inherited HTTP paths are placed. Example:\n//\n//     apis:\n//     - name: google.storage.v2.Storage\n//       mixins:\n//       - name: google.acl.v1.AccessControl\n//         root: acls\n//\n// This implies the following inherited HTTP annotation:\n//\n//     service Storage {\n//       // Get the underlying ACL object.\n//       rpc GetAcl(GetAclRequest) returns (Acl) {\n//         option (google.api.http).get = \"/v2/acls/{resource=**}:getAcl\";\n//       }\n//       ...\n//     }\nmessage Mixin {\n  // The fully qualified name of the interface which is included.\n  string name = 1;\n\n  // If non-empty specifies a path under which inherited HTTP paths\n  // are rooted.\n  string root = 2;\n}\n"
  },
  {
    "path": "service/cart/third_party/google/protobuf/compiler/plugin.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//\n// WARNING:  The plugin interface is currently EXPERIMENTAL and is subject to\n//   change.\n//\n// protoc (aka the Protocol Compiler) can be extended via plugins.  A plugin is\n// just a program that reads a CodeGeneratorRequest from stdin and writes a\n// CodeGeneratorResponse to stdout.\n//\n// Plugins written using C++ can use google/protobuf/compiler/plugin.h instead\n// of dealing with the raw protocol defined here.\n//\n// A plugin executable needs only to be placed somewhere in the path.  The\n// plugin should be named \"protoc-gen-$NAME\", and will then be used when the\n// flag \"--${NAME}_out\" is passed to protoc.\n\nsyntax = \"proto2\";\n\npackage google.protobuf.compiler;\noption java_package = \"com.google.protobuf.compiler\";\noption java_outer_classname = \"PluginProtos\";\n\noption go_package = \"google.golang.org/protobuf/types/pluginpb\";\n\nimport \"google/protobuf/descriptor.proto\";\n\n// The version number of protocol compiler.\nmessage Version {\n  optional int32 major = 1;\n  optional int32 minor = 2;\n  optional int32 patch = 3;\n  // A suffix for alpha, beta or rc release, e.g., \"alpha-1\", \"rc2\". It should\n  // be empty for mainline stable releases.\n  optional string suffix = 4;\n}\n\n// An encoded CodeGeneratorRequest is written to the plugin's stdin.\nmessage CodeGeneratorRequest {\n  // The .proto files that were explicitly listed on the command-line.  The\n  // code generator should generate code only for these files.  Each file's\n  // descriptor will be included in proto_file, below.\n  repeated string file_to_generate = 1;\n\n  // The generator parameter passed on the command-line.\n  optional string parameter = 2;\n\n  // FileDescriptorProtos for all files in files_to_generate and everything\n  // they import.  The files will appear in topological order, so each file\n  // appears before any file that imports it.\n  //\n  // protoc guarantees that all proto_files will be written after\n  // the fields above, even though this is not technically guaranteed by the\n  // protobuf wire format.  This theoretically could allow a plugin to stream\n  // in the FileDescriptorProtos and handle them one by one rather than read\n  // the entire set into memory at once.  However, as of this writing, this\n  // is not similarly optimized on protoc's end -- it will store all fields in\n  // memory at once before sending them to the plugin.\n  //\n  // Type names of fields and extensions in the FileDescriptorProto are always\n  // fully qualified.\n  repeated FileDescriptorProto proto_file = 15;\n\n  // The version number of protocol compiler.\n  optional Version compiler_version = 3;\n\n}\n\n// The plugin writes an encoded CodeGeneratorResponse to stdout.\nmessage CodeGeneratorResponse {\n  // Error message.  If non-empty, code generation failed.  The plugin process\n  // should exit with status code zero even if it reports an error in this way.\n  //\n  // This should be used to indicate errors in .proto files which prevent the\n  // code generator from generating correct code.  Errors which indicate a\n  // problem in protoc itself -- such as the input CodeGeneratorRequest being\n  // unparseable -- should be reported by writing a message to stderr and\n  // exiting with a non-zero status code.\n  optional string error = 1;\n\n  // A bitmask of supported features that the code generator supports.\n  // This is a bitwise \"or\" of values from the Feature enum.\n  optional uint64 supported_features = 2;\n\n  // Sync with code_generator.h.\n  enum Feature {\n    FEATURE_NONE = 0;\n    FEATURE_PROTO3_OPTIONAL = 1;\n  }\n\n  // Represents a single generated file.\n  message File {\n    // The file name, relative to the output directory.  The name must not\n    // contain \".\" or \"..\" components and must be relative, not be absolute (so,\n    // the file cannot lie outside the output directory).  \"/\" must be used as\n    // the path separator, not \"\\\".\n    //\n    // If the name is omitted, the content will be appended to the previous\n    // file.  This allows the generator to break large files into small chunks,\n    // and allows the generated text to be streamed back to protoc so that large\n    // files need not reside completely in memory at one time.  Note that as of\n    // this writing protoc does not optimize for this -- it will read the entire\n    // CodeGeneratorResponse before writing files to disk.\n    optional string name = 1;\n\n    // If non-empty, indicates that the named file should already exist, and the\n    // content here is to be inserted into that file at a defined insertion\n    // point.  This feature allows a code generator to extend the output\n    // produced by another code generator.  The original generator may provide\n    // insertion points by placing special annotations in the file that look\n    // like:\n    //   @@protoc_insertion_point(NAME)\n    // The annotation can have arbitrary text before and after it on the line,\n    // which allows it to be placed in a comment.  NAME should be replaced with\n    // an identifier naming the point -- this is what other generators will use\n    // as the insertion_point.  Code inserted at this point will be placed\n    // immediately above the line containing the insertion point (thus multiple\n    // insertions to the same point will come out in the order they were added).\n    // The double-@ is intended to make it unlikely that the generated code\n    // could contain things that look like insertion points by accident.\n    //\n    // For example, the C++ code generator places the following line in the\n    // .pb.h files that it generates:\n    //   // @@protoc_insertion_point(namespace_scope)\n    // This line appears within the scope of the file's package namespace, but\n    // outside of any particular class.  Another plugin can then specify the\n    // insertion_point \"namespace_scope\" to generate additional classes or\n    // other declarations that should be placed in this scope.\n    //\n    // Note that if the line containing the insertion point begins with\n    // whitespace, the same whitespace will be added to every line of the\n    // inserted text.  This is useful for languages like Python, where\n    // indentation matters.  In these languages, the insertion point comment\n    // should be indented the same amount as any inserted code will need to be\n    // in order to work correctly in that context.\n    //\n    // The code generator that generates the initial file and the one which\n    // inserts into it must both run as part of a single invocation of protoc.\n    // Code generators are executed in the order in which they appear on the\n    // command line.\n    //\n    // If |insertion_point| is present, |name| must also be present.\n    optional string insertion_point = 2;\n\n    // The file contents.\n    optional string content = 15;\n\n    // Information describing the file content being inserted. If an insertion\n    // point is used, this information will be appropriately offset and inserted\n    // into the code generation metadata for the generated files.\n    optional GeneratedCodeInfo generated_code_info = 16;\n  }\n  repeated File file = 15;\n}\n"
  },
  {
    "path": "service/cart/third_party/google/protobuf/descriptor.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// The messages in this file describe the definitions found in .proto files.\n// A valid .proto file can be translated directly to a FileDescriptorProto\n// without any other information (e.g. without reading its imports).\n\n\nsyntax = \"proto2\";\n\npackage google.protobuf;\n\noption go_package = \"google.golang.org/protobuf/types/descriptorpb\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"DescriptorProtos\";\noption csharp_namespace = \"Google.Protobuf.Reflection\";\noption objc_class_prefix = \"GPB\";\noption cc_enable_arenas = true;\n\n// descriptor.proto must be optimized for speed because reflection-based\n// algorithms don't work during bootstrapping.\noption optimize_for = SPEED;\n\n// The protocol compiler can output a FileDescriptorSet containing the .proto\n// files it parses.\nmessage FileDescriptorSet {\n  repeated FileDescriptorProto file = 1;\n}\n\n// Describes a complete .proto file.\nmessage FileDescriptorProto {\n  optional string name = 1;     // file name, relative to root of source tree\n  optional string package = 2;  // e.g. \"foo\", \"foo.bar\", etc.\n\n  // Names of files imported by this file.\n  repeated string dependency = 3;\n  // Indexes of the public imported files in the dependency list above.\n  repeated int32 public_dependency = 10;\n  // Indexes of the weak imported files in the dependency list.\n  // For Google-internal migration only. Do not use.\n  repeated int32 weak_dependency = 11;\n\n  // All top-level definitions in this file.\n  repeated DescriptorProto message_type = 4;\n  repeated EnumDescriptorProto enum_type = 5;\n  repeated ServiceDescriptorProto service = 6;\n  repeated FieldDescriptorProto extension = 7;\n\n  optional FileOptions options = 8;\n\n  // This field contains optional information about the original source code.\n  // You may safely remove this entire field without harming runtime\n  // functionality of the descriptors -- the information is needed only by\n  // development tools.\n  optional SourceCodeInfo source_code_info = 9;\n\n  // The syntax of the proto file.\n  // The supported values are \"proto2\" and \"proto3\".\n  optional string syntax = 12;\n}\n\n// Describes a message type.\nmessage DescriptorProto {\n  optional string name = 1;\n\n  repeated FieldDescriptorProto field = 2;\n  repeated FieldDescriptorProto extension = 6;\n\n  repeated DescriptorProto nested_type = 3;\n  repeated EnumDescriptorProto enum_type = 4;\n\n  message ExtensionRange {\n    optional int32 start = 1;  // Inclusive.\n    optional int32 end = 2;    // Exclusive.\n\n    optional ExtensionRangeOptions options = 3;\n  }\n  repeated ExtensionRange extension_range = 5;\n\n  repeated OneofDescriptorProto oneof_decl = 8;\n\n  optional MessageOptions options = 7;\n\n  // Range of reserved tag numbers. Reserved tag numbers may not be used by\n  // fields or extension ranges in the same message. Reserved ranges may\n  // not overlap.\n  message ReservedRange {\n    optional int32 start = 1;  // Inclusive.\n    optional int32 end = 2;    // Exclusive.\n  }\n  repeated ReservedRange reserved_range = 9;\n  // Reserved field names, which may not be used by fields in the same message.\n  // A given name may only be reserved once.\n  repeated string reserved_name = 10;\n}\n\nmessage ExtensionRangeOptions {\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\n// Describes a field within a message.\nmessage FieldDescriptorProto {\n  enum Type {\n    // 0 is reserved for errors.\n    // Order is weird for historical reasons.\n    TYPE_DOUBLE = 1;\n    TYPE_FLOAT = 2;\n    // Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT64 if\n    // negative values are likely.\n    TYPE_INT64 = 3;\n    TYPE_UINT64 = 4;\n    // Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT32 if\n    // negative values are likely.\n    TYPE_INT32 = 5;\n    TYPE_FIXED64 = 6;\n    TYPE_FIXED32 = 7;\n    TYPE_BOOL = 8;\n    TYPE_STRING = 9;\n    // Tag-delimited aggregate.\n    // Group type is deprecated and not supported in proto3. However, Proto3\n    // implementations should still be able to parse the group wire format and\n    // treat group fields as unknown fields.\n    TYPE_GROUP = 10;\n    TYPE_MESSAGE = 11;  // Length-delimited aggregate.\n\n    // New in version 2.\n    TYPE_BYTES = 12;\n    TYPE_UINT32 = 13;\n    TYPE_ENUM = 14;\n    TYPE_SFIXED32 = 15;\n    TYPE_SFIXED64 = 16;\n    TYPE_SINT32 = 17;  // Uses ZigZag encoding.\n    TYPE_SINT64 = 18;  // Uses ZigZag encoding.\n  }\n\n  enum Label {\n    // 0 is reserved for errors\n    LABEL_OPTIONAL = 1;\n    LABEL_REQUIRED = 2;\n    LABEL_REPEATED = 3;\n  }\n\n  optional string name = 1;\n  optional int32 number = 3;\n  optional Label label = 4;\n\n  // If type_name is set, this need not be set.  If both this and type_name\n  // are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP.\n  optional Type type = 5;\n\n  // For message and enum types, this is the name of the type.  If the name\n  // starts with a '.', it is fully-qualified.  Otherwise, C++-like scoping\n  // rules are used to find the type (i.e. first the nested types within this\n  // message are searched, then within the parent, on up to the root\n  // namespace).\n  optional string type_name = 6;\n\n  // For extensions, this is the name of the type being extended.  It is\n  // resolved in the same manner as type_name.\n  optional string extendee = 2;\n\n  // For numeric types, contains the original text representation of the value.\n  // For booleans, \"true\" or \"false\".\n  // For strings, contains the default text contents (not escaped in any way).\n  // For bytes, contains the C escaped value.  All bytes >= 128 are escaped.\n  optional string default_value = 7;\n\n  // If set, gives the index of a oneof in the containing type's oneof_decl\n  // list.  This field is a member of that oneof.\n  optional int32 oneof_index = 9;\n\n  // JSON name of this field. The value is set by protocol compiler. If the\n  // user has set a \"json_name\" option on this field, that option's value\n  // will be used. Otherwise, it's deduced from the field's name by converting\n  // it to camelCase.\n  optional string json_name = 10;\n\n  optional FieldOptions options = 8;\n\n  // If true, this is a proto3 \"optional\". When a proto3 field is optional, it\n  // tracks presence regardless of field type.\n  //\n  // When proto3_optional is true, this field must be belong to a oneof to\n  // signal to old proto3 clients that presence is tracked for this field. This\n  // oneof is known as a \"synthetic\" oneof, and this field must be its sole\n  // member (each proto3 optional field gets its own synthetic oneof). Synthetic\n  // oneofs exist in the descriptor only, and do not generate any API. Synthetic\n  // oneofs must be ordered after all \"real\" oneofs.\n  //\n  // For message fields, proto3_optional doesn't create any semantic change,\n  // since non-repeated message fields always track presence. However it still\n  // indicates the semantic detail of whether the user wrote \"optional\" or not.\n  // This can be useful for round-tripping the .proto file. For consistency we\n  // give message fields a synthetic oneof also, even though it is not required\n  // to track presence. This is especially important because the parser can't\n  // tell if a field is a message or an enum, so it must always create a\n  // synthetic oneof.\n  //\n  // Proto2 optional fields do not set this flag, because they already indicate\n  // optional with `LABEL_OPTIONAL`.\n  optional bool proto3_optional = 17;\n}\n\n// Describes a oneof.\nmessage OneofDescriptorProto {\n  optional string name = 1;\n  optional OneofOptions options = 2;\n}\n\n// Describes an enum type.\nmessage EnumDescriptorProto {\n  optional string name = 1;\n\n  repeated EnumValueDescriptorProto value = 2;\n\n  optional EnumOptions options = 3;\n\n  // Range of reserved numeric values. Reserved values may not be used by\n  // entries in the same enum. Reserved ranges may not overlap.\n  //\n  // Note that this is distinct from DescriptorProto.ReservedRange in that it\n  // is inclusive such that it can appropriately represent the entire int32\n  // domain.\n  message EnumReservedRange {\n    optional int32 start = 1;  // Inclusive.\n    optional int32 end = 2;    // Inclusive.\n  }\n\n  // Range of reserved numeric values. Reserved numeric values may not be used\n  // by enum values in the same enum declaration. Reserved ranges may not\n  // overlap.\n  repeated EnumReservedRange reserved_range = 4;\n\n  // Reserved enum value names, which may not be reused. A given name may only\n  // be reserved once.\n  repeated string reserved_name = 5;\n}\n\n// Describes a value within an enum.\nmessage EnumValueDescriptorProto {\n  optional string name = 1;\n  optional int32 number = 2;\n\n  optional EnumValueOptions options = 3;\n}\n\n// Describes a service.\nmessage ServiceDescriptorProto {\n  optional string name = 1;\n  repeated MethodDescriptorProto method = 2;\n\n  optional ServiceOptions options = 3;\n}\n\n// Describes a method of a service.\nmessage MethodDescriptorProto {\n  optional string name = 1;\n\n  // Input and output type names.  These are resolved in the same way as\n  // FieldDescriptorProto.type_name, but must refer to a message type.\n  optional string input_type = 2;\n  optional string output_type = 3;\n\n  optional MethodOptions options = 4;\n\n  // Identifies if client streams multiple client messages\n  optional bool client_streaming = 5 [default = false];\n  // Identifies if server streams multiple server messages\n  optional bool server_streaming = 6 [default = false];\n}\n\n\n// ===================================================================\n// Options\n\n// Each of the definitions above may have \"options\" attached.  These are\n// just annotations which may cause code to be generated slightly differently\n// or may contain hints for code that manipulates protocol messages.\n//\n// Clients may define custom options as extensions of the *Options messages.\n// These extensions may not yet be known at parsing time, so the parser cannot\n// store the values in them.  Instead it stores them in a field in the *Options\n// message called uninterpreted_option. This field must have the same name\n// across all *Options messages. We then use this field to populate the\n// extensions when we build a descriptor, at which point all protos have been\n// parsed and so all extensions are known.\n//\n// Extension numbers for custom options may be chosen as follows:\n// * For options which will only be used within a single application or\n//   organization, or for experimental options, use field numbers 50000\n//   through 99999.  It is up to you to ensure that you do not use the\n//   same number for multiple options.\n// * For options which will be published and used publicly by multiple\n//   independent entities, e-mail protobuf-global-extension-registry@google.com\n//   to reserve extension numbers. Simply provide your project name (e.g.\n//   Objective-C plugin) and your project website (if available) -- there's no\n//   need to explain how you intend to use them. Usually you only need one\n//   extension number. You can declare multiple options with only one extension\n//   number by putting them in a sub-message. See the Custom Options section of\n//   the docs for examples:\n//   https://developers.google.com/protocol-buffers/docs/proto#options\n//   If this turns out to be popular, a web service will be set up\n//   to automatically assign option numbers.\n\nmessage FileOptions {\n\n  // Sets the Java package where classes generated from this .proto will be\n  // placed.  By default, the proto package is used, but this is often\n  // inappropriate because proto packages do not normally start with backwards\n  // domain names.\n  optional string java_package = 1;\n\n\n  // Controls the name of the wrapper Java class generated for the .proto file.\n  // That class will always contain the .proto file's getDescriptor() method as\n  // well as any top-level extensions defined in the .proto file.\n  // If java_multiple_files is disabled, then all the other classes from the\n  // .proto file will be nested inside the single wrapper outer class.\n  optional string java_outer_classname = 8;\n\n  // If enabled, then the Java code generator will generate a separate .java\n  // file for each top-level message, enum, and service defined in the .proto\n  // file.  Thus, these types will *not* be nested inside the wrapper class\n  // named by java_outer_classname.  However, the wrapper class will still be\n  // generated to contain the file's getDescriptor() method as well as any\n  // top-level extensions defined in the file.\n  optional bool java_multiple_files = 10 [default = false];\n\n  // This option does nothing.\n  optional bool java_generate_equals_and_hash = 20 [deprecated=true];\n\n  // If set true, then the Java2 code generator will generate code that\n  // throws an exception whenever an attempt is made to assign a non-UTF-8\n  // byte sequence to a string field.\n  // Message reflection will do the same.\n  // However, an extension field still accepts non-UTF-8 byte sequences.\n  // This option has no effect on when used with the lite runtime.\n  optional bool java_string_check_utf8 = 27 [default = false];\n\n\n  // Generated classes can be optimized for speed or code size.\n  enum OptimizeMode {\n    SPEED = 1;         // Generate complete code for parsing, serialization,\n                       // etc.\n    CODE_SIZE = 2;     // Use ReflectionOps to implement these methods.\n    LITE_RUNTIME = 3;  // Generate code using MessageLite and the lite runtime.\n  }\n  optional OptimizeMode optimize_for = 9 [default = SPEED];\n\n  // Sets the Go package where structs generated from this .proto will be\n  // placed. If omitted, the Go package will be derived from the following:\n  //   - The basename of the package import path, if provided.\n  //   - Otherwise, the package statement in the .proto file, if present.\n  //   - Otherwise, the basename of the .proto file, without extension.\n  optional string go_package = 11;\n\n\n\n\n  // Should generic services be generated in each language?  \"Generic\" services\n  // are not specific to any particular RPC system.  They are generated by the\n  // main code generators in each language (without additional plugins).\n  // Generic services were the only kind of service generation supported by\n  // early versions of google.protobuf.\n  //\n  // Generic services are now considered deprecated in favor of using plugins\n  // that generate code specific to your particular RPC system.  Therefore,\n  // these default to false.  Old code which depends on generic services should\n  // explicitly set them to true.\n  optional bool cc_generic_services = 16 [default = false];\n  optional bool java_generic_services = 17 [default = false];\n  optional bool py_generic_services = 18 [default = false];\n  optional bool php_generic_services = 42 [default = false];\n\n  // Is this file deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for everything in the file, or it will be completely ignored; in the very\n  // least, this is a formalization for deprecating files.\n  optional bool deprecated = 23 [default = false];\n\n  // Enables the use of arenas for the proto messages in this file. This applies\n  // only to generated classes for C++.\n  optional bool cc_enable_arenas = 31 [default = true];\n\n\n  // Sets the objective c class prefix which is prepended to all objective c\n  // generated classes from this .proto. There is no default.\n  optional string objc_class_prefix = 36;\n\n  // Namespace for generated classes; defaults to the package.\n  optional string csharp_namespace = 37;\n\n  // By default Swift generators will take the proto package and CamelCase it\n  // replacing '.' with underscore and use that to prefix the types/symbols\n  // defined. When this options is provided, they will use this value instead\n  // to prefix the types/symbols defined.\n  optional string swift_prefix = 39;\n\n  // Sets the php class prefix which is prepended to all php generated classes\n  // from this .proto. Default is empty.\n  optional string php_class_prefix = 40;\n\n  // Use this option to change the namespace of php generated classes. Default\n  // is empty. When this option is empty, the package name will be used for\n  // determining the namespace.\n  optional string php_namespace = 41;\n\n  // Use this option to change the namespace of php generated metadata classes.\n  // Default is empty. When this option is empty, the proto file name will be\n  // used for determining the namespace.\n  optional string php_metadata_namespace = 44;\n\n  // Use this option to change the package of ruby generated classes. Default\n  // is empty. When this option is not set, the package name will be used for\n  // determining the ruby package.\n  optional string ruby_package = 45;\n\n\n  // The parser stores options it doesn't recognize here.\n  // See the documentation for the \"Options\" section above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message.\n  // See the documentation for the \"Options\" section above.\n  extensions 1000 to max;\n\n  reserved 38;\n}\n\nmessage MessageOptions {\n  // Set true to use the old proto1 MessageSet wire format for extensions.\n  // This is provided for backwards-compatibility with the MessageSet wire\n  // format.  You should not use this for any other reason:  It's less\n  // efficient, has fewer features, and is more complicated.\n  //\n  // The message must be defined exactly as follows:\n  //   message Foo {\n  //     option message_set_wire_format = true;\n  //     extensions 4 to max;\n  //   }\n  // Note that the message cannot have any defined fields; MessageSets only\n  // have extensions.\n  //\n  // All extensions of your type must be singular messages; e.g. they cannot\n  // be int32s, enums, or repeated messages.\n  //\n  // Because this is an option, the above two restrictions are not enforced by\n  // the protocol compiler.\n  optional bool message_set_wire_format = 1 [default = false];\n\n  // Disables the generation of the standard \"descriptor()\" accessor, which can\n  // conflict with a field of the same name.  This is meant to make migration\n  // from proto1 easier; new code should avoid fields named \"descriptor\".\n  optional bool no_standard_descriptor_accessor = 2 [default = false];\n\n  // Is this message deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for the message, or it will be completely ignored; in the very least,\n  // this is a formalization for deprecating messages.\n  optional bool deprecated = 3 [default = false];\n\n  reserved 4, 5, 6;\n\n  // Whether the message is an automatically generated map entry type for the\n  // maps field.\n  //\n  // For maps fields:\n  //     map<KeyType, ValueType> map_field = 1;\n  // The parsed descriptor looks like:\n  //     message MapFieldEntry {\n  //         option map_entry = true;\n  //         optional KeyType key = 1;\n  //         optional ValueType value = 2;\n  //     }\n  //     repeated MapFieldEntry map_field = 1;\n  //\n  // Implementations may choose not to generate the map_entry=true message, but\n  // use a native map in the target language to hold the keys and values.\n  // The reflection APIs in such implementations still need to work as\n  // if the field is a repeated message field.\n  //\n  // NOTE: Do not set the option in .proto files. Always use the maps syntax\n  // instead. The option should only be implicitly set by the proto compiler\n  // parser.\n  optional bool map_entry = 7;\n\n  reserved 8;  // javalite_serializable\n  reserved 9;  // javanano_as_lite\n\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\nmessage FieldOptions {\n  // The ctype option instructs the C++ code generator to use a different\n  // representation of the field than it normally would.  See the specific\n  // options below.  This option is not yet implemented in the open source\n  // release -- sorry, we'll try to include it in a future version!\n  optional CType ctype = 1 [default = STRING];\n  enum CType {\n    // Default mode.\n    STRING = 0;\n\n    CORD = 1;\n\n    STRING_PIECE = 2;\n  }\n  // The packed option can be enabled for repeated primitive fields to enable\n  // a more efficient representation on the wire. Rather than repeatedly\n  // writing the tag and type for each element, the entire array is encoded as\n  // a single length-delimited blob. In proto3, only explicit setting it to\n  // false will avoid using packed encoding.\n  optional bool packed = 2;\n\n  // The jstype option determines the JavaScript type used for values of the\n  // field.  The option is permitted only for 64 bit integral and fixed types\n  // (int64, uint64, sint64, fixed64, sfixed64).  A field with jstype JS_STRING\n  // is represented as JavaScript string, which avoids loss of precision that\n  // can happen when a large value is converted to a floating point JavaScript.\n  // Specifying JS_NUMBER for the jstype causes the generated JavaScript code to\n  // use the JavaScript \"number\" type.  The behavior of the default option\n  // JS_NORMAL is implementation dependent.\n  //\n  // This option is an enum to permit additional types to be added, e.g.\n  // goog.math.Integer.\n  optional JSType jstype = 6 [default = JS_NORMAL];\n  enum JSType {\n    // Use the default type.\n    JS_NORMAL = 0;\n\n    // Use JavaScript strings.\n    JS_STRING = 1;\n\n    // Use JavaScript numbers.\n    JS_NUMBER = 2;\n  }\n\n  // Should this field be parsed lazily?  Lazy applies only to message-type\n  // fields.  It means that when the outer message is initially parsed, the\n  // inner message's contents will not be parsed but instead stored in encoded\n  // form.  The inner message will actually be parsed when it is first accessed.\n  //\n  // This is only a hint.  Implementations are free to choose whether to use\n  // eager or lazy parsing regardless of the value of this option.  However,\n  // setting this option true suggests that the protocol author believes that\n  // using lazy parsing on this field is worth the additional bookkeeping\n  // overhead typically needed to implement it.\n  //\n  // This option does not affect the public interface of any generated code;\n  // all method signatures remain the same.  Furthermore, thread-safety of the\n  // interface is not affected by this option; const methods remain safe to\n  // call from multiple threads concurrently, while non-const methods continue\n  // to require exclusive access.\n  //\n  //\n  // Note that implementations may choose not to check required fields within\n  // a lazy sub-message.  That is, calling IsInitialized() on the outer message\n  // may return true even if the inner message has missing required fields.\n  // This is necessary because otherwise the inner message would have to be\n  // parsed in order to perform the check, defeating the purpose of lazy\n  // parsing.  An implementation which chooses not to check required fields\n  // must be consistent about it.  That is, for any particular sub-message, the\n  // implementation must either *always* check its required fields, or *never*\n  // check its required fields, regardless of whether or not the message has\n  // been parsed.\n  //\n  // As of 2021, lazy does no correctness checks on the byte stream during\n  // parsing.  This may lead to crashes if and when an invalid byte stream is\n  // finally parsed upon access.\n  //\n  // TODO(b/211906113):  Enable validation on lazy fields.\n  optional bool lazy = 5 [default = false];\n\n  // unverified_lazy does no correctness checks on the byte stream. This should\n  // only be used where lazy with verification is prohibitive for performance\n  // reasons.\n  optional bool unverified_lazy = 15 [default = false];\n\n  // Is this field deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for accessors, or it will be completely ignored; in the very least, this\n  // is a formalization for deprecating fields.\n  optional bool deprecated = 3 [default = false];\n\n  // For Google-internal migration only. Do not use.\n  optional bool weak = 10 [default = false];\n\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n\n  reserved 4;  // removed jtype\n}\n\nmessage OneofOptions {\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\nmessage EnumOptions {\n\n  // Set this option to true to allow mapping different tag names to the same\n  // value.\n  optional bool allow_alias = 2;\n\n  // Is this enum deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for the enum, or it will be completely ignored; in the very least, this\n  // is a formalization for deprecating enums.\n  optional bool deprecated = 3 [default = false];\n\n  reserved 5;  // javanano_as_lite\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\nmessage EnumValueOptions {\n  // Is this enum value deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for the enum value, or it will be completely ignored; in the very least,\n  // this is a formalization for deprecating enum values.\n  optional bool deprecated = 1 [default = false];\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\nmessage ServiceOptions {\n\n  // Note:  Field numbers 1 through 32 are reserved for Google's internal RPC\n  //   framework.  We apologize for hoarding these numbers to ourselves, but\n  //   we were already using them long before we decided to release Protocol\n  //   Buffers.\n\n  // Is this service deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for the service, or it will be completely ignored; in the very least,\n  // this is a formalization for deprecating services.\n  optional bool deprecated = 33 [default = false];\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\nmessage MethodOptions {\n\n  // Note:  Field numbers 1 through 32 are reserved for Google's internal RPC\n  //   framework.  We apologize for hoarding these numbers to ourselves, but\n  //   we were already using them long before we decided to release Protocol\n  //   Buffers.\n\n  // Is this method deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for the method, or it will be completely ignored; in the very least,\n  // this is a formalization for deprecating methods.\n  optional bool deprecated = 33 [default = false];\n\n  // Is this method side-effect-free (or safe in HTTP parlance), or idempotent,\n  // or neither? HTTP based RPC implementation may choose GET verb for safe\n  // methods, and PUT verb for idempotent methods instead of the default POST.\n  enum IdempotencyLevel {\n    IDEMPOTENCY_UNKNOWN = 0;\n    NO_SIDE_EFFECTS = 1;  // implies idempotent\n    IDEMPOTENT = 2;       // idempotent, but may have side effects\n  }\n  optional IdempotencyLevel idempotency_level = 34\n      [default = IDEMPOTENCY_UNKNOWN];\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\n\n// A message representing a option the parser does not recognize. This only\n// appears in options protos created by the compiler::Parser class.\n// DescriptorPool resolves these when building Descriptor objects. Therefore,\n// options protos in descriptor objects (e.g. returned by Descriptor::options(),\n// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions\n// in them.\nmessage UninterpretedOption {\n  // The name of the uninterpreted option.  Each string represents a segment in\n  // a dot-separated name.  is_extension is true iff a segment represents an\n  // extension (denoted with parentheses in options specs in .proto files).\n  // E.g.,{ [\"foo\", false], [\"bar.baz\", true], [\"qux\", false] } represents\n  // \"foo.(bar.baz).qux\".\n  message NamePart {\n    required string name_part = 1;\n    required bool is_extension = 2;\n  }\n  repeated NamePart name = 2;\n\n  // The value of the uninterpreted option, in whatever type the tokenizer\n  // identified it as during parsing. Exactly one of these should be set.\n  optional string identifier_value = 3;\n  optional uint64 positive_int_value = 4;\n  optional int64 negative_int_value = 5;\n  optional double double_value = 6;\n  optional bytes string_value = 7;\n  optional string aggregate_value = 8;\n}\n\n// ===================================================================\n// Optional source code info\n\n// Encapsulates information about the original source file from which a\n// FileDescriptorProto was generated.\nmessage SourceCodeInfo {\n  // A Location identifies a piece of source code in a .proto file which\n  // corresponds to a particular definition.  This information is intended\n  // to be useful to IDEs, code indexers, documentation generators, and similar\n  // tools.\n  //\n  // For example, say we have a file like:\n  //   message Foo {\n  //     optional string foo = 1;\n  //   }\n  // Let's look at just the field definition:\n  //   optional string foo = 1;\n  //   ^       ^^     ^^  ^  ^^^\n  //   a       bc     de  f  ghi\n  // We have the following locations:\n  //   span   path               represents\n  //   [a,i)  [ 4, 0, 2, 0 ]     The whole field definition.\n  //   [a,b)  [ 4, 0, 2, 0, 4 ]  The label (optional).\n  //   [c,d)  [ 4, 0, 2, 0, 5 ]  The type (string).\n  //   [e,f)  [ 4, 0, 2, 0, 1 ]  The name (foo).\n  //   [g,h)  [ 4, 0, 2, 0, 3 ]  The number (1).\n  //\n  // Notes:\n  // - A location may refer to a repeated field itself (i.e. not to any\n  //   particular index within it).  This is used whenever a set of elements are\n  //   logically enclosed in a single code segment.  For example, an entire\n  //   extend block (possibly containing multiple extension definitions) will\n  //   have an outer location whose path refers to the \"extensions\" repeated\n  //   field without an index.\n  // - Multiple locations may have the same path.  This happens when a single\n  //   logical declaration is spread out across multiple places.  The most\n  //   obvious example is the \"extend\" block again -- there may be multiple\n  //   extend blocks in the same scope, each of which will have the same path.\n  // - A location's span is not always a subset of its parent's span.  For\n  //   example, the \"extendee\" of an extension declaration appears at the\n  //   beginning of the \"extend\" block and is shared by all extensions within\n  //   the block.\n  // - Just because a location's span is a subset of some other location's span\n  //   does not mean that it is a descendant.  For example, a \"group\" defines\n  //   both a type and a field in a single declaration.  Thus, the locations\n  //   corresponding to the type and field and their components will overlap.\n  // - Code which tries to interpret locations should probably be designed to\n  //   ignore those that it doesn't understand, as more types of locations could\n  //   be recorded in the future.\n  repeated Location location = 1;\n  message Location {\n    // Identifies which part of the FileDescriptorProto was defined at this\n    // location.\n    //\n    // Each element is a field number or an index.  They form a path from\n    // the root FileDescriptorProto to the place where the definition occurs.\n    // For example, this path:\n    //   [ 4, 3, 2, 7, 1 ]\n    // refers to:\n    //   file.message_type(3)  // 4, 3\n    //       .field(7)         // 2, 7\n    //       .name()           // 1\n    // This is because FileDescriptorProto.message_type has field number 4:\n    //   repeated DescriptorProto message_type = 4;\n    // and DescriptorProto.field has field number 2:\n    //   repeated FieldDescriptorProto field = 2;\n    // and FieldDescriptorProto.name has field number 1:\n    //   optional string name = 1;\n    //\n    // Thus, the above path gives the location of a field name.  If we removed\n    // the last element:\n    //   [ 4, 3, 2, 7 ]\n    // this path refers to the whole field declaration (from the beginning\n    // of the label to the terminating semicolon).\n    repeated int32 path = 1 [packed = true];\n\n    // Always has exactly three or four elements: start line, start column,\n    // end line (optional, otherwise assumed same as start line), end column.\n    // These are packed into a single field for efficiency.  Note that line\n    // and column numbers are zero-based -- typically you will want to add\n    // 1 to each before displaying to a user.\n    repeated int32 span = 2 [packed = true];\n\n    // If this SourceCodeInfo represents a complete declaration, these are any\n    // comments appearing before and after the declaration which appear to be\n    // attached to the declaration.\n    //\n    // A series of line comments appearing on consecutive lines, with no other\n    // tokens appearing on those lines, will be treated as a single comment.\n    //\n    // leading_detached_comments will keep paragraphs of comments that appear\n    // before (but not connected to) the current element. Each paragraph,\n    // separated by empty lines, will be one comment element in the repeated\n    // field.\n    //\n    // Only the comment content is provided; comment markers (e.g. //) are\n    // stripped out.  For block comments, leading whitespace and an asterisk\n    // will be stripped from the beginning of each line other than the first.\n    // Newlines are included in the output.\n    //\n    // Examples:\n    //\n    //   optional int32 foo = 1;  // Comment attached to foo.\n    //   // Comment attached to bar.\n    //   optional int32 bar = 2;\n    //\n    //   optional string baz = 3;\n    //   // Comment attached to baz.\n    //   // Another line attached to baz.\n    //\n    //   // Comment attached to qux.\n    //   //\n    //   // Another line attached to qux.\n    //   optional double qux = 4;\n    //\n    //   // Detached comment for corge. This is not leading or trailing comments\n    //   // to qux or corge because there are blank lines separating it from\n    //   // both.\n    //\n    //   // Detached comment for corge paragraph 2.\n    //\n    //   optional string corge = 5;\n    //   /* Block comment attached\n    //    * to corge.  Leading asterisks\n    //    * will be removed. */\n    //   /* Block comment attached to\n    //    * grault. */\n    //   optional int32 grault = 6;\n    //\n    //   // ignored detached comments.\n    optional string leading_comments = 3;\n    optional string trailing_comments = 4;\n    repeated string leading_detached_comments = 6;\n  }\n}\n\n// Describes the relationship between generated code and its original source\n// file. A GeneratedCodeInfo message is associated with only one generated\n// source file, but may contain references to different source .proto files.\nmessage GeneratedCodeInfo {\n  // An Annotation connects some span of text in generated code to an element\n  // of its generating .proto file.\n  repeated Annotation annotation = 1;\n  message Annotation {\n    // Identifies the element in the original source .proto file. This field\n    // is formatted the same as SourceCodeInfo.Location.path.\n    repeated int32 path = 1 [packed = true];\n\n    // Identifies the filesystem path to the original source .proto.\n    optional string source_file = 2;\n\n    // Identifies the starting offset in bytes in the generated code\n    // that relates to the identified object.\n    optional int32 begin = 3;\n\n    // Identifies the ending offset in bytes in the generated code that\n    // relates to the identified offset. The end offset should be one past\n    // the last relevant byte (so the length of the text = end - begin).\n    optional int32 end = 4;\n  }\n}\n"
  },
  {
    "path": "service/cart/third_party/google/protobuf/duration.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption cc_enable_arenas = true;\noption go_package = \"google.golang.org/protobuf/types/known/durationpb\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"DurationProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\n\n// A Duration represents a signed, fixed-length span of time represented\n// as a count of seconds and fractions of seconds at nanosecond\n// resolution. It is independent of any calendar and concepts like \"day\"\n// or \"month\". It is related to Timestamp in that the difference between\n// two Timestamp values is a Duration and it can be added or subtracted\n// from a Timestamp. Range is approximately +-10,000 years.\n//\n// # Examples\n//\n// Example 1: Compute Duration from two Timestamps in pseudo code.\n//\n//     Timestamp start = ...;\n//     Timestamp end = ...;\n//     Duration duration = ...;\n//\n//     duration.seconds = end.seconds - start.seconds;\n//     duration.nanos = end.nanos - start.nanos;\n//\n//     if (duration.seconds < 0 && duration.nanos > 0) {\n//       duration.seconds += 1;\n//       duration.nanos -= 1000000000;\n//     } else if (duration.seconds > 0 && duration.nanos < 0) {\n//       duration.seconds -= 1;\n//       duration.nanos += 1000000000;\n//     }\n//\n// Example 2: Compute Timestamp from Timestamp + Duration in pseudo code.\n//\n//     Timestamp start = ...;\n//     Duration duration = ...;\n//     Timestamp end = ...;\n//\n//     end.seconds = start.seconds + duration.seconds;\n//     end.nanos = start.nanos + duration.nanos;\n//\n//     if (end.nanos < 0) {\n//       end.seconds -= 1;\n//       end.nanos += 1000000000;\n//     } else if (end.nanos >= 1000000000) {\n//       end.seconds += 1;\n//       end.nanos -= 1000000000;\n//     }\n//\n// Example 3: Compute Duration from datetime.timedelta in Python.\n//\n//     td = datetime.timedelta(days=3, minutes=10)\n//     duration = Duration()\n//     duration.FromTimedelta(td)\n//\n// # JSON Mapping\n//\n// In JSON format, the Duration type is encoded as a string rather than an\n// object, where the string ends in the suffix \"s\" (indicating seconds) and\n// is preceded by the number of seconds, with nanoseconds expressed as\n// fractional seconds. For example, 3 seconds with 0 nanoseconds should be\n// encoded in JSON format as \"3s\", while 3 seconds and 1 nanosecond should\n// be expressed in JSON format as \"3.000000001s\", and 3 seconds and 1\n// microsecond should be expressed in JSON format as \"3.000001s\".\n//\n//\nmessage Duration {\n  // Signed seconds of the span of time. Must be from -315,576,000,000\n  // to +315,576,000,000 inclusive. Note: these bounds are computed from:\n  // 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years\n  int64 seconds = 1;\n\n  // Signed fractions of a second at nanosecond resolution of the span\n  // of time. Durations less than one second are represented with a 0\n  // `seconds` field and a positive or negative `nanos` field. For durations\n  // of one second or more, a non-zero value for the `nanos` field must be\n  // of the same sign as the `seconds` field. Must be from -999,999,999\n  // to +999,999,999 inclusive.\n  int32 nanos = 2;\n}\n"
  },
  {
    "path": "service/cart/third_party/google/protobuf/empty.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption go_package = \"google.golang.org/protobuf/types/known/emptypb\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"EmptyProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\noption cc_enable_arenas = true;\n\n// A generic empty message that you can re-use to avoid defining duplicated\n// empty messages in your APIs. A typical example is to use it as the request\n// or the response type of an API method. For instance:\n//\n//     service Foo {\n//       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n//     }\n//\n// The JSON representation for `Empty` is empty JSON object `{}`.\nmessage Empty {}\n"
  },
  {
    "path": "service/cart/third_party/google/protobuf/field_mask.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"FieldMaskProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\noption go_package = \"google.golang.org/protobuf/types/known/fieldmaskpb\";\noption cc_enable_arenas = true;\n\n// `FieldMask` represents a set of symbolic field paths, for example:\n//\n//     paths: \"f.a\"\n//     paths: \"f.b.d\"\n//\n// Here `f` represents a field in some root message, `a` and `b`\n// fields in the message found in `f`, and `d` a field found in the\n// message in `f.b`.\n//\n// Field masks are used to specify a subset of fields that should be\n// returned by a get operation or modified by an update operation.\n// Field masks also have a custom JSON encoding (see below).\n//\n// # Field Masks in Projections\n//\n// When used in the context of a projection, a response message or\n// sub-message is filtered by the API to only contain those fields as\n// specified in the mask. For example, if the mask in the previous\n// example is applied to a response message as follows:\n//\n//     f {\n//       a : 22\n//       b {\n//         d : 1\n//         x : 2\n//       }\n//       y : 13\n//     }\n//     z: 8\n//\n// The result will not contain specific values for fields x,y and z\n// (their value will be set to the default, and omitted in proto text\n// output):\n//\n//\n//     f {\n//       a : 22\n//       b {\n//         d : 1\n//       }\n//     }\n//\n// A repeated field is not allowed except at the last position of a\n// paths string.\n//\n// If a FieldMask object is not present in a get operation, the\n// operation applies to all fields (as if a FieldMask of all fields\n// had been specified).\n//\n// Note that a field mask does not necessarily apply to the\n// top-level response message. In case of a REST get operation, the\n// field mask applies directly to the response, but in case of a REST\n// list operation, the mask instead applies to each individual message\n// in the returned resource list. In case of a REST custom method,\n// other definitions may be used. Where the mask applies will be\n// clearly documented together with its declaration in the API.  In\n// any case, the effect on the returned resource/resources is required\n// behavior for APIs.\n//\n// # Field Masks in Update Operations\n//\n// A field mask in update operations specifies which fields of the\n// targeted resource are going to be updated. The API is required\n// to only change the values of the fields as specified in the mask\n// and leave the others untouched. If a resource is passed in to\n// describe the updated values, the API ignores the values of all\n// fields not covered by the mask.\n//\n// If a repeated field is specified for an update operation, new values will\n// be appended to the existing repeated field in the target resource. Note that\n// a repeated field is only allowed in the last position of a `paths` string.\n//\n// If a sub-message is specified in the last position of the field mask for an\n// update operation, then new value will be merged into the existing sub-message\n// in the target resource.\n//\n// For example, given the target message:\n//\n//     f {\n//       b {\n//         d: 1\n//         x: 2\n//       }\n//       c: [1]\n//     }\n//\n// And an update message:\n//\n//     f {\n//       b {\n//         d: 10\n//       }\n//       c: [2]\n//     }\n//\n// then if the field mask is:\n//\n//  paths: [\"f.b\", \"f.c\"]\n//\n// then the result will be:\n//\n//     f {\n//       b {\n//         d: 10\n//         x: 2\n//       }\n//       c: [1, 2]\n//     }\n//\n// An implementation may provide options to override this default behavior for\n// repeated and message fields.\n//\n// In order to reset a field's value to the default, the field must\n// be in the mask and set to the default value in the provided resource.\n// Hence, in order to reset all fields of a resource, provide a default\n// instance of the resource and set all fields in the mask, or do\n// not provide a mask as described below.\n//\n// If a field mask is not present on update, the operation applies to\n// all fields (as if a field mask of all fields has been specified).\n// Note that in the presence of schema evolution, this may mean that\n// fields the client does not know and has therefore not filled into\n// the request will be reset to their default. If this is unwanted\n// behavior, a specific service may require a client to always specify\n// a field mask, producing an error if not.\n//\n// As with get operations, the location of the resource which\n// describes the updated values in the request message depends on the\n// operation kind. In any case, the effect of the field mask is\n// required to be honored by the API.\n//\n// ## Considerations for HTTP REST\n//\n// The HTTP kind of an update operation which uses a field mask must\n// be set to PATCH instead of PUT in order to satisfy HTTP semantics\n// (PUT must only be used for full updates).\n//\n// # JSON Encoding of Field Masks\n//\n// In JSON, a field mask is encoded as a single string where paths are\n// separated by a comma. Fields name in each path are converted\n// to/from lower-camel naming conventions.\n//\n// As an example, consider the following message declarations:\n//\n//     message Profile {\n//       User user = 1;\n//       Photo photo = 2;\n//     }\n//     message User {\n//       string display_name = 1;\n//       string address = 2;\n//     }\n//\n// In proto a field mask for `Profile` may look as such:\n//\n//     mask {\n//       paths: \"user.display_name\"\n//       paths: \"photo\"\n//     }\n//\n// In JSON, the same mask is represented as below:\n//\n//     {\n//       mask: \"user.displayName,photo\"\n//     }\n//\n// # Field Masks and Oneof Fields\n//\n// Field masks treat fields in oneofs just as regular fields. Consider the\n// following message:\n//\n//     message SampleMessage {\n//       oneof test_oneof {\n//         string name = 4;\n//         SubMessage sub_message = 9;\n//       }\n//     }\n//\n// The field mask can be:\n//\n//     mask {\n//       paths: \"name\"\n//     }\n//\n// Or:\n//\n//     mask {\n//       paths: \"sub_message\"\n//     }\n//\n// Note that oneof type names (\"test_oneof\" in this case) cannot be used in\n// paths.\n//\n// ## Field Mask Verification\n//\n// The implementation of any API method which has a FieldMask type field in the\n// request should verify the included field paths, and return an\n// `INVALID_ARGUMENT` error if any path is unmappable.\nmessage FieldMask {\n  // The set of field mask paths.\n  repeated string paths = 1;\n}\n"
  },
  {
    "path": "service/cart/third_party/google/protobuf/source_context.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"SourceContextProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\noption go_package = \"google.golang.org/protobuf/types/known/sourcecontextpb\";\n\n// `SourceContext` represents information about the source of a\n// protobuf element, like the file in which it is defined.\nmessage SourceContext {\n  // The path-qualified name of the .proto file that contained the associated\n  // protobuf element.  For example: `\"google/protobuf/source_context.proto\"`.\n  string file_name = 1;\n}\n"
  },
  {
    "path": "service/cart/third_party/google/protobuf/struct.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption cc_enable_arenas = true;\noption go_package = \"google.golang.org/protobuf/types/known/structpb\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"StructProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\n\n// `Struct` represents a structured data value, consisting of fields\n// which map to dynamically typed values. In some languages, `Struct`\n// might be supported by a native representation. For example, in\n// scripting languages like JS a struct is represented as an\n// object. The details of that representation are described together\n// with the proto support for the language.\n//\n// The JSON representation for `Struct` is JSON object.\nmessage Struct {\n  // Unordered map of dynamically typed values.\n  map<string, Value> fields = 1;\n}\n\n// `Value` represents a dynamically typed value which can be either\n// null, a number, a string, a boolean, a recursive struct value, or a\n// list of values. A producer of value is expected to set one of these\n// variants. Absence of any variant indicates an error.\n//\n// The JSON representation for `Value` is JSON value.\nmessage Value {\n  // The kind of value.\n  oneof kind {\n    // Represents a null value.\n    NullValue null_value = 1;\n    // Represents a double value.\n    double number_value = 2;\n    // Represents a string value.\n    string string_value = 3;\n    // Represents a boolean value.\n    bool bool_value = 4;\n    // Represents a structured value.\n    Struct struct_value = 5;\n    // Represents a repeated `Value`.\n    ListValue list_value = 6;\n  }\n}\n\n// `NullValue` is a singleton enumeration to represent the null value for the\n// `Value` type union.\n//\n//  The JSON representation for `NullValue` is JSON `null`.\nenum NullValue {\n  // Null value.\n  NULL_VALUE = 0;\n}\n\n// `ListValue` is a wrapper around a repeated field of values.\n//\n// The JSON representation for `ListValue` is JSON array.\nmessage ListValue {\n  // Repeated field of dynamically typed values.\n  repeated Value values = 1;\n}\n"
  },
  {
    "path": "service/cart/third_party/google/protobuf/timestamp.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption cc_enable_arenas = true;\noption go_package = \"google.golang.org/protobuf/types/known/timestamppb\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"TimestampProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\n\n// A Timestamp represents a point in time independent of any time zone or local\n// calendar, encoded as a count of seconds and fractions of seconds at\n// nanosecond resolution. The count is relative to an epoch at UTC midnight on\n// January 1, 1970, in the proleptic Gregorian calendar which extends the\n// Gregorian calendar backwards to year one.\n//\n// All minutes are 60 seconds long. Leap seconds are \"smeared\" so that no leap\n// second table is needed for interpretation, using a [24-hour linear\n// smear](https://developers.google.com/time/smear).\n//\n// The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By\n// restricting to that range, we ensure that we can convert to and from [RFC\n// 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.\n//\n// # Examples\n//\n// Example 1: Compute Timestamp from POSIX `time()`.\n//\n//     Timestamp timestamp;\n//     timestamp.set_seconds(time(NULL));\n//     timestamp.set_nanos(0);\n//\n// Example 2: Compute Timestamp from POSIX `gettimeofday()`.\n//\n//     struct timeval tv;\n//     gettimeofday(&tv, NULL);\n//\n//     Timestamp timestamp;\n//     timestamp.set_seconds(tv.tv_sec);\n//     timestamp.set_nanos(tv.tv_usec * 1000);\n//\n// Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`.\n//\n//     FILETIME ft;\n//     GetSystemTimeAsFileTime(&ft);\n//     UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime;\n//\n//     // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z\n//     // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.\n//     Timestamp timestamp;\n//     timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));\n//     timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));\n//\n// Example 4: Compute Timestamp from Java `System.currentTimeMillis()`.\n//\n//     long millis = System.currentTimeMillis();\n//\n//     Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)\n//         .setNanos((int) ((millis % 1000) * 1000000)).build();\n//\n//\n// Example 5: Compute Timestamp from Java `Instant.now()`.\n//\n//     Instant now = Instant.now();\n//\n//     Timestamp timestamp =\n//         Timestamp.newBuilder().setSeconds(now.getEpochSecond())\n//             .setNanos(now.getNano()).build();\n//\n//\n// Example 6: Compute Timestamp from current time in Python.\n//\n//     timestamp = Timestamp()\n//     timestamp.GetCurrentTime()\n//\n// # JSON Mapping\n//\n// In JSON format, the Timestamp type is encoded as a string in the\n// [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the\n// format is \"{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z\"\n// where {year} is always expressed using four digits while {month}, {day},\n// {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional\n// seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution),\n// are optional. The \"Z\" suffix indicates the timezone (\"UTC\"); the timezone\n// is required. A proto3 JSON serializer should always use UTC (as indicated by\n// \"Z\") when printing the Timestamp type and a proto3 JSON parser should be\n// able to accept both UTC and other timezones (as indicated by an offset).\n//\n// For example, \"2017-01-15T01:30:15.01Z\" encodes 15.01 seconds past\n// 01:30 UTC on January 15, 2017.\n//\n// In JavaScript, one can convert a Date object to this format using the\n// standard\n// [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString)\n// method. In Python, a standard `datetime.datetime` object can be converted\n// to this format using\n// [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with\n// the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use\n// the Joda Time's [`ISODateTimeFormat.dateTime()`](\n// http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime%2D%2D\n// ) to obtain a formatter capable of generating timestamps in this format.\n//\n//\nmessage Timestamp {\n  // Represents seconds of UTC time since Unix epoch\n  // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to\n  // 9999-12-31T23:59:59Z inclusive.\n  int64 seconds = 1;\n\n  // Non-negative fractions of a second at nanosecond resolution. Negative\n  // second values with fractions must still have non-negative nanos values\n  // that count forward in time. Must be from 0 to 999,999,999\n  // inclusive.\n  int32 nanos = 2;\n}\n"
  },
  {
    "path": "service/cart/third_party/google/protobuf/type.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\nimport \"google/protobuf/any.proto\";\nimport \"google/protobuf/source_context.proto\";\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption cc_enable_arenas = true;\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"TypeProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\noption go_package = \"google.golang.org/protobuf/types/known/typepb\";\n\n// A protocol buffer message type.\nmessage Type {\n  // The fully qualified message name.\n  string name = 1;\n  // The list of fields.\n  repeated Field fields = 2;\n  // The list of types appearing in `oneof` definitions in this type.\n  repeated string oneofs = 3;\n  // The protocol buffer options.\n  repeated Option options = 4;\n  // The source context.\n  SourceContext source_context = 5;\n  // The source syntax.\n  Syntax syntax = 6;\n}\n\n// A single field of a message type.\nmessage Field {\n  // Basic field types.\n  enum Kind {\n    // Field type unknown.\n    TYPE_UNKNOWN = 0;\n    // Field type double.\n    TYPE_DOUBLE = 1;\n    // Field type float.\n    TYPE_FLOAT = 2;\n    // Field type int64.\n    TYPE_INT64 = 3;\n    // Field type uint64.\n    TYPE_UINT64 = 4;\n    // Field type int32.\n    TYPE_INT32 = 5;\n    // Field type fixed64.\n    TYPE_FIXED64 = 6;\n    // Field type fixed32.\n    TYPE_FIXED32 = 7;\n    // Field type bool.\n    TYPE_BOOL = 8;\n    // Field type string.\n    TYPE_STRING = 9;\n    // Field type group. Proto2 syntax only, and deprecated.\n    TYPE_GROUP = 10;\n    // Field type message.\n    TYPE_MESSAGE = 11;\n    // Field type bytes.\n    TYPE_BYTES = 12;\n    // Field type uint32.\n    TYPE_UINT32 = 13;\n    // Field type enum.\n    TYPE_ENUM = 14;\n    // Field type sfixed32.\n    TYPE_SFIXED32 = 15;\n    // Field type sfixed64.\n    TYPE_SFIXED64 = 16;\n    // Field type sint32.\n    TYPE_SINT32 = 17;\n    // Field type sint64.\n    TYPE_SINT64 = 18;\n  }\n\n  // Whether a field is optional, required, or repeated.\n  enum Cardinality {\n    // For fields with unknown cardinality.\n    CARDINALITY_UNKNOWN = 0;\n    // For optional fields.\n    CARDINALITY_OPTIONAL = 1;\n    // For required fields. Proto2 syntax only.\n    CARDINALITY_REQUIRED = 2;\n    // For repeated fields.\n    CARDINALITY_REPEATED = 3;\n  }\n\n  // The field type.\n  Kind kind = 1;\n  // The field cardinality.\n  Cardinality cardinality = 2;\n  // The field number.\n  int32 number = 3;\n  // The field name.\n  string name = 4;\n  // The field type URL, without the scheme, for message or enumeration\n  // types. Example: `\"type.googleapis.com/google.protobuf.Timestamp\"`.\n  string type_url = 6;\n  // The index of the field type in `Type.oneofs`, for message or enumeration\n  // types. The first type has index 1; zero means the type is not in the list.\n  int32 oneof_index = 7;\n  // Whether to use alternative packed wire representation.\n  bool packed = 8;\n  // The protocol buffer options.\n  repeated Option options = 9;\n  // The field JSON name.\n  string json_name = 10;\n  // The string value of the default value of this field. Proto2 syntax only.\n  string default_value = 11;\n}\n\n// Enum type definition.\nmessage Enum {\n  // Enum type name.\n  string name = 1;\n  // Enum value definitions.\n  repeated EnumValue enumvalue = 2;\n  // Protocol buffer options.\n  repeated Option options = 3;\n  // The source context.\n  SourceContext source_context = 4;\n  // The source syntax.\n  Syntax syntax = 5;\n}\n\n// Enum value definition.\nmessage EnumValue {\n  // Enum value name.\n  string name = 1;\n  // Enum value number.\n  int32 number = 2;\n  // Protocol buffer options.\n  repeated Option options = 3;\n}\n\n// A protocol buffer option, which can be attached to a message, field,\n// enumeration, etc.\nmessage Option {\n  // The option's name. For protobuf built-in options (options defined in\n  // descriptor.proto), this is the short name. For example, `\"map_entry\"`.\n  // For custom options, it should be the fully-qualified name. For example,\n  // `\"google.api.http\"`.\n  string name = 1;\n  // The option's value packed in an Any message. If the value is a primitive,\n  // the corresponding wrapper type defined in google/protobuf/wrappers.proto\n  // should be used. If the value is an enum, it should be stored as an int32\n  // value using the google.protobuf.Int32Value type.\n  Any value = 2;\n}\n\n// The syntax in which a protocol buffer element is defined.\nenum Syntax {\n  // Syntax `proto2`.\n  SYNTAX_PROTO2 = 0;\n  // Syntax `proto3`.\n  SYNTAX_PROTO3 = 1;\n}\n"
  },
  {
    "path": "service/cart/third_party/google/protobuf/wrappers.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Wrappers for primitive (non-message) types. These types are useful\n// for embedding primitives in the `google.protobuf.Any` type and for places\n// where we need to distinguish between the absence of a primitive\n// typed field and its default value.\n//\n// These wrappers have no meaningful use within repeated fields as they lack\n// the ability to detect presence on individual elements.\n// These wrappers have no meaningful use within a map or a oneof since\n// individual entries of a map or fields of a oneof can already detect presence.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption cc_enable_arenas = true;\noption go_package = \"google.golang.org/protobuf/types/known/wrapperspb\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"WrappersProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\n\n// Wrapper message for `double`.\n//\n// The JSON representation for `DoubleValue` is JSON number.\nmessage DoubleValue {\n  // The double value.\n  double value = 1;\n}\n\n// Wrapper message for `float`.\n//\n// The JSON representation for `FloatValue` is JSON number.\nmessage FloatValue {\n  // The float value.\n  float value = 1;\n}\n\n// Wrapper message for `int64`.\n//\n// The JSON representation for `Int64Value` is JSON string.\nmessage Int64Value {\n  // The int64 value.\n  int64 value = 1;\n}\n\n// Wrapper message for `uint64`.\n//\n// The JSON representation for `UInt64Value` is JSON string.\nmessage UInt64Value {\n  // The uint64 value.\n  uint64 value = 1;\n}\n\n// Wrapper message for `int32`.\n//\n// The JSON representation for `Int32Value` is JSON number.\nmessage Int32Value {\n  // The int32 value.\n  int32 value = 1;\n}\n\n// Wrapper message for `uint32`.\n//\n// The JSON representation for `UInt32Value` is JSON number.\nmessage UInt32Value {\n  // The uint32 value.\n  uint32 value = 1;\n}\n\n// Wrapper message for `bool`.\n//\n// The JSON representation for `BoolValue` is JSON `true` and `false`.\nmessage BoolValue {\n  // The bool value.\n  bool value = 1;\n}\n\n// Wrapper message for `string`.\n//\n// The JSON representation for `StringValue` is JSON string.\nmessage StringValue {\n  // The string value.\n  string value = 1;\n}\n\n// Wrapper message for `bytes`.\n//\n// The JSON representation for `BytesValue` is JSON string.\nmessage BytesValue {\n  // The bytes value.\n  bytes value = 1;\n}\n"
  },
  {
    "path": "service/cart/third_party/openapi/v3/annotations.proto",
    "content": "// Copyright 2022 Google LLC. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//    http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\npackage openapi.v3;\n\nimport \"openapiv3/OpenAPIv3.proto\";\nimport \"google/protobuf/descriptor.proto\";\n\n// This option lets the proto compiler generate Java code inside the package\n// name (see below) instead of inside an outer class. It creates a simpler\n// developer experience by reducing one-level of name nesting and be\n// consistent with most programming languages that don't support outer classes.\noption java_multiple_files = true;\n\n// The Java outer classname should be the filename in UpperCamelCase. This\n// class is only used to hold proto descriptor, so developers don't need to\n// work with it directly.\noption java_outer_classname = \"AnnotationsProto\";\n\n// The Java package name must be proto package name with proper prefix.\noption java_package = \"org.openapi_v3\";\n\n// A reasonable prefix for the Objective-C symbols generated from the package.\n// It should at a minimum be 3 characters long, all uppercase, and convention\n// is to use an abbreviation of the package name. Something short, but\n// hopefully unique enough to not conflict with things that may come along in\n// the future. 'GPB' is reserved for the protocol buffer implementation itself.\noption objc_class_prefix = \"OAS\";\n\n// The Go package name.\noption go_package = \"github.com/google/gnostic/openapiv3;openapi_v3\";\n\nextend google.protobuf.FileOptions {\n  Document document = 1143;\n}\n\nextend google.protobuf.MethodOptions {\n  Operation operation = 1143;\n}\n\nextend google.protobuf.MessageOptions {\n  Schema schema = 1143;\n}\n\nextend google.protobuf.FieldOptions {\n  Schema property = 1143;\n}"
  },
  {
    "path": "service/cart/third_party/openapi/v3/openapi.proto",
    "content": "// Copyright 2020 Google LLC. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//    http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// THIS FILE IS AUTOMATICALLY GENERATED.\n\nsyntax = \"proto3\";\n\npackage openapi.v3;\n\nimport \"google/protobuf/any.proto\";\n\n// This option lets the proto compiler generate Java code inside the package\n// name (see below) instead of inside an outer class. It creates a simpler\n// developer experience by reducing one-level of name nesting and be\n// consistent with most programming languages that don't support outer classes.\noption java_multiple_files = true;\n\n// The Java outer classname should be the filename in UpperCamelCase. This\n// class is only used to hold proto descriptor, so developers don't need to\n// work with it directly.\noption java_outer_classname = \"OpenAPIProto\";\n\n// The Java package name must be proto package name with proper prefix.\noption java_package = \"org.openapi_v3\";\n\n// A reasonable prefix for the Objective-C symbols generated from the package.\n// It should at a minimum be 3 characters long, all uppercase, and convention\n// is to use an abbreviation of the package name. Something short, but\n// hopefully unique enough to not conflict with things that may come along in\n// the future. 'GPB' is reserved for the protocol buffer implementation itself.\noption objc_class_prefix = \"OAS\";\n\n// The Go package name.\noption go_package = \"github.com/google/gnostic/openapiv3;openapi_v3\";\n\nmessage AdditionalPropertiesItem {\n  oneof oneof {\n    SchemaOrReference schema_or_reference = 1;\n    bool boolean = 2;\n  }\n}\n\nmessage Any {\n  google.protobuf.Any value = 1;\n  string yaml = 2;\n}\n\nmessage AnyOrExpression {\n  oneof oneof {\n    Any any = 1;\n    Expression expression = 2;\n  }\n}\n\n// A map of possible out-of band callbacks related to the parent operation. Each value in the map is a Path Item Object that describes a set of requests that may be initiated by the API provider and the expected responses. The key value used to identify the callback object is an expression, evaluated at runtime, that identifies a URL to use for the callback operation.\nmessage Callback {\n  repeated NamedPathItem path = 1;\n  repeated NamedAny specification_extension = 2;\n}\n\nmessage CallbackOrReference {\n  oneof oneof {\n    Callback callback = 1;\n    Reference reference = 2;\n  }\n}\n\nmessage CallbacksOrReferences {\n  repeated NamedCallbackOrReference additional_properties = 1;\n}\n\n// Holds a set of reusable objects for different aspects of the OAS. All objects defined within the components object will have no effect on the API unless they are explicitly referenced from properties outside the components object.\nmessage Components {\n  SchemasOrReferences schemas = 1;\n  ResponsesOrReferences responses = 2;\n  ParametersOrReferences parameters = 3;\n  ExamplesOrReferences examples = 4;\n  RequestBodiesOrReferences request_bodies = 5;\n  HeadersOrReferences headers = 6;\n  SecuritySchemesOrReferences security_schemes = 7;\n  LinksOrReferences links = 8;\n  CallbacksOrReferences callbacks = 9;\n  repeated NamedAny specification_extension = 10;\n}\n\n// Contact information for the exposed API.\nmessage Contact {\n  string name = 1;\n  string url = 2;\n  string email = 3;\n  repeated NamedAny specification_extension = 4;\n}\n\nmessage DefaultType {\n  oneof oneof {\n    double number = 1;\n    bool boolean = 2;\n    string string = 3;\n  }\n}\n\n// When request bodies or response payloads may be one of a number of different schemas, a `discriminator` object can be used to aid in serialization, deserialization, and validation.  The discriminator is a specific object in a schema which is used to inform the consumer of the specification of an alternative schema based on the value associated with it.  When using the discriminator, _inline_ schemas will not be considered.\nmessage Discriminator {\n  string property_name = 1;\n  Strings mapping = 2;\n  repeated NamedAny specification_extension = 3;\n}\n\nmessage Document {\n  string openapi = 1;\n  Info info = 2;\n  repeated Server servers = 3;\n  Paths paths = 4;\n  Components components = 5;\n  repeated SecurityRequirement security = 6;\n  repeated Tag tags = 7;\n  ExternalDocs external_docs = 8;\n  repeated NamedAny specification_extension = 9;\n}\n\n// A single encoding definition applied to a single schema property.\nmessage Encoding {\n  string content_type = 1;\n  HeadersOrReferences headers = 2;\n  string style = 3;\n  bool explode = 4;\n  bool allow_reserved = 5;\n  repeated NamedAny specification_extension = 6;\n}\n\nmessage Encodings {\n  repeated NamedEncoding additional_properties = 1;\n}\n\nmessage Example {\n  string summary = 1;\n  string description = 2;\n  Any value = 3;\n  string external_value = 4;\n  repeated NamedAny specification_extension = 5;\n}\n\nmessage ExampleOrReference {\n  oneof oneof {\n    Example example = 1;\n    Reference reference = 2;\n  }\n}\n\nmessage ExamplesOrReferences {\n  repeated NamedExampleOrReference additional_properties = 1;\n}\n\nmessage Expression {\n  repeated NamedAny additional_properties = 1;\n}\n\n// Allows referencing an external resource for extended documentation.\nmessage ExternalDocs {\n  string description = 1;\n  string url = 2;\n  repeated NamedAny specification_extension = 3;\n}\n\n// The Header Object follows the structure of the Parameter Object with the following changes:  1. `name` MUST NOT be specified, it is given in the corresponding `headers` map. 1. `in` MUST NOT be specified, it is implicitly in `header`. 1. All traits that are affected by the location MUST be applicable to a location of `header` (for example, `style`).\nmessage Header {\n  string description = 1;\n  bool required = 2;\n  bool deprecated = 3;\n  bool allow_empty_value = 4;\n  string style = 5;\n  bool explode = 6;\n  bool allow_reserved = 7;\n  SchemaOrReference schema = 8;\n  Any example = 9;\n  ExamplesOrReferences examples = 10;\n  MediaTypes content = 11;\n  repeated NamedAny specification_extension = 12;\n}\n\nmessage HeaderOrReference {\n  oneof oneof {\n    Header header = 1;\n    Reference reference = 2;\n  }\n}\n\nmessage HeadersOrReferences {\n  repeated NamedHeaderOrReference additional_properties = 1;\n}\n\n// The object provides metadata about the API. The metadata MAY be used by the clients if needed, and MAY be presented in editing or documentation generation tools for convenience.\nmessage Info {\n  string title = 1;\n  string description = 2;\n  string terms_of_service = 3;\n  Contact contact = 4;\n  License license = 5;\n  string version = 6;\n  repeated NamedAny specification_extension = 7;\n  string summary = 8;\n}\n\nmessage ItemsItem {\n  repeated SchemaOrReference schema_or_reference = 1;\n}\n\n// License information for the exposed API.\nmessage License {\n  string name = 1;\n  string url = 2;\n  repeated NamedAny specification_extension = 3;\n}\n\n// The `Link object` represents a possible design-time link for a response. The presence of a link does not guarantee the caller's ability to successfully invoke it, rather it provides a known relationship and traversal mechanism between responses and other operations.  Unlike _dynamic_ links (i.e. links provided **in** the response payload), the OAS linking mechanism does not require link information in the runtime response.  For computing links, and providing instructions to execute them, a runtime expression is used for accessing values in an operation and using them as parameters while invoking the linked operation.\nmessage Link {\n  string operation_ref = 1;\n  string operation_id = 2;\n  AnyOrExpression parameters = 3;\n  AnyOrExpression request_body = 4;\n  string description = 5;\n  Server server = 6;\n  repeated NamedAny specification_extension = 7;\n}\n\nmessage LinkOrReference {\n  oneof oneof {\n    Link link = 1;\n    Reference reference = 2;\n  }\n}\n\nmessage LinksOrReferences {\n  repeated NamedLinkOrReference additional_properties = 1;\n}\n\n// Each Media Type Object provides schema and examples for the media type identified by its key.\nmessage MediaType {\n  SchemaOrReference schema = 1;\n  Any example = 2;\n  ExamplesOrReferences examples = 3;\n  Encodings encoding = 4;\n  repeated NamedAny specification_extension = 5;\n}\n\nmessage MediaTypes {\n  repeated NamedMediaType additional_properties = 1;\n}\n\n// Automatically-generated message used to represent maps of Any as ordered (name,value) pairs.\nmessage NamedAny {\n  // Map key\n  string name = 1;\n  // Mapped value\n  Any value = 2;\n}\n\n// Automatically-generated message used to represent maps of CallbackOrReference as ordered (name,value) pairs.\nmessage NamedCallbackOrReference {\n  // Map key\n  string name = 1;\n  // Mapped value\n  CallbackOrReference value = 2;\n}\n\n// Automatically-generated message used to represent maps of Encoding as ordered (name,value) pairs.\nmessage NamedEncoding {\n  // Map key\n  string name = 1;\n  // Mapped value\n  Encoding value = 2;\n}\n\n// Automatically-generated message used to represent maps of ExampleOrReference as ordered (name,value) pairs.\nmessage NamedExampleOrReference {\n  // Map key\n  string name = 1;\n  // Mapped value\n  ExampleOrReference value = 2;\n}\n\n// Automatically-generated message used to represent maps of HeaderOrReference as ordered (name,value) pairs.\nmessage NamedHeaderOrReference {\n  // Map key\n  string name = 1;\n  // Mapped value\n  HeaderOrReference value = 2;\n}\n\n// Automatically-generated message used to represent maps of LinkOrReference as ordered (name,value) pairs.\nmessage NamedLinkOrReference {\n  // Map key\n  string name = 1;\n  // Mapped value\n  LinkOrReference value = 2;\n}\n\n// Automatically-generated message used to represent maps of MediaType as ordered (name,value) pairs.\nmessage NamedMediaType {\n  // Map key\n  string name = 1;\n  // Mapped value\n  MediaType value = 2;\n}\n\n// Automatically-generated message used to represent maps of ParameterOrReference as ordered (name,value) pairs.\nmessage NamedParameterOrReference {\n  // Map key\n  string name = 1;\n  // Mapped value\n  ParameterOrReference value = 2;\n}\n\n// Automatically-generated message used to represent maps of PathItem as ordered (name,value) pairs.\nmessage NamedPathItem {\n  // Map key\n  string name = 1;\n  // Mapped value\n  PathItem value = 2;\n}\n\n// Automatically-generated message used to represent maps of RequestBodyOrReference as ordered (name,value) pairs.\nmessage NamedRequestBodyOrReference {\n  // Map key\n  string name = 1;\n  // Mapped value\n  RequestBodyOrReference value = 2;\n}\n\n// Automatically-generated message used to represent maps of ResponseOrReference as ordered (name,value) pairs.\nmessage NamedResponseOrReference {\n  // Map key\n  string name = 1;\n  // Mapped value\n  ResponseOrReference value = 2;\n}\n\n// Automatically-generated message used to represent maps of SchemaOrReference as ordered (name,value) pairs.\nmessage NamedSchemaOrReference {\n  // Map key\n  string name = 1;\n  // Mapped value\n  SchemaOrReference value = 2;\n}\n\n// Automatically-generated message used to represent maps of SecuritySchemeOrReference as ordered (name,value) pairs.\nmessage NamedSecuritySchemeOrReference {\n  // Map key\n  string name = 1;\n  // Mapped value\n  SecuritySchemeOrReference value = 2;\n}\n\n// Automatically-generated message used to represent maps of ServerVariable as ordered (name,value) pairs.\nmessage NamedServerVariable {\n  // Map key\n  string name = 1;\n  // Mapped value\n  ServerVariable value = 2;\n}\n\n// Automatically-generated message used to represent maps of string as ordered (name,value) pairs.\nmessage NamedString {\n  // Map key\n  string name = 1;\n  // Mapped value\n  string value = 2;\n}\n\n// Automatically-generated message used to represent maps of StringArray as ordered (name,value) pairs.\nmessage NamedStringArray {\n  // Map key\n  string name = 1;\n  // Mapped value\n  StringArray value = 2;\n}\n\n// Configuration details for a supported OAuth Flow\nmessage OauthFlow {\n  string authorization_url = 1;\n  string token_url = 2;\n  string refresh_url = 3;\n  Strings scopes = 4;\n  repeated NamedAny specification_extension = 5;\n}\n\n// Allows configuration of the supported OAuth Flows.\nmessage OauthFlows {\n  OauthFlow implicit = 1;\n  OauthFlow password = 2;\n  OauthFlow client_credentials = 3;\n  OauthFlow authorization_code = 4;\n  repeated NamedAny specification_extension = 5;\n}\n\nmessage Object {\n  repeated NamedAny additional_properties = 1;\n}\n\n// Describes a single API operation on a path.\nmessage Operation {\n  repeated string tags = 1;\n  string summary = 2;\n  string description = 3;\n  ExternalDocs external_docs = 4;\n  string operation_id = 5;\n  repeated ParameterOrReference parameters = 6;\n  RequestBodyOrReference request_body = 7;\n  Responses responses = 8;\n  CallbacksOrReferences callbacks = 9;\n  bool deprecated = 10;\n  repeated SecurityRequirement security = 11;\n  repeated Server servers = 12;\n  repeated NamedAny specification_extension = 13;\n}\n\n// Describes a single operation parameter.  A unique parameter is defined by a combination of a name and location.\nmessage Parameter {\n  string name = 1;\n  string in = 2;\n  string description = 3;\n  bool required = 4;\n  bool deprecated = 5;\n  bool allow_empty_value = 6;\n  string style = 7;\n  bool explode = 8;\n  bool allow_reserved = 9;\n  SchemaOrReference schema = 10;\n  Any example = 11;\n  ExamplesOrReferences examples = 12;\n  MediaTypes content = 13;\n  repeated NamedAny specification_extension = 14;\n}\n\nmessage ParameterOrReference {\n  oneof oneof {\n    Parameter parameter = 1;\n    Reference reference = 2;\n  }\n}\n\nmessage ParametersOrReferences {\n  repeated NamedParameterOrReference additional_properties = 1;\n}\n\n// Describes the operations available on a single path. A Path Item MAY be empty, due to ACL constraints. The path itself is still exposed to the documentation viewer but they will not know which operations and parameters are available.\nmessage PathItem {\n  string _ref = 1;\n  string summary = 2;\n  string description = 3;\n  Operation get = 4;\n  Operation put = 5;\n  Operation post = 6;\n  Operation delete = 7;\n  Operation options = 8;\n  Operation head = 9;\n  Operation patch = 10;\n  Operation trace = 11;\n  repeated Server servers = 12;\n  repeated ParameterOrReference parameters = 13;\n  repeated NamedAny specification_extension = 14;\n}\n\n// Holds the relative paths to the individual endpoints and their operations. The path is appended to the URL from the `Server Object` in order to construct the full URL.  The Paths MAY be empty, due to ACL constraints.\nmessage Paths {\n  repeated NamedPathItem path = 1;\n  repeated NamedAny specification_extension = 2;\n}\n\nmessage Properties {\n  repeated NamedSchemaOrReference additional_properties = 1;\n}\n\n// A simple object to allow referencing other components in the specification, internally and externally.  The Reference Object is defined by JSON Reference and follows the same structure, behavior and rules.   For this specification, reference resolution is accomplished as defined by the JSON Reference specification and not by the JSON Schema specification.\nmessage Reference {\n  string _ref = 1;\n  string summary = 2;\n  string description = 3;\n}\n\nmessage RequestBodiesOrReferences {\n  repeated NamedRequestBodyOrReference additional_properties = 1;\n}\n\n// Describes a single request body.\nmessage RequestBody {\n  string description = 1;\n  MediaTypes content = 2;\n  bool required = 3;\n  repeated NamedAny specification_extension = 4;\n}\n\nmessage RequestBodyOrReference {\n  oneof oneof {\n    RequestBody request_body = 1;\n    Reference reference = 2;\n  }\n}\n\n// Describes a single response from an API Operation, including design-time, static  `links` to operations based on the response.\nmessage Response {\n  string description = 1;\n  HeadersOrReferences headers = 2;\n  MediaTypes content = 3;\n  LinksOrReferences links = 4;\n  repeated NamedAny specification_extension = 5;\n}\n\nmessage ResponseOrReference {\n  oneof oneof {\n    Response response = 1;\n    Reference reference = 2;\n  }\n}\n\n// A container for the expected responses of an operation. The container maps a HTTP response code to the expected response.  The documentation is not necessarily expected to cover all possible HTTP response codes because they may not be known in advance. However, documentation is expected to cover a successful operation response and any known errors.  The `default` MAY be used as a default response object for all HTTP codes  that are not covered individually by the specification.  The `Responses Object` MUST contain at least one response code, and it  SHOULD be the response for a successful operation call.\nmessage Responses {\n  ResponseOrReference default = 1;\n  repeated NamedResponseOrReference response_or_reference = 2;\n  repeated NamedAny specification_extension = 3;\n}\n\nmessage ResponsesOrReferences {\n  repeated NamedResponseOrReference additional_properties = 1;\n}\n\n// The Schema Object allows the definition of input and output data types. These types can be objects, but also primitives and arrays. This object is an extended subset of the JSON Schema Specification Wright Draft 00.  For more information about the properties, see JSON Schema Core and JSON Schema Validation. Unless stated otherwise, the property definitions follow the JSON Schema.\nmessage Schema {\n  bool nullable = 1;\n  Discriminator discriminator = 2;\n  bool read_only = 3;\n  bool write_only = 4;\n  Xml xml = 5;\n  ExternalDocs external_docs = 6;\n  Any example = 7;\n  bool deprecated = 8;\n  string title = 9;\n  double multiple_of = 10;\n  double maximum = 11;\n  bool exclusive_maximum = 12;\n  double minimum = 13;\n  bool exclusive_minimum = 14;\n  int64 max_length = 15;\n  int64 min_length = 16;\n  string pattern = 17;\n  int64 max_items = 18;\n  int64 min_items = 19;\n  bool unique_items = 20;\n  int64 max_properties = 21;\n  int64 min_properties = 22;\n  repeated string required = 23;\n  repeated Any enum = 24;\n  string type = 25;\n  repeated SchemaOrReference all_of = 26;\n  repeated SchemaOrReference one_of = 27;\n  repeated SchemaOrReference any_of = 28;\n  Schema not = 29;\n  ItemsItem items = 30;\n  Properties properties = 31;\n  AdditionalPropertiesItem additional_properties = 32;\n  DefaultType default = 33;\n  string description = 34;\n  string format = 35;\n  repeated NamedAny specification_extension = 36;\n}\n\nmessage SchemaOrReference {\n  oneof oneof {\n    Schema schema = 1;\n    Reference reference = 2;\n  }\n}\n\nmessage SchemasOrReferences {\n  repeated NamedSchemaOrReference additional_properties = 1;\n}\n\n// Lists the required security schemes to execute this operation. The name used for each property MUST correspond to a security scheme declared in the Security Schemes under the Components Object.  Security Requirement Objects that contain multiple schemes require that all schemes MUST be satisfied for a request to be authorized. This enables support for scenarios where multiple query parameters or HTTP headers are required to convey security information.  When a list of Security Requirement Objects is defined on the OpenAPI Object or Operation Object, only one of the Security Requirement Objects in the list needs to be satisfied to authorize the request.\nmessage SecurityRequirement {\n  repeated NamedStringArray additional_properties = 1;\n}\n\n// Defines a security scheme that can be used by the operations. Supported schemes are HTTP authentication, an API key (either as a header, a cookie parameter or as a query parameter), mutual TLS (use of a client certificate), OAuth2's common flows (implicit, password, application and access code) as defined in RFC6749, and OpenID Connect.   Please note that currently (2019) the implicit flow is about to be deprecated OAuth 2.0 Security Best Current Practice. Recommended for most use case is Authorization Code Grant flow with PKCE.\nmessage SecurityScheme {\n  string type = 1;\n  string description = 2;\n  string name = 3;\n  string in = 4;\n  string scheme = 5;\n  string bearer_format = 6;\n  OauthFlows flows = 7;\n  string open_id_connect_url = 8;\n  repeated NamedAny specification_extension = 9;\n}\n\nmessage SecuritySchemeOrReference {\n  oneof oneof {\n    SecurityScheme security_scheme = 1;\n    Reference reference = 2;\n  }\n}\n\nmessage SecuritySchemesOrReferences {\n  repeated NamedSecuritySchemeOrReference additional_properties = 1;\n}\n\n// An object representing a Server.\nmessage Server {\n  string url = 1;\n  string description = 2;\n  ServerVariables variables = 3;\n  repeated NamedAny specification_extension = 4;\n}\n\n// An object representing a Server Variable for server URL template substitution.\nmessage ServerVariable {\n  repeated string enum = 1;\n  string default = 2;\n  string description = 3;\n  repeated NamedAny specification_extension = 4;\n}\n\nmessage ServerVariables {\n  repeated NamedServerVariable additional_properties = 1;\n}\n\n// Any property starting with x- is valid.\nmessage SpecificationExtension {\n  oneof oneof {\n    double number = 1;\n    bool boolean = 2;\n    string string = 3;\n  }\n}\n\nmessage StringArray {\n  repeated string value = 1;\n}\n\nmessage Strings {\n  repeated NamedString additional_properties = 1;\n}\n\n// Adds metadata to a single tag that is used by the Operation Object. It is not mandatory to have a Tag Object per tag defined in the Operation Object instances.\nmessage Tag {\n  string name = 1;\n  string description = 2;\n  ExternalDocs external_docs = 3;\n  repeated NamedAny specification_extension = 4;\n}\n\n// A metadata object that allows for more fine-tuned XML model definitions.  When using arrays, XML element names are *not* inferred (for singular/plural forms) and the `name` property SHOULD be used to add that information. See examples for expected behavior.\nmessage Xml {\n  string name = 1;\n  string namespace = 2;\n  string prefix = 3;\n  bool attribute = 4;\n  bool wrapped = 5;\n  repeated NamedAny specification_extension = 6;\n}\n\n"
  },
  {
    "path": "service/cart/third_party/validate/README.md",
    "content": "# protoc-gen-validate (PGV)\n\n* https://github.com/envoyproxy/protoc-gen-validate\n"
  },
  {
    "path": "service/cart/third_party/validate/validate.proto",
    "content": "syntax = \"proto2\";\npackage validate;\n\noption go_package = \"github.com/envoyproxy/protoc-gen-validate/validate\";\noption java_package = \"io.envoyproxy.pgv.validate\";\n\nimport \"google/protobuf/descriptor.proto\";\nimport \"google/protobuf/duration.proto\";\nimport \"google/protobuf/timestamp.proto\";\n\n// Validation rules applied at the message level\nextend google.protobuf.MessageOptions {\n    // Disabled nullifies any validation rules for this message, including any\n    // message fields associated with it that do support validation.\n    optional bool disabled = 1071;\n    // Ignore skips generation of validation methods for this message.\n    optional bool ignored = 1072;\n}\n\n// Validation rules applied at the oneof level\nextend google.protobuf.OneofOptions {\n    // Required ensures that exactly one the field options in a oneof is set;\n    // validation fails if no fields in the oneof are set.\n    optional bool required = 1071;\n}\n\n// Validation rules applied at the field level\nextend google.protobuf.FieldOptions {\n    // Rules specify the validations to be performed on this field. By default,\n    // no validation is performed against a field.\n    optional FieldRules rules = 1071;\n}\n\n// FieldRules encapsulates the rules for each type of field. Depending on the\n// field, the correct set should be used to ensure proper validations.\nmessage FieldRules {\n    optional MessageRules message = 17;\n    oneof type {\n        // Scalar Field Types\n        FloatRules    float    = 1;\n        DoubleRules   double   = 2;\n        Int32Rules    int32    = 3;\n        Int64Rules    int64    = 4;\n        UInt32Rules   uint32   = 5;\n        UInt64Rules   uint64   = 6;\n        SInt32Rules   sint32   = 7;\n        SInt64Rules   sint64   = 8;\n        Fixed32Rules  fixed32  = 9;\n        Fixed64Rules  fixed64  = 10;\n        SFixed32Rules sfixed32 = 11;\n        SFixed64Rules sfixed64 = 12;\n        BoolRules     bool     = 13;\n        StringRules   string   = 14;\n        BytesRules    bytes    = 15;\n\n        // Complex Field Types\n        EnumRules     enum     = 16;\n        RepeatedRules repeated = 18;\n        MapRules      map      = 19;\n\n        // Well-Known Field Types\n        AnyRules       any       = 20;\n        DurationRules  duration  = 21;\n        TimestampRules timestamp = 22;\n    }\n}\n\n// FloatRules describes the constraints applied to `float` values\nmessage FloatRules {\n    // Const specifies that this field must be exactly the specified value\n    optional float const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional float lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional float lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional float gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional float gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated float in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated float not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// DoubleRules describes the constraints applied to `double` values\nmessage DoubleRules {\n    // Const specifies that this field must be exactly the specified value\n    optional double const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional double lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional double lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional double gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional double gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated double in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated double not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// Int32Rules describes the constraints applied to `int32` values\nmessage Int32Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional int32 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional int32 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional int32 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional int32 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional int32 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated int32 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated int32 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// Int64Rules describes the constraints applied to `int64` values\nmessage Int64Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional int64 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional int64 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional int64 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional int64 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional int64 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated int64 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated int64 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// UInt32Rules describes the constraints applied to `uint32` values\nmessage UInt32Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional uint32 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional uint32 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional uint32 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional uint32 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional uint32 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated uint32 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated uint32 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// UInt64Rules describes the constraints applied to `uint64` values\nmessage UInt64Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional uint64 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional uint64 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional uint64 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional uint64 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional uint64 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated uint64 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated uint64 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// SInt32Rules describes the constraints applied to `sint32` values\nmessage SInt32Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional sint32 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional sint32 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional sint32 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional sint32 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional sint32 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated sint32 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated sint32 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// SInt64Rules describes the constraints applied to `sint64` values\nmessage SInt64Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional sint64 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional sint64 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional sint64 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional sint64 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional sint64 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated sint64 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated sint64 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// Fixed32Rules describes the constraints applied to `fixed32` values\nmessage Fixed32Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional fixed32 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional fixed32 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional fixed32 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional fixed32 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional fixed32 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated fixed32 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated fixed32 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// Fixed64Rules describes the constraints applied to `fixed64` values\nmessage Fixed64Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional fixed64 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional fixed64 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional fixed64 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional fixed64 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional fixed64 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated fixed64 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated fixed64 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// SFixed32Rules describes the constraints applied to `sfixed32` values\nmessage SFixed32Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional sfixed32 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional sfixed32 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional sfixed32 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional sfixed32 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional sfixed32 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated sfixed32 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated sfixed32 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// SFixed64Rules describes the constraints applied to `sfixed64` values\nmessage SFixed64Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional sfixed64 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional sfixed64 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional sfixed64 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional sfixed64 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional sfixed64 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated sfixed64 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated sfixed64 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// BoolRules describes the constraints applied to `bool` values\nmessage BoolRules {\n    // Const specifies that this field must be exactly the specified value\n    optional bool const = 1;\n}\n\n// StringRules describe the constraints applied to `string` values\nmessage StringRules {\n    // Const specifies that this field must be exactly the specified value\n    optional string const = 1;\n\n    // Len specifies that this field must be the specified number of\n    // characters (Unicode code points). Note that the number of\n    // characters may differ from the number of bytes in the string.\n    optional uint64 len = 19;\n\n    // MinLen specifies that this field must be the specified number of\n    // characters (Unicode code points) at a minimum. Note that the number of\n    // characters may differ from the number of bytes in the string.\n    optional uint64 min_len = 2;\n\n    // MaxLen specifies that this field must be the specified number of\n    // characters (Unicode code points) at a maximum. Note that the number of\n    // characters may differ from the number of bytes in the string.\n    optional uint64 max_len = 3;\n\n    // LenBytes specifies that this field must be the specified number of bytes\n    // at a minimum\n    optional uint64 len_bytes = 20;\n\n    // MinBytes specifies that this field must be the specified number of bytes\n    // at a minimum\n    optional uint64 min_bytes = 4;\n\n    // MaxBytes specifies that this field must be the specified number of bytes\n    // at a maximum\n    optional uint64 max_bytes = 5;\n\n    // Pattern specifes that this field must match against the specified\n    // regular expression (RE2 syntax). The included expression should elide\n    // any delimiters.\n    optional string pattern  = 6;\n\n    // Prefix specifies that this field must have the specified substring at\n    // the beginning of the string.\n    optional string prefix   = 7;\n\n    // Suffix specifies that this field must have the specified substring at\n    // the end of the string.\n    optional string suffix   = 8;\n\n    // Contains specifies that this field must have the specified substring\n    // anywhere in the string.\n    optional string contains = 9;\n\n    // NotContains specifies that this field cannot have the specified substring\n    // anywhere in the string.\n    optional string not_contains = 23;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated string in     = 10;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated string not_in = 11;\n\n    // WellKnown rules provide advanced constraints against common string\n    // patterns\n    oneof well_known {\n        // Email specifies that the field must be a valid email address as\n        // defined by RFC 5322\n        bool email    = 12;\n\n        // Hostname specifies that the field must be a valid hostname as\n        // defined by RFC 1034. This constraint does not support\n        // internationalized domain names (IDNs).\n        bool hostname = 13;\n\n        // Ip specifies that the field must be a valid IP (v4 or v6) address.\n        // Valid IPv6 addresses should not include surrounding square brackets.\n        bool ip       = 14;\n\n        // Ipv4 specifies that the field must be a valid IPv4 address.\n        bool ipv4     = 15;\n\n        // Ipv6 specifies that the field must be a valid IPv6 address. Valid\n        // IPv6 addresses should not include surrounding square brackets.\n        bool ipv6     = 16;\n\n        // Uri specifies that the field must be a valid, absolute URI as defined\n        // by RFC 3986\n        bool uri      = 17;\n\n        // UriRef specifies that the field must be a valid URI as defined by RFC\n        // 3986 and may be relative or absolute.\n        bool uri_ref  = 18;\n\n        // Address specifies that the field must be either a valid hostname as\n        // defined by RFC 1034 (which does not support internationalized domain\n        // names or IDNs), or it can be a valid IP (v4 or v6).\n        bool address  = 21;\n\n        // Uuid specifies that the field must be a valid UUID as defined by\n        // RFC 4122\n        bool uuid     = 22;\n\n        // WellKnownRegex specifies a common well known pattern defined as a regex.\n        KnownRegex well_known_regex = 24;\n    }\n\n  // This applies to regexes HTTP_HEADER_NAME and HTTP_HEADER_VALUE to enable\n  // strict header validation.\n  // By default, this is true, and HTTP header validations are RFC-compliant.\n  // Setting to false will enable a looser validations that only disallows\n  // \\r\\n\\0 characters, which can be used to bypass header matching rules.\n  optional bool strict = 25 [default = true];\n\n  // IgnoreEmpty specifies that the validation rules of this field should be\n  // evaluated only if the field is not empty\n  optional bool ignore_empty = 26;\n}\n\n// WellKnownRegex contain some well-known patterns.\nenum KnownRegex {\n  UNKNOWN = 0;\n\n  // HTTP header name as defined by RFC 7230.\n  HTTP_HEADER_NAME = 1;\n\n  // HTTP header value as defined by RFC 7230.\n  HTTP_HEADER_VALUE = 2;\n}\n\n// BytesRules describe the constraints applied to `bytes` values\nmessage BytesRules {\n    // Const specifies that this field must be exactly the specified value\n    optional bytes const = 1;\n\n    // Len specifies that this field must be the specified number of bytes\n    optional uint64 len = 13;\n\n    // MinLen specifies that this field must be the specified number of bytes\n    // at a minimum\n    optional uint64 min_len = 2;\n\n    // MaxLen specifies that this field must be the specified number of bytes\n    // at a maximum\n    optional uint64 max_len = 3;\n\n    // Pattern specifes that this field must match against the specified\n    // regular expression (RE2 syntax). The included expression should elide\n    // any delimiters.\n    optional string pattern  = 4;\n\n    // Prefix specifies that this field must have the specified bytes at the\n    // beginning of the string.\n    optional bytes  prefix   = 5;\n\n    // Suffix specifies that this field must have the specified bytes at the\n    // end of the string.\n    optional bytes  suffix   = 6;\n\n    // Contains specifies that this field must have the specified bytes\n    // anywhere in the string.\n    optional bytes  contains = 7;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated bytes in     = 8;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated bytes not_in = 9;\n\n    // WellKnown rules provide advanced constraints against common byte\n    // patterns\n    oneof well_known {\n        // Ip specifies that the field must be a valid IP (v4 or v6) address in\n        // byte format\n        bool ip   = 10;\n\n        // Ipv4 specifies that the field must be a valid IPv4 address in byte\n        // format\n        bool ipv4 = 11;\n\n        // Ipv6 specifies that the field must be a valid IPv6 address in byte\n        // format\n        bool ipv6 = 12;\n    }\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 14;\n}\n\n// EnumRules describe the constraints applied to enum values\nmessage EnumRules {\n    // Const specifies that this field must be exactly the specified value\n    optional int32 const        = 1;\n\n    // DefinedOnly specifies that this field must be only one of the defined\n    // values for this enum, failing on any undefined value.\n    optional bool  defined_only = 2;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated int32 in           = 3;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated int32 not_in       = 4;\n}\n\n// MessageRules describe the constraints applied to embedded message values.\n// For message-type fields, validation is performed recursively.\nmessage MessageRules {\n    // Skip specifies that the validation rules of this field should not be\n    // evaluated\n    optional bool skip     = 1;\n\n    // Required specifies that this field must be set\n    optional bool required = 2;\n}\n\n// RepeatedRules describe the constraints applied to `repeated` values\nmessage RepeatedRules {\n    // MinItems specifies that this field must have the specified number of\n    // items at a minimum\n    optional uint64 min_items = 1;\n\n    // MaxItems specifies that this field must have the specified number of\n    // items at a maximum\n    optional uint64 max_items = 2;\n\n    // Unique specifies that all elements in this field must be unique. This\n    // contraint is only applicable to scalar and enum types (messages are not\n    // supported).\n    optional bool   unique    = 3;\n\n    // Items specifies the contraints to be applied to each item in the field.\n    // Repeated message fields will still execute validation against each item\n    // unless skip is specified here.\n    optional FieldRules items = 4;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 5;\n}\n\n// MapRules describe the constraints applied to `map` values\nmessage MapRules {\n    // MinPairs specifies that this field must have the specified number of\n    // KVs at a minimum\n    optional uint64 min_pairs = 1;\n\n    // MaxPairs specifies that this field must have the specified number of\n    // KVs at a maximum\n    optional uint64 max_pairs = 2;\n\n    // NoSparse specifies values in this field cannot be unset. This only\n    // applies to map's with message value types.\n    optional bool no_sparse = 3;\n\n    // Keys specifies the constraints to be applied to each key in the field.\n    optional FieldRules keys   = 4;\n\n    // Values specifies the constraints to be applied to the value of each key\n    // in the field. Message values will still have their validations evaluated\n    // unless skip is specified here.\n    optional FieldRules values = 5;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 6;\n}\n\n// AnyRules describe constraints applied exclusively to the\n// `google.protobuf.Any` well-known type\nmessage AnyRules {\n    // Required specifies that this field must be set\n    optional bool required = 1;\n\n    // In specifies that this field's `type_url` must be equal to one of the\n    // specified values.\n    repeated string in     = 2;\n\n    // NotIn specifies that this field's `type_url` must not be equal to any of\n    // the specified values.\n    repeated string not_in = 3;\n}\n\n// DurationRules describe the constraints applied exclusively to the\n// `google.protobuf.Duration` well-known type\nmessage DurationRules {\n    // Required specifies that this field must be set\n    optional bool required = 1;\n\n    // Const specifies that this field must be exactly the specified value\n    optional google.protobuf.Duration const = 2;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional google.protobuf.Duration lt = 3;\n\n    // Lt specifies that this field must be less than the specified value,\n    // inclusive\n    optional google.protobuf.Duration lte = 4;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive\n    optional google.protobuf.Duration gt = 5;\n\n    // Gte specifies that this field must be greater than the specified value,\n    // inclusive\n    optional google.protobuf.Duration gte = 6;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated google.protobuf.Duration in = 7;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated google.protobuf.Duration not_in = 8;\n}\n\n// TimestampRules describe the constraints applied exclusively to the\n// `google.protobuf.Timestamp` well-known type\nmessage TimestampRules {\n    // Required specifies that this field must be set\n    optional bool required = 1;\n\n    // Const specifies that this field must be exactly the specified value\n    optional google.protobuf.Timestamp const = 2;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional google.protobuf.Timestamp lt = 3;\n\n    // Lte specifies that this field must be less than the specified value,\n    // inclusive\n    optional google.protobuf.Timestamp lte = 4;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive\n    optional google.protobuf.Timestamp gt = 5;\n\n    // Gte specifies that this field must be greater than the specified value,\n    // inclusive\n    optional google.protobuf.Timestamp gte = 6;\n\n    // LtNow specifies that this must be less than the current time. LtNow\n    // can only be used with the Within rule.\n    optional bool lt_now  = 7;\n\n    // GtNow specifies that this must be greater than the current time. GtNow\n    // can only be used with the Within rule.\n    optional bool gt_now  = 8;\n\n    // Within specifies that this field must be within this duration of the\n    // current time. This constraint can be used alone or with the LtNow and\n    // GtNow rules.\n    optional google.protobuf.Duration within = 9;\n}\n"
  },
  {
    "path": "service/goods/Dockerfile",
    "content": "FROM golang:1.16 AS builder\n\nCOPY . /src\nWORKDIR /src\n\nRUN GOPROXY=https://goproxy.cn make build\n\nFROM debian:stable-slim\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n\t\tca-certificates  \\\n        netbase \\\n        && rm -rf /var/lib/apt/lists/ \\\n        && apt-get autoremove -y && apt-get autoclean -y\n\nCOPY --from=builder /src/bin /app\n\nWORKDIR /app\n\nEXPOSE 8000\nEXPOSE 9000\nVOLUME /data/conf\n\nCMD [\"./server\", \"-conf\", \"/data/conf\"]\n"
  },
  {
    "path": "service/goods/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2020 go-kratos\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "service/goods/Makefile",
    "content": "GOPATH:=$(shell go env GOPATH)\nVERSION=$(shell git describe --tags --always)\nINTERNAL_PROTO_FILES=$(shell find internal -name *.proto)\nAPI_PROTO_FILES=$(shell find api -name *.proto)\n\n.PHONY: init\n# init env\ninit:\n\tgo install google.golang.org/protobuf/cmd/protoc-gen-go@latest\n\tgo install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest\n\tgo install github.com/go-kratos/kratos/cmd/kratos/v2@latest\n\tgo install github.com/go-kratos/kratos/cmd/protoc-gen-go-http/v2@latest\n\tgo install github.com/go-kratos/kratos/cmd/protoc-gen-go-errors/v2@latest\n\tgo install github.com/google/gnostic/cmd/protoc-gen-openapi@v0.6.1\n\n.PHONY: errors\n# generate errors code\nerrors:\n\tprotoc --proto_path=. \\\n               --proto_path=./third_party \\\n               --go_out=paths=source_relative:. \\\n               --go-errors_out=paths=source_relative:. \\\n               $(API_PROTO_FILES)\n\n.PHONY: config\n# generate internal proto\nconfig:\n\tprotoc --proto_path=. \\\n\t       --proto_path=./third_party \\\n \t       --go_out=paths=source_relative:. \\\n\t       $(INTERNAL_PROTO_FILES)\n\n.PHONY: api\n# generate api proto\napi:\n\tprotoc --proto_path=. \\\n\t       --proto_path=./third_party \\\n \t       --go_out=paths=source_relative:. \\\n \t       --go-http_out=paths=source_relative:. \\\n \t       --go-grpc_out=paths=source_relative:. \\\n \t       --openapi_out==paths=source_relative:. \\\n \t       --validate_out=paths=source_relative,lang=go:. \\\n\t       $(API_PROTO_FILES)\n\n.PHONY: build\n# build\nbuild:\n\tmkdir -p bin/ && go build -ldflags \"-X main.Version=$(VERSION)\" -o ./bin/ ./...\n\n.PHONY: generate\n# generate\ngenerate:\n\tgo generate ./...\n\n# wire\n# wire\nwire:\n\tcd cmd/goods/ && wire\n\n\n.PHONY: all\n# generate all\nall:\n\tmake api;\n\tmake errors;\n\tmake config;\n\tmake generate;\n\n# show help\nhelp:\n\t@echo ''\n\t@echo 'Usage:'\n\t@echo ' make [target]'\n\t@echo ''\n\t@echo 'Targets:'\n\t@awk '/^[a-zA-Z\\-\\_0-9]+:/ { \\\n\thelpMessage = match(lastLine, /^# (.*)/); \\\n\t\tif (helpMessage) { \\\n\t\t\thelpCommand = substr($$1, 0, index($$1, \":\")-1); \\\n\t\t\thelpMessage = substr(lastLine, RSTART + 2, RLENGTH); \\\n\t\t\tprintf \"\\033[36m%-22s\\033[0m %s\\n\", helpCommand,helpMessage; \\\n\t\t} \\\n\t} \\\n\t{ lastLine = $$0 }' $(MAKEFILE_LIST)\n\n.DEFAULT_GOAL := help\n"
  },
  {
    "path": "service/goods/README.md",
    "content": "goods service"
  },
  {
    "path": "service/goods/api/goods/v1/error_reason.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.0\n// \tprotoc        v3.19.4\n// source: api/goods/v1/error_reason.proto\n\npackage v1\n\nimport (\n\t_ \"github.com/go-kratos/kratos/v2/errors\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype ErrorReason int32\n\nconst (\n\tErrorReason_USER_NOT_FOUND  ErrorReason = 0\n\tErrorReason_CONTENT_MISSING ErrorReason = 1\n)\n\n// Enum value maps for ErrorReason.\nvar (\n\tErrorReason_name = map[int32]string{\n\t\t0: \"USER_NOT_FOUND\",\n\t\t1: \"CONTENT_MISSING\",\n\t}\n\tErrorReason_value = map[string]int32{\n\t\t\"USER_NOT_FOUND\":  0,\n\t\t\"CONTENT_MISSING\": 1,\n\t}\n)\n\nfunc (x ErrorReason) Enum() *ErrorReason {\n\tp := new(ErrorReason)\n\t*p = x\n\treturn p\n}\n\nfunc (x ErrorReason) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (ErrorReason) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_api_goods_v1_error_reason_proto_enumTypes[0].Descriptor()\n}\n\nfunc (ErrorReason) Type() protoreflect.EnumType {\n\treturn &file_api_goods_v1_error_reason_proto_enumTypes[0]\n}\n\nfunc (x ErrorReason) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use ErrorReason.Descriptor instead.\nfunc (ErrorReason) EnumDescriptor() ([]byte, []int) {\n\treturn file_api_goods_v1_error_reason_proto_rawDescGZIP(), []int{0}\n}\n\nvar File_api_goods_v1_error_reason_proto protoreflect.FileDescriptor\n\nvar file_api_goods_v1_error_reason_proto_rawDesc = []byte{\n\t0x0a, 0x1f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x65,\n\t0x72, 0x72, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x08, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x1a, 0x13, 0x65, 0x72, 0x72,\n\t0x6f, 0x72, 0x73, 0x2f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x2a, 0x48, 0x0a, 0x0b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12,\n\t0x18, 0x0a, 0x0e, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e,\n\t0x44, 0x10, 0x00, 0x1a, 0x04, 0xa8, 0x45, 0x94, 0x03, 0x12, 0x19, 0x0a, 0x0f, 0x43, 0x4f, 0x4e,\n\t0x54, 0x45, 0x4e, 0x54, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x1a, 0x04,\n\t0xa8, 0x45, 0x90, 0x03, 0x1a, 0x04, 0xa0, 0x45, 0xf4, 0x03, 0x42, 0x28, 0x5a, 0x15, 0x67, 0x6f,\n\t0x6f, 0x64, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2f, 0x76, 0x31,\n\t0x3b, 0x76, 0x31, 0xa2, 0x02, 0x0e, 0x41, 0x50, 0x49, 0x47, 0x6f, 0x6f, 0x64, 0x73, 0x45, 0x72,\n\t0x72, 0x6f, 0x72, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_api_goods_v1_error_reason_proto_rawDescOnce sync.Once\n\tfile_api_goods_v1_error_reason_proto_rawDescData = file_api_goods_v1_error_reason_proto_rawDesc\n)\n\nfunc file_api_goods_v1_error_reason_proto_rawDescGZIP() []byte {\n\tfile_api_goods_v1_error_reason_proto_rawDescOnce.Do(func() {\n\t\tfile_api_goods_v1_error_reason_proto_rawDescData = protoimpl.X.CompressGZIP(file_api_goods_v1_error_reason_proto_rawDescData)\n\t})\n\treturn file_api_goods_v1_error_reason_proto_rawDescData\n}\n\nvar file_api_goods_v1_error_reason_proto_enumTypes = make([]protoimpl.EnumInfo, 1)\nvar file_api_goods_v1_error_reason_proto_goTypes = []interface{}{\n\t(ErrorReason)(0), // 0: goods.v1.ErrorReason\n}\nvar file_api_goods_v1_error_reason_proto_depIdxs = []int32{\n\t0, // [0:0] is the sub-list for method output_type\n\t0, // [0:0] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_api_goods_v1_error_reason_proto_init() }\nfunc file_api_goods_v1_error_reason_proto_init() {\n\tif File_api_goods_v1_error_reason_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_api_goods_v1_error_reason_proto_rawDesc,\n\t\t\tNumEnums:      1,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_api_goods_v1_error_reason_proto_goTypes,\n\t\tDependencyIndexes: file_api_goods_v1_error_reason_proto_depIdxs,\n\t\tEnumInfos:         file_api_goods_v1_error_reason_proto_enumTypes,\n\t}.Build()\n\tFile_api_goods_v1_error_reason_proto = out.File\n\tfile_api_goods_v1_error_reason_proto_rawDesc = nil\n\tfile_api_goods_v1_error_reason_proto_goTypes = nil\n\tfile_api_goods_v1_error_reason_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "service/goods/api/goods/v1/error_reason.pb.validate.go",
    "content": "// Code generated by protoc-gen-validate. DO NOT EDIT.\n// source: api/goods/v1/error_reason.proto\n\npackage v1\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"net/mail\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"sort\"\n\t\"strings\"\n\t\"time\"\n\t\"unicode/utf8\"\n\n\t\"google.golang.org/protobuf/types/known/anypb\"\n)\n\n// ensure the imports are used\nvar (\n\t_ = bytes.MinRead\n\t_ = errors.New(\"\")\n\t_ = fmt.Print\n\t_ = utf8.UTFMax\n\t_ = (*regexp.Regexp)(nil)\n\t_ = (*strings.Reader)(nil)\n\t_ = net.IPv4len\n\t_ = time.Duration(0)\n\t_ = (*url.URL)(nil)\n\t_ = (*mail.Address)(nil)\n\t_ = anypb.Any{}\n\t_ = sort.Sort\n)\n"
  },
  {
    "path": "service/goods/api/goods/v1/error_reason.proto",
    "content": "syntax = \"proto3\";\n\npackage goods.v1;\nimport \"errors/errors.proto\";\n\n\noption go_package = \"goods/api/goods/v1;v1\";\noption objc_class_prefix = \"APIGoodsErrors\";\n\nenum ErrorReason {\n  option (errors.default_code) = 500;\n\n  USER_NOT_FOUND = 0 [(errors.code) = 404];\n  CONTENT_MISSING = 1 [(errors.code) = 400];\n}\n"
  },
  {
    "path": "service/goods/api/goods/v1/goods.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.0\n// \tprotoc        v3.19.4\n// source: api/goods/v1/goods.proto\n\npackage v1\n\nimport (\n\t_ \"github.com/envoyproxy/protoc-gen-validate/validate\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\temptypb \"google.golang.org/protobuf/types/known/emptypb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype AttrValueRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId      int64  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tAttrId  int64  `protobuf:\"varint,2,opt,name=attrId,proto3\" json:\"attrId,omitempty\"`\n\tGroupId int64  `protobuf:\"varint,3,opt,name=groupId,proto3\" json:\"groupId,omitempty\"`\n\tValue   string `protobuf:\"bytes,4,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *AttrValueRequest) Reset() {\n\t*x = AttrValueRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_goods_v1_goods_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AttrValueRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AttrValueRequest) ProtoMessage() {}\n\nfunc (x *AttrValueRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_goods_v1_goods_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AttrValueRequest.ProtoReflect.Descriptor instead.\nfunc (*AttrValueRequest) Descriptor() ([]byte, []int) {\n\treturn file_api_goods_v1_goods_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *AttrValueRequest) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *AttrValueRequest) GetAttrId() int64 {\n\tif x != nil {\n\t\treturn x.AttrId\n\t}\n\treturn 0\n}\n\nfunc (x *AttrValueRequest) GetGroupId() int64 {\n\tif x != nil {\n\t\treturn x.GroupId\n\t}\n\treturn 0\n}\n\nfunc (x *AttrValueRequest) GetValue() string {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn \"\"\n}\n\ntype AttrRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId        int64               `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tTypeId    int64               `protobuf:\"varint,2,opt,name=typeId,proto3\" json:\"typeId,omitempty\"`\n\tGroupId   int64               `protobuf:\"varint,3,opt,name=groupId,proto3\" json:\"groupId,omitempty\"`\n\tTitle     string              `protobuf:\"bytes,4,opt,name=title,proto3\" json:\"title,omitempty\"`\n\tDesc      string              `protobuf:\"bytes,5,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\tStatus    bool                `protobuf:\"varint,6,opt,name=status,proto3\" json:\"status,omitempty\"`\n\tSort      int32               `protobuf:\"varint,7,opt,name=sort,proto3\" json:\"sort,omitempty\"`\n\tAttrValue []*AttrValueRequest `protobuf:\"bytes,8,rep,name=attrValue,proto3\" json:\"attrValue,omitempty\"`\n}\n\nfunc (x *AttrRequest) Reset() {\n\t*x = AttrRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_goods_v1_goods_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AttrRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AttrRequest) ProtoMessage() {}\n\nfunc (x *AttrRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_goods_v1_goods_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AttrRequest.ProtoReflect.Descriptor instead.\nfunc (*AttrRequest) Descriptor() ([]byte, []int) {\n\treturn file_api_goods_v1_goods_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *AttrRequest) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *AttrRequest) GetTypeId() int64 {\n\tif x != nil {\n\t\treturn x.TypeId\n\t}\n\treturn 0\n}\n\nfunc (x *AttrRequest) GetGroupId() int64 {\n\tif x != nil {\n\t\treturn x.GroupId\n\t}\n\treturn 0\n}\n\nfunc (x *AttrRequest) GetTitle() string {\n\tif x != nil {\n\t\treturn x.Title\n\t}\n\treturn \"\"\n}\n\nfunc (x *AttrRequest) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *AttrRequest) GetStatus() bool {\n\tif x != nil {\n\t\treturn x.Status\n\t}\n\treturn false\n}\n\nfunc (x *AttrRequest) GetSort() int32 {\n\tif x != nil {\n\t\treturn x.Sort\n\t}\n\treturn 0\n}\n\nfunc (x *AttrRequest) GetAttrValue() []*AttrValueRequest {\n\tif x != nil {\n\t\treturn x.AttrValue\n\t}\n\treturn nil\n}\n\ntype AttrValueResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId      int64  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tAttrId  int64  `protobuf:\"varint,2,opt,name=attrId,proto3\" json:\"attrId,omitempty\"`\n\tGroupId int64  `protobuf:\"varint,3,opt,name=groupId,proto3\" json:\"groupId,omitempty\"`\n\tValue   string `protobuf:\"bytes,4,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *AttrValueResponse) Reset() {\n\t*x = AttrValueResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_goods_v1_goods_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AttrValueResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AttrValueResponse) ProtoMessage() {}\n\nfunc (x *AttrValueResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_goods_v1_goods_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AttrValueResponse.ProtoReflect.Descriptor instead.\nfunc (*AttrValueResponse) Descriptor() ([]byte, []int) {\n\treturn file_api_goods_v1_goods_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *AttrValueResponse) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *AttrValueResponse) GetAttrId() int64 {\n\tif x != nil {\n\t\treturn x.AttrId\n\t}\n\treturn 0\n}\n\nfunc (x *AttrValueResponse) GetGroupId() int64 {\n\tif x != nil {\n\t\treturn x.GroupId\n\t}\n\treturn 0\n}\n\nfunc (x *AttrValueResponse) GetValue() string {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn \"\"\n}\n\ntype AttrResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId        int64                `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tTypeId    int64                `protobuf:\"varint,2,opt,name=typeId,proto3\" json:\"typeId,omitempty\"`\n\tGroupId   int64                `protobuf:\"varint,3,opt,name=groupId,proto3\" json:\"groupId,omitempty\"`\n\tTitle     string               `protobuf:\"bytes,4,opt,name=title,proto3\" json:\"title,omitempty\"`\n\tDesc      string               `protobuf:\"bytes,5,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\tStatus    bool                 `protobuf:\"varint,6,opt,name=status,proto3\" json:\"status,omitempty\"`\n\tSort      int32                `protobuf:\"varint,7,opt,name=sort,proto3\" json:\"sort,omitempty\"`\n\tAttrValue []*AttrValueResponse `protobuf:\"bytes,8,rep,name=attrValue,proto3\" json:\"attrValue,omitempty\"`\n}\n\nfunc (x *AttrResponse) Reset() {\n\t*x = AttrResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_goods_v1_goods_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AttrResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AttrResponse) ProtoMessage() {}\n\nfunc (x *AttrResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_goods_v1_goods_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AttrResponse.ProtoReflect.Descriptor instead.\nfunc (*AttrResponse) Descriptor() ([]byte, []int) {\n\treturn file_api_goods_v1_goods_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *AttrResponse) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *AttrResponse) GetTypeId() int64 {\n\tif x != nil {\n\t\treturn x.TypeId\n\t}\n\treturn 0\n}\n\nfunc (x *AttrResponse) GetGroupId() int64 {\n\tif x != nil {\n\t\treturn x.GroupId\n\t}\n\treturn 0\n}\n\nfunc (x *AttrResponse) GetTitle() string {\n\tif x != nil {\n\t\treturn x.Title\n\t}\n\treturn \"\"\n}\n\nfunc (x *AttrResponse) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *AttrResponse) GetStatus() bool {\n\tif x != nil {\n\t\treturn x.Status\n\t}\n\treturn false\n}\n\nfunc (x *AttrResponse) GetSort() int32 {\n\tif x != nil {\n\t\treturn x.Sort\n\t}\n\treturn 0\n}\n\nfunc (x *AttrResponse) GetAttrValue() []*AttrValueResponse {\n\tif x != nil {\n\t\treturn x.AttrValue\n\t}\n\treturn nil\n}\n\ntype AttrGroupRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId     int64  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tTypeId int64  `protobuf:\"varint,2,opt,name=typeId,proto3\" json:\"typeId,omitempty\"`\n\tTitle  string `protobuf:\"bytes,3,opt,name=title,proto3\" json:\"title,omitempty\"`\n\tDesc   string `protobuf:\"bytes,4,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\tStatus bool   `protobuf:\"varint,5,opt,name=status,proto3\" json:\"status,omitempty\"`\n\tSort   int32  `protobuf:\"varint,6,opt,name=sort,proto3\" json:\"sort,omitempty\"`\n}\n\nfunc (x *AttrGroupRequest) Reset() {\n\t*x = AttrGroupRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_goods_v1_goods_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AttrGroupRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AttrGroupRequest) ProtoMessage() {}\n\nfunc (x *AttrGroupRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_goods_v1_goods_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AttrGroupRequest.ProtoReflect.Descriptor instead.\nfunc (*AttrGroupRequest) Descriptor() ([]byte, []int) {\n\treturn file_api_goods_v1_goods_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *AttrGroupRequest) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *AttrGroupRequest) GetTypeId() int64 {\n\tif x != nil {\n\t\treturn x.TypeId\n\t}\n\treturn 0\n}\n\nfunc (x *AttrGroupRequest) GetTitle() string {\n\tif x != nil {\n\t\treturn x.Title\n\t}\n\treturn \"\"\n}\n\nfunc (x *AttrGroupRequest) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *AttrGroupRequest) GetStatus() bool {\n\tif x != nil {\n\t\treturn x.Status\n\t}\n\treturn false\n}\n\nfunc (x *AttrGroupRequest) GetSort() int32 {\n\tif x != nil {\n\t\treturn x.Sort\n\t}\n\treturn 0\n}\n\ntype AttrGroupResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId     int64  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tTypeId int64  `protobuf:\"varint,2,opt,name=typeId,proto3\" json:\"typeId,omitempty\"`\n\tTitle  string `protobuf:\"bytes,3,opt,name=title,proto3\" json:\"title,omitempty\"`\n\tDesc   string `protobuf:\"bytes,4,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\tStatus bool   `protobuf:\"varint,5,opt,name=status,proto3\" json:\"status,omitempty\"`\n\tSort   int32  `protobuf:\"varint,6,opt,name=sort,proto3\" json:\"sort,omitempty\"`\n}\n\nfunc (x *AttrGroupResponse) Reset() {\n\t*x = AttrGroupResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_goods_v1_goods_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AttrGroupResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AttrGroupResponse) ProtoMessage() {}\n\nfunc (x *AttrGroupResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_goods_v1_goods_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AttrGroupResponse.ProtoReflect.Descriptor instead.\nfunc (*AttrGroupResponse) Descriptor() ([]byte, []int) {\n\treturn file_api_goods_v1_goods_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *AttrGroupResponse) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *AttrGroupResponse) GetTypeId() int64 {\n\tif x != nil {\n\t\treturn x.TypeId\n\t}\n\treturn 0\n}\n\nfunc (x *AttrGroupResponse) GetTitle() string {\n\tif x != nil {\n\t\treturn x.Title\n\t}\n\treturn \"\"\n}\n\nfunc (x *AttrGroupResponse) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *AttrGroupResponse) GetStatus() bool {\n\tif x != nil {\n\t\treturn x.Status\n\t}\n\treturn false\n}\n\nfunc (x *AttrGroupResponse) GetSort() int32 {\n\tif x != nil {\n\t\treturn x.Sort\n\t}\n\treturn 0\n}\n\ntype SpecificationValue struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId     int64  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tAttrId int64  `protobuf:\"varint,2,opt,name=attrId,proto3\" json:\"attrId,omitempty\"`\n\tValue  string `protobuf:\"bytes,3,opt,name=value,proto3\" json:\"value,omitempty\"`\n\tSort   int32  `protobuf:\"varint,4,opt,name=sort,proto3\" json:\"sort,omitempty\"`\n}\n\nfunc (x *SpecificationValue) Reset() {\n\t*x = SpecificationValue{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_goods_v1_goods_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SpecificationValue) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SpecificationValue) ProtoMessage() {}\n\nfunc (x *SpecificationValue) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_goods_v1_goods_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SpecificationValue.ProtoReflect.Descriptor instead.\nfunc (*SpecificationValue) Descriptor() ([]byte, []int) {\n\treturn file_api_goods_v1_goods_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *SpecificationValue) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *SpecificationValue) GetAttrId() int64 {\n\tif x != nil {\n\t\treturn x.AttrId\n\t}\n\treturn 0\n}\n\nfunc (x *SpecificationValue) GetValue() string {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn \"\"\n}\n\nfunc (x *SpecificationValue) GetSort() int32 {\n\tif x != nil {\n\t\treturn x.Sort\n\t}\n\treturn 0\n}\n\ntype SpecificationValueResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId     int64  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tAttrId int64  `protobuf:\"varint,2,opt,name=attrId,proto3\" json:\"attrId,omitempty\"`\n\tValue  string `protobuf:\"bytes,3,opt,name=value,proto3\" json:\"value,omitempty\"`\n\tSort   int32  `protobuf:\"varint,4,opt,name=sort,proto3\" json:\"sort,omitempty\"`\n}\n\nfunc (x *SpecificationValueResponse) Reset() {\n\t*x = SpecificationValueResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_goods_v1_goods_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SpecificationValueResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SpecificationValueResponse) ProtoMessage() {}\n\nfunc (x *SpecificationValueResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_goods_v1_goods_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SpecificationValueResponse.ProtoReflect.Descriptor instead.\nfunc (*SpecificationValueResponse) Descriptor() ([]byte, []int) {\n\treturn file_api_goods_v1_goods_proto_rawDescGZIP(), []int{7}\n}\n\nfunc (x *SpecificationValueResponse) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *SpecificationValueResponse) GetAttrId() int64 {\n\tif x != nil {\n\t\treturn x.AttrId\n\t}\n\treturn 0\n}\n\nfunc (x *SpecificationValueResponse) GetValue() string {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn \"\"\n}\n\nfunc (x *SpecificationValueResponse) GetSort() int32 {\n\tif x != nil {\n\t\treturn x.Sort\n\t}\n\treturn 0\n}\n\ntype SpecificationRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId                 int64                 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tTypeId             int64                 `protobuf:\"varint,2,opt,name=typeId,proto3\" json:\"typeId,omitempty\"`\n\tName               string                `protobuf:\"bytes,3,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tSort               int32                 `protobuf:\"varint,4,opt,name=sort,proto3\" json:\"sort,omitempty\"`\n\tStatus             bool                  `protobuf:\"varint,5,opt,name=status,proto3\" json:\"status,omitempty\"`\n\tIsSku              bool                  `protobuf:\"varint,6,opt,name=isSku,proto3\" json:\"isSku,omitempty\"`\n\tIsSelect           bool                  `protobuf:\"varint,7,opt,name=isSelect,proto3\" json:\"isSelect,omitempty\"`\n\tSpecificationValue []*SpecificationValue `protobuf:\"bytes,8,rep,name=specificationValue,proto3\" json:\"specificationValue,omitempty\"`\n}\n\nfunc (x *SpecificationRequest) Reset() {\n\t*x = SpecificationRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_goods_v1_goods_proto_msgTypes[8]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SpecificationRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SpecificationRequest) ProtoMessage() {}\n\nfunc (x *SpecificationRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_goods_v1_goods_proto_msgTypes[8]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SpecificationRequest.ProtoReflect.Descriptor instead.\nfunc (*SpecificationRequest) Descriptor() ([]byte, []int) {\n\treturn file_api_goods_v1_goods_proto_rawDescGZIP(), []int{8}\n}\n\nfunc (x *SpecificationRequest) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *SpecificationRequest) GetTypeId() int64 {\n\tif x != nil {\n\t\treturn x.TypeId\n\t}\n\treturn 0\n}\n\nfunc (x *SpecificationRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *SpecificationRequest) GetSort() int32 {\n\tif x != nil {\n\t\treturn x.Sort\n\t}\n\treturn 0\n}\n\nfunc (x *SpecificationRequest) GetStatus() bool {\n\tif x != nil {\n\t\treturn x.Status\n\t}\n\treturn false\n}\n\nfunc (x *SpecificationRequest) GetIsSku() bool {\n\tif x != nil {\n\t\treturn x.IsSku\n\t}\n\treturn false\n}\n\nfunc (x *SpecificationRequest) GetIsSelect() bool {\n\tif x != nil {\n\t\treturn x.IsSelect\n\t}\n\treturn false\n}\n\nfunc (x *SpecificationRequest) GetSpecificationValue() []*SpecificationValue {\n\tif x != nil {\n\t\treturn x.SpecificationValue\n\t}\n\treturn nil\n}\n\ntype SpecificationResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *SpecificationResponse) Reset() {\n\t*x = SpecificationResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_goods_v1_goods_proto_msgTypes[9]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SpecificationResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SpecificationResponse) ProtoMessage() {}\n\nfunc (x *SpecificationResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_goods_v1_goods_proto_msgTypes[9]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SpecificationResponse.ProtoReflect.Descriptor instead.\nfunc (*SpecificationResponse) Descriptor() ([]byte, []int) {\n\treturn file_api_goods_v1_goods_proto_rawDescGZIP(), []int{9}\n}\n\nfunc (x *SpecificationResponse) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\ntype GoodsTypeRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId        int64  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName      string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tTypeCode  string `protobuf:\"bytes,3,opt,name=typeCode,proto3\" json:\"typeCode,omitempty\"`\n\tNameAlias string `protobuf:\"bytes,4,opt,name=nameAlias,proto3\" json:\"nameAlias,omitempty\"`\n\tIsVirtual bool   `protobuf:\"varint,5,opt,name=isVirtual,proto3\" json:\"isVirtual,omitempty\"`\n\tDesc      string `protobuf:\"bytes,6,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\tSort      int32  `protobuf:\"varint,7,opt,name=sort,proto3\" json:\"sort,omitempty\"`\n\tBrandIds  string `protobuf:\"bytes,8,opt,name=brandIds,proto3\" json:\"brandIds,omitempty\"`\n}\n\nfunc (x *GoodsTypeRequest) Reset() {\n\t*x = GoodsTypeRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_goods_v1_goods_proto_msgTypes[10]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GoodsTypeRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GoodsTypeRequest) ProtoMessage() {}\n\nfunc (x *GoodsTypeRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_goods_v1_goods_proto_msgTypes[10]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GoodsTypeRequest.ProtoReflect.Descriptor instead.\nfunc (*GoodsTypeRequest) Descriptor() ([]byte, []int) {\n\treturn file_api_goods_v1_goods_proto_rawDescGZIP(), []int{10}\n}\n\nfunc (x *GoodsTypeRequest) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *GoodsTypeRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *GoodsTypeRequest) GetTypeCode() string {\n\tif x != nil {\n\t\treturn x.TypeCode\n\t}\n\treturn \"\"\n}\n\nfunc (x *GoodsTypeRequest) GetNameAlias() string {\n\tif x != nil {\n\t\treturn x.NameAlias\n\t}\n\treturn \"\"\n}\n\nfunc (x *GoodsTypeRequest) GetIsVirtual() bool {\n\tif x != nil {\n\t\treturn x.IsVirtual\n\t}\n\treturn false\n}\n\nfunc (x *GoodsTypeRequest) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *GoodsTypeRequest) GetSort() int32 {\n\tif x != nil {\n\t\treturn x.Sort\n\t}\n\treturn 0\n}\n\nfunc (x *GoodsTypeRequest) GetBrandIds() string {\n\tif x != nil {\n\t\treturn x.BrandIds\n\t}\n\treturn \"\"\n}\n\ntype GoodsTypeResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GoodsTypeResponse) Reset() {\n\t*x = GoodsTypeResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_goods_v1_goods_proto_msgTypes[11]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GoodsTypeResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GoodsTypeResponse) ProtoMessage() {}\n\nfunc (x *GoodsTypeResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_goods_v1_goods_proto_msgTypes[11]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GoodsTypeResponse.ProtoReflect.Descriptor instead.\nfunc (*GoodsTypeResponse) Descriptor() ([]byte, []int) {\n\treturn file_api_goods_v1_goods_proto_rawDescGZIP(), []int{11}\n}\n\nfunc (x *GoodsTypeResponse) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\ntype CreateGoodsRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId              int64                         `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tCategoryId      int32                         `protobuf:\"varint,2,opt,name=categoryId,proto3\" json:\"categoryId,omitempty\"`\n\tBrandId         int32                         `protobuf:\"varint,3,opt,name=brandId,proto3\" json:\"brandId,omitempty\"`\n\tTypeId          int64                         `protobuf:\"varint,4,opt,name=typeId,proto3\" json:\"typeId,omitempty\"`\n\tName            string                        `protobuf:\"bytes,5,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tNameAlias       string                        `protobuf:\"bytes,6,opt,name=nameAlias,proto3\" json:\"nameAlias,omitempty\"`\n\tGoodsTags       string                        `protobuf:\"bytes,7,opt,name=goodsTags,proto3\" json:\"goodsTags,omitempty\"`\n\tGoodsSn         string                        `protobuf:\"bytes,8,opt,name=goodsSn,proto3\" json:\"goodsSn,omitempty\"`\n\tShopPrice       int64                         `protobuf:\"varint,9,opt,name=shopPrice,proto3\" json:\"shopPrice,omitempty\"`\n\tMarketPrice     int64                         `protobuf:\"varint,10,opt,name=marketPrice,proto3\" json:\"marketPrice,omitempty\"`\n\tInventory       int64                         `protobuf:\"varint,11,opt,name=inventory,proto3\" json:\"inventory,omitempty\"`\n\tGoodsBrief      string                        `protobuf:\"bytes,12,opt,name=goodsBrief,proto3\" json:\"goodsBrief,omitempty\"`\n\tGoodsFrontImage string                        `protobuf:\"bytes,13,opt,name=goodsFrontImage,proto3\" json:\"goodsFrontImage,omitempty\"`\n\tGoodsImages     []string                      `protobuf:\"bytes,14,rep,name=goodsImages,proto3\" json:\"goodsImages,omitempty\"`\n\tShipFree        bool                          `protobuf:\"varint,15,opt,name=shipFree,proto3\" json:\"shipFree,omitempty\"`\n\tShipId          int32                         `protobuf:\"varint,16,opt,name=shipId,proto3\" json:\"shipId,omitempty\"`\n\tIsNew           bool                          `protobuf:\"varint,17,opt,name=isNew,proto3\" json:\"isNew,omitempty\"`\n\tIsHot           bool                          `protobuf:\"varint,18,opt,name=isHot,proto3\" json:\"isHot,omitempty\"`\n\tOnSale          bool                          `protobuf:\"varint,19,opt,name=onSale,proto3\" json:\"onSale,omitempty\"`\n\tSku             []*CreateGoodsRequestGoodsSku `protobuf:\"bytes,20,rep,name=sku,proto3\" json:\"sku,omitempty\"`\n}\n\nfunc (x *CreateGoodsRequest) Reset() {\n\t*x = CreateGoodsRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_goods_v1_goods_proto_msgTypes[12]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CreateGoodsRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreateGoodsRequest) ProtoMessage() {}\n\nfunc (x *CreateGoodsRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_goods_v1_goods_proto_msgTypes[12]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreateGoodsRequest.ProtoReflect.Descriptor instead.\nfunc (*CreateGoodsRequest) Descriptor() ([]byte, []int) {\n\treturn file_api_goods_v1_goods_proto_rawDescGZIP(), []int{12}\n}\n\nfunc (x *CreateGoodsRequest) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *CreateGoodsRequest) GetCategoryId() int32 {\n\tif x != nil {\n\t\treturn x.CategoryId\n\t}\n\treturn 0\n}\n\nfunc (x *CreateGoodsRequest) GetBrandId() int32 {\n\tif x != nil {\n\t\treturn x.BrandId\n\t}\n\treturn 0\n}\n\nfunc (x *CreateGoodsRequest) GetTypeId() int64 {\n\tif x != nil {\n\t\treturn x.TypeId\n\t}\n\treturn 0\n}\n\nfunc (x *CreateGoodsRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateGoodsRequest) GetNameAlias() string {\n\tif x != nil {\n\t\treturn x.NameAlias\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateGoodsRequest) GetGoodsTags() string {\n\tif x != nil {\n\t\treturn x.GoodsTags\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateGoodsRequest) GetGoodsSn() string {\n\tif x != nil {\n\t\treturn x.GoodsSn\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateGoodsRequest) GetShopPrice() int64 {\n\tif x != nil {\n\t\treturn x.ShopPrice\n\t}\n\treturn 0\n}\n\nfunc (x *CreateGoodsRequest) GetMarketPrice() int64 {\n\tif x != nil {\n\t\treturn x.MarketPrice\n\t}\n\treturn 0\n}\n\nfunc (x *CreateGoodsRequest) GetInventory() int64 {\n\tif x != nil {\n\t\treturn x.Inventory\n\t}\n\treturn 0\n}\n\nfunc (x *CreateGoodsRequest) GetGoodsBrief() string {\n\tif x != nil {\n\t\treturn x.GoodsBrief\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateGoodsRequest) GetGoodsFrontImage() string {\n\tif x != nil {\n\t\treturn x.GoodsFrontImage\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateGoodsRequest) GetGoodsImages() []string {\n\tif x != nil {\n\t\treturn x.GoodsImages\n\t}\n\treturn nil\n}\n\nfunc (x *CreateGoodsRequest) GetShipFree() bool {\n\tif x != nil {\n\t\treturn x.ShipFree\n\t}\n\treturn false\n}\n\nfunc (x *CreateGoodsRequest) GetShipId() int32 {\n\tif x != nil {\n\t\treturn x.ShipId\n\t}\n\treturn 0\n}\n\nfunc (x *CreateGoodsRequest) GetIsNew() bool {\n\tif x != nil {\n\t\treturn x.IsNew\n\t}\n\treturn false\n}\n\nfunc (x *CreateGoodsRequest) GetIsHot() bool {\n\tif x != nil {\n\t\treturn x.IsHot\n\t}\n\treturn false\n}\n\nfunc (x *CreateGoodsRequest) GetOnSale() bool {\n\tif x != nil {\n\t\treturn x.OnSale\n\t}\n\treturn false\n}\n\nfunc (x *CreateGoodsRequest) GetSku() []*CreateGoodsRequestGoodsSku {\n\tif x != nil {\n\t\treturn x.Sku\n\t}\n\treturn nil\n}\n\ntype CreateGoodsResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tID int64 `protobuf:\"varint,1,opt,name=ID,proto3\" json:\"ID,omitempty\"`\n}\n\nfunc (x *CreateGoodsResponse) Reset() {\n\t*x = CreateGoodsResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_goods_v1_goods_proto_msgTypes[13]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CreateGoodsResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreateGoodsResponse) ProtoMessage() {}\n\nfunc (x *CreateGoodsResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_goods_v1_goods_proto_msgTypes[13]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreateGoodsResponse.ProtoReflect.Descriptor instead.\nfunc (*CreateGoodsResponse) Descriptor() ([]byte, []int) {\n\treturn file_api_goods_v1_goods_proto_rawDescGZIP(), []int{13}\n}\n\nfunc (x *CreateGoodsResponse) GetID() int64 {\n\tif x != nil {\n\t\treturn x.ID\n\t}\n\treturn 0\n}\n\ntype GoodsInfoResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId          int64    `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tCategoryId  int32    `protobuf:\"varint,2,opt,name=categoryId,proto3\" json:\"categoryId,omitempty\"`\n\tBrandId     int32    `protobuf:\"varint,3,opt,name=brandId,proto3\" json:\"brandId,omitempty\"`\n\tName        string   `protobuf:\"bytes,4,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tGoodsSn     string   `protobuf:\"bytes,5,opt,name=goodsSn,proto3\" json:\"goodsSn,omitempty\"`\n\tClickNum    int64    `protobuf:\"varint,6,opt,name=clickNum,proto3\" json:\"clickNum,omitempty\"`\n\tSoldNum     int64    `protobuf:\"varint,7,opt,name=soldNum,proto3\" json:\"soldNum,omitempty\"`\n\tFavNum      int64    `protobuf:\"varint,8,opt,name=favNum,proto3\" json:\"favNum,omitempty\"`\n\tMarketPrice int64    `protobuf:\"varint,9,opt,name=marketPrice,proto3\" json:\"marketPrice,omitempty\"`\n\tGoodsBrief  string   `protobuf:\"bytes,10,opt,name=goodsBrief,proto3\" json:\"goodsBrief,omitempty\"`\n\tGoodsDesc   string   `protobuf:\"bytes,11,opt,name=goodsDesc,proto3\" json:\"goodsDesc,omitempty\"`\n\tShipFree    bool     `protobuf:\"varint,12,opt,name=shipFree,proto3\" json:\"shipFree,omitempty\"`\n\tImages      string   `protobuf:\"bytes,13,opt,name=images,proto3\" json:\"images,omitempty\"`\n\tGoodsImages []string `protobuf:\"bytes,14,rep,name=goodsImages,proto3\" json:\"goodsImages,omitempty\"`\n\tIsNew       bool     `protobuf:\"varint,15,opt,name=isNew,proto3\" json:\"isNew,omitempty\"`\n\tIsHot       bool     `protobuf:\"varint,16,opt,name=isHot,proto3\" json:\"isHot,omitempty\"`\n\tOnSale      bool     `protobuf:\"varint,17,opt,name=onSale,proto3\" json:\"onSale,omitempty\"`\n}\n\nfunc (x *GoodsInfoResponse) Reset() {\n\t*x = GoodsInfoResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_goods_v1_goods_proto_msgTypes[14]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GoodsInfoResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GoodsInfoResponse) ProtoMessage() {}\n\nfunc (x *GoodsInfoResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_goods_v1_goods_proto_msgTypes[14]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GoodsInfoResponse.ProtoReflect.Descriptor instead.\nfunc (*GoodsInfoResponse) Descriptor() ([]byte, []int) {\n\treturn file_api_goods_v1_goods_proto_rawDescGZIP(), []int{14}\n}\n\nfunc (x *GoodsInfoResponse) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *GoodsInfoResponse) GetCategoryId() int32 {\n\tif x != nil {\n\t\treturn x.CategoryId\n\t}\n\treturn 0\n}\n\nfunc (x *GoodsInfoResponse) GetBrandId() int32 {\n\tif x != nil {\n\t\treturn x.BrandId\n\t}\n\treturn 0\n}\n\nfunc (x *GoodsInfoResponse) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *GoodsInfoResponse) GetGoodsSn() string {\n\tif x != nil {\n\t\treturn x.GoodsSn\n\t}\n\treturn \"\"\n}\n\nfunc (x *GoodsInfoResponse) GetClickNum() int64 {\n\tif x != nil {\n\t\treturn x.ClickNum\n\t}\n\treturn 0\n}\n\nfunc (x *GoodsInfoResponse) GetSoldNum() int64 {\n\tif x != nil {\n\t\treturn x.SoldNum\n\t}\n\treturn 0\n}\n\nfunc (x *GoodsInfoResponse) GetFavNum() int64 {\n\tif x != nil {\n\t\treturn x.FavNum\n\t}\n\treturn 0\n}\n\nfunc (x *GoodsInfoResponse) GetMarketPrice() int64 {\n\tif x != nil {\n\t\treturn x.MarketPrice\n\t}\n\treturn 0\n}\n\nfunc (x *GoodsInfoResponse) GetGoodsBrief() string {\n\tif x != nil {\n\t\treturn x.GoodsBrief\n\t}\n\treturn \"\"\n}\n\nfunc (x *GoodsInfoResponse) GetGoodsDesc() string {\n\tif x != nil {\n\t\treturn x.GoodsDesc\n\t}\n\treturn \"\"\n}\n\nfunc (x *GoodsInfoResponse) GetShipFree() bool {\n\tif x != nil {\n\t\treturn x.ShipFree\n\t}\n\treturn false\n}\n\nfunc (x *GoodsInfoResponse) GetImages() string {\n\tif x != nil {\n\t\treturn x.Images\n\t}\n\treturn \"\"\n}\n\nfunc (x *GoodsInfoResponse) GetGoodsImages() []string {\n\tif x != nil {\n\t\treturn x.GoodsImages\n\t}\n\treturn nil\n}\n\nfunc (x *GoodsInfoResponse) GetIsNew() bool {\n\tif x != nil {\n\t\treturn x.IsNew\n\t}\n\treturn false\n}\n\nfunc (x *GoodsInfoResponse) GetIsHot() bool {\n\tif x != nil {\n\t\treturn x.IsHot\n\t}\n\treturn false\n}\n\nfunc (x *GoodsInfoResponse) GetOnSale() bool {\n\tif x != nil {\n\t\treturn x.OnSale\n\t}\n\treturn false\n}\n\ntype GoodsListResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tTotal int64                `protobuf:\"varint,1,opt,name=total,proto3\" json:\"total,omitempty\"`\n\tList  []*GoodsInfoResponse `protobuf:\"bytes,2,rep,name=list,proto3\" json:\"list,omitempty\"`\n}\n\nfunc (x *GoodsListResponse) Reset() {\n\t*x = GoodsListResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_goods_v1_goods_proto_msgTypes[15]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GoodsListResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GoodsListResponse) ProtoMessage() {}\n\nfunc (x *GoodsListResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_goods_v1_goods_proto_msgTypes[15]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GoodsListResponse.ProtoReflect.Descriptor instead.\nfunc (*GoodsListResponse) Descriptor() ([]byte, []int) {\n\treturn file_api_goods_v1_goods_proto_rawDescGZIP(), []int{15}\n}\n\nfunc (x *GoodsListResponse) GetTotal() int64 {\n\tif x != nil {\n\t\treturn x.Total\n\t}\n\treturn 0\n}\n\nfunc (x *GoodsListResponse) GetList() []*GoodsInfoResponse {\n\tif x != nil {\n\t\treturn x.List\n\t}\n\treturn nil\n}\n\ntype GoodsFilterRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tKeywords    string `protobuf:\"bytes,1,opt,name=keywords,proto3\" json:\"keywords,omitempty\"`\n\tCategoryId  int32  `protobuf:\"varint,2,opt,name=categoryId,proto3\" json:\"categoryId,omitempty\"`\n\tBrandId     int32  `protobuf:\"varint,3,opt,name=brandId,proto3\" json:\"brandId,omitempty\"`\n\tMinPrice    int64  `protobuf:\"varint,4,opt,name=minPrice,proto3\" json:\"minPrice,omitempty\"`\n\tMaxPrice    int64  `protobuf:\"varint,5,opt,name=maxPrice,proto3\" json:\"maxPrice,omitempty\"`\n\tIsHot       bool   `protobuf:\"varint,6,opt,name=isHot,proto3\" json:\"isHot,omitempty\"`\n\tIsNew       bool   `protobuf:\"varint,7,opt,name=isNew,proto3\" json:\"isNew,omitempty\"`\n\tIsTab       bool   `protobuf:\"varint,8,opt,name=isTab,proto3\" json:\"isTab,omitempty\"`\n\tClickNum    int64  `protobuf:\"varint,9,opt,name=clickNum,proto3\" json:\"clickNum,omitempty\"`\n\tSoldNum     int64  `protobuf:\"varint,10,opt,name=soldNum,proto3\" json:\"soldNum,omitempty\"`\n\tFavNum      int64  `protobuf:\"varint,11,opt,name=favNum,proto3\" json:\"favNum,omitempty\"`\n\tPages       int64  `protobuf:\"varint,12,opt,name=pages,proto3\" json:\"pages,omitempty\"`\n\tPagePerNums int64  `protobuf:\"varint,13,opt,name=pagePerNums,proto3\" json:\"pagePerNums,omitempty\"`\n\tId          int64  `protobuf:\"varint,14,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GoodsFilterRequest) Reset() {\n\t*x = GoodsFilterRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_goods_v1_goods_proto_msgTypes[16]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GoodsFilterRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GoodsFilterRequest) ProtoMessage() {}\n\nfunc (x *GoodsFilterRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_goods_v1_goods_proto_msgTypes[16]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GoodsFilterRequest.ProtoReflect.Descriptor instead.\nfunc (*GoodsFilterRequest) Descriptor() ([]byte, []int) {\n\treturn file_api_goods_v1_goods_proto_rawDescGZIP(), []int{16}\n}\n\nfunc (x *GoodsFilterRequest) GetKeywords() string {\n\tif x != nil {\n\t\treturn x.Keywords\n\t}\n\treturn \"\"\n}\n\nfunc (x *GoodsFilterRequest) GetCategoryId() int32 {\n\tif x != nil {\n\t\treturn x.CategoryId\n\t}\n\treturn 0\n}\n\nfunc (x *GoodsFilterRequest) GetBrandId() int32 {\n\tif x != nil {\n\t\treturn x.BrandId\n\t}\n\treturn 0\n}\n\nfunc (x *GoodsFilterRequest) GetMinPrice() int64 {\n\tif x != nil {\n\t\treturn x.MinPrice\n\t}\n\treturn 0\n}\n\nfunc (x *GoodsFilterRequest) GetMaxPrice() int64 {\n\tif x != nil {\n\t\treturn x.MaxPrice\n\t}\n\treturn 0\n}\n\nfunc (x *GoodsFilterRequest) GetIsHot() bool {\n\tif x != nil {\n\t\treturn x.IsHot\n\t}\n\treturn false\n}\n\nfunc (x *GoodsFilterRequest) GetIsNew() bool {\n\tif x != nil {\n\t\treturn x.IsNew\n\t}\n\treturn false\n}\n\nfunc (x *GoodsFilterRequest) GetIsTab() bool {\n\tif x != nil {\n\t\treturn x.IsTab\n\t}\n\treturn false\n}\n\nfunc (x *GoodsFilterRequest) GetClickNum() int64 {\n\tif x != nil {\n\t\treturn x.ClickNum\n\t}\n\treturn 0\n}\n\nfunc (x *GoodsFilterRequest) GetSoldNum() int64 {\n\tif x != nil {\n\t\treturn x.SoldNum\n\t}\n\treturn 0\n}\n\nfunc (x *GoodsFilterRequest) GetFavNum() int64 {\n\tif x != nil {\n\t\treturn x.FavNum\n\t}\n\treturn 0\n}\n\nfunc (x *GoodsFilterRequest) GetPages() int64 {\n\tif x != nil {\n\t\treturn x.Pages\n\t}\n\treturn 0\n}\n\nfunc (x *GoodsFilterRequest) GetPagePerNums() int64 {\n\tif x != nil {\n\t\treturn x.PagePerNums\n\t}\n\treturn 0\n}\n\nfunc (x *GoodsFilterRequest) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\n// 商品分类\ntype CategoryInfoResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId             int32  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName           string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tParentCategory int32  `protobuf:\"varint,3,opt,name=parentCategory,proto3\" json:\"parentCategory,omitempty\"`\n\tLevel          int32  `protobuf:\"varint,4,opt,name=level,proto3\" json:\"level,omitempty\"`\n\tIsTab          bool   `protobuf:\"varint,5,opt,name=isTab,proto3\" json:\"isTab,omitempty\"`\n\tSort           int32  `protobuf:\"varint,6,opt,name=sort,proto3\" json:\"sort,omitempty\"`\n}\n\nfunc (x *CategoryInfoResponse) Reset() {\n\t*x = CategoryInfoResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_goods_v1_goods_proto_msgTypes[17]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CategoryInfoResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CategoryInfoResponse) ProtoMessage() {}\n\nfunc (x *CategoryInfoResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_goods_v1_goods_proto_msgTypes[17]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CategoryInfoResponse.ProtoReflect.Descriptor instead.\nfunc (*CategoryInfoResponse) Descriptor() ([]byte, []int) {\n\treturn file_api_goods_v1_goods_proto_rawDescGZIP(), []int{17}\n}\n\nfunc (x *CategoryInfoResponse) GetId() int32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *CategoryInfoResponse) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CategoryInfoResponse) GetParentCategory() int32 {\n\tif x != nil {\n\t\treturn x.ParentCategory\n\t}\n\treturn 0\n}\n\nfunc (x *CategoryInfoResponse) GetLevel() int32 {\n\tif x != nil {\n\t\treturn x.Level\n\t}\n\treturn 0\n}\n\nfunc (x *CategoryInfoResponse) GetIsTab() bool {\n\tif x != nil {\n\t\treturn x.IsTab\n\t}\n\treturn false\n}\n\nfunc (x *CategoryInfoResponse) GetSort() int32 {\n\tif x != nil {\n\t\treturn x.Sort\n\t}\n\treturn 0\n}\n\ntype CategoryListResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tJsonData string `protobuf:\"bytes,1,opt,name=jsonData,proto3\" json:\"jsonData,omitempty\"`\n}\n\nfunc (x *CategoryListResponse) Reset() {\n\t*x = CategoryListResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_goods_v1_goods_proto_msgTypes[18]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CategoryListResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CategoryListResponse) ProtoMessage() {}\n\nfunc (x *CategoryListResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_goods_v1_goods_proto_msgTypes[18]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CategoryListResponse.ProtoReflect.Descriptor instead.\nfunc (*CategoryListResponse) Descriptor() ([]byte, []int) {\n\treturn file_api_goods_v1_goods_proto_rawDescGZIP(), []int{18}\n}\n\nfunc (x *CategoryListResponse) GetJsonData() string {\n\tif x != nil {\n\t\treturn x.JsonData\n\t}\n\treturn \"\"\n}\n\ntype CategoryListRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId    int32 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tLevel int32 `protobuf:\"varint,2,opt,name=level,proto3\" json:\"level,omitempty\"`\n}\n\nfunc (x *CategoryListRequest) Reset() {\n\t*x = CategoryListRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_goods_v1_goods_proto_msgTypes[19]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CategoryListRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CategoryListRequest) ProtoMessage() {}\n\nfunc (x *CategoryListRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_goods_v1_goods_proto_msgTypes[19]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CategoryListRequest.ProtoReflect.Descriptor instead.\nfunc (*CategoryListRequest) Descriptor() ([]byte, []int) {\n\treturn file_api_goods_v1_goods_proto_rawDescGZIP(), []int{19}\n}\n\nfunc (x *CategoryListRequest) GetId() int32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *CategoryListRequest) GetLevel() int32 {\n\tif x != nil {\n\t\treturn x.Level\n\t}\n\treturn 0\n}\n\ntype SubCategoryListResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tInfo        *CategoryInfoResponse   `protobuf:\"bytes,1,opt,name=info,proto3\" json:\"info,omitempty\"`\n\tSubCategory []*CategoryInfoResponse `protobuf:\"bytes,2,rep,name=subCategory,proto3\" json:\"subCategory,omitempty\"`\n}\n\nfunc (x *SubCategoryListResponse) Reset() {\n\t*x = SubCategoryListResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_goods_v1_goods_proto_msgTypes[20]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SubCategoryListResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SubCategoryListResponse) ProtoMessage() {}\n\nfunc (x *SubCategoryListResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_goods_v1_goods_proto_msgTypes[20]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SubCategoryListResponse.ProtoReflect.Descriptor instead.\nfunc (*SubCategoryListResponse) Descriptor() ([]byte, []int) {\n\treturn file_api_goods_v1_goods_proto_rawDescGZIP(), []int{20}\n}\n\nfunc (x *SubCategoryListResponse) GetInfo() *CategoryInfoResponse {\n\tif x != nil {\n\t\treturn x.Info\n\t}\n\treturn nil\n}\n\nfunc (x *SubCategoryListResponse) GetSubCategory() []*CategoryInfoResponse {\n\tif x != nil {\n\t\treturn x.SubCategory\n\t}\n\treturn nil\n}\n\ntype CategoryInfoRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId             int32  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName           string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tParentCategory int32  `protobuf:\"varint,3,opt,name=parentCategory,proto3\" json:\"parentCategory,omitempty\"`\n\tLevel          int32  `protobuf:\"varint,4,opt,name=level,proto3\" json:\"level,omitempty\"`\n\tIsTab          bool   `protobuf:\"varint,5,opt,name=isTab,proto3\" json:\"isTab,omitempty\"`\n\tSort           int32  `protobuf:\"varint,6,opt,name=sort,proto3\" json:\"sort,omitempty\"`\n}\n\nfunc (x *CategoryInfoRequest) Reset() {\n\t*x = CategoryInfoRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_goods_v1_goods_proto_msgTypes[21]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CategoryInfoRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CategoryInfoRequest) ProtoMessage() {}\n\nfunc (x *CategoryInfoRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_goods_v1_goods_proto_msgTypes[21]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CategoryInfoRequest.ProtoReflect.Descriptor instead.\nfunc (*CategoryInfoRequest) Descriptor() ([]byte, []int) {\n\treturn file_api_goods_v1_goods_proto_rawDescGZIP(), []int{21}\n}\n\nfunc (x *CategoryInfoRequest) GetId() int32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *CategoryInfoRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CategoryInfoRequest) GetParentCategory() int32 {\n\tif x != nil {\n\t\treturn x.ParentCategory\n\t}\n\treturn 0\n}\n\nfunc (x *CategoryInfoRequest) GetLevel() int32 {\n\tif x != nil {\n\t\treturn x.Level\n\t}\n\treturn 0\n}\n\nfunc (x *CategoryInfoRequest) GetIsTab() bool {\n\tif x != nil {\n\t\treturn x.IsTab\n\t}\n\treturn false\n}\n\nfunc (x *CategoryInfoRequest) GetSort() int32 {\n\tif x != nil {\n\t\treturn x.Sort\n\t}\n\treturn 0\n}\n\ntype BatchCategoryInfoRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId        []int32 `protobuf:\"varint,1,rep,packed,name=id,proto3\" json:\"id,omitempty\"`\n\tGoodsNums int32   `protobuf:\"varint,2,opt,name=goodsNums,proto3\" json:\"goodsNums,omitempty\"`\n\tBrandNums int32   `protobuf:\"varint,3,opt,name=brandNums,proto3\" json:\"brandNums,omitempty\"`\n}\n\nfunc (x *BatchCategoryInfoRequest) Reset() {\n\t*x = BatchCategoryInfoRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_goods_v1_goods_proto_msgTypes[22]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *BatchCategoryInfoRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*BatchCategoryInfoRequest) ProtoMessage() {}\n\nfunc (x *BatchCategoryInfoRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_goods_v1_goods_proto_msgTypes[22]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use BatchCategoryInfoRequest.ProtoReflect.Descriptor instead.\nfunc (*BatchCategoryInfoRequest) Descriptor() ([]byte, []int) {\n\treturn file_api_goods_v1_goods_proto_rawDescGZIP(), []int{22}\n}\n\nfunc (x *BatchCategoryInfoRequest) GetId() []int32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn nil\n}\n\nfunc (x *BatchCategoryInfoRequest) GetGoodsNums() int32 {\n\tif x != nil {\n\t\treturn x.GoodsNums\n\t}\n\treturn 0\n}\n\nfunc (x *BatchCategoryInfoRequest) GetBrandNums() int32 {\n\tif x != nil {\n\t\treturn x.BrandNums\n\t}\n\treturn 0\n}\n\ntype DeleteCategoryRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId int32 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *DeleteCategoryRequest) Reset() {\n\t*x = DeleteCategoryRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_goods_v1_goods_proto_msgTypes[23]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *DeleteCategoryRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*DeleteCategoryRequest) ProtoMessage() {}\n\nfunc (x *DeleteCategoryRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_goods_v1_goods_proto_msgTypes[23]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use DeleteCategoryRequest.ProtoReflect.Descriptor instead.\nfunc (*DeleteCategoryRequest) Descriptor() ([]byte, []int) {\n\treturn file_api_goods_v1_goods_proto_rawDescGZIP(), []int{23}\n}\n\nfunc (x *DeleteCategoryRequest) GetId() int32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\ntype BrandListRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPages       int32 `protobuf:\"varint,1,opt,name=pages,proto3\" json:\"pages,omitempty\"`\n\tPagePerNums int32 `protobuf:\"varint,2,opt,name=pagePerNums,proto3\" json:\"pagePerNums,omitempty\"`\n}\n\nfunc (x *BrandListRequest) Reset() {\n\t*x = BrandListRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_goods_v1_goods_proto_msgTypes[24]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *BrandListRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*BrandListRequest) ProtoMessage() {}\n\nfunc (x *BrandListRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_goods_v1_goods_proto_msgTypes[24]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use BrandListRequest.ProtoReflect.Descriptor instead.\nfunc (*BrandListRequest) Descriptor() ([]byte, []int) {\n\treturn file_api_goods_v1_goods_proto_rawDescGZIP(), []int{24}\n}\n\nfunc (x *BrandListRequest) GetPages() int32 {\n\tif x != nil {\n\t\treturn x.Pages\n\t}\n\treturn 0\n}\n\nfunc (x *BrandListRequest) GetPagePerNums() int32 {\n\tif x != nil {\n\t\treturn x.PagePerNums\n\t}\n\treturn 0\n}\n\ntype BrandRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId    int32  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName  string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tLogo  string `protobuf:\"bytes,3,opt,name=logo,proto3\" json:\"logo,omitempty\"`\n\tDesc  string `protobuf:\"bytes,4,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\tIsTab bool   `protobuf:\"varint,5,opt,name=isTab,proto3\" json:\"isTab,omitempty\"`\n\tSort  int32  `protobuf:\"varint,6,opt,name=sort,proto3\" json:\"sort,omitempty\"`\n}\n\nfunc (x *BrandRequest) Reset() {\n\t*x = BrandRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_goods_v1_goods_proto_msgTypes[25]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *BrandRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*BrandRequest) ProtoMessage() {}\n\nfunc (x *BrandRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_goods_v1_goods_proto_msgTypes[25]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use BrandRequest.ProtoReflect.Descriptor instead.\nfunc (*BrandRequest) Descriptor() ([]byte, []int) {\n\treturn file_api_goods_v1_goods_proto_rawDescGZIP(), []int{25}\n}\n\nfunc (x *BrandRequest) GetId() int32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *BrandRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *BrandRequest) GetLogo() string {\n\tif x != nil {\n\t\treturn x.Logo\n\t}\n\treturn \"\"\n}\n\nfunc (x *BrandRequest) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *BrandRequest) GetIsTab() bool {\n\tif x != nil {\n\t\treturn x.IsTab\n\t}\n\treturn false\n}\n\nfunc (x *BrandRequest) GetSort() int32 {\n\tif x != nil {\n\t\treturn x.Sort\n\t}\n\treturn 0\n}\n\ntype BrandInfoResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId    int32  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName  string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tLogo  string `protobuf:\"bytes,3,opt,name=logo,proto3\" json:\"logo,omitempty\"`\n\tDesc  string `protobuf:\"bytes,4,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\tIsTab bool   `protobuf:\"varint,5,opt,name=isTab,proto3\" json:\"isTab,omitempty\"`\n\tSort  int32  `protobuf:\"varint,6,opt,name=sort,proto3\" json:\"sort,omitempty\"`\n}\n\nfunc (x *BrandInfoResponse) Reset() {\n\t*x = BrandInfoResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_goods_v1_goods_proto_msgTypes[26]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *BrandInfoResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*BrandInfoResponse) ProtoMessage() {}\n\nfunc (x *BrandInfoResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_goods_v1_goods_proto_msgTypes[26]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use BrandInfoResponse.ProtoReflect.Descriptor instead.\nfunc (*BrandInfoResponse) Descriptor() ([]byte, []int) {\n\treturn file_api_goods_v1_goods_proto_rawDescGZIP(), []int{26}\n}\n\nfunc (x *BrandInfoResponse) GetId() int32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *BrandInfoResponse) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *BrandInfoResponse) GetLogo() string {\n\tif x != nil {\n\t\treturn x.Logo\n\t}\n\treturn \"\"\n}\n\nfunc (x *BrandInfoResponse) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *BrandInfoResponse) GetIsTab() bool {\n\tif x != nil {\n\t\treturn x.IsTab\n\t}\n\treturn false\n}\n\nfunc (x *BrandInfoResponse) GetSort() int32 {\n\tif x != nil {\n\t\treturn x.Sort\n\t}\n\treturn 0\n}\n\ntype BrandListResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tTotal int32                `protobuf:\"varint,1,opt,name=total,proto3\" json:\"total,omitempty\"`\n\tData  []*BrandInfoResponse `protobuf:\"bytes,2,rep,name=data,proto3\" json:\"data,omitempty\"`\n}\n\nfunc (x *BrandListResponse) Reset() {\n\t*x = BrandListResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_goods_v1_goods_proto_msgTypes[27]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *BrandListResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*BrandListResponse) ProtoMessage() {}\n\nfunc (x *BrandListResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_goods_v1_goods_proto_msgTypes[27]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use BrandListResponse.ProtoReflect.Descriptor instead.\nfunc (*BrandListResponse) Descriptor() ([]byte, []int) {\n\treturn file_api_goods_v1_goods_proto_rawDescGZIP(), []int{27}\n}\n\nfunc (x *BrandListResponse) GetTotal() int32 {\n\tif x != nil {\n\t\treturn x.Total\n\t}\n\treturn 0\n}\n\nfunc (x *BrandListResponse) GetData() []*BrandInfoResponse {\n\tif x != nil {\n\t\treturn x.Data\n\t}\n\treturn nil\n}\n\n// 根据商品类型 选择商品规格信息并选择\n// 商品 sku 属性值 里面有规格的ID和属性的ID，分别是几组信息\ntype CreateGoodsRequestGoodsSku struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId                int64                                      `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tGoodsId           int64                                      `protobuf:\"varint,2,opt,name=goodsId,proto3\" json:\"goodsId,omitempty\"`\n\tSkuName           string                                     `protobuf:\"bytes,3,opt,name=skuName,proto3\" json:\"skuName,omitempty\"`\n\tCode              string                                     `protobuf:\"bytes,4,opt,name=code,proto3\" json:\"code,omitempty\"`\n\tBarCode           string                                     `protobuf:\"bytes,5,opt,name=barCode,proto3\" json:\"barCode,omitempty\"`\n\tPrice             int64                                      `protobuf:\"varint,6,opt,name=price,proto3\" json:\"price,omitempty\"`\n\tPromotionPrice    int64                                      `protobuf:\"varint,7,opt,name=promotionPrice,proto3\" json:\"promotionPrice,omitempty\"`\n\tPoints            int64                                      `protobuf:\"varint,8,opt,name=points,proto3\" json:\"points,omitempty\"`\n\tImage             string                                     `protobuf:\"bytes,9,opt,name=image,proto3\" json:\"image,omitempty\"`\n\tSort              int32                                      `protobuf:\"varint,10,opt,name=sort,proto3\" json:\"sort,omitempty\"`\n\tInventory         int64                                      `protobuf:\"varint,11,opt,name=inventory,proto3\" json:\"inventory,omitempty\"` // sku 库存\n\tSpecificationInfo []*CreateGoodsRequestGoodsSkuSpecification `protobuf:\"bytes,12,rep,name=specificationInfo,proto3\" json:\"specificationInfo,omitempty\"`\n\tGroupAttrInfo     []*CreateGoodsRequestGoodsSkuGroupAttr     `protobuf:\"bytes,13,rep,name=groupAttrInfo,proto3\" json:\"groupAttrInfo,omitempty\"`\n}\n\nfunc (x *CreateGoodsRequestGoodsSku) Reset() {\n\t*x = CreateGoodsRequestGoodsSku{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_goods_v1_goods_proto_msgTypes[28]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CreateGoodsRequestGoodsSku) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreateGoodsRequestGoodsSku) ProtoMessage() {}\n\nfunc (x *CreateGoodsRequestGoodsSku) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_goods_v1_goods_proto_msgTypes[28]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreateGoodsRequestGoodsSku.ProtoReflect.Descriptor instead.\nfunc (*CreateGoodsRequestGoodsSku) Descriptor() ([]byte, []int) {\n\treturn file_api_goods_v1_goods_proto_rawDescGZIP(), []int{12, 0}\n}\n\nfunc (x *CreateGoodsRequestGoodsSku) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *CreateGoodsRequestGoodsSku) GetGoodsId() int64 {\n\tif x != nil {\n\t\treturn x.GoodsId\n\t}\n\treturn 0\n}\n\nfunc (x *CreateGoodsRequestGoodsSku) GetSkuName() string {\n\tif x != nil {\n\t\treturn x.SkuName\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateGoodsRequestGoodsSku) GetCode() string {\n\tif x != nil {\n\t\treturn x.Code\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateGoodsRequestGoodsSku) GetBarCode() string {\n\tif x != nil {\n\t\treturn x.BarCode\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateGoodsRequestGoodsSku) GetPrice() int64 {\n\tif x != nil {\n\t\treturn x.Price\n\t}\n\treturn 0\n}\n\nfunc (x *CreateGoodsRequestGoodsSku) GetPromotionPrice() int64 {\n\tif x != nil {\n\t\treturn x.PromotionPrice\n\t}\n\treturn 0\n}\n\nfunc (x *CreateGoodsRequestGoodsSku) GetPoints() int64 {\n\tif x != nil {\n\t\treturn x.Points\n\t}\n\treturn 0\n}\n\nfunc (x *CreateGoodsRequestGoodsSku) GetImage() string {\n\tif x != nil {\n\t\treturn x.Image\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateGoodsRequestGoodsSku) GetSort() int32 {\n\tif x != nil {\n\t\treturn x.Sort\n\t}\n\treturn 0\n}\n\nfunc (x *CreateGoodsRequestGoodsSku) GetInventory() int64 {\n\tif x != nil {\n\t\treturn x.Inventory\n\t}\n\treturn 0\n}\n\nfunc (x *CreateGoodsRequestGoodsSku) GetSpecificationInfo() []*CreateGoodsRequestGoodsSkuSpecification {\n\tif x != nil {\n\t\treturn x.SpecificationInfo\n\t}\n\treturn nil\n}\n\nfunc (x *CreateGoodsRequestGoodsSku) GetGroupAttrInfo() []*CreateGoodsRequestGoodsSkuGroupAttr {\n\tif x != nil {\n\t\treturn x.GroupAttrInfo\n\t}\n\treturn nil\n}\n\n// 规格\ntype CreateGoodsRequestGoodsSkuSpecification struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tSId int64 `protobuf:\"varint,1,opt,name=sId,proto3\" json:\"sId,omitempty\"`\n\tVId int64 `protobuf:\"varint,2,opt,name=vId,proto3\" json:\"vId,omitempty\"`\n}\n\nfunc (x *CreateGoodsRequestGoodsSkuSpecification) Reset() {\n\t*x = CreateGoodsRequestGoodsSkuSpecification{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_goods_v1_goods_proto_msgTypes[29]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CreateGoodsRequestGoodsSkuSpecification) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreateGoodsRequestGoodsSkuSpecification) ProtoMessage() {}\n\nfunc (x *CreateGoodsRequestGoodsSkuSpecification) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_goods_v1_goods_proto_msgTypes[29]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreateGoodsRequestGoodsSkuSpecification.ProtoReflect.Descriptor instead.\nfunc (*CreateGoodsRequestGoodsSkuSpecification) Descriptor() ([]byte, []int) {\n\treturn file_api_goods_v1_goods_proto_rawDescGZIP(), []int{12, 0, 0}\n}\n\nfunc (x *CreateGoodsRequestGoodsSkuSpecification) GetSId() int64 {\n\tif x != nil {\n\t\treturn x.SId\n\t}\n\treturn 0\n}\n\nfunc (x *CreateGoodsRequestGoodsSkuSpecification) GetVId() int64 {\n\tif x != nil {\n\t\treturn x.VId\n\t}\n\treturn 0\n}\n\n// 属性组\ntype CreateGoodsRequestGoodsSkuGroupAttr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tGroupId   int64                                      `protobuf:\"varint,1,opt,name=groupId,proto3\" json:\"groupId,omitempty\"`\n\tGroupName string                                     `protobuf:\"bytes,2,opt,name=groupName,proto3\" json:\"groupName,omitempty\"`\n\tAttrInfo  []*CreateGoodsRequestGoodsSkuGroupAttrAttr `protobuf:\"bytes,3,rep,name=attrInfo,proto3\" json:\"attrInfo,omitempty\"`\n}\n\nfunc (x *CreateGoodsRequestGoodsSkuGroupAttr) Reset() {\n\t*x = CreateGoodsRequestGoodsSkuGroupAttr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_goods_v1_goods_proto_msgTypes[30]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CreateGoodsRequestGoodsSkuGroupAttr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreateGoodsRequestGoodsSkuGroupAttr) ProtoMessage() {}\n\nfunc (x *CreateGoodsRequestGoodsSkuGroupAttr) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_goods_v1_goods_proto_msgTypes[30]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreateGoodsRequestGoodsSkuGroupAttr.ProtoReflect.Descriptor instead.\nfunc (*CreateGoodsRequestGoodsSkuGroupAttr) Descriptor() ([]byte, []int) {\n\treturn file_api_goods_v1_goods_proto_rawDescGZIP(), []int{12, 0, 1}\n}\n\nfunc (x *CreateGoodsRequestGoodsSkuGroupAttr) GetGroupId() int64 {\n\tif x != nil {\n\t\treturn x.GroupId\n\t}\n\treturn 0\n}\n\nfunc (x *CreateGoodsRequestGoodsSkuGroupAttr) GetGroupName() string {\n\tif x != nil {\n\t\treturn x.GroupName\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateGoodsRequestGoodsSkuGroupAttr) GetAttrInfo() []*CreateGoodsRequestGoodsSkuGroupAttrAttr {\n\tif x != nil {\n\t\treturn x.AttrInfo\n\t}\n\treturn nil\n}\n\ntype CreateGoodsRequestGoodsSkuGroupAttrAttr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tAttrId        int64  `protobuf:\"varint,1,opt,name=attrId,proto3\" json:\"attrId,omitempty\"`\n\tAttrName      string `protobuf:\"bytes,2,opt,name=attrName,proto3\" json:\"attrName,omitempty\"`\n\tAttrValueId   int64  `protobuf:\"varint,3,opt,name=attrValueId,proto3\" json:\"attrValueId,omitempty\"`\n\tAttrValueName string `protobuf:\"bytes,4,opt,name=attrValueName,proto3\" json:\"attrValueName,omitempty\"`\n}\n\nfunc (x *CreateGoodsRequestGoodsSkuGroupAttrAttr) Reset() {\n\t*x = CreateGoodsRequestGoodsSkuGroupAttrAttr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_goods_v1_goods_proto_msgTypes[31]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CreateGoodsRequestGoodsSkuGroupAttrAttr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreateGoodsRequestGoodsSkuGroupAttrAttr) ProtoMessage() {}\n\nfunc (x *CreateGoodsRequestGoodsSkuGroupAttrAttr) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_goods_v1_goods_proto_msgTypes[31]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreateGoodsRequestGoodsSkuGroupAttrAttr.ProtoReflect.Descriptor instead.\nfunc (*CreateGoodsRequestGoodsSkuGroupAttrAttr) Descriptor() ([]byte, []int) {\n\treturn file_api_goods_v1_goods_proto_rawDescGZIP(), []int{12, 0, 1, 0}\n}\n\nfunc (x *CreateGoodsRequestGoodsSkuGroupAttrAttr) GetAttrId() int64 {\n\tif x != nil {\n\t\treturn x.AttrId\n\t}\n\treturn 0\n}\n\nfunc (x *CreateGoodsRequestGoodsSkuGroupAttrAttr) GetAttrName() string {\n\tif x != nil {\n\t\treturn x.AttrName\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateGoodsRequestGoodsSkuGroupAttrAttr) GetAttrValueId() int64 {\n\tif x != nil {\n\t\treturn x.AttrValueId\n\t}\n\treturn 0\n}\n\nfunc (x *CreateGoodsRequestGoodsSkuGroupAttrAttr) GetAttrValueName() string {\n\tif x != nil {\n\t\treturn x.AttrValueName\n\t}\n\treturn \"\"\n}\n\nvar File_api_goods_v1_goods_proto protoreflect.FileDescriptor\n\nvar file_api_goods_v1_goods_proto_rawDesc = []byte{\n\t0x0a, 0x18, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x67,\n\t0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x67, 0x6f, 0x6f, 0x64,\n\t0x73, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69,\n\t0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x7c, 0x0a, 0x10, 0x41, 0x74,\n\t0x74, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e,\n\t0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16,\n\t0x0a, 0x06, 0x61, 0x74, 0x74, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06,\n\t0x61, 0x74, 0x74, 0x72, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49,\n\t0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x28, 0x01,\n\t0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x05, 0x76, 0x61, 0x6c,\n\t0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10,\n\t0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x83, 0x02, 0x0a, 0x0b, 0x41, 0x74, 0x74,\n\t0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x06, 0x74, 0x79, 0x70, 0x65,\n\t0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x28,\n\t0x01, 0x52, 0x06, 0x74, 0x79, 0x70, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x07, 0x67, 0x72, 0x6f,\n\t0x75, 0x70, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22,\n\t0x02, 0x28, 0x01, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x05,\n\t0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04,\n\t0x72, 0x02, 0x10, 0x01, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64,\n\t0x65, 0x73, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12,\n\t0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52,\n\t0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18,\n\t0x07, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x1a, 0x02, 0x28, 0x01, 0x52, 0x04,\n\t0x73, 0x6f, 0x72, 0x74, 0x12, 0x38, 0x0a, 0x09, 0x61, 0x74, 0x74, 0x72, 0x56, 0x61, 0x6c, 0x75,\n\t0x65, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e,\n\t0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75,\n\t0x65, 0x73, 0x74, 0x52, 0x09, 0x61, 0x74, 0x74, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x6b,\n\t0x0a, 0x11, 0x41, 0x74, 0x74, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f,\n\t0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52,\n\t0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x74, 0x74, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x03, 0x52, 0x06, 0x61, 0x74, 0x74, 0x72, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x67,\n\t0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x67, 0x72,\n\t0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xe1, 0x01, 0x0a, 0x0c,\n\t0x41, 0x74, 0x74, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02,\n\t0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06,\n\t0x74, 0x79, 0x70, 0x65, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x74, 0x79,\n\t0x70, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x18,\n\t0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x14,\n\t0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74,\n\t0x69, 0x74, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x05, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74,\n\t0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,\n\t0x12, 0x12, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04,\n\t0x73, 0x6f, 0x72, 0x74, 0x12, 0x39, 0x0a, 0x09, 0x61, 0x74, 0x74, 0x72, 0x56, 0x61, 0x6c, 0x75,\n\t0x65, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e,\n\t0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70,\n\t0x6f, 0x6e, 0x73, 0x65, 0x52, 0x09, 0x61, 0x74, 0x74, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22,\n\t0xab, 0x01, 0x0a, 0x10, 0x41, 0x74, 0x74, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03,\n\t0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x06, 0x74, 0x79, 0x70, 0x65, 0x49, 0x64, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x28, 0x01, 0x52, 0x06, 0x74,\n\t0x79, 0x70, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x03, 0x52, 0x05, 0x74,\n\t0x69, 0x74, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x04, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74,\n\t0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,\n\t0x12, 0x1b, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07,\n\t0xfa, 0x42, 0x04, 0x1a, 0x02, 0x28, 0x01, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x22, 0x91, 0x01,\n\t0x0a, 0x11, 0x41, 0x74, 0x74, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f,\n\t0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52,\n\t0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x79, 0x70, 0x65, 0x49, 0x64, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x03, 0x52, 0x06, 0x74, 0x79, 0x70, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74,\n\t0x69, 0x74, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c,\n\t0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18,\n\t0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a,\n\t0x04, 0x73, 0x6f, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x6f, 0x72,\n\t0x74, 0x22, 0x78, 0x0a, 0x12, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x74, 0x74, 0x72, 0x49,\n\t0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x61, 0x74, 0x74, 0x72, 0x49, 0x64, 0x12,\n\t0x1d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07,\n\t0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1b,\n\t0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, 0xfa, 0x42,\n\t0x04, 0x1a, 0x02, 0x28, 0x01, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x22, 0x6e, 0x0a, 0x1a, 0x53,\n\t0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75,\n\t0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x74, 0x74,\n\t0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x61, 0x74, 0x74, 0x72, 0x49,\n\t0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18,\n\t0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x22, 0x99, 0x02, 0x0a, 0x14,\n\t0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03,\n\t0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x06, 0x74, 0x79, 0x70, 0x65, 0x49, 0x64, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x28, 0x01, 0x52, 0x06, 0x74,\n\t0x79, 0x70, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x02, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05,\n\t0x42, 0x07, 0xfa, 0x42, 0x04, 0x1a, 0x02, 0x28, 0x01, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x12,\n\t0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52,\n\t0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x73, 0x53, 0x6b, 0x75,\n\t0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x53, 0x6b, 0x75, 0x12, 0x1a, 0x0a,\n\t0x08, 0x69, 0x73, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52,\n\t0x08, 0x69, 0x73, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x12, 0x4c, 0x0a, 0x12, 0x73, 0x70, 0x65,\n\t0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18,\n\t0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31,\n\t0x2e, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61,\n\t0x6c, 0x75, 0x65, 0x52, 0x12, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x27, 0x0a, 0x15, 0x53, 0x70, 0x65, 0x63, 0x69,\n\t0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64,\n\t0x22, 0xed, 0x01, 0x0a, 0x10, 0x47, 0x6f, 0x6f, 0x64, 0x73, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65,\n\t0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x03, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x12, 0x23, 0x0a, 0x08, 0x74, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x03, 0x52, 0x08, 0x74,\n\t0x79, 0x70, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x41,\n\t0x6c, 0x69, 0x61, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65,\n\t0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x73, 0x56, 0x69, 0x72, 0x74, 0x75,\n\t0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x56, 0x69, 0x72, 0x74,\n\t0x75, 0x61, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x06, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18,\n\t0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x12, 0x23, 0x0a, 0x08, 0x62,\n\t0x72, 0x61, 0x6e, 0x64, 0x49, 0x64, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa,\n\t0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x62, 0x72, 0x61, 0x6e, 0x64, 0x49, 0x64, 0x73,\n\t0x22, 0x23, 0x0a, 0x11, 0x47, 0x6f, 0x6f, 0x64, 0x73, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73,\n\t0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x03, 0x52, 0x02, 0x69, 0x64, 0x22, 0xf0, 0x0b, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,\n\t0x47, 0x6f, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02,\n\t0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x27, 0x0a, 0x0a,\n\t0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05,\n\t0x42, 0x07, 0xfa, 0x42, 0x04, 0x1a, 0x02, 0x28, 0x01, 0x52, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67,\n\t0x6f, 0x72, 0x79, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x07, 0x62, 0x72, 0x61, 0x6e, 0x64, 0x49, 0x64,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x1a, 0x02, 0x28, 0x01, 0x52,\n\t0x07, 0x62, 0x72, 0x61, 0x6e, 0x64, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x06, 0x74, 0x79, 0x70, 0x65,\n\t0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x28,\n\t0x01, 0x52, 0x06, 0x74, 0x79, 0x70, 0x65, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a,\n\t0x09, 0x6e, 0x61, 0x6d, 0x65, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x67,\n\t0x6f, 0x6f, 0x64, 0x73, 0x54, 0x61, 0x67, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09,\n\t0x67, 0x6f, 0x6f, 0x64, 0x73, 0x54, 0x61, 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x67, 0x6f, 0x6f,\n\t0x64, 0x73, 0x53, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x6f, 0x6f, 0x64,\n\t0x73, 0x53, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x70, 0x50, 0x72, 0x69, 0x63, 0x65,\n\t0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x70, 0x50, 0x72, 0x69, 0x63,\n\t0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65,\n\t0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x50, 0x72,\n\t0x69, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79,\n\t0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72,\n\t0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x42, 0x72, 0x69, 0x65, 0x66, 0x18,\n\t0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x42, 0x72, 0x69, 0x65,\n\t0x66, 0x12, 0x28, 0x0a, 0x0f, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x46, 0x72, 0x6f, 0x6e, 0x74, 0x49,\n\t0x6d, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x67, 0x6f, 0x6f, 0x64,\n\t0x73, 0x46, 0x72, 0x6f, 0x6e, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x67,\n\t0x6f, 0x6f, 0x64, 0x73, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09,\n\t0x52, 0x0b, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x12, 0x1a, 0x0a,\n\t0x08, 0x73, 0x68, 0x69, 0x70, 0x46, 0x72, 0x65, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52,\n\t0x08, 0x73, 0x68, 0x69, 0x70, 0x46, 0x72, 0x65, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x69,\n\t0x70, 0x49, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x73, 0x68, 0x69, 0x70, 0x49,\n\t0x64, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x73, 0x4e, 0x65, 0x77, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08,\n\t0x52, 0x05, 0x69, 0x73, 0x4e, 0x65, 0x77, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x73, 0x48, 0x6f, 0x74,\n\t0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x48, 0x6f, 0x74, 0x12, 0x16, 0x0a,\n\t0x06, 0x6f, 0x6e, 0x53, 0x61, 0x6c, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6f,\n\t0x6e, 0x53, 0x61, 0x6c, 0x65, 0x12, 0x37, 0x0a, 0x03, 0x73, 0x6b, 0x75, 0x18, 0x14, 0x20, 0x03,\n\t0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72,\n\t0x65, 0x61, 0x74, 0x65, 0x47, 0x6f, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x53, 0x6b, 0x75, 0x52, 0x03, 0x73, 0x6b, 0x75, 0x1a, 0xf7,\n\t0x06, 0x0a, 0x08, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x53, 0x6b, 0x75, 0x12, 0x0e, 0x0a, 0x02, 0x69,\n\t0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x67,\n\t0x6f, 0x6f, 0x64, 0x73, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x67, 0x6f,\n\t0x6f, 0x64, 0x73, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x07, 0x73, 0x6b, 0x75, 0x4e, 0x61, 0x6d, 0x65,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52,\n\t0x07, 0x73, 0x6b, 0x75, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65,\n\t0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52,\n\t0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x21, 0x0a, 0x07, 0x62, 0x61, 0x72, 0x43, 0x6f, 0x64, 0x65,\n\t0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52,\n\t0x07, 0x62, 0x61, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63,\n\t0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x12, 0x26,\n\t0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65,\n\t0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f,\n\t0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73,\n\t0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x14,\n\t0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69,\n\t0x6d, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01,\n\t0x28, 0x05, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65,\n\t0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x69, 0x6e, 0x76,\n\t0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x61, 0x0a, 0x11, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66,\n\t0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x0c, 0x20, 0x03, 0x28,\n\t0x0b, 0x32, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65,\n\t0x61, 0x74, 0x65, 0x47, 0x6f, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x64, 0x73, 0x53, 0x6b, 0x75, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69,\n\t0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x55, 0x0a, 0x0d, 0x67, 0x72, 0x6f,\n\t0x75, 0x70, 0x41, 0x74, 0x74, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61,\n\t0x74, 0x65, 0x47, 0x6f, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x64, 0x73, 0x53, 0x6b, 0x75, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x74, 0x74,\n\t0x72, 0x52, 0x0d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x74, 0x74, 0x72, 0x49, 0x6e, 0x66, 0x6f,\n\t0x1a, 0x45, 0x0a, 0x0d, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x12, 0x19, 0x0a, 0x03, 0x73, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07,\n\t0xfa, 0x42, 0x04, 0x22, 0x02, 0x28, 0x01, 0x52, 0x03, 0x73, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x03,\n\t0x76, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02,\n\t0x28, 0x01, 0x52, 0x03, 0x76, 0x49, 0x64, 0x1a, 0xbe, 0x02, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75,\n\t0x70, 0x41, 0x74, 0x74, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12,\n\t0x1c, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x50, 0x0a,\n\t0x08, 0x61, 0x74, 0x74, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x34, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74,\n\t0x65, 0x47, 0x6f, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x64, 0x73, 0x53, 0x6b, 0x75, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x74, 0x74, 0x72,\n\t0x2e, 0x61, 0x74, 0x74, 0x72, 0x52, 0x08, 0x61, 0x74, 0x74, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x1a,\n\t0xa6, 0x01, 0x0a, 0x04, 0x61, 0x74, 0x74, 0x72, 0x12, 0x1f, 0x0a, 0x06, 0x61, 0x74, 0x74, 0x72,\n\t0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x28,\n\t0x01, 0x52, 0x06, 0x61, 0x74, 0x74, 0x72, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x08, 0x61, 0x74, 0x74,\n\t0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04,\n\t0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x61, 0x74, 0x74, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29,\n\t0x0a, 0x0b, 0x61, 0x74, 0x74, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x49, 0x64, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x28, 0x01, 0x52, 0x0b, 0x61, 0x74,\n\t0x74, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x49, 0x64, 0x12, 0x2d, 0x0a, 0x0d, 0x61, 0x74, 0x74,\n\t0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,\n\t0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0d, 0x61, 0x74, 0x74, 0x72, 0x56,\n\t0x61, 0x6c, 0x75, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x25, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61,\n\t0x74, 0x65, 0x47, 0x6f, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,\n\t0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x49, 0x44, 0x22,\n\t0xd3, 0x03, 0x0a, 0x11, 0x47, 0x6f, 0x6f, 0x64, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73,\n\t0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72,\n\t0x79, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67,\n\t0x6f, 0x72, 0x79, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x72, 0x61, 0x6e, 0x64, 0x49, 0x64,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x62, 0x72, 0x61, 0x6e, 0x64, 0x49, 0x64, 0x12,\n\t0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x53, 0x6e, 0x18, 0x05,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x53, 0x6e, 0x12, 0x1a, 0x0a,\n\t0x08, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52,\n\t0x08, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x6f, 0x6c,\n\t0x64, 0x4e, 0x75, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x73, 0x6f, 0x6c, 0x64,\n\t0x4e, 0x75, 0x6d, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x61, 0x76, 0x4e, 0x75, 0x6d, 0x18, 0x08, 0x20,\n\t0x01, 0x28, 0x03, 0x52, 0x06, 0x66, 0x61, 0x76, 0x4e, 0x75, 0x6d, 0x12, 0x20, 0x0a, 0x0b, 0x6d,\n\t0x61, 0x72, 0x6b, 0x65, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03,\n\t0x52, 0x0b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x1e, 0x0a,\n\t0x0a, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x42, 0x72, 0x69, 0x65, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x0a, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x42, 0x72, 0x69, 0x65, 0x66, 0x12, 0x1c, 0x0a,\n\t0x09, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x44, 0x65, 0x73, 0x63, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x09, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x44, 0x65, 0x73, 0x63, 0x12, 0x1a, 0x0a, 0x08, 0x73,\n\t0x68, 0x69, 0x70, 0x46, 0x72, 0x65, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x73,\n\t0x68, 0x69, 0x70, 0x46, 0x72, 0x65, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65,\n\t0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x12,\n\t0x20, 0x0a, 0x0b, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x18, 0x0e,\n\t0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x49, 0x6d, 0x61, 0x67, 0x65,\n\t0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x73, 0x4e, 0x65, 0x77, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08,\n\t0x52, 0x05, 0x69, 0x73, 0x4e, 0x65, 0x77, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x73, 0x48, 0x6f, 0x74,\n\t0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x48, 0x6f, 0x74, 0x12, 0x16, 0x0a,\n\t0x06, 0x6f, 0x6e, 0x53, 0x61, 0x6c, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6f,\n\t0x6e, 0x53, 0x61, 0x6c, 0x65, 0x22, 0x5a, 0x0a, 0x11, 0x47, 0x6f, 0x6f, 0x64, 0x73, 0x4c, 0x69,\n\t0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f,\n\t0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c,\n\t0x12, 0x2f, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x6f, 0x6f, 0x64, 0x73, 0x49,\n\t0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x04, 0x6c, 0x69, 0x73,\n\t0x74, 0x22, 0xfa, 0x02, 0x0a, 0x12, 0x47, 0x6f, 0x6f, 0x64, 0x73, 0x46, 0x69, 0x6c, 0x74, 0x65,\n\t0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x77,\n\t0x6f, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x77,\n\t0x6f, 0x72, 0x64, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79,\n\t0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f,\n\t0x72, 0x79, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x72, 0x61, 0x6e, 0x64, 0x49, 0x64, 0x18,\n\t0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x62, 0x72, 0x61, 0x6e, 0x64, 0x49, 0x64, 0x12, 0x1a,\n\t0x0a, 0x08, 0x6d, 0x69, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03,\n\t0x52, 0x08, 0x6d, 0x69, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x61,\n\t0x78, 0x50, 0x72, 0x69, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x61,\n\t0x78, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x73, 0x48, 0x6f, 0x74, 0x18,\n\t0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x48, 0x6f, 0x74, 0x12, 0x14, 0x0a, 0x05,\n\t0x69, 0x73, 0x4e, 0x65, 0x77, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x4e,\n\t0x65, 0x77, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x73, 0x54, 0x61, 0x62, 0x18, 0x08, 0x20, 0x01, 0x28,\n\t0x08, 0x52, 0x05, 0x69, 0x73, 0x54, 0x61, 0x62, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6c, 0x69, 0x63,\n\t0x6b, 0x4e, 0x75, 0x6d, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x63,\n\t0x6b, 0x4e, 0x75, 0x6d, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x6f, 0x6c, 0x64, 0x4e, 0x75, 0x6d, 0x18,\n\t0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x73, 0x6f, 0x6c, 0x64, 0x4e, 0x75, 0x6d, 0x12, 0x16,\n\t0x0a, 0x06, 0x66, 0x61, 0x76, 0x4e, 0x75, 0x6d, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06,\n\t0x66, 0x61, 0x76, 0x4e, 0x75, 0x6d, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x67, 0x65, 0x73, 0x18,\n\t0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x70, 0x61, 0x67, 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b,\n\t0x70, 0x61, 0x67, 0x65, 0x50, 0x65, 0x72, 0x4e, 0x75, 0x6d, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28,\n\t0x03, 0x52, 0x0b, 0x70, 0x61, 0x67, 0x65, 0x50, 0x65, 0x72, 0x4e, 0x75, 0x6d, 0x73, 0x12, 0x0e,\n\t0x0a, 0x02, 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x22, 0xa2,\n\t0x01, 0x0a, 0x14, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52,\n\t0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x70,\n\t0x61, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x05, 0x52, 0x0e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x74, 0x65, 0x67,\n\t0x6f, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01,\n\t0x28, 0x05, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x73, 0x54,\n\t0x61, 0x62, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x54, 0x61, 0x62, 0x12,\n\t0x12, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73,\n\t0x6f, 0x72, 0x74, 0x22, 0x32, 0x0a, 0x14, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x4c,\n\t0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6a,\n\t0x73, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6a,\n\t0x73, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x22, 0x3b, 0x0a, 0x13, 0x43, 0x61, 0x74, 0x65, 0x67,\n\t0x6f, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e,\n\t0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14,\n\t0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c,\n\t0x65, 0x76, 0x65, 0x6c, 0x22, 0x8f, 0x01, 0x0a, 0x17, 0x53, 0x75, 0x62, 0x43, 0x61, 0x74, 0x65,\n\t0x67, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x12, 0x32, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f,\n\t0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x04,\n\t0x69, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0b, 0x73, 0x75, 0x62, 0x43, 0x61, 0x74, 0x65, 0x67,\n\t0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x64,\n\t0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x49, 0x6e, 0x66,\n\t0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0b, 0x73, 0x75, 0x62, 0x43, 0x61,\n\t0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x22, 0xa1, 0x01, 0x0a, 0x13, 0x43, 0x61, 0x74, 0x65, 0x67,\n\t0x6f, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e,\n\t0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12,\n\t0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x74, 0x65,\n\t0x67, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x70, 0x61, 0x72, 0x65,\n\t0x6e, 0x74, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x65,\n\t0x76, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c,\n\t0x12, 0x14, 0x0a, 0x05, 0x69, 0x73, 0x54, 0x61, 0x62, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52,\n\t0x05, 0x69, 0x73, 0x54, 0x61, 0x62, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18, 0x06,\n\t0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x22, 0x66, 0x0a, 0x18, 0x42, 0x61,\n\t0x74, 0x63, 0x68, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52,\n\t0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x03,\n\t0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x4e,\n\t0x75, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x67, 0x6f, 0x6f, 0x64, 0x73,\n\t0x4e, 0x75, 0x6d, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x62, 0x72, 0x61, 0x6e, 0x64, 0x4e, 0x75, 0x6d,\n\t0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x62, 0x72, 0x61, 0x6e, 0x64, 0x4e, 0x75,\n\t0x6d, 0x73, 0x22, 0x27, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x61, 0x74, 0x65,\n\t0x67, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69,\n\t0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x22, 0x4a, 0x0a, 0x10, 0x42,\n\t0x72, 0x61, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,\n\t0x14, 0x0a, 0x05, 0x70, 0x61, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05,\n\t0x70, 0x61, 0x67, 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x67, 0x65, 0x50, 0x65, 0x72,\n\t0x4e, 0x75, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x70, 0x61, 0x67, 0x65,\n\t0x50, 0x65, 0x72, 0x4e, 0x75, 0x6d, 0x73, 0x22, 0x84, 0x01, 0x0a, 0x0c, 0x42, 0x72, 0x61, 0x6e,\n\t0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04,\n\t0x6c, 0x6f, 0x67, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x6f,\n\t0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,\n\t0x64, 0x65, 0x73, 0x63, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x73, 0x54, 0x61, 0x62, 0x18, 0x05, 0x20,\n\t0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x54, 0x61, 0x62, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6f,\n\t0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x22, 0x89,\n\t0x01, 0x0a, 0x11, 0x42, 0x72, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70,\n\t0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05,\n\t0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x6f,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x6f, 0x12, 0x12, 0x0a, 0x04,\n\t0x64, 0x65, 0x73, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63,\n\t0x12, 0x14, 0x0a, 0x05, 0x69, 0x73, 0x54, 0x61, 0x62, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52,\n\t0x05, 0x69, 0x73, 0x54, 0x61, 0x62, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18, 0x06,\n\t0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x22, 0x5a, 0x0a, 0x11, 0x42, 0x72,\n\t0x61, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,\n\t0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05,\n\t0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x2f, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20,\n\t0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x42,\n\t0x72, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xa6, 0x09, 0x0a, 0x05, 0x47, 0x6f, 0x6f, 0x64, 0x73,\n\t0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f,\n\t0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1e,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f,\n\t0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52,\n\t0x0a, 0x0e, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79,\n\t0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x74, 0x65,\n\t0x67, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,\n\t0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x43, 0x61,\n\t0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,\n\t0x73, 0x65, 0x12, 0x4f, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x61, 0x74, 0x65,\n\t0x67, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e,\n\t0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75,\n\t0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43,\n\t0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f,\n\t0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x61, 0x74,\n\t0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31,\n\t0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52,\n\t0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x47,\n\t0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79,\n\t0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x74, 0x65,\n\t0x67, 0x6f, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,\n\t0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x44, 0x0a, 0x09, 0x42, 0x72, 0x61, 0x6e, 0x64,\n\t0x4c, 0x69, 0x73, 0x74, 0x12, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e,\n\t0x42, 0x72, 0x61, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x1a, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x72, 0x61, 0x6e,\n\t0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a,\n\t0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x64, 0x12, 0x16, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x72, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e,\n\t0x42, 0x72, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,\n\t0x65, 0x12, 0x3d, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x64,\n\t0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x72, 0x61, 0x6e,\n\t0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79,\n\t0x12, 0x3d, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x64, 0x12,\n\t0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x72, 0x61, 0x6e, 0x64,\n\t0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12,\n\t0x4a, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x6f, 0x6f, 0x64, 0x73, 0x54, 0x79,\n\t0x70, 0x65, 0x12, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x6f,\n\t0x6f, 0x64, 0x73, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x6f, 0x6f, 0x64, 0x73, 0x54,\n\t0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x18, 0x43,\n\t0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x6f, 0x6f, 0x64, 0x73, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66,\n\t0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e,\n\t0x76, 0x31, 0x2e, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e,\n\t0x76, 0x31, 0x2e, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61,\n\t0x74, 0x65, 0x41, 0x74, 0x74, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x1a, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70,\n\t0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e,\n\t0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70,\n\t0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x74,\n\t0x74, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e,\n\t0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x52, 0x65,\n\t0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,\n\t0x47, 0x6f, 0x6f, 0x64, 0x73, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31,\n\t0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x6f, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75,\n\t0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43,\n\t0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x6f, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,\n\t0x73, 0x65, 0x12, 0x43, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x6f, 0x6f, 0x64,\n\t0x73, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65,\n\t0x61, 0x74, 0x65, 0x47, 0x6f, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,\n\t0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x46, 0x0a, 0x09, 0x47, 0x6f, 0x6f, 0x64, 0x73,\n\t0x4c, 0x69, 0x73, 0x74, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e,\n\t0x47, 0x6f, 0x6f, 0x64, 0x73, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65,\n\t0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x6f,\n\t0x6f, 0x64, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42,\n\t0x17, 0x5a, 0x15, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x6f,\n\t0x64, 0x73, 0x2f, 0x76, 0x31, 0x3b, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_api_goods_v1_goods_proto_rawDescOnce sync.Once\n\tfile_api_goods_v1_goods_proto_rawDescData = file_api_goods_v1_goods_proto_rawDesc\n)\n\nfunc file_api_goods_v1_goods_proto_rawDescGZIP() []byte {\n\tfile_api_goods_v1_goods_proto_rawDescOnce.Do(func() {\n\t\tfile_api_goods_v1_goods_proto_rawDescData = protoimpl.X.CompressGZIP(file_api_goods_v1_goods_proto_rawDescData)\n\t})\n\treturn file_api_goods_v1_goods_proto_rawDescData\n}\n\nvar file_api_goods_v1_goods_proto_msgTypes = make([]protoimpl.MessageInfo, 32)\nvar file_api_goods_v1_goods_proto_goTypes = []interface{}{\n\t(*AttrValueRequest)(nil),                        // 0: goods.v1.AttrValueRequest\n\t(*AttrRequest)(nil),                             // 1: goods.v1.AttrRequest\n\t(*AttrValueResponse)(nil),                       // 2: goods.v1.AttrValueResponse\n\t(*AttrResponse)(nil),                            // 3: goods.v1.AttrResponse\n\t(*AttrGroupRequest)(nil),                        // 4: goods.v1.AttrGroupRequest\n\t(*AttrGroupResponse)(nil),                       // 5: goods.v1.AttrGroupResponse\n\t(*SpecificationValue)(nil),                      // 6: goods.v1.SpecificationValue\n\t(*SpecificationValueResponse)(nil),              // 7: goods.v1.SpecificationValueResponse\n\t(*SpecificationRequest)(nil),                    // 8: goods.v1.SpecificationRequest\n\t(*SpecificationResponse)(nil),                   // 9: goods.v1.SpecificationResponse\n\t(*GoodsTypeRequest)(nil),                        // 10: goods.v1.GoodsTypeRequest\n\t(*GoodsTypeResponse)(nil),                       // 11: goods.v1.GoodsTypeResponse\n\t(*CreateGoodsRequest)(nil),                      // 12: goods.v1.CreateGoodsRequest\n\t(*CreateGoodsResponse)(nil),                     // 13: goods.v1.CreateGoodsResponse\n\t(*GoodsInfoResponse)(nil),                       // 14: goods.v1.GoodsInfoResponse\n\t(*GoodsListResponse)(nil),                       // 15: goods.v1.GoodsListResponse\n\t(*GoodsFilterRequest)(nil),                      // 16: goods.v1.GoodsFilterRequest\n\t(*CategoryInfoResponse)(nil),                    // 17: goods.v1.CategoryInfoResponse\n\t(*CategoryListResponse)(nil),                    // 18: goods.v1.CategoryListResponse\n\t(*CategoryListRequest)(nil),                     // 19: goods.v1.CategoryListRequest\n\t(*SubCategoryListResponse)(nil),                 // 20: goods.v1.SubCategoryListResponse\n\t(*CategoryInfoRequest)(nil),                     // 21: goods.v1.CategoryInfoRequest\n\t(*BatchCategoryInfoRequest)(nil),                // 22: goods.v1.BatchCategoryInfoRequest\n\t(*DeleteCategoryRequest)(nil),                   // 23: goods.v1.DeleteCategoryRequest\n\t(*BrandListRequest)(nil),                        // 24: goods.v1.BrandListRequest\n\t(*BrandRequest)(nil),                            // 25: goods.v1.BrandRequest\n\t(*BrandInfoResponse)(nil),                       // 26: goods.v1.BrandInfoResponse\n\t(*BrandListResponse)(nil),                       // 27: goods.v1.BrandListResponse\n\t(*CreateGoodsRequestGoodsSku)(nil),              // 28: goods.v1.CreateGoodsRequest.goodsSku\n\t(*CreateGoodsRequestGoodsSkuSpecification)(nil), // 29: goods.v1.CreateGoodsRequest.goodsSku.specification\n\t(*CreateGoodsRequestGoodsSkuGroupAttr)(nil),     // 30: goods.v1.CreateGoodsRequest.goodsSku.groupAttr\n\t(*CreateGoodsRequestGoodsSkuGroupAttrAttr)(nil), // 31: goods.v1.CreateGoodsRequest.goodsSku.groupAttr.attr\n\t(*emptypb.Empty)(nil),                           // 32: google.protobuf.Empty\n}\nvar file_api_goods_v1_goods_proto_depIdxs = []int32{\n\t0,  // 0: goods.v1.AttrRequest.attrValue:type_name -> goods.v1.AttrValueRequest\n\t2,  // 1: goods.v1.AttrResponse.attrValue:type_name -> goods.v1.AttrValueResponse\n\t6,  // 2: goods.v1.SpecificationRequest.specificationValue:type_name -> goods.v1.SpecificationValue\n\t28, // 3: goods.v1.CreateGoodsRequest.sku:type_name -> goods.v1.CreateGoodsRequest.goodsSku\n\t14, // 4: goods.v1.GoodsListResponse.list:type_name -> goods.v1.GoodsInfoResponse\n\t17, // 5: goods.v1.SubCategoryListResponse.info:type_name -> goods.v1.CategoryInfoResponse\n\t17, // 6: goods.v1.SubCategoryListResponse.subCategory:type_name -> goods.v1.CategoryInfoResponse\n\t26, // 7: goods.v1.BrandListResponse.data:type_name -> goods.v1.BrandInfoResponse\n\t29, // 8: goods.v1.CreateGoodsRequest.goodsSku.specificationInfo:type_name -> goods.v1.CreateGoodsRequest.goodsSku.specification\n\t30, // 9: goods.v1.CreateGoodsRequest.goodsSku.groupAttrInfo:type_name -> goods.v1.CreateGoodsRequest.goodsSku.groupAttr\n\t31, // 10: goods.v1.CreateGoodsRequest.goodsSku.groupAttr.attrInfo:type_name -> goods.v1.CreateGoodsRequest.goodsSku.groupAttr.attr\n\t32, // 11: goods.v1.Goods.GetAllCategoryList:input_type -> google.protobuf.Empty\n\t19, // 12: goods.v1.Goods.GetSubCategory:input_type -> goods.v1.CategoryListRequest\n\t21, // 13: goods.v1.Goods.CreateCategory:input_type -> goods.v1.CategoryInfoRequest\n\t23, // 14: goods.v1.Goods.DeleteCategory:input_type -> goods.v1.DeleteCategoryRequest\n\t21, // 15: goods.v1.Goods.UpdateCategory:input_type -> goods.v1.CategoryInfoRequest\n\t24, // 16: goods.v1.Goods.BrandList:input_type -> goods.v1.BrandListRequest\n\t25, // 17: goods.v1.Goods.CreateBrand:input_type -> goods.v1.BrandRequest\n\t25, // 18: goods.v1.Goods.DeleteBrand:input_type -> goods.v1.BrandRequest\n\t25, // 19: goods.v1.Goods.UpdateBrand:input_type -> goods.v1.BrandRequest\n\t10, // 20: goods.v1.Goods.CreateGoodsType:input_type -> goods.v1.GoodsTypeRequest\n\t8,  // 21: goods.v1.Goods.CreateGoodsSpecification:input_type -> goods.v1.SpecificationRequest\n\t4,  // 22: goods.v1.Goods.CreateAttrGroup:input_type -> goods.v1.AttrGroupRequest\n\t1,  // 23: goods.v1.Goods.CreateAttrValue:input_type -> goods.v1.AttrRequest\n\t12, // 24: goods.v1.Goods.CreateGoods:input_type -> goods.v1.CreateGoodsRequest\n\t12, // 25: goods.v1.Goods.UpdateGoods:input_type -> goods.v1.CreateGoodsRequest\n\t16, // 26: goods.v1.Goods.GoodsList:input_type -> goods.v1.GoodsFilterRequest\n\t18, // 27: goods.v1.Goods.GetAllCategoryList:output_type -> goods.v1.CategoryListResponse\n\t20, // 28: goods.v1.Goods.GetSubCategory:output_type -> goods.v1.SubCategoryListResponse\n\t17, // 29: goods.v1.Goods.CreateCategory:output_type -> goods.v1.CategoryInfoResponse\n\t32, // 30: goods.v1.Goods.DeleteCategory:output_type -> google.protobuf.Empty\n\t32, // 31: goods.v1.Goods.UpdateCategory:output_type -> google.protobuf.Empty\n\t27, // 32: goods.v1.Goods.BrandList:output_type -> goods.v1.BrandListResponse\n\t26, // 33: goods.v1.Goods.CreateBrand:output_type -> goods.v1.BrandInfoResponse\n\t32, // 34: goods.v1.Goods.DeleteBrand:output_type -> google.protobuf.Empty\n\t32, // 35: goods.v1.Goods.UpdateBrand:output_type -> google.protobuf.Empty\n\t11, // 36: goods.v1.Goods.CreateGoodsType:output_type -> goods.v1.GoodsTypeResponse\n\t9,  // 37: goods.v1.Goods.CreateGoodsSpecification:output_type -> goods.v1.SpecificationResponse\n\t5,  // 38: goods.v1.Goods.CreateAttrGroup:output_type -> goods.v1.AttrGroupResponse\n\t3,  // 39: goods.v1.Goods.CreateAttrValue:output_type -> goods.v1.AttrResponse\n\t13, // 40: goods.v1.Goods.CreateGoods:output_type -> goods.v1.CreateGoodsResponse\n\t32, // 41: goods.v1.Goods.UpdateGoods:output_type -> google.protobuf.Empty\n\t15, // 42: goods.v1.Goods.GoodsList:output_type -> goods.v1.GoodsListResponse\n\t27, // [27:43] is the sub-list for method output_type\n\t11, // [11:27] is the sub-list for method input_type\n\t11, // [11:11] is the sub-list for extension type_name\n\t11, // [11:11] is the sub-list for extension extendee\n\t0,  // [0:11] is the sub-list for field type_name\n}\n\nfunc init() { file_api_goods_v1_goods_proto_init() }\nfunc file_api_goods_v1_goods_proto_init() {\n\tif File_api_goods_v1_goods_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_api_goods_v1_goods_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AttrValueRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_goods_v1_goods_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AttrRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_goods_v1_goods_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AttrValueResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_goods_v1_goods_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AttrResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_goods_v1_goods_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AttrGroupRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_goods_v1_goods_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AttrGroupResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_goods_v1_goods_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SpecificationValue); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_goods_v1_goods_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SpecificationValueResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_goods_v1_goods_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SpecificationRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_goods_v1_goods_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SpecificationResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_goods_v1_goods_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GoodsTypeRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_goods_v1_goods_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GoodsTypeResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_goods_v1_goods_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CreateGoodsRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_goods_v1_goods_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CreateGoodsResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_goods_v1_goods_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GoodsInfoResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_goods_v1_goods_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GoodsListResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_goods_v1_goods_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GoodsFilterRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_goods_v1_goods_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CategoryInfoResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_goods_v1_goods_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CategoryListResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_goods_v1_goods_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CategoryListRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_goods_v1_goods_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SubCategoryListResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_goods_v1_goods_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CategoryInfoRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_goods_v1_goods_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*BatchCategoryInfoRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_goods_v1_goods_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*DeleteCategoryRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_goods_v1_goods_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*BrandListRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_goods_v1_goods_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*BrandRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_goods_v1_goods_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*BrandInfoResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_goods_v1_goods_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*BrandListResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_goods_v1_goods_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CreateGoodsRequestGoodsSku); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_goods_v1_goods_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CreateGoodsRequestGoodsSkuSpecification); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_goods_v1_goods_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CreateGoodsRequestGoodsSkuGroupAttr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_goods_v1_goods_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CreateGoodsRequestGoodsSkuGroupAttrAttr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_api_goods_v1_goods_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   32,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_api_goods_v1_goods_proto_goTypes,\n\t\tDependencyIndexes: file_api_goods_v1_goods_proto_depIdxs,\n\t\tMessageInfos:      file_api_goods_v1_goods_proto_msgTypes,\n\t}.Build()\n\tFile_api_goods_v1_goods_proto = out.File\n\tfile_api_goods_v1_goods_proto_rawDesc = nil\n\tfile_api_goods_v1_goods_proto_goTypes = nil\n\tfile_api_goods_v1_goods_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "service/goods/api/goods/v1/goods.pb.validate.go",
    "content": "// Code generated by protoc-gen-validate. DO NOT EDIT.\n// source: api/goods/v1/goods.proto\n\npackage v1\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"net/mail\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"sort\"\n\t\"strings\"\n\t\"time\"\n\t\"unicode/utf8\"\n\n\t\"google.golang.org/protobuf/types/known/anypb\"\n)\n\n// ensure the imports are used\nvar (\n\t_ = bytes.MinRead\n\t_ = errors.New(\"\")\n\t_ = fmt.Print\n\t_ = utf8.UTFMax\n\t_ = (*regexp.Regexp)(nil)\n\t_ = (*strings.Reader)(nil)\n\t_ = net.IPv4len\n\t_ = time.Duration(0)\n\t_ = (*url.URL)(nil)\n\t_ = (*mail.Address)(nil)\n\t_ = anypb.Any{}\n\t_ = sort.Sort\n)\n\n// Validate checks the field values on AttrValueRequest with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *AttrValueRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on AttrValueRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// AttrValueRequestMultiError, or nil if none found.\nfunc (m *AttrValueRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *AttrValueRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for AttrId\n\n\tif m.GetGroupId() < 1 {\n\t\terr := AttrValueRequestValidationError{\n\t\t\tfield:  \"GroupId\",\n\t\t\treason: \"value must be greater than or equal to 1\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetValue()) < 3 {\n\t\terr := AttrValueRequestValidationError{\n\t\t\tfield:  \"Value\",\n\t\t\treason: \"value length must be at least 3 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn AttrValueRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// AttrValueRequestMultiError is an error wrapping multiple validation errors\n// returned by AttrValueRequest.ValidateAll() if the designated constraints\n// aren't met.\ntype AttrValueRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m AttrValueRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m AttrValueRequestMultiError) AllErrors() []error { return m }\n\n// AttrValueRequestValidationError is the validation error returned by\n// AttrValueRequest.Validate if the designated constraints aren't met.\ntype AttrValueRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e AttrValueRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e AttrValueRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e AttrValueRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e AttrValueRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e AttrValueRequestValidationError) ErrorName() string { return \"AttrValueRequestValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e AttrValueRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sAttrValueRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = AttrValueRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = AttrValueRequestValidationError{}\n\n// Validate checks the field values on AttrRequest with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *AttrRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on AttrRequest with the rules defined in\n// the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in AttrRequestMultiError, or\n// nil if none found.\nfunc (m *AttrRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *AttrRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\tif m.GetTypeId() < 1 {\n\t\terr := AttrRequestValidationError{\n\t\t\tfield:  \"TypeId\",\n\t\t\treason: \"value must be greater than or equal to 1\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif m.GetGroupId() < 1 {\n\t\terr := AttrRequestValidationError{\n\t\t\tfield:  \"GroupId\",\n\t\t\treason: \"value must be greater than or equal to 1\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetTitle()) < 1 {\n\t\terr := AttrRequestValidationError{\n\t\t\tfield:  \"Title\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\t// no validation rules for Desc\n\n\t// no validation rules for Status\n\n\tif m.GetSort() < 1 {\n\t\terr := AttrRequestValidationError{\n\t\t\tfield:  \"Sort\",\n\t\t\treason: \"value must be greater than or equal to 1\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tfor idx, item := range m.GetAttrValue() {\n\t\t_, _ = idx, item\n\n\t\tif all {\n\t\t\tswitch v := interface{}(item).(type) {\n\t\t\tcase interface{ ValidateAll() error }:\n\t\t\t\tif err := v.ValidateAll(); err != nil {\n\t\t\t\t\terrors = append(errors, AttrRequestValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"AttrValue[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\tcase interface{ Validate() error }:\n\t\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\t\terrors = append(errors, AttrRequestValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"AttrValue[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t} else if v, ok := interface{}(item).(interface{ Validate() error }); ok {\n\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\treturn AttrRequestValidationError{\n\t\t\t\t\tfield:  fmt.Sprintf(\"AttrValue[%v]\", idx),\n\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\tcause:  err,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn AttrRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// AttrRequestMultiError is an error wrapping multiple validation errors\n// returned by AttrRequest.ValidateAll() if the designated constraints aren't met.\ntype AttrRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m AttrRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m AttrRequestMultiError) AllErrors() []error { return m }\n\n// AttrRequestValidationError is the validation error returned by\n// AttrRequest.Validate if the designated constraints aren't met.\ntype AttrRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e AttrRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e AttrRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e AttrRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e AttrRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e AttrRequestValidationError) ErrorName() string { return \"AttrRequestValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e AttrRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sAttrRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = AttrRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = AttrRequestValidationError{}\n\n// Validate checks the field values on AttrValueResponse with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *AttrValueResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on AttrValueResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// AttrValueResponseMultiError, or nil if none found.\nfunc (m *AttrValueResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *AttrValueResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for AttrId\n\n\t// no validation rules for GroupId\n\n\t// no validation rules for Value\n\n\tif len(errors) > 0 {\n\t\treturn AttrValueResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// AttrValueResponseMultiError is an error wrapping multiple validation errors\n// returned by AttrValueResponse.ValidateAll() if the designated constraints\n// aren't met.\ntype AttrValueResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m AttrValueResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m AttrValueResponseMultiError) AllErrors() []error { return m }\n\n// AttrValueResponseValidationError is the validation error returned by\n// AttrValueResponse.Validate if the designated constraints aren't met.\ntype AttrValueResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e AttrValueResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e AttrValueResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e AttrValueResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e AttrValueResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e AttrValueResponseValidationError) ErrorName() string {\n\treturn \"AttrValueResponseValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e AttrValueResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sAttrValueResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = AttrValueResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = AttrValueResponseValidationError{}\n\n// Validate checks the field values on AttrResponse with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *AttrResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on AttrResponse with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in AttrResponseMultiError, or\n// nil if none found.\nfunc (m *AttrResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *AttrResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for TypeId\n\n\t// no validation rules for GroupId\n\n\t// no validation rules for Title\n\n\t// no validation rules for Desc\n\n\t// no validation rules for Status\n\n\t// no validation rules for Sort\n\n\tfor idx, item := range m.GetAttrValue() {\n\t\t_, _ = idx, item\n\n\t\tif all {\n\t\t\tswitch v := interface{}(item).(type) {\n\t\t\tcase interface{ ValidateAll() error }:\n\t\t\t\tif err := v.ValidateAll(); err != nil {\n\t\t\t\t\terrors = append(errors, AttrResponseValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"AttrValue[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\tcase interface{ Validate() error }:\n\t\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\t\terrors = append(errors, AttrResponseValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"AttrValue[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t} else if v, ok := interface{}(item).(interface{ Validate() error }); ok {\n\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\treturn AttrResponseValidationError{\n\t\t\t\t\tfield:  fmt.Sprintf(\"AttrValue[%v]\", idx),\n\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\tcause:  err,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn AttrResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// AttrResponseMultiError is an error wrapping multiple validation errors\n// returned by AttrResponse.ValidateAll() if the designated constraints aren't met.\ntype AttrResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m AttrResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m AttrResponseMultiError) AllErrors() []error { return m }\n\n// AttrResponseValidationError is the validation error returned by\n// AttrResponse.Validate if the designated constraints aren't met.\ntype AttrResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e AttrResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e AttrResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e AttrResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e AttrResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e AttrResponseValidationError) ErrorName() string { return \"AttrResponseValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e AttrResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sAttrResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = AttrResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = AttrResponseValidationError{}\n\n// Validate checks the field values on AttrGroupRequest with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *AttrGroupRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on AttrGroupRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// AttrGroupRequestMultiError, or nil if none found.\nfunc (m *AttrGroupRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *AttrGroupRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\tif m.GetTypeId() < 1 {\n\t\terr := AttrGroupRequestValidationError{\n\t\t\tfield:  \"TypeId\",\n\t\t\treason: \"value must be greater than or equal to 1\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetTitle()) < 3 {\n\t\terr := AttrGroupRequestValidationError{\n\t\t\tfield:  \"Title\",\n\t\t\treason: \"value length must be at least 3 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\t// no validation rules for Desc\n\n\t// no validation rules for Status\n\n\tif m.GetSort() < 1 {\n\t\terr := AttrGroupRequestValidationError{\n\t\t\tfield:  \"Sort\",\n\t\t\treason: \"value must be greater than or equal to 1\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn AttrGroupRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// AttrGroupRequestMultiError is an error wrapping multiple validation errors\n// returned by AttrGroupRequest.ValidateAll() if the designated constraints\n// aren't met.\ntype AttrGroupRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m AttrGroupRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m AttrGroupRequestMultiError) AllErrors() []error { return m }\n\n// AttrGroupRequestValidationError is the validation error returned by\n// AttrGroupRequest.Validate if the designated constraints aren't met.\ntype AttrGroupRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e AttrGroupRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e AttrGroupRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e AttrGroupRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e AttrGroupRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e AttrGroupRequestValidationError) ErrorName() string { return \"AttrGroupRequestValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e AttrGroupRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sAttrGroupRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = AttrGroupRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = AttrGroupRequestValidationError{}\n\n// Validate checks the field values on AttrGroupResponse with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *AttrGroupResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on AttrGroupResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// AttrGroupResponseMultiError, or nil if none found.\nfunc (m *AttrGroupResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *AttrGroupResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for TypeId\n\n\t// no validation rules for Title\n\n\t// no validation rules for Desc\n\n\t// no validation rules for Status\n\n\t// no validation rules for Sort\n\n\tif len(errors) > 0 {\n\t\treturn AttrGroupResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// AttrGroupResponseMultiError is an error wrapping multiple validation errors\n// returned by AttrGroupResponse.ValidateAll() if the designated constraints\n// aren't met.\ntype AttrGroupResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m AttrGroupResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m AttrGroupResponseMultiError) AllErrors() []error { return m }\n\n// AttrGroupResponseValidationError is the validation error returned by\n// AttrGroupResponse.Validate if the designated constraints aren't met.\ntype AttrGroupResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e AttrGroupResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e AttrGroupResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e AttrGroupResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e AttrGroupResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e AttrGroupResponseValidationError) ErrorName() string {\n\treturn \"AttrGroupResponseValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e AttrGroupResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sAttrGroupResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = AttrGroupResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = AttrGroupResponseValidationError{}\n\n// Validate checks the field values on SpecificationValue with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the first error encountered is returned, or nil if there are no violations.\nfunc (m *SpecificationValue) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on SpecificationValue with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// SpecificationValueMultiError, or nil if none found.\nfunc (m *SpecificationValue) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *SpecificationValue) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for AttrId\n\n\tif utf8.RuneCountInString(m.GetValue()) < 3 {\n\t\terr := SpecificationValueValidationError{\n\t\t\tfield:  \"Value\",\n\t\t\treason: \"value length must be at least 3 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif m.GetSort() < 1 {\n\t\terr := SpecificationValueValidationError{\n\t\t\tfield:  \"Sort\",\n\t\t\treason: \"value must be greater than or equal to 1\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn SpecificationValueMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// SpecificationValueMultiError is an error wrapping multiple validation errors\n// returned by SpecificationValue.ValidateAll() if the designated constraints\n// aren't met.\ntype SpecificationValueMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m SpecificationValueMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m SpecificationValueMultiError) AllErrors() []error { return m }\n\n// SpecificationValueValidationError is the validation error returned by\n// SpecificationValue.Validate if the designated constraints aren't met.\ntype SpecificationValueValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e SpecificationValueValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e SpecificationValueValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e SpecificationValueValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e SpecificationValueValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e SpecificationValueValidationError) ErrorName() string {\n\treturn \"SpecificationValueValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e SpecificationValueValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sSpecificationValue.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = SpecificationValueValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = SpecificationValueValidationError{}\n\n// Validate checks the field values on SpecificationValueResponse with the\n// rules defined in the proto definition for this message. If any rules are\n// violated, the first error encountered is returned, or nil if there are no violations.\nfunc (m *SpecificationValueResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on SpecificationValueResponse with the\n// rules defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// SpecificationValueResponseMultiError, or nil if none found.\nfunc (m *SpecificationValueResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *SpecificationValueResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for AttrId\n\n\t// no validation rules for Value\n\n\t// no validation rules for Sort\n\n\tif len(errors) > 0 {\n\t\treturn SpecificationValueResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// SpecificationValueResponseMultiError is an error wrapping multiple\n// validation errors returned by SpecificationValueResponse.ValidateAll() if\n// the designated constraints aren't met.\ntype SpecificationValueResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m SpecificationValueResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m SpecificationValueResponseMultiError) AllErrors() []error { return m }\n\n// SpecificationValueResponseValidationError is the validation error returned\n// by SpecificationValueResponse.Validate if the designated constraints aren't met.\ntype SpecificationValueResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e SpecificationValueResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e SpecificationValueResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e SpecificationValueResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e SpecificationValueResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e SpecificationValueResponseValidationError) ErrorName() string {\n\treturn \"SpecificationValueResponseValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e SpecificationValueResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sSpecificationValueResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = SpecificationValueResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = SpecificationValueResponseValidationError{}\n\n// Validate checks the field values on SpecificationRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the first error encountered is returned, or nil if there are no violations.\nfunc (m *SpecificationRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on SpecificationRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// SpecificationRequestMultiError, or nil if none found.\nfunc (m *SpecificationRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *SpecificationRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\tif m.GetTypeId() < 1 {\n\t\terr := SpecificationRequestValidationError{\n\t\t\tfield:  \"TypeId\",\n\t\t\treason: \"value must be greater than or equal to 1\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetName()) < 2 {\n\t\terr := SpecificationRequestValidationError{\n\t\t\tfield:  \"Name\",\n\t\t\treason: \"value length must be at least 2 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif m.GetSort() < 1 {\n\t\terr := SpecificationRequestValidationError{\n\t\t\tfield:  \"Sort\",\n\t\t\treason: \"value must be greater than or equal to 1\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\t// no validation rules for Status\n\n\t// no validation rules for IsSku\n\n\t// no validation rules for IsSelect\n\n\tfor idx, item := range m.GetSpecificationValue() {\n\t\t_, _ = idx, item\n\n\t\tif all {\n\t\t\tswitch v := interface{}(item).(type) {\n\t\t\tcase interface{ ValidateAll() error }:\n\t\t\t\tif err := v.ValidateAll(); err != nil {\n\t\t\t\t\terrors = append(errors, SpecificationRequestValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"SpecificationValue[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\tcase interface{ Validate() error }:\n\t\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\t\terrors = append(errors, SpecificationRequestValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"SpecificationValue[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t} else if v, ok := interface{}(item).(interface{ Validate() error }); ok {\n\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\treturn SpecificationRequestValidationError{\n\t\t\t\t\tfield:  fmt.Sprintf(\"SpecificationValue[%v]\", idx),\n\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\tcause:  err,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn SpecificationRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// SpecificationRequestMultiError is an error wrapping multiple validation\n// errors returned by SpecificationRequest.ValidateAll() if the designated\n// constraints aren't met.\ntype SpecificationRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m SpecificationRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m SpecificationRequestMultiError) AllErrors() []error { return m }\n\n// SpecificationRequestValidationError is the validation error returned by\n// SpecificationRequest.Validate if the designated constraints aren't met.\ntype SpecificationRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e SpecificationRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e SpecificationRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e SpecificationRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e SpecificationRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e SpecificationRequestValidationError) ErrorName() string {\n\treturn \"SpecificationRequestValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e SpecificationRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sSpecificationRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = SpecificationRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = SpecificationRequestValidationError{}\n\n// Validate checks the field values on SpecificationResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the first error encountered is returned, or nil if there are no violations.\nfunc (m *SpecificationResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on SpecificationResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// SpecificationResponseMultiError, or nil if none found.\nfunc (m *SpecificationResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *SpecificationResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\tif len(errors) > 0 {\n\t\treturn SpecificationResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// SpecificationResponseMultiError is an error wrapping multiple validation\n// errors returned by SpecificationResponse.ValidateAll() if the designated\n// constraints aren't met.\ntype SpecificationResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m SpecificationResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m SpecificationResponseMultiError) AllErrors() []error { return m }\n\n// SpecificationResponseValidationError is the validation error returned by\n// SpecificationResponse.Validate if the designated constraints aren't met.\ntype SpecificationResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e SpecificationResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e SpecificationResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e SpecificationResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e SpecificationResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e SpecificationResponseValidationError) ErrorName() string {\n\treturn \"SpecificationResponseValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e SpecificationResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sSpecificationResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = SpecificationResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = SpecificationResponseValidationError{}\n\n// Validate checks the field values on GoodsTypeRequest with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *GoodsTypeRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on GoodsTypeRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// GoodsTypeRequestMultiError, or nil if none found.\nfunc (m *GoodsTypeRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *GoodsTypeRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\tif utf8.RuneCountInString(m.GetName()) < 3 {\n\t\terr := GoodsTypeRequestValidationError{\n\t\t\tfield:  \"Name\",\n\t\t\treason: \"value length must be at least 3 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetTypeCode()) < 3 {\n\t\terr := GoodsTypeRequestValidationError{\n\t\t\tfield:  \"TypeCode\",\n\t\t\treason: \"value length must be at least 3 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\t// no validation rules for NameAlias\n\n\t// no validation rules for IsVirtual\n\n\t// no validation rules for Desc\n\n\t// no validation rules for Sort\n\n\tif utf8.RuneCountInString(m.GetBrandIds()) < 1 {\n\t\terr := GoodsTypeRequestValidationError{\n\t\t\tfield:  \"BrandIds\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn GoodsTypeRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// GoodsTypeRequestMultiError is an error wrapping multiple validation errors\n// returned by GoodsTypeRequest.ValidateAll() if the designated constraints\n// aren't met.\ntype GoodsTypeRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m GoodsTypeRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m GoodsTypeRequestMultiError) AllErrors() []error { return m }\n\n// GoodsTypeRequestValidationError is the validation error returned by\n// GoodsTypeRequest.Validate if the designated constraints aren't met.\ntype GoodsTypeRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e GoodsTypeRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e GoodsTypeRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e GoodsTypeRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e GoodsTypeRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e GoodsTypeRequestValidationError) ErrorName() string { return \"GoodsTypeRequestValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e GoodsTypeRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sGoodsTypeRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = GoodsTypeRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = GoodsTypeRequestValidationError{}\n\n// Validate checks the field values on GoodsTypeResponse with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *GoodsTypeResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on GoodsTypeResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// GoodsTypeResponseMultiError, or nil if none found.\nfunc (m *GoodsTypeResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *GoodsTypeResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\tif len(errors) > 0 {\n\t\treturn GoodsTypeResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// GoodsTypeResponseMultiError is an error wrapping multiple validation errors\n// returned by GoodsTypeResponse.ValidateAll() if the designated constraints\n// aren't met.\ntype GoodsTypeResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m GoodsTypeResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m GoodsTypeResponseMultiError) AllErrors() []error { return m }\n\n// GoodsTypeResponseValidationError is the validation error returned by\n// GoodsTypeResponse.Validate if the designated constraints aren't met.\ntype GoodsTypeResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e GoodsTypeResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e GoodsTypeResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e GoodsTypeResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e GoodsTypeResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e GoodsTypeResponseValidationError) ErrorName() string {\n\treturn \"GoodsTypeResponseValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e GoodsTypeResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sGoodsTypeResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = GoodsTypeResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = GoodsTypeResponseValidationError{}\n\n// Validate checks the field values on CreateGoodsRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the first error encountered is returned, or nil if there are no violations.\nfunc (m *CreateGoodsRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CreateGoodsRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// CreateGoodsRequestMultiError, or nil if none found.\nfunc (m *CreateGoodsRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CreateGoodsRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\tif m.GetCategoryId() < 1 {\n\t\terr := CreateGoodsRequestValidationError{\n\t\t\tfield:  \"CategoryId\",\n\t\t\treason: \"value must be greater than or equal to 1\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif m.GetBrandId() < 1 {\n\t\terr := CreateGoodsRequestValidationError{\n\t\t\tfield:  \"BrandId\",\n\t\t\treason: \"value must be greater than or equal to 1\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif m.GetTypeId() < 1 {\n\t\terr := CreateGoodsRequestValidationError{\n\t\t\tfield:  \"TypeId\",\n\t\t\treason: \"value must be greater than or equal to 1\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\t// no validation rules for Name\n\n\t// no validation rules for NameAlias\n\n\t// no validation rules for GoodsTags\n\n\t// no validation rules for GoodsSn\n\n\t// no validation rules for ShopPrice\n\n\t// no validation rules for MarketPrice\n\n\t// no validation rules for Inventory\n\n\t// no validation rules for GoodsBrief\n\n\t// no validation rules for GoodsFrontImage\n\n\t// no validation rules for ShipFree\n\n\t// no validation rules for ShipId\n\n\t// no validation rules for IsNew\n\n\t// no validation rules for IsHot\n\n\t// no validation rules for OnSale\n\n\tfor idx, item := range m.GetSku() {\n\t\t_, _ = idx, item\n\n\t\tif all {\n\t\t\tswitch v := interface{}(item).(type) {\n\t\t\tcase interface{ ValidateAll() error }:\n\t\t\t\tif err := v.ValidateAll(); err != nil {\n\t\t\t\t\terrors = append(errors, CreateGoodsRequestValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"Sku[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\tcase interface{ Validate() error }:\n\t\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\t\terrors = append(errors, CreateGoodsRequestValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"Sku[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t} else if v, ok := interface{}(item).(interface{ Validate() error }); ok {\n\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\treturn CreateGoodsRequestValidationError{\n\t\t\t\t\tfield:  fmt.Sprintf(\"Sku[%v]\", idx),\n\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\tcause:  err,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn CreateGoodsRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CreateGoodsRequestMultiError is an error wrapping multiple validation errors\n// returned by CreateGoodsRequest.ValidateAll() if the designated constraints\n// aren't met.\ntype CreateGoodsRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CreateGoodsRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CreateGoodsRequestMultiError) AllErrors() []error { return m }\n\n// CreateGoodsRequestValidationError is the validation error returned by\n// CreateGoodsRequest.Validate if the designated constraints aren't met.\ntype CreateGoodsRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CreateGoodsRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CreateGoodsRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CreateGoodsRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CreateGoodsRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CreateGoodsRequestValidationError) ErrorName() string {\n\treturn \"CreateGoodsRequestValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e CreateGoodsRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCreateGoodsRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CreateGoodsRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CreateGoodsRequestValidationError{}\n\n// Validate checks the field values on CreateGoodsResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the first error encountered is returned, or nil if there are no violations.\nfunc (m *CreateGoodsResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CreateGoodsResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// CreateGoodsResponseMultiError, or nil if none found.\nfunc (m *CreateGoodsResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CreateGoodsResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for ID\n\n\tif len(errors) > 0 {\n\t\treturn CreateGoodsResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CreateGoodsResponseMultiError is an error wrapping multiple validation\n// errors returned by CreateGoodsResponse.ValidateAll() if the designated\n// constraints aren't met.\ntype CreateGoodsResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CreateGoodsResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CreateGoodsResponseMultiError) AllErrors() []error { return m }\n\n// CreateGoodsResponseValidationError is the validation error returned by\n// CreateGoodsResponse.Validate if the designated constraints aren't met.\ntype CreateGoodsResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CreateGoodsResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CreateGoodsResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CreateGoodsResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CreateGoodsResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CreateGoodsResponseValidationError) ErrorName() string {\n\treturn \"CreateGoodsResponseValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e CreateGoodsResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCreateGoodsResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CreateGoodsResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CreateGoodsResponseValidationError{}\n\n// Validate checks the field values on GoodsInfoResponse with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *GoodsInfoResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on GoodsInfoResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// GoodsInfoResponseMultiError, or nil if none found.\nfunc (m *GoodsInfoResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *GoodsInfoResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for CategoryId\n\n\t// no validation rules for BrandId\n\n\t// no validation rules for Name\n\n\t// no validation rules for GoodsSn\n\n\t// no validation rules for ClickNum\n\n\t// no validation rules for SoldNum\n\n\t// no validation rules for FavNum\n\n\t// no validation rules for MarketPrice\n\n\t// no validation rules for GoodsBrief\n\n\t// no validation rules for GoodsDesc\n\n\t// no validation rules for ShipFree\n\n\t// no validation rules for Images\n\n\t// no validation rules for IsNew\n\n\t// no validation rules for IsHot\n\n\t// no validation rules for OnSale\n\n\tif len(errors) > 0 {\n\t\treturn GoodsInfoResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// GoodsInfoResponseMultiError is an error wrapping multiple validation errors\n// returned by GoodsInfoResponse.ValidateAll() if the designated constraints\n// aren't met.\ntype GoodsInfoResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m GoodsInfoResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m GoodsInfoResponseMultiError) AllErrors() []error { return m }\n\n// GoodsInfoResponseValidationError is the validation error returned by\n// GoodsInfoResponse.Validate if the designated constraints aren't met.\ntype GoodsInfoResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e GoodsInfoResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e GoodsInfoResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e GoodsInfoResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e GoodsInfoResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e GoodsInfoResponseValidationError) ErrorName() string {\n\treturn \"GoodsInfoResponseValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e GoodsInfoResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sGoodsInfoResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = GoodsInfoResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = GoodsInfoResponseValidationError{}\n\n// Validate checks the field values on GoodsListResponse with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *GoodsListResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on GoodsListResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// GoodsListResponseMultiError, or nil if none found.\nfunc (m *GoodsListResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *GoodsListResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Total\n\n\tfor idx, item := range m.GetList() {\n\t\t_, _ = idx, item\n\n\t\tif all {\n\t\t\tswitch v := interface{}(item).(type) {\n\t\t\tcase interface{ ValidateAll() error }:\n\t\t\t\tif err := v.ValidateAll(); err != nil {\n\t\t\t\t\terrors = append(errors, GoodsListResponseValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"List[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\tcase interface{ Validate() error }:\n\t\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\t\terrors = append(errors, GoodsListResponseValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"List[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t} else if v, ok := interface{}(item).(interface{ Validate() error }); ok {\n\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\treturn GoodsListResponseValidationError{\n\t\t\t\t\tfield:  fmt.Sprintf(\"List[%v]\", idx),\n\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\tcause:  err,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn GoodsListResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// GoodsListResponseMultiError is an error wrapping multiple validation errors\n// returned by GoodsListResponse.ValidateAll() if the designated constraints\n// aren't met.\ntype GoodsListResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m GoodsListResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m GoodsListResponseMultiError) AllErrors() []error { return m }\n\n// GoodsListResponseValidationError is the validation error returned by\n// GoodsListResponse.Validate if the designated constraints aren't met.\ntype GoodsListResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e GoodsListResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e GoodsListResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e GoodsListResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e GoodsListResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e GoodsListResponseValidationError) ErrorName() string {\n\treturn \"GoodsListResponseValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e GoodsListResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sGoodsListResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = GoodsListResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = GoodsListResponseValidationError{}\n\n// Validate checks the field values on GoodsFilterRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the first error encountered is returned, or nil if there are no violations.\nfunc (m *GoodsFilterRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on GoodsFilterRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// GoodsFilterRequestMultiError, or nil if none found.\nfunc (m *GoodsFilterRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *GoodsFilterRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Keywords\n\n\t// no validation rules for CategoryId\n\n\t// no validation rules for BrandId\n\n\t// no validation rules for MinPrice\n\n\t// no validation rules for MaxPrice\n\n\t// no validation rules for IsHot\n\n\t// no validation rules for IsNew\n\n\t// no validation rules for IsTab\n\n\t// no validation rules for ClickNum\n\n\t// no validation rules for SoldNum\n\n\t// no validation rules for FavNum\n\n\t// no validation rules for Pages\n\n\t// no validation rules for PagePerNums\n\n\t// no validation rules for Id\n\n\tif len(errors) > 0 {\n\t\treturn GoodsFilterRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// GoodsFilterRequestMultiError is an error wrapping multiple validation errors\n// returned by GoodsFilterRequest.ValidateAll() if the designated constraints\n// aren't met.\ntype GoodsFilterRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m GoodsFilterRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m GoodsFilterRequestMultiError) AllErrors() []error { return m }\n\n// GoodsFilterRequestValidationError is the validation error returned by\n// GoodsFilterRequest.Validate if the designated constraints aren't met.\ntype GoodsFilterRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e GoodsFilterRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e GoodsFilterRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e GoodsFilterRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e GoodsFilterRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e GoodsFilterRequestValidationError) ErrorName() string {\n\treturn \"GoodsFilterRequestValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e GoodsFilterRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sGoodsFilterRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = GoodsFilterRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = GoodsFilterRequestValidationError{}\n\n// Validate checks the field values on CategoryInfoResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the first error encountered is returned, or nil if there are no violations.\nfunc (m *CategoryInfoResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CategoryInfoResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// CategoryInfoResponseMultiError, or nil if none found.\nfunc (m *CategoryInfoResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CategoryInfoResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for Name\n\n\t// no validation rules for ParentCategory\n\n\t// no validation rules for Level\n\n\t// no validation rules for IsTab\n\n\t// no validation rules for Sort\n\n\tif len(errors) > 0 {\n\t\treturn CategoryInfoResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CategoryInfoResponseMultiError is an error wrapping multiple validation\n// errors returned by CategoryInfoResponse.ValidateAll() if the designated\n// constraints aren't met.\ntype CategoryInfoResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CategoryInfoResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CategoryInfoResponseMultiError) AllErrors() []error { return m }\n\n// CategoryInfoResponseValidationError is the validation error returned by\n// CategoryInfoResponse.Validate if the designated constraints aren't met.\ntype CategoryInfoResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CategoryInfoResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CategoryInfoResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CategoryInfoResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CategoryInfoResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CategoryInfoResponseValidationError) ErrorName() string {\n\treturn \"CategoryInfoResponseValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e CategoryInfoResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCategoryInfoResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CategoryInfoResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CategoryInfoResponseValidationError{}\n\n// Validate checks the field values on CategoryListResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the first error encountered is returned, or nil if there are no violations.\nfunc (m *CategoryListResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CategoryListResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// CategoryListResponseMultiError, or nil if none found.\nfunc (m *CategoryListResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CategoryListResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for JsonData\n\n\tif len(errors) > 0 {\n\t\treturn CategoryListResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CategoryListResponseMultiError is an error wrapping multiple validation\n// errors returned by CategoryListResponse.ValidateAll() if the designated\n// constraints aren't met.\ntype CategoryListResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CategoryListResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CategoryListResponseMultiError) AllErrors() []error { return m }\n\n// CategoryListResponseValidationError is the validation error returned by\n// CategoryListResponse.Validate if the designated constraints aren't met.\ntype CategoryListResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CategoryListResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CategoryListResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CategoryListResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CategoryListResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CategoryListResponseValidationError) ErrorName() string {\n\treturn \"CategoryListResponseValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e CategoryListResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCategoryListResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CategoryListResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CategoryListResponseValidationError{}\n\n// Validate checks the field values on CategoryListRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the first error encountered is returned, or nil if there are no violations.\nfunc (m *CategoryListRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CategoryListRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// CategoryListRequestMultiError, or nil if none found.\nfunc (m *CategoryListRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CategoryListRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for Level\n\n\tif len(errors) > 0 {\n\t\treturn CategoryListRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CategoryListRequestMultiError is an error wrapping multiple validation\n// errors returned by CategoryListRequest.ValidateAll() if the designated\n// constraints aren't met.\ntype CategoryListRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CategoryListRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CategoryListRequestMultiError) AllErrors() []error { return m }\n\n// CategoryListRequestValidationError is the validation error returned by\n// CategoryListRequest.Validate if the designated constraints aren't met.\ntype CategoryListRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CategoryListRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CategoryListRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CategoryListRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CategoryListRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CategoryListRequestValidationError) ErrorName() string {\n\treturn \"CategoryListRequestValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e CategoryListRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCategoryListRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CategoryListRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CategoryListRequestValidationError{}\n\n// Validate checks the field values on SubCategoryListResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the first error encountered is returned, or nil if there are no violations.\nfunc (m *SubCategoryListResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on SubCategoryListResponse with the\n// rules defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// SubCategoryListResponseMultiError, or nil if none found.\nfunc (m *SubCategoryListResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *SubCategoryListResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\tif all {\n\t\tswitch v := interface{}(m.GetInfo()).(type) {\n\t\tcase interface{ ValidateAll() error }:\n\t\t\tif err := v.ValidateAll(); err != nil {\n\t\t\t\terrors = append(errors, SubCategoryListResponseValidationError{\n\t\t\t\t\tfield:  \"Info\",\n\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\tcause:  err,\n\t\t\t\t})\n\t\t\t}\n\t\tcase interface{ Validate() error }:\n\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\terrors = append(errors, SubCategoryListResponseValidationError{\n\t\t\t\t\tfield:  \"Info\",\n\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\tcause:  err,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t} else if v, ok := interface{}(m.GetInfo()).(interface{ Validate() error }); ok {\n\t\tif err := v.Validate(); err != nil {\n\t\t\treturn SubCategoryListResponseValidationError{\n\t\t\t\tfield:  \"Info\",\n\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\tcause:  err,\n\t\t\t}\n\t\t}\n\t}\n\n\tfor idx, item := range m.GetSubCategory() {\n\t\t_, _ = idx, item\n\n\t\tif all {\n\t\t\tswitch v := interface{}(item).(type) {\n\t\t\tcase interface{ ValidateAll() error }:\n\t\t\t\tif err := v.ValidateAll(); err != nil {\n\t\t\t\t\terrors = append(errors, SubCategoryListResponseValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"SubCategory[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\tcase interface{ Validate() error }:\n\t\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\t\terrors = append(errors, SubCategoryListResponseValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"SubCategory[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t} else if v, ok := interface{}(item).(interface{ Validate() error }); ok {\n\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\treturn SubCategoryListResponseValidationError{\n\t\t\t\t\tfield:  fmt.Sprintf(\"SubCategory[%v]\", idx),\n\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\tcause:  err,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn SubCategoryListResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// SubCategoryListResponseMultiError is an error wrapping multiple validation\n// errors returned by SubCategoryListResponse.ValidateAll() if the designated\n// constraints aren't met.\ntype SubCategoryListResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m SubCategoryListResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m SubCategoryListResponseMultiError) AllErrors() []error { return m }\n\n// SubCategoryListResponseValidationError is the validation error returned by\n// SubCategoryListResponse.Validate if the designated constraints aren't met.\ntype SubCategoryListResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e SubCategoryListResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e SubCategoryListResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e SubCategoryListResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e SubCategoryListResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e SubCategoryListResponseValidationError) ErrorName() string {\n\treturn \"SubCategoryListResponseValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e SubCategoryListResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sSubCategoryListResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = SubCategoryListResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = SubCategoryListResponseValidationError{}\n\n// Validate checks the field values on CategoryInfoRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the first error encountered is returned, or nil if there are no violations.\nfunc (m *CategoryInfoRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CategoryInfoRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// CategoryInfoRequestMultiError, or nil if none found.\nfunc (m *CategoryInfoRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CategoryInfoRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for Name\n\n\t// no validation rules for ParentCategory\n\n\t// no validation rules for Level\n\n\t// no validation rules for IsTab\n\n\t// no validation rules for Sort\n\n\tif len(errors) > 0 {\n\t\treturn CategoryInfoRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CategoryInfoRequestMultiError is an error wrapping multiple validation\n// errors returned by CategoryInfoRequest.ValidateAll() if the designated\n// constraints aren't met.\ntype CategoryInfoRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CategoryInfoRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CategoryInfoRequestMultiError) AllErrors() []error { return m }\n\n// CategoryInfoRequestValidationError is the validation error returned by\n// CategoryInfoRequest.Validate if the designated constraints aren't met.\ntype CategoryInfoRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CategoryInfoRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CategoryInfoRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CategoryInfoRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CategoryInfoRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CategoryInfoRequestValidationError) ErrorName() string {\n\treturn \"CategoryInfoRequestValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e CategoryInfoRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCategoryInfoRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CategoryInfoRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CategoryInfoRequestValidationError{}\n\n// Validate checks the field values on BatchCategoryInfoRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the first error encountered is returned, or nil if there are no violations.\nfunc (m *BatchCategoryInfoRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on BatchCategoryInfoRequest with the\n// rules defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// BatchCategoryInfoRequestMultiError, or nil if none found.\nfunc (m *BatchCategoryInfoRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *BatchCategoryInfoRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for GoodsNums\n\n\t// no validation rules for BrandNums\n\n\tif len(errors) > 0 {\n\t\treturn BatchCategoryInfoRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// BatchCategoryInfoRequestMultiError is an error wrapping multiple validation\n// errors returned by BatchCategoryInfoRequest.ValidateAll() if the designated\n// constraints aren't met.\ntype BatchCategoryInfoRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m BatchCategoryInfoRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m BatchCategoryInfoRequestMultiError) AllErrors() []error { return m }\n\n// BatchCategoryInfoRequestValidationError is the validation error returned by\n// BatchCategoryInfoRequest.Validate if the designated constraints aren't met.\ntype BatchCategoryInfoRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e BatchCategoryInfoRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e BatchCategoryInfoRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e BatchCategoryInfoRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e BatchCategoryInfoRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e BatchCategoryInfoRequestValidationError) ErrorName() string {\n\treturn \"BatchCategoryInfoRequestValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e BatchCategoryInfoRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sBatchCategoryInfoRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = BatchCategoryInfoRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = BatchCategoryInfoRequestValidationError{}\n\n// Validate checks the field values on DeleteCategoryRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the first error encountered is returned, or nil if there are no violations.\nfunc (m *DeleteCategoryRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on DeleteCategoryRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// DeleteCategoryRequestMultiError, or nil if none found.\nfunc (m *DeleteCategoryRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *DeleteCategoryRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\tif len(errors) > 0 {\n\t\treturn DeleteCategoryRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// DeleteCategoryRequestMultiError is an error wrapping multiple validation\n// errors returned by DeleteCategoryRequest.ValidateAll() if the designated\n// constraints aren't met.\ntype DeleteCategoryRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m DeleteCategoryRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m DeleteCategoryRequestMultiError) AllErrors() []error { return m }\n\n// DeleteCategoryRequestValidationError is the validation error returned by\n// DeleteCategoryRequest.Validate if the designated constraints aren't met.\ntype DeleteCategoryRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e DeleteCategoryRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e DeleteCategoryRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e DeleteCategoryRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e DeleteCategoryRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e DeleteCategoryRequestValidationError) ErrorName() string {\n\treturn \"DeleteCategoryRequestValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e DeleteCategoryRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sDeleteCategoryRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = DeleteCategoryRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = DeleteCategoryRequestValidationError{}\n\n// Validate checks the field values on BrandListRequest with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *BrandListRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on BrandListRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// BrandListRequestMultiError, or nil if none found.\nfunc (m *BrandListRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *BrandListRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Pages\n\n\t// no validation rules for PagePerNums\n\n\tif len(errors) > 0 {\n\t\treturn BrandListRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// BrandListRequestMultiError is an error wrapping multiple validation errors\n// returned by BrandListRequest.ValidateAll() if the designated constraints\n// aren't met.\ntype BrandListRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m BrandListRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m BrandListRequestMultiError) AllErrors() []error { return m }\n\n// BrandListRequestValidationError is the validation error returned by\n// BrandListRequest.Validate if the designated constraints aren't met.\ntype BrandListRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e BrandListRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e BrandListRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e BrandListRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e BrandListRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e BrandListRequestValidationError) ErrorName() string { return \"BrandListRequestValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e BrandListRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sBrandListRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = BrandListRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = BrandListRequestValidationError{}\n\n// Validate checks the field values on BrandRequest with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *BrandRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on BrandRequest with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in BrandRequestMultiError, or\n// nil if none found.\nfunc (m *BrandRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *BrandRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for Name\n\n\t// no validation rules for Logo\n\n\t// no validation rules for Desc\n\n\t// no validation rules for IsTab\n\n\t// no validation rules for Sort\n\n\tif len(errors) > 0 {\n\t\treturn BrandRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// BrandRequestMultiError is an error wrapping multiple validation errors\n// returned by BrandRequest.ValidateAll() if the designated constraints aren't met.\ntype BrandRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m BrandRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m BrandRequestMultiError) AllErrors() []error { return m }\n\n// BrandRequestValidationError is the validation error returned by\n// BrandRequest.Validate if the designated constraints aren't met.\ntype BrandRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e BrandRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e BrandRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e BrandRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e BrandRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e BrandRequestValidationError) ErrorName() string { return \"BrandRequestValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e BrandRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sBrandRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = BrandRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = BrandRequestValidationError{}\n\n// Validate checks the field values on BrandInfoResponse with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *BrandInfoResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on BrandInfoResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// BrandInfoResponseMultiError, or nil if none found.\nfunc (m *BrandInfoResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *BrandInfoResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for Name\n\n\t// no validation rules for Logo\n\n\t// no validation rules for Desc\n\n\t// no validation rules for IsTab\n\n\t// no validation rules for Sort\n\n\tif len(errors) > 0 {\n\t\treturn BrandInfoResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// BrandInfoResponseMultiError is an error wrapping multiple validation errors\n// returned by BrandInfoResponse.ValidateAll() if the designated constraints\n// aren't met.\ntype BrandInfoResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m BrandInfoResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m BrandInfoResponseMultiError) AllErrors() []error { return m }\n\n// BrandInfoResponseValidationError is the validation error returned by\n// BrandInfoResponse.Validate if the designated constraints aren't met.\ntype BrandInfoResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e BrandInfoResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e BrandInfoResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e BrandInfoResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e BrandInfoResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e BrandInfoResponseValidationError) ErrorName() string {\n\treturn \"BrandInfoResponseValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e BrandInfoResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sBrandInfoResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = BrandInfoResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = BrandInfoResponseValidationError{}\n\n// Validate checks the field values on BrandListResponse with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *BrandListResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on BrandListResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// BrandListResponseMultiError, or nil if none found.\nfunc (m *BrandListResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *BrandListResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Total\n\n\tfor idx, item := range m.GetData() {\n\t\t_, _ = idx, item\n\n\t\tif all {\n\t\t\tswitch v := interface{}(item).(type) {\n\t\t\tcase interface{ ValidateAll() error }:\n\t\t\t\tif err := v.ValidateAll(); err != nil {\n\t\t\t\t\terrors = append(errors, BrandListResponseValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"Data[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\tcase interface{ Validate() error }:\n\t\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\t\terrors = append(errors, BrandListResponseValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"Data[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t} else if v, ok := interface{}(item).(interface{ Validate() error }); ok {\n\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\treturn BrandListResponseValidationError{\n\t\t\t\t\tfield:  fmt.Sprintf(\"Data[%v]\", idx),\n\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\tcause:  err,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn BrandListResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// BrandListResponseMultiError is an error wrapping multiple validation errors\n// returned by BrandListResponse.ValidateAll() if the designated constraints\n// aren't met.\ntype BrandListResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m BrandListResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m BrandListResponseMultiError) AllErrors() []error { return m }\n\n// BrandListResponseValidationError is the validation error returned by\n// BrandListResponse.Validate if the designated constraints aren't met.\ntype BrandListResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e BrandListResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e BrandListResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e BrandListResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e BrandListResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e BrandListResponseValidationError) ErrorName() string {\n\treturn \"BrandListResponseValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e BrandListResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sBrandListResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = BrandListResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = BrandListResponseValidationError{}\n\n// Validate checks the field values on CreateGoodsRequestGoodsSku with the\n// rules defined in the proto definition for this message. If any rules are\n// violated, the first error encountered is returned, or nil if there are no violations.\nfunc (m *CreateGoodsRequestGoodsSku) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CreateGoodsRequestGoodsSku with the\n// rules defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// CreateGoodsRequestGoodsSkuMultiError, or nil if none found.\nfunc (m *CreateGoodsRequestGoodsSku) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CreateGoodsRequestGoodsSku) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for GoodsId\n\n\tif utf8.RuneCountInString(m.GetSkuName()) < 1 {\n\t\terr := CreateGoodsRequestGoodsSkuValidationError{\n\t\t\tfield:  \"SkuName\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetCode()) < 1 {\n\t\terr := CreateGoodsRequestGoodsSkuValidationError{\n\t\t\tfield:  \"Code\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetBarCode()) < 1 {\n\t\terr := CreateGoodsRequestGoodsSkuValidationError{\n\t\t\tfield:  \"BarCode\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\t// no validation rules for Price\n\n\t// no validation rules for PromotionPrice\n\n\t// no validation rules for Points\n\n\t// no validation rules for Image\n\n\t// no validation rules for Sort\n\n\t// no validation rules for Inventory\n\n\tfor idx, item := range m.GetSpecificationInfo() {\n\t\t_, _ = idx, item\n\n\t\tif all {\n\t\t\tswitch v := interface{}(item).(type) {\n\t\t\tcase interface{ ValidateAll() error }:\n\t\t\t\tif err := v.ValidateAll(); err != nil {\n\t\t\t\t\terrors = append(errors, CreateGoodsRequestGoodsSkuValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"SpecificationInfo[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\tcase interface{ Validate() error }:\n\t\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\t\terrors = append(errors, CreateGoodsRequestGoodsSkuValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"SpecificationInfo[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t} else if v, ok := interface{}(item).(interface{ Validate() error }); ok {\n\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\treturn CreateGoodsRequestGoodsSkuValidationError{\n\t\t\t\t\tfield:  fmt.Sprintf(\"SpecificationInfo[%v]\", idx),\n\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\tcause:  err,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\tfor idx, item := range m.GetGroupAttrInfo() {\n\t\t_, _ = idx, item\n\n\t\tif all {\n\t\t\tswitch v := interface{}(item).(type) {\n\t\t\tcase interface{ ValidateAll() error }:\n\t\t\t\tif err := v.ValidateAll(); err != nil {\n\t\t\t\t\terrors = append(errors, CreateGoodsRequestGoodsSkuValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"GroupAttrInfo[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\tcase interface{ Validate() error }:\n\t\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\t\terrors = append(errors, CreateGoodsRequestGoodsSkuValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"GroupAttrInfo[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t} else if v, ok := interface{}(item).(interface{ Validate() error }); ok {\n\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\treturn CreateGoodsRequestGoodsSkuValidationError{\n\t\t\t\t\tfield:  fmt.Sprintf(\"GroupAttrInfo[%v]\", idx),\n\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\tcause:  err,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn CreateGoodsRequestGoodsSkuMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CreateGoodsRequestGoodsSkuMultiError is an error wrapping multiple\n// validation errors returned by CreateGoodsRequestGoodsSku.ValidateAll() if\n// the designated constraints aren't met.\ntype CreateGoodsRequestGoodsSkuMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CreateGoodsRequestGoodsSkuMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CreateGoodsRequestGoodsSkuMultiError) AllErrors() []error { return m }\n\n// CreateGoodsRequestGoodsSkuValidationError is the validation error returned\n// by CreateGoodsRequestGoodsSku.Validate if the designated constraints aren't met.\ntype CreateGoodsRequestGoodsSkuValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CreateGoodsRequestGoodsSkuValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CreateGoodsRequestGoodsSkuValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CreateGoodsRequestGoodsSkuValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CreateGoodsRequestGoodsSkuValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CreateGoodsRequestGoodsSkuValidationError) ErrorName() string {\n\treturn \"CreateGoodsRequestGoodsSkuValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e CreateGoodsRequestGoodsSkuValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCreateGoodsRequestGoodsSku.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CreateGoodsRequestGoodsSkuValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CreateGoodsRequestGoodsSkuValidationError{}\n\n// Validate checks the field values on CreateGoodsRequestGoodsSkuSpecification\n// with the rules defined in the proto definition for this message. If any\n// rules are violated, the first error encountered is returned, or nil if\n// there are no violations.\nfunc (m *CreateGoodsRequestGoodsSkuSpecification) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on\n// CreateGoodsRequestGoodsSkuSpecification with the rules defined in the proto\n// definition for this message. If any rules are violated, the result is a\n// list of violation errors wrapped in\n// CreateGoodsRequestGoodsSkuSpecificationMultiError, or nil if none found.\nfunc (m *CreateGoodsRequestGoodsSkuSpecification) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CreateGoodsRequestGoodsSkuSpecification) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\tif m.GetSId() < 1 {\n\t\terr := CreateGoodsRequestGoodsSkuSpecificationValidationError{\n\t\t\tfield:  \"SId\",\n\t\t\treason: \"value must be greater than or equal to 1\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif m.GetVId() < 1 {\n\t\terr := CreateGoodsRequestGoodsSkuSpecificationValidationError{\n\t\t\tfield:  \"VId\",\n\t\t\treason: \"value must be greater than or equal to 1\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn CreateGoodsRequestGoodsSkuSpecificationMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CreateGoodsRequestGoodsSkuSpecificationMultiError is an error wrapping\n// multiple validation errors returned by\n// CreateGoodsRequestGoodsSkuSpecification.ValidateAll() if the designated\n// constraints aren't met.\ntype CreateGoodsRequestGoodsSkuSpecificationMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CreateGoodsRequestGoodsSkuSpecificationMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CreateGoodsRequestGoodsSkuSpecificationMultiError) AllErrors() []error { return m }\n\n// CreateGoodsRequestGoodsSkuSpecificationValidationError is the validation\n// error returned by CreateGoodsRequestGoodsSkuSpecification.Validate if the\n// designated constraints aren't met.\ntype CreateGoodsRequestGoodsSkuSpecificationValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CreateGoodsRequestGoodsSkuSpecificationValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CreateGoodsRequestGoodsSkuSpecificationValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CreateGoodsRequestGoodsSkuSpecificationValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CreateGoodsRequestGoodsSkuSpecificationValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CreateGoodsRequestGoodsSkuSpecificationValidationError) ErrorName() string {\n\treturn \"CreateGoodsRequestGoodsSkuSpecificationValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e CreateGoodsRequestGoodsSkuSpecificationValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCreateGoodsRequestGoodsSkuSpecification.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CreateGoodsRequestGoodsSkuSpecificationValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CreateGoodsRequestGoodsSkuSpecificationValidationError{}\n\n// Validate checks the field values on CreateGoodsRequestGoodsSkuGroupAttr with\n// the rules defined in the proto definition for this message. If any rules\n// are violated, the first error encountered is returned, or nil if there are\n// no violations.\nfunc (m *CreateGoodsRequestGoodsSkuGroupAttr) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CreateGoodsRequestGoodsSkuGroupAttr\n// with the rules defined in the proto definition for this message. If any\n// rules are violated, the result is a list of violation errors wrapped in\n// CreateGoodsRequestGoodsSkuGroupAttrMultiError, or nil if none found.\nfunc (m *CreateGoodsRequestGoodsSkuGroupAttr) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CreateGoodsRequestGoodsSkuGroupAttr) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for GroupId\n\n\t// no validation rules for GroupName\n\n\tfor idx, item := range m.GetAttrInfo() {\n\t\t_, _ = idx, item\n\n\t\tif all {\n\t\t\tswitch v := interface{}(item).(type) {\n\t\t\tcase interface{ ValidateAll() error }:\n\t\t\t\tif err := v.ValidateAll(); err != nil {\n\t\t\t\t\terrors = append(errors, CreateGoodsRequestGoodsSkuGroupAttrValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"AttrInfo[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\tcase interface{ Validate() error }:\n\t\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\t\terrors = append(errors, CreateGoodsRequestGoodsSkuGroupAttrValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"AttrInfo[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t} else if v, ok := interface{}(item).(interface{ Validate() error }); ok {\n\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\treturn CreateGoodsRequestGoodsSkuGroupAttrValidationError{\n\t\t\t\t\tfield:  fmt.Sprintf(\"AttrInfo[%v]\", idx),\n\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\tcause:  err,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn CreateGoodsRequestGoodsSkuGroupAttrMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CreateGoodsRequestGoodsSkuGroupAttrMultiError is an error wrapping multiple\n// validation errors returned by\n// CreateGoodsRequestGoodsSkuGroupAttr.ValidateAll() if the designated\n// constraints aren't met.\ntype CreateGoodsRequestGoodsSkuGroupAttrMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CreateGoodsRequestGoodsSkuGroupAttrMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CreateGoodsRequestGoodsSkuGroupAttrMultiError) AllErrors() []error { return m }\n\n// CreateGoodsRequestGoodsSkuGroupAttrValidationError is the validation error\n// returned by CreateGoodsRequestGoodsSkuGroupAttr.Validate if the designated\n// constraints aren't met.\ntype CreateGoodsRequestGoodsSkuGroupAttrValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CreateGoodsRequestGoodsSkuGroupAttrValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CreateGoodsRequestGoodsSkuGroupAttrValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CreateGoodsRequestGoodsSkuGroupAttrValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CreateGoodsRequestGoodsSkuGroupAttrValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CreateGoodsRequestGoodsSkuGroupAttrValidationError) ErrorName() string {\n\treturn \"CreateGoodsRequestGoodsSkuGroupAttrValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e CreateGoodsRequestGoodsSkuGroupAttrValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCreateGoodsRequestGoodsSkuGroupAttr.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CreateGoodsRequestGoodsSkuGroupAttrValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CreateGoodsRequestGoodsSkuGroupAttrValidationError{}\n\n// Validate checks the field values on CreateGoodsRequestGoodsSkuGroupAttrAttr\n// with the rules defined in the proto definition for this message. If any\n// rules are violated, the first error encountered is returned, or nil if\n// there are no violations.\nfunc (m *CreateGoodsRequestGoodsSkuGroupAttrAttr) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on\n// CreateGoodsRequestGoodsSkuGroupAttrAttr with the rules defined in the proto\n// definition for this message. If any rules are violated, the result is a\n// list of violation errors wrapped in\n// CreateGoodsRequestGoodsSkuGroupAttrAttrMultiError, or nil if none found.\nfunc (m *CreateGoodsRequestGoodsSkuGroupAttrAttr) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CreateGoodsRequestGoodsSkuGroupAttrAttr) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\tif m.GetAttrId() < 1 {\n\t\terr := CreateGoodsRequestGoodsSkuGroupAttrAttrValidationError{\n\t\t\tfield:  \"AttrId\",\n\t\t\treason: \"value must be greater than or equal to 1\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetAttrName()) < 1 {\n\t\terr := CreateGoodsRequestGoodsSkuGroupAttrAttrValidationError{\n\t\t\tfield:  \"AttrName\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif m.GetAttrValueId() < 1 {\n\t\terr := CreateGoodsRequestGoodsSkuGroupAttrAttrValidationError{\n\t\t\tfield:  \"AttrValueId\",\n\t\t\treason: \"value must be greater than or equal to 1\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetAttrValueName()) < 1 {\n\t\terr := CreateGoodsRequestGoodsSkuGroupAttrAttrValidationError{\n\t\t\tfield:  \"AttrValueName\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn CreateGoodsRequestGoodsSkuGroupAttrAttrMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CreateGoodsRequestGoodsSkuGroupAttrAttrMultiError is an error wrapping\n// multiple validation errors returned by\n// CreateGoodsRequestGoodsSkuGroupAttrAttr.ValidateAll() if the designated\n// constraints aren't met.\ntype CreateGoodsRequestGoodsSkuGroupAttrAttrMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CreateGoodsRequestGoodsSkuGroupAttrAttrMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CreateGoodsRequestGoodsSkuGroupAttrAttrMultiError) AllErrors() []error { return m }\n\n// CreateGoodsRequestGoodsSkuGroupAttrAttrValidationError is the validation\n// error returned by CreateGoodsRequestGoodsSkuGroupAttrAttr.Validate if the\n// designated constraints aren't met.\ntype CreateGoodsRequestGoodsSkuGroupAttrAttrValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CreateGoodsRequestGoodsSkuGroupAttrAttrValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CreateGoodsRequestGoodsSkuGroupAttrAttrValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CreateGoodsRequestGoodsSkuGroupAttrAttrValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CreateGoodsRequestGoodsSkuGroupAttrAttrValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CreateGoodsRequestGoodsSkuGroupAttrAttrValidationError) ErrorName() string {\n\treturn \"CreateGoodsRequestGoodsSkuGroupAttrAttrValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e CreateGoodsRequestGoodsSkuGroupAttrAttrValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCreateGoodsRequestGoodsSkuGroupAttrAttr.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CreateGoodsRequestGoodsSkuGroupAttrAttrValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CreateGoodsRequestGoodsSkuGroupAttrAttrValidationError{}\n"
  },
  {
    "path": "service/goods/api/goods/v1/goods.proto",
    "content": "syntax = \"proto3\";\n\npackage goods.v1;\n\nimport \"google/protobuf/empty.proto\";\nimport \"validate/validate.proto\";\n\noption go_package = \"goods/api/goods/v1;v1\";\n\nservice Goods {\n  // 商品分类\n  rpc GetAllCategoryList(google.protobuf.Empty) returns(CategoryListResponse); // 获取所有的分类\n  rpc GetSubCategory(CategoryListRequest) returns(SubCategoryListResponse);// 获取子分类\n  rpc CreateCategory(CategoryInfoRequest) returns(CategoryInfoResponse); // 新建分类信息\n  rpc DeleteCategory(DeleteCategoryRequest) returns(google.protobuf.Empty); // 删除分类\n  rpc UpdateCategory(CategoryInfoRequest) returns(google.protobuf.Empty); // 修改分类信息\n\n  // 商品品牌\n  rpc BrandList(BrandListRequest) returns(BrandListResponse);\n  rpc CreateBrand(BrandRequest) returns(BrandInfoResponse);\n  rpc DeleteBrand(BrandRequest) returns(google.protobuf.Empty);\n  rpc UpdateBrand(BrandRequest) returns(google.protobuf.Empty);\n\n  // 商品类型 goods_property_names\n  // 商品类型不同于商品分类，指的是依据某一类商品的相同属性归纳成的属性集合 // 手机类型都有屏幕尺寸、网络制式等共同的属性\n  rpc CreateGoodsType(GoodsTypeRequest) returns(GoodsTypeResponse); // 商品类型基本信息创建\n\n  // 创建商品规格 也就是 手机的颜色、内存版本、购买方式之类的\n  // 商品规格的值，比如手机颜色对应的有 红、白、黑，内存，128g、256g, 也一起创建了\n  rpc CreateGoodsSpecification(SpecificationRequest) returns(SpecificationResponse); // 商品规格或属性的信息\n\n  // 商品参数属性 ,手机:主体,屏幕, 操作系统,网络支持之类的\n  rpc CreateAttrGroup(AttrGroupRequest) returns(AttrGroupResponse);\n\n  // 商品参数属性组下的一些信息 ,主体:上市年份 产品名称 ,网络支持 5G网络,双卡双待类型,\n  rpc CreateAttrValue(AttrRequest) returns(AttrResponse);\n\n  // 商品接口\n  rpc CreateGoods(CreateGoodsRequest) returns (CreateGoodsResponse);\n  rpc UpdateGoods(CreateGoodsRequest) returns (google.protobuf.Empty);\n  rpc GoodsList(GoodsFilterRequest) returns(GoodsListResponse);\n  //  rpc GetGoodsDetail(GoodInfoRequest) returns(GoodsInfoResponse);\n  //  rpc BatchGetGoods(BatchGoodsIdInfo) returns(GoodsListResponse); // 现在用户提交订单有多个商品，你得批量查询商品的信息吧\n  //  rpc DeleteGoods(DeleteGoodsInfo) returns (google.protobuf.Empty);\n\n  // Sku\n  rpc SkuList(SkuListRequest) returns(SkuListResponse);\n}\n\nmessage AttrValueRequest {\n  int64 id = 1;\n  int64 attrId = 2;\n  int64 groupId = 3 [(validate.rules).int64.gte = 1];\n  string value = 4 [(validate.rules).string.min_len = 3];\n}\n\nmessage AttrRequest {\n  int64 id = 1;\n  int64 typeId = 2 [(validate.rules).int64.gte = 1];\n  int64 groupId = 3 [(validate.rules).int64.gte = 1];\n  string title = 4 [(validate.rules).string = {min_len: 1}];\n  string  desc = 5;\n  bool status = 6;\n  int32 sort = 7 [(validate.rules).int32.gte = 1];\n  repeated AttrValueRequest attrValue = 8;\n}\n\nmessage AttrValueResponse {\n  int64 id = 1;\n  int64 attrId = 2;\n  int64 groupId = 3;\n  string value = 4;\n}\n\nmessage AttrResponse {\n  int64 id = 1;\n  int64 typeId = 2;\n  int64 groupId = 3;\n  string title = 4;\n  string  desc = 5;\n  bool status = 6;\n  int32 sort = 7;\n  repeated AttrValueResponse attrValue = 8;\n}\n\nmessage AttrGroupRequest {\n  int64 id = 1;\n  int64 typeId = 2 [(validate.rules).int64.gte = 1];\n  string title = 3 [(validate.rules).string.min_len = 3];\n  string  desc = 4;\n  bool status = 5;\n  int32 sort = 6 [(validate.rules).int32.gte = 1];\n}\nmessage AttrGroupResponse {\n  int64 id = 1;\n  int64 typeId = 2;\n  string title = 3;\n  string  desc = 4;\n  bool status = 5;\n  int32 sort = 6;\n}\n\nmessage SpecificationValue {\n  int64 id = 1;\n  int64 attrId = 2;\n  string value = 3 [(validate.rules).string.min_len = 3];\n  int32 sort = 4 [(validate.rules).int32.gte = 1];\n}\n\nmessage SpecificationValueResponse {\n  int64 id = 1;\n  int64 attrId = 2;\n  string value = 3 ;\n  int32 sort = 4;\n}\n\nmessage SpecificationRequest {\n  int64 id = 1;\n  int64 typeId = 2 [(validate.rules).int64.gte = 1];\n  string name = 3 [(validate.rules).string.min_len = 2];\n  int32 sort = 4 [(validate.rules).int32.gte = 1];\n  bool status = 5;\n  bool isSku = 6;\n  bool isSelect = 7;\n  repeated SpecificationValue specificationValue = 8;\n}\n\nmessage SpecificationResponse {\n  int64 id = 1;\n}\nmessage GoodsTypeRequest {\n  int64 id = 1;\n  string name = 2  [(validate.rules).string.min_len = 3];\n  string typeCode = 3 [(validate.rules).string.min_len = 3];\n  string nameAlias = 4;\n  bool isVirtual = 5;\n  string desc = 6;\n  int32 sort = 7;\n  string brandIds = 8 [(validate.rules).string.min_len = 1];\n}\nmessage GoodsTypeResponse {\n  int64 id = 1;\n}\n\nmessage CreateGoodsRequest {\n  int64 id = 1;\n  int32 categoryId = 2 [(validate.rules).int32.gte = 1];\n  int32 brandId = 3 [(validate.rules).int32.gte = 1];\n  int64 typeId = 4 [(validate.rules).int64.gte = 1];\n  string name = 5;\n  string nameAlias = 6;\n  string goodsTags = 7;\n  string goodsSn = 8;\n  int64 shopPrice = 9;\n  int64 marketPrice = 10;\n  int64 inventory = 11;\n  string goodsBrief = 12;\n  string goodsFrontImage = 13;\n  repeated string goodsImages = 14;\n  bool shipFree = 15;\n  int32 shipId = 16;\n  bool isNew = 17;\n  bool isHot = 18;\n  bool onSale = 19;\n  // 根据商品类型 选择商品规格信息并选择\n  // 商品 sku 属性值 里面有规格的ID和属性的ID，分别是几组信息\n  message goodsSku {\n    int64 id = 1;\n    int64 goodsId = 2;\n    string skuName = 3 [(validate.rules).string.min_len = 1];\n    string code = 4 [(validate.rules).string.min_len = 1];\n    string barCode = 5 [(validate.rules).string.min_len = 1];\n    int64 price = 6;\n    int64 promotionPrice = 7;\n    int64 points = 8;\n    string image = 9;\n    int32 sort = 10;\n    int64 inventory = 11; // sku 库存\n    // 规格\n    message specification {\n      int64 sId = 1 [(validate.rules).int64.gte = 1];\n      int64 vId = 2 [(validate.rules).int64.gte = 1];\n    }\n    repeated specification specificationInfo = 12;\n    // 属性组\n    message groupAttr {\n      int64 groupId = 1;\n      string groupName = 2;\n      message attr {\n        int64 attrId = 1 [(validate.rules).int64.gte = 1];\n        string attrName = 2 [(validate.rules).string.min_len = 1];\n        int64 attrValueId = 3 [(validate.rules).int64.gte = 1];\n        string attrValueName = 4 [(validate.rules).string.min_len = 1];\n      }\n      repeated attr attrInfo = 3;\n    }\n    repeated groupAttr groupAttrInfo = 13;\n  }\n  repeated goodsSku sku = 20;\n}\nmessage CreateGoodsResponse {\n  int64 ID = 1;\n}\n\nmessage GoodsInfoResponse {\n  int64 id = 1;\n  int32 categoryId = 2;\n  int32 brandId = 3;\n  string name = 4;\n  string goodsSn = 5;\n  int64 clickNum = 6;\n  int64 soldNum = 7;\n  int64 favNum = 8;\n  int64 marketPrice = 9;\n  string goodsBrief = 10;\n  string goodsDesc = 11;\n  bool shipFree = 12;\n  string images = 13;\n  repeated string goodsImages = 14;\n  bool isNew = 15;\n  bool isHot = 16;\n  bool onSale = 17;\n}\n\nmessage GoodsListResponse {\n  int64 total = 1;\n  repeated GoodsInfoResponse list = 2;\n}\n\nmessage GoodsFilterRequest  {\n  string keywords = 1;\n  int32 categoryId = 2;\n  int32 brandId = 3;\n  int64 minPrice = 4;\n  int64 maxPrice = 5;\n  bool  isHot = 6;\n  bool  isNew = 7;\n  bool  isTab = 8;\n  int64 clickNum = 9;\n  int64 soldNum = 10;\n  int64 favNum = 11;\n  int64 pages = 12;\n  int64 pagePerNums = 13;\n  int64 id = 14;\n}\n\n// 商品分类\nmessage CategoryInfoResponse {\n  int32 id = 1;\n  string name = 2;\n  int32 parentCategory = 3;\n  int32 level = 4;\n  bool isTab = 5;\n  int32 sort = 6;\n}\n\nmessage CategoryListResponse {\n  string jsonData = 1;\n}\nmessage CategoryListRequest {\n  int32 id = 1;\n  int32 level = 2;\n}\nmessage SubCategoryListResponse {\n  CategoryInfoResponse info = 1;\n  repeated CategoryInfoResponse subCategory = 2;\n}\nmessage CategoryInfoRequest {\n  int32 id = 1;\n  string name = 2;\n  int32 parentCategory = 3;\n  int32 level = 4;\n  bool isTab = 5;\n  int32 sort = 6;\n}\nmessage BatchCategoryInfoRequest {\n  repeated int32 id = 1;\n  int32 goodsNums = 2;\n  int32 brandNums = 3;\n}\n\nmessage DeleteCategoryRequest {\n  int32 id = 1;\n}\n\nmessage BrandListRequest {\n  int32 pages = 1;\n  int32 pagePerNums = 2;\n}\n\nmessage BrandRequest {\n  int32 id = 1;\n  string name = 2;\n  string logo = 3;\n  string desc = 4;\n  bool isTab = 5;\n  int32 sort = 6;\n}\n\nmessage BrandInfoResponse {\n  int32 id = 1;\n  string name = 2;\n  string logo = 3;\n  string desc = 4;\n  bool isTab = 5;\n  int32 sort = 6;\n}\n\nmessage BrandListResponse {\n  int32 total = 1;\n  repeated BrandInfoResponse data = 2;\n}\n\n\nmessage SkuListRequest{\n  repeated int64 id = 1;\n}\n\nmessage SkuListResponse {\n\n}"
  },
  {
    "path": "service/goods/api/goods/v1/goods_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.2.0\n// - protoc             v3.19.4\n// source: api/goods/v1/goods.proto\n\npackage v1\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n\temptypb \"google.golang.org/protobuf/types/known/emptypb\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\n// GoodsClient is the client API for Goods service.\n//\n// 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.\ntype GoodsClient interface {\n\t// 商品分类\n\tGetAllCategoryList(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*CategoryListResponse, error)\n\tGetSubCategory(ctx context.Context, in *CategoryListRequest, opts ...grpc.CallOption) (*SubCategoryListResponse, error)\n\tCreateCategory(ctx context.Context, in *CategoryInfoRequest, opts ...grpc.CallOption) (*CategoryInfoResponse, error)\n\tDeleteCategory(ctx context.Context, in *DeleteCategoryRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)\n\tUpdateCategory(ctx context.Context, in *CategoryInfoRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)\n\t// 商品品牌\n\tBrandList(ctx context.Context, in *BrandListRequest, opts ...grpc.CallOption) (*BrandListResponse, error)\n\tCreateBrand(ctx context.Context, in *BrandRequest, opts ...grpc.CallOption) (*BrandInfoResponse, error)\n\tDeleteBrand(ctx context.Context, in *BrandRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)\n\tUpdateBrand(ctx context.Context, in *BrandRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)\n\t// 商品类型 goods_property_names\n\t// 商品类型不同于商品分类，指的是依据某一类商品的相同属性归纳成的属性集合 // 手机类型都有屏幕尺寸、网络制式等共同的属性\n\tCreateGoodsType(ctx context.Context, in *GoodsTypeRequest, opts ...grpc.CallOption) (*GoodsTypeResponse, error)\n\t// 创建商品规格 也就是 手机的颜色、内存版本、购买方式之类的\n\t// 商品规格的值，比如手机颜色对应的有 红、白、黑，内存，128g、256g, 也一起创建了\n\tCreateGoodsSpecification(ctx context.Context, in *SpecificationRequest, opts ...grpc.CallOption) (*SpecificationResponse, error)\n\t// 商品参数属性 ,手机:主体,屏幕, 操作系统,网络支持之类的\n\tCreateAttrGroup(ctx context.Context, in *AttrGroupRequest, opts ...grpc.CallOption) (*AttrGroupResponse, error)\n\t// 商品参数属性组下的一些信息 ,主体:上市年份 产品名称 ,网络支持 5G网络,双卡双待类型,\n\tCreateAttrValue(ctx context.Context, in *AttrRequest, opts ...grpc.CallOption) (*AttrResponse, error)\n\t// 商品接口\n\tCreateGoods(ctx context.Context, in *CreateGoodsRequest, opts ...grpc.CallOption) (*CreateGoodsResponse, error)\n\tUpdateGoods(ctx context.Context, in *CreateGoodsRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)\n\tGoodsList(ctx context.Context, in *GoodsFilterRequest, opts ...grpc.CallOption) (*GoodsListResponse, error)\n}\n\ntype goodsClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewGoodsClient(cc grpc.ClientConnInterface) GoodsClient {\n\treturn &goodsClient{cc}\n}\n\nfunc (c *goodsClient) GetAllCategoryList(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*CategoryListResponse, error) {\n\tout := new(CategoryListResponse)\n\terr := c.cc.Invoke(ctx, \"/goods.v1.Goods/GetAllCategoryList\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *goodsClient) GetSubCategory(ctx context.Context, in *CategoryListRequest, opts ...grpc.CallOption) (*SubCategoryListResponse, error) {\n\tout := new(SubCategoryListResponse)\n\terr := c.cc.Invoke(ctx, \"/goods.v1.Goods/GetSubCategory\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *goodsClient) CreateCategory(ctx context.Context, in *CategoryInfoRequest, opts ...grpc.CallOption) (*CategoryInfoResponse, error) {\n\tout := new(CategoryInfoResponse)\n\terr := c.cc.Invoke(ctx, \"/goods.v1.Goods/CreateCategory\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *goodsClient) DeleteCategory(ctx context.Context, in *DeleteCategoryRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {\n\tout := new(emptypb.Empty)\n\terr := c.cc.Invoke(ctx, \"/goods.v1.Goods/DeleteCategory\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *goodsClient) UpdateCategory(ctx context.Context, in *CategoryInfoRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {\n\tout := new(emptypb.Empty)\n\terr := c.cc.Invoke(ctx, \"/goods.v1.Goods/UpdateCategory\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *goodsClient) BrandList(ctx context.Context, in *BrandListRequest, opts ...grpc.CallOption) (*BrandListResponse, error) {\n\tout := new(BrandListResponse)\n\terr := c.cc.Invoke(ctx, \"/goods.v1.Goods/BrandList\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *goodsClient) CreateBrand(ctx context.Context, in *BrandRequest, opts ...grpc.CallOption) (*BrandInfoResponse, error) {\n\tout := new(BrandInfoResponse)\n\terr := c.cc.Invoke(ctx, \"/goods.v1.Goods/CreateBrand\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *goodsClient) DeleteBrand(ctx context.Context, in *BrandRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {\n\tout := new(emptypb.Empty)\n\terr := c.cc.Invoke(ctx, \"/goods.v1.Goods/DeleteBrand\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *goodsClient) UpdateBrand(ctx context.Context, in *BrandRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {\n\tout := new(emptypb.Empty)\n\terr := c.cc.Invoke(ctx, \"/goods.v1.Goods/UpdateBrand\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *goodsClient) CreateGoodsType(ctx context.Context, in *GoodsTypeRequest, opts ...grpc.CallOption) (*GoodsTypeResponse, error) {\n\tout := new(GoodsTypeResponse)\n\terr := c.cc.Invoke(ctx, \"/goods.v1.Goods/CreateGoodsType\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *goodsClient) CreateGoodsSpecification(ctx context.Context, in *SpecificationRequest, opts ...grpc.CallOption) (*SpecificationResponse, error) {\n\tout := new(SpecificationResponse)\n\terr := c.cc.Invoke(ctx, \"/goods.v1.Goods/CreateGoodsSpecification\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *goodsClient) CreateAttrGroup(ctx context.Context, in *AttrGroupRequest, opts ...grpc.CallOption) (*AttrGroupResponse, error) {\n\tout := new(AttrGroupResponse)\n\terr := c.cc.Invoke(ctx, \"/goods.v1.Goods/CreateAttrGroup\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *goodsClient) CreateAttrValue(ctx context.Context, in *AttrRequest, opts ...grpc.CallOption) (*AttrResponse, error) {\n\tout := new(AttrResponse)\n\terr := c.cc.Invoke(ctx, \"/goods.v1.Goods/CreateAttrValue\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *goodsClient) CreateGoods(ctx context.Context, in *CreateGoodsRequest, opts ...grpc.CallOption) (*CreateGoodsResponse, error) {\n\tout := new(CreateGoodsResponse)\n\terr := c.cc.Invoke(ctx, \"/goods.v1.Goods/CreateGoods\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *goodsClient) UpdateGoods(ctx context.Context, in *CreateGoodsRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {\n\tout := new(emptypb.Empty)\n\terr := c.cc.Invoke(ctx, \"/goods.v1.Goods/UpdateGoods\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *goodsClient) GoodsList(ctx context.Context, in *GoodsFilterRequest, opts ...grpc.CallOption) (*GoodsListResponse, error) {\n\tout := new(GoodsListResponse)\n\terr := c.cc.Invoke(ctx, \"/goods.v1.Goods/GoodsList\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// GoodsServer is the server API for Goods service.\n// All implementations must embed UnimplementedGoodsServer\n// for forward compatibility\ntype GoodsServer interface {\n\t// 商品分类\n\tGetAllCategoryList(context.Context, *emptypb.Empty) (*CategoryListResponse, error)\n\tGetSubCategory(context.Context, *CategoryListRequest) (*SubCategoryListResponse, error)\n\tCreateCategory(context.Context, *CategoryInfoRequest) (*CategoryInfoResponse, error)\n\tDeleteCategory(context.Context, *DeleteCategoryRequest) (*emptypb.Empty, error)\n\tUpdateCategory(context.Context, *CategoryInfoRequest) (*emptypb.Empty, error)\n\t// 商品品牌\n\tBrandList(context.Context, *BrandListRequest) (*BrandListResponse, error)\n\tCreateBrand(context.Context, *BrandRequest) (*BrandInfoResponse, error)\n\tDeleteBrand(context.Context, *BrandRequest) (*emptypb.Empty, error)\n\tUpdateBrand(context.Context, *BrandRequest) (*emptypb.Empty, error)\n\t// 商品类型 goods_property_names\n\t// 商品类型不同于商品分类，指的是依据某一类商品的相同属性归纳成的属性集合 // 手机类型都有屏幕尺寸、网络制式等共同的属性\n\tCreateGoodsType(context.Context, *GoodsTypeRequest) (*GoodsTypeResponse, error)\n\t// 创建商品规格 也就是 手机的颜色、内存版本、购买方式之类的\n\t// 商品规格的值，比如手机颜色对应的有 红、白、黑，内存，128g、256g, 也一起创建了\n\tCreateGoodsSpecification(context.Context, *SpecificationRequest) (*SpecificationResponse, error)\n\t// 商品参数属性 ,手机:主体,屏幕, 操作系统,网络支持之类的\n\tCreateAttrGroup(context.Context, *AttrGroupRequest) (*AttrGroupResponse, error)\n\t// 商品参数属性组下的一些信息 ,主体:上市年份 产品名称 ,网络支持 5G网络,双卡双待类型,\n\tCreateAttrValue(context.Context, *AttrRequest) (*AttrResponse, error)\n\t// 商品接口\n\tCreateGoods(context.Context, *CreateGoodsRequest) (*CreateGoodsResponse, error)\n\tUpdateGoods(context.Context, *CreateGoodsRequest) (*emptypb.Empty, error)\n\tGoodsList(context.Context, *GoodsFilterRequest) (*GoodsListResponse, error)\n\tmustEmbedUnimplementedGoodsServer()\n}\n\n// UnimplementedGoodsServer must be embedded to have forward compatible implementations.\ntype UnimplementedGoodsServer struct {\n}\n\nfunc (UnimplementedGoodsServer) GetAllCategoryList(context.Context, *emptypb.Empty) (*CategoryListResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetAllCategoryList not implemented\")\n}\nfunc (UnimplementedGoodsServer) GetSubCategory(context.Context, *CategoryListRequest) (*SubCategoryListResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetSubCategory not implemented\")\n}\nfunc (UnimplementedGoodsServer) CreateCategory(context.Context, *CategoryInfoRequest) (*CategoryInfoResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method CreateCategory not implemented\")\n}\nfunc (UnimplementedGoodsServer) DeleteCategory(context.Context, *DeleteCategoryRequest) (*emptypb.Empty, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method DeleteCategory not implemented\")\n}\nfunc (UnimplementedGoodsServer) UpdateCategory(context.Context, *CategoryInfoRequest) (*emptypb.Empty, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method UpdateCategory not implemented\")\n}\nfunc (UnimplementedGoodsServer) BrandList(context.Context, *BrandListRequest) (*BrandListResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method BrandList not implemented\")\n}\nfunc (UnimplementedGoodsServer) CreateBrand(context.Context, *BrandRequest) (*BrandInfoResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method CreateBrand not implemented\")\n}\nfunc (UnimplementedGoodsServer) DeleteBrand(context.Context, *BrandRequest) (*emptypb.Empty, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method DeleteBrand not implemented\")\n}\nfunc (UnimplementedGoodsServer) UpdateBrand(context.Context, *BrandRequest) (*emptypb.Empty, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method UpdateBrand not implemented\")\n}\nfunc (UnimplementedGoodsServer) CreateGoodsType(context.Context, *GoodsTypeRequest) (*GoodsTypeResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method CreateGoodsType not implemented\")\n}\nfunc (UnimplementedGoodsServer) CreateGoodsSpecification(context.Context, *SpecificationRequest) (*SpecificationResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method CreateGoodsSpecification not implemented\")\n}\nfunc (UnimplementedGoodsServer) CreateAttrGroup(context.Context, *AttrGroupRequest) (*AttrGroupResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method CreateAttrGroup not implemented\")\n}\nfunc (UnimplementedGoodsServer) CreateAttrValue(context.Context, *AttrRequest) (*AttrResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method CreateAttrValue not implemented\")\n}\nfunc (UnimplementedGoodsServer) CreateGoods(context.Context, *CreateGoodsRequest) (*CreateGoodsResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method CreateGoods not implemented\")\n}\nfunc (UnimplementedGoodsServer) UpdateGoods(context.Context, *CreateGoodsRequest) (*emptypb.Empty, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method UpdateGoods not implemented\")\n}\nfunc (UnimplementedGoodsServer) GoodsList(context.Context, *GoodsFilterRequest) (*GoodsListResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GoodsList not implemented\")\n}\nfunc (UnimplementedGoodsServer) mustEmbedUnimplementedGoodsServer() {}\n\n// UnsafeGoodsServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to GoodsServer will\n// result in compilation errors.\ntype UnsafeGoodsServer interface {\n\tmustEmbedUnimplementedGoodsServer()\n}\n\nfunc RegisterGoodsServer(s grpc.ServiceRegistrar, srv GoodsServer) {\n\ts.RegisterService(&Goods_ServiceDesc, srv)\n}\n\nfunc _Goods_GetAllCategoryList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(emptypb.Empty)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GoodsServer).GetAllCategoryList(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/goods.v1.Goods/GetAllCategoryList\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GoodsServer).GetAllCategoryList(ctx, req.(*emptypb.Empty))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Goods_GetSubCategory_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(CategoryListRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GoodsServer).GetSubCategory(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/goods.v1.Goods/GetSubCategory\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GoodsServer).GetSubCategory(ctx, req.(*CategoryListRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Goods_CreateCategory_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(CategoryInfoRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GoodsServer).CreateCategory(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/goods.v1.Goods/CreateCategory\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GoodsServer).CreateCategory(ctx, req.(*CategoryInfoRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Goods_DeleteCategory_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(DeleteCategoryRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GoodsServer).DeleteCategory(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/goods.v1.Goods/DeleteCategory\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GoodsServer).DeleteCategory(ctx, req.(*DeleteCategoryRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Goods_UpdateCategory_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(CategoryInfoRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GoodsServer).UpdateCategory(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/goods.v1.Goods/UpdateCategory\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GoodsServer).UpdateCategory(ctx, req.(*CategoryInfoRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Goods_BrandList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(BrandListRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GoodsServer).BrandList(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/goods.v1.Goods/BrandList\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GoodsServer).BrandList(ctx, req.(*BrandListRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Goods_CreateBrand_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(BrandRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GoodsServer).CreateBrand(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/goods.v1.Goods/CreateBrand\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GoodsServer).CreateBrand(ctx, req.(*BrandRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Goods_DeleteBrand_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(BrandRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GoodsServer).DeleteBrand(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/goods.v1.Goods/DeleteBrand\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GoodsServer).DeleteBrand(ctx, req.(*BrandRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Goods_UpdateBrand_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(BrandRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GoodsServer).UpdateBrand(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/goods.v1.Goods/UpdateBrand\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GoodsServer).UpdateBrand(ctx, req.(*BrandRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Goods_CreateGoodsType_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GoodsTypeRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GoodsServer).CreateGoodsType(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/goods.v1.Goods/CreateGoodsType\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GoodsServer).CreateGoodsType(ctx, req.(*GoodsTypeRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Goods_CreateGoodsSpecification_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(SpecificationRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GoodsServer).CreateGoodsSpecification(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/goods.v1.Goods/CreateGoodsSpecification\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GoodsServer).CreateGoodsSpecification(ctx, req.(*SpecificationRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Goods_CreateAttrGroup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(AttrGroupRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GoodsServer).CreateAttrGroup(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/goods.v1.Goods/CreateAttrGroup\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GoodsServer).CreateAttrGroup(ctx, req.(*AttrGroupRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Goods_CreateAttrValue_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(AttrRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GoodsServer).CreateAttrValue(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/goods.v1.Goods/CreateAttrValue\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GoodsServer).CreateAttrValue(ctx, req.(*AttrRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Goods_CreateGoods_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(CreateGoodsRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GoodsServer).CreateGoods(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/goods.v1.Goods/CreateGoods\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GoodsServer).CreateGoods(ctx, req.(*CreateGoodsRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Goods_UpdateGoods_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(CreateGoodsRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GoodsServer).UpdateGoods(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/goods.v1.Goods/UpdateGoods\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GoodsServer).UpdateGoods(ctx, req.(*CreateGoodsRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Goods_GoodsList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GoodsFilterRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GoodsServer).GoodsList(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/goods.v1.Goods/GoodsList\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GoodsServer).GoodsList(ctx, req.(*GoodsFilterRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// Goods_ServiceDesc is the grpc.ServiceDesc for Goods service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar Goods_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"goods.v1.Goods\",\n\tHandlerType: (*GoodsServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetAllCategoryList\",\n\t\t\tHandler:    _Goods_GetAllCategoryList_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetSubCategory\",\n\t\t\tHandler:    _Goods_GetSubCategory_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"CreateCategory\",\n\t\t\tHandler:    _Goods_CreateCategory_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"DeleteCategory\",\n\t\t\tHandler:    _Goods_DeleteCategory_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"UpdateCategory\",\n\t\t\tHandler:    _Goods_UpdateCategory_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"BrandList\",\n\t\t\tHandler:    _Goods_BrandList_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"CreateBrand\",\n\t\t\tHandler:    _Goods_CreateBrand_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"DeleteBrand\",\n\t\t\tHandler:    _Goods_DeleteBrand_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"UpdateBrand\",\n\t\t\tHandler:    _Goods_UpdateBrand_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"CreateGoodsType\",\n\t\t\tHandler:    _Goods_CreateGoodsType_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"CreateGoodsSpecification\",\n\t\t\tHandler:    _Goods_CreateGoodsSpecification_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"CreateAttrGroup\",\n\t\t\tHandler:    _Goods_CreateAttrGroup_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"CreateAttrValue\",\n\t\t\tHandler:    _Goods_CreateAttrValue_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"CreateGoods\",\n\t\t\tHandler:    _Goods_CreateGoods_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"UpdateGoods\",\n\t\t\tHandler:    _Goods_UpdateGoods_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GoodsList\",\n\t\t\tHandler:    _Goods_GoodsList_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"api/goods/v1/goods.proto\",\n}\n"
  },
  {
    "path": "service/goods/cmd/goods/main.go",
    "content": "package main\n\nimport (\n\t\"flag\"\n\t\"github.com/go-kratos/kratos/v2\"\n\t\"github.com/go-kratos/kratos/v2/registry\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\n\t\"os\"\n\n\t\"github.com/go-kratos/kratos/v2/config\"\n\t\"github.com/go-kratos/kratos/v2/config/file\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"github.com/go-kratos/kratos/v2/middleware/tracing\"\n\t\"github.com/go-kratos/kratos/v2/transport/grpc\"\n\t\"go.opentelemetry.io/otel/exporters/jaeger\"\n\ttracesdk \"go.opentelemetry.io/otel/sdk/trace\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.4.0\"\n\t\"goods/internal/conf\"\n)\n\n// go build -ldflags \"-X main.Version=x.y.z\"\nvar (\n\t// Name is the name of the compiled software.\n\tName = \"shop.goods.service\"\n\t// Version is the version of the compiled software.\n\tVersion string\n\t// flagconf is the config flag.\n\tflagconf string\n\n\tid, _ = os.Hostname()\n)\n\nfunc init() {\n\tflag.StringVar(&flagconf, \"conf\", \"../../configs\", \"config path, eg: -conf config.yaml\")\n}\n\nfunc newApp(logger log.Logger, gs *grpc.Server, rr registry.Registrar) *kratos.App {\n\treturn kratos.New(\n\t\tkratos.ID(id),\n\t\tkratos.Name(Name),\n\t\tkratos.Version(Version),\n\t\tkratos.Metadata(map[string]string{}),\n\t\tkratos.Logger(logger),\n\t\tkratos.Server(\n\t\t\tgs,\n\t\t),\n\t\tkratos.Registrar(rr),\n\t)\n}\n\nfunc setTracerProvider(url string) error {\n\t// Create the Jaeger exporter\n\texp, err := jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(url)))\n\tif err != nil {\n\t\treturn err\n\t}\n\ttp := tracesdk.NewTracerProvider(\n\t\t// Set the sampling rate based on the parent span to 100%\n\t\ttracesdk.WithSampler(tracesdk.ParentBased(tracesdk.TraceIDRatioBased(1.0))),\n\t\t// Always be sure to batch in production.\n\t\ttracesdk.WithBatcher(exp),\n\t\t// Record information about this application in an Resource.\n\t\ttracesdk.WithResource(resource.NewSchemaless(\n\t\t\tsemconv.ServiceNameKey.String(Name),\n\t\t\tattribute.String(\"env\", \"dev\"),\n\t\t)),\n\t)\n\totel.SetTracerProvider(tp)\n\treturn nil\n}\n\nfunc main() {\n\tflag.Parse()\n\tlogger := log.With(log.NewStdLogger(os.Stdout),\n\t\t\"ts\", log.DefaultTimestamp,\n\t\t\"caller\", log.DefaultCaller,\n\t\t\"service.id\", id,\n\t\t\"service.name\", Name,\n\t\t\"service.version\", Version,\n\t\t\"trace_id\", tracing.TraceID(),\n\t\t\"span_id\", tracing.SpanID(),\n\t)\n\tc := config.New(\n\t\tconfig.WithSource(\n\t\t\tfile.NewSource(flagconf),\n\t\t),\n\t)\n\tdefer c.Close()\n\n\tif err := c.Load(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tvar bc conf.Bootstrap\n\tif err := c.Scan(&bc); err != nil {\n\t\tpanic(err)\n\t}\n\n\tif err := setTracerProvider(bc.Trace.Endpoint); err != nil {\n\t\tpanic(err)\n\t}\n\n\tvar rc conf.Registry\n\tif err := c.Scan(&rc); err != nil {\n\t\tpanic(err)\n\t}\n\n\tapp, cleanup, err := initApp(bc.Server, &rc, bc.Data, logger)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdefer cleanup()\n\n\t// start and wait for stop signal\n\tif err := app.Run(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "service/goods/cmd/goods/wire.go",
    "content": "//go:build wireinject\n// +build wireinject\n\n// The build tag makes sure the stub is not built in the final build.\n\npackage main\n\nimport (\n\t\"github.com/go-kratos/kratos/v2\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"github.com/google/wire\"\n\t\"goods/internal/biz\"\n\t\"goods/internal/conf\"\n\t\"goods/internal/data\"\n\t\"goods/internal/server\"\n\t\"goods/internal/service\"\n)\n\n// initApp init kratos application.\nfunc initApp(*conf.Server, *conf.Registry, *conf.Data, log.Logger) (*kratos.App, func(), error) {\n\tpanic(wire.Build(server.ProviderSet, data.ProviderSet, biz.ProviderSet, service.ProviderSet, newApp))\n}\n"
  },
  {
    "path": "service/goods/cmd/goods/wire_gen.go",
    "content": "// Code generated by Wire. DO NOT EDIT.\n\n//go:generate go run github.com/google/wire/cmd/wire\n//go:build !wireinject\n// +build !wireinject\n\npackage main\n\nimport (\n\t\"github.com/go-kratos/kratos/v2\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"goods/internal/biz\"\n\t\"goods/internal/conf\"\n\t\"goods/internal/data\"\n\t\"goods/internal/server\"\n\t\"goods/internal/service\"\n)\n\n// Injectors from wire.go:\n\n// initApp init kratos application.\nfunc initApp(confServer *conf.Server, registry *conf.Registry, confData *conf.Data, logger log.Logger) (*kratos.App, func(), error) {\n\tdb := data.NewDB(confData)\n\tclient := data.NewRedis(confData)\n\telasticClient := data.NewElasticsearch(confData)\n\tdataData, cleanup, err := data.NewData(confData, logger, db, client, elasticClient)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\tbrandRepo := data.NewBrandRepo(dataData, logger)\n\tbrandUsecase := biz.NewBrandUsecase(brandRepo, logger)\n\tcategoryRepo := data.NewCategoryRepo(dataData, logger)\n\tcategoryUsecase := biz.NewCategoryUsecase(categoryRepo, logger)\n\tgoodsTypeRepo := data.NewGoodsTypeRepo(dataData, logger)\n\ttransaction := data.NewTransaction(dataData)\n\tgoodsTypeUsecase := biz.NewGoodsTypeUsecase(goodsTypeRepo, transaction, brandRepo, logger)\n\tspecificationRepo := data.NewSpecificationRepo(dataData, logger)\n\tspecificationUsecase := biz.NewSpecificationUsecase(specificationRepo, goodsTypeRepo, transaction, logger)\n\tgoodsAttrRepo := data.NewGoodsAttrRepo(dataData, logger)\n\tgoodsAttrUsecase := biz.NewGoodsAttrUsecase(goodsAttrRepo, transaction, goodsTypeRepo, logger)\n\tgoodsRepo := data.NewGoodsRepo(dataData, logger)\n\tgoodsSkuRepo := data.NewGoodsSkuRepoRepo(dataData, logger)\n\tinventoryRepo := data.NewInventoryRepo(dataData, logger)\n\tesGoodsRepo := data.NewEsGoodsRepo(dataData, logger)\n\tgoodsUsecase := biz.NewGoodsUsecase(goodsRepo, goodsSkuRepo, transaction, goodsTypeRepo, categoryRepo, brandRepo, specificationRepo, goodsAttrRepo, inventoryRepo, esGoodsRepo, logger)\n\tesGoodsUsecase := biz.NewEsGoodsUsecase(goodsRepo, esGoodsRepo, categoryRepo, logger)\n\tgoodsService := service.NewGoodsService(brandUsecase, categoryUsecase, goodsTypeUsecase, specificationUsecase, goodsAttrUsecase, goodsUsecase, esGoodsUsecase, logger)\n\tgrpcServer := server.NewGRPCServer(confServer, goodsService, logger)\n\tregistrar := server.NewRegistrar(registry)\n\tapp := newApp(logger, grpcServer, registrar)\n\treturn app, func() {\n\t\tcleanup()\n\t}, nil\n}\n"
  },
  {
    "path": "service/goods/configs/config.yaml",
    "content": "server:\n  http:\n    addr: 0.0.0.0:8000\n    timeout: 1s\n  grpc:\n    addr: 0.0.0.0:50052\n    timeout: 1s\ndata:\n  database:\n    driver: mysql\n    source: root:root@tcp(127.0.0.1:3306)/shop_goods?charset=utf8mb4&parseTime=True&loc=Local\n  redis:\n    addr: 127.0.0.1:6379\n    dial_timeout: 1s\n    read_timeout: 0.2s\n    write_timeout: 0.2s\n  elastic:\n    addr: http://127.0.0.1:9200\ntrace:\n  endpoint: http://127.0.0.1:14268/api/traces\n"
  },
  {
    "path": "service/goods/configs/registry.yaml",
    "content": "consul:\n    address: 127.0.0.1:8500\n    scheme: http"
  },
  {
    "path": "service/goods/generate.go",
    "content": "package generate\n\n//go:generate kratos proto client api\n"
  },
  {
    "path": "service/goods/go.mod",
    "content": "module goods\n\ngo 1.16\n\nrequire (\n\tgithub.com/envoyproxy/protoc-gen-validate v0.1.0\n\tgithub.com/go-kratos/kratos/contrib/registry/consul/v2 v2.0.0-20220310144244-ac99a5c877c4\n\tgithub.com/go-kratos/kratos/v2 v2.2.0\n\tgithub.com/go-redis/redis/extra/redisotel v0.3.0\n\tgithub.com/go-redis/redis/v8 v8.11.4\n\tgithub.com/google/wire v0.5.0\n\tgithub.com/hashicorp/consul/api v1.12.0\n\tgithub.com/jinzhu/copier v0.3.5\n\tgithub.com/kr/pretty v0.3.0 // indirect\n\tgithub.com/olivere/elastic/v7 v7.0.31\n\tgithub.com/rogpeppe/go-internal v1.8.0 // indirect\n\tgo.opentelemetry.io/otel v1.4.1\n\tgo.opentelemetry.io/otel/exporters/jaeger v1.4.1\n\tgo.opentelemetry.io/otel/sdk v1.4.1\n\tgolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd\n\tgolang.org/x/sys v0.0.0-20220114195835-da31bd327af9 // indirect\n\tgoogle.golang.org/grpc v1.44.0\n\tgoogle.golang.org/protobuf v1.27.1\n\tgopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect\n\tgorm.io/driver/mysql v1.3.2\n\tgorm.io/gorm v1.23.1\n)\n"
  },
  {
    "path": "service/goods/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=\ngithub.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8=\ngithub.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/aws/aws-sdk-go v1.42.23/go.mod h1:gyRszuZ/icHmHAVE4gc/r+cfCmhA1AD+vqfWbgI+eHs=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=\ngithub.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=\ngithub.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=\ngithub.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0 h1:EQciDnbrYxy13PgWoY8AqoxGiPrpgBZ1R8UNe3ddc+A=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw=\ngithub.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=\ngithub.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=\ngithub.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=\ngithub.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI=\ngithub.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU=\ngithub.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=\ngithub.com/go-kratos/aegis v0.1.1/go.mod h1:jYeSQ3Gesba478zEnujOiG5QdsyF3Xk/8owFUeKcHxw=\ngithub.com/go-kratos/kratos/contrib/registry/consul/v2 v2.0.0-20220310144244-ac99a5c877c4 h1:p6EeKSls7sO32i1JjrZ5cL0ecOAx4EaFufBdhA8ANmY=\ngithub.com/go-kratos/kratos/contrib/registry/consul/v2 v2.0.0-20220310144244-ac99a5c877c4/go.mod h1:UB1G3wVn0oR/viZXokBAopwHMDn3AuO11t2oRqa8zzY=\ngithub.com/go-kratos/kratos/v2 v2.2.0 h1:swSCoOdXD5F/L4eUfhapxSXe1I846hZz1wMLLixz9SA=\ngithub.com/go-kratos/kratos/v2 v2.2.0/go.mod h1:yebXu5KMayLjXZzMTY5HWIPRDwcBehHpiNF/Ot8A2pA=\ngithub.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.2.2 h1:ahHml/yUpnlb96Rp8HCvtYVPY8ZYpxq3g7UYchIYwbs=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=\ngithub.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=\ngithub.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=\ngithub.com/go-playground/form/v4 v4.2.0 h1:N1wh+Goz61e6w66vo8vJkQt+uwZSoLz50kZPJWR8eic=\ngithub.com/go-playground/form/v4 v4.2.0/go.mod h1:q1a2BY+AQUUzhl6xA/6hBetay6dEIhMHjgvJiGo6K7U=\ngithub.com/go-redis/redis/extra/rediscmd v0.2.0 h1:A3bhCsCKsedClEH9/jYlcKqOuBoeeV+H0yDie5t+a6w=\ngithub.com/go-redis/redis/extra/rediscmd v0.2.0/go.mod h1:Z5bP1EHl9PvWhx/DupfCdZwB0JgOO3aVxWc/PFux+BE=\ngithub.com/go-redis/redis/extra/redisotel v0.3.0 h1:8rrizwFAUUeMgmelyiQi9KeFwmpQhay9E+/rE6qHsBM=\ngithub.com/go-redis/redis/extra/redisotel v0.3.0/go.mod h1:sGV3dQnPMBUuqzowEP2nZPhLXCMeh83nY64yaju249c=\ngithub.com/go-redis/redis/v8 v8.3.2/go.mod h1:jszGxBCez8QA1HWSmQxJO9Y82kNibbUmeYhKWrBejTU=\ngithub.com/go-redis/redis/v8 v8.5.0/go.mod h1:YmEcgBDttjnkbMzDAhDtQxY9yVA7jMN6PCR5HeMvqFE=\ngithub.com/go-redis/redis/v8 v8.11.4 h1:kHoYkfZP6+pe04aFTnhDH6GDROa5yJdHJVNxV3F46Tg=\ngithub.com/go-redis/redis/v8 v8.11.4/go.mod h1:2Z2wHZXdQpCDXEGzqMockDpNyYvi2l4Pxt6RJr792+w=\ngithub.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=\ngithub.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=\ngithub.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=\ngithub.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=\ngithub.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/wire v0.5.0 h1:I7ELFeVBr3yfPIcc8+MWvrjk+3VjbcSzoXm3JVa+jD8=\ngithub.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU=\ngithub.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=\ngithub.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=\ngithub.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=\ngithub.com/hashicorp/consul/api v1.9.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M=\ngithub.com/hashicorp/consul/api v1.12.0 h1:k3y1FYv6nuKyNTqj6w9gXOx5r5CfLj/k/euUeBXj1OY=\ngithub.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0=\ngithub.com/hashicorp/consul/sdk v0.8.0 h1:OJtKBtEjboEZvG6AOUdh4Z1Zbyu0WcxQ0qatRrZHTVU=\ngithub.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms=\ngithub.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-hclog v0.12.0 h1:d4QkX8FRTYaKaCZBoXYY8zJX2BXjWxurN/GA2tkrmZM=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/golang-lru v0.5.0 h1:CL2msUPvZTLb5O648aiLNJw3hnBxN2+1Jq8rCOH9wdo=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=\ngithub.com/hashicorp/memberlist v0.3.0 h1:8+567mCcFDnS5ADl7lrpxPMWiFCElyUEeW0gtj34fMA=\ngithub.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=\ngithub.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk=\ngithub.com/hashicorp/serf v0.9.6 h1:uuEX1kLR6aoda1TBttmJQKDLZE1Ob7KN0NPdE7EtCDc=\ngithub.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4=\ngithub.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=\ngithub.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=\ngithub.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=\ngithub.com/jinzhu/copier v0.3.5 h1:GlvfUwHk62RokgqVNvYsku0TATCF7bAHVwEXoBh3iJg=\ngithub.com/jinzhu/copier v0.3.5/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.4 h1:tHnRBy1i5F2Dh8BAFxqFzxKqqvezXrL2OW1TnX+Mlas=\ngithub.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=\ngithub.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=\ngithub.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=\ngithub.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=\ngithub.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=\ngithub.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0=\ngithub.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=\ngithub.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=\ngithub.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=\ngithub.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=\ngithub.com/olivere/elastic/v7 v7.0.31 h1:VJu9/zIsbeiulwlRCfGQf6Tzsr++uo+FeUgj5oj+xKk=\ngithub.com/olivere/elastic/v7 v7.0.31/go.mod h1:idEQxe7Es+Wr4XAuNnJdKeMZufkA9vQprOIFck061vg=\ngithub.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=\ngithub.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=\ngithub.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=\ngithub.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg=\ngithub.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc=\ngithub.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=\ngithub.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=\ngithub.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=\ngithub.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=\ngithub.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48=\ngithub.com/onsi/gomega v1.16.0 h1:6gjqkI8iiRHMvdccRJM8rVKjCWk6ZIm6FTm3ddIe4/c=\ngithub.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=\ngithub.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=\ngithub.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=\ngithub.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=\ngithub.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/shirou/gopsutil/v3 v3.21.8/go.mod h1:YWp/H8Qs5fVmf17v7JNZzA0mPJ+mS2e9JdiUF9LlKzQ=\ngithub.com/smartystreets/assertions v1.1.1/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo=\ngithub.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM=\ngithub.com/smartystreets/gunit v1.4.2/go.mod h1:ZjM1ozSIMJlAz/ay4SG8PeKF00ckUp+zMHZXV9/bvak=\ngithub.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=\ngithub.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs=\ngithub.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngo.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=\ngo.opentelemetry.io/otel v0.13.0/go.mod h1:dlSNewoRYikTkotEnxdmuBHgzT+k/idJSfDv/FxEnOY=\ngo.opentelemetry.io/otel v0.16.0/go.mod h1:e4GKElweB8W2gWUqbghw0B8t5MCTccc9212eNHnOHwA=\ngo.opentelemetry.io/otel v0.17.0/go.mod h1:Oqtdxmf7UtEvL037ohlgnaYa1h7GtMh0NcSd9eqkC9s=\ngo.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs=\ngo.opentelemetry.io/otel v1.4.1 h1:QbINgGDDcoQUoMJa2mMaWno49lja9sHwp6aoa2n3a4g=\ngo.opentelemetry.io/otel v1.4.1/go.mod h1:StM6F/0fSwpd8dKWDCdRr7uRvEPYdW0hBSlbdTiUde4=\ngo.opentelemetry.io/otel/exporters/jaeger v1.4.1 h1:VHCK+2yTZDqDaVXj7JH2Z/khptuydo6C0ttBh2bxAbc=\ngo.opentelemetry.io/otel/exporters/jaeger v1.4.1/go.mod h1:ZW7vkOu9nC1CxsD8bHNHCia5JUbwP39vxgd1q4Z5rCI=\ngo.opentelemetry.io/otel/metric v0.17.0/go.mod h1:hUz9lH1rNXyEwWAhIWCMFWKhYtpASgSnObJFnU26dJ0=\ngo.opentelemetry.io/otel/oteltest v0.17.0/go.mod h1:JT/LGFxPwpN+nlsTiinSYjdIx3hZIGqHCpChcIZmdoE=\ngo.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs=\ngo.opentelemetry.io/otel/sdk v1.4.1 h1:J7EaW71E0v87qflB4cDolaqq3AcujGrtyIPGQoZOB0Y=\ngo.opentelemetry.io/otel/sdk v1.4.1/go.mod h1:NBwHDgDIBYjwK2WNu1OPgsIc2IJzmBXNnvIJxJc8BpE=\ngo.opentelemetry.io/otel/trace v0.17.0/go.mod h1:bIujpqg6ZL6xUTubIUgziI1jSaUPthmabA/ygf/6Cfg=\ngo.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk=\ngo.opentelemetry.io/otel/trace v1.4.1 h1:O+16qcdTrT7zxv2J6GejTPFinSwA++cYerC5iSiF8EQ=\ngo.opentelemetry.io/otel/trace v1.4.1/go.mod h1:iYEVbroFCNut9QkwEczV9vMRPHNKSSwYZjulEtsmhFc=\ngo.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=\ngolang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=\ngolang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9 h1:XfKQ4OlFl8okEOr5UvAqFRVj8pY/4yfcXrddB8qAbU0=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190422233926-fe54fb35175b/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350 h1:YxHp5zqIcAShDEvRr5/0rVESVS+njYF68PSdazrNLJo=\ngoogle.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=\ngoogle.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=\ngoogle.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=\ngoogle.golang.org/grpc v1.44.0 h1:weqSxi/TMs1SqFRMHCtBgXRs8k3X39QIDEZ0pRcttUg=\ngoogle.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=\ngopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=\ngopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.3.2 h1:QJryWiqQ91EvZ0jZL48NOpdlPdMjdip1hQ8bTgo4H7I=\ngorm.io/driver/mysql v1.3.2/go.mod h1:ChK6AHbHgDCFZyJp0F+BmVGb06PSIoh9uVYKAlRbb2U=\ngorm.io/gorm v1.23.1 h1:aj5IlhDzEPsoIyOPtTRVI+SyaN1u6k613sbt4pwbxG0=\ngorm.io/gorm v1.23.1/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\n"
  },
  {
    "path": "service/goods/internal/biz/README.md",
    "content": "# Biz\n"
  },
  {
    "path": "service/goods/internal/biz/biz.go",
    "content": "package biz\n\nimport (\n\t\"context\"\n\t\"github.com/google/wire\"\n)\n\n// ProviderSet is biz providers.\nvar ProviderSet = wire.NewSet(\n\tNewBrandUsecase,\n\tNewCategoryUsecase,\n\tNewGoodsTypeUsecase,\n\tNewSpecificationUsecase,\n\tNewGoodsAttrUsecase,\n\tNewGoodsUsecase,\n\tNewGoodsSkuUsecase,\n\tNewInventoryUsecase,\n\tNewEsGoodsUsecase,\n)\n\n// Transaction 新增事务接口方法\ntype Transaction interface {\n\tExecTx(context.Context, func(ctx context.Context) error) error\n}\n"
  },
  {
    "path": "service/goods/internal/biz/brand.go",
    "content": "package biz\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"goods/internal/domain\"\n)\n\ntype Pagination struct {\n\tPageNum  int\n\tPageSize int\n}\n\ntype BrandRepo interface {\n\tCreate(context.Context, *domain.Brand) (*domain.Brand, error)\n\tGetBradByName(context.Context, string) (*domain.Brand, error)\n\tUpdate(context.Context, *domain.Brand) error\n\tList(context.Context, *Pagination) ([]*domain.Brand, int64, error)\n\tIsBrandByID(context.Context, int32) (*domain.Brand, error)\n\tIsBrand(context.Context, []int32) error\n\tListByIds(context.Context, ...int32) (domain.BrandList, error)\n}\n\ntype BrandUsecase struct {\n\trepo BrandRepo\n\tlog  *log.Helper\n}\n\nfunc NewBrandUsecase(repo BrandRepo, logger log.Logger) *BrandUsecase {\n\treturn &BrandUsecase{repo: repo, log: log.NewHelper(logger)}\n}\n\nfunc (uc *BrandUsecase) CreateBrand(ctx context.Context, b *domain.Brand) (*domain.Brand, error) {\n\t_, err := uc.repo.GetBradByName(ctx, b.Name)\n\tif err != nil {\n\t\treturn uc.repo.Create(ctx, b)\n\t} else {\n\t\treturn nil, errors.New(\"当前品牌已经存在\")\n\t}\n}\n\nfunc (uc *BrandUsecase) UpdateBrand(ctx context.Context, b *domain.Brand) error {\n\terr := uc.repo.Update(ctx, b)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (uc *BrandUsecase) BrandList(ctx context.Context, b *Pagination) ([]*domain.Brand, int64, error) {\n\tlist, total, err := uc.repo.List(ctx, b)\n\tif err != nil {\n\t\treturn nil, 0, err\n\t}\n\treturn list, total, nil\n\n}\n"
  },
  {
    "path": "service/goods/internal/biz/category.go",
    "content": "package biz\n\nimport (\n\t\"context\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n)\n\ntype Category struct {\n\tID               int32\n\tName             string\n\tParentCategoryID int32\n\tSubCategory      []*Category\n\tLevel            int32\n\tIsTab            bool\n\tSort             int32\n}\n\ntype CategoryList struct {\n\tCategory    *CategoryInfo\n\tSubCategory []*CategoryInfo\n}\n\ntype CategoryInfo struct {\n\tID             int32\n\tName           string\n\tParentCategory int32\n\tLevel          int32\n\tIsTab          bool\n\tSort           int32\n}\n\ntype CategoryRepo interface {\n\tAddCategory(context.Context, *CategoryInfo) (*CategoryInfo, error)\n\tUpdateCategory(context.Context, *CategoryInfo) error\n\tCategory(context.Context) ([]*Category, error)\n\tGetCategoryByID(ctx context.Context, id int32) (*CategoryInfo, error)\n\tSubCategory(context.Context, CategoryInfo) ([]*CategoryInfo, error)\n\tDeleteCategory(context.Context, int32) error\n\tGetCategoryAll(context.Context, int32, int32) ([]interface{}, error)\n}\n\ntype CategoryUsecase struct {\n\trepo CategoryRepo\n\tlog  *log.Helper\n}\n\nfunc NewCategoryUsecase(repo CategoryRepo, logger log.Logger) *CategoryUsecase {\n\treturn &CategoryUsecase{repo: repo, log: log.NewHelper(logger)}\n}\n\nfunc (c *CategoryUsecase) DeleteCategory(ctx context.Context, r *CategoryInfo) error {\n\t// todo 需要验证是否是定级分类,定级分类下面还有没有二级分类\n\terr := c.repo.DeleteCategory(ctx, r.ID)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (c *CategoryUsecase) UpdateCategory(ctx context.Context, r *CategoryInfo) error {\n\terr := c.repo.UpdateCategory(ctx, r)\n\treturn err\n}\n\nfunc (c *CategoryUsecase) CreateCategory(ctx context.Context, r *CategoryInfo) (*CategoryInfo, error) {\n\tcateInfo, err := c.repo.AddCategory(ctx, r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn cateInfo, nil\n}\n\nfunc (c *CategoryUsecase) CategoryList(ctx context.Context) ([]*Category, error) {\n\treturn c.repo.Category(ctx)\n}\n\nfunc (c *CategoryUsecase) SubCategoryList(ctx context.Context, cid int32) (*CategoryList, error) {\n\tcateInfo, err := c.repo.GetCategoryByID(ctx, cid)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tcategory, err := c.repo.SubCategory(ctx, *cateInfo)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &CategoryList{\n\t\tCategory:    cateInfo,\n\t\tSubCategory: category,\n\t}, nil\n}\n"
  },
  {
    "path": "service/goods/internal/biz/es_goods.go",
    "content": "package biz\n\nimport (\n\t\"context\"\n\t\"goods/internal/domain\"\n\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"github.com/olivere/elastic/v7\"\n)\n\ntype EsGoodsRepo interface {\n\tGoodsList(ctx context.Context, es *domain.EsSearch) ([]int64, int64, error)\n\tInsertEsGoods(context.Context, domain.ESGoods) error\n}\n\ntype EsGoodsUsecase struct {\n\trepo         GoodsRepo\n\tesRepo       EsGoodsRepo\n\tcategoryRepo CategoryRepo\n\tlog          *log.Helper\n}\n\nfunc NewEsGoodsUsecase(repo GoodsRepo, es EsGoodsRepo, cRepo CategoryRepo, logger log.Logger) *EsGoodsUsecase {\n\treturn &EsGoodsUsecase{\n\t\trepo:         repo,\n\t\tesRepo:       es,\n\t\tcategoryRepo: cRepo,\n\t\tlog:          log.NewHelper(logger),\n\t}\n}\n\nfunc (g EsGoodsUsecase) GoodsList(ctx context.Context, req *domain.ESGoodsFilter) (*domain.GoodsListResponse, error) {\n\t// 组织 es 查询条件\n\tvar es domain.EsSearch\n\tif req.Keywords != \"\" {\n\t\tes.ShouldQuery = append(es.ShouldQuery, elastic.NewMultiMatchQuery(req.Keywords, \"name\", \"goods_brief\", \"sku.sku_name\"))\n\t}\n\tif req.IsHot {\n\t\tes.ShouldQuery = append(es.ShouldQuery, elastic.NewTermQuery(\"is_hot\", req.IsHot)) // 精确字段查询\n\t}\n\tif req.ClickNum > 0 {\n\t\tes.ShouldQuery = append(es.ShouldQuery, elastic.NewFieldSort(\"click_num\").Desc()) // 根据某个字段排序\n\t}\n\tif req.MinPrice > 0 {\n\t\tes.ShouldQuery = append(es.ShouldQuery, elastic.NewRangeQuery(\"shop_price\").Gte(req.MinPrice)) // 区间筛选 gte 大于=\n\t}\n\tif req.MaxPrice > 0 {\n\t\tes.ShouldQuery = append(es.ShouldQuery, elastic.NewRangeQuery(\"shop_price\").Lte(req.MaxPrice)) // lte 小于=\n\t}\n\tif req.BrandsID > 0 {\n\t\tes.ShouldQuery = append(es.ShouldQuery, elastic.NewTermQuery(\"brands_id\", req.BrandsID))\n\t}\n\t// 通过 category 去查询商品\n\tif req.CategoryID > 0 {\n\t\t// 查询分类是否存在\n\t\tcate, err := g.categoryRepo.GetCategoryByID(ctx, req.CategoryID)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tcategoryIds, err := g.categoryRepo.GetCategoryAll(ctx, cate.Level, req.CategoryID)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tes.ShouldQuery = append(es.ShouldQuery, elastic.NewTermsQuery(\"category_id\", categoryIds...))\n\t}\n\t// 分页处理\n\tswitch {\n\tcase req.PagePerNums > 100:\n\t\treq.PagePerNums = 100\n\tcase req.PagePerNums <= 0:\n\t\treq.PagePerNums = 10\n\t}\n\tif req.Pages == 0 {\n\t\treq.Pages = 1\n\t}\n\tes.Form = (req.Pages - 1) * req.PagePerNums\n\tes.Size = req.PagePerNums\n\n\tres := &domain.GoodsListResponse{}\n\tgoodsIds, total, err := g.esRepo.GoodsList(ctx, &es)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tres.Total = total\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tgoodsList, err := g.repo.GoodsListByIDs(ctx, goodsIds...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tres.List = goodsList\n\t// TODO 根据返回的商品信息，查询所有分类、查询所有品牌、查询所有sku 的信息进行组合\n\treturn res, nil\n}\n"
  },
  {
    "path": "service/goods/internal/biz/goods.go",
    "content": "package biz\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"goods/internal/domain\"\n\n\t\"github.com/go-kratos/kratos/v2/errors\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n)\n\ntype GoodsRepo interface {\n\tCreateGoods(ctx context.Context, goods *domain.Goods) (*domain.Goods, error)\n\tGoodsListByIDs(context.Context, ...int64) ([]*domain.Goods, error)\n}\n\ntype GoodsUsecase struct {\n\trepo              GoodsRepo\n\ttr                Transaction\n\tskuRepo           GoodsSkuRepo\n\tcategoryRepo      CategoryRepo\n\tbrandRepo         BrandRepo\n\ttypeRepo          GoodsTypeRepo\n\tspecificationRepo SpecificationRepo\n\tgoodsAttrRepo     GoodsAttrRepo\n\tinventoryRepo     InventoryRepo\n\tesGoodsRepo       EsGoodsRepo\n\tlog               *log.Helper\n}\n\nfunc NewGoodsUsecase(repo GoodsRepo, skuRepo GoodsSkuRepo, tx Transaction, gRepo GoodsTypeRepo, cRepo CategoryRepo,\n\tbRepo BrandRepo, sRepo SpecificationRepo, aRepo GoodsAttrRepo, iRepo InventoryRepo, es EsGoodsRepo, logger log.Logger) *GoodsUsecase {\n\n\treturn &GoodsUsecase{\n\t\trepo:              repo,\n\t\tskuRepo:           skuRepo,\n\t\ttr:                tx,\n\t\ttypeRepo:          gRepo,\n\t\tcategoryRepo:      cRepo,\n\t\tbrandRepo:         bRepo,\n\t\tspecificationRepo: sRepo,\n\t\tgoodsAttrRepo:     aRepo,\n\t\tinventoryRepo:     iRepo,\n\t\tesGoodsRepo:       es,\n\t\tlog:               log.NewHelper(logger),\n\t}\n}\n\nfunc (g GoodsUsecase) CreateGoods(ctx context.Context, r *domain.Goods) (*domain.GoodsInfoResponse, error) {\n\tvar (\n\t\terr     error\n\t\tgoods   *domain.Goods\n\t\tEsGoods domain.ESGoods\n\t)\n\n\t// 判断品牌是否存在\n\tbrand, err := g.brandRepo.IsBrandByID(ctx, r.BrandsID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// 判断分类是否存在\n\tcate, err := g.categoryRepo.GetCategoryByID(ctx, r.CategoryID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// 判断商品类型是否存在\n\tgoodsType, err := g.typeRepo.IsExistsByID(ctx, r.TypeID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// 判断商品规格和属性是否存在\n\tfor _, sku := range r.Sku {\n\t\tvar sIDs []*int64\n\t\tfor _, info := range sku.Specification {\n\t\t\tsIDs = append(sIDs, &info.SpecificationID)\n\t\t}\n\n\t\tspecList, err := g.specificationRepo.ListByIds(ctx, sIDs...)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tfor _, sId := range sIDs {\n\t\t\tinfo := specList.FindById(*sId)\n\t\t\tif info == nil {\n\t\t\t\treturn nil, errors.NotFound(\"SPECIFICATION_NOT_FOUND\", \"商品规格不存在\")\n\t\t\t}\n\t\t}\n\t\tvar attrIDs []int64\n\t\tfor _, attr := range sku.GroupAttr {\n\t\t\tfor _, id := range attr.Attr {\n\t\t\t\tattrIDs = append(attrIDs, id.AttrID)\n\t\t\t}\n\t\t}\n\t\tattrList, err := g.goodsAttrRepo.ListByIds(ctx, attrIDs...)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tfor _, attr := range sku.GroupAttr {\n\t\t\tfor _, id := range attr.Attr {\n\t\t\t\tattrIDs = append(attrIDs, id.AttrID)\n\t\t\t\ttrue := attrList.IsNotExist(attr.GroupId, id.AttrID)\n\t\t\t\tif true {\n\t\t\t\t\treturn nil, errors.NotFound(\"ATTR_NOT_FOUND\", \"商品属性不存在\")\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\terr = g.tr.ExecTx(ctx, func(ctx context.Context) error {\n\t\t// 更新商品表\n\t\tgoods, err = g.repo.CreateGoods(ctx, &domain.Goods{\n\t\t\tCategoryID:      r.CategoryID,\n\t\t\tBrandsID:        r.BrandsID,\n\t\t\tTypeID:          r.TypeID,\n\t\t\tName:            r.Name,\n\t\t\tNameAlias:       r.NameAlias,\n\t\t\tGoodsSn:         r.GoodsSn,\n\t\t\tGoodsTags:       r.GoodsTags,\n\t\t\tMarketPrice:     r.MarketPrice,\n\t\t\tGoodsBrief:      r.GoodsBrief,\n\t\t\tGoodsFrontImage: r.GoodsFrontImage,\n\t\t\tGoodsImages:     r.GoodsImages,\n\t\t\tOnSale:          r.OnSale,\n\t\t\tIsNew:           r.IsNew,\n\t\t\tIsHot:           r.IsHot,\n\t\t\tShipFree:        r.ShipFree,\n\t\t\tShipID:          r.ShipID,\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t// 更新商品 SKU 表\n\t\tfor _, v := range r.Sku {\n\t\t\tres := &domain.GoodsSku{\n\t\t\t\tGoodsID:        goods.ID,\n\t\t\t\tGoodsSn:        goods.GoodsSn,\n\t\t\t\tGoodsName:      goods.Name,\n\t\t\t\tSkuName:        v.SkuName,\n\t\t\t\tSkuCode:        v.SkuCode,\n\t\t\t\tBarCode:        v.BarCode,\n\t\t\t\tPrice:          v.Price,\n\t\t\t\tPromotionPrice: v.PromotionPrice,\n\t\t\t\tPoints:         v.Points,\n\t\t\t\tRemarksInfo:    v.RemarksInfo,\n\t\t\t\tPic:            v.Pic,\n\t\t\t\tInventory:      v.Inventory,\n\t\t\t\tOnSale:         v.OnSale,\n\t\t\t}\n\n\t\t\tgoodsAttr, err := json.Marshal(v.GroupAttr)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tres.AttrInfo = string(goodsAttr)\n\n\t\t\t// 插入 sku 表\n\t\t\tskuInfo, err := g.skuRepo.Create(ctx, res)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\t// 插入库存表\n\t\t\t_, err = g.inventoryRepo.Create(ctx, &domain.Inventory{\n\t\t\t\tSkuID:     skuInfo.ID,\n\t\t\t\tInventory: skuInfo.Inventory,\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\t// 插入 sku 规格关联关系表\n\t\t\tvar skuRelation []*domain.GoodsSpecificationSku\n\t\t\tfor _, spec := range v.Specification {\n\t\t\t\tskuRelation = append(skuRelation, &domain.GoodsSpecificationSku{\n\t\t\t\t\tSkuID:           skuInfo.ID,\n\t\t\t\t\tSkuCode:         skuInfo.SkuCode,\n\t\t\t\t\tSpecificationId: spec.SpecificationID,\n\t\t\t\t\tValueId:         spec.SpecificationValueID,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\t// 插入商品规格关联关系表\n\t\t\terr = g.skuRepo.CreateSkuRelation(ctx, skuRelation)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\t// esModel\n\t\t\t{\n\t\t\t\tEsGoods.Sku = append(EsGoods.Sku, domain.EsSku{\n\t\t\t\t\tSkuID:    skuInfo.ID,\n\t\t\t\t\tSkuName:  skuInfo.SkuName,\n\t\t\t\t\tSkuPrice: skuInfo.Price,\n\t\t\t\t})\n\t\t\t\tEsGoods.BrandsID = brand.ID\n\t\t\t\tEsGoods.BrandName = brand.Name\n\t\t\t\tEsGoods.CategoryID = cate.ID\n\t\t\t\tEsGoods.CategoryName = cate.Name\n\t\t\t\tEsGoods.TypeID = goodsType.ID\n\t\t\t\tEsGoods.TypeName = goodsType.Name\n\t\t\t\tEsGoods.Name = goodsType.Name\n\t\t\t\tEsGoods.ID = goods.ID\n\t\t\t\tEsGoods.OnSale = goods.OnSale\n\t\t\t\tEsGoods.ShipFree = goods.ShipFree\n\t\t\t\tEsGoods.IsNew = goods.IsNew\n\t\t\t\tEsGoods.IsHot = goods.IsHot\n\t\t\t\tEsGoods.Name = goods.Name\n\t\t\t\tEsGoods.GoodsTags = goods.GoodsTags\n\t\t\t\tEsGoods.ClickNum = goods.ClickNum\n\t\t\t\tEsGoods.SoldNum = goods.SoldNum\n\t\t\t\tEsGoods.FavNum = goods.FavNum\n\t\t\t\tEsGoods.MarketPrice = goods.MarketPrice\n\t\t\t\tEsGoods.GoodsBrief = goods.GoodsBrief\n\n\t\t\t}\n\t\t\tfmt.Println(\"EsGoods\", EsGoods)\n\t\t\t// 插入 EsGoods\n\t\t\terr = g.esGoodsRepo.InsertEsGoods(ctx, EsGoods)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t})\n\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &domain.GoodsInfoResponse{GoodsID: goods.ID}, nil\n}\n"
  },
  {
    "path": "service/goods/internal/biz/goods_attr.go",
    "content": "package biz\n\nimport (\n\t\"context\"\n\t\"goods/internal/domain\"\n\n\t\"github.com/go-kratos/kratos/v2/errors\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n)\n\ntype GoodsAttrRepo interface {\n\tCreateGoodsGroupAttr(context.Context, *domain.AttrGroup) (*domain.AttrGroup, error)\n\tIsExistsGroupByID(ctx context.Context, id int64) (*domain.AttrGroup, error)\n\tCreateGoodsAttr(context.Context, *domain.GoodsAttr) (*domain.GoodsAttr, error)\n\tCreateGoodsAttrValue(context.Context, []*domain.GoodsAttrValue) ([]*domain.GoodsAttrValue, error)\n\tGetAttrByIDs(ctx context.Context, id []*int64) error\n\tListByIds(ctx context.Context, id ...int64) (domain.GoodsAttrList, error)\n}\n\ntype GoodsAttrUsecase struct {\n\trepo     GoodsAttrRepo\n\ttypeRepo GoodsTypeRepo // 引入goods type 的 repo\n\ttx       Transaction   // 引入事务\n\tlog      *log.Helper\n}\n\nfunc NewGoodsAttrUsecase(repo GoodsAttrRepo, tx Transaction, gRepo GoodsTypeRepo, logger log.Logger) *GoodsAttrUsecase {\n\treturn &GoodsAttrUsecase{\n\t\trepo:     repo,\n\t\ttx:       tx,\n\t\ttypeRepo: gRepo,\n\t\tlog:      log.NewHelper(logger),\n\t}\n}\n\nfunc (ga *GoodsAttrUsecase) CreateAttrGroup(ctx context.Context, r *domain.AttrGroup) (*domain.AttrGroup, error) {\n\tif r.IsTypeIDEmpty() {\n\t\treturn nil, errors.InternalServer(\"TYPE_IS_EMPTY\", \"请选择商品类型进行绑定\")\n\t}\n\n\t_, err := ga.typeRepo.IsExistsByID(ctx, r.TypeID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tattr, err := ga.repo.CreateGoodsGroupAttr(ctx, r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn attr, nil\n}\n\n// CreateAttrValue 创建商品属性和属性信息\nfunc (ga *GoodsAttrUsecase) CreateAttrValue(ctx context.Context, r *domain.GoodsAttr) (*domain.GoodsAttr, error) {\n\tvar (\n\t\tattrInfo  *domain.GoodsAttr\n\t\tattrValue []*domain.GoodsAttrValue\n\t\terr       error\n\t)\n\tif r.IsTypeIDEmpty() {\n\t\treturn nil, errors.InternalServer(\"TYPE_IS_EMPTY\", \"请选择商品类型进行绑定\")\n\t}\n\n\t_, err = ga.typeRepo.IsExistsByID(ctx, r.TypeID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t_, err = ga.repo.IsExistsGroupByID(ctx, r.GroupID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\terr = ga.tx.ExecTx(ctx, func(ctx context.Context) error {\n\t\tattrInfo, err = ga.repo.CreateGoodsAttr(ctx, r)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tvar value []*domain.GoodsAttrValue\n\t\tfor _, v := range r.GoodsAttrValue {\n\t\t\tif v.IsValueEmpty() {\n\t\t\t\treturn errors.InternalServer(\"ATTR_IS_EMPTY\", \"商品属性不能为空\")\n\t\t\t}\n\t\t\tres := &domain.GoodsAttrValue{\n\t\t\t\tAttrId:  attrInfo.ID,\n\t\t\t\tGroupID: v.GroupID,\n\t\t\t\tValue:   v.Value,\n\t\t\t}\n\t\t\tvalue = append(value, res)\n\t\t}\n\t\tattrValue, err = ga.repo.CreateGoodsAttrValue(ctx, value)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &domain.GoodsAttr{\n\t\tID:             attrInfo.ID,\n\t\tTypeID:         attrInfo.TypeID,\n\t\tGroupID:        attrInfo.GroupID,\n\t\tTitle:          attrInfo.Title,\n\t\tSort:           attrInfo.Sort,\n\t\tStatus:         attrInfo.Status,\n\t\tDesc:           attrInfo.Desc,\n\t\tGoodsAttrValue: attrValue,\n\t}, nil\n}\n"
  },
  {
    "path": "service/goods/internal/biz/goods_image.go",
    "content": "package biz\n\nimport (\n\t\"context\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"goods/internal/domain\"\n)\n\ntype GoodsImages struct {\n\tHello string\n}\n\ntype GoodsImagesRepo interface {\n\tCreateGreeter(context.Context, *domain.Goods) error\n\tUpdateGreeter(context.Context, *domain.Goods) error\n}\n\ntype GoodsImageUsecase struct {\n\trepo GoodsImagesRepo\n\tlog  *log.Helper\n}\n\nfunc NewGoodsImagesUsecase(repo GoodsImagesRepo, logger log.Logger) *GoodsImageUsecase {\n\treturn &GoodsImageUsecase{repo: repo, log: log.NewHelper(logger)}\n}\n"
  },
  {
    "path": "service/goods/internal/biz/goods_sku.go",
    "content": "package biz\n\nimport (\n\t\"context\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"goods/internal/domain\"\n)\n\ntype Sku struct {\n\tID             int64\n\tGoodsID        int64\n\tGoodsSn        string\n\tGoodsName      string\n\tSkuName        string\n\tSkuCode        string\n\tBarCode        string\n\tPrice          int64\n\tPromotionPrice int64\n\tPoints         int64\n\tRemarksInfo    string\n\tPic            string\n\tInventory      int64\n\tOnSale         bool\n\tAttrInfo       string\n}\n\ntype GoodsSkuRepo interface {\n\tCreate(context.Context, *domain.GoodsSku) (*domain.GoodsSku, error)\n\tCreateSkuRelation(context.Context, []*domain.GoodsSpecificationSku) error\n}\n\ntype GoodsSkuUsecase struct {\n\trepo GoodsSkuRepo\n\tlog  *log.Helper\n}\n\nfunc NewGoodsSkuUsecase(repo GoodsSkuRepo, logger log.Logger) *GoodsSkuUsecase {\n\treturn &GoodsSkuUsecase{repo: repo, log: log.NewHelper(logger)}\n}\n"
  },
  {
    "path": "service/goods/internal/biz/goods_type.go",
    "content": "package biz\n\nimport (\n\t\"context\"\n\t\"goods/internal/domain\"\n\n\t\"github.com/go-kratos/kratos/v2/errors\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n)\n\ntype GoodsTypeRepo interface {\n\tCreateGoodsType(context.Context, *domain.GoodsType) (int64, error)\n\tCreateGoodsBrandType(context.Context, int64, string) error\n\tGetGoodsTypeByID(context.Context, int64) (*domain.GoodsType, error)\n\tIsExistsByID(context.Context, int64) (*domain.GoodsType, error)\n}\n\ntype GoodsTypeUsecase struct {\n\trepo  GoodsTypeRepo\n\tbRepo BrandRepo\n\ttx    Transaction\n\tlog   *log.Helper\n}\n\nfunc NewGoodsTypeUsecase(repo GoodsTypeRepo, tx Transaction, BrandUc BrandRepo, logger log.Logger) *GoodsTypeUsecase {\n\treturn &GoodsTypeUsecase{\n\t\trepo:  repo,\n\t\ttx:    tx,\n\t\tbRepo: BrandUc,\n\t\tlog:   log.NewHelper(logger),\n\t}\n}\n\n// GoosTypeCreate 创建商品类型\nfunc (gt *GoodsTypeUsecase) GoosTypeCreate(ctx context.Context, r *domain.GoodsType) (int64, error) {\n\tvar (\n\t\tid  int64\n\t\terr error\n\t)\n\n\tif r.IsEmpty() {\n\t\treturn id, errors.InternalServer(\"TYPE_IS_EMPTY\", \"请选择品牌进行绑定\")\n\t}\n\n\ti, err := r.FormatBrandIds()\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tbrand, err := gt.bRepo.ListByIds(ctx, i...)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tif !brand.CheckLength(len(i)) {\n\t\treturn 0, errors.InternalServer(\"BRAND_IS_EMPTY\", \"品牌不存在\")\n\t}\n\n\t// 使用事务\n\terr = gt.tx.ExecTx(ctx, func(ctx context.Context) error {\n\t\tid, err = gt.repo.CreateGoodsType(ctx, r)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t// 创建商品类型关联关系表\n\t\terr = gt.repo.CreateGoodsBrandType(ctx, id, r.BrandIds)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n\treturn id, err\n}\n"
  },
  {
    "path": "service/goods/internal/biz/inventory.go",
    "content": "package biz\n\nimport (\n\t\"context\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"goods/internal/domain\"\n)\n\ntype InventoryRepo interface {\n\tCreate(context.Context, *domain.Inventory) (*domain.Inventory, error)\n}\n\ntype InventoryUsecase struct {\n\trepo InventoryRepo\n\tlog  *log.Helper\n}\n\nfunc NewInventoryUsecase(repo InventoryRepo, logger log.Logger) *InventoryUsecase {\n\treturn &InventoryUsecase{repo: repo, log: log.NewHelper(logger)}\n}\n"
  },
  {
    "path": "service/goods/internal/biz/specifications.go",
    "content": "package biz\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"goods/internal/domain\"\n\n\t\"github.com/go-kratos/kratos/v2/log\"\n)\n\ntype SpecificationRepo interface {\n\tCreateSpecification(context.Context, *domain.Specification) (int64, error)\n\tCreateSpecificationValue(context.Context, int64, []*domain.SpecificationValue) error\n\tListByIds(ctx context.Context, id ...*int64) (domain.SpecificationList, error)\n}\n\ntype SpecificationUsecase struct {\n\trepo  SpecificationRepo\n\tgRepo GoodsTypeRepo\n\ttx    Transaction\n\tlog   *log.Helper\n}\n\nfunc NewSpecificationUsecase(repo SpecificationRepo, TypeUc GoodsTypeRepo, tx Transaction,\n\tlogger log.Logger) *SpecificationUsecase {\n\n\treturn &SpecificationUsecase{\n\t\trepo:  repo,\n\t\tgRepo: TypeUc,\n\t\ttx:    tx,\n\t\tlog:   log.NewHelper(logger),\n\t}\n}\n\n// CreateSpecification 创建商品规格\nfunc (s *SpecificationUsecase) CreateSpecification(ctx context.Context, r *domain.Specification) (int64, error) {\n\tvar (\n\t\tid  int64\n\t\terr error\n\t)\n\n\tif r.IsTypeIDEmpty() {\n\t\treturn id, errors.New(\"请选择商品类型进行绑定\")\n\t}\n\n\tif r.IsValueEmpty() {\n\t\treturn id, errors.New(\"请填写商品规格下的参数\")\n\t}\n\n\t// 去查询有没有这个类型\n\t_, err = s.gRepo.IsExistsByID(ctx, r.TypeID)\n\tif err != nil {\n\t\treturn id, err\n\t}\n\n\t// 使用事务\n\terr = s.tx.ExecTx(ctx, func(ctx context.Context) error {\n\t\tid, err = s.repo.CreateSpecification(ctx, r) // 插入选项\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\terr = s.repo.CreateSpecificationValue(ctx, id, r.SpecificationValue) // 插入选项对应的值\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n\treturn id, err\n}\n"
  },
  {
    "path": "service/goods/internal/conf/conf.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.0\n// \tprotoc        v3.19.4\n// source: internal/conf/conf.proto\n\npackage conf\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tdurationpb \"google.golang.org/protobuf/types/known/durationpb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Bootstrap struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tServer *Server `protobuf:\"bytes,1,opt,name=server,proto3\" json:\"server,omitempty\"`\n\tData   *Data   `protobuf:\"bytes,2,opt,name=data,proto3\" json:\"data,omitempty\"`\n\tTrace  *Trace  `protobuf:\"bytes,3,opt,name=trace,proto3\" json:\"trace,omitempty\"`\n}\n\nfunc (x *Bootstrap) Reset() {\n\t*x = Bootstrap{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Bootstrap) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Bootstrap) ProtoMessage() {}\n\nfunc (x *Bootstrap) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Bootstrap.ProtoReflect.Descriptor instead.\nfunc (*Bootstrap) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Bootstrap) GetServer() *Server {\n\tif x != nil {\n\t\treturn x.Server\n\t}\n\treturn nil\n}\n\nfunc (x *Bootstrap) GetData() *Data {\n\tif x != nil {\n\t\treturn x.Data\n\t}\n\treturn nil\n}\n\nfunc (x *Bootstrap) GetTrace() *Trace {\n\tif x != nil {\n\t\treturn x.Trace\n\t}\n\treturn nil\n}\n\ntype Server struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tHttp *Server_HTTP `protobuf:\"bytes,1,opt,name=http,proto3\" json:\"http,omitempty\"`\n\tGrpc *Server_GRPC `protobuf:\"bytes,2,opt,name=grpc,proto3\" json:\"grpc,omitempty\"`\n}\n\nfunc (x *Server) Reset() {\n\t*x = Server{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Server) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Server) ProtoMessage() {}\n\nfunc (x *Server) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Server.ProtoReflect.Descriptor instead.\nfunc (*Server) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Server) GetHttp() *Server_HTTP {\n\tif x != nil {\n\t\treturn x.Http\n\t}\n\treturn nil\n}\n\nfunc (x *Server) GetGrpc() *Server_GRPC {\n\tif x != nil {\n\t\treturn x.Grpc\n\t}\n\treturn nil\n}\n\ntype Data struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tDatabase *Data_Database `protobuf:\"bytes,1,opt,name=database,proto3\" json:\"database,omitempty\"`\n\tRedis    *Data_Redis    `protobuf:\"bytes,2,opt,name=redis,proto3\" json:\"redis,omitempty\"`\n\tElastic  *Data_Elastic  `protobuf:\"bytes,3,opt,name=elastic,proto3\" json:\"elastic,omitempty\"`\n}\n\nfunc (x *Data) Reset() {\n\t*x = Data{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Data) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Data) ProtoMessage() {}\n\nfunc (x *Data) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Data.ProtoReflect.Descriptor instead.\nfunc (*Data) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *Data) GetDatabase() *Data_Database {\n\tif x != nil {\n\t\treturn x.Database\n\t}\n\treturn nil\n}\n\nfunc (x *Data) GetRedis() *Data_Redis {\n\tif x != nil {\n\t\treturn x.Redis\n\t}\n\treturn nil\n}\n\nfunc (x *Data) GetElastic() *Data_Elastic {\n\tif x != nil {\n\t\treturn x.Elastic\n\t}\n\treturn nil\n}\n\ntype Registry struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tConsul *Registry_Consul `protobuf:\"bytes,1,opt,name=consul,proto3\" json:\"consul,omitempty\"`\n}\n\nfunc (x *Registry) Reset() {\n\t*x = Registry{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Registry) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Registry) ProtoMessage() {}\n\nfunc (x *Registry) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Registry.ProtoReflect.Descriptor instead.\nfunc (*Registry) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *Registry) GetConsul() *Registry_Consul {\n\tif x != nil {\n\t\treturn x.Consul\n\t}\n\treturn nil\n}\n\ntype Trace struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEndpoint string `protobuf:\"bytes,1,opt,name=endpoint,proto3\" json:\"endpoint,omitempty\"`\n}\n\nfunc (x *Trace) Reset() {\n\t*x = Trace{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Trace) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Trace) ProtoMessage() {}\n\nfunc (x *Trace) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Trace.ProtoReflect.Descriptor instead.\nfunc (*Trace) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *Trace) GetEndpoint() string {\n\tif x != nil {\n\t\treturn x.Endpoint\n\t}\n\treturn \"\"\n}\n\ntype Server_HTTP struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tNetwork string               `protobuf:\"bytes,1,opt,name=network,proto3\" json:\"network,omitempty\"`\n\tAddr    string               `protobuf:\"bytes,2,opt,name=addr,proto3\" json:\"addr,omitempty\"`\n\tTimeout *durationpb.Duration `protobuf:\"bytes,3,opt,name=timeout,proto3\" json:\"timeout,omitempty\"`\n}\n\nfunc (x *Server_HTTP) Reset() {\n\t*x = Server_HTTP{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Server_HTTP) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Server_HTTP) ProtoMessage() {}\n\nfunc (x *Server_HTTP) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Server_HTTP.ProtoReflect.Descriptor instead.\nfunc (*Server_HTTP) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{1, 0}\n}\n\nfunc (x *Server_HTTP) GetNetwork() string {\n\tif x != nil {\n\t\treturn x.Network\n\t}\n\treturn \"\"\n}\n\nfunc (x *Server_HTTP) GetAddr() string {\n\tif x != nil {\n\t\treturn x.Addr\n\t}\n\treturn \"\"\n}\n\nfunc (x *Server_HTTP) GetTimeout() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.Timeout\n\t}\n\treturn nil\n}\n\ntype Server_GRPC struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tNetwork string               `protobuf:\"bytes,1,opt,name=network,proto3\" json:\"network,omitempty\"`\n\tAddr    string               `protobuf:\"bytes,2,opt,name=addr,proto3\" json:\"addr,omitempty\"`\n\tTimeout *durationpb.Duration `protobuf:\"bytes,3,opt,name=timeout,proto3\" json:\"timeout,omitempty\"`\n}\n\nfunc (x *Server_GRPC) Reset() {\n\t*x = Server_GRPC{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Server_GRPC) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Server_GRPC) ProtoMessage() {}\n\nfunc (x *Server_GRPC) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Server_GRPC.ProtoReflect.Descriptor instead.\nfunc (*Server_GRPC) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{1, 1}\n}\n\nfunc (x *Server_GRPC) GetNetwork() string {\n\tif x != nil {\n\t\treturn x.Network\n\t}\n\treturn \"\"\n}\n\nfunc (x *Server_GRPC) GetAddr() string {\n\tif x != nil {\n\t\treturn x.Addr\n\t}\n\treturn \"\"\n}\n\nfunc (x *Server_GRPC) GetTimeout() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.Timeout\n\t}\n\treturn nil\n}\n\ntype Data_Database struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tDriver string `protobuf:\"bytes,1,opt,name=driver,proto3\" json:\"driver,omitempty\"`\n\tSource string `protobuf:\"bytes,2,opt,name=source,proto3\" json:\"source,omitempty\"`\n}\n\nfunc (x *Data_Database) Reset() {\n\t*x = Data_Database{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Data_Database) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Data_Database) ProtoMessage() {}\n\nfunc (x *Data_Database) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Data_Database.ProtoReflect.Descriptor instead.\nfunc (*Data_Database) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{2, 0}\n}\n\nfunc (x *Data_Database) GetDriver() string {\n\tif x != nil {\n\t\treturn x.Driver\n\t}\n\treturn \"\"\n}\n\nfunc (x *Data_Database) GetSource() string {\n\tif x != nil {\n\t\treturn x.Source\n\t}\n\treturn \"\"\n}\n\ntype Data_Redis struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tNetwork      string               `protobuf:\"bytes,1,opt,name=network,proto3\" json:\"network,omitempty\"`\n\tAddr         string               `protobuf:\"bytes,2,opt,name=addr,proto3\" json:\"addr,omitempty\"`\n\tPassword     string               `protobuf:\"bytes,3,opt,name=password,proto3\" json:\"password,omitempty\"`\n\tDb           int32                `protobuf:\"varint,4,opt,name=db,proto3\" json:\"db,omitempty\"`\n\tDialTimeout  *durationpb.Duration `protobuf:\"bytes,5,opt,name=dial_timeout,json=dialTimeout,proto3\" json:\"dial_timeout,omitempty\"`\n\tReadTimeout  *durationpb.Duration `protobuf:\"bytes,6,opt,name=read_timeout,json=readTimeout,proto3\" json:\"read_timeout,omitempty\"`\n\tWriteTimeout *durationpb.Duration `protobuf:\"bytes,7,opt,name=write_timeout,json=writeTimeout,proto3\" json:\"write_timeout,omitempty\"`\n}\n\nfunc (x *Data_Redis) Reset() {\n\t*x = Data_Redis{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[8]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Data_Redis) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Data_Redis) ProtoMessage() {}\n\nfunc (x *Data_Redis) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[8]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Data_Redis.ProtoReflect.Descriptor instead.\nfunc (*Data_Redis) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{2, 1}\n}\n\nfunc (x *Data_Redis) GetNetwork() string {\n\tif x != nil {\n\t\treturn x.Network\n\t}\n\treturn \"\"\n}\n\nfunc (x *Data_Redis) GetAddr() string {\n\tif x != nil {\n\t\treturn x.Addr\n\t}\n\treturn \"\"\n}\n\nfunc (x *Data_Redis) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *Data_Redis) GetDb() int32 {\n\tif x != nil {\n\t\treturn x.Db\n\t}\n\treturn 0\n}\n\nfunc (x *Data_Redis) GetDialTimeout() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.DialTimeout\n\t}\n\treturn nil\n}\n\nfunc (x *Data_Redis) GetReadTimeout() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.ReadTimeout\n\t}\n\treturn nil\n}\n\nfunc (x *Data_Redis) GetWriteTimeout() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.WriteTimeout\n\t}\n\treturn nil\n}\n\ntype Data_Elastic struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tAddr string `protobuf:\"bytes,1,opt,name=addr,proto3\" json:\"addr,omitempty\"`\n}\n\nfunc (x *Data_Elastic) Reset() {\n\t*x = Data_Elastic{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[9]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Data_Elastic) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Data_Elastic) ProtoMessage() {}\n\nfunc (x *Data_Elastic) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[9]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Data_Elastic.ProtoReflect.Descriptor instead.\nfunc (*Data_Elastic) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{2, 2}\n}\n\nfunc (x *Data_Elastic) GetAddr() string {\n\tif x != nil {\n\t\treturn x.Addr\n\t}\n\treturn \"\"\n}\n\ntype Registry_Consul struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tAddress string `protobuf:\"bytes,1,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tScheme  string `protobuf:\"bytes,2,opt,name=scheme,proto3\" json:\"scheme,omitempty\"`\n}\n\nfunc (x *Registry_Consul) Reset() {\n\t*x = Registry_Consul{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[10]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Registry_Consul) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Registry_Consul) ProtoMessage() {}\n\nfunc (x *Registry_Consul) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[10]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Registry_Consul.ProtoReflect.Descriptor instead.\nfunc (*Registry_Consul) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{3, 0}\n}\n\nfunc (x *Registry_Consul) GetAddress() string {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn \"\"\n}\n\nfunc (x *Registry_Consul) GetScheme() string {\n\tif x != nil {\n\t\treturn x.Scheme\n\t}\n\treturn \"\"\n}\n\nvar File_internal_conf_conf_proto protoreflect.FileDescriptor\n\nvar file_internal_conf_conf_proto_rawDesc = []byte{\n\t0x0a, 0x18, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x2f,\n\t0x63, 0x6f, 0x6e, 0x66, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x09, 0x67, 0x6f, 0x6f, 0x64,\n\t0x73, 0x2e, 0x61, 0x70, 0x69, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x83, 0x01, 0x0a, 0x09, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74,\n\t0x72, 0x61, 0x70, 0x12, 0x29, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e,\n\t0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x23,\n\t0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x64,\n\t0x61, 0x74, 0x61, 0x12, 0x26, 0x0a, 0x05, 0x74, 0x72, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x10, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x54,\n\t0x72, 0x61, 0x63, 0x65, 0x52, 0x05, 0x74, 0x72, 0x61, 0x63, 0x65, 0x22, 0xb6, 0x02, 0x0a, 0x06,\n\t0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x04, 0x68, 0x74, 0x74, 0x70, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x61, 0x70, 0x69,\n\t0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x52, 0x04, 0x68, 0x74,\n\t0x74, 0x70, 0x12, 0x2a, 0x0a, 0x04, 0x67, 0x72, 0x70, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72,\n\t0x76, 0x65, 0x72, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x52, 0x04, 0x67, 0x72, 0x70, 0x63, 0x1a, 0x69,\n\t0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72,\n\t0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b,\n\t0x12, 0x12, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,\n\t0x61, 0x64, 0x64, 0x72, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18,\n\t0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x1a, 0x69, 0x0a, 0x04, 0x47, 0x52, 0x50,\n\t0x43, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x61,\n\t0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12,\n\t0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,\n\t0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d,\n\t0x65, 0x6f, 0x75, 0x74, 0x22, 0x97, 0x04, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x34, 0x0a,\n\t0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x61, 0x74, 0x61,\n\t0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62,\n\t0x61, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x05, 0x72, 0x65, 0x64, 0x69, 0x73, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44,\n\t0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x52, 0x05, 0x72, 0x65, 0x64, 0x69, 0x73,\n\t0x12, 0x31, 0x0a, 0x07, 0x65, 0x6c, 0x61, 0x73, 0x74, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x61,\n\t0x74, 0x61, 0x2e, 0x45, 0x6c, 0x61, 0x73, 0x74, 0x69, 0x63, 0x52, 0x07, 0x65, 0x6c, 0x61, 0x73,\n\t0x74, 0x69, 0x63, 0x1a, 0x3a, 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12,\n\t0x16, 0x0a, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63,\n\t0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a,\n\t0x9d, 0x02, 0x0a, 0x05, 0x52, 0x65, 0x64, 0x69, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x65, 0x74,\n\t0x77, 0x6f, 0x72, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77,\n\t0x6f, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77,\n\t0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77,\n\t0x6f, 0x72, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x64, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52,\n\t0x02, 0x64, 0x62, 0x12, 0x3c, 0x0a, 0x0c, 0x64, 0x69, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65,\n\t0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75,\n\t0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75,\n\t0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x52, 0x0b, 0x72, 0x65, 0x61, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12,\n\t0x3e, 0x0a, 0x0d, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74,\n\t0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x52, 0x0c, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x1a,\n\t0x1d, 0x0a, 0x07, 0x45, 0x6c, 0x61, 0x73, 0x74, 0x69, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x64,\n\t0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x22, 0x7a,\n\t0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x12, 0x32, 0x0a, 0x06, 0x63, 0x6f,\n\t0x6e, 0x73, 0x75, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x64, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e,\n\t0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x1a, 0x3a,\n\t0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72,\n\t0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65,\n\t0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x22, 0x23, 0x0a, 0x05, 0x54, 0x72,\n\t0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x42,\n\t0x1a, 0x5a, 0x18, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61,\n\t0x6c, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x3b, 0x63, 0x6f, 0x6e, 0x66, 0x62, 0x06, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_internal_conf_conf_proto_rawDescOnce sync.Once\n\tfile_internal_conf_conf_proto_rawDescData = file_internal_conf_conf_proto_rawDesc\n)\n\nfunc file_internal_conf_conf_proto_rawDescGZIP() []byte {\n\tfile_internal_conf_conf_proto_rawDescOnce.Do(func() {\n\t\tfile_internal_conf_conf_proto_rawDescData = protoimpl.X.CompressGZIP(file_internal_conf_conf_proto_rawDescData)\n\t})\n\treturn file_internal_conf_conf_proto_rawDescData\n}\n\nvar file_internal_conf_conf_proto_msgTypes = make([]protoimpl.MessageInfo, 11)\nvar file_internal_conf_conf_proto_goTypes = []interface{}{\n\t(*Bootstrap)(nil),           // 0: goods.api.Bootstrap\n\t(*Server)(nil),              // 1: goods.api.Server\n\t(*Data)(nil),                // 2: goods.api.Data\n\t(*Registry)(nil),            // 3: goods.api.Registry\n\t(*Trace)(nil),               // 4: goods.api.Trace\n\t(*Server_HTTP)(nil),         // 5: goods.api.Server.HTTP\n\t(*Server_GRPC)(nil),         // 6: goods.api.Server.GRPC\n\t(*Data_Database)(nil),       // 7: goods.api.Data.Database\n\t(*Data_Redis)(nil),          // 8: goods.api.Data.Redis\n\t(*Data_Elastic)(nil),        // 9: goods.api.Data.Elastic\n\t(*Registry_Consul)(nil),     // 10: goods.api.Registry.Consul\n\t(*durationpb.Duration)(nil), // 11: google.protobuf.Duration\n}\nvar file_internal_conf_conf_proto_depIdxs = []int32{\n\t1,  // 0: goods.api.Bootstrap.server:type_name -> goods.api.Server\n\t2,  // 1: goods.api.Bootstrap.data:type_name -> goods.api.Data\n\t4,  // 2: goods.api.Bootstrap.trace:type_name -> goods.api.Trace\n\t5,  // 3: goods.api.Server.http:type_name -> goods.api.Server.HTTP\n\t6,  // 4: goods.api.Server.grpc:type_name -> goods.api.Server.GRPC\n\t7,  // 5: goods.api.Data.database:type_name -> goods.api.Data.Database\n\t8,  // 6: goods.api.Data.redis:type_name -> goods.api.Data.Redis\n\t9,  // 7: goods.api.Data.elastic:type_name -> goods.api.Data.Elastic\n\t10, // 8: goods.api.Registry.consul:type_name -> goods.api.Registry.Consul\n\t11, // 9: goods.api.Server.HTTP.timeout:type_name -> google.protobuf.Duration\n\t11, // 10: goods.api.Server.GRPC.timeout:type_name -> google.protobuf.Duration\n\t11, // 11: goods.api.Data.Redis.dial_timeout:type_name -> google.protobuf.Duration\n\t11, // 12: goods.api.Data.Redis.read_timeout:type_name -> google.protobuf.Duration\n\t11, // 13: goods.api.Data.Redis.write_timeout:type_name -> google.protobuf.Duration\n\t14, // [14:14] is the sub-list for method output_type\n\t14, // [14:14] is the sub-list for method input_type\n\t14, // [14:14] is the sub-list for extension type_name\n\t14, // [14:14] is the sub-list for extension extendee\n\t0,  // [0:14] is the sub-list for field type_name\n}\n\nfunc init() { file_internal_conf_conf_proto_init() }\nfunc file_internal_conf_conf_proto_init() {\n\tif File_internal_conf_conf_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_internal_conf_conf_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Bootstrap); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Server); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Data); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Registry); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Trace); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Server_HTTP); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Server_GRPC); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Data_Database); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Data_Redis); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Data_Elastic); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Registry_Consul); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_internal_conf_conf_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   11,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_internal_conf_conf_proto_goTypes,\n\t\tDependencyIndexes: file_internal_conf_conf_proto_depIdxs,\n\t\tMessageInfos:      file_internal_conf_conf_proto_msgTypes,\n\t}.Build()\n\tFile_internal_conf_conf_proto = out.File\n\tfile_internal_conf_conf_proto_rawDesc = nil\n\tfile_internal_conf_conf_proto_goTypes = nil\n\tfile_internal_conf_conf_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "service/goods/internal/conf/conf.proto",
    "content": "syntax = \"proto3\";\npackage goods.api;\n\noption go_package = \"goods/internal/conf;conf\";\n\nimport \"google/protobuf/duration.proto\";\n\nmessage Bootstrap {\n  Server server = 1;\n  Data data = 2;\n  Trace trace = 3;\n}\n\nmessage Server {\n  message HTTP {\n    string network = 1;\n    string addr = 2;\n    google.protobuf.Duration timeout = 3;\n  }\n  message GRPC {\n    string network = 1;\n    string addr = 2;\n    google.protobuf.Duration timeout = 3;\n  }\n  HTTP http = 1;\n  GRPC grpc = 2;\n}\n\nmessage Data {\n  message Database {\n    string driver = 1;\n    string source = 2;\n  }\n  message Redis {\n    string network = 1;\n    string addr = 2;\n    string password = 3;\n    int32 db = 4;\n    google.protobuf.Duration dial_timeout = 5;\n    google.protobuf.Duration read_timeout = 6;\n    google.protobuf.Duration write_timeout = 7;\n  }\n  message Elastic {\n    string addr = 1;\n  }\n  Database database = 1;\n  Redis redis = 2;\n  Elastic elastic = 3;\n}\n\nmessage Registry {\n  message Consul {\n    string address = 1;\n    string scheme = 2;\n  }\n  Consul consul = 1;\n}\n\nmessage Trace {\n  string endpoint = 1;\n}"
  },
  {
    "path": "service/goods/internal/data/README.md",
    "content": "# Data\n"
  },
  {
    "path": "service/goods/internal/data/base.go",
    "content": "package data\n\nimport (\n\t\"database/sql/driver\"\n\t\"encoding/json\"\n\t\"gorm.io/gorm\"\n\t\"time\"\n)\n\ntype GormList []string\n\nfunc (g GormList) Value() (driver.Value, error) {\n\treturn json.Marshal(g)\n}\n\nfunc (g *GormList) Scan(value interface{}) error {\n\treturn json.Unmarshal(value.([]byte), &g)\n}\n\ntype BaseFields struct {\n\tID        int64          `gorm:\"primarykey;type:int\" json:\"id\"` // bigint\n\tCreatedAt time.Time      `gorm:\"column:add_time\" json:\"created_at\"`\n\tUpdatedAt time.Time      `gorm:\"column:update_time\" json:\"updated_at\"`\n\tDeletedAt gorm.DeletedAt `json:\"deleted_at\"`\n}\n\n// Paginate 分页\nfunc Paginate(page, pageSize int) func(db *gorm.DB) *gorm.DB {\n\treturn func(db *gorm.DB) *gorm.DB {\n\t\tif page == 0 {\n\t\t\tpage = 1\n\t\t}\n\t\tswitch {\n\t\tcase pageSize > 100:\n\t\t\tpageSize = 100\n\t\tcase pageSize <= 0:\n\t\t\tpageSize = 10\n\t\t}\n\n\t\toffset := (page - 1) * pageSize\n\t\treturn db.Offset(offset).Limit(pageSize)\n\t}\n}\n"
  },
  {
    "path": "service/goods/internal/data/brand.go",
    "content": "package data\n\nimport (\n\t\"context\"\n\t\"github.com/go-kratos/kratos/v2/errors\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"goods/internal/biz\"\n\t\"goods/internal/domain\"\n\t\"gorm.io/gorm\"\n\t\"time\"\n)\n\n// Brand 商品品牌表\ntype Brand struct {\n\tID        int32          `gorm:\"primarykey;type:int\" json:\"id\"`\n\tName      string         `gorm:\"type:varchar(50);not null;comment:品牌名称\" json:\"name\"`\n\tLogo      string         `gorm:\"type:varchar(200);default:;comment:品牌Logo图片\"`\n\tDesc      string         `gorm:\"type:varchar(500);default:;comment:品牌描述\"`\n\tIsTab     bool           `gorm:\"comment:是否显示;default:false\" json:\"is_tab\"`\n\tSort      int32          `gorm:\"comment:品牌排序;default:99;not null;type:int\" json:\"sort\"`\n\tCreatedAt time.Time      `gorm:\"column:add_time\" json:\"created_at\"`\n\tUpdatedAt time.Time      `gorm:\"column:update_time\" json:\"updated_at\"`\n\tDeletedAt gorm.DeletedAt `json:\"deleted_at\"`\n}\n\nfunc (p *Brand) ToDomain() *domain.Brand {\n\treturn &domain.Brand{\n\t\tID:    p.ID,\n\t\tName:  p.Name,\n\t\tLogo:  p.Logo,\n\t\tDesc:  p.Desc,\n\t\tIsTab: p.IsTab,\n\t\tSort:  p.Sort,\n\t}\n}\n\ntype BrandRepo struct {\n\tdata *Data\n\tlog  *log.Helper\n}\n\n// NewBrandRepo .\nfunc NewBrandRepo(data *Data, logger log.Logger) biz.BrandRepo {\n\treturn &BrandRepo{\n\t\tdata: data,\n\t\tlog:  log.NewHelper(logger),\n\t}\n}\n\nfunc (r *BrandRepo) Create(ctx context.Context, b *domain.Brand) (*domain.Brand, error) {\n\tbrand := &Brand{\n\t\tName:  b.Name,\n\t\tLogo:  b.Logo,\n\t\tDesc:  b.Desc,\n\t\tIsTab: b.IsTab,\n\t\tSort:  b.Sort,\n\t}\n\tif err := r.data.db.Save(brand).Error; err != nil {\n\t\treturn nil, errors.InternalServer(\"SAVE_BRAND_ERROR\", err.Error())\n\t}\n\tres := &domain.Brand{\n\t\tID:    brand.ID,\n\t\tName:  brand.Name,\n\t\tLogo:  brand.Logo,\n\t\tDesc:  brand.Desc,\n\t\tIsTab: brand.IsTab,\n\t\tSort:  brand.Sort,\n\t}\n\treturn res, nil\n}\n\nfunc (r *BrandRepo) GetBradByName(ctx context.Context, name string) (*domain.Brand, error) {\n\tvar brand Brand\n\tresult := r.data.db.Where(\"name=?\", name).First(&brand)\n\tif errors.Is(result.Error, gorm.ErrRecordNotFound) {\n\t\treturn nil, errors.NotFound(\"BRAND_NOT_FOUND\", \"brand not found\")\n\t}\n\tif result.RowsAffected == 1 {\n\t\treturn &domain.Brand{\n\t\t\tID:    brand.ID,\n\t\t\tName:  brand.Name,\n\t\t\tLogo:  brand.Logo,\n\t\t\tDesc:  brand.Desc,\n\t\t\tIsTab: brand.IsTab,\n\t\t\tSort:  brand.Sort,\n\t\t}, nil\n\t} else {\n\t\treturn nil, errors.NotFound(\"BRAND_NOT_FOUND\", \"brand not found\")\n\t}\n}\n\nfunc (r *BrandRepo) Update(ctx context.Context, b *domain.Brand) error {\n\tbrands := Brand{}\n\tif result := r.data.db.Where(\"id=?\", b.ID).First(&brands); result.RowsAffected == 0 {\n\t\treturn errors.NotFound(\"BRAND_NOT_FOUND\", \"brand not found\")\n\t}\n\n\tif b.Name != \"\" {\n\t\tbrands.Name = b.Name\n\t}\n\tif b.Logo != \"\" {\n\t\tbrands.Logo = b.Logo\n\t}\n\tif b.IsTab {\n\t\tbrands.IsTab = b.IsTab\n\t}\n\tif b.Sort != 0 {\n\t\tbrands.Sort = b.Sort\n\t}\n\tif b.Desc != \"\" {\n\t\tbrands.Desc = b.Desc\n\t}\n\tif err := r.data.db.Save(&brands).Error; err != nil {\n\t\treturn errors.InternalServer(\"UPDATE_BRAND_ERROR\", err.Error())\n\t}\n\treturn nil\n}\nfunc (r *BrandRepo) List(ctx context.Context, b *biz.Pagination) ([]*domain.Brand, int64, error) {\n\tvar brands []Brand\n\tresult := r.data.db.Scopes(Paginate(b.PageNum, b.PageSize)).Find(&brands)\n\tif errors.Is(result.Error, gorm.ErrRecordNotFound) {\n\t\treturn nil, 0, errors.NotFound(\"BRAND_NOT_FOUND\", \"brand not found\")\n\t}\n\tif result.Error != nil {\n\t\treturn nil, 0, result.Error\n\t}\n\n\tvar rsp []*domain.Brand\n\tvar total int64\n\tresult = r.data.db.Table(\"brands\").Model(&Brand{}).Count(&total)\n\tif result.Error != nil {\n\t\treturn nil, 0, errors.NotFound(\"BRAND_NOT_FOUND\", \"brand not found\")\n\t}\n\tfor _, v := range brands {\n\t\tbr := &domain.Brand{\n\t\t\tID:    v.ID,\n\t\t\tName:  v.Name,\n\t\t\tLogo:  v.Logo,\n\t\t\tIsTab: v.IsTab,\n\t\t\tSort:  v.Sort,\n\t\t}\n\t\trsp = append(rsp, br)\n\t}\n\treturn rsp, total, nil\n}\n\nfunc (r *BrandRepo) IsBrand(ctx context.Context, ids []int32) error {\n\tidCount := len(ids)\n\tif idCount == 0 {\n\t\treturn errors.InternalServer(\"BRAND_NOT_FOUND\", \"brand not found\")\n\t}\n\tvar count int64\n\tresult := r.data.db.Table(\"brands\").Where(\"id IN (?)\", ids).Count(&count)\n\tif result.Error != nil {\n\t\treturn errors.InternalServer(\"BRAND_NOT_FOUND\", result.Error.Error())\n\t}\n\tif int64(idCount) != count {\n\t\treturn errors.InternalServer(\"BRAND_NOT_FOUND\", \"品牌不存在\")\n\t}\n\treturn nil\n}\n\nfunc (r *BrandRepo) ListByIds(ctx context.Context, ids ...int32) (domain.BrandList, error) {\n\tif len(ids) == 0 {\n\t\treturn nil, errors.InternalServer(\"BRAND_NOT_FOUND\", \"请选择品牌\")\n\t}\n\n\tvar l []*Brand\n\tif err := r.data.DB(ctx).Where(\"id IN (?)\", ids).Find(&l).Error; err != nil {\n\t\treturn nil, errors.InternalServer(\"BRAND_NOT_FOUND\", err.Error())\n\t}\n\n\tvar res domain.BrandList\n\tfor _, item := range l {\n\t\tres = append(res, item.ToDomain())\n\t}\n\treturn res, nil\n}\n\nfunc (r *BrandRepo) IsBrandByID(ctx context.Context, id int32) (*domain.Brand, error) {\n\tvar b Brand\n\tif err := r.data.db.Table(\"brands\").Where(\"id = ?\", id).First(&b).Error; err != nil {\n\t\treturn nil, errors.InternalServer(\"BRAND_NOT_FOUND\", err.Error())\n\t}\n\n\treturn b.ToDomain(), nil\n}\n"
  },
  {
    "path": "service/goods/internal/data/category.go",
    "content": "package data\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/go-kratos/kratos/v2/errors\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"github.com/jinzhu/copier\"\n\t\"goods/internal/biz\"\n\t\"gorm.io/gorm\"\n\t\"time\"\n)\n\n// Category 商品分类表\ntype Category struct {\n\tID               int32          `gorm:\"primarykey;type:int\" json:\"id\"`\n\tName             string         `gorm:\"type:varchar(50);not null;comment:分类名称\" json:\"name\"`\n\tParentCategoryID int32          `json:\"parent_id\"`\n\tParentCategory   *Category      `json:\"-\"`\n\tSubCategory      []*Category    `gorm:\"foreignKey:ParentCategoryID;references:ID\" json:\"sub_category\"`\n\tLevel            int32          `gorm:\"column:level;default:1;not null;type:int;comment:分类的级别\" json:\"level\"`\n\tIsTab            bool           `gorm:\"comment:是否显示;default:false\" json:\"is_tab\"`\n\tSort             int32          `gorm:\"comment:分类排序;default:99;not null;type:int\" json:\"sort\"`\n\tCreatedAt        time.Time      `gorm:\"column:add_time\" json:\"created_at\"`\n\tUpdatedAt        time.Time      `gorm:\"column:update_time\" json:\"updated_at\"`\n\tDeletedAt        gorm.DeletedAt `json:\"deleted_at\"`\n}\n\n// GoodsCategoryBrand  商品和分类多对对的表\ntype GoodsCategoryBrand struct {\n\tID         int32          `gorm:\"primarykey;type:int\" json:\"id\"` // bigint\n\tCategoryID int32          `gorm:\"type:int;index:idx_category_brand,unique;comment:商品和分类联合索引唯一\"`\n\tBrandsID   int32          `gorm:\"type:int;index:idx_category_brand,unique:comment:商品和分类联合索引唯一\"`\n\tCreatedAt  time.Time      `gorm:\"column:add_time\" json:\"created_at\"`\n\tUpdatedAt  time.Time      `gorm:\"column:update_time\" json:\"updated_at\"`\n\tDeletedAt  gorm.DeletedAt `json:\"deleted_at\"`\n}\n\ntype CategoryRepo struct {\n\tdata *Data\n\tlog  *log.Helper\n}\n\n// NewCategoryRepo .\nfunc NewCategoryRepo(data *Data, logger log.Logger) biz.CategoryRepo {\n\treturn &CategoryRepo{\n\t\tdata: data,\n\t\tlog:  log.NewHelper(logger),\n\t}\n}\n\nfunc (r *CategoryRepo) DeleteCategory(ctx context.Context, id int32) error {\n\tif res := r.data.db.Delete(&Category{}, id); res.RowsAffected == 0 {\n\t\treturn errors.InternalServer(\"DELETE_CATGORY_ERROR\", res.Error.Error())\n\t}\n\treturn nil\n}\n\nfunc (r *CategoryRepo) UpdateCategory(ctx context.Context, req *biz.CategoryInfo) error {\n\tvar category Category\n\tif result := r.data.db.First(&category, req.ID); result.RowsAffected == 0 {\n\t\treturn errors.NotFound(\"CATEGORY_NOT_FOUND\", \"商品分类不存在\")\n\t}\n\n\tif req.Name != \"\" {\n\t\tcategory.Name = req.Name\n\t}\n\tif req.ParentCategory != 0 {\n\t\tcategory.ParentCategoryID = req.ParentCategory\n\t}\n\tif req.Level != 0 {\n\t\tcategory.Level = req.Level\n\t}\n\tif req.IsTab {\n\t\tcategory.IsTab = req.IsTab\n\t}\n\tresult := r.data.db.Save(&category)\n\tif result.Error != nil {\n\t\treturn errors.InternalServer(\"CATEGORY_UPDATE_ERROR\", \"商品分类创建失败\")\n\t}\n\treturn nil\n}\n\nfunc (r *CategoryRepo) AddCategory(ctx context.Context, req *biz.CategoryInfo) (*biz.CategoryInfo, error) {\n\tcMap := map[string]interface{}{}\n\tcMap[\"name\"] = req.Name\n\tcMap[\"level\"] = req.Level\n\tcMap[\"is_tab\"] = req.IsTab\n\tcMap[\"sort\"] = req.Sort\n\tcMap[\"add_time\"] = time.Now()\n\tcMap[\"update_time\"] = time.Now()\n\n\t// 去查询父类目是否存在\n\tif req.Level != 1 {\n\t\tvar categories Category\n\t\tif res := r.data.db.First(&categories, req.ParentCategory); res.RowsAffected == 0 {\n\t\t\treturn nil, errors.NotFound(\"CATEGORY_NOT_FOUND\", \"商品分类不存在\")\n\t\t}\n\t\tcMap[\"parent_category_id\"] = req.ParentCategory\n\t}\n\n\tresult := r.data.db.Model(&Category{}).Create(&cMap)\n\tif result.Error != nil {\n\t\treturn nil, errors.InternalServer(\"CATEGORY_CREATE_ERROR\", result.Error.Error())\n\t}\n\tvar value int32\n\tvalue, ok := cMap[\"parent_category_id\"].(int32)\n\tif !ok {\n\t\tvalue = 0\n\t}\n\tres := &biz.CategoryInfo{\n\t\tName:           cMap[\"name\"].(string),\n\t\tParentCategory: value,\n\t\tLevel:          cMap[\"level\"].(int32),\n\t\tIsTab:          cMap[\"is_tab\"].(bool),\n\t\tSort:           cMap[\"sort\"].(int32),\n\t}\n\treturn res, nil\n\n}\n\nfunc (r *CategoryRepo) Category(ctx context.Context) ([]*biz.Category, error) {\n\tvar cate []*Category\n\tresult := r.data.db.Where(&Category{Level: 1}).Preload(\"SubCategory.SubCategory\").Find(&cate)\n\tif errors.Is(result.Error, gorm.ErrRecordNotFound) {\n\t\treturn nil, errors.NotFound(\"CATEGORY_NOT_FOUND\", \"分类不存在\")\n\t}\n\tif result.Error != nil {\n\t\treturn nil, errors.InternalServer(\"CATEGORY_NOT_FOUND\", result.Error.Error())\n\t}\n\n\tvar res []*biz.Category\n\terr := copier.Copy(&res, &cate)\n\tif err != nil {\n\t\treturn nil, errors.InternalServer(\"CATEGORY_COPY_ERROR\", err.Error())\n\t}\n\treturn res, nil\n}\n\nfunc (r *CategoryRepo) GetCategoryByID(ctx context.Context, id int32) (*biz.CategoryInfo, error) {\n\tvar categories Category\n\tif res := r.data.db.First(&categories, id); res.RowsAffected == 0 {\n\t\treturn nil, errors.NotFound(\"CATEGORY_NOT_FOUND\", \"分类不存在\")\n\t}\n\n\tinfo := &biz.CategoryInfo{\n\t\tID:             categories.ID,\n\t\tName:           categories.Name,\n\t\tParentCategory: categories.ParentCategoryID,\n\t\tLevel:          categories.Level,\n\t\tIsTab:          categories.IsTab,\n\t\tSort:           categories.Sort,\n\t}\n\treturn info, nil\n}\n\nfunc (r *CategoryRepo) SubCategory(ctx context.Context, req biz.CategoryInfo) ([]*biz.CategoryInfo, error) {\n\tvar subCategory []Category\n\tvar subCategoryInfo []*biz.CategoryInfo\n\tpreload := \"SubCategory\"\n\tif req.Level == 1 {\n\t\tpreload = \"SubCategory.SubCategory\"\n\t}\n\n\tif err := r.data.db.Where(&Category{ParentCategoryID: req.ID}).Preload(preload).Find(&subCategory).Error; err != nil {\n\t\treturn nil, errors.NotFound(\"CATEGORY_NOT_FOUND\", \"分类不存在\")\n\t}\n\tfor _, v := range subCategory {\n\t\tsubCategoryInfo = append(subCategoryInfo, &biz.CategoryInfo{\n\t\t\tID:             v.ID,\n\t\t\tName:           v.Name,\n\t\t\tParentCategory: v.ParentCategoryID,\n\t\t\tLevel:          v.Level,\n\t\t\tIsTab:          v.IsTab,\n\t\t\tSort:           v.Sort,\n\t\t})\n\t}\n\n\treturn subCategoryInfo, nil\n}\n\nfunc (r *CategoryRepo) GetCategoryAll(ctx context.Context, level, id int32) ([]interface{}, error) {\n\tcategoryIds := make([]interface{}, 0)\n\tvar subQuery string\n\t// 把一级级分类下的所有三级分类都拿到\n\tif level == 1 {\n\t\tsubQuery = fmt.Sprintf(\"SELECT id FROM categories WHERE parent_category_id IN (SELECT id FROM categories WHERE parent_category_id=%d)\", id)\n\t} else if level == 2 {\n\t\tsubQuery = fmt.Sprintf(\"SELECT id FROM categories WHERE parent_category_id=%d\", id)\n\t} else if level == 3 {\n\t\tsubQuery = fmt.Sprintf(\"SELECT id FROM categories WHERE id=%d\", id)\n\t}\n\n\ttype Result struct {\n\t\tID int32\n\t}\n\n\tvar results []Result\n\tif err := r.data.db.Table(\"categories\").Model(Category{}).Raw(subQuery).Scan(&results).Error; err != nil {\n\t\treturn nil, errors.InternalServer(\"CATEGORY_ERROR\", err.Error())\n\t}\n\tfor _, re := range results {\n\t\tcategoryIds = append(categoryIds, re.ID)\n\t}\n\treturn categoryIds, nil\n}\n"
  },
  {
    "path": "service/goods/internal/data/data.go",
    "content": "package data\n\nimport (\n\t\"context\"\n\t\"goods/internal/biz\"\n\t\"goods/internal/conf\"\n\tslog \"log\"\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"github.com/go-redis/redis/extra/redisotel\"\n\t\"github.com/go-redis/redis/v8\"\n\t\"github.com/google/wire\"\n\t\"github.com/olivere/elastic/v7\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n\t\"gorm.io/gorm/logger\"\n\t\"gorm.io/gorm/schema\"\n)\n\n// ProviderSet is data providers.\nvar ProviderSet = wire.NewSet(\n\tNewData,\n\tNewDB, NewTransaction, NewRedis, NewElasticsearch,\n\tNewBrandRepo,\n\tNewCategoryRepo,\n\tNewGoodsTypeRepo,\n\tNewSpecificationRepo,\n\tNewGoodsAttrRepo,\n\tNewGoodsRepo,\n\tNewGoodsSkuRepoRepo,\n\tNewInventoryRepo,\n\tNewEsGoodsRepo,\n)\n\ntype Data struct {\n\tdb       *gorm.DB\n\trdb      *redis.Client\n\tEsClient *elastic.Client\n}\n\n// 用来承载事务的上下文\ntype contextTxKey struct{}\n\n// NewData .\nfunc NewData(c *conf.Data, logger log.Logger, db *gorm.DB, rdb *redis.Client, es *elastic.Client) (*Data, func(), error) {\n\tcleanup := func() {\n\t\tlog.NewHelper(logger).Info(\"closing the data resources\")\n\t}\n\treturn &Data{\n\t\tdb:       db,\n\t\trdb:      rdb,\n\t\tEsClient: es,\n\t}, cleanup, nil\n}\n\n// NewTransaction .\nfunc NewTransaction(d *Data) biz.Transaction {\n\treturn d\n}\n\n// ExecTx gorm Transaction\nfunc (d *Data) ExecTx(ctx context.Context, fn func(ctx context.Context) error) error {\n\treturn d.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error {\n\t\tctx = context.WithValue(ctx, contextTxKey{}, tx)\n\t\treturn fn(ctx)\n\t})\n}\n\n// DB 根据此方法来判断当前的 db 是不是使用 事务的 DB\nfunc (d *Data) DB(ctx context.Context) *gorm.DB {\n\ttx, ok := ctx.Value(contextTxKey{}).(*gorm.DB)\n\tif ok {\n\t\treturn tx\n\t}\n\treturn d.db\n}\n\n// NewDB .\nfunc NewDB(c *conf.Data) *gorm.DB {\n\t// 终端打印输入 sql 执行记录\n\tnewLogger := logger.New(\n\t\tslog.New(os.Stdout, \"\\r\\n\", slog.LstdFlags), // io writer\n\t\tlogger.Config{\n\t\t\tSlowThreshold: time.Second, // 慢查询 SQL 阈值\n\t\t\tColorful:      true,        // 禁用彩色打印\n\t\t\t//IgnoreRecordNotFoundError: false,\n\t\t\tLogLevel: logger.Info, // Log lever\n\t\t},\n\t)\n\n\tdb, err := gorm.Open(mysql.Open(c.Database.Source), &gorm.Config{\n\t\tLogger:                                   newLogger,\n\t\tDisableForeignKeyConstraintWhenMigrating: true,\n\t\tNamingStrategy:                           schema.NamingStrategy{\n\t\t\t//SingularTable: true, // 表名是否加 s\n\t\t},\n\t})\n\n\tif err != nil {\n\t\tlog.Errorf(\"failed opening connection to sqlite: %v\", err)\n\t\tpanic(\"failed to connect database\")\n\t}\n\n\treturn db\n}\n\nfunc NewRedis(c *conf.Data) *redis.Client {\n\trdb := redis.NewClient(&redis.Options{\n\t\tAddr:         c.Redis.Addr,\n\t\tPassword:     c.Redis.Password,\n\t\tDB:           int(c.Redis.Db),\n\t\tDialTimeout:  c.Redis.DialTimeout.AsDuration(),\n\t\tWriteTimeout: c.Redis.WriteTimeout.AsDuration(),\n\t\tReadTimeout:  c.Redis.ReadTimeout.AsDuration(),\n\t})\n\trdb.AddHook(redisotel.TracingHook{})\n\tif err := rdb.Close(); err != nil {\n\t\tlog.Error(err)\n\t}\n\treturn rdb\n}\n\nfunc NewElasticsearch(c *conf.Data) *elastic.Client {\n\tes, err := elastic.NewClient(elastic.SetURL(c.Elastic.Addr), elastic.SetSniff(false),\n\t\telastic.SetTraceLog(slog.New(os.Stdout, \"shop\", slog.LstdFlags)))\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\treturn es\n}\n"
  },
  {
    "path": "service/goods/internal/data/entity/goods.go",
    "content": "package main\n\nimport (\n\t\"goods/internal/data\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n\t\"gorm.io/gorm/logger\"\n\t\"gorm.io/gorm/schema\"\n\t\"log\"\n\t\"os\"\n\t\"time\"\n)\n\n// 链接数据库\nfunc main() {\n\tdsn := \"root:root@tcp(127.0.0.1:3306)/shop_goods?charset=utf8mb4&parseTime=True&loc=Local\"\n\tnewLogger := logger.New(\n\t\tlog.New(os.Stdout, \"\\r\\n\", log.LstdFlags), // io writer\n\t\tlogger.Config{\n\t\t\tSlowThreshold: time.Second, // 慢 SQL 阈值\n\t\t\tLogLevel:      logger.Info, // Log level\n\t\t\tColorful:      true,        // 禁用彩色打印\n\t\t},\n\t)\n\n\t// 全局模式\n\tdb, err := gorm.Open(mysql.Open(dsn), &gorm.Config{\n\t\tNamingStrategy: schema.NamingStrategy{\n\t\t\t//SingularTable: true,\n\t\t},\n\t\tLogger: newLogger,\n\t})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\t_ = db.AutoMigrate(\n\t\t//&data.Brand{},\n\t\t//&data.Category{},\n\t\t//&data.GoodsCategoryBrand{},\n\t\t//&data.GoodsType{},\n\t\t//&data.GoodsTypeBrand{},\n\t\t//&data.SpecificationsAttr{},\n\t\t//&data.SpecificationsAttrValue{},\n\t\t//&data.GoodsAttrGroup{},\n\t\t//&data.GoodsAttr{},\n\t\t//&data.GoodsAttrValue{},\n\t\t//&data.Goods{},\n\t\t//&data.GoodsSku{},\n\t\t//&data.GoodsImages{},\n\t\t&data.GoodsSpecificationSku{},\n\t\t&data.GoodsInventory{},\n\t)\n}\n"
  },
  {
    "path": "service/goods/internal/data/es_goods.go",
    "content": "package data\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"goods/internal/biz\"\n\t\"goods/internal/domain\"\n\t\"strconv\"\n\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"github.com/olivere/elastic/v7\"\n)\n\n// GetIndexName 设计商品的索引 goods\nfunc (esGoodsRepo) GetIndexName() string {\n\treturn \"goods\"\n}\n\n// GetMapping 设计商品的 mapping 结构\nfunc (esGoodsRepo) GetMapping() string {\n\tgoodsMapping := `\n\t{\n    \"mappings\": {\n        \"properties\": {\n            \"id\": {\n                \"type\": \"integer\"\n            },\n            \"brands_id\": {\n                \"type\": \"integer\"\n            },\n            \"category_id\": {\n                \"type\": \"integer\"\n            },\n            \"type_id\": {\n                \"type\": \"integer\"\n            },\n            \"click_num\": {\n                \"type\": \"integer\"\n            },\n            \"fav_num\": {\n                \"type\": \"integer\"\n            },\n            \"is_hot\": {\n                \"type\": \"boolean\"\n            },\n            \"is_new\": {\n                \"type\": \"boolean\"\n            },\n            \"market_price\": {\n                \"type\": \"integer\"\n            },\n            \"name\": {\n                \"type\": \"text\",\n                \"analyzer\": \"ik_max_word\"\n            },\n\t\t\t\"brand_name\": {\n                \"type\": \"keyword\",\n                \"index\": false,\n\t\t\t\t\"dec_values\": false,\n            },\n\t\t\t\"category_name\": {\n                \"type\": \"keyword\",\n                \"index\": false,\n\t\t\t\t\"dec_values\": false,\n            },\n\t\t\t\"type_name\": {\n                \"type\": \"keyword\",\n                \"index\": false,\n\t\t\t\t\"dec_values\": false,\n            },\n            \"goods_brief\": {\n                \"type\": \"text\",\n                \"analyzer\": \"ik_max_word\"\n            },\n            \"on_sale\": {\n                \"type\": \"boolean\"\n            },\n            \"ship_free\": {\n                \"type\": \"boolean\"\n            },\n            \"shop_price\": {\n                \"type\": \"integer\"\n            },\n            \"sold_num\": {\n                \"type\": \"integer\"\n            },\n\t\t\t\"sku\": {\n\t\t\t\t\"type\": \"nested\",\n\t\t\t\t\"sku_id\": {\n\t\t\t\t\t\"type\": \"integer\",\n            \t},\n\t\t\t\t\"sku_name\": {\n\t\t\t\t\t\"type\": \"text\",\n\t\t\t\t\t\"analyzer\": \"ik_max_word\"\n            \t},\n\t\t\t\t\"sku_price\": {\n\t\t\t\t\t\"type\": \"integer\",\n\t\t\t\t},\n\t\t\t}\n        }\n    }\n}`\n\treturn goodsMapping\n}\n\ntype esGoodsRepo struct {\n\tdata *Data\n\tlog  *log.Helper\n}\n\n// NewEsGoodsRepo .\nfunc NewEsGoodsRepo(data *Data, logger log.Logger) biz.EsGoodsRepo {\n\treturn &esGoodsRepo{\n\t\tdata: data,\n\t\tlog:  log.NewHelper(logger),\n\t}\n}\n\nfunc (p esGoodsRepo) GoodsList(ctx context.Context, filter *domain.EsSearch) ([]int64, int64, error) {\n\tboolQuery := elastic.NewBoolQuery()\n\tboolQuery.Must(filter.MustQuery...)\n\tboolQuery.MustNot(filter.MustNotQuery...)\n\tboolQuery.Should(filter.ShouldQuery...)\n\tboolQuery.Filter(filter.Filters...)\n\n\tresult, err := p.data.EsClient.Search().\n\t\tIndex(p.GetIndexName()).\n\t\tQuery(boolQuery).\n\t\tSortBy(filter.Sorters...).\n\t\tFrom(int(filter.Form)).\n\t\tSize(int(filter.Size)).\n\t\tDo(ctx)\n\n\tif err != nil {\n\t\treturn nil, 0, err\n\t}\n\n\t// 取出来商品ID\n\tgoodsIds := make([]int64, 0)\n\tfor _, value := range result.Hits.Hits {\n\t\tgoods := domain.ESGoods{}\n\t\t_ = json.Unmarshal(value.Source, &goods)\n\t\tgoodsIds = append(goodsIds, goods.ID)\n\t}\n\treturn goodsIds, result.Hits.TotalHits.Value, nil\n\n}\n\nfunc (p esGoodsRepo) InsertEsGoods(ctx context.Context, esModel domain.ESGoods) error {\n\t// 新建 mapping 和 index\n\texists, err := p.data.EsClient.IndexExists(p.GetIndexName()).Do(ctx)\n\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif !exists {\n\t\t_, err = p.data.EsClient.CreateIndex(p.GetIndexName()).BodyString(p.GetMapping()).Do(ctx)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t_, err = p.data.EsClient.Index().Index(p.GetIndexName()).BodyJson(esModel).Id(strconv.Itoa(int(esModel.ID))).Do(ctx)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t_, err = p.data.EsClient.Index().Index(p.GetIndexName()).BodyJson(esModel).Id(strconv.Itoa(int(esModel.ID))).Do(ctx)\n\n\t_, err = p.data.EsClient.Update().Index(p.GetIndexName()).\n\t\tDoc(esModel).Id(\"自己的ID\").Do(ctx)\n\n\treturn nil\n}\n"
  },
  {
    "path": "service/goods/internal/data/good_type.go",
    "content": "package data\n\nimport (\n\t\"context\"\n\t\"goods/internal/biz\"\n\t\"goods/internal/domain\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/go-kratos/kratos/v2/errors\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"gorm.io/gorm\"\n)\n\n// GoodsType 商品类型表\ntype GoodsType struct {\n\tID        int64          `gorm:\"primarykey;type:int\" json:\"id\"`\n\tName      string         `gorm:\"type:varchar(50);not null;comment:商品类型名称\" json:\"name\"`\n\tTypeCode  string         `gorm:\"type:varchar(50);not null;comment:商品类型编码\" json:\"type_code\"`\n\tNameAlias string         `gorm:\"type:varchar(50);not null;comment:商品类型别名\" json:\"name_alias\"`\n\tIsVirtual bool           `gorm:\"comment:是否是虚拟商品显示;default:false\" json:\"is_virtual\"`\n\tDesc      string         `gorm:\"type:varchar(50);not null;comment:商品类型描述\" json:\"desc\"`\n\tSort      int32          `gorm:\"comment:类型排序;default:99;not null;type:int\" json:\"sort\"`\n\tCreatedAt time.Time      `gorm:\"column:add_time\" json:\"created_at\"`\n\tUpdatedAt time.Time      `gorm:\"column:update_time\" json:\"updated_at\"`\n\tDeletedAt gorm.DeletedAt `json:\"deleted_at\"`\n}\n\n// GoodsTypeBrand  商品类型表和商品品牌关联表\ntype GoodsTypeBrand struct {\n\tID      int32 `gorm:\"primarykey;type:int\" json:\"id\"`\n\tBrandID int32 `gorm:\"index:brand_id;type:int;comment:商品品牌ID;not null\"`\n\tTypeID  int64 `gorm:\"index:type_id;type:int;comment:商品类型ID;not null\"`\n}\n\ntype goodsTypeRepo struct {\n\tdata *Data\n\tlog  *log.Helper\n}\n\n// NewGoodsTypeRepo .\nfunc NewGoodsTypeRepo(data *Data, logger log.Logger) biz.GoodsTypeRepo {\n\treturn &goodsTypeRepo{\n\t\tdata: data,\n\t\tlog:  log.NewHelper(logger),\n\t}\n}\nfunc (p *GoodsType) ToDomain() *domain.GoodsType {\n\treturn &domain.GoodsType{\n\t\tID:        p.ID,\n\t\tName:      p.Name,\n\t\tTypeCode:  p.TypeCode,\n\t\tNameAlias: p.NameAlias,\n\t\tIsVirtual: p.IsVirtual,\n\t\tDesc:      p.Desc,\n\t\tSort:      p.Sort,\n\t}\n}\n\n// CreateGoodsType 创建基本的商品类型\nfunc (g *goodsTypeRepo) CreateGoodsType(ctx context.Context, req *domain.GoodsType) (int64, error) {\n\tgoodsType := GoodsType{\n\t\tName:      req.Name,\n\t\tTypeCode:  req.TypeCode,\n\t\tNameAlias: req.NameAlias,\n\t\tIsVirtual: req.IsVirtual,\n\t\tDesc:      req.Desc,\n\t\tSort:      req.Sort,\n\t\tCreatedAt: time.Time{},\n\t\tUpdatedAt: time.Time{},\n\t}\n\tresult := g.data.DB(ctx).Save(&goodsType)\n\tif result.Error != nil {\n\t\treturn 0, errors.InternalServer(\"GOODS_TYPE_SAVE_ERROR\", result.Error.Error())\n\t}\n\treturn goodsType.ID, result.Error\n}\n\nfunc (g *goodsTypeRepo) CreateGoodsBrandType(ctx context.Context, typeID int64, brandIds string) error {\n\tvar gtb []GoodsTypeBrand\n\tIds := strings.Split(brandIds, \",\")\n\tfor _, id := range Ids {\n\t\tj, _ := strconv.ParseInt(id, 10, 32)\n\t\tv := GoodsTypeBrand{\n\t\t\tBrandID: int32(j),\n\t\t\tTypeID:  typeID,\n\t\t}\n\t\tgtb = append(gtb, v)\n\t}\n\tif err := g.data.DB(ctx).Create(&gtb).Error; err != nil {\n\t\treturn errors.InternalServer(\"GOODS_TYPE_CREATE_ERROR\", err.Error())\n\t}\n\treturn nil\n\n}\n\nfunc (g *goodsTypeRepo) GetGoodsTypeByID(ctx context.Context, typeID int64) (*domain.GoodsType, error) {\n\tvar goodsType GoodsType\n\tif res := g.data.db.First(&goodsType, typeID); res.RowsAffected == 0 {\n\t\treturn nil, errors.NotFound(\"GOODS_TYPE_NOT_FOUND\", \"商品类型不存在\")\n\t}\n\n\treturn goodsType.ToDomain(), nil\n}\n\nfunc (g *goodsTypeRepo) IsExistsByID(ctx context.Context, typeID int64) (*domain.GoodsType, error) {\n\tvar goodsType GoodsType\n\tif res := g.data.db.First(&goodsType, typeID); res.RowsAffected == 0 {\n\t\treturn nil, errors.NotFound(\"GOODS_TYPE_NOT_FOUND\", \"商品类型不存在\")\n\t}\n\treturn goodsType.ToDomain(), nil\n}\n"
  },
  {
    "path": "service/goods/internal/data/goods.go",
    "content": "package data\n\nimport (\n\t\"context\"\n\t\"github.com/go-kratos/kratos/v2/errors\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"goods/internal/biz\"\n\t\"goods/internal/domain\"\n)\n\n// Goods 商品表\ntype Goods struct {\n\tBaseFields\n\tCategoryID int32 `gorm:\"index:category_id;type:int;comment:分类ID;not null\"`\n\tBrandsID   int32 `gorm:\"index:brand_id;type:int;comment:品牌ID ;not null\"`\n\tTypeID     int64 `gorm:\"index:type_id;type:int;comment:商品类型ID ;not null\"`\n\n\tName            string   `gorm:\"type:varchar(100);not null;comment:商品名称\"`\n\tNameAlias       string   `gorm:\"type:varchar(100);not null;comment:商品别名\"`\n\tGoodsSn         string   `gorm:\"type:varchar(100);not null;comment:商品编号\"`\n\tGoodsTags       string   `gorm:\"type:varchar(100);not null;comment:商品标签\"`\n\tMarketPrice     int64    `gorm:\"type:int;default:0;not null;comment:商品展示价格\"`\n\tGoodsBrief      string   `gorm:\"type:varchar(100);not null;comment:商品简介\"`\n\tGoodsFrontImage string   `gorm:\"type:varchar(200);not null;comment:商品封面图\"`\n\tGoodsImages     GormList `gorm:\"type:varchar(1000);not null;comment:商品的介绍图\"` // 切片类型转为 json 到数据库，取出来是切片类型\n\n\tOnSale   bool  `gorm:\"default:false;comment:是否上架;not null \"`\n\tShipFree bool  `gorm:\"default:false;comment:是否免运费; not null\"`\n\tShipID   int32 `gorm:\"type:int;comment:运费模版ID;not null\"`\n\tIsNew    bool  `gorm:\"default:false;comment:是否新品;not null\"`\n\tIsHot    bool  `gorm:\"comment:是否热卖商品;default:false;not null\"`\n\n\tClickNum int64 `gorm:\"default:0;type:int; comment 商品详情点击数\"`\n\tSoldNum  int64 `gorm:\"default:0;type:int; comment 商品销售数\"`\n\tFavNum   int64 `gorm:\"default:0;type:int; comment 商品收藏数\"`\n\n\t// 售前服务信息、售后服务信息、商品促销活动信息\n}\n\ntype goodsRepo struct {\n\tdata *Data\n\tlog  *log.Helper\n}\n\n// NewGoodsRepo .\nfunc NewGoodsRepo(data *Data, logger log.Logger) biz.GoodsRepo {\n\treturn &goodsRepo{\n\t\tdata: data,\n\t\tlog:  log.NewHelper(logger),\n\t}\n}\n\nfunc (p *Goods) ToDomain() *domain.Goods {\n\treturn &domain.Goods{\n\t\tID:              p.ID,\n\t\tCategoryID:      p.CategoryID,\n\t\tBrandsID:        p.BrandsID,\n\t\tTypeID:          p.TypeID,\n\t\tName:            p.Name,\n\t\tNameAlias:       p.NameAlias,\n\t\tGoodsSn:         p.GoodsSn,\n\t\tGoodsTags:       p.GoodsTags,\n\t\tMarketPrice:     p.MarketPrice,\n\t\tGoodsBrief:      p.GoodsBrief,\n\t\tGoodsFrontImage: p.GoodsFrontImage,\n\t\tGoodsImages:     p.GoodsImages,\n\t\tOnSale:          p.OnSale,\n\t\tShipFree:        p.ShipFree,\n\t\tShipID:          p.ShipID,\n\t\tIsNew:           p.IsNew,\n\t\tIsHot:           p.IsHot,\n\t\tClickNum:        p.ClickNum,\n\t\tSoldNum:         p.SoldNum,\n\t\tFavNum:          p.FavNum,\n\t}\n}\n\nfunc (g goodsRepo) CreateGoods(c context.Context, goods *domain.Goods) (*domain.Goods, error) {\n\tproduct := &Goods{\n\t\tCategoryID:      goods.CategoryID,\n\t\tBrandsID:        goods.BrandsID,\n\t\tTypeID:          goods.TypeID,\n\t\tName:            goods.Name,\n\t\tNameAlias:       goods.NameAlias,\n\t\tGoodsSn:         goods.GoodsSn,\n\t\tGoodsTags:       goods.GoodsTags,\n\t\tMarketPrice:     goods.MarketPrice,\n\t\tGoodsBrief:      goods.GoodsBrief,\n\t\tGoodsFrontImage: goods.GoodsFrontImage,\n\t\tGoodsImages:     goods.GoodsImages,\n\t\tOnSale:          goods.OnSale,\n\t\tShipFree:        goods.ShipFree,\n\t\tShipID:          goods.ShipID,\n\t\tIsNew:           goods.IsNew,\n\t\tIsHot:           goods.IsHot,\n\t}\n\n\tresult := g.data.DB(c).Save(product)\n\tif result.Error != nil {\n\t\treturn nil, errors.InternalServer(\"GOODS_CREATE_ERROR\", \"商品创建失败\")\n\t}\n\treturn product.ToDomain(), nil\n}\n\nfunc (g goodsRepo) GoodsListByIDs(c context.Context, ids ...int64) ([]*domain.Goods, error) {\n\tvar l []*Goods\n\tif err := g.data.DB(c).Where(\"id IN (?)\", ids).Find(&l).Error; err != nil {\n\t\treturn nil, errors.NotFound(\"GOODS_NOT_FOUND\", \"商品不存在\")\n\t}\n\tvar res []*domain.Goods\n\tfor _, item := range l {\n\t\tres = append(res, item.ToDomain())\n\t}\n\treturn res, nil\n}\n"
  },
  {
    "path": "service/goods/internal/data/goods_attr.go",
    "content": "package data\n\nimport (\n\t\"context\"\n\t\"github.com/go-kratos/kratos/v2/errors\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"goods/internal/biz\"\n\t\"goods/internal/domain\"\n\t\"gorm.io/gorm\"\n\t\"time\"\n)\n\n// GoodsAttrGroup  商品属性分组表  手机 -> 主体->屏幕,操作系统,网络支持,基本信息\ntype GoodsAttrGroup struct {\n\tID          int64          `gorm:\"primarykey;type:int\" json:\"id\"`\n\tGoodsTypeID int64          `gorm:\"index:goods_type_id;type:int;comment:商品类型ID;not null\"`\n\tTitle       string         `gorm:\"type:varchar(100);comment:属性名;not null\"`\n\tDesc        string         `gorm:\"type:varchar(200);comment:属性描述;default:false;not null\"`\n\tStatus      bool           `gorm:\"comment:状态;default:false;not null\"`\n\tSort        int32          `gorm:\"type:int;comment:商品属性排序字段;not null\"`\n\tCreatedAt   time.Time      `gorm:\"column:add_time\" json:\"created_at\"`\n\tUpdatedAt   time.Time      `gorm:\"column:update_time\" json:\"updated_at\"`\n\tDeletedAt   gorm.DeletedAt `json:\"deleted_at\"`\n}\n\n// GoodsAttr 商品属性表 主体->产品名称,上市月份,机身宽度\ntype GoodsAttr struct {\n\tID          int64          `gorm:\"primarykey;type:int\" json:\"id\"`\n\tGoodsTypeID int64          `gorm:\"index:goods_type_id;type:int;comment:商品类型ID;not null\"`\n\tGroupID     int64          `gorm:\"index:attr_group_id;type:int;comment:商品属性分组ID;not null\"`\n\tTitle       string         `gorm:\"type:varchar(100);comment:属性名;not null\"`\n\tDesc        string         `gorm:\"type:varchar(200);comment:属性描述;default:false;not null\"`\n\tStatus      bool           `gorm:\"comment:状态;default:false;not null\"`\n\tSort        int32          `gorm:\"type:int;comment:商品属性排序字段;not null\"`\n\tCreatedAt   time.Time      `gorm:\"column:add_time\" json:\"created_at\"`\n\tUpdatedAt   time.Time      `gorm:\"column:update_time\" json:\"updated_at\"`\n\tDeletedAt   gorm.DeletedAt `json:\"deleted_at\"`\n}\n\ntype GoodsAttrValue struct {\n\tID        int64          `gorm:\"primarykey;type:int\" json:\"id\"`\n\tAttrId    int64          `gorm:\"index:property_name_id;type:int;comment:属性表ID;not null\"`\n\tGroupID   int64          `gorm:\"index:attr_group_id;type:int;comment:商品属性分组ID;not null\"`\n\tValue     string         `gorm:\"type:varchar(100);comment:属性值;not null\"`\n\tCreatedAt time.Time      `gorm:\"column:add_time\" json:\"created_at\"`\n\tUpdatedAt time.Time      `gorm:\"column:update_time\" json:\"updated_at\"`\n\tDeletedAt gorm.DeletedAt `json:\"deleted_at\"`\n}\n\ntype goodsAttrRepo struct {\n\tdata *Data\n\tlog  *log.Helper\n}\n\n// NewGoodsAttrRepo .\nfunc NewGoodsAttrRepo(data *Data, logger log.Logger) biz.GoodsAttrRepo {\n\treturn &goodsAttrRepo{\n\t\tdata: data,\n\t\tlog:  log.NewHelper(logger),\n\t}\n}\n\nfunc (p *GoodsAttrGroup) ToDomain() *domain.AttrGroup {\n\treturn &domain.AttrGroup{\n\t\tID:     p.ID,\n\t\tTypeID: p.GoodsTypeID,\n\t\tTitle:  p.Title,\n\t\tDesc:   p.Desc,\n\t\tStatus: p.Status,\n\t\tSort:   p.Sort,\n\t}\n}\n\nfunc (p *GoodsAttr) ToDomain() *domain.GoodsAttr {\n\treturn &domain.GoodsAttr{\n\t\tID:      p.ID,\n\t\tTypeID:  p.GoodsTypeID,\n\t\tGroupID: p.GroupID,\n\t\tTitle:   p.Title,\n\t\tSort:    p.Sort,\n\t\tStatus:  p.Status,\n\t\tDesc:    p.Desc,\n\t}\n}\n\nfunc (p *GoodsAttrValue) ToDomain() *domain.GoodsAttrValue {\n\treturn &domain.GoodsAttrValue{\n\t\tID:      p.ID,\n\t\tAttrId:  p.AttrId,\n\t\tGroupID: p.GroupID,\n\t\tValue:   p.Value,\n\t}\n}\n\nfunc (g *goodsAttrRepo) CreateGoodsGroupAttr(ctx context.Context, a *domain.AttrGroup) (*domain.AttrGroup, error) {\n\tgroup := GoodsAttrGroup{\n\t\tGoodsTypeID: a.TypeID,\n\t\tTitle:       a.Title,\n\t\tDesc:        a.Desc,\n\t\tStatus:      a.Status,\n\t\tSort:        a.Sort,\n\t}\n\n\tresult := g.data.db.Save(&group)\n\tif result.Error != nil {\n\t\treturn nil, errors.InternalServer(\"ATTR_GROUP_SAVE_ERROR\", result.Error.Error())\n\t}\n\n\treturn group.ToDomain(), nil\n}\n\nfunc (g *goodsAttrRepo) IsExistsGroupByID(ctx context.Context, groupId int64) (*domain.AttrGroup, error) {\n\tvar group GoodsAttrGroup\n\tif res := g.data.db.First(&group, groupId); res.RowsAffected == 0 {\n\t\treturn nil, errors.NotFound(\"ATTR_GROUP_NOT_FOUND\", \"商品属性组不存在\")\n\t}\n\treturn group.ToDomain(), nil\n}\n\nfunc (g *goodsAttrRepo) CreateGoodsAttr(ctx context.Context, a *domain.GoodsAttr) (*domain.GoodsAttr, error) {\n\tattr := GoodsAttr{\n\t\tGoodsTypeID: a.TypeID,\n\t\tGroupID:     a.GroupID,\n\t\tTitle:       a.Title,\n\t\tDesc:        a.Desc,\n\t\tStatus:      a.Status,\n\t\tSort:        a.Sort,\n\t}\n\n\tif err := g.data.DB(ctx).Save(&attr).Error; err != nil {\n\t\treturn nil, errors.InternalServer(\"ATTR_SAVE_ERROR\", err.Error())\n\t}\n\treturn attr.ToDomain(), nil\n}\n\nfunc (g *goodsAttrRepo) CreateGoodsAttrValue(ctx context.Context, r []*domain.GoodsAttrValue) ([]*domain.GoodsAttrValue, error) {\n\tvar attrValue []*GoodsAttrValue\n\tfor _, v := range r {\n\t\tattr := GoodsAttrValue{\n\t\t\tAttrId:  v.AttrId,\n\t\t\tGroupID: v.GroupID,\n\t\t\tValue:   v.Value,\n\t\t}\n\t\tattrValue = append(attrValue, &attr)\n\t}\n\n\tif err := g.data.DB(ctx).Create(&attrValue).Error; err != nil {\n\t\treturn nil, errors.InternalServer(\"ATTR_CREATE_ERROR\", err.Error())\n\t}\n\n\tvar res []*domain.GoodsAttrValue\n\tfor _, v := range attrValue {\n\t\tvalue := v.ToDomain()\n\t\tres = append(res, value)\n\t}\n\treturn res, nil\n}\n\nfunc (g *goodsAttrRepo) GetAttrByIDs(ctx context.Context, ids []*int64) error {\n\tvar attrIDs []*int64\n\tfor _, id := range ids {\n\t\tattrIDs = append(attrIDs, id)\n\t}\n\ttotal := len(ids)\n\tvar count int64\n\tresult := g.data.DB(ctx).Where(\"id IN (?)\", attrIDs).Count(&count)\n\tif result.Error != nil {\n\t\tif errors.Is(result.Error, gorm.ErrRecordNotFound) {\n\t\t\treturn errors.NotFound(\"ATTR_NOT_FOUND\", \"商品属性不存在\")\n\t\t}\n\t\treturn errors.InternalServer(\"ATTR_GET_ERROR\", result.Error.Error())\n\t}\n\tif int64(total) != count {\n\t\treturn errors.NotFound(\"ATTR_NOT_FOUND\", \"部分属性不存在\")\n\t}\n\treturn nil\n\n}\n\nfunc (g *goodsAttrRepo) ListByIds(ctx context.Context, ids ...int64) (domain.GoodsAttrList, error) {\n\tvar l []*GoodsAttr\n\tif err := g.data.DB(ctx).Where(\"id IN (?)\", ids).Find(&l).Error; err != nil {\n\t\treturn nil, errors.NotFound(\"ATTR_NOT_FOUND\", \"商品属性不存在\")\n\t}\n\n\tvar res domain.GoodsAttrList\n\tfor _, item := range l {\n\t\tres = append(res, item.ToDomain())\n\t}\n\treturn res, nil\n}\n"
  },
  {
    "path": "service/goods/internal/data/goods_image.go",
    "content": "package data\n\nimport (\n\t\"context\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"goods/internal/biz\"\n\t\"goods/internal/domain\"\n)\n\n// GoodsImages goods images\ntype GoodsImages struct {\n\tBaseFields\n\tGoodsID int64 `gorm:\"index:goods_id;type:int;comment:商品ID;not null\"`\n\tGoods   Goods\n\n\tLink     string `gorm:\"type:varchar(200);comment:商品图片URL地址;not null\"`\n\tPosition int32  `gorm:\"type:smallint(5);comment:商品图片位置;not null\"`\n\tIsMaster bool   `gorm:\"comment:是否主图: 1是,0否;default:false;not null\"`\n}\n\ntype goodsImagesRepo struct {\n\tdata *Data\n\tlog  *log.Helper\n}\n\n// NewGoodsImagesRepo .\nfunc NewGoodsImagesRepo(data *Data, logger log.Logger) biz.GoodsImagesRepo {\n\treturn &goodsImagesRepo{\n\t\tdata: data,\n\t\tlog:  log.NewHelper(logger),\n\t}\n}\n\nfunc (r *goodsImagesRepo) CreateGreeter(ctx context.Context, g *domain.Goods) error {\n\treturn nil\n}\n\nfunc (r *goodsImagesRepo) UpdateGreeter(ctx context.Context, g *domain.Goods) error {\n\treturn nil\n}\n"
  },
  {
    "path": "service/goods/internal/data/goods_sku.go",
    "content": "package data\n\nimport (\n\t\"github.com/go-kratos/kratos/v2/errors\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"golang.org/x/net/context\"\n\t\"goods/internal/biz\"\n\t\"goods/internal/domain\"\n)\n\n// GoodsSku 商品SKU 表\ntype GoodsSku struct {\n\tBaseFields\n\tGoodsID        int64  `gorm:\"index:goods_id;type:int;comment:商品ID;not null\"`\n\tGoodsSn        string `gorm:\"type:varchar(100);not null;comment:商品编号\"`\n\tGoodsName      string `gorm:\"type:varchar(100);not null;comment:商品名称\"`\n\tSkuName        string `gorm:\"type:varchar(100);comment:SKU名称;not null\"`\n\tSkuCode        string `gorm:\"type:varchar(100);comment:SKUCode;not null\"`\n\tBarCode        string `gorm:\"type:varchar(100);comment:条码;not null\"`\n\tPrice          int64  `gorm:\"type:int;comment:商品售价;not null\"`\n\tPromotionPrice int64  `gorm:\"type:int;comment:商品促销售价;not null\"`\n\tPoints         int64  `gorm:\"type:int;comment:赠送积分;not null\"`\n\tRemarksInfo    string `gorm:\"type:varchar(100);comment:备注信息;not null\"`\n\tPic            string `gorm:\"type:varchar(500);not null;comment:规格参数对应的图片\" json:\"pic\"`\n\tOnSale         bool   `gorm:\"comment:是否上架;default:false;not null\"`\n\tAttrInfo       string `gorm:\"type:varchar(2000);comment:商品属性信息JSON;not null\"`\n\tInventory      int64  `gorm:\"type:int;comment:商品SKU库存冗余字段;not null\"`\n}\n\n// GoodsSpecificationSku 商品规格和商品Sku关联表\ntype GoodsSpecificationSku struct {\n\tBaseFields\n\tSkuID           int64  `gorm:\"index:sku_id;type:int;comment:商品SKU_ID;not null\"`\n\tSkuCode         string `gorm:\"type:varchar(100);comment:商品SKU_Code;not null\"`\n\tSpecificationId int64  `gorm:\"index:specification_id;type:int;comment:商品规格ID;not null\"`\n\tValueId         int64  `gorm:\"index:value_id;type:int;comment:商品规格值表ID;not null\"`\n}\n\ntype goodsSkuRepo struct {\n\tdata *Data\n\tlog  *log.Helper\n}\n\n// NewGoodsSkuRepoRepo .\nfunc NewGoodsSkuRepoRepo(data *Data, logger log.Logger) biz.GoodsSkuRepo {\n\treturn &goodsSkuRepo{\n\t\tdata: data,\n\t\tlog:  log.NewHelper(logger),\n\t}\n}\n\nfunc (p *GoodsSku) ToDomain() *domain.GoodsSku {\n\treturn &domain.GoodsSku{\n\t\tID:             p.ID,\n\t\tGoodsID:        p.GoodsID,\n\t\tGoodsSn:        p.GoodsSn,\n\t\tGoodsName:      p.GoodsName,\n\t\tSkuName:        p.SkuName,\n\t\tSkuCode:        p.SkuCode,\n\t\tBarCode:        p.BarCode,\n\t\tPrice:          p.Price,\n\t\tPromotionPrice: p.PromotionPrice,\n\t\tPoints:         p.Points,\n\t\tRemarksInfo:    p.RemarksInfo,\n\t\tPic:            p.Pic,\n\t\tInventory:      p.Inventory,\n\t\tOnSale:         p.OnSale,\n\t\tAttrInfo:       p.AttrInfo,\n\t}\n}\n\nfunc (g *goodsSkuRepo) Create(ctx context.Context, req *domain.GoodsSku) (*domain.GoodsSku, error) {\n\tsku := &GoodsSku{\n\t\tGoodsID:        req.GoodsID,\n\t\tGoodsSn:        req.GoodsSn,\n\t\tGoodsName:      req.GoodsName,\n\t\tSkuName:        req.SkuName,\n\t\tSkuCode:        req.SkuCode,\n\t\tBarCode:        req.BarCode,\n\t\tPrice:          req.Price,\n\t\tPromotionPrice: req.PromotionPrice,\n\t\tPoints:         req.Points,\n\t\tRemarksInfo:    req.RemarksInfo,\n\t\tPic:            req.Pic,\n\t\tOnSale:         req.OnSale,\n\t\tAttrInfo:       req.AttrInfo,\n\t\tInventory:      req.Inventory,\n\t}\n\n\tif err := g.data.DB(ctx).Save(sku).Error; err != nil {\n\t\treturn nil, errors.InternalServer(\"SKU_SAVE_ERROR\", err.Error())\n\t}\n\treturn sku.ToDomain(), nil\n}\n\nfunc (g *goodsSkuRepo) CreateSkuRelation(ctx context.Context, req []*domain.GoodsSpecificationSku) error {\n\tvar info []*GoodsSpecificationSku\n\tfor _, sku := range req {\n\t\ti := GoodsSpecificationSku{\n\t\t\tSkuID:           sku.SkuID,\n\t\t\tSkuCode:         sku.SkuCode,\n\t\t\tSpecificationId: sku.SpecificationId,\n\t\t\tValueId:         sku.ValueId,\n\t\t}\n\t\tinfo = append(info, &i)\n\t}\n\tif err := g.data.DB(ctx).Table(\"goods_specification_skus\").Save(&info).Error; err != nil {\n\t\treturn errors.InternalServer(\"SKU_RELATION_SAVE_ERROR\", err.Error())\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "service/goods/internal/data/inventory.go",
    "content": "package data\n\nimport (\n\t\"context\"\n\t\"github.com/go-kratos/kratos/v2/errors\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"goods/internal/biz\"\n\t\"goods/internal/domain\"\n)\n\ntype GoodsInventory struct {\n\tBaseFields\n\tSkuID     int64 `gorm:\"index:sku_id;type:int;comment:商品SKU_ID;not null\"`\n\tInventory int64 `gorm:\"type:int;comment:商品库存;not null\"`\n}\n\ntype inventoryRepo struct {\n\tdata *Data\n\tlog  *log.Helper\n}\n\n// NewInventoryRepo .\nfunc NewInventoryRepo(data *Data, logger log.Logger) biz.InventoryRepo {\n\treturn &inventoryRepo{\n\t\tdata: data,\n\t\tlog:  log.NewHelper(logger),\n\t}\n}\n\nfunc (p *GoodsInventory) ToDomain() *domain.Inventory {\n\treturn &domain.Inventory{\n\t\tID:        p.ID,\n\t\tSkuID:     p.SkuID,\n\t\tInventory: p.Inventory,\n\t}\n}\n\nfunc (i inventoryRepo) Create(ctx context.Context, inventory *domain.Inventory) (*domain.Inventory, error) {\n\tinfo := GoodsInventory{\n\t\tSkuID:     inventory.SkuID,\n\t\tInventory: inventory.Inventory,\n\t}\n\tif err := i.data.DB(ctx).Save(&info).Error; err != nil {\n\t\treturn nil, errors.InternalServer(\"INENNTORY_SAVE_ERROR\", err.Error())\n\t}\n\treturn info.ToDomain(), nil\n}\n"
  },
  {
    "path": "service/goods/internal/data/specifications.go",
    "content": "package data\n\nimport (\n\t\"context\"\n\t\"goods/internal/biz\"\n\t\"goods/internal/domain\"\n\t\"time\"\n\n\t\"github.com/go-kratos/kratos/v2/errors\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"gorm.io/gorm\"\n)\n\n// SpecificationsAttr 规格参数信息表\ntype SpecificationsAttr struct {\n\tID        int64          `gorm:\"primarykey;type:int\" json:\"id\"`\n\tTypeID    int64          `gorm:\"index:type_id;type:int;comment:商品类型ID;not null\"`\n\tName      string         `gorm:\"type:varchar(250);not null;comment:规格参数名称\" json:\"name\"`\n\tSort      int32          `gorm:\"comment:规格排序;default:99;not null;type:int\" json:\"sort\"`\n\tStatus    bool           `gorm:\"comment:参数状态;default:false\" json:\"status\"`\n\tIsSKU     bool           `gorm:\"comment:是否通用的SKU持有;default:false\" json:\"is_sku\"`\n\tIsSelect  bool           `gorm:\"comment:是否可查询;default:false\" json:\"is_select\"`\n\tCreatedAt time.Time      `gorm:\"column:add_time\" json:\"created_at\"`\n\tUpdatedAt time.Time      `gorm:\"column:update_time\" json:\"updated_at\"`\n\tDeletedAt gorm.DeletedAt `json:\"deleted_at\"`\n}\n\n// SpecificationsAttrValue 规格参数信息选项表\ntype SpecificationsAttrValue struct {\n\tID        int64          `gorm:\"primarykey;type:int\" json:\"id\"`\n\tAttrId    int64          `gorm:\"index:attr_id;type:int;comment:规格ID;not null\"`\n\tValue     string         `gorm:\"type:varchar(250);not null;comment:规格参数信息值\" json:\"value\"`\n\tSort      int32          `gorm:\"comment:规格参数值排序;default:99;not null;type:int\" json:\"sort\"`\n\tCreatedAt time.Time      `gorm:\"column:add_time\" json:\"created_at\"`\n\tUpdatedAt time.Time      `gorm:\"column:update_time\" json:\"updated_at\"`\n\tDeletedAt gorm.DeletedAt `json:\"deleted_at\"`\n}\n\ntype specificationRepo struct {\n\tdata *Data\n\tlog  *log.Helper\n}\n\n// NewSpecificationRepo .\nfunc NewSpecificationRepo(data *Data, logger log.Logger) biz.SpecificationRepo {\n\treturn &specificationRepo{\n\t\tdata: data,\n\t\tlog:  log.NewHelper(logger),\n\t}\n}\n\nfunc (p *SpecificationsAttr) ToDomain() *domain.Specification {\n\treturn &domain.Specification{\n\t\tID:       p.ID,\n\t\tTypeID:   p.TypeID,\n\t\tName:     p.Name,\n\t\tSort:     p.Sort,\n\t\tStatus:   p.Status,\n\t\tIsSKU:    p.IsSKU,\n\t\tIsSelect: p.IsSelect,\n\t}\n}\n\nfunc (g *specificationRepo) CreateSpecification(ctx context.Context, req *domain.Specification) (int64, error) {\n\ts := &SpecificationsAttr{\n\t\tTypeID:    req.TypeID,\n\t\tName:      req.Name,\n\t\tSort:      req.Sort,\n\t\tStatus:    req.Status,\n\t\tIsSKU:     req.IsSKU,\n\t\tIsSelect:  req.IsSelect,\n\t\tCreatedAt: time.Time{},\n\t\tUpdatedAt: time.Time{},\n\t}\n\tif err := g.data.DB(ctx).Save(s).Error; err != nil {\n\t\treturn 0, errors.InternalServer(\"SPECIFICATION_SAVED_ERROR\", err.Error())\n\t}\n\treturn s.ID, nil\n}\n\nfunc (g *specificationRepo) CreateSpecificationValue(ctx context.Context, AttrId int64, req []*domain.SpecificationValue) error {\n\tvar value []*SpecificationsAttrValue\n\tfor _, v := range req {\n\t\tres := &SpecificationsAttrValue{\n\t\t\tAttrId:    AttrId,\n\t\t\tValue:     v.Value,\n\t\t\tSort:      v.Sort,\n\t\t\tCreatedAt: time.Time{},\n\t\t\tUpdatedAt: time.Time{},\n\t\t}\n\t\tvalue = append(value, res)\n\t}\n\tif err := g.data.DB(ctx).Create(&value).Error; err != nil {\n\t\treturn errors.InternalServer(\"SPECIFICATION_VALUE_SAVED_ERROR\", err.Error())\n\t}\n\treturn nil\n}\n\nfunc (g *specificationRepo) ListByIds(ctx context.Context, id ...*int64) (domain.SpecificationList, error) {\n\tvar l []*SpecificationsAttr\n\tif err := g.data.DB(ctx).Where(\"id IN (?)\", id).Find(&l).Error; err != nil {\n\t\treturn nil, errors.NotFound(\"SPECIFICATION_NOT_FOUND\", \"规格不存在\")\n\t}\n\n\tvar res domain.SpecificationList\n\tfor _, item := range l {\n\t\tres = append(res, item.ToDomain())\n\t}\n\treturn res, nil\n}\n"
  },
  {
    "path": "service/goods/internal/domain/brand.go",
    "content": "package domain\n\ntype Brand struct {\n\tID    int32\n\tName  string\n\tLogo  string\n\tDesc  string\n\tIsTab bool\n\tSort  int32\n}\n\nfunc (b *Brand) IsNotExist(id int32) bool {\n\treturn false\n}\n\ntype BrandList []*Brand\n\nfunc (b BrandList) FindById(id int32) *Brand {\n\tfor _, item := range b {\n\t\tif item.ID == id {\n\t\t\treturn item\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (b BrandList) CheckLength(length int) bool {\n\treturn len(b) == length\n}\n"
  },
  {
    "path": "service/goods/internal/domain/es_goods.go",
    "content": "package domain\n\nimport \"github.com/olivere/elastic/v7\"\n\ntype ESGoodsFilter struct {\n\tID          int64\n\tCategoryID  int32\n\tBrandsID    int32\n\tKeywords    string\n\tOnSale      bool\n\tShipFree    bool\n\tIsNew       bool\n\tIsHot       bool\n\tClickNum    int64\n\tSoldNum     int64\n\tFavNum      int64\n\tMaxPrice    int64\n\tMinPrice    int64\n\tPages       int64\n\tPagePerNums int64\n}\n\ntype ESGoods struct {\n\tID           int64   `json:\"id\"`\n\tCategoryID   int32   `json:\"category_id\"`\n\tCategoryName string  `json:\"category_name\"`\n\tBrandsID     int32   `json:\"brands_id\"`\n\tBrandName    string  `json:\"brand_name\"`\n\tTypeID       int64   `json:\"type_id\"`\n\tTypeName     string  `json:\"type_name\"`\n\tOnSale       bool    `json:\"on_sale\"`\n\tShipFree     bool    `json:\"ship_free\"`\n\tIsNew        bool    `json:\"is_new\"`\n\tIsHot        bool    `json:\"is_hot\"`\n\tName         string  `json:\"name\"`\n\tGoodsTags    string  `json:\"goods_tags\"`\n\tClickNum     int64   `json:\"click_num\"`\n\tSoldNum      int64   `json:\"sold_num\"`\n\tFavNum       int64   `json:\"fav_num\"`\n\tMarketPrice  int64   `json:\"market_price\"`\n\tGoodsBrief   string  `json:\"goods_brief\"`\n\tPages        int64   `json:\"pages\"`\n\tPagePerNums  int64   `json:\"page_pre_num\"`\n\tSku          []EsSku `json:\"sku\"`\n}\ntype EsSku struct {\n\tSkuID    int64  `json:\"sku_id\"`\n\tSkuName  string `json:\"sku_name\"`\n\tSkuPrice int64  `json:\"sku_price\"`\n}\n\ntype EsSearch struct {\n\tMustQuery    []elastic.Query\n\tMustNotQuery []elastic.Query\n\tShouldQuery  []elastic.Query\n\tFilters      []elastic.Query\n\tSorters      []elastic.Sorter\n\tForm         int64 // 分页\n\tSize         int64\n}\n"
  },
  {
    "path": "service/goods/internal/domain/goods.go",
    "content": "package domain\n\ntype Goods struct {\n\tID              int64\n\tCategoryID      int32\n\tBrandsID        int32\n\tTypeID          int64\n\tName            string\n\tNameAlias       string\n\tGoodsSn         string\n\tGoodsTags       string\n\tMarketPrice     int64\n\tGoodsBrief      string\n\tGoodsFrontImage string\n\tGoodsImages     []string\n\tOnSale          bool\n\tShipFree        bool\n\tShipID          int32\n\tIsNew           bool\n\tIsHot           bool\n\tClickNum        int64\n\tSoldNum         int64\n\tFavNum          int64\n\tSku             []*GoodsSku\n}\n\ntype GoodsInfoResponse struct {\n\tGoodsID int64\n}\n\ntype GoodsListResponse struct {\n\tTotal int64\n\tList  []*Goods\n}\n"
  },
  {
    "path": "service/goods/internal/domain/goods_attr.go",
    "content": "package domain\n\ntype AttrGroup struct {\n\tID     int64\n\tTypeID int64\n\tTitle  string\n\tDesc   string\n\tStatus bool\n\tSort   int32\n}\n\nfunc (p AttrGroup) IsTypeIDEmpty() bool {\n\treturn p.TypeID == 0\n}\n\ntype GoodsAttr struct {\n\tID             int64\n\tTypeID         int64\n\tGroupID        int64\n\tTitle          string\n\tSort           int32\n\tStatus         bool\n\tDesc           string\n\tGoodsAttrValue []*GoodsAttrValue\n}\n\nfunc (p GoodsAttr) IsTypeIDEmpty() bool {\n\treturn p.TypeID == 0\n}\n\ntype GoodsAttrValue struct {\n\tID      int64\n\tAttrId  int64\n\tGroupID int64\n\tValue   string\n}\n\nfunc (p GoodsAttrValue) IsValueEmpty() bool {\n\treturn p.Value == \"\"\n}\n\ntype GoodsAttrList []*GoodsAttr\n\nfunc (p GoodsAttrList) FindById(id int64) *GoodsAttr {\n\tfor _, item := range p {\n\t\tif item.ID == id {\n\t\t\treturn item\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (p GoodsAttrList) IsNotExist(groupId, attrId int64) bool {\n\tfor _, item := range p {\n\t\tif item.GroupID != groupId && item.ID != attrId {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n"
  },
  {
    "path": "service/goods/internal/domain/goods_sku.go",
    "content": "package domain\n\ntype GoodsSku struct {\n\tID             int64\n\tGoodsID        int64\n\tGoodsSn        string\n\tGoodsName      string\n\tSkuName        string\n\tSkuCode        string\n\tBarCode        string\n\tPrice          int64\n\tPromotionPrice int64\n\tPoints         int64\n\tRemarksInfo    string\n\tPic            string\n\tInventory      int64\n\tOnSale         bool\n\tAttrInfo       string\n\tSpecification  []*SpecificationInfo\n\tGroupAttr      []*GroupAttr\n}\n\ntype SpecificationInfo struct {\n\tSpecificationID      int64\n\tSpecificationValueID int64\n}\n\ntype GroupAttr struct {\n\tGroupId   int64   `json:\"group_id\"`\n\tGroupName string  `json:\"group_name\"`\n\tAttr      []*Attr `json:\"attr\"`\n}\n\ntype Attr struct {\n\tAttrID        int64  `json:\"attr_id\"`\n\tAttrName      string `json:\"attr_name\"`\n\tAttrValueID   int64  `json:\"attr_value_id\"`\n\tAttrValueName string `json:\"attr_value_name\"`\n}\n\ntype GoodsSpecificationSku struct {\n\tID              int64\n\tSkuID           int64\n\tSkuCode         string\n\tSpecificationId int64\n\tValueId         int64\n}\n"
  },
  {
    "path": "service/goods/internal/domain/goods_type.go",
    "content": "package domain\n\nimport (\n\t\"strconv\"\n\t\"strings\"\n)\n\ntype GoodsType struct {\n\tID        int64\n\tName      string\n\tTypeCode  string\n\tNameAlias string\n\tIsVirtual bool\n\tDesc      string\n\tSort      int32\n\tBrandIds  string\n}\n\nfunc (b *GoodsType) IsEmpty() bool {\n\treturn b.BrandIds == \"\"\n}\n\nfunc (b *GoodsType) FormatBrandIds() ([]int32, error) {\n\tids := strings.Replace(b.BrandIds, \"，\", \",\", -1)\n\tIds := strings.Split(ids, \",\")\n\n\tvar i []int32\n\tfor _, bid := range Ids {\n\t\tif bid == \"\" {\n\t\t\tcontinue\n\t\t}\n\n\t\tj, err := strconv.ParseInt(bid, 10, 32)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\ti = append(i, int32(j))\n\t}\n\treturn i, nil\n}\n"
  },
  {
    "path": "service/goods/internal/domain/inventory.go",
    "content": "package domain\n\ntype Inventory struct {\n\tID        int64\n\tSkuID     int64\n\tInventory int64\n}\n"
  },
  {
    "path": "service/goods/internal/domain/specification.go",
    "content": "package domain\n\ntype SpecificationValue struct {\n\tID     int64\n\tAttrId int64\n\tValue  string\n\tSort   int32\n}\n\ntype Specification struct {\n\tID                 int64\n\tTypeID             int64\n\tName               string\n\tSort               int32\n\tStatus             bool\n\tIsSKU              bool\n\tIsSelect           bool\n\tSpecificationValue []*SpecificationValue\n}\n\nfunc (b *Specification) IsTypeIDEmpty() bool {\n\treturn b.TypeID == 0\n}\n\nfunc (b *Specification) IsValueEmpty() bool {\n\treturn b.SpecificationValue == nil\n}\n\ntype SpecificationList []*Specification\n\nfunc (p SpecificationList) FindById(id int64) *Specification {\n\tfor _, item := range p {\n\t\tif item.ID == id {\n\t\t\treturn item\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "service/goods/internal/server/grpc.go",
    "content": "package server\n\nimport (\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"github.com/go-kratos/kratos/v2/middleware/logging\"\n\t\"github.com/go-kratos/kratos/v2/middleware/recovery\"\n\t\"github.com/go-kratos/kratos/v2/middleware/validate\"\n\t\"github.com/go-kratos/kratos/v2/transport/grpc\"\n\tv1 \"goods/api/goods/v1\"\n\t\"goods/internal/conf\"\n\t\"goods/internal/service\"\n)\n\n// NewGRPCServer new a gRPC s.\nfunc NewGRPCServer(c *conf.Server, greeter *service.GoodsService, logger log.Logger) *grpc.Server {\n\tvar opts = []grpc.ServerOption{\n\t\tgrpc.Middleware(\n\t\t\trecovery.Recovery(),\n\t\t\tvalidate.Validator(),\n\t\t\tlogging.Server(logger),\n\t\t),\n\t}\n\tif c.Grpc.Network != \"\" {\n\t\topts = append(opts, grpc.Network(c.Grpc.Network))\n\t}\n\tif c.Grpc.Addr != \"\" {\n\t\topts = append(opts, grpc.Address(c.Grpc.Addr))\n\t}\n\tif c.Grpc.Timeout != nil {\n\t\topts = append(opts, grpc.Timeout(c.Grpc.Timeout.AsDuration()))\n\t}\n\tsrv := grpc.NewServer(opts...)\n\tv1.RegisterGoodsServer(srv, greeter)\n\treturn srv\n}\n"
  },
  {
    "path": "service/goods/internal/server/server.go",
    "content": "package server\n\nimport (\n\t\"github.com/go-kratos/kratos/v2/registry\"\n\t\"github.com/google/wire\"\n\t\"goods/internal/conf\"\n\n\t\"github.com/go-kratos/kratos/contrib/registry/consul/v2\"\n\tconsulAPI \"github.com/hashicorp/consul/api\"\n)\n\n// ProviderSet is s providers.\nvar ProviderSet = wire.NewSet(NewGRPCServer, NewRegistrar)\n\n// NewRegistrar 引入 consul\nfunc NewRegistrar(conf *conf.Registry) registry.Registrar {\n\tc := consulAPI.DefaultConfig()\n\tc.Address = conf.Consul.Address\n\tc.Scheme = conf.Consul.Scheme\n\n\tcli, err := consulAPI.NewClient(c)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tr := consul.New(cli, consul.WithHealthCheck(false))\n\treturn r\n}\n"
  },
  {
    "path": "service/goods/internal/service/README.md",
    "content": "# Service\n"
  },
  {
    "path": "service/goods/internal/service/brand.go",
    "content": "package service\n\nimport (\n\t\"context\"\n\tv1 \"goods/api/goods/v1\"\n\t\"goods/internal/biz\"\n\t\"goods/internal/domain\"\n\t\"google.golang.org/protobuf/types/known/emptypb\"\n)\n\n// CreateBrand 创建品牌\nfunc (g *GoodsService) CreateBrand(ctx context.Context, r *v1.BrandRequest) (*v1.BrandInfoResponse, error) {\n\tbrand, err := g.bc.CreateBrand(ctx, toBiz(r))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &v1.BrandInfoResponse{\n\t\tId:    brand.ID,\n\t\tName:  brand.Name,\n\t\tLogo:  brand.Logo,\n\t\tDesc:  brand.Desc,\n\t\tIsTab: brand.IsTab,\n\t\tSort:  brand.Sort,\n\t}, nil\n}\n\nfunc (g *GoodsService) UpdateBrand(ctx context.Context, r *v1.BrandRequest) (*emptypb.Empty, error) {\n\terr := g.bc.UpdateBrand(ctx, toBiz(r))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &emptypb.Empty{}, nil\n}\n\nfunc (g *GoodsService) BrandList(ctx context.Context, r *v1.BrandListRequest) (*v1.BrandListResponse, error) {\n\tlist, total, err := g.bc.BrandList(ctx, &biz.Pagination{\n\t\tPageNum:  int(r.PagePerNums),\n\t\tPageSize: int(r.Pages),\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvar rs v1.BrandListResponse\n\trs.Total = int32(total)\n\tfor _, x := range list {\n\t\tinfo := toProto(x)\n\t\trs.Data = append(rs.Data, info)\n\t}\n\treturn &rs, nil\n}\n\nfunc toProto(r *domain.Brand) *v1.BrandInfoResponse {\n\treturn &v1.BrandInfoResponse{\n\t\tId:    r.ID,\n\t\tName:  r.Name,\n\t\tLogo:  r.Logo,\n\t\tDesc:  r.Desc,\n\t\tIsTab: r.IsTab,\n\t\tSort:  r.Sort,\n\t}\n}\n\nfunc toBiz(r *v1.BrandRequest) *domain.Brand {\n\treturn &domain.Brand{\n\t\tID:    r.Id,\n\t\tName:  r.Name,\n\t\tLogo:  r.Logo,\n\t\tDesc:  r.Desc,\n\t\tIsTab: r.IsTab,\n\t\tSort:  r.Sort,\n\t}\n}\n"
  },
  {
    "path": "service/goods/internal/service/category.go",
    "content": "package service\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\tv1 \"goods/api/goods/v1\"\n\t\"goods/internal/biz\"\n\t\"google.golang.org/protobuf/types/known/emptypb\"\n)\n\nfunc (g *GoodsService) DeleteCategory(ctx context.Context, r *v1.DeleteCategoryRequest) (*emptypb.Empty, error) {\n\terr := g.cac.DeleteCategory(ctx, &biz.CategoryInfo{\n\t\tID: r.Id,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &emptypb.Empty{}, nil\n}\n\nfunc (g *GoodsService) UpdateCategory(ctx context.Context, r *v1.CategoryInfoRequest) (*emptypb.Empty, error) {\n\terr := g.cac.UpdateCategory(ctx, &biz.CategoryInfo{\n\t\tID:             r.Id,\n\t\tName:           r.Name,\n\t\tParentCategory: r.ParentCategory,\n\t\tLevel:          r.Level,\n\t\tIsTab:          r.IsTab,\n\t\tSort:           r.Sort,\n\t})\n\treturn &emptypb.Empty{}, err\n}\n\n// CreateCategory 创建分类\nfunc (g *GoodsService) CreateCategory(ctx context.Context, r *v1.CategoryInfoRequest) (*v1.CategoryInfoResponse, error) {\n\tresult, err := g.cac.CreateCategory(ctx, &biz.CategoryInfo{\n\t\tName:           r.Name,\n\t\tParentCategory: r.ParentCategory,\n\t\tLevel:          r.Level,\n\t\tIsTab:          r.IsTab,\n\t\tSort:           r.Sort,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &v1.CategoryInfoResponse{\n\t\tId:             result.ID,\n\t\tName:           result.Name,\n\t\tParentCategory: result.ParentCategory,\n\t\tLevel:          result.Level,\n\t\tIsTab:          result.IsTab,\n\t\tSort:           result.Sort,\n\t}, nil\n}\n\nfunc (g *GoodsService) GetAllCategoryList(ctx context.Context, r *emptypb.Empty) (*v1.CategoryListResponse, error) {\n\tcate, err := g.cac.CategoryList(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tjsonData, _ := json.Marshal(cate)\n\tres := &v1.CategoryListResponse{\n\t\tJsonData: string(jsonData),\n\t}\n\treturn res, nil\n}\n\n// GetSubCategory 获取子分类\nfunc (g *GoodsService) GetSubCategory(ctx context.Context, r *v1.CategoryListRequest) (*v1.SubCategoryListResponse, error) {\n\tlist, err := g.cac.SubCategoryList(ctx, r.Id)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tcategoryListRes := v1.SubCategoryListResponse{}\n\tcategoryListRes.Info = &v1.CategoryInfoResponse{\n\t\tId:             list.Category.ID,\n\t\tName:           list.Category.Name,\n\t\tParentCategory: list.Category.ParentCategory,\n\t\tLevel:          list.Category.Level,\n\t\tIsTab:          list.Category.IsTab,\n\t}\n\n\tvar subCategoryResponse []*v1.CategoryInfoResponse\n\tfor _, subC := range list.SubCategory {\n\t\tsubCategoryResponse = append(subCategoryResponse, &v1.CategoryInfoResponse{\n\t\t\tId:             subC.ID,\n\t\t\tName:           subC.Name,\n\t\t\tParentCategory: subC.ParentCategory,\n\t\t\tLevel:          subC.Level,\n\t\t\tIsTab:          subC.IsTab,\n\t\t})\n\t}\n\n\tcategoryListRes.SubCategory = subCategoryResponse\n\treturn &categoryListRes, nil\n}\n"
  },
  {
    "path": "service/goods/internal/service/goods.go",
    "content": "package service\n\nimport (\n\t\"context\"\n\tv1 \"goods/api/goods/v1\"\n\t\"goods/internal/domain\"\n)\n\n// CreateGoods 创建商品\nfunc (g *GoodsService) CreateGoods(ctx context.Context, r *v1.CreateGoodsRequest) (*v1.CreateGoodsResponse, error) {\n\tvar goodsSku []*domain.GoodsSku\n\tfor _, sku := range r.Sku {\n\t\tres := &domain.GoodsSku{\n\t\t\tGoodsName:      r.Name,\n\t\t\tGoodsSn:        r.GoodsSn,\n\t\t\tSkuName:        sku.SkuName,\n\t\t\tSkuCode:        sku.Code,\n\t\t\tBarCode:        sku.BarCode,\n\t\t\tPrice:          sku.Price,\n\t\t\tPromotionPrice: sku.PromotionPrice,\n\t\t\tPoints:         sku.Points,\n\t\t\tPic:            sku.Image,\n\t\t\tInventory:      sku.Inventory,\n\t\t\tOnSale:         r.OnSale,\n\t\t}\n\n\t\tfor _, specification := range sku.SpecificationInfo {\n\t\t\ts := &domain.SpecificationInfo{\n\t\t\t\tSpecificationID:      specification.SId,\n\t\t\t\tSpecificationValueID: specification.VId,\n\t\t\t}\n\t\t\tres.Specification = append(res.Specification, s)\n\t\t}\n\t\tfor _, attrGroup := range sku.GroupAttrInfo {\n\t\t\tgroup := &domain.GroupAttr{\n\t\t\t\tGroupId:   attrGroup.GroupId,\n\t\t\t\tGroupName: attrGroup.GroupName,\n\t\t\t}\n\t\t\tfor _, attr := range attrGroup.AttrInfo {\n\t\t\t\ts := &domain.Attr{\n\t\t\t\t\tAttrID:        attr.AttrId,\n\t\t\t\t\tAttrName:      attr.AttrName,\n\t\t\t\t\tAttrValueID:   attr.AttrValueId,\n\t\t\t\t\tAttrValueName: attr.AttrValueName,\n\t\t\t\t}\n\t\t\t\tgroup.Attr = append(group.Attr, s)\n\t\t\t}\n\t\t\tres.GroupAttr = append(res.GroupAttr, group)\n\t\t}\n\t\tgoodsSku = append(goodsSku, res)\n\t}\n\n\tgoodsInfo := domain.Goods{\n\t\tID:              r.Id,\n\t\tCategoryID:      r.CategoryId,\n\t\tBrandsID:        r.BrandId,\n\t\tTypeID:          r.TypeId,\n\t\tName:            r.Name,\n\t\tNameAlias:       r.NameAlias,\n\t\tGoodsSn:         r.GoodsSn,\n\t\tGoodsTags:       r.GoodsTags,\n\t\tMarketPrice:     r.MarketPrice,\n\t\tGoodsBrief:      r.GoodsBrief,\n\t\tGoodsFrontImage: r.GoodsFrontImage,\n\t\tGoodsImages:     r.GoodsImages,\n\t\tOnSale:          r.OnSale,\n\t\tShipFree:        r.ShipFree,\n\t\tShipID:          r.ShipId,\n\t\tIsNew:           r.IsNew,\n\t\tIsHot:           r.IsHot,\n\t\tSku:             goodsSku,\n\t}\n\n\tresult, err := g.g.CreateGoods(ctx, &goodsInfo)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &v1.CreateGoodsResponse{ID: result.GoodsID}, nil\n\n}\n\nfunc (g *GoodsService) GoodsList(ctx context.Context, r *v1.GoodsFilterRequest) (*v1.GoodsListResponse, error) {\n\tgoodsFilter := &domain.ESGoodsFilter{\n\t\tID:          r.Id,\n\t\tCategoryID:  r.CategoryId,\n\t\tBrandsID:    r.BrandId,\n\t\tKeywords:    r.Keywords,\n\t\tIsNew:       r.IsNew,\n\t\tIsHot:       r.IsHot,\n\t\tClickNum:    r.ClickNum,\n\t\tSoldNum:     r.SoldNum,\n\t\tFavNum:      r.FavNum,\n\t\tMaxPrice:    r.MaxPrice,\n\t\tMinPrice:    r.MinPrice,\n\t\tPages:       r.Pages,\n\t\tPagePerNums: r.PagePerNums,\n\t}\n\n\tresult, err := g.esGoods.GoodsList(ctx, goodsFilter)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresponse := v1.GoodsListResponse{\n\t\tTotal: result.Total,\n\t}\n\tfor _, goods := range result.List {\n\t\tres := v1.GoodsInfoResponse{\n\t\t\tId:          goods.ID,\n\t\t\tCategoryId:  goods.CategoryID,\n\t\t\tBrandId:     goods.BrandsID,\n\t\t\tName:        goods.Name,\n\t\t\tGoodsSn:     goods.GoodsSn,\n\t\t\tClickNum:    goods.ClickNum,\n\t\t\tSoldNum:     goods.SoldNum,\n\t\t\tFavNum:      goods.FavNum,\n\t\t\tMarketPrice: goods.MarketPrice,\n\t\t\tGoodsBrief:  goods.GoodsBrief,\n\t\t\tGoodsDesc:   goods.GoodsBrief,\n\t\t\tShipFree:    goods.ShipFree,\n\t\t\tImages:      goods.GoodsFrontImage,\n\t\t\tGoodsImages: goods.GoodsImages,\n\t\t\tIsNew:       goods.IsNew,\n\t\t\tIsHot:       goods.IsHot,\n\t\t\tOnSale:      goods.OnSale,\n\t\t}\n\t\tresponse.List = append(response.List, &res)\n\t}\n\treturn &response, nil\n}\n"
  },
  {
    "path": "service/goods/internal/service/goods_attr.go",
    "content": "package service\n\nimport (\n\t\"context\"\n\n\tv1 \"goods/api/goods/v1\"\n\t\"goods/internal/domain\"\n)\n\n// CreateAttrGroup 创建属性组\nfunc (g *GoodsService) CreateAttrGroup(ctx context.Context, r *v1.AttrGroupRequest) (*v1.AttrGroupResponse, error) {\n\tresult, err := g.ga.CreateAttrGroup(ctx, &domain.AttrGroup{\n\t\tTypeID: r.TypeId,\n\t\tTitle:  r.Title,\n\t\tDesc:   r.Desc,\n\t\tStatus: r.Status,\n\t\tSort:   r.Sort,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &v1.AttrGroupResponse{\n\t\tId:     result.ID,\n\t\tTypeId: result.TypeID,\n\t\tTitle:  result.Title,\n\t\tDesc:   result.Desc,\n\t\tStatus: result.Status,\n\t\tSort:   result.Sort,\n\t}, nil\n}\n\n// CreateAttrValue 创建属性名称和值\nfunc (g *GoodsService) CreateAttrValue(ctx context.Context, r *v1.AttrRequest) (*v1.AttrResponse, error) {\n\tvar value []*domain.GoodsAttrValue\n\tfor _, v := range r.AttrValue {\n\t\tres := &domain.GoodsAttrValue{\n\t\t\tGroupID: v.GroupId,\n\t\t\tValue:   v.Value,\n\t\t}\n\t\tvalue = append(value, res)\n\t}\n\n\tinfo, err := g.ga.CreateAttrValue(ctx, &domain.GoodsAttr{\n\t\tTypeID:         r.TypeId,\n\t\tGroupID:        r.GroupId,\n\t\tTitle:          r.Title,\n\t\tSort:           r.Sort,\n\t\tStatus:         r.Status,\n\t\tDesc:           r.Desc,\n\t\tGoodsAttrValue: value,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvar AttrValue []*v1.AttrValueResponse\n\tfor _, v := range info.GoodsAttrValue {\n\t\tresult := &v1.AttrValueResponse{\n\t\t\tId:      v.ID,\n\t\t\tAttrId:  v.AttrId,\n\t\t\tGroupId: v.GroupID,\n\t\t\tValue:   v.Value,\n\t\t}\n\t\tAttrValue = append(AttrValue, result)\n\t}\n\treturn &v1.AttrResponse{\n\t\tId:        info.ID,\n\t\tTypeId:    info.TypeID,\n\t\tGroupId:   info.GroupID,\n\t\tTitle:     info.Title,\n\t\tDesc:      info.Desc,\n\t\tStatus:    info.Status,\n\t\tSort:      info.Sort,\n\t\tAttrValue: AttrValue,\n\t}, nil\n}\n"
  },
  {
    "path": "service/goods/internal/service/goods_type.go",
    "content": "package service\n\nimport (\n\t\"context\"\n\tv1 \"goods/api/goods/v1\"\n\t\"goods/internal/domain\"\n)\n\nfunc (g *GoodsService) CreateGoodsType(ctx context.Context, r *v1.GoodsTypeRequest) (*v1.GoodsTypeResponse, error) {\n\tid, err := g.gt.GoosTypeCreate(ctx, &domain.GoodsType{\n\t\tName:      r.Name,\n\t\tTypeCode:  r.TypeCode,\n\t\tNameAlias: r.NameAlias,\n\t\tIsVirtual: r.IsVirtual,\n\t\tDesc:      r.Desc,\n\t\tSort:      r.Sort,\n\t\tBrandIds:  r.BrandIds,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &v1.GoodsTypeResponse{\n\t\tId: id,\n\t}, nil\n}\n"
  },
  {
    "path": "service/goods/internal/service/service.go",
    "content": "package service\n\nimport (\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"github.com/google/wire\"\n\tv1 \"goods/api/goods/v1\"\n\t\"goods/internal/biz\"\n)\n\n// ProviderSet is service providers.\nvar ProviderSet = wire.NewSet(NewGoodsService)\n\n// GoodsService is a goods service.\ntype GoodsService struct {\n\tv1.UnimplementedGoodsServer\n\tcac     *biz.CategoryUsecase\n\tbc      *biz.BrandUsecase\n\tgt      *biz.GoodsTypeUsecase\n\ts       *biz.SpecificationUsecase\n\tga      *biz.GoodsAttrUsecase\n\tg       *biz.GoodsUsecase\n\tesGoods *biz.EsGoodsUsecase\n\tlog     *log.Helper\n}\n\n// NewGoodsService new a goods service.\nfunc NewGoodsService(bc *biz.BrandUsecase, cac *biz.CategoryUsecase, gt *biz.GoodsTypeUsecase, s *biz.SpecificationUsecase,\n\tga *biz.GoodsAttrUsecase, gc *biz.GoodsUsecase, esGoods *biz.EsGoodsUsecase, logger log.Logger) *GoodsService {\n\treturn &GoodsService{\n\t\tbc:      bc,\n\t\tcac:     cac,\n\t\tgt:      gt,\n\t\ts:       s,\n\t\tga:      ga,\n\t\tg:       gc,\n\t\tesGoods: esGoods,\n\t\tlog:     log.NewHelper(logger),\n\t}\n}\n"
  },
  {
    "path": "service/goods/internal/service/specifications.go",
    "content": "package service\n\nimport (\n\t\"context\"\n\n\tv1 \"goods/api/goods/v1\"\n\t\"goods/internal/domain\"\n)\n\n// CreateGoodsSpecification 创建商品规格版本\nfunc (g *GoodsService) CreateGoodsSpecification(ctx context.Context, r *v1.SpecificationRequest) (*v1.SpecificationResponse, error) {\n\tvar value []*domain.SpecificationValue\n\t// 组织规格参数值\n\tif r.SpecificationValue != nil {\n\t\tfor _, v := range r.SpecificationValue {\n\t\t\tres := &domain.SpecificationValue{\n\t\t\t\tValue: v.Value,\n\t\t\t\tSort:  v.Sort,\n\t\t\t}\n\t\t\tvalue = append(value, res)\n\t\t}\n\t}\n\n\tid, err := g.s.CreateSpecification(ctx, &domain.Specification{\n\t\tTypeID:             r.TypeId,\n\t\tName:               r.Name,\n\t\tSort:               r.Sort,\n\t\tStatus:             r.Status,\n\t\tIsSKU:              r.IsSku,\n\t\tIsSelect:           r.IsSelect,\n\t\tSpecificationValue: value,\n\t})\n\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &v1.SpecificationResponse{\n\t\tId: id,\n\t}, nil\n}\n"
  },
  {
    "path": "service/goods/openapi.yaml",
    "content": "# Generated with protoc-gen-openapi\n# https://github.com/google/gnostic/tree/master/apps/protoc-gen-openapi\n\nopenapi: 3.0.3\ninfo:\n    title: \"\"\n    version: 0.0.1\npaths: {}\ncomponents:\n    schemas: {}\n"
  },
  {
    "path": "service/goods/third_party/README.md",
    "content": "# third_party\n"
  },
  {
    "path": "service/goods/third_party/errors/errors.proto",
    "content": "syntax = \"proto3\";\n\npackage errors;\n\noption go_package = \"github.com/go-kratos/kratos/v2/errors;errors\";\noption java_multiple_files = true;\noption java_package = \"com.github.kratos.errors\";\noption objc_class_prefix = \"KratosErrors\";\n\nimport \"google/protobuf/descriptor.proto\";\n\nextend google.protobuf.EnumOptions {\n  int32 default_code = 1108;\n}\n\nextend google.protobuf.EnumValueOptions {\n  int32 code = 1109;\n}"
  },
  {
    "path": "service/goods/third_party/google/api/annotations.proto",
    "content": "// Copyright (c) 2015, Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\npackage google.api;\n\nimport \"google/api/http.proto\";\nimport \"google/protobuf/descriptor.proto\";\n\noption go_package = \"google.golang.org/genproto/googleapis/api/annotations;annotations\";\noption java_multiple_files = true;\noption java_outer_classname = \"AnnotationsProto\";\noption java_package = \"com.google.api\";\noption objc_class_prefix = \"GAPI\";\n\nextend google.protobuf.MethodOptions {\n  // See `HttpRule`.\n  HttpRule http = 72295728;\n}\n"
  },
  {
    "path": "service/goods/third_party/google/api/client.proto",
    "content": "// Copyright 2019 Google LLC.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\npackage google.api;\n\nimport \"google/protobuf/descriptor.proto\";\n\noption go_package = \"google.golang.org/genproto/googleapis/api/annotations;annotations\";\noption java_multiple_files = true;\noption java_outer_classname = \"ClientProto\";\noption java_package = \"com.google.api\";\noption objc_class_prefix = \"GAPI\";\n\n\nextend google.protobuf.ServiceOptions {\n  // The hostname for this service.\n  // This should be specified with no prefix or protocol.\n  //\n  // Example:\n  //\n  //   service Foo {\n  //     option (google.api.default_host) = \"foo.googleapi.com\";\n  //     ...\n  //   }\n  string default_host = 1049;\n\n  // OAuth scopes needed for the client.\n  //\n  // Example:\n  //\n  //   service Foo {\n  //     option (google.api.oauth_scopes) = \\\n  //       \"https://www.googleapis.com/auth/cloud-platform\";\n  //     ...\n  //   }\n  //\n  // If there is more than one scope, use a comma-separated string:\n  //\n  // Example:\n  //\n  //   service Foo {\n  //     option (google.api.oauth_scopes) = \\\n  //       \"https://www.googleapis.com/auth/cloud-platform,\"\n  //       \"https://www.googleapis.com/auth/monitoring\";\n  //     ...\n  //   }\n  string oauth_scopes = 1050;\n}\n\n\nextend google.protobuf.MethodOptions {\n  // A definition of a client library method signature.\n  //\n  // In client libraries, each proto RPC corresponds to one or more methods\n  // which the end user is able to call, and calls the underlying RPC.\n  // Normally, this method receives a single argument (a struct or instance\n  // corresponding to the RPC request object). Defining this field will\n  // add one or more overloads providing flattened or simpler method signatures\n  // in some languages.\n  //\n  // The fields on the method signature are provided as a comma-separated\n  // string.\n  //\n  // For example, the proto RPC and annotation:\n  //\n  //   rpc CreateSubscription(CreateSubscriptionRequest)\n  //       returns (Subscription) {\n  //     option (google.api.method_signature) = \"name,topic\";\n  //   }\n  //\n  // Would add the following Java overload (in addition to the method accepting\n  // the request object):\n  //\n  //   public final Subscription createSubscription(String name, String topic)\n  //\n  // The following backwards-compatibility guidelines apply:\n  //\n  //   * Adding this annotation to an unannotated method is backwards\n  //     compatible.\n  //   * Adding this annotation to a method which already has existing\n  //     method signature annotations is backwards compatible if and only if\n  //     the new method signature annotation is last in the sequence.\n  //   * Modifying or removing an existing method signature annotation is\n  //     a breaking change.\n  //   * Re-ordering existing method signature annotations is a breaking\n  //     change.\n  repeated string method_signature = 1051;\n}"
  },
  {
    "path": "service/goods/third_party/google/api/field_behavior.proto",
    "content": "// Copyright 2019 Google LLC.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\npackage google.api;\n\nimport \"google/protobuf/descriptor.proto\";\n\noption go_package = \"google.golang.org/genproto/googleapis/api/annotations;annotations\";\noption java_multiple_files = true;\noption java_outer_classname = \"FieldBehaviorProto\";\noption java_package = \"com.google.api\";\noption objc_class_prefix = \"GAPI\";\n\n\n// An indicator of the behavior of a given field (for example, that a field\n// is required in requests, or given as output but ignored as input).\n// This **does not** change the behavior in protocol buffers itself; it only\n// denotes the behavior and may affect how API tooling handles the field.\n//\n// Note: This enum **may** receive new values in the future.\nenum FieldBehavior {\n  // Conventional default for enums. Do not use this.\n  FIELD_BEHAVIOR_UNSPECIFIED = 0;\n\n  // Specifically denotes a field as optional.\n  // While all fields in protocol buffers are optional, this may be specified\n  // for emphasis if appropriate.\n  OPTIONAL = 1;\n\n  // Denotes a field as required.\n  // This indicates that the field **must** be provided as part of the request,\n  // and failure to do so will cause an error (usually `INVALID_ARGUMENT`).\n  REQUIRED = 2;\n\n  // Denotes a field as output only.\n  // This indicates that the field is provided in responses, but including the\n  // field in a request does nothing (the server *must* ignore it and\n  // *must not* throw an error as a result of the field's presence).\n  OUTPUT_ONLY = 3;\n\n  // Denotes a field as input only.\n  // This indicates that the field is provided in requests, and the\n  // corresponding field is not included in output.\n  INPUT_ONLY = 4;\n\n  // Denotes a field as immutable.\n  // This indicates that the field may be set once in a request to create a\n  // resource, but may not be changed thereafter.\n  IMMUTABLE = 5;\n}\n\n\nextend google.protobuf.FieldOptions {\n  // A designation of a specific field behavior (required, output only, etc.)\n  // in protobuf messages.\n  //\n  // Examples:\n  //\n  //   string name = 1 [(google.api.field_behavior) = REQUIRED];\n  //   State state = 1 [(google.api.field_behavior) = OUTPUT_ONLY];\n  //   google.protobuf.Duration ttl = 1\n  //     [(google.api.field_behavior) = INPUT_ONLY];\n  //   google.protobuf.Timestamp expire_time = 1\n  //     [(google.api.field_behavior) = OUTPUT_ONLY,\n  //      (google.api.field_behavior) = IMMUTABLE];\n  repeated FieldBehavior field_behavior = 1052;\n}"
  },
  {
    "path": "service/goods/third_party/google/api/http.proto",
    "content": "// Copyright 2020 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\npackage google.api;\n\noption cc_enable_arenas = true;\noption go_package = \"google.golang.org/genproto/googleapis/api/annotations;annotations\";\noption java_multiple_files = true;\noption java_outer_classname = \"HttpProto\";\noption java_package = \"com.google.api\";\noption objc_class_prefix = \"GAPI\";\n\n// Defines the HTTP configuration for an API service. It contains a list of\n// [HttpRule][google.api.HttpRule], each specifying the mapping of an RPC method\n// to one or more HTTP REST API methods.\nmessage Http {\n  // A list of HTTP configuration rules that apply to individual API methods.\n  //\n  // **NOTE:** All service configuration rules follow \"last one wins\" order.\n  repeated HttpRule rules = 1;\n\n  // When set to true, URL path parameters will be fully URI-decoded except in\n  // cases of single segment matches in reserved expansion, where \"%2F\" will be\n  // left encoded.\n  //\n  // The default behavior is to not decode RFC 6570 reserved characters in multi\n  // segment matches.\n  bool fully_decode_reserved_expansion = 2;\n}\n\n// # gRPC Transcoding\n//\n// gRPC Transcoding is a feature for mapping between a gRPC method and one or\n// more HTTP REST endpoints. It allows developers to build a single API service\n// that supports both gRPC APIs and REST APIs. Many systems, including [Google\n// APIs](https://github.com/googleapis/googleapis),\n// [Cloud Endpoints](https://cloud.google.com/endpoints), [gRPC\n// Gateway](https://github.com/grpc-ecosystem/grpc-gateway),\n// and [Envoy](https://github.com/envoyproxy/envoy) proxy support this feature\n// and use it for large scale production services.\n//\n// `HttpRule` defines the schema of the gRPC/REST mapping. The mapping specifies\n// how different portions of the gRPC request message are mapped to the URL\n// path, URL query parameters, and HTTP request body. It also controls how the\n// gRPC response message is mapped to the HTTP response body. `HttpRule` is\n// typically specified as an `google.api.http` annotation on the gRPC method.\n//\n// Each mapping specifies a URL path template and an HTTP method. The path\n// template may refer to one or more fields in the gRPC request message, as long\n// as each field is a non-repeated field with a primitive (non-message) type.\n// The path template controls how fields of the request message are mapped to\n// the URL path.\n//\n// Example:\n//\n//     service Messaging {\n//       rpc GetMessage(GetMessageRequest) returns (Message) {\n//         option (google.api.http) = {\n//             get: \"/v1/{name=messages/*}\"\n//         };\n//       }\n//     }\n//     message GetMessageRequest {\n//       string name = 1; // Mapped to URL path.\n//     }\n//     message Message {\n//       string text = 1; // The resource content.\n//     }\n//\n// This enables an HTTP REST to gRPC mapping as below:\n//\n// HTTP | gRPC\n// -----|-----\n// `GET /v1/messages/123456`  | `GetMessage(name: \"messages/123456\")`\n//\n// Any fields in the request message which are not bound by the path template\n// automatically become HTTP query parameters if there is no HTTP request body.\n// For example:\n//\n//     service Messaging {\n//       rpc GetMessage(GetMessageRequest) returns (Message) {\n//         option (google.api.http) = {\n//             get:\"/v1/messages/{message_id}\"\n//         };\n//       }\n//     }\n//     message GetMessageRequest {\n//       message SubMessage {\n//         string subfield = 1;\n//       }\n//       string message_id = 1; // Mapped to URL path.\n//       int64 revision = 2;    // Mapped to URL query parameter `revision`.\n//       SubMessage sub = 3;    // Mapped to URL query parameter `sub.subfield`.\n//     }\n//\n// This enables a HTTP JSON to RPC mapping as below:\n//\n// HTTP | gRPC\n// -----|-----\n// `GET /v1/messages/123456?revision=2&sub.subfield=foo` |\n// `GetMessage(message_id: \"123456\" revision: 2 sub: SubMessage(subfield:\n// \"foo\"))`\n//\n// Note that fields which are mapped to URL query parameters must have a\n// primitive type or a repeated primitive type or a non-repeated message type.\n// In the case of a repeated type, the parameter can be repeated in the URL\n// as `...?param=A&param=B`. In the case of a message type, each field of the\n// message is mapped to a separate parameter, such as\n// `...?foo.a=A&foo.b=B&foo.c=C`.\n//\n// For HTTP methods that allow a request body, the `body` field\n// specifies the mapping. Consider a REST update method on the\n// message resource collection:\n//\n//     service Messaging {\n//       rpc UpdateMessage(UpdateMessageRequest) returns (Message) {\n//         option (google.api.http) = {\n//           patch: \"/v1/messages/{message_id}\"\n//           body: \"message\"\n//         };\n//       }\n//     }\n//     message UpdateMessageRequest {\n//       string message_id = 1; // mapped to the URL\n//       Message message = 2;   // mapped to the body\n//     }\n//\n// The following HTTP JSON to RPC mapping is enabled, where the\n// representation of the JSON in the request body is determined by\n// protos JSON encoding:\n//\n// HTTP | gRPC\n// -----|-----\n// `PATCH /v1/messages/123456 { \"text\": \"Hi!\" }` | `UpdateMessage(message_id:\n// \"123456\" message { text: \"Hi!\" })`\n//\n// The special name `*` can be used in the body mapping to define that\n// every field not bound by the path template should be mapped to the\n// request body.  This enables the following alternative definition of\n// the update method:\n//\n//     service Messaging {\n//       rpc UpdateMessage(Message) returns (Message) {\n//         option (google.api.http) = {\n//           patch: \"/v1/messages/{message_id}\"\n//           body: \"*\"\n//         };\n//       }\n//     }\n//     message Message {\n//       string message_id = 1;\n//       string text = 2;\n//     }\n//\n//\n// The following HTTP JSON to RPC mapping is enabled:\n//\n// HTTP | gRPC\n// -----|-----\n// `PATCH /v1/messages/123456 { \"text\": \"Hi!\" }` | `UpdateMessage(message_id:\n// \"123456\" text: \"Hi!\")`\n//\n// Note that when using `*` in the body mapping, it is not possible to\n// have HTTP parameters, as all fields not bound by the path end in\n// the body. This makes this option more rarely used in practice when\n// defining REST APIs. The common usage of `*` is in custom methods\n// which don't use the URL at all for transferring data.\n//\n// It is possible to define multiple HTTP methods for one RPC by using\n// the `additional_bindings` option. Example:\n//\n//     service Messaging {\n//       rpc GetMessage(GetMessageRequest) returns (Message) {\n//         option (google.api.http) = {\n//           get: \"/v1/messages/{message_id}\"\n//           additional_bindings {\n//             get: \"/v1/users/{user_id}/messages/{message_id}\"\n//           }\n//         };\n//       }\n//     }\n//     message GetMessageRequest {\n//       string message_id = 1;\n//       string user_id = 2;\n//     }\n//\n// This enables the following two alternative HTTP JSON to RPC mappings:\n//\n// HTTP | gRPC\n// -----|-----\n// `GET /v1/messages/123456` | `GetMessage(message_id: \"123456\")`\n// `GET /v1/users/me/messages/123456` | `GetMessage(user_id: \"me\" message_id:\n// \"123456\")`\n//\n// ## Rules for HTTP mapping\n//\n// 1. Leaf request fields (recursive expansion nested messages in the request\n//    message) are classified into three categories:\n//    - Fields referred by the path template. They are passed via the URL path.\n//    - Fields referred by the [HttpRule.body][google.api.HttpRule.body]. They are passed via the HTTP\n//      request body.\n//    - All other fields are passed via the URL query parameters, and the\n//      parameter name is the field path in the request message. A repeated\n//      field can be represented as multiple query parameters under the same\n//      name.\n//  2. If [HttpRule.body][google.api.HttpRule.body] is \"*\", there is no URL query parameter, all fields\n//     are passed via URL path and HTTP request body.\n//  3. If [HttpRule.body][google.api.HttpRule.body] is omitted, there is no HTTP request body, all\n//     fields are passed via URL path and URL query parameters.\n//\n// ### Path template syntax\n//\n//     Template = \"/\" Segments [ Verb ] ;\n//     Segments = Segment { \"/\" Segment } ;\n//     Segment  = \"*\" | \"**\" | LITERAL | Variable ;\n//     Variable = \"{\" FieldPath [ \"=\" Segments ] \"}\" ;\n//     FieldPath = IDENT { \".\" IDENT } ;\n//     Verb     = \":\" LITERAL ;\n//\n// The syntax `*` matches a single URL path segment. The syntax `**` matches\n// zero or more URL path segments, which must be the last part of the URL path\n// except the `Verb`.\n//\n// The syntax `Variable` matches part of the URL path as specified by its\n// template. A variable template must not contain other variables. If a variable\n// matches a single path segment, its template may be omitted, e.g. `{var}`\n// is equivalent to `{var=*}`.\n//\n// The syntax `LITERAL` matches literal text in the URL path. If the `LITERAL`\n// contains any reserved character, such characters should be percent-encoded\n// before the matching.\n//\n// If a variable contains exactly one path segment, such as `\"{var}\"` or\n// `\"{var=*}\"`, when such a variable is expanded into a URL path on the client\n// side, all characters except `[-_.~0-9a-zA-Z]` are percent-encoded. The\n// server side does the reverse decoding. Such variables show up in the\n// [Discovery\n// Document](https://developers.google.com/discovery/v1/reference/apis) as\n// `{var}`.\n//\n// If a variable contains multiple path segments, such as `\"{var=foo/*}\"`\n// or `\"{var=**}\"`, when such a variable is expanded into a URL path on the\n// client side, all characters except `[-_.~/0-9a-zA-Z]` are percent-encoded.\n// The server side does the reverse decoding, except \"%2F\" and \"%2f\" are left\n// unchanged. Such variables show up in the\n// [Discovery\n// Document](https://developers.google.com/discovery/v1/reference/apis) as\n// `{+var}`.\n//\n// ## Using gRPC API Service Configuration\n//\n// gRPC API Service Configuration (service config) is a configuration language\n// for configuring a gRPC service to become a user-facing product. The\n// service config is simply the YAML representation of the `google.api.Service`\n// proto message.\n//\n// As an alternative to annotating your proto file, you can configure gRPC\n// transcoding in your service config YAML files. You do this by specifying a\n// `HttpRule` that maps the gRPC method to a REST endpoint, achieving the same\n// effect as the proto annotation. This can be particularly useful if you\n// have a proto that is reused in multiple services. Note that any transcoding\n// specified in the service config will override any matching transcoding\n// configuration in the proto.\n//\n// Example:\n//\n//     http:\n//       rules:\n//         # Selects a gRPC method and applies HttpRule to it.\n//         - selector: example.v1.Messaging.GetMessage\n//           get: /v1/messages/{message_id}/{sub.subfield}\n//\n// ## Special notes\n//\n// When gRPC Transcoding is used to map a gRPC to JSON REST endpoints, the\n// proto to JSON conversion must follow the [proto3\n// specification](https://developers.google.com/protocol-buffers/docs/proto3#json).\n//\n// While the single segment variable follows the semantics of\n// [RFC 6570](https://tools.ietf.org/html/rfc6570) Section 3.2.2 Simple String\n// Expansion, the multi segment variable **does not** follow RFC 6570 Section\n// 3.2.3 Reserved Expansion. The reason is that the Reserved Expansion\n// does not expand special characters like `?` and `#`, which would lead\n// to invalid URLs. As the result, gRPC Transcoding uses a custom encoding\n// for multi segment variables.\n//\n// The path variables **must not** refer to any repeated or mapped field,\n// because client libraries are not capable of handling such variable expansion.\n//\n// The path variables **must not** capture the leading \"/\" character. The reason\n// is that the most common use case \"{var}\" does not capture the leading \"/\"\n// character. For consistency, all path variables must share the same behavior.\n//\n// Repeated message fields must not be mapped to URL query parameters, because\n// no client library can support such complicated mapping.\n//\n// If an API needs to use a JSON array for request or response body, it can map\n// the request or response body to a repeated field. However, some gRPC\n// Transcoding implementations may not support this feature.\nmessage HttpRule {\n  // Selects a method to which this rule applies.\n  //\n  // Refer to [selector][google.api.DocumentationRule.selector] for syntax details.\n  string selector = 1;\n\n  // Determines the URL pattern is matched by this rules. This pattern can be\n  // used with any of the {get|put|post|delete|patch} methods. A custom method\n  // can be defined using the 'custom' field.\n  oneof pattern {\n    // Maps to HTTP GET. Used for listing and getting information about\n    // resources.\n    string get = 2;\n\n    // Maps to HTTP PUT. Used for replacing a resource.\n    string put = 3;\n\n    // Maps to HTTP POST. Used for creating a resource or performing an action.\n    string post = 4;\n\n    // Maps to HTTP DELETE. Used for deleting a resource.\n    string delete = 5;\n\n    // Maps to HTTP PATCH. Used for updating a resource.\n    string patch = 6;\n\n    // The custom pattern is used for specifying an HTTP method that is not\n    // included in the `pattern` field, such as HEAD, or \"*\" to leave the\n    // HTTP method unspecified for this rule. The wild-card rule is useful\n    // for services that provide content to Web (HTML) clients.\n    CustomHttpPattern custom = 8;\n  }\n\n  // The name of the request field whose value is mapped to the HTTP request\n  // body, or `*` for mapping all request fields not captured by the path\n  // pattern to the HTTP body, or omitted for not having any HTTP request body.\n  //\n  // NOTE: the referred field must be present at the top-level of the request\n  // message type.\n  string body = 7;\n\n  // Optional. The name of the response field whose value is mapped to the HTTP\n  // response body. When omitted, the entire response message will be used\n  // as the HTTP response body.\n  //\n  // NOTE: The referred field must be present at the top-level of the response\n  // message type.\n  string response_body = 12;\n\n  // Additional HTTP bindings for the selector. Nested bindings must\n  // not contain an `additional_bindings` field themselves (that is,\n  // the nesting may only be one level deep).\n  repeated HttpRule additional_bindings = 11;\n}\n\n// A custom pattern is used for defining custom HTTP verb.\nmessage CustomHttpPattern {\n  // The name of this custom HTTP verb.\n  string kind = 1;\n\n  // The path matched by this custom verb.\n  string path = 2;\n}\n"
  },
  {
    "path": "service/goods/third_party/google/api/httpbody.proto",
    "content": "// Copyright 2020 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\npackage google.api;\n\nimport \"google/protobuf/any.proto\";\n\noption cc_enable_arenas = true;\noption go_package = \"google.golang.org/genproto/googleapis/api/httpbody;httpbody\";\noption java_multiple_files = true;\noption java_outer_classname = \"HttpBodyProto\";\noption java_package = \"com.google.api\";\noption objc_class_prefix = \"GAPI\";\n\n// Message that represents an arbitrary HTTP body. It should only be used for\n// payload formats that can't be represented as JSON, such as raw binary or\n// an HTML page.\n//\n//\n// This message can be used both in streaming and non-streaming API methods in\n// the request as well as the response.\n//\n// It can be used as a top-level request field, which is convenient if one\n// wants to extract parameters from either the URL or HTTP template into the\n// request fields and also want access to the raw HTTP body.\n//\n// Example:\n//\n//     message GetResourceRequest {\n//       // A unique request id.\n//       string request_id = 1;\n//\n//       // The raw HTTP body is bound to this field.\n//       google.api.HttpBody http_body = 2;\n//     }\n//\n//     service ResourceService {\n//       rpc GetResource(GetResourceRequest) returns (google.api.HttpBody);\n//       rpc UpdateResource(google.api.HttpBody) returns\n//       (google.protobuf.Empty);\n//     }\n//\n// Example with streaming methods:\n//\n//     service CaldavService {\n//       rpc GetCalendar(stream google.api.HttpBody)\n//         returns (stream google.api.HttpBody);\n//       rpc UpdateCalendar(stream google.api.HttpBody)\n//         returns (stream google.api.HttpBody);\n//     }\n//\n// Use of this type only changes how the request and response bodies are\n// handled, all other features will continue to work unchanged.\nmessage HttpBody {\n  // The HTTP Content-Type header value specifying the content type of the body.\n  string content_type = 1;\n\n  // The HTTP request/response body as raw binary.\n  bytes data = 2;\n\n  // Application specific response metadata. Must be set in the first response\n  // for streaming APIs.\n  repeated google.protobuf.Any extensions = 3;\n}\n"
  },
  {
    "path": "service/goods/third_party/google/protobuf/any.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption go_package = \"google.golang.org/protobuf/types/known/anypb\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"AnyProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\n\n// `Any` contains an arbitrary serialized protocol buffer message along with a\n// URL that describes the type of the serialized message.\n//\n// Protobuf library provides support to pack/unpack Any values in the form\n// of utility functions or additional generated methods of the Any type.\n//\n// Example 1: Pack and unpack a message in C++.\n//\n//     Foo foo = ...;\n//     Any any;\n//     any.PackFrom(foo);\n//     ...\n//     if (any.UnpackTo(&foo)) {\n//       ...\n//     }\n//\n// Example 2: Pack and unpack a message in Java.\n//\n//     Foo foo = ...;\n//     Any any = Any.pack(foo);\n//     ...\n//     if (any.is(Foo.class)) {\n//       foo = any.unpack(Foo.class);\n//     }\n//\n// Example 3: Pack and unpack a message in Python.\n//\n//     foo = Foo(...)\n//     any = Any()\n//     any.Pack(foo)\n//     ...\n//     if any.Is(Foo.DESCRIPTOR):\n//       any.Unpack(foo)\n//       ...\n//\n// Example 4: Pack and unpack a message in Go\n//\n//      foo := &pb.Foo{...}\n//      any, err := anypb.New(foo)\n//      if err != nil {\n//        ...\n//      }\n//      ...\n//      foo := &pb.Foo{}\n//      if err := any.UnmarshalTo(foo); err != nil {\n//        ...\n//      }\n//\n// The pack methods provided by protobuf library will by default use\n// 'type.googleapis.com/full.type.name' as the type URL and the unpack\n// methods only use the fully qualified type name after the last '/'\n// in the type URL, for example \"foo.bar.com/x/y.z\" will yield type\n// name \"y.z\".\n//\n//\n// JSON\n//\n// The JSON representation of an `Any` value uses the regular\n// representation of the deserialized, embedded message, with an\n// additional field `@type` which contains the type URL. Example:\n//\n//     package google.profile;\n//     message Person {\n//       string first_name = 1;\n//       string last_name = 2;\n//     }\n//\n//     {\n//       \"@type\": \"type.googleapis.com/google.profile.Person\",\n//       \"firstName\": <string>,\n//       \"lastName\": <string>\n//     }\n//\n// If the embedded message type is well-known and has a custom JSON\n// representation, that representation will be embedded adding a field\n// `value` which holds the custom JSON in addition to the `@type`\n// field. Example (for message [google.protobuf.Duration][]):\n//\n//     {\n//       \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n//       \"value\": \"1.212s\"\n//     }\n//\nmessage Any {\n  // A URL/resource name that uniquely identifies the type of the serialized\n  // protocol buffer message. This string must contain at least\n  // one \"/\" character. The last segment of the URL's path must represent\n  // the fully qualified name of the type (as in\n  // `path/google.protobuf.Duration`). The name should be in a canonical form\n  // (e.g., leading \".\" is not accepted).\n  //\n  // In practice, teams usually precompile into the binary all types that they\n  // expect it to use in the context of Any. However, for URLs which use the\n  // scheme `http`, `https`, or no scheme, one can optionally set up a type\n  // server that maps type URLs to message definitions as follows:\n  //\n  // * If no scheme is provided, `https` is assumed.\n  // * An HTTP GET on the URL must yield a [google.protobuf.Type][]\n  //   value in binary format, or produce an error.\n  // * Applications are allowed to cache lookup results based on the\n  //   URL, or have them precompiled into a binary to avoid any\n  //   lookup. Therefore, binary compatibility needs to be preserved\n  //   on changes to types. (Use versioned type names to manage\n  //   breaking changes.)\n  //\n  // Note: this functionality is not currently available in the official\n  // protobuf release, and it is not used for type URLs beginning with\n  // type.googleapis.com.\n  //\n  // Schemes other than `http`, `https` (or the empty scheme) might be\n  // used with implementation specific semantics.\n  //\n  string type_url = 1;\n\n  // Must be a valid serialized protocol buffer of the above specified type.\n  bytes value = 2;\n}\n"
  },
  {
    "path": "service/goods/third_party/google/protobuf/api.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\nimport \"google/protobuf/source_context.proto\";\nimport \"google/protobuf/type.proto\";\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"ApiProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\noption go_package = \"google.golang.org/protobuf/types/known/apipb\";\n\n// Api is a light-weight descriptor for an API Interface.\n//\n// Interfaces are also described as \"protocol buffer services\" in some contexts,\n// such as by the \"service\" keyword in a .proto file, but they are different\n// from API Services, which represent a concrete implementation of an interface\n// as opposed to simply a description of methods and bindings. They are also\n// sometimes simply referred to as \"APIs\" in other contexts, such as the name of\n// this message itself. See https://cloud.google.com/apis/design/glossary for\n// detailed terminology.\nmessage Api {\n  // The fully qualified name of this interface, including package name\n  // followed by the interface's simple name.\n  string name = 1;\n\n  // The methods of this interface, in unspecified order.\n  repeated Method methods = 2;\n\n  // Any metadata attached to the interface.\n  repeated Option options = 3;\n\n  // A version string for this interface. If specified, must have the form\n  // `major-version.minor-version`, as in `1.10`. If the minor version is\n  // omitted, it defaults to zero. If the entire version field is empty, the\n  // major version is derived from the package name, as outlined below. If the\n  // field is not empty, the version in the package name will be verified to be\n  // consistent with what is provided here.\n  //\n  // The versioning schema uses [semantic\n  // versioning](http://semver.org) where the major version number\n  // indicates a breaking change and the minor version an additive,\n  // non-breaking change. Both version numbers are signals to users\n  // what to expect from different versions, and should be carefully\n  // chosen based on the product plan.\n  //\n  // The major version is also reflected in the package name of the\n  // interface, which must end in `v<major-version>`, as in\n  // `google.feature.v1`. For major versions 0 and 1, the suffix can\n  // be omitted. Zero major versions must only be used for\n  // experimental, non-GA interfaces.\n  //\n  //\n  string version = 4;\n\n  // Source context for the protocol buffer service represented by this\n  // message.\n  SourceContext source_context = 5;\n\n  // Included interfaces. See [Mixin][].\n  repeated Mixin mixins = 6;\n\n  // The source syntax of the service.\n  Syntax syntax = 7;\n}\n\n// Method represents a method of an API interface.\nmessage Method {\n  // The simple name of this method.\n  string name = 1;\n\n  // A URL of the input message type.\n  string request_type_url = 2;\n\n  // If true, the request is streamed.\n  bool request_streaming = 3;\n\n  // The URL of the output message type.\n  string response_type_url = 4;\n\n  // If true, the response is streamed.\n  bool response_streaming = 5;\n\n  // Any metadata attached to the method.\n  repeated Option options = 6;\n\n  // The source syntax of this method.\n  Syntax syntax = 7;\n}\n\n// Declares an API Interface to be included in this interface. The including\n// interface must redeclare all the methods from the included interface, but\n// documentation and options are inherited as follows:\n//\n// - If after comment and whitespace stripping, the documentation\n//   string of the redeclared method is empty, it will be inherited\n//   from the original method.\n//\n// - Each annotation belonging to the service config (http,\n//   visibility) which is not set in the redeclared method will be\n//   inherited.\n//\n// - If an http annotation is inherited, the path pattern will be\n//   modified as follows. Any version prefix will be replaced by the\n//   version of the including interface plus the [root][] path if\n//   specified.\n//\n// Example of a simple mixin:\n//\n//     package google.acl.v1;\n//     service AccessControl {\n//       // Get the underlying ACL object.\n//       rpc GetAcl(GetAclRequest) returns (Acl) {\n//         option (google.api.http).get = \"/v1/{resource=**}:getAcl\";\n//       }\n//     }\n//\n//     package google.storage.v2;\n//     service Storage {\n//       rpc GetAcl(GetAclRequest) returns (Acl);\n//\n//       // Get a data record.\n//       rpc GetData(GetDataRequest) returns (Data) {\n//         option (google.api.http).get = \"/v2/{resource=**}\";\n//       }\n//     }\n//\n// Example of a mixin configuration:\n//\n//     apis:\n//     - name: google.storage.v2.Storage\n//       mixins:\n//       - name: google.acl.v1.AccessControl\n//\n// The mixin construct implies that all methods in `AccessControl` are\n// also declared with same name and request/response types in\n// `Storage`. A documentation generator or annotation processor will\n// see the effective `Storage.GetAcl` method after inheriting\n// documentation and annotations as follows:\n//\n//     service Storage {\n//       // Get the underlying ACL object.\n//       rpc GetAcl(GetAclRequest) returns (Acl) {\n//         option (google.api.http).get = \"/v2/{resource=**}:getAcl\";\n//       }\n//       ...\n//     }\n//\n// Note how the version in the path pattern changed from `v1` to `v2`.\n//\n// If the `root` field in the mixin is specified, it should be a\n// relative path under which inherited HTTP paths are placed. Example:\n//\n//     apis:\n//     - name: google.storage.v2.Storage\n//       mixins:\n//       - name: google.acl.v1.AccessControl\n//         root: acls\n//\n// This implies the following inherited HTTP annotation:\n//\n//     service Storage {\n//       // Get the underlying ACL object.\n//       rpc GetAcl(GetAclRequest) returns (Acl) {\n//         option (google.api.http).get = \"/v2/acls/{resource=**}:getAcl\";\n//       }\n//       ...\n//     }\nmessage Mixin {\n  // The fully qualified name of the interface which is included.\n  string name = 1;\n\n  // If non-empty specifies a path under which inherited HTTP paths\n  // are rooted.\n  string root = 2;\n}\n"
  },
  {
    "path": "service/goods/third_party/google/protobuf/compiler/plugin.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//\n// WARNING:  The plugin interface is currently EXPERIMENTAL and is subject to\n//   change.\n//\n// protoc (aka the Protocol Compiler) can be extended via plugins.  A plugin is\n// just a program that reads a CodeGeneratorRequest from stdin and writes a\n// CodeGeneratorResponse to stdout.\n//\n// Plugins written using C++ can use google/protobuf/compiler/plugin.h instead\n// of dealing with the raw protocol defined here.\n//\n// A plugin executable needs only to be placed somewhere in the path.  The\n// plugin should be named \"protoc-gen-$NAME\", and will then be used when the\n// flag \"--${NAME}_out\" is passed to protoc.\n\nsyntax = \"proto2\";\n\npackage google.protobuf.compiler;\noption java_package = \"com.google.protobuf.compiler\";\noption java_outer_classname = \"PluginProtos\";\n\noption go_package = \"google.golang.org/protobuf/types/pluginpb\";\n\nimport \"google/protobuf/descriptor.proto\";\n\n// The version number of protocol compiler.\nmessage Version {\n  optional int32 major = 1;\n  optional int32 minor = 2;\n  optional int32 patch = 3;\n  // A suffix for alpha, beta or rc release, e.g., \"alpha-1\", \"rc2\". It should\n  // be empty for mainline stable releases.\n  optional string suffix = 4;\n}\n\n// An encoded CodeGeneratorRequest is written to the plugin's stdin.\nmessage CodeGeneratorRequest {\n  // The .proto files that were explicitly listed on the command-line.  The\n  // code generator should generate code only for these files.  Each file's\n  // descriptor will be included in proto_file, below.\n  repeated string file_to_generate = 1;\n\n  // The generator parameter passed on the command-line.\n  optional string parameter = 2;\n\n  // FileDescriptorProtos for all files in files_to_generate and everything\n  // they import.  The files will appear in topological order, so each file\n  // appears before any file that imports it.\n  //\n  // protoc guarantees that all proto_files will be written after\n  // the fields above, even though this is not technically guaranteed by the\n  // protobuf wire format.  This theoretically could allow a plugin to stream\n  // in the FileDescriptorProtos and handle them one by one rather than read\n  // the entire set into memory at once.  However, as of this writing, this\n  // is not similarly optimized on protoc's end -- it will store all fields in\n  // memory at once before sending them to the plugin.\n  //\n  // Type names of fields and extensions in the FileDescriptorProto are always\n  // fully qualified.\n  repeated FileDescriptorProto proto_file = 15;\n\n  // The version number of protocol compiler.\n  optional Version compiler_version = 3;\n\n}\n\n// The plugin writes an encoded CodeGeneratorResponse to stdout.\nmessage CodeGeneratorResponse {\n  // Error message.  If non-empty, code generation failed.  The plugin process\n  // should exit with status code zero even if it reports an error in this way.\n  //\n  // This should be used to indicate errors in .proto files which prevent the\n  // code generator from generating correct code.  Errors which indicate a\n  // problem in protoc itself -- such as the input CodeGeneratorRequest being\n  // unparseable -- should be reported by writing a message to stderr and\n  // exiting with a non-zero status code.\n  optional string error = 1;\n\n  // A bitmask of supported features that the code generator supports.\n  // This is a bitwise \"or\" of values from the Feature enum.\n  optional uint64 supported_features = 2;\n\n  // Sync with code_generator.h.\n  enum Feature {\n    FEATURE_NONE = 0;\n    FEATURE_PROTO3_OPTIONAL = 1;\n  }\n\n  // Represents a single generated file.\n  message File {\n    // The file name, relative to the output directory.  The name must not\n    // contain \".\" or \"..\" components and must be relative, not be absolute (so,\n    // the file cannot lie outside the output directory).  \"/\" must be used as\n    // the path separator, not \"\\\".\n    //\n    // If the name is omitted, the content will be appended to the previous\n    // file.  This allows the generator to break large files into small chunks,\n    // and allows the generated text to be streamed back to protoc so that large\n    // files need not reside completely in memory at one time.  Note that as of\n    // this writing protoc does not optimize for this -- it will read the entire\n    // CodeGeneratorResponse before writing files to disk.\n    optional string name = 1;\n\n    // If non-empty, indicates that the named file should already exist, and the\n    // content here is to be inserted into that file at a defined insertion\n    // point.  This feature allows a code generator to extend the output\n    // produced by another code generator.  The original generator may provide\n    // insertion points by placing special annotations in the file that look\n    // like:\n    //   @@protoc_insertion_point(NAME)\n    // The annotation can have arbitrary text before and after it on the line,\n    // which allows it to be placed in a comment.  NAME should be replaced with\n    // an identifier naming the point -- this is what other generators will use\n    // as the insertion_point.  Code inserted at this point will be placed\n    // immediately above the line containing the insertion point (thus multiple\n    // insertions to the same point will come out in the order they were added).\n    // The double-@ is intended to make it unlikely that the generated code\n    // could contain things that look like insertion points by accident.\n    //\n    // For example, the C++ code generator places the following line in the\n    // .pb.h files that it generates:\n    //   // @@protoc_insertion_point(namespace_scope)\n    // This line appears within the scope of the file's package namespace, but\n    // outside of any particular class.  Another plugin can then specify the\n    // insertion_point \"namespace_scope\" to generate additional classes or\n    // other declarations that should be placed in this scope.\n    //\n    // Note that if the line containing the insertion point begins with\n    // whitespace, the same whitespace will be added to every line of the\n    // inserted text.  This is useful for languages like Python, where\n    // indentation matters.  In these languages, the insertion point comment\n    // should be indented the same amount as any inserted code will need to be\n    // in order to work correctly in that context.\n    //\n    // The code generator that generates the initial file and the one which\n    // inserts into it must both run as part of a single invocation of protoc.\n    // Code generators are executed in the order in which they appear on the\n    // command line.\n    //\n    // If |insertion_point| is present, |name| must also be present.\n    optional string insertion_point = 2;\n\n    // The file contents.\n    optional string content = 15;\n\n    // Information describing the file content being inserted. If an insertion\n    // point is used, this information will be appropriately offset and inserted\n    // into the code generation metadata for the generated files.\n    optional GeneratedCodeInfo generated_code_info = 16;\n  }\n  repeated File file = 15;\n}\n"
  },
  {
    "path": "service/goods/third_party/google/protobuf/descriptor.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// The messages in this file describe the definitions found in .proto files.\n// A valid .proto file can be translated directly to a FileDescriptorProto\n// without any other information (e.g. without reading its imports).\n\n\nsyntax = \"proto2\";\n\npackage google.protobuf;\n\noption go_package = \"google.golang.org/protobuf/types/descriptorpb\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"DescriptorProtos\";\noption csharp_namespace = \"Google.Protobuf.Reflection\";\noption objc_class_prefix = \"GPB\";\noption cc_enable_arenas = true;\n\n// descriptor.proto must be optimized for speed because reflection-based\n// algorithms don't work during bootstrapping.\noption optimize_for = SPEED;\n\n// The protocol compiler can output a FileDescriptorSet containing the .proto\n// files it parses.\nmessage FileDescriptorSet {\n  repeated FileDescriptorProto file = 1;\n}\n\n// Describes a complete .proto file.\nmessage FileDescriptorProto {\n  optional string name = 1;     // file name, relative to root of source tree\n  optional string package = 2;  // e.g. \"foo\", \"foo.bar\", etc.\n\n  // Names of files imported by this file.\n  repeated string dependency = 3;\n  // Indexes of the public imported files in the dependency list above.\n  repeated int32 public_dependency = 10;\n  // Indexes of the weak imported files in the dependency list.\n  // For Google-internal migration only. Do not use.\n  repeated int32 weak_dependency = 11;\n\n  // All top-level definitions in this file.\n  repeated DescriptorProto message_type = 4;\n  repeated EnumDescriptorProto enum_type = 5;\n  repeated ServiceDescriptorProto service = 6;\n  repeated FieldDescriptorProto extension = 7;\n\n  optional FileOptions options = 8;\n\n  // This field contains optional information about the original source code.\n  // You may safely remove this entire field without harming runtime\n  // functionality of the descriptors -- the information is needed only by\n  // development tools.\n  optional SourceCodeInfo source_code_info = 9;\n\n  // The syntax of the proto file.\n  // The supported values are \"proto2\" and \"proto3\".\n  optional string syntax = 12;\n}\n\n// Describes a message type.\nmessage DescriptorProto {\n  optional string name = 1;\n\n  repeated FieldDescriptorProto field = 2;\n  repeated FieldDescriptorProto extension = 6;\n\n  repeated DescriptorProto nested_type = 3;\n  repeated EnumDescriptorProto enum_type = 4;\n\n  message ExtensionRange {\n    optional int32 start = 1;  // Inclusive.\n    optional int32 end = 2;    // Exclusive.\n\n    optional ExtensionRangeOptions options = 3;\n  }\n  repeated ExtensionRange extension_range = 5;\n\n  repeated OneofDescriptorProto oneof_decl = 8;\n\n  optional MessageOptions options = 7;\n\n  // Range of reserved tag numbers. Reserved tag numbers may not be used by\n  // fields or extension ranges in the same message. Reserved ranges may\n  // not overlap.\n  message ReservedRange {\n    optional int32 start = 1;  // Inclusive.\n    optional int32 end = 2;    // Exclusive.\n  }\n  repeated ReservedRange reserved_range = 9;\n  // Reserved field names, which may not be used by fields in the same message.\n  // A given name may only be reserved once.\n  repeated string reserved_name = 10;\n}\n\nmessage ExtensionRangeOptions {\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\n// Describes a field within a message.\nmessage FieldDescriptorProto {\n  enum Type {\n    // 0 is reserved for errors.\n    // Order is weird for historical reasons.\n    TYPE_DOUBLE = 1;\n    TYPE_FLOAT = 2;\n    // Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT64 if\n    // negative values are likely.\n    TYPE_INT64 = 3;\n    TYPE_UINT64 = 4;\n    // Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT32 if\n    // negative values are likely.\n    TYPE_INT32 = 5;\n    TYPE_FIXED64 = 6;\n    TYPE_FIXED32 = 7;\n    TYPE_BOOL = 8;\n    TYPE_STRING = 9;\n    // Tag-delimited aggregate.\n    // Group type is deprecated and not supported in proto3. However, Proto3\n    // implementations should still be able to parse the group wire format and\n    // treat group fields as unknown fields.\n    TYPE_GROUP = 10;\n    TYPE_MESSAGE = 11;  // Length-delimited aggregate.\n\n    // New in version 2.\n    TYPE_BYTES = 12;\n    TYPE_UINT32 = 13;\n    TYPE_ENUM = 14;\n    TYPE_SFIXED32 = 15;\n    TYPE_SFIXED64 = 16;\n    TYPE_SINT32 = 17;  // Uses ZigZag encoding.\n    TYPE_SINT64 = 18;  // Uses ZigZag encoding.\n  }\n\n  enum Label {\n    // 0 is reserved for errors\n    LABEL_OPTIONAL = 1;\n    LABEL_REQUIRED = 2;\n    LABEL_REPEATED = 3;\n  }\n\n  optional string name = 1;\n  optional int32 number = 3;\n  optional Label label = 4;\n\n  // If type_name is set, this need not be set.  If both this and type_name\n  // are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP.\n  optional Type type = 5;\n\n  // For message and enum types, this is the name of the type.  If the name\n  // starts with a '.', it is fully-qualified.  Otherwise, C++-like scoping\n  // rules are used to find the type (i.e. first the nested types within this\n  // message are searched, then within the parent, on up to the root\n  // namespace).\n  optional string type_name = 6;\n\n  // For extensions, this is the name of the type being extended.  It is\n  // resolved in the same manner as type_name.\n  optional string extendee = 2;\n\n  // For numeric types, contains the original text representation of the value.\n  // For booleans, \"true\" or \"false\".\n  // For strings, contains the default text contents (not escaped in any way).\n  // For bytes, contains the C escaped value.  All bytes >= 128 are escaped.\n  optional string default_value = 7;\n\n  // If set, gives the index of a oneof in the containing type's oneof_decl\n  // list.  This field is a member of that oneof.\n  optional int32 oneof_index = 9;\n\n  // JSON name of this field. The value is set by protocol compiler. If the\n  // user has set a \"json_name\" option on this field, that option's value\n  // will be used. Otherwise, it's deduced from the field's name by converting\n  // it to camelCase.\n  optional string json_name = 10;\n\n  optional FieldOptions options = 8;\n\n  // If true, this is a proto3 \"optional\". When a proto3 field is optional, it\n  // tracks presence regardless of field type.\n  //\n  // When proto3_optional is true, this field must be belong to a oneof to\n  // signal to old proto3 clients that presence is tracked for this field. This\n  // oneof is known as a \"synthetic\" oneof, and this field must be its sole\n  // member (each proto3 optional field gets its own synthetic oneof). Synthetic\n  // oneofs exist in the descriptor only, and do not generate any API. Synthetic\n  // oneofs must be ordered after all \"real\" oneofs.\n  //\n  // For message fields, proto3_optional doesn't create any semantic change,\n  // since non-repeated message fields always track presence. However it still\n  // indicates the semantic detail of whether the user wrote \"optional\" or not.\n  // This can be useful for round-tripping the .proto file. For consistency we\n  // give message fields a synthetic oneof also, even though it is not required\n  // to track presence. This is especially important because the parser can't\n  // tell if a field is a message or an enum, so it must always create a\n  // synthetic oneof.\n  //\n  // Proto2 optional fields do not set this flag, because they already indicate\n  // optional with `LABEL_OPTIONAL`.\n  optional bool proto3_optional = 17;\n}\n\n// Describes a oneof.\nmessage OneofDescriptorProto {\n  optional string name = 1;\n  optional OneofOptions options = 2;\n}\n\n// Describes an enum type.\nmessage EnumDescriptorProto {\n  optional string name = 1;\n\n  repeated EnumValueDescriptorProto value = 2;\n\n  optional EnumOptions options = 3;\n\n  // Range of reserved numeric values. Reserved values may not be used by\n  // entries in the same enum. Reserved ranges may not overlap.\n  //\n  // Note that this is distinct from DescriptorProto.ReservedRange in that it\n  // is inclusive such that it can appropriately represent the entire int32\n  // domain.\n  message EnumReservedRange {\n    optional int32 start = 1;  // Inclusive.\n    optional int32 end = 2;    // Inclusive.\n  }\n\n  // Range of reserved numeric values. Reserved numeric values may not be used\n  // by enum values in the same enum declaration. Reserved ranges may not\n  // overlap.\n  repeated EnumReservedRange reserved_range = 4;\n\n  // Reserved enum value names, which may not be reused. A given name may only\n  // be reserved once.\n  repeated string reserved_name = 5;\n}\n\n// Describes a value within an enum.\nmessage EnumValueDescriptorProto {\n  optional string name = 1;\n  optional int32 number = 2;\n\n  optional EnumValueOptions options = 3;\n}\n\n// Describes a service.\nmessage ServiceDescriptorProto {\n  optional string name = 1;\n  repeated MethodDescriptorProto method = 2;\n\n  optional ServiceOptions options = 3;\n}\n\n// Describes a method of a service.\nmessage MethodDescriptorProto {\n  optional string name = 1;\n\n  // Input and output type names.  These are resolved in the same way as\n  // FieldDescriptorProto.type_name, but must refer to a message type.\n  optional string input_type = 2;\n  optional string output_type = 3;\n\n  optional MethodOptions options = 4;\n\n  // Identifies if client streams multiple client messages\n  optional bool client_streaming = 5 [default = false];\n  // Identifies if server streams multiple server messages\n  optional bool server_streaming = 6 [default = false];\n}\n\n\n// ===================================================================\n// Options\n\n// Each of the definitions above may have \"options\" attached.  These are\n// just annotations which may cause code to be generated slightly differently\n// or may contain hints for code that manipulates protocol messages.\n//\n// Clients may define custom options as extensions of the *Options messages.\n// These extensions may not yet be known at parsing time, so the parser cannot\n// store the values in them.  Instead it stores them in a field in the *Options\n// message called uninterpreted_option. This field must have the same name\n// across all *Options messages. We then use this field to populate the\n// extensions when we build a descriptor, at which point all protos have been\n// parsed and so all extensions are known.\n//\n// Extension numbers for custom options may be chosen as follows:\n// * For options which will only be used within a single application or\n//   organization, or for experimental options, use field numbers 50000\n//   through 99999.  It is up to you to ensure that you do not use the\n//   same number for multiple options.\n// * For options which will be published and used publicly by multiple\n//   independent entities, e-mail protobuf-global-extension-registry@google.com\n//   to reserve extension numbers. Simply provide your project name (e.g.\n//   Objective-C plugin) and your project website (if available) -- there's no\n//   need to explain how you intend to use them. Usually you only need one\n//   extension number. You can declare multiple options with only one extension\n//   number by putting them in a sub-message. See the Custom Options section of\n//   the docs for examples:\n//   https://developers.google.com/protocol-buffers/docs/proto#options\n//   If this turns out to be popular, a web service will be set up\n//   to automatically assign option numbers.\n\nmessage FileOptions {\n\n  // Sets the Java package where classes generated from this .proto will be\n  // placed.  By default, the proto package is used, but this is often\n  // inappropriate because proto packages do not normally start with backwards\n  // domain names.\n  optional string java_package = 1;\n\n\n  // Controls the name of the wrapper Java class generated for the .proto file.\n  // That class will always contain the .proto file's getDescriptor() method as\n  // well as any top-level extensions defined in the .proto file.\n  // If java_multiple_files is disabled, then all the other classes from the\n  // .proto file will be nested inside the single wrapper outer class.\n  optional string java_outer_classname = 8;\n\n  // If enabled, then the Java code generator will generate a separate .java\n  // file for each top-level message, enum, and service defined in the .proto\n  // file.  Thus, these types will *not* be nested inside the wrapper class\n  // named by java_outer_classname.  However, the wrapper class will still be\n  // generated to contain the file's getDescriptor() method as well as any\n  // top-level extensions defined in the file.\n  optional bool java_multiple_files = 10 [default = false];\n\n  // This option does nothing.\n  optional bool java_generate_equals_and_hash = 20 [deprecated=true];\n\n  // If set true, then the Java2 code generator will generate code that\n  // throws an exception whenever an attempt is made to assign a non-UTF-8\n  // byte sequence to a string field.\n  // Message reflection will do the same.\n  // However, an extension field still accepts non-UTF-8 byte sequences.\n  // This option has no effect on when used with the lite runtime.\n  optional bool java_string_check_utf8 = 27 [default = false];\n\n\n  // Generated classes can be optimized for speed or code size.\n  enum OptimizeMode {\n    SPEED = 1;         // Generate complete code for parsing, serialization,\n                       // etc.\n    CODE_SIZE = 2;     // Use ReflectionOps to implement these methods.\n    LITE_RUNTIME = 3;  // Generate code using MessageLite and the lite runtime.\n  }\n  optional OptimizeMode optimize_for = 9 [default = SPEED];\n\n  // Sets the Go package where structs generated from this .proto will be\n  // placed. If omitted, the Go package will be derived from the following:\n  //   - The basename of the package import path, if provided.\n  //   - Otherwise, the package statement in the .proto file, if present.\n  //   - Otherwise, the basename of the .proto file, without extension.\n  optional string go_package = 11;\n\n\n\n\n  // Should generic services be generated in each language?  \"Generic\" services\n  // are not specific to any particular RPC system.  They are generated by the\n  // main code generators in each language (without additional plugins).\n  // Generic services were the only kind of service generation supported by\n  // early versions of google.protobuf.\n  //\n  // Generic services are now considered deprecated in favor of using plugins\n  // that generate code specific to your particular RPC system.  Therefore,\n  // these default to false.  Old code which depends on generic services should\n  // explicitly set them to true.\n  optional bool cc_generic_services = 16 [default = false];\n  optional bool java_generic_services = 17 [default = false];\n  optional bool py_generic_services = 18 [default = false];\n  optional bool php_generic_services = 42 [default = false];\n\n  // Is this file deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for everything in the file, or it will be completely ignored; in the very\n  // least, this is a formalization for deprecating files.\n  optional bool deprecated = 23 [default = false];\n\n  // Enables the use of arenas for the proto messages in this file. This applies\n  // only to generated classes for C++.\n  optional bool cc_enable_arenas = 31 [default = true];\n\n\n  // Sets the objective c class prefix which is prepended to all objective c\n  // generated classes from this .proto. There is no default.\n  optional string objc_class_prefix = 36;\n\n  // Namespace for generated classes; defaults to the package.\n  optional string csharp_namespace = 37;\n\n  // By default Swift generators will take the proto package and CamelCase it\n  // replacing '.' with underscore and use that to prefix the types/symbols\n  // defined. When this options is provided, they will use this value instead\n  // to prefix the types/symbols defined.\n  optional string swift_prefix = 39;\n\n  // Sets the php class prefix which is prepended to all php generated classes\n  // from this .proto. Default is empty.\n  optional string php_class_prefix = 40;\n\n  // Use this option to change the namespace of php generated classes. Default\n  // is empty. When this option is empty, the package name will be used for\n  // determining the namespace.\n  optional string php_namespace = 41;\n\n  // Use this option to change the namespace of php generated metadata classes.\n  // Default is empty. When this option is empty, the proto file name will be\n  // used for determining the namespace.\n  optional string php_metadata_namespace = 44;\n\n  // Use this option to change the package of ruby generated classes. Default\n  // is empty. When this option is not set, the package name will be used for\n  // determining the ruby package.\n  optional string ruby_package = 45;\n\n\n  // The parser stores options it doesn't recognize here.\n  // See the documentation for the \"Options\" section above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message.\n  // See the documentation for the \"Options\" section above.\n  extensions 1000 to max;\n\n  reserved 38;\n}\n\nmessage MessageOptions {\n  // Set true to use the old proto1 MessageSet wire format for extensions.\n  // This is provided for backwards-compatibility with the MessageSet wire\n  // format.  You should not use this for any other reason:  It's less\n  // efficient, has fewer features, and is more complicated.\n  //\n  // The message must be defined exactly as follows:\n  //   message Foo {\n  //     option message_set_wire_format = true;\n  //     extensions 4 to max;\n  //   }\n  // Note that the message cannot have any defined fields; MessageSets only\n  // have extensions.\n  //\n  // All extensions of your type must be singular messages; e.g. they cannot\n  // be int32s, enums, or repeated messages.\n  //\n  // Because this is an option, the above two restrictions are not enforced by\n  // the protocol compiler.\n  optional bool message_set_wire_format = 1 [default = false];\n\n  // Disables the generation of the standard \"descriptor()\" accessor, which can\n  // conflict with a field of the same name.  This is meant to make migration\n  // from proto1 easier; new code should avoid fields named \"descriptor\".\n  optional bool no_standard_descriptor_accessor = 2 [default = false];\n\n  // Is this message deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for the message, or it will be completely ignored; in the very least,\n  // this is a formalization for deprecating messages.\n  optional bool deprecated = 3 [default = false];\n\n  reserved 4, 5, 6;\n\n  // Whether the message is an automatically generated map entry type for the\n  // maps field.\n  //\n  // For maps fields:\n  //     map<KeyType, ValueType> map_field = 1;\n  // The parsed descriptor looks like:\n  //     message MapFieldEntry {\n  //         option map_entry = true;\n  //         optional KeyType key = 1;\n  //         optional ValueType value = 2;\n  //     }\n  //     repeated MapFieldEntry map_field = 1;\n  //\n  // Implementations may choose not to generate the map_entry=true message, but\n  // use a native map in the target language to hold the keys and values.\n  // The reflection APIs in such implementations still need to work as\n  // if the field is a repeated message field.\n  //\n  // NOTE: Do not set the option in .proto files. Always use the maps syntax\n  // instead. The option should only be implicitly set by the proto compiler\n  // parser.\n  optional bool map_entry = 7;\n\n  reserved 8;  // javalite_serializable\n  reserved 9;  // javanano_as_lite\n\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\nmessage FieldOptions {\n  // The ctype option instructs the C++ code generator to use a different\n  // representation of the field than it normally would.  See the specific\n  // options below.  This option is not yet implemented in the open source\n  // release -- sorry, we'll try to include it in a future version!\n  optional CType ctype = 1 [default = STRING];\n  enum CType {\n    // Default mode.\n    STRING = 0;\n\n    CORD = 1;\n\n    STRING_PIECE = 2;\n  }\n  // The packed option can be enabled for repeated primitive fields to enable\n  // a more efficient representation on the wire. Rather than repeatedly\n  // writing the tag and type for each element, the entire array is encoded as\n  // a single length-delimited blob. In proto3, only explicit setting it to\n  // false will avoid using packed encoding.\n  optional bool packed = 2;\n\n  // The jstype option determines the JavaScript type used for values of the\n  // field.  The option is permitted only for 64 bit integral and fixed types\n  // (int64, uint64, sint64, fixed64, sfixed64).  A field with jstype JS_STRING\n  // is represented as JavaScript string, which avoids loss of precision that\n  // can happen when a large value is converted to a floating point JavaScript.\n  // Specifying JS_NUMBER for the jstype causes the generated JavaScript code to\n  // use the JavaScript \"number\" type.  The behavior of the default option\n  // JS_NORMAL is implementation dependent.\n  //\n  // This option is an enum to permit additional types to be added, e.g.\n  // goog.math.Integer.\n  optional JSType jstype = 6 [default = JS_NORMAL];\n  enum JSType {\n    // Use the default type.\n    JS_NORMAL = 0;\n\n    // Use JavaScript strings.\n    JS_STRING = 1;\n\n    // Use JavaScript numbers.\n    JS_NUMBER = 2;\n  }\n\n  // Should this field be parsed lazily?  Lazy applies only to message-type\n  // fields.  It means that when the outer message is initially parsed, the\n  // inner message's contents will not be parsed but instead stored in encoded\n  // form.  The inner message will actually be parsed when it is first accessed.\n  //\n  // This is only a hint.  Implementations are free to choose whether to use\n  // eager or lazy parsing regardless of the value of this option.  However,\n  // setting this option true suggests that the protocol author believes that\n  // using lazy parsing on this field is worth the additional bookkeeping\n  // overhead typically needed to implement it.\n  //\n  // This option does not affect the public interface of any generated code;\n  // all method signatures remain the same.  Furthermore, thread-safety of the\n  // interface is not affected by this option; const methods remain safe to\n  // call from multiple threads concurrently, while non-const methods continue\n  // to require exclusive access.\n  //\n  //\n  // Note that implementations may choose not to check required fields within\n  // a lazy sub-message.  That is, calling IsInitialized() on the outer message\n  // may return true even if the inner message has missing required fields.\n  // This is necessary because otherwise the inner message would have to be\n  // parsed in order to perform the check, defeating the purpose of lazy\n  // parsing.  An implementation which chooses not to check required fields\n  // must be consistent about it.  That is, for any particular sub-message, the\n  // implementation must either *always* check its required fields, or *never*\n  // check its required fields, regardless of whether or not the message has\n  // been parsed.\n  //\n  // As of 2021, lazy does no correctness checks on the byte stream during\n  // parsing.  This may lead to crashes if and when an invalid byte stream is\n  // finally parsed upon access.\n  //\n  // TODO(b/211906113):  Enable validation on lazy fields.\n  optional bool lazy = 5 [default = false];\n\n  // unverified_lazy does no correctness checks on the byte stream. This should\n  // only be used where lazy with verification is prohibitive for performance\n  // reasons.\n  optional bool unverified_lazy = 15 [default = false];\n\n  // Is this field deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for accessors, or it will be completely ignored; in the very least, this\n  // is a formalization for deprecating fields.\n  optional bool deprecated = 3 [default = false];\n\n  // For Google-internal migration only. Do not use.\n  optional bool weak = 10 [default = false];\n\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n\n  reserved 4;  // removed jtype\n}\n\nmessage OneofOptions {\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\nmessage EnumOptions {\n\n  // Set this option to true to allow mapping different tag names to the same\n  // value.\n  optional bool allow_alias = 2;\n\n  // Is this enum deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for the enum, or it will be completely ignored; in the very least, this\n  // is a formalization for deprecating enums.\n  optional bool deprecated = 3 [default = false];\n\n  reserved 5;  // javanano_as_lite\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\nmessage EnumValueOptions {\n  // Is this enum value deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for the enum value, or it will be completely ignored; in the very least,\n  // this is a formalization for deprecating enum values.\n  optional bool deprecated = 1 [default = false];\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\nmessage ServiceOptions {\n\n  // Note:  Field numbers 1 through 32 are reserved for Google's internal RPC\n  //   framework.  We apologize for hoarding these numbers to ourselves, but\n  //   we were already using them long before we decided to release Protocol\n  //   Buffers.\n\n  // Is this service deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for the service, or it will be completely ignored; in the very least,\n  // this is a formalization for deprecating services.\n  optional bool deprecated = 33 [default = false];\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\nmessage MethodOptions {\n\n  // Note:  Field numbers 1 through 32 are reserved for Google's internal RPC\n  //   framework.  We apologize for hoarding these numbers to ourselves, but\n  //   we were already using them long before we decided to release Protocol\n  //   Buffers.\n\n  // Is this method deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for the method, or it will be completely ignored; in the very least,\n  // this is a formalization for deprecating methods.\n  optional bool deprecated = 33 [default = false];\n\n  // Is this method side-effect-free (or safe in HTTP parlance), or idempotent,\n  // or neither? HTTP based RPC implementation may choose GET verb for safe\n  // methods, and PUT verb for idempotent methods instead of the default POST.\n  enum IdempotencyLevel {\n    IDEMPOTENCY_UNKNOWN = 0;\n    NO_SIDE_EFFECTS = 1;  // implies idempotent\n    IDEMPOTENT = 2;       // idempotent, but may have side effects\n  }\n  optional IdempotencyLevel idempotency_level = 34\n      [default = IDEMPOTENCY_UNKNOWN];\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\n\n// A message representing a option the parser does not recognize. This only\n// appears in options protos created by the compiler::Parser class.\n// DescriptorPool resolves these when building Descriptor objects. Therefore,\n// options protos in descriptor objects (e.g. returned by Descriptor::options(),\n// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions\n// in them.\nmessage UninterpretedOption {\n  // The name of the uninterpreted option.  Each string represents a segment in\n  // a dot-separated name.  is_extension is true iff a segment represents an\n  // extension (denoted with parentheses in options specs in .proto files).\n  // E.g.,{ [\"foo\", false], [\"bar.baz\", true], [\"qux\", false] } represents\n  // \"foo.(bar.baz).qux\".\n  message NamePart {\n    required string name_part = 1;\n    required bool is_extension = 2;\n  }\n  repeated NamePart name = 2;\n\n  // The value of the uninterpreted option, in whatever type the tokenizer\n  // identified it as during parsing. Exactly one of these should be set.\n  optional string identifier_value = 3;\n  optional uint64 positive_int_value = 4;\n  optional int64 negative_int_value = 5;\n  optional double double_value = 6;\n  optional bytes string_value = 7;\n  optional string aggregate_value = 8;\n}\n\n// ===================================================================\n// Optional source code info\n\n// Encapsulates information about the original source file from which a\n// FileDescriptorProto was generated.\nmessage SourceCodeInfo {\n  // A Location identifies a piece of source code in a .proto file which\n  // corresponds to a particular definition.  This information is intended\n  // to be useful to IDEs, code indexers, documentation generators, and similar\n  // tools.\n  //\n  // For example, say we have a file like:\n  //   message Foo {\n  //     optional string foo = 1;\n  //   }\n  // Let's look at just the field definition:\n  //   optional string foo = 1;\n  //   ^       ^^     ^^  ^  ^^^\n  //   a       bc     de  f  ghi\n  // We have the following locations:\n  //   span   path               represents\n  //   [a,i)  [ 4, 0, 2, 0 ]     The whole field definition.\n  //   [a,b)  [ 4, 0, 2, 0, 4 ]  The label (optional).\n  //   [c,d)  [ 4, 0, 2, 0, 5 ]  The type (string).\n  //   [e,f)  [ 4, 0, 2, 0, 1 ]  The name (foo).\n  //   [g,h)  [ 4, 0, 2, 0, 3 ]  The number (1).\n  //\n  // Notes:\n  // - A location may refer to a repeated field itself (i.e. not to any\n  //   particular index within it).  This is used whenever a set of elements are\n  //   logically enclosed in a single code segment.  For example, an entire\n  //   extend block (possibly containing multiple extension definitions) will\n  //   have an outer location whose path refers to the \"extensions\" repeated\n  //   field without an index.\n  // - Multiple locations may have the same path.  This happens when a single\n  //   logical declaration is spread out across multiple places.  The most\n  //   obvious example is the \"extend\" block again -- there may be multiple\n  //   extend blocks in the same scope, each of which will have the same path.\n  // - A location's span is not always a subset of its parent's span.  For\n  //   example, the \"extendee\" of an extension declaration appears at the\n  //   beginning of the \"extend\" block and is shared by all extensions within\n  //   the block.\n  // - Just because a location's span is a subset of some other location's span\n  //   does not mean that it is a descendant.  For example, a \"group\" defines\n  //   both a type and a field in a single declaration.  Thus, the locations\n  //   corresponding to the type and field and their components will overlap.\n  // - Code which tries to interpret locations should probably be designed to\n  //   ignore those that it doesn't understand, as more types of locations could\n  //   be recorded in the future.\n  repeated Location location = 1;\n  message Location {\n    // Identifies which part of the FileDescriptorProto was defined at this\n    // location.\n    //\n    // Each element is a field number or an index.  They form a path from\n    // the root FileDescriptorProto to the place where the definition occurs.\n    // For example, this path:\n    //   [ 4, 3, 2, 7, 1 ]\n    // refers to:\n    //   file.message_type(3)  // 4, 3\n    //       .field(7)         // 2, 7\n    //       .name()           // 1\n    // This is because FileDescriptorProto.message_type has field number 4:\n    //   repeated DescriptorProto message_type = 4;\n    // and DescriptorProto.field has field number 2:\n    //   repeated FieldDescriptorProto field = 2;\n    // and FieldDescriptorProto.name has field number 1:\n    //   optional string name = 1;\n    //\n    // Thus, the above path gives the location of a field name.  If we removed\n    // the last element:\n    //   [ 4, 3, 2, 7 ]\n    // this path refers to the whole field declaration (from the beginning\n    // of the label to the terminating semicolon).\n    repeated int32 path = 1 [packed = true];\n\n    // Always has exactly three or four elements: start line, start column,\n    // end line (optional, otherwise assumed same as start line), end column.\n    // These are packed into a single field for efficiency.  Note that line\n    // and column numbers are zero-based -- typically you will want to add\n    // 1 to each before displaying to a user.\n    repeated int32 span = 2 [packed = true];\n\n    // If this SourceCodeInfo represents a complete declaration, these are any\n    // comments appearing before and after the declaration which appear to be\n    // attached to the declaration.\n    //\n    // A series of line comments appearing on consecutive lines, with no other\n    // tokens appearing on those lines, will be treated as a single comment.\n    //\n    // leading_detached_comments will keep paragraphs of comments that appear\n    // before (but not connected to) the current element. Each paragraph,\n    // separated by empty lines, will be one comment element in the repeated\n    // field.\n    //\n    // Only the comment content is provided; comment markers (e.g. //) are\n    // stripped out.  For block comments, leading whitespace and an asterisk\n    // will be stripped from the beginning of each line other than the first.\n    // Newlines are included in the output.\n    //\n    // Examples:\n    //\n    //   optional int32 foo = 1;  // Comment attached to foo.\n    //   // Comment attached to bar.\n    //   optional int32 bar = 2;\n    //\n    //   optional string baz = 3;\n    //   // Comment attached to baz.\n    //   // Another line attached to baz.\n    //\n    //   // Comment attached to qux.\n    //   //\n    //   // Another line attached to qux.\n    //   optional double qux = 4;\n    //\n    //   // Detached comment for corge. This is not leading or trailing comments\n    //   // to qux or corge because there are blank lines separating it from\n    //   // both.\n    //\n    //   // Detached comment for corge paragraph 2.\n    //\n    //   optional string corge = 5;\n    //   /* Block comment attached\n    //    * to corge.  Leading asterisks\n    //    * will be removed. */\n    //   /* Block comment attached to\n    //    * grault. */\n    //   optional int32 grault = 6;\n    //\n    //   // ignored detached comments.\n    optional string leading_comments = 3;\n    optional string trailing_comments = 4;\n    repeated string leading_detached_comments = 6;\n  }\n}\n\n// Describes the relationship between generated code and its original source\n// file. A GeneratedCodeInfo message is associated with only one generated\n// source file, but may contain references to different source .proto files.\nmessage GeneratedCodeInfo {\n  // An Annotation connects some span of text in generated code to an element\n  // of its generating .proto file.\n  repeated Annotation annotation = 1;\n  message Annotation {\n    // Identifies the element in the original source .proto file. This field\n    // is formatted the same as SourceCodeInfo.Location.path.\n    repeated int32 path = 1 [packed = true];\n\n    // Identifies the filesystem path to the original source .proto.\n    optional string source_file = 2;\n\n    // Identifies the starting offset in bytes in the generated code\n    // that relates to the identified object.\n    optional int32 begin = 3;\n\n    // Identifies the ending offset in bytes in the generated code that\n    // relates to the identified offset. The end offset should be one past\n    // the last relevant byte (so the length of the text = end - begin).\n    optional int32 end = 4;\n  }\n}\n"
  },
  {
    "path": "service/goods/third_party/google/protobuf/duration.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption cc_enable_arenas = true;\noption go_package = \"google.golang.org/protobuf/types/known/durationpb\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"DurationProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\n\n// A Duration represents a signed, fixed-length span of time represented\n// as a count of seconds and fractions of seconds at nanosecond\n// resolution. It is independent of any calendar and concepts like \"day\"\n// or \"month\". It is related to Timestamp in that the difference between\n// two Timestamp values is a Duration and it can be added or subtracted\n// from a Timestamp. Range is approximately +-10,000 years.\n//\n// # Examples\n//\n// Example 1: Compute Duration from two Timestamps in pseudo code.\n//\n//     Timestamp start = ...;\n//     Timestamp end = ...;\n//     Duration duration = ...;\n//\n//     duration.seconds = end.seconds - start.seconds;\n//     duration.nanos = end.nanos - start.nanos;\n//\n//     if (duration.seconds < 0 && duration.nanos > 0) {\n//       duration.seconds += 1;\n//       duration.nanos -= 1000000000;\n//     } else if (duration.seconds > 0 && duration.nanos < 0) {\n//       duration.seconds -= 1;\n//       duration.nanos += 1000000000;\n//     }\n//\n// Example 2: Compute Timestamp from Timestamp + Duration in pseudo code.\n//\n//     Timestamp start = ...;\n//     Duration duration = ...;\n//     Timestamp end = ...;\n//\n//     end.seconds = start.seconds + duration.seconds;\n//     end.nanos = start.nanos + duration.nanos;\n//\n//     if (end.nanos < 0) {\n//       end.seconds -= 1;\n//       end.nanos += 1000000000;\n//     } else if (end.nanos >= 1000000000) {\n//       end.seconds += 1;\n//       end.nanos -= 1000000000;\n//     }\n//\n// Example 3: Compute Duration from datetime.timedelta in Python.\n//\n//     td = datetime.timedelta(days=3, minutes=10)\n//     duration = Duration()\n//     duration.FromTimedelta(td)\n//\n// # JSON Mapping\n//\n// In JSON format, the Duration type is encoded as a string rather than an\n// object, where the string ends in the suffix \"s\" (indicating seconds) and\n// is preceded by the number of seconds, with nanoseconds expressed as\n// fractional seconds. For example, 3 seconds with 0 nanoseconds should be\n// encoded in JSON format as \"3s\", while 3 seconds and 1 nanosecond should\n// be expressed in JSON format as \"3.000000001s\", and 3 seconds and 1\n// microsecond should be expressed in JSON format as \"3.000001s\".\n//\n//\nmessage Duration {\n  // Signed seconds of the span of time. Must be from -315,576,000,000\n  // to +315,576,000,000 inclusive. Note: these bounds are computed from:\n  // 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years\n  int64 seconds = 1;\n\n  // Signed fractions of a second at nanosecond resolution of the span\n  // of time. Durations less than one second are represented with a 0\n  // `seconds` field and a positive or negative `nanos` field. For durations\n  // of one second or more, a non-zero value for the `nanos` field must be\n  // of the same sign as the `seconds` field. Must be from -999,999,999\n  // to +999,999,999 inclusive.\n  int32 nanos = 2;\n}\n"
  },
  {
    "path": "service/goods/third_party/google/protobuf/empty.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption go_package = \"google.golang.org/protobuf/types/known/emptypb\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"EmptyProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\noption cc_enable_arenas = true;\n\n// A generic empty message that you can re-use to avoid defining duplicated\n// empty messages in your APIs. A typical example is to use it as the request\n// or the response type of an API method. For instance:\n//\n//     service Foo {\n//       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n//     }\n//\n// The JSON representation for `Empty` is empty JSON object `{}`.\nmessage Empty {}\n"
  },
  {
    "path": "service/goods/third_party/google/protobuf/field_mask.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"FieldMaskProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\noption go_package = \"google.golang.org/protobuf/types/known/fieldmaskpb\";\noption cc_enable_arenas = true;\n\n// `FieldMask` represents a set of symbolic field paths, for example:\n//\n//     paths: \"f.a\"\n//     paths: \"f.b.d\"\n//\n// Here `f` represents a field in some root message, `a` and `b`\n// fields in the message found in `f`, and `d` a field found in the\n// message in `f.b`.\n//\n// Field masks are used to specify a subset of fields that should be\n// returned by a get operation or modified by an update operation.\n// Field masks also have a custom JSON encoding (see below).\n//\n// # Field Masks in Projections\n//\n// When used in the context of a projection, a response message or\n// sub-message is filtered by the API to only contain those fields as\n// specified in the mask. For example, if the mask in the previous\n// example is applied to a response message as follows:\n//\n//     f {\n//       a : 22\n//       b {\n//         d : 1\n//         x : 2\n//       }\n//       y : 13\n//     }\n//     z: 8\n//\n// The result will not contain specific values for fields x,y and z\n// (their value will be set to the default, and omitted in proto text\n// output):\n//\n//\n//     f {\n//       a : 22\n//       b {\n//         d : 1\n//       }\n//     }\n//\n// A repeated field is not allowed except at the last position of a\n// paths string.\n//\n// If a FieldMask object is not present in a get operation, the\n// operation applies to all fields (as if a FieldMask of all fields\n// had been specified).\n//\n// Note that a field mask does not necessarily apply to the\n// top-level response message. In case of a REST get operation, the\n// field mask applies directly to the response, but in case of a REST\n// list operation, the mask instead applies to each individual message\n// in the returned resource list. In case of a REST custom method,\n// other definitions may be used. Where the mask applies will be\n// clearly documented together with its declaration in the API.  In\n// any case, the effect on the returned resource/resources is required\n// behavior for APIs.\n//\n// # Field Masks in Update Operations\n//\n// A field mask in update operations specifies which fields of the\n// targeted resource are going to be updated. The API is required\n// to only change the values of the fields as specified in the mask\n// and leave the others untouched. If a resource is passed in to\n// describe the updated values, the API ignores the values of all\n// fields not covered by the mask.\n//\n// If a repeated field is specified for an update operation, new values will\n// be appended to the existing repeated field in the target resource. Note that\n// a repeated field is only allowed in the last position of a `paths` string.\n//\n// If a sub-message is specified in the last position of the field mask for an\n// update operation, then new value will be merged into the existing sub-message\n// in the target resource.\n//\n// For example, given the target message:\n//\n//     f {\n//       b {\n//         d: 1\n//         x: 2\n//       }\n//       c: [1]\n//     }\n//\n// And an update message:\n//\n//     f {\n//       b {\n//         d: 10\n//       }\n//       c: [2]\n//     }\n//\n// then if the field mask is:\n//\n//  paths: [\"f.b\", \"f.c\"]\n//\n// then the result will be:\n//\n//     f {\n//       b {\n//         d: 10\n//         x: 2\n//       }\n//       c: [1, 2]\n//     }\n//\n// An implementation may provide options to override this default behavior for\n// repeated and message fields.\n//\n// In order to reset a field's value to the default, the field must\n// be in the mask and set to the default value in the provided resource.\n// Hence, in order to reset all fields of a resource, provide a default\n// instance of the resource and set all fields in the mask, or do\n// not provide a mask as described below.\n//\n// If a field mask is not present on update, the operation applies to\n// all fields (as if a field mask of all fields has been specified).\n// Note that in the presence of schema evolution, this may mean that\n// fields the client does not know and has therefore not filled into\n// the request will be reset to their default. If this is unwanted\n// behavior, a specific service may require a client to always specify\n// a field mask, producing an error if not.\n//\n// As with get operations, the location of the resource which\n// describes the updated values in the request message depends on the\n// operation kind. In any case, the effect of the field mask is\n// required to be honored by the API.\n//\n// ## Considerations for HTTP REST\n//\n// The HTTP kind of an update operation which uses a field mask must\n// be set to PATCH instead of PUT in order to satisfy HTTP semantics\n// (PUT must only be used for full updates).\n//\n// # JSON Encoding of Field Masks\n//\n// In JSON, a field mask is encoded as a single string where paths are\n// separated by a comma. Fields name in each path are converted\n// to/from lower-camel naming conventions.\n//\n// As an example, consider the following message declarations:\n//\n//     message Profile {\n//       User user = 1;\n//       Photo photo = 2;\n//     }\n//     message User {\n//       string display_name = 1;\n//       string address = 2;\n//     }\n//\n// In proto a field mask for `Profile` may look as such:\n//\n//     mask {\n//       paths: \"user.display_name\"\n//       paths: \"photo\"\n//     }\n//\n// In JSON, the same mask is represented as below:\n//\n//     {\n//       mask: \"user.displayName,photo\"\n//     }\n//\n// # Field Masks and Oneof Fields\n//\n// Field masks treat fields in oneofs just as regular fields. Consider the\n// following message:\n//\n//     message SampleMessage {\n//       oneof test_oneof {\n//         string name = 4;\n//         SubMessage sub_message = 9;\n//       }\n//     }\n//\n// The field mask can be:\n//\n//     mask {\n//       paths: \"name\"\n//     }\n//\n// Or:\n//\n//     mask {\n//       paths: \"sub_message\"\n//     }\n//\n// Note that oneof type names (\"test_oneof\" in this case) cannot be used in\n// paths.\n//\n// ## Field Mask Verification\n//\n// The implementation of any API method which has a FieldMask type field in the\n// request should verify the included field paths, and return an\n// `INVALID_ARGUMENT` error if any path is unmappable.\nmessage FieldMask {\n  // The set of field mask paths.\n  repeated string paths = 1;\n}\n"
  },
  {
    "path": "service/goods/third_party/google/protobuf/source_context.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"SourceContextProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\noption go_package = \"google.golang.org/protobuf/types/known/sourcecontextpb\";\n\n// `SourceContext` represents information about the source of a\n// protobuf element, like the file in which it is defined.\nmessage SourceContext {\n  // The path-qualified name of the .proto file that contained the associated\n  // protobuf element.  For example: `\"google/protobuf/source_context.proto\"`.\n  string file_name = 1;\n}\n"
  },
  {
    "path": "service/goods/third_party/google/protobuf/struct.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption cc_enable_arenas = true;\noption go_package = \"google.golang.org/protobuf/types/known/structpb\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"StructProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\n\n// `Struct` represents a structured data value, consisting of fields\n// which map to dynamically typed values. In some languages, `Struct`\n// might be supported by a native representation. For example, in\n// scripting languages like JS a struct is represented as an\n// object. The details of that representation are described together\n// with the proto support for the language.\n//\n// The JSON representation for `Struct` is JSON object.\nmessage Struct {\n  // Unordered map of dynamically typed values.\n  map<string, Value> fields = 1;\n}\n\n// `Value` represents a dynamically typed value which can be either\n// null, a number, a string, a boolean, a recursive struct value, or a\n// list of values. A producer of value is expected to set one of these\n// variants. Absence of any variant indicates an error.\n//\n// The JSON representation for `Value` is JSON value.\nmessage Value {\n  // The kind of value.\n  oneof kind {\n    // Represents a null value.\n    NullValue null_value = 1;\n    // Represents a double value.\n    double number_value = 2;\n    // Represents a string value.\n    string string_value = 3;\n    // Represents a boolean value.\n    bool bool_value = 4;\n    // Represents a structured value.\n    Struct struct_value = 5;\n    // Represents a repeated `Value`.\n    ListValue list_value = 6;\n  }\n}\n\n// `NullValue` is a singleton enumeration to represent the null value for the\n// `Value` type union.\n//\n//  The JSON representation for `NullValue` is JSON `null`.\nenum NullValue {\n  // Null value.\n  NULL_VALUE = 0;\n}\n\n// `ListValue` is a wrapper around a repeated field of values.\n//\n// The JSON representation for `ListValue` is JSON array.\nmessage ListValue {\n  // Repeated field of dynamically typed values.\n  repeated Value values = 1;\n}\n"
  },
  {
    "path": "service/goods/third_party/google/protobuf/timestamp.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption cc_enable_arenas = true;\noption go_package = \"google.golang.org/protobuf/types/known/timestamppb\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"TimestampProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\n\n// A Timestamp represents a point in time independent of any time zone or local\n// calendar, encoded as a count of seconds and fractions of seconds at\n// nanosecond resolution. The count is relative to an epoch at UTC midnight on\n// January 1, 1970, in the proleptic Gregorian calendar which extends the\n// Gregorian calendar backwards to year one.\n//\n// All minutes are 60 seconds long. Leap seconds are \"smeared\" so that no leap\n// second table is needed for interpretation, using a [24-hour linear\n// smear](https://developers.google.com/time/smear).\n//\n// The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By\n// restricting to that range, we ensure that we can convert to and from [RFC\n// 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.\n//\n// # Examples\n//\n// Example 1: Compute Timestamp from POSIX `time()`.\n//\n//     Timestamp timestamp;\n//     timestamp.set_seconds(time(NULL));\n//     timestamp.set_nanos(0);\n//\n// Example 2: Compute Timestamp from POSIX `gettimeofday()`.\n//\n//     struct timeval tv;\n//     gettimeofday(&tv, NULL);\n//\n//     Timestamp timestamp;\n//     timestamp.set_seconds(tv.tv_sec);\n//     timestamp.set_nanos(tv.tv_usec * 1000);\n//\n// Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`.\n//\n//     FILETIME ft;\n//     GetSystemTimeAsFileTime(&ft);\n//     UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime;\n//\n//     // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z\n//     // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.\n//     Timestamp timestamp;\n//     timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));\n//     timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));\n//\n// Example 4: Compute Timestamp from Java `System.currentTimeMillis()`.\n//\n//     long millis = System.currentTimeMillis();\n//\n//     Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)\n//         .setNanos((int) ((millis % 1000) * 1000000)).build();\n//\n//\n// Example 5: Compute Timestamp from Java `Instant.now()`.\n//\n//     Instant now = Instant.now();\n//\n//     Timestamp timestamp =\n//         Timestamp.newBuilder().setSeconds(now.getEpochSecond())\n//             .setNanos(now.getNano()).build();\n//\n//\n// Example 6: Compute Timestamp from current time in Python.\n//\n//     timestamp = Timestamp()\n//     timestamp.GetCurrentTime()\n//\n// # JSON Mapping\n//\n// In JSON format, the Timestamp type is encoded as a string in the\n// [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the\n// format is \"{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z\"\n// where {year} is always expressed using four digits while {month}, {day},\n// {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional\n// seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution),\n// are optional. The \"Z\" suffix indicates the timezone (\"UTC\"); the timezone\n// is required. A proto3 JSON serializer should always use UTC (as indicated by\n// \"Z\") when printing the Timestamp type and a proto3 JSON parser should be\n// able to accept both UTC and other timezones (as indicated by an offset).\n//\n// For example, \"2017-01-15T01:30:15.01Z\" encodes 15.01 seconds past\n// 01:30 UTC on January 15, 2017.\n//\n// In JavaScript, one can convert a Date object to this format using the\n// standard\n// [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString)\n// method. In Python, a standard `datetime.datetime` object can be converted\n// to this format using\n// [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with\n// the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use\n// the Joda Time's [`ISODateTimeFormat.dateTime()`](\n// http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime%2D%2D\n// ) to obtain a formatter capable of generating timestamps in this format.\n//\n//\nmessage Timestamp {\n  // Represents seconds of UTC time since Unix epoch\n  // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to\n  // 9999-12-31T23:59:59Z inclusive.\n  int64 seconds = 1;\n\n  // Non-negative fractions of a second at nanosecond resolution. Negative\n  // second values with fractions must still have non-negative nanos values\n  // that count forward in time. Must be from 0 to 999,999,999\n  // inclusive.\n  int32 nanos = 2;\n}\n"
  },
  {
    "path": "service/goods/third_party/google/protobuf/type.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\nimport \"google/protobuf/any.proto\";\nimport \"google/protobuf/source_context.proto\";\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption cc_enable_arenas = true;\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"TypeProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\noption go_package = \"google.golang.org/protobuf/types/known/typepb\";\n\n// A protocol buffer message type.\nmessage Type {\n  // The fully qualified message name.\n  string name = 1;\n  // The list of fields.\n  repeated Field fields = 2;\n  // The list of types appearing in `oneof` definitions in this type.\n  repeated string oneofs = 3;\n  // The protocol buffer options.\n  repeated Option options = 4;\n  // The source context.\n  SourceContext source_context = 5;\n  // The source syntax.\n  Syntax syntax = 6;\n}\n\n// A single field of a message type.\nmessage Field {\n  // Basic field types.\n  enum Kind {\n    // Field type unknown.\n    TYPE_UNKNOWN = 0;\n    // Field type double.\n    TYPE_DOUBLE = 1;\n    // Field type float.\n    TYPE_FLOAT = 2;\n    // Field type int64.\n    TYPE_INT64 = 3;\n    // Field type uint64.\n    TYPE_UINT64 = 4;\n    // Field type int32.\n    TYPE_INT32 = 5;\n    // Field type fixed64.\n    TYPE_FIXED64 = 6;\n    // Field type fixed32.\n    TYPE_FIXED32 = 7;\n    // Field type bool.\n    TYPE_BOOL = 8;\n    // Field type string.\n    TYPE_STRING = 9;\n    // Field type group. Proto2 syntax only, and deprecated.\n    TYPE_GROUP = 10;\n    // Field type message.\n    TYPE_MESSAGE = 11;\n    // Field type bytes.\n    TYPE_BYTES = 12;\n    // Field type uint32.\n    TYPE_UINT32 = 13;\n    // Field type enum.\n    TYPE_ENUM = 14;\n    // Field type sfixed32.\n    TYPE_SFIXED32 = 15;\n    // Field type sfixed64.\n    TYPE_SFIXED64 = 16;\n    // Field type sint32.\n    TYPE_SINT32 = 17;\n    // Field type sint64.\n    TYPE_SINT64 = 18;\n  }\n\n  // Whether a field is optional, required, or repeated.\n  enum Cardinality {\n    // For fields with unknown cardinality.\n    CARDINALITY_UNKNOWN = 0;\n    // For optional fields.\n    CARDINALITY_OPTIONAL = 1;\n    // For required fields. Proto2 syntax only.\n    CARDINALITY_REQUIRED = 2;\n    // For repeated fields.\n    CARDINALITY_REPEATED = 3;\n  }\n\n  // The field type.\n  Kind kind = 1;\n  // The field cardinality.\n  Cardinality cardinality = 2;\n  // The field number.\n  int32 number = 3;\n  // The field name.\n  string name = 4;\n  // The field type URL, without the scheme, for message or enumeration\n  // types. Example: `\"type.googleapis.com/google.protobuf.Timestamp\"`.\n  string type_url = 6;\n  // The index of the field type in `Type.oneofs`, for message or enumeration\n  // types. The first type has index 1; zero means the type is not in the list.\n  int32 oneof_index = 7;\n  // Whether to use alternative packed wire representation.\n  bool packed = 8;\n  // The protocol buffer options.\n  repeated Option options = 9;\n  // The field JSON name.\n  string json_name = 10;\n  // The string value of the default value of this field. Proto2 syntax only.\n  string default_value = 11;\n}\n\n// Enum type definition.\nmessage Enum {\n  // Enum type name.\n  string name = 1;\n  // Enum value definitions.\n  repeated EnumValue enumvalue = 2;\n  // Protocol buffer options.\n  repeated Option options = 3;\n  // The source context.\n  SourceContext source_context = 4;\n  // The source syntax.\n  Syntax syntax = 5;\n}\n\n// Enum value definition.\nmessage EnumValue {\n  // Enum value name.\n  string name = 1;\n  // Enum value number.\n  int32 number = 2;\n  // Protocol buffer options.\n  repeated Option options = 3;\n}\n\n// A protocol buffer option, which can be attached to a message, field,\n// enumeration, etc.\nmessage Option {\n  // The option's name. For protobuf built-in options (options defined in\n  // descriptor.proto), this is the short name. For example, `\"map_entry\"`.\n  // For custom options, it should be the fully-qualified name. For example,\n  // `\"google.api.http\"`.\n  string name = 1;\n  // The option's value packed in an Any message. If the value is a primitive,\n  // the corresponding wrapper type defined in google/protobuf/wrappers.proto\n  // should be used. If the value is an enum, it should be stored as an int32\n  // value using the google.protobuf.Int32Value type.\n  Any value = 2;\n}\n\n// The syntax in which a protocol buffer element is defined.\nenum Syntax {\n  // Syntax `proto2`.\n  SYNTAX_PROTO2 = 0;\n  // Syntax `proto3`.\n  SYNTAX_PROTO3 = 1;\n}\n"
  },
  {
    "path": "service/goods/third_party/google/protobuf/wrappers.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Wrappers for primitive (non-message) types. These types are useful\n// for embedding primitives in the `google.protobuf.Any` type and for places\n// where we need to distinguish between the absence of a primitive\n// typed field and its default value.\n//\n// These wrappers have no meaningful use within repeated fields as they lack\n// the ability to detect presence on individual elements.\n// These wrappers have no meaningful use within a map or a oneof since\n// individual entries of a map or fields of a oneof can already detect presence.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption cc_enable_arenas = true;\noption go_package = \"google.golang.org/protobuf/types/known/wrapperspb\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"WrappersProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\n\n// Wrapper message for `double`.\n//\n// The JSON representation for `DoubleValue` is JSON number.\nmessage DoubleValue {\n  // The double value.\n  double value = 1;\n}\n\n// Wrapper message for `float`.\n//\n// The JSON representation for `FloatValue` is JSON number.\nmessage FloatValue {\n  // The float value.\n  float value = 1;\n}\n\n// Wrapper message for `int64`.\n//\n// The JSON representation for `Int64Value` is JSON string.\nmessage Int64Value {\n  // The int64 value.\n  int64 value = 1;\n}\n\n// Wrapper message for `uint64`.\n//\n// The JSON representation for `UInt64Value` is JSON string.\nmessage UInt64Value {\n  // The uint64 value.\n  uint64 value = 1;\n}\n\n// Wrapper message for `int32`.\n//\n// The JSON representation for `Int32Value` is JSON number.\nmessage Int32Value {\n  // The int32 value.\n  int32 value = 1;\n}\n\n// Wrapper message for `uint32`.\n//\n// The JSON representation for `UInt32Value` is JSON number.\nmessage UInt32Value {\n  // The uint32 value.\n  uint32 value = 1;\n}\n\n// Wrapper message for `bool`.\n//\n// The JSON representation for `BoolValue` is JSON `true` and `false`.\nmessage BoolValue {\n  // The bool value.\n  bool value = 1;\n}\n\n// Wrapper message for `string`.\n//\n// The JSON representation for `StringValue` is JSON string.\nmessage StringValue {\n  // The string value.\n  string value = 1;\n}\n\n// Wrapper message for `bytes`.\n//\n// The JSON representation for `BytesValue` is JSON string.\nmessage BytesValue {\n  // The bytes value.\n  bytes value = 1;\n}\n"
  },
  {
    "path": "service/goods/third_party/openapi/v3/annotations.proto",
    "content": "// Copyright 2022 Google LLC. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//    http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\npackage openapi.v3;\n\nimport \"openapiv3/OpenAPIv3.proto\";\nimport \"google/protobuf/descriptor.proto\";\n\n// This option lets the proto compiler generate Java code inside the package\n// name (see below) instead of inside an outer class. It creates a simpler\n// developer experience by reducing one-level of name nesting and be\n// consistent with most programming languages that don't support outer classes.\noption java_multiple_files = true;\n\n// The Java outer classname should be the filename in UpperCamelCase. This\n// class is only used to hold proto descriptor, so developers don't need to\n// work with it directly.\noption java_outer_classname = \"AnnotationsProto\";\n\n// The Java package name must be proto package name with proper prefix.\noption java_package = \"org.openapi_v3\";\n\n// A reasonable prefix for the Objective-C symbols generated from the package.\n// It should at a minimum be 3 characters long, all uppercase, and convention\n// is to use an abbreviation of the package name. Something short, but\n// hopefully unique enough to not conflict with things that may come along in\n// the future. 'GPB' is reserved for the protocol buffer implementation itself.\noption objc_class_prefix = \"OAS\";\n\n// The Go package name.\noption go_package = \"github.com/google/gnostic/openapiv3;openapi_v3\";\n\nextend google.protobuf.FileOptions {\n  Document document = 1143;\n}\n\nextend google.protobuf.MethodOptions {\n  Operation operation = 1143;\n}\n\nextend google.protobuf.MessageOptions {\n  Schema schema = 1143;\n}\n\nextend google.protobuf.FieldOptions {\n  Schema property = 1143;\n}"
  },
  {
    "path": "service/goods/third_party/openapi/v3/openapi.proto",
    "content": "// Copyright 2020 Google LLC. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//    http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// THIS FILE IS AUTOMATICALLY GENERATED.\n\nsyntax = \"proto3\";\n\npackage openapi.v3;\n\nimport \"google/protobuf/any.proto\";\n\n// This option lets the proto compiler generate Java code inside the package\n// name (see below) instead of inside an outer class. It creates a simpler\n// developer experience by reducing one-level of name nesting and be\n// consistent with most programming languages that don't support outer classes.\noption java_multiple_files = true;\n\n// The Java outer classname should be the filename in UpperCamelCase. This\n// class is only used to hold proto descriptor, so developers don't need to\n// work with it directly.\noption java_outer_classname = \"OpenAPIProto\";\n\n// The Java package name must be proto package name with proper prefix.\noption java_package = \"org.openapi_v3\";\n\n// A reasonable prefix for the Objective-C symbols generated from the package.\n// It should at a minimum be 3 characters long, all uppercase, and convention\n// is to use an abbreviation of the package name. Something short, but\n// hopefully unique enough to not conflict with things that may come along in\n// the future. 'GPB' is reserved for the protocol buffer implementation itself.\noption objc_class_prefix = \"OAS\";\n\n// The Go package name.\noption go_package = \"github.com/google/gnostic/openapiv3;openapi_v3\";\n\nmessage AdditionalPropertiesItem {\n  oneof oneof {\n    SchemaOrReference schema_or_reference = 1;\n    bool boolean = 2;\n  }\n}\n\nmessage Any {\n  google.protobuf.Any value = 1;\n  string yaml = 2;\n}\n\nmessage AnyOrExpression {\n  oneof oneof {\n    Any any = 1;\n    Expression expression = 2;\n  }\n}\n\n// A map of possible out-of band callbacks related to the parent operation. Each value in the map is a Path Item Object that describes a set of requests that may be initiated by the API provider and the expected responses. The key value used to identify the callback object is an expression, evaluated at runtime, that identifies a URL to use for the callback operation.\nmessage Callback {\n  repeated NamedPathItem path = 1;\n  repeated NamedAny specification_extension = 2;\n}\n\nmessage CallbackOrReference {\n  oneof oneof {\n    Callback callback = 1;\n    Reference reference = 2;\n  }\n}\n\nmessage CallbacksOrReferences {\n  repeated NamedCallbackOrReference additional_properties = 1;\n}\n\n// Holds a set of reusable objects for different aspects of the OAS. All objects defined within the components object will have no effect on the API unless they are explicitly referenced from properties outside the components object.\nmessage Components {\n  SchemasOrReferences schemas = 1;\n  ResponsesOrReferences responses = 2;\n  ParametersOrReferences parameters = 3;\n  ExamplesOrReferences examples = 4;\n  RequestBodiesOrReferences request_bodies = 5;\n  HeadersOrReferences headers = 6;\n  SecuritySchemesOrReferences security_schemes = 7;\n  LinksOrReferences links = 8;\n  CallbacksOrReferences callbacks = 9;\n  repeated NamedAny specification_extension = 10;\n}\n\n// Contact information for the exposed API.\nmessage Contact {\n  string name = 1;\n  string url = 2;\n  string email = 3;\n  repeated NamedAny specification_extension = 4;\n}\n\nmessage DefaultType {\n  oneof oneof {\n    double number = 1;\n    bool boolean = 2;\n    string string = 3;\n  }\n}\n\n// When request bodies or response payloads may be one of a number of different schemas, a `discriminator` object can be used to aid in serialization, deserialization, and validation.  The discriminator is a specific object in a schema which is used to inform the consumer of the specification of an alternative schema based on the value associated with it.  When using the discriminator, _inline_ schemas will not be considered.\nmessage Discriminator {\n  string property_name = 1;\n  Strings mapping = 2;\n  repeated NamedAny specification_extension = 3;\n}\n\nmessage Document {\n  string openapi = 1;\n  Info info = 2;\n  repeated Server servers = 3;\n  Paths paths = 4;\n  Components components = 5;\n  repeated SecurityRequirement security = 6;\n  repeated Tag tags = 7;\n  ExternalDocs external_docs = 8;\n  repeated NamedAny specification_extension = 9;\n}\n\n// A single encoding definition applied to a single schema property.\nmessage Encoding {\n  string content_type = 1;\n  HeadersOrReferences headers = 2;\n  string style = 3;\n  bool explode = 4;\n  bool allow_reserved = 5;\n  repeated NamedAny specification_extension = 6;\n}\n\nmessage Encodings {\n  repeated NamedEncoding additional_properties = 1;\n}\n\nmessage Example {\n  string summary = 1;\n  string description = 2;\n  Any value = 3;\n  string external_value = 4;\n  repeated NamedAny specification_extension = 5;\n}\n\nmessage ExampleOrReference {\n  oneof oneof {\n    Example example = 1;\n    Reference reference = 2;\n  }\n}\n\nmessage ExamplesOrReferences {\n  repeated NamedExampleOrReference additional_properties = 1;\n}\n\nmessage Expression {\n  repeated NamedAny additional_properties = 1;\n}\n\n// Allows referencing an external resource for extended documentation.\nmessage ExternalDocs {\n  string description = 1;\n  string url = 2;\n  repeated NamedAny specification_extension = 3;\n}\n\n// The Header Object follows the structure of the Parameter Object with the following changes:  1. `name` MUST NOT be specified, it is given in the corresponding `headers` map. 1. `in` MUST NOT be specified, it is implicitly in `header`. 1. All traits that are affected by the location MUST be applicable to a location of `header` (for example, `style`).\nmessage Header {\n  string description = 1;\n  bool required = 2;\n  bool deprecated = 3;\n  bool allow_empty_value = 4;\n  string style = 5;\n  bool explode = 6;\n  bool allow_reserved = 7;\n  SchemaOrReference schema = 8;\n  Any example = 9;\n  ExamplesOrReferences examples = 10;\n  MediaTypes content = 11;\n  repeated NamedAny specification_extension = 12;\n}\n\nmessage HeaderOrReference {\n  oneof oneof {\n    Header header = 1;\n    Reference reference = 2;\n  }\n}\n\nmessage HeadersOrReferences {\n  repeated NamedHeaderOrReference additional_properties = 1;\n}\n\n// The object provides metadata about the API. The metadata MAY be used by the clients if needed, and MAY be presented in editing or documentation generation tools for convenience.\nmessage Info {\n  string title = 1;\n  string description = 2;\n  string terms_of_service = 3;\n  Contact contact = 4;\n  License license = 5;\n  string version = 6;\n  repeated NamedAny specification_extension = 7;\n  string summary = 8;\n}\n\nmessage ItemsItem {\n  repeated SchemaOrReference schema_or_reference = 1;\n}\n\n// License information for the exposed API.\nmessage License {\n  string name = 1;\n  string url = 2;\n  repeated NamedAny specification_extension = 3;\n}\n\n// The `Link object` represents a possible design-time link for a response. The presence of a link does not guarantee the caller's ability to successfully invoke it, rather it provides a known relationship and traversal mechanism between responses and other operations.  Unlike _dynamic_ links (i.e. links provided **in** the response payload), the OAS linking mechanism does not require link information in the runtime response.  For computing links, and providing instructions to execute them, a runtime expression is used for accessing values in an operation and using them as parameters while invoking the linked operation.\nmessage Link {\n  string operation_ref = 1;\n  string operation_id = 2;\n  AnyOrExpression parameters = 3;\n  AnyOrExpression request_body = 4;\n  string description = 5;\n  Server server = 6;\n  repeated NamedAny specification_extension = 7;\n}\n\nmessage LinkOrReference {\n  oneof oneof {\n    Link link = 1;\n    Reference reference = 2;\n  }\n}\n\nmessage LinksOrReferences {\n  repeated NamedLinkOrReference additional_properties = 1;\n}\n\n// Each Media Type Object provides schema and examples for the media type identified by its key.\nmessage MediaType {\n  SchemaOrReference schema = 1;\n  Any example = 2;\n  ExamplesOrReferences examples = 3;\n  Encodings encoding = 4;\n  repeated NamedAny specification_extension = 5;\n}\n\nmessage MediaTypes {\n  repeated NamedMediaType additional_properties = 1;\n}\n\n// Automatically-generated message used to represent maps of Any as ordered (name,value) pairs.\nmessage NamedAny {\n  // Map key\n  string name = 1;\n  // Mapped value\n  Any value = 2;\n}\n\n// Automatically-generated message used to represent maps of CallbackOrReference as ordered (name,value) pairs.\nmessage NamedCallbackOrReference {\n  // Map key\n  string name = 1;\n  // Mapped value\n  CallbackOrReference value = 2;\n}\n\n// Automatically-generated message used to represent maps of Encoding as ordered (name,value) pairs.\nmessage NamedEncoding {\n  // Map key\n  string name = 1;\n  // Mapped value\n  Encoding value = 2;\n}\n\n// Automatically-generated message used to represent maps of ExampleOrReference as ordered (name,value) pairs.\nmessage NamedExampleOrReference {\n  // Map key\n  string name = 1;\n  // Mapped value\n  ExampleOrReference value = 2;\n}\n\n// Automatically-generated message used to represent maps of HeaderOrReference as ordered (name,value) pairs.\nmessage NamedHeaderOrReference {\n  // Map key\n  string name = 1;\n  // Mapped value\n  HeaderOrReference value = 2;\n}\n\n// Automatically-generated message used to represent maps of LinkOrReference as ordered (name,value) pairs.\nmessage NamedLinkOrReference {\n  // Map key\n  string name = 1;\n  // Mapped value\n  LinkOrReference value = 2;\n}\n\n// Automatically-generated message used to represent maps of MediaType as ordered (name,value) pairs.\nmessage NamedMediaType {\n  // Map key\n  string name = 1;\n  // Mapped value\n  MediaType value = 2;\n}\n\n// Automatically-generated message used to represent maps of ParameterOrReference as ordered (name,value) pairs.\nmessage NamedParameterOrReference {\n  // Map key\n  string name = 1;\n  // Mapped value\n  ParameterOrReference value = 2;\n}\n\n// Automatically-generated message used to represent maps of PathItem as ordered (name,value) pairs.\nmessage NamedPathItem {\n  // Map key\n  string name = 1;\n  // Mapped value\n  PathItem value = 2;\n}\n\n// Automatically-generated message used to represent maps of RequestBodyOrReference as ordered (name,value) pairs.\nmessage NamedRequestBodyOrReference {\n  // Map key\n  string name = 1;\n  // Mapped value\n  RequestBodyOrReference value = 2;\n}\n\n// Automatically-generated message used to represent maps of ResponseOrReference as ordered (name,value) pairs.\nmessage NamedResponseOrReference {\n  // Map key\n  string name = 1;\n  // Mapped value\n  ResponseOrReference value = 2;\n}\n\n// Automatically-generated message used to represent maps of SchemaOrReference as ordered (name,value) pairs.\nmessage NamedSchemaOrReference {\n  // Map key\n  string name = 1;\n  // Mapped value\n  SchemaOrReference value = 2;\n}\n\n// Automatically-generated message used to represent maps of SecuritySchemeOrReference as ordered (name,value) pairs.\nmessage NamedSecuritySchemeOrReference {\n  // Map key\n  string name = 1;\n  // Mapped value\n  SecuritySchemeOrReference value = 2;\n}\n\n// Automatically-generated message used to represent maps of ServerVariable as ordered (name,value) pairs.\nmessage NamedServerVariable {\n  // Map key\n  string name = 1;\n  // Mapped value\n  ServerVariable value = 2;\n}\n\n// Automatically-generated message used to represent maps of string as ordered (name,value) pairs.\nmessage NamedString {\n  // Map key\n  string name = 1;\n  // Mapped value\n  string value = 2;\n}\n\n// Automatically-generated message used to represent maps of StringArray as ordered (name,value) pairs.\nmessage NamedStringArray {\n  // Map key\n  string name = 1;\n  // Mapped value\n  StringArray value = 2;\n}\n\n// Configuration details for a supported OAuth Flow\nmessage OauthFlow {\n  string authorization_url = 1;\n  string token_url = 2;\n  string refresh_url = 3;\n  Strings scopes = 4;\n  repeated NamedAny specification_extension = 5;\n}\n\n// Allows configuration of the supported OAuth Flows.\nmessage OauthFlows {\n  OauthFlow implicit = 1;\n  OauthFlow password = 2;\n  OauthFlow client_credentials = 3;\n  OauthFlow authorization_code = 4;\n  repeated NamedAny specification_extension = 5;\n}\n\nmessage Object {\n  repeated NamedAny additional_properties = 1;\n}\n\n// Describes a single API operation on a path.\nmessage Operation {\n  repeated string tags = 1;\n  string summary = 2;\n  string description = 3;\n  ExternalDocs external_docs = 4;\n  string operation_id = 5;\n  repeated ParameterOrReference parameters = 6;\n  RequestBodyOrReference request_body = 7;\n  Responses responses = 8;\n  CallbacksOrReferences callbacks = 9;\n  bool deprecated = 10;\n  repeated SecurityRequirement security = 11;\n  repeated Server servers = 12;\n  repeated NamedAny specification_extension = 13;\n}\n\n// Describes a single operation parameter.  A unique parameter is defined by a combination of a name and location.\nmessage Parameter {\n  string name = 1;\n  string in = 2;\n  string description = 3;\n  bool required = 4;\n  bool deprecated = 5;\n  bool allow_empty_value = 6;\n  string style = 7;\n  bool explode = 8;\n  bool allow_reserved = 9;\n  SchemaOrReference schema = 10;\n  Any example = 11;\n  ExamplesOrReferences examples = 12;\n  MediaTypes content = 13;\n  repeated NamedAny specification_extension = 14;\n}\n\nmessage ParameterOrReference {\n  oneof oneof {\n    Parameter parameter = 1;\n    Reference reference = 2;\n  }\n}\n\nmessage ParametersOrReferences {\n  repeated NamedParameterOrReference additional_properties = 1;\n}\n\n// Describes the operations available on a single path. A Path Item MAY be empty, due to ACL constraints. The path itself is still exposed to the documentation viewer but they will not know which operations and parameters are available.\nmessage PathItem {\n  string _ref = 1;\n  string summary = 2;\n  string description = 3;\n  Operation get = 4;\n  Operation put = 5;\n  Operation post = 6;\n  Operation delete = 7;\n  Operation options = 8;\n  Operation head = 9;\n  Operation patch = 10;\n  Operation trace = 11;\n  repeated Server servers = 12;\n  repeated ParameterOrReference parameters = 13;\n  repeated NamedAny specification_extension = 14;\n}\n\n// Holds the relative paths to the individual endpoints and their operations. The path is appended to the URL from the `Server Object` in order to construct the full URL.  The Paths MAY be empty, due to ACL constraints.\nmessage Paths {\n  repeated NamedPathItem path = 1;\n  repeated NamedAny specification_extension = 2;\n}\n\nmessage Properties {\n  repeated NamedSchemaOrReference additional_properties = 1;\n}\n\n// A simple object to allow referencing other components in the specification, internally and externally.  The Reference Object is defined by JSON Reference and follows the same structure, behavior and rules.   For this specification, reference resolution is accomplished as defined by the JSON Reference specification and not by the JSON Schema specification.\nmessage Reference {\n  string _ref = 1;\n  string summary = 2;\n  string description = 3;\n}\n\nmessage RequestBodiesOrReferences {\n  repeated NamedRequestBodyOrReference additional_properties = 1;\n}\n\n// Describes a single request body.\nmessage RequestBody {\n  string description = 1;\n  MediaTypes content = 2;\n  bool required = 3;\n  repeated NamedAny specification_extension = 4;\n}\n\nmessage RequestBodyOrReference {\n  oneof oneof {\n    RequestBody request_body = 1;\n    Reference reference = 2;\n  }\n}\n\n// Describes a single response from an API Operation, including design-time, static  `links` to operations based on the response.\nmessage Response {\n  string description = 1;\n  HeadersOrReferences headers = 2;\n  MediaTypes content = 3;\n  LinksOrReferences links = 4;\n  repeated NamedAny specification_extension = 5;\n}\n\nmessage ResponseOrReference {\n  oneof oneof {\n    Response response = 1;\n    Reference reference = 2;\n  }\n}\n\n// A container for the expected responses of an operation. The container maps a HTTP response code to the expected response.  The documentation is not necessarily expected to cover all possible HTTP response codes because they may not be known in advance. However, documentation is expected to cover a successful operation response and any known errors.  The `default` MAY be used as a default response object for all HTTP codes  that are not covered individually by the specification.  The `Responses Object` MUST contain at least one response code, and it  SHOULD be the response for a successful operation call.\nmessage Responses {\n  ResponseOrReference default = 1;\n  repeated NamedResponseOrReference response_or_reference = 2;\n  repeated NamedAny specification_extension = 3;\n}\n\nmessage ResponsesOrReferences {\n  repeated NamedResponseOrReference additional_properties = 1;\n}\n\n// The Schema Object allows the definition of input and output data types. These types can be objects, but also primitives and arrays. This object is an extended subset of the JSON Schema Specification Wright Draft 00.  For more information about the properties, see JSON Schema Core and JSON Schema Validation. Unless stated otherwise, the property definitions follow the JSON Schema.\nmessage Schema {\n  bool nullable = 1;\n  Discriminator discriminator = 2;\n  bool read_only = 3;\n  bool write_only = 4;\n  Xml xml = 5;\n  ExternalDocs external_docs = 6;\n  Any example = 7;\n  bool deprecated = 8;\n  string title = 9;\n  double multiple_of = 10;\n  double maximum = 11;\n  bool exclusive_maximum = 12;\n  double minimum = 13;\n  bool exclusive_minimum = 14;\n  int64 max_length = 15;\n  int64 min_length = 16;\n  string pattern = 17;\n  int64 max_items = 18;\n  int64 min_items = 19;\n  bool unique_items = 20;\n  int64 max_properties = 21;\n  int64 min_properties = 22;\n  repeated string required = 23;\n  repeated Any enum = 24;\n  string type = 25;\n  repeated SchemaOrReference all_of = 26;\n  repeated SchemaOrReference one_of = 27;\n  repeated SchemaOrReference any_of = 28;\n  Schema not = 29;\n  ItemsItem items = 30;\n  Properties properties = 31;\n  AdditionalPropertiesItem additional_properties = 32;\n  DefaultType default = 33;\n  string description = 34;\n  string format = 35;\n  repeated NamedAny specification_extension = 36;\n}\n\nmessage SchemaOrReference {\n  oneof oneof {\n    Schema schema = 1;\n    Reference reference = 2;\n  }\n}\n\nmessage SchemasOrReferences {\n  repeated NamedSchemaOrReference additional_properties = 1;\n}\n\n// Lists the required security schemes to execute this operation. The name used for each property MUST correspond to a security scheme declared in the Security Schemes under the Components Object.  Security Requirement Objects that contain multiple schemes require that all schemes MUST be satisfied for a request to be authorized. This enables support for scenarios where multiple query parameters or HTTP headers are required to convey security information.  When a list of Security Requirement Objects is defined on the OpenAPI Object or Operation Object, only one of the Security Requirement Objects in the list needs to be satisfied to authorize the request.\nmessage SecurityRequirement {\n  repeated NamedStringArray additional_properties = 1;\n}\n\n// Defines a security scheme that can be used by the operations. Supported schemes are HTTP authentication, an API key (either as a header, a cookie parameter or as a query parameter), mutual TLS (use of a client certificate), OAuth2's common flows (implicit, password, application and access code) as defined in RFC6749, and OpenID Connect.   Please note that currently (2019) the implicit flow is about to be deprecated OAuth 2.0 Security Best Current Practice. Recommended for most use case is Authorization Code Grant flow with PKCE.\nmessage SecurityScheme {\n  string type = 1;\n  string description = 2;\n  string name = 3;\n  string in = 4;\n  string scheme = 5;\n  string bearer_format = 6;\n  OauthFlows flows = 7;\n  string open_id_connect_url = 8;\n  repeated NamedAny specification_extension = 9;\n}\n\nmessage SecuritySchemeOrReference {\n  oneof oneof {\n    SecurityScheme security_scheme = 1;\n    Reference reference = 2;\n  }\n}\n\nmessage SecuritySchemesOrReferences {\n  repeated NamedSecuritySchemeOrReference additional_properties = 1;\n}\n\n// An object representing a Server.\nmessage Server {\n  string url = 1;\n  string description = 2;\n  ServerVariables variables = 3;\n  repeated NamedAny specification_extension = 4;\n}\n\n// An object representing a Server Variable for server URL template substitution.\nmessage ServerVariable {\n  repeated string enum = 1;\n  string default = 2;\n  string description = 3;\n  repeated NamedAny specification_extension = 4;\n}\n\nmessage ServerVariables {\n  repeated NamedServerVariable additional_properties = 1;\n}\n\n// Any property starting with x- is valid.\nmessage SpecificationExtension {\n  oneof oneof {\n    double number = 1;\n    bool boolean = 2;\n    string string = 3;\n  }\n}\n\nmessage StringArray {\n  repeated string value = 1;\n}\n\nmessage Strings {\n  repeated NamedString additional_properties = 1;\n}\n\n// Adds metadata to a single tag that is used by the Operation Object. It is not mandatory to have a Tag Object per tag defined in the Operation Object instances.\nmessage Tag {\n  string name = 1;\n  string description = 2;\n  ExternalDocs external_docs = 3;\n  repeated NamedAny specification_extension = 4;\n}\n\n// A metadata object that allows for more fine-tuned XML model definitions.  When using arrays, XML element names are *not* inferred (for singular/plural forms) and the `name` property SHOULD be used to add that information. See examples for expected behavior.\nmessage Xml {\n  string name = 1;\n  string namespace = 2;\n  string prefix = 3;\n  bool attribute = 4;\n  bool wrapped = 5;\n  repeated NamedAny specification_extension = 6;\n}\n\n"
  },
  {
    "path": "service/goods/third_party/validate/README.md",
    "content": "# protoc-gen-validate (PGV)\n\n* https://github.com/envoyproxy/protoc-gen-validate\n"
  },
  {
    "path": "service/goods/third_party/validate/validate.proto",
    "content": "syntax = \"proto2\";\npackage validate;\n\noption go_package = \"github.com/envoyproxy/protoc-gen-validate/validate\";\noption java_package = \"io.envoyproxy.pgv.validate\";\n\nimport \"google/protobuf/descriptor.proto\";\nimport \"google/protobuf/duration.proto\";\nimport \"google/protobuf/timestamp.proto\";\n\n// Validation rules applied at the message level\nextend google.protobuf.MessageOptions {\n    // Disabled nullifies any validation rules for this message, including any\n    // message fields associated with it that do support validation.\n    optional bool disabled = 1071;\n    // Ignore skips generation of validation methods for this message.\n    optional bool ignored = 1072;\n}\n\n// Validation rules applied at the oneof level\nextend google.protobuf.OneofOptions {\n    // Required ensures that exactly one the field options in a oneof is set;\n    // validation fails if no fields in the oneof are set.\n    optional bool required = 1071;\n}\n\n// Validation rules applied at the field level\nextend google.protobuf.FieldOptions {\n    // Rules specify the validations to be performed on this field. By default,\n    // no validation is performed against a field.\n    optional FieldRules rules = 1071;\n}\n\n// FieldRules encapsulates the rules for each type of field. Depending on the\n// field, the correct set should be used to ensure proper validations.\nmessage FieldRules {\n    optional MessageRules message = 17;\n    oneof type {\n        // Scalar Field Types\n        FloatRules    float    = 1;\n        DoubleRules   double   = 2;\n        Int32Rules    int32    = 3;\n        Int64Rules    int64    = 4;\n        UInt32Rules   uint32   = 5;\n        UInt64Rules   uint64   = 6;\n        SInt32Rules   sint32   = 7;\n        SInt64Rules   sint64   = 8;\n        Fixed32Rules  fixed32  = 9;\n        Fixed64Rules  fixed64  = 10;\n        SFixed32Rules sfixed32 = 11;\n        SFixed64Rules sfixed64 = 12;\n        BoolRules     bool     = 13;\n        StringRules   string   = 14;\n        BytesRules    bytes    = 15;\n\n        // Complex Field Types\n        EnumRules     enum     = 16;\n        RepeatedRules repeated = 18;\n        MapRules      map      = 19;\n\n        // Well-Known Field Types\n        AnyRules       any       = 20;\n        DurationRules  duration  = 21;\n        TimestampRules timestamp = 22;\n    }\n}\n\n// FloatRules describes the constraints applied to `float` values\nmessage FloatRules {\n    // Const specifies that this field must be exactly the specified value\n    optional float const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional float lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional float lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional float gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional float gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated float in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated float not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// DoubleRules describes the constraints applied to `double` values\nmessage DoubleRules {\n    // Const specifies that this field must be exactly the specified value\n    optional double const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional double lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional double lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional double gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional double gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated double in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated double not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// Int32Rules describes the constraints applied to `int32` values\nmessage Int32Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional int32 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional int32 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional int32 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional int32 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional int32 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated int32 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated int32 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// Int64Rules describes the constraints applied to `int64` values\nmessage Int64Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional int64 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional int64 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional int64 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional int64 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional int64 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated int64 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated int64 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// UInt32Rules describes the constraints applied to `uint32` values\nmessage UInt32Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional uint32 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional uint32 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional uint32 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional uint32 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional uint32 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated uint32 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated uint32 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// UInt64Rules describes the constraints applied to `uint64` values\nmessage UInt64Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional uint64 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional uint64 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional uint64 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional uint64 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional uint64 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated uint64 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated uint64 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// SInt32Rules describes the constraints applied to `sint32` values\nmessage SInt32Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional sint32 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional sint32 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional sint32 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional sint32 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional sint32 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated sint32 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated sint32 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// SInt64Rules describes the constraints applied to `sint64` values\nmessage SInt64Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional sint64 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional sint64 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional sint64 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional sint64 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional sint64 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated sint64 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated sint64 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// Fixed32Rules describes the constraints applied to `fixed32` values\nmessage Fixed32Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional fixed32 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional fixed32 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional fixed32 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional fixed32 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional fixed32 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated fixed32 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated fixed32 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// Fixed64Rules describes the constraints applied to `fixed64` values\nmessage Fixed64Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional fixed64 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional fixed64 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional fixed64 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional fixed64 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional fixed64 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated fixed64 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated fixed64 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// SFixed32Rules describes the constraints applied to `sfixed32` values\nmessage SFixed32Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional sfixed32 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional sfixed32 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional sfixed32 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional sfixed32 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional sfixed32 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated sfixed32 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated sfixed32 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// SFixed64Rules describes the constraints applied to `sfixed64` values\nmessage SFixed64Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional sfixed64 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional sfixed64 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional sfixed64 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional sfixed64 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional sfixed64 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated sfixed64 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated sfixed64 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// BoolRules describes the constraints applied to `bool` values\nmessage BoolRules {\n    // Const specifies that this field must be exactly the specified value\n    optional bool const = 1;\n}\n\n// StringRules describe the constraints applied to `string` values\nmessage StringRules {\n    // Const specifies that this field must be exactly the specified value\n    optional string const = 1;\n\n    // Len specifies that this field must be the specified number of\n    // characters (Unicode code points). Note that the number of\n    // characters may differ from the number of bytes in the string.\n    optional uint64 len = 19;\n\n    // MinLen specifies that this field must be the specified number of\n    // characters (Unicode code points) at a minimum. Note that the number of\n    // characters may differ from the number of bytes in the string.\n    optional uint64 min_len = 2;\n\n    // MaxLen specifies that this field must be the specified number of\n    // characters (Unicode code points) at a maximum. Note that the number of\n    // characters may differ from the number of bytes in the string.\n    optional uint64 max_len = 3;\n\n    // LenBytes specifies that this field must be the specified number of bytes\n    // at a minimum\n    optional uint64 len_bytes = 20;\n\n    // MinBytes specifies that this field must be the specified number of bytes\n    // at a minimum\n    optional uint64 min_bytes = 4;\n\n    // MaxBytes specifies that this field must be the specified number of bytes\n    // at a maximum\n    optional uint64 max_bytes = 5;\n\n    // Pattern specifes that this field must match against the specified\n    // regular expression (RE2 syntax). The included expression should elide\n    // any delimiters.\n    optional string pattern  = 6;\n\n    // Prefix specifies that this field must have the specified substring at\n    // the beginning of the string.\n    optional string prefix   = 7;\n\n    // Suffix specifies that this field must have the specified substring at\n    // the end of the string.\n    optional string suffix   = 8;\n\n    // Contains specifies that this field must have the specified substring\n    // anywhere in the string.\n    optional string contains = 9;\n\n    // NotContains specifies that this field cannot have the specified substring\n    // anywhere in the string.\n    optional string not_contains = 23;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated string in     = 10;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated string not_in = 11;\n\n    // WellKnown rules provide advanced constraints against common string\n    // patterns\n    oneof well_known {\n        // Email specifies that the field must be a valid email address as\n        // defined by RFC 5322\n        bool email    = 12;\n\n        // Hostname specifies that the field must be a valid hostname as\n        // defined by RFC 1034. This constraint does not support\n        // internationalized domain names (IDNs).\n        bool hostname = 13;\n\n        // Ip specifies that the field must be a valid IP (v4 or v6) address.\n        // Valid IPv6 addresses should not include surrounding square brackets.\n        bool ip       = 14;\n\n        // Ipv4 specifies that the field must be a valid IPv4 address.\n        bool ipv4     = 15;\n\n        // Ipv6 specifies that the field must be a valid IPv6 address. Valid\n        // IPv6 addresses should not include surrounding square brackets.\n        bool ipv6     = 16;\n\n        // Uri specifies that the field must be a valid, absolute URI as defined\n        // by RFC 3986\n        bool uri      = 17;\n\n        // UriRef specifies that the field must be a valid URI as defined by RFC\n        // 3986 and may be relative or absolute.\n        bool uri_ref  = 18;\n\n        // Address specifies that the field must be either a valid hostname as\n        // defined by RFC 1034 (which does not support internationalized domain\n        // names or IDNs), or it can be a valid IP (v4 or v6).\n        bool address  = 21;\n\n        // Uuid specifies that the field must be a valid UUID as defined by\n        // RFC 4122\n        bool uuid     = 22;\n\n        // WellKnownRegex specifies a common well known pattern defined as a regex.\n        KnownRegex well_known_regex = 24;\n    }\n\n  // This applies to regexes HTTP_HEADER_NAME and HTTP_HEADER_VALUE to enable\n  // strict header validation.\n  // By default, this is true, and HTTP header validations are RFC-compliant.\n  // Setting to false will enable a looser validations that only disallows\n  // \\r\\n\\0 characters, which can be used to bypass header matching rules.\n  optional bool strict = 25 [default = true];\n\n  // IgnoreEmpty specifies that the validation rules of this field should be\n  // evaluated only if the field is not empty\n  optional bool ignore_empty = 26;\n}\n\n// WellKnownRegex contain some well-known patterns.\nenum KnownRegex {\n  UNKNOWN = 0;\n\n  // HTTP header name as defined by RFC 7230.\n  HTTP_HEADER_NAME = 1;\n\n  // HTTP header value as defined by RFC 7230.\n  HTTP_HEADER_VALUE = 2;\n}\n\n// BytesRules describe the constraints applied to `bytes` values\nmessage BytesRules {\n    // Const specifies that this field must be exactly the specified value\n    optional bytes const = 1;\n\n    // Len specifies that this field must be the specified number of bytes\n    optional uint64 len = 13;\n\n    // MinLen specifies that this field must be the specified number of bytes\n    // at a minimum\n    optional uint64 min_len = 2;\n\n    // MaxLen specifies that this field must be the specified number of bytes\n    // at a maximum\n    optional uint64 max_len = 3;\n\n    // Pattern specifes that this field must match against the specified\n    // regular expression (RE2 syntax). The included expression should elide\n    // any delimiters.\n    optional string pattern  = 4;\n\n    // Prefix specifies that this field must have the specified bytes at the\n    // beginning of the string.\n    optional bytes  prefix   = 5;\n\n    // Suffix specifies that this field must have the specified bytes at the\n    // end of the string.\n    optional bytes  suffix   = 6;\n\n    // Contains specifies that this field must have the specified bytes\n    // anywhere in the string.\n    optional bytes  contains = 7;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated bytes in     = 8;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated bytes not_in = 9;\n\n    // WellKnown rules provide advanced constraints against common byte\n    // patterns\n    oneof well_known {\n        // Ip specifies that the field must be a valid IP (v4 or v6) address in\n        // byte format\n        bool ip   = 10;\n\n        // Ipv4 specifies that the field must be a valid IPv4 address in byte\n        // format\n        bool ipv4 = 11;\n\n        // Ipv6 specifies that the field must be a valid IPv6 address in byte\n        // format\n        bool ipv6 = 12;\n    }\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 14;\n}\n\n// EnumRules describe the constraints applied to enum values\nmessage EnumRules {\n    // Const specifies that this field must be exactly the specified value\n    optional int32 const        = 1;\n\n    // DefinedOnly specifies that this field must be only one of the defined\n    // values for this enum, failing on any undefined value.\n    optional bool  defined_only = 2;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated int32 in           = 3;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated int32 not_in       = 4;\n}\n\n// MessageRules describe the constraints applied to embedded message values.\n// For message-type fields, validation is performed recursively.\nmessage MessageRules {\n    // Skip specifies that the validation rules of this field should not be\n    // evaluated\n    optional bool skip     = 1;\n\n    // Required specifies that this field must be set\n    optional bool required = 2;\n}\n\n// RepeatedRules describe the constraints applied to `repeated` values\nmessage RepeatedRules {\n    // MinItems specifies that this field must have the specified number of\n    // items at a minimum\n    optional uint64 min_items = 1;\n\n    // MaxItems specifies that this field must have the specified number of\n    // items at a maximum\n    optional uint64 max_items = 2;\n\n    // Unique specifies that all elements in this field must be unique. This\n    // contraint is only applicable to scalar and enum types (messages are not\n    // supported).\n    optional bool   unique    = 3;\n\n    // Items specifies the contraints to be applied to each item in the field.\n    // Repeated message fields will still execute validation against each item\n    // unless skip is specified here.\n    optional FieldRules items = 4;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 5;\n}\n\n// MapRules describe the constraints applied to `map` values\nmessage MapRules {\n    // MinPairs specifies that this field must have the specified number of\n    // KVs at a minimum\n    optional uint64 min_pairs = 1;\n\n    // MaxPairs specifies that this field must have the specified number of\n    // KVs at a maximum\n    optional uint64 max_pairs = 2;\n\n    // NoSparse specifies values in this field cannot be unset. This only\n    // applies to map's with message value types.\n    optional bool no_sparse = 3;\n\n    // Keys specifies the constraints to be applied to each key in the field.\n    optional FieldRules keys   = 4;\n\n    // Values specifies the constraints to be applied to the value of each key\n    // in the field. Message values will still have their validations evaluated\n    // unless skip is specified here.\n    optional FieldRules values = 5;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 6;\n}\n\n// AnyRules describe constraints applied exclusively to the\n// `google.protobuf.Any` well-known type\nmessage AnyRules {\n    // Required specifies that this field must be set\n    optional bool required = 1;\n\n    // In specifies that this field's `type_url` must be equal to one of the\n    // specified values.\n    repeated string in     = 2;\n\n    // NotIn specifies that this field's `type_url` must not be equal to any of\n    // the specified values.\n    repeated string not_in = 3;\n}\n\n// DurationRules describe the constraints applied exclusively to the\n// `google.protobuf.Duration` well-known type\nmessage DurationRules {\n    // Required specifies that this field must be set\n    optional bool required = 1;\n\n    // Const specifies that this field must be exactly the specified value\n    optional google.protobuf.Duration const = 2;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional google.protobuf.Duration lt = 3;\n\n    // Lt specifies that this field must be less than the specified value,\n    // inclusive\n    optional google.protobuf.Duration lte = 4;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive\n    optional google.protobuf.Duration gt = 5;\n\n    // Gte specifies that this field must be greater than the specified value,\n    // inclusive\n    optional google.protobuf.Duration gte = 6;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated google.protobuf.Duration in = 7;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated google.protobuf.Duration not_in = 8;\n}\n\n// TimestampRules describe the constraints applied exclusively to the\n// `google.protobuf.Timestamp` well-known type\nmessage TimestampRules {\n    // Required specifies that this field must be set\n    optional bool required = 1;\n\n    // Const specifies that this field must be exactly the specified value\n    optional google.protobuf.Timestamp const = 2;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional google.protobuf.Timestamp lt = 3;\n\n    // Lte specifies that this field must be less than the specified value,\n    // inclusive\n    optional google.protobuf.Timestamp lte = 4;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive\n    optional google.protobuf.Timestamp gt = 5;\n\n    // Gte specifies that this field must be greater than the specified value,\n    // inclusive\n    optional google.protobuf.Timestamp gte = 6;\n\n    // LtNow specifies that this must be less than the current time. LtNow\n    // can only be used with the Within rule.\n    optional bool lt_now  = 7;\n\n    // GtNow specifies that this must be greater than the current time. GtNow\n    // can only be used with the Within rule.\n    optional bool gt_now  = 8;\n\n    // Within specifies that this field must be within this duration of the\n    // current time. This constraint can be used alone or with the LtNow and\n    // GtNow rules.\n    optional google.protobuf.Duration within = 9;\n}\n"
  },
  {
    "path": "service/order/.gitignore",
    "content": "# Reference https://github.com/github/gitignore/blob/master/Go.gitignore\n# Binaries for programs and plugins\n*.exe\n*.exe~\n*.dll\n*.so\n*.dylib\n\n# Test binary, built with `go test -c`\n*.test\n\n# Output of the go coverage tool, specifically when used with LiteIDE\n*.out\n\n# Dependency directories (remove the comment below to include it)\nvendor/\n\n# Compiled Object files, Static and Dynamic libs (Shared Objects)\n*.o\n*.a\n*.so\n\n# OS General\nThumbs.db\n.DS_Store\n\n# project\n*.cert\n*.key\n*.log\nbin/\n\n# Develop tools\n.vscode/\n.idea/\n*.swp\n"
  },
  {
    "path": "service/order/Dockerfile",
    "content": "FROM golang:1.16 AS builder\n\nCOPY . /src\nWORKDIR /src\n\nRUN GOPROXY=https://goproxy.cn make build\n\nFROM debian:stable-slim\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n\t\tca-certificates  \\\n        netbase \\\n        && rm -rf /var/lib/apt/lists/ \\\n        && apt-get autoremove -y && apt-get autoclean -y\n\nCOPY --from=builder /src/bin /app\n\nWORKDIR /app\n\nEXPOSE 8000\nEXPOSE 9000\nVOLUME /data/conf\n\nCMD [\"./server\", \"-conf\", \"/data/conf\"]\n"
  },
  {
    "path": "service/order/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2020 go-kratos\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "service/order/Makefile",
    "content": "GOPATH:=$(shell go env GOPATH)\nVERSION=$(shell git describe --tags --always)\nINTERNAL_PROTO_FILES=$(shell find internal -name *.proto)\nAPI_PROTO_FILES=$(shell find api -name *.proto)\n\n.PHONY: init\n# init env\ninit:\n\tgo install google.golang.org/protobuf/cmd/protoc-gen-go@latest\n\tgo install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest\n\tgo install github.com/go-kratos/kratos/cmd/kratos/v2@latest\n\tgo install github.com/go-kratos/kratos/cmd/protoc-gen-go-http/v2@latest\n\tgo install github.com/google/gnostic/cmd/protoc-gen-openapi@latest\n\n.PHONY: config\n# generate internal proto\nconfig:\n\tprotoc --proto_path=./internal \\\n\t       --proto_path=./third_party \\\n \t       --go_out=paths=source_relative:./internal \\\n\t       $(INTERNAL_PROTO_FILES)\n\n.PHONY: api\n# generate api proto\napi:\n\tprotoc --proto_path=./api \\\n\t       --proto_path=./third_party \\\n \t       --go_out=paths=source_relative:./api \\\n \t       --go-http_out=paths=source_relative:./api \\\n \t       --go-grpc_out=paths=source_relative:./api \\\n \t       --openapi_out==paths=source_relative:. \\\n \t       --validate_out=paths=source_relative,lang=go:./api \\\n\t       $(API_PROTO_FILES)\n\n.PHONY: build\n# build\nbuild:\n\tmkdir -p bin/ && go build -ldflags \"-X main.Version=$(VERSION)\" -o ./bin/ ./...\n\n.PHONY: generate\n# generate\ngenerate:\n\tgo mod tidy\n\tgo get github.com/google/wire/cmd/wire@latest\n\tgo generate ./...\n\n.PHONY: wire\n# generate wire\nwire:\n\tcd cmd/order && wire\n\n.PHONY: all\n# generate all\nall:\n\tmake api;\n\tmake config;\n\tmake generate;\n\tmake wire;\n\n# show help\nhelp:\n\t@echo ''\n\t@echo 'Usage:'\n\t@echo ' make [target]'\n\t@echo ''\n\t@echo 'Targets:'\n\t@awk '/^[a-zA-Z\\-\\_0-9]+:/ { \\\n\thelpMessage = match(lastLine, /^# (.*)/); \\\n\t\tif (helpMessage) { \\\n\t\t\thelpCommand = substr($$1, 0, index($$1, \":\")-1); \\\n\t\t\thelpMessage = substr(lastLine, RSTART + 2, RLENGTH); \\\n\t\t\tprintf \"\\033[36m%-22s\\033[0m %s\\n\", helpCommand,helpMessage; \\\n\t\t} \\\n\t} \\\n\t{ lastLine = $$0 }' $(MAKEFILE_LIST)\n\n.DEFAULT_GOAL := help\n"
  },
  {
    "path": "service/order/api/cart/v1/cart.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.0\n// \tprotoc        v3.19.4\n// source: cart/v1/cart.proto\n\npackage v1\n\nimport (\n\t_ \"github.com/envoyproxy/protoc-gen-validate/validate\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CartInfoReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId         int64  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tUserId     int64  `protobuf:\"varint,2,opt,name=userId,proto3\" json:\"userId,omitempty\"`\n\tGoodsId    int64  `protobuf:\"varint,3,opt,name=goodsId,proto3\" json:\"goodsId,omitempty\"`\n\tGoodsSn    string `protobuf:\"bytes,4,opt,name=goodsSn,proto3\" json:\"goodsSn,omitempty\"`\n\tGoodsName  string `protobuf:\"bytes,5,opt,name=goodsName,proto3\" json:\"goodsName,omitempty\"`\n\tSkuId      int64  `protobuf:\"varint,6,opt,name=skuId,proto3\" json:\"skuId,omitempty\"`\n\tGoodsPrice int64  `protobuf:\"varint,7,opt,name=goodsPrice,proto3\" json:\"goodsPrice,omitempty\"`\n\tGoodsNum   int32  `protobuf:\"varint,8,opt,name=goodsNum,proto3\" json:\"goodsNum,omitempty\"`\n\tIsSelect   bool   `protobuf:\"varint,9,opt,name=isSelect,proto3\" json:\"isSelect,omitempty\"`\n}\n\nfunc (x *CartInfoReply) Reset() {\n\t*x = CartInfoReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_v1_cart_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CartInfoReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CartInfoReply) ProtoMessage() {}\n\nfunc (x *CartInfoReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_v1_cart_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CartInfoReply.ProtoReflect.Descriptor instead.\nfunc (*CartInfoReply) Descriptor() ([]byte, []int) {\n\treturn file_cart_v1_cart_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CartInfoReply) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *CartInfoReply) GetUserId() int64 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *CartInfoReply) GetGoodsId() int64 {\n\tif x != nil {\n\t\treturn x.GoodsId\n\t}\n\treturn 0\n}\n\nfunc (x *CartInfoReply) GetGoodsSn() string {\n\tif x != nil {\n\t\treturn x.GoodsSn\n\t}\n\treturn \"\"\n}\n\nfunc (x *CartInfoReply) GetGoodsName() string {\n\tif x != nil {\n\t\treturn x.GoodsName\n\t}\n\treturn \"\"\n}\n\nfunc (x *CartInfoReply) GetSkuId() int64 {\n\tif x != nil {\n\t\treturn x.SkuId\n\t}\n\treturn 0\n}\n\nfunc (x *CartInfoReply) GetGoodsPrice() int64 {\n\tif x != nil {\n\t\treturn x.GoodsPrice\n\t}\n\treturn 0\n}\n\nfunc (x *CartInfoReply) GetGoodsNum() int32 {\n\tif x != nil {\n\t\treturn x.GoodsNum\n\t}\n\treturn 0\n}\n\nfunc (x *CartInfoReply) GetIsSelect() bool {\n\tif x != nil {\n\t\treturn x.IsSelect\n\t}\n\treturn false\n}\n\ntype CreateCartRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId         int64  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tUserId     int64  `protobuf:\"varint,2,opt,name=userId,proto3\" json:\"userId,omitempty\"`\n\tGoodsId    int64  `protobuf:\"varint,3,opt,name=goodsId,proto3\" json:\"goodsId,omitempty\"`\n\tGoodsSn    string `protobuf:\"bytes,4,opt,name=goodsSn,proto3\" json:\"goodsSn,omitempty\"`\n\tGoodsName  string `protobuf:\"bytes,5,opt,name=goodsName,proto3\" json:\"goodsName,omitempty\"`\n\tSkuId      int64  `protobuf:\"varint,6,opt,name=skuId,proto3\" json:\"skuId,omitempty\"`\n\tGoodsPrice int64  `protobuf:\"varint,7,opt,name=goodsPrice,proto3\" json:\"goodsPrice,omitempty\"`\n\tGoodsNum   int32  `protobuf:\"varint,8,opt,name=goodsNum,proto3\" json:\"goodsNum,omitempty\"`\n\tIsSelect   bool   `protobuf:\"varint,9,opt,name=isSelect,proto3\" json:\"isSelect,omitempty\"`\n}\n\nfunc (x *CreateCartRequest) Reset() {\n\t*x = CreateCartRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_v1_cart_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CreateCartRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreateCartRequest) ProtoMessage() {}\n\nfunc (x *CreateCartRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_v1_cart_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreateCartRequest.ProtoReflect.Descriptor instead.\nfunc (*CreateCartRequest) Descriptor() ([]byte, []int) {\n\treturn file_cart_v1_cart_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *CreateCartRequest) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *CreateCartRequest) GetUserId() int64 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *CreateCartRequest) GetGoodsId() int64 {\n\tif x != nil {\n\t\treturn x.GoodsId\n\t}\n\treturn 0\n}\n\nfunc (x *CreateCartRequest) GetGoodsSn() string {\n\tif x != nil {\n\t\treturn x.GoodsSn\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateCartRequest) GetGoodsName() string {\n\tif x != nil {\n\t\treturn x.GoodsName\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateCartRequest) GetSkuId() int64 {\n\tif x != nil {\n\t\treturn x.SkuId\n\t}\n\treturn 0\n}\n\nfunc (x *CreateCartRequest) GetGoodsPrice() int64 {\n\tif x != nil {\n\t\treturn x.GoodsPrice\n\t}\n\treturn 0\n}\n\nfunc (x *CreateCartRequest) GetGoodsNum() int32 {\n\tif x != nil {\n\t\treturn x.GoodsNum\n\t}\n\treturn 0\n}\n\nfunc (x *CreateCartRequest) GetIsSelect() bool {\n\tif x != nil {\n\t\treturn x.IsSelect\n\t}\n\treturn false\n}\n\ntype UpdateCartRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId       int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tGoodsNum int32 `protobuf:\"varint,2,opt,name=goodsNum,proto3\" json:\"goodsNum,omitempty\"`\n}\n\nfunc (x *UpdateCartRequest) Reset() {\n\t*x = UpdateCartRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_v1_cart_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *UpdateCartRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UpdateCartRequest) ProtoMessage() {}\n\nfunc (x *UpdateCartRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_v1_cart_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UpdateCartRequest.ProtoReflect.Descriptor instead.\nfunc (*UpdateCartRequest) Descriptor() ([]byte, []int) {\n\treturn file_cart_v1_cart_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *UpdateCartRequest) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *UpdateCartRequest) GetGoodsNum() int32 {\n\tif x != nil {\n\t\treturn x.GoodsNum\n\t}\n\treturn 0\n}\n\ntype UpdateCartReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *UpdateCartReply) Reset() {\n\t*x = UpdateCartReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_v1_cart_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *UpdateCartReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UpdateCartReply) ProtoMessage() {}\n\nfunc (x *UpdateCartReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_v1_cart_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UpdateCartReply.ProtoReflect.Descriptor instead.\nfunc (*UpdateCartReply) Descriptor() ([]byte, []int) {\n\treturn file_cart_v1_cart_proto_rawDescGZIP(), []int{3}\n}\n\ntype CheckResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tSuccess bool `protobuf:\"varint,1,opt,name=success,proto3\" json:\"success,omitempty\"`\n}\n\nfunc (x *CheckResponse) Reset() {\n\t*x = CheckResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_v1_cart_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CheckResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CheckResponse) ProtoMessage() {}\n\nfunc (x *CheckResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_v1_cart_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CheckResponse.ProtoReflect.Descriptor instead.\nfunc (*CheckResponse) Descriptor() ([]byte, []int) {\n\treturn file_cart_v1_cart_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *CheckResponse) GetSuccess() bool {\n\tif x != nil {\n\t\treturn x.Success\n\t}\n\treturn false\n}\n\ntype DeleteCartRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *DeleteCartRequest) Reset() {\n\t*x = DeleteCartRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_v1_cart_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *DeleteCartRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*DeleteCartRequest) ProtoMessage() {}\n\nfunc (x *DeleteCartRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_v1_cart_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use DeleteCartRequest.ProtoReflect.Descriptor instead.\nfunc (*DeleteCartRequest) Descriptor() ([]byte, []int) {\n\treturn file_cart_v1_cart_proto_rawDescGZIP(), []int{5}\n}\n\ntype DeleteCartReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *DeleteCartReply) Reset() {\n\t*x = DeleteCartReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_v1_cart_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *DeleteCartReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*DeleteCartReply) ProtoMessage() {}\n\nfunc (x *DeleteCartReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_v1_cart_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use DeleteCartReply.ProtoReflect.Descriptor instead.\nfunc (*DeleteCartReply) Descriptor() ([]byte, []int) {\n\treturn file_cart_v1_cart_proto_rawDescGZIP(), []int{6}\n}\n\ntype GetCartRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *GetCartRequest) Reset() {\n\t*x = GetCartRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_v1_cart_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetCartRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetCartRequest) ProtoMessage() {}\n\nfunc (x *GetCartRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_v1_cart_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetCartRequest.ProtoReflect.Descriptor instead.\nfunc (*GetCartRequest) Descriptor() ([]byte, []int) {\n\treturn file_cart_v1_cart_proto_rawDescGZIP(), []int{7}\n}\n\ntype GetCartReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *GetCartReply) Reset() {\n\t*x = GetCartReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_v1_cart_proto_msgTypes[8]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetCartReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetCartReply) ProtoMessage() {}\n\nfunc (x *GetCartReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_v1_cart_proto_msgTypes[8]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetCartReply.ProtoReflect.Descriptor instead.\nfunc (*GetCartReply) Descriptor() ([]byte, []int) {\n\treturn file_cart_v1_cart_proto_rawDescGZIP(), []int{8}\n}\n\ntype ListCartRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId int64 `protobuf:\"varint,1,opt,name=userId,proto3\" json:\"userId,omitempty\"`\n}\n\nfunc (x *ListCartRequest) Reset() {\n\t*x = ListCartRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_v1_cart_proto_msgTypes[9]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListCartRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListCartRequest) ProtoMessage() {}\n\nfunc (x *ListCartRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_v1_cart_proto_msgTypes[9]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListCartRequest.ProtoReflect.Descriptor instead.\nfunc (*ListCartRequest) Descriptor() ([]byte, []int) {\n\treturn file_cart_v1_cart_proto_rawDescGZIP(), []int{9}\n}\n\nfunc (x *ListCartRequest) GetUserId() int64 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype CartListReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tResults []*CartInfoReply `protobuf:\"bytes,2,rep,name=results,proto3\" json:\"results,omitempty\"`\n}\n\nfunc (x *CartListReply) Reset() {\n\t*x = CartListReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_v1_cart_proto_msgTypes[10]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CartListReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CartListReply) ProtoMessage() {}\n\nfunc (x *CartListReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_v1_cart_proto_msgTypes[10]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CartListReply.ProtoReflect.Descriptor instead.\nfunc (*CartListReply) Descriptor() ([]byte, []int) {\n\treturn file_cart_v1_cart_proto_rawDescGZIP(), []int{10}\n}\n\nfunc (x *CartListReply) GetResults() []*CartInfoReply {\n\tif x != nil {\n\t\treturn x.Results\n\t}\n\treturn nil\n}\n\nvar File_cart_v1_cart_proto protoreflect.FileDescriptor\n\nvar file_cart_v1_cart_proto_rawDesc = []byte{\n\t0x0a, 0x12, 0x63, 0x61, 0x72, 0x74, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x12, 0x07, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x76, 0x31, 0x1a, 0x17, 0x76,\n\t0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xf7, 0x01, 0x0a, 0x0d, 0x43, 0x61, 0x72, 0x74, 0x49,\n\t0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72,\n\t0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64,\n\t0x12, 0x18, 0x0a, 0x07, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x03, 0x52, 0x07, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x67, 0x6f,\n\t0x6f, 0x64, 0x73, 0x53, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x6f, 0x6f,\n\t0x64, 0x73, 0x53, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x4e, 0x61, 0x6d,\n\t0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x4e, 0x61,\n\t0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x6b, 0x75, 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28,\n\t0x03, 0x52, 0x05, 0x73, 0x6b, 0x75, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x67, 0x6f, 0x6f, 0x64,\n\t0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x67, 0x6f,\n\t0x6f, 0x64, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x67, 0x6f, 0x6f, 0x64,\n\t0x73, 0x4e, 0x75, 0x6d, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x67, 0x6f, 0x6f, 0x64,\n\t0x73, 0x4e, 0x75, 0x6d, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74,\n\t0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74,\n\t0x22, 0xc3, 0x02, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x61, 0x72, 0x74, 0x52,\n\t0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x20, 0x00, 0x52,\n\t0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x07, 0x67, 0x6f, 0x6f, 0x64, 0x73,\n\t0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x20,\n\t0x00, 0x52, 0x07, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x07, 0x67, 0x6f,\n\t0x6f, 0x64, 0x73, 0x53, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04,\n\t0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x53, 0x6e, 0x12, 0x25, 0x0a,\n\t0x09, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09,\n\t0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x67, 0x6f, 0x6f, 0x64, 0x73,\n\t0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x05, 0x73, 0x6b, 0x75, 0x49, 0x64, 0x18, 0x06, 0x20,\n\t0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x20, 0x00, 0x52, 0x05, 0x73, 0x6b,\n\t0x75, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0a, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x50, 0x72, 0x69, 0x63,\n\t0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x20, 0x00,\n\t0x52, 0x0a, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x08,\n\t0x67, 0x6f, 0x6f, 0x64, 0x73, 0x4e, 0x75, 0x6d, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07,\n\t0xfa, 0x42, 0x04, 0x1a, 0x02, 0x20, 0x00, 0x52, 0x08, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x4e, 0x75,\n\t0x6d, 0x12, 0x23, 0x0a, 0x08, 0x69, 0x73, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x18, 0x09, 0x20,\n\t0x01, 0x28, 0x08, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x6a, 0x02, 0x08, 0x01, 0x52, 0x08, 0x69, 0x73,\n\t0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x22, 0x3f, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,\n\t0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69,\n\t0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x67,\n\t0x6f, 0x6f, 0x64, 0x73, 0x4e, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x67,\n\t0x6f, 0x6f, 0x64, 0x73, 0x4e, 0x75, 0x6d, 0x22, 0x11, 0x0a, 0x0f, 0x55, 0x70, 0x64, 0x61, 0x74,\n\t0x65, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x29, 0x0a, 0x0d, 0x43, 0x68,\n\t0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73,\n\t0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75,\n\t0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x13, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43,\n\t0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x11, 0x0a, 0x0f, 0x44, 0x65,\n\t0x6c, 0x65, 0x74, 0x65, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x10, 0x0a,\n\t0x0e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22,\n\t0x0e, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22,\n\t0x29, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,\n\t0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x03, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x41, 0x0a, 0x0d, 0x43, 0x61,\n\t0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x30, 0x0a, 0x07, 0x72,\n\t0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63,\n\t0x61, 0x72, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52,\n\t0x65, 0x70, 0x6c, 0x79, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x32, 0x8a, 0x02,\n\t0x0a, 0x04, 0x43, 0x61, 0x72, 0x74, 0x12, 0x40, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,\n\t0x43, 0x61, 0x72, 0x74, 0x12, 0x1a, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43,\n\t0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x1a, 0x16, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x72, 0x74, 0x49,\n\t0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x40, 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61,\n\t0x74, 0x65, 0x43, 0x61, 0x72, 0x74, 0x12, 0x1a, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x76, 0x31,\n\t0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,\n\t0x73, 0x74, 0x1a, 0x16, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65,\n\t0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x0a, 0x44, 0x65,\n\t0x6c, 0x65, 0x74, 0x65, 0x43, 0x61, 0x72, 0x74, 0x12, 0x1a, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e,\n\t0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43,\n\t0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x08,\n\t0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x72, 0x74, 0x12, 0x18, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e,\n\t0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,\n\t0x73, 0x74, 0x1a, 0x16, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x72,\n\t0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x42, 0x15, 0x5a, 0x13, 0x63, 0x61,\n\t0x72, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x61, 0x72, 0x74, 0x2f, 0x76, 0x31, 0x3b, 0x76,\n\t0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_cart_v1_cart_proto_rawDescOnce sync.Once\n\tfile_cart_v1_cart_proto_rawDescData = file_cart_v1_cart_proto_rawDesc\n)\n\nfunc file_cart_v1_cart_proto_rawDescGZIP() []byte {\n\tfile_cart_v1_cart_proto_rawDescOnce.Do(func() {\n\t\tfile_cart_v1_cart_proto_rawDescData = protoimpl.X.CompressGZIP(file_cart_v1_cart_proto_rawDescData)\n\t})\n\treturn file_cart_v1_cart_proto_rawDescData\n}\n\nvar file_cart_v1_cart_proto_msgTypes = make([]protoimpl.MessageInfo, 11)\nvar file_cart_v1_cart_proto_goTypes = []interface{}{\n\t(*CartInfoReply)(nil),     // 0: cart.v1.CartInfoReply\n\t(*CreateCartRequest)(nil), // 1: cart.v1.CreateCartRequest\n\t(*UpdateCartRequest)(nil), // 2: cart.v1.UpdateCartRequest\n\t(*UpdateCartReply)(nil),   // 3: cart.v1.UpdateCartReply\n\t(*CheckResponse)(nil),     // 4: cart.v1.CheckResponse\n\t(*DeleteCartRequest)(nil), // 5: cart.v1.DeleteCartRequest\n\t(*DeleteCartReply)(nil),   // 6: cart.v1.DeleteCartReply\n\t(*GetCartRequest)(nil),    // 7: cart.v1.GetCartRequest\n\t(*GetCartReply)(nil),      // 8: cart.v1.GetCartReply\n\t(*ListCartRequest)(nil),   // 9: cart.v1.ListCartRequest\n\t(*CartListReply)(nil),     // 10: cart.v1.CartListReply\n}\nvar file_cart_v1_cart_proto_depIdxs = []int32{\n\t0,  // 0: cart.v1.CartListReply.results:type_name -> cart.v1.CartInfoReply\n\t1,  // 1: cart.v1.Cart.CreateCart:input_type -> cart.v1.CreateCartRequest\n\t2,  // 2: cart.v1.Cart.UpdateCart:input_type -> cart.v1.UpdateCartRequest\n\t5,  // 3: cart.v1.Cart.DeleteCart:input_type -> cart.v1.DeleteCartRequest\n\t9,  // 4: cart.v1.Cart.ListCart:input_type -> cart.v1.ListCartRequest\n\t0,  // 5: cart.v1.Cart.CreateCart:output_type -> cart.v1.CartInfoReply\n\t4,  // 6: cart.v1.Cart.UpdateCart:output_type -> cart.v1.CheckResponse\n\t4,  // 7: cart.v1.Cart.DeleteCart:output_type -> cart.v1.CheckResponse\n\t10, // 8: cart.v1.Cart.ListCart:output_type -> cart.v1.CartListReply\n\t5,  // [5:9] is the sub-list for method output_type\n\t1,  // [1:5] is the sub-list for method input_type\n\t1,  // [1:1] is the sub-list for extension type_name\n\t1,  // [1:1] is the sub-list for extension extendee\n\t0,  // [0:1] is the sub-list for field type_name\n}\n\nfunc init() { file_cart_v1_cart_proto_init() }\nfunc file_cart_v1_cart_proto_init() {\n\tif File_cart_v1_cart_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_cart_v1_cart_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CartInfoReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_v1_cart_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CreateCartRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_v1_cart_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*UpdateCartRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_v1_cart_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*UpdateCartReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_v1_cart_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CheckResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_v1_cart_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*DeleteCartRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_v1_cart_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*DeleteCartReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_v1_cart_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetCartRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_v1_cart_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetCartReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_v1_cart_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListCartRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_v1_cart_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CartListReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_cart_v1_cart_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   11,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_cart_v1_cart_proto_goTypes,\n\t\tDependencyIndexes: file_cart_v1_cart_proto_depIdxs,\n\t\tMessageInfos:      file_cart_v1_cart_proto_msgTypes,\n\t}.Build()\n\tFile_cart_v1_cart_proto = out.File\n\tfile_cart_v1_cart_proto_rawDesc = nil\n\tfile_cart_v1_cart_proto_goTypes = nil\n\tfile_cart_v1_cart_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "service/order/api/cart/v1/cart.pb.validate.go",
    "content": "// Code generated by protoc-gen-validate. DO NOT EDIT.\n// source: cart/v1/cart.proto\n\npackage v1\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"net/mail\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"sort\"\n\t\"strings\"\n\t\"time\"\n\t\"unicode/utf8\"\n\n\t\"google.golang.org/protobuf/types/known/anypb\"\n)\n\n// ensure the imports are used\nvar (\n\t_ = bytes.MinRead\n\t_ = errors.New(\"\")\n\t_ = fmt.Print\n\t_ = utf8.UTFMax\n\t_ = (*regexp.Regexp)(nil)\n\t_ = (*strings.Reader)(nil)\n\t_ = net.IPv4len\n\t_ = time.Duration(0)\n\t_ = (*url.URL)(nil)\n\t_ = (*mail.Address)(nil)\n\t_ = anypb.Any{}\n\t_ = sort.Sort\n)\n\n// Validate checks the field values on CartInfoReply with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *CartInfoReply) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CartInfoReply with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in CartInfoReplyMultiError, or\n// nil if none found.\nfunc (m *CartInfoReply) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CartInfoReply) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for UserId\n\n\t// no validation rules for GoodsId\n\n\t// no validation rules for GoodsSn\n\n\t// no validation rules for GoodsName\n\n\t// no validation rules for SkuId\n\n\t// no validation rules for GoodsPrice\n\n\t// no validation rules for GoodsNum\n\n\t// no validation rules for IsSelect\n\n\tif len(errors) > 0 {\n\t\treturn CartInfoReplyMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CartInfoReplyMultiError is an error wrapping multiple validation errors\n// returned by CartInfoReply.ValidateAll() if the designated constraints\n// aren't met.\ntype CartInfoReplyMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CartInfoReplyMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CartInfoReplyMultiError) AllErrors() []error { return m }\n\n// CartInfoReplyValidationError is the validation error returned by\n// CartInfoReply.Validate if the designated constraints aren't met.\ntype CartInfoReplyValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CartInfoReplyValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CartInfoReplyValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CartInfoReplyValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CartInfoReplyValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CartInfoReplyValidationError) ErrorName() string { return \"CartInfoReplyValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e CartInfoReplyValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCartInfoReply.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CartInfoReplyValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CartInfoReplyValidationError{}\n\n// Validate checks the field values on CreateCartRequest with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *CreateCartRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CreateCartRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// CreateCartRequestMultiError, or nil if none found.\nfunc (m *CreateCartRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CreateCartRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\tif m.GetUserId() <= 0 {\n\t\terr := CreateCartRequestValidationError{\n\t\t\tfield:  \"UserId\",\n\t\t\treason: \"value must be greater than 0\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif m.GetGoodsId() <= 0 {\n\t\terr := CreateCartRequestValidationError{\n\t\t\tfield:  \"GoodsId\",\n\t\t\treason: \"value must be greater than 0\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetGoodsSn()) < 1 {\n\t\terr := CreateCartRequestValidationError{\n\t\t\tfield:  \"GoodsSn\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetGoodsName()) < 1 {\n\t\terr := CreateCartRequestValidationError{\n\t\t\tfield:  \"GoodsName\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif m.GetSkuId() <= 0 {\n\t\terr := CreateCartRequestValidationError{\n\t\t\tfield:  \"SkuId\",\n\t\t\treason: \"value must be greater than 0\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif m.GetGoodsPrice() <= 0 {\n\t\terr := CreateCartRequestValidationError{\n\t\t\tfield:  \"GoodsPrice\",\n\t\t\treason: \"value must be greater than 0\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif m.GetGoodsNum() <= 0 {\n\t\terr := CreateCartRequestValidationError{\n\t\t\tfield:  \"GoodsNum\",\n\t\t\treason: \"value must be greater than 0\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif m.GetIsSelect() != true {\n\t\terr := CreateCartRequestValidationError{\n\t\t\tfield:  \"IsSelect\",\n\t\t\treason: \"value must equal true\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn CreateCartRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CreateCartRequestMultiError is an error wrapping multiple validation errors\n// returned by CreateCartRequest.ValidateAll() if the designated constraints\n// aren't met.\ntype CreateCartRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CreateCartRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CreateCartRequestMultiError) AllErrors() []error { return m }\n\n// CreateCartRequestValidationError is the validation error returned by\n// CreateCartRequest.Validate if the designated constraints aren't met.\ntype CreateCartRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CreateCartRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CreateCartRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CreateCartRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CreateCartRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CreateCartRequestValidationError) ErrorName() string {\n\treturn \"CreateCartRequestValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e CreateCartRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCreateCartRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CreateCartRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CreateCartRequestValidationError{}\n\n// Validate checks the field values on UpdateCartRequest with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *UpdateCartRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on UpdateCartRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// UpdateCartRequestMultiError, or nil if none found.\nfunc (m *UpdateCartRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *UpdateCartRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for GoodsNum\n\n\tif len(errors) > 0 {\n\t\treturn UpdateCartRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// UpdateCartRequestMultiError is an error wrapping multiple validation errors\n// returned by UpdateCartRequest.ValidateAll() if the designated constraints\n// aren't met.\ntype UpdateCartRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m UpdateCartRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m UpdateCartRequestMultiError) AllErrors() []error { return m }\n\n// UpdateCartRequestValidationError is the validation error returned by\n// UpdateCartRequest.Validate if the designated constraints aren't met.\ntype UpdateCartRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e UpdateCartRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e UpdateCartRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e UpdateCartRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e UpdateCartRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e UpdateCartRequestValidationError) ErrorName() string {\n\treturn \"UpdateCartRequestValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e UpdateCartRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sUpdateCartRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = UpdateCartRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = UpdateCartRequestValidationError{}\n\n// Validate checks the field values on UpdateCartReply with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *UpdateCartReply) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on UpdateCartReply with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// UpdateCartReplyMultiError, or nil if none found.\nfunc (m *UpdateCartReply) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *UpdateCartReply) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\tif len(errors) > 0 {\n\t\treturn UpdateCartReplyMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// UpdateCartReplyMultiError is an error wrapping multiple validation errors\n// returned by UpdateCartReply.ValidateAll() if the designated constraints\n// aren't met.\ntype UpdateCartReplyMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m UpdateCartReplyMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m UpdateCartReplyMultiError) AllErrors() []error { return m }\n\n// UpdateCartReplyValidationError is the validation error returned by\n// UpdateCartReply.Validate if the designated constraints aren't met.\ntype UpdateCartReplyValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e UpdateCartReplyValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e UpdateCartReplyValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e UpdateCartReplyValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e UpdateCartReplyValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e UpdateCartReplyValidationError) ErrorName() string { return \"UpdateCartReplyValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e UpdateCartReplyValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sUpdateCartReply.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = UpdateCartReplyValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = UpdateCartReplyValidationError{}\n\n// Validate checks the field values on CheckResponse with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *CheckResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CheckResponse with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in CheckResponseMultiError, or\n// nil if none found.\nfunc (m *CheckResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CheckResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Success\n\n\tif len(errors) > 0 {\n\t\treturn CheckResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CheckResponseMultiError is an error wrapping multiple validation errors\n// returned by CheckResponse.ValidateAll() if the designated constraints\n// aren't met.\ntype CheckResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CheckResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CheckResponseMultiError) AllErrors() []error { return m }\n\n// CheckResponseValidationError is the validation error returned by\n// CheckResponse.Validate if the designated constraints aren't met.\ntype CheckResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CheckResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CheckResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CheckResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CheckResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CheckResponseValidationError) ErrorName() string { return \"CheckResponseValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e CheckResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCheckResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CheckResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CheckResponseValidationError{}\n\n// Validate checks the field values on DeleteCartRequest with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *DeleteCartRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on DeleteCartRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// DeleteCartRequestMultiError, or nil if none found.\nfunc (m *DeleteCartRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *DeleteCartRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\tif len(errors) > 0 {\n\t\treturn DeleteCartRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// DeleteCartRequestMultiError is an error wrapping multiple validation errors\n// returned by DeleteCartRequest.ValidateAll() if the designated constraints\n// aren't met.\ntype DeleteCartRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m DeleteCartRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m DeleteCartRequestMultiError) AllErrors() []error { return m }\n\n// DeleteCartRequestValidationError is the validation error returned by\n// DeleteCartRequest.Validate if the designated constraints aren't met.\ntype DeleteCartRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e DeleteCartRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e DeleteCartRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e DeleteCartRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e DeleteCartRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e DeleteCartRequestValidationError) ErrorName() string {\n\treturn \"DeleteCartRequestValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e DeleteCartRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sDeleteCartRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = DeleteCartRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = DeleteCartRequestValidationError{}\n\n// Validate checks the field values on DeleteCartReply with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *DeleteCartReply) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on DeleteCartReply with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// DeleteCartReplyMultiError, or nil if none found.\nfunc (m *DeleteCartReply) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *DeleteCartReply) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\tif len(errors) > 0 {\n\t\treturn DeleteCartReplyMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// DeleteCartReplyMultiError is an error wrapping multiple validation errors\n// returned by DeleteCartReply.ValidateAll() if the designated constraints\n// aren't met.\ntype DeleteCartReplyMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m DeleteCartReplyMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m DeleteCartReplyMultiError) AllErrors() []error { return m }\n\n// DeleteCartReplyValidationError is the validation error returned by\n// DeleteCartReply.Validate if the designated constraints aren't met.\ntype DeleteCartReplyValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e DeleteCartReplyValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e DeleteCartReplyValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e DeleteCartReplyValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e DeleteCartReplyValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e DeleteCartReplyValidationError) ErrorName() string { return \"DeleteCartReplyValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e DeleteCartReplyValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sDeleteCartReply.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = DeleteCartReplyValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = DeleteCartReplyValidationError{}\n\n// Validate checks the field values on GetCartRequest with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *GetCartRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on GetCartRequest with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in GetCartRequestMultiError,\n// or nil if none found.\nfunc (m *GetCartRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *GetCartRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\tif len(errors) > 0 {\n\t\treturn GetCartRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// GetCartRequestMultiError is an error wrapping multiple validation errors\n// returned by GetCartRequest.ValidateAll() if the designated constraints\n// aren't met.\ntype GetCartRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m GetCartRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m GetCartRequestMultiError) AllErrors() []error { return m }\n\n// GetCartRequestValidationError is the validation error returned by\n// GetCartRequest.Validate if the designated constraints aren't met.\ntype GetCartRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e GetCartRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e GetCartRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e GetCartRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e GetCartRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e GetCartRequestValidationError) ErrorName() string { return \"GetCartRequestValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e GetCartRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sGetCartRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = GetCartRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = GetCartRequestValidationError{}\n\n// Validate checks the field values on GetCartReply with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *GetCartReply) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on GetCartReply with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in GetCartReplyMultiError, or\n// nil if none found.\nfunc (m *GetCartReply) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *GetCartReply) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\tif len(errors) > 0 {\n\t\treturn GetCartReplyMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// GetCartReplyMultiError is an error wrapping multiple validation errors\n// returned by GetCartReply.ValidateAll() if the designated constraints aren't met.\ntype GetCartReplyMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m GetCartReplyMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m GetCartReplyMultiError) AllErrors() []error { return m }\n\n// GetCartReplyValidationError is the validation error returned by\n// GetCartReply.Validate if the designated constraints aren't met.\ntype GetCartReplyValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e GetCartReplyValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e GetCartReplyValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e GetCartReplyValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e GetCartReplyValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e GetCartReplyValidationError) ErrorName() string { return \"GetCartReplyValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e GetCartReplyValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sGetCartReply.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = GetCartReplyValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = GetCartReplyValidationError{}\n\n// Validate checks the field values on ListCartRequest with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *ListCartRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on ListCartRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// ListCartRequestMultiError, or nil if none found.\nfunc (m *ListCartRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *ListCartRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for UserId\n\n\tif len(errors) > 0 {\n\t\treturn ListCartRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// ListCartRequestMultiError is an error wrapping multiple validation errors\n// returned by ListCartRequest.ValidateAll() if the designated constraints\n// aren't met.\ntype ListCartRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m ListCartRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m ListCartRequestMultiError) AllErrors() []error { return m }\n\n// ListCartRequestValidationError is the validation error returned by\n// ListCartRequest.Validate if the designated constraints aren't met.\ntype ListCartRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e ListCartRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e ListCartRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e ListCartRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e ListCartRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e ListCartRequestValidationError) ErrorName() string { return \"ListCartRequestValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e ListCartRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sListCartRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = ListCartRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = ListCartRequestValidationError{}\n\n// Validate checks the field values on CartListReply with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *CartListReply) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CartListReply with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in CartListReplyMultiError, or\n// nil if none found.\nfunc (m *CartListReply) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CartListReply) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\tfor idx, item := range m.GetResults() {\n\t\t_, _ = idx, item\n\n\t\tif all {\n\t\t\tswitch v := interface{}(item).(type) {\n\t\t\tcase interface{ ValidateAll() error }:\n\t\t\t\tif err := v.ValidateAll(); err != nil {\n\t\t\t\t\terrors = append(errors, CartListReplyValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"Results[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\tcase interface{ Validate() error }:\n\t\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\t\terrors = append(errors, CartListReplyValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"Results[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t} else if v, ok := interface{}(item).(interface{ Validate() error }); ok {\n\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\treturn CartListReplyValidationError{\n\t\t\t\t\tfield:  fmt.Sprintf(\"Results[%v]\", idx),\n\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\tcause:  err,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn CartListReplyMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CartListReplyMultiError is an error wrapping multiple validation errors\n// returned by CartListReply.ValidateAll() if the designated constraints\n// aren't met.\ntype CartListReplyMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CartListReplyMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CartListReplyMultiError) AllErrors() []error { return m }\n\n// CartListReplyValidationError is the validation error returned by\n// CartListReply.Validate if the designated constraints aren't met.\ntype CartListReplyValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CartListReplyValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CartListReplyValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CartListReplyValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CartListReplyValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CartListReplyValidationError) ErrorName() string { return \"CartListReplyValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e CartListReplyValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCartListReply.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CartListReplyValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CartListReplyValidationError{}\n"
  },
  {
    "path": "service/order/api/cart/v1/cart.proto",
    "content": "syntax = \"proto3\";\n\npackage cart.v1;\n\nimport \"validate/validate.proto\";\n\noption go_package = \"cart/api/cart/v1;v1\";\n\n// 购物车\nservice Cart {\n  rpc CreateCart (CreateCartRequest) returns (CartInfoReply); // 添加商品进购物车\n  rpc UpdateCart (UpdateCartRequest) returns (CheckResponse); // 修改购物车商品数量\n  rpc DeleteCart (DeleteCartRequest) returns (CheckResponse); // 删除购物车商品\n  rpc ListCart (ListCartRequest) returns (CartListReply); // 购物车商品列表\n}\n\nmessage CartInfoReply {\n  int64 id = 1;\n  int64 userId = 2;\n  int64 goodsId = 3;\n  string goodsSn = 4;\n  string goodsName = 5;\n  int64 skuId = 6;\n  int64 goodsPrice = 7;\n  int32 goodsNum = 8;\n  bool isSelect = 9;\n}\nmessage CreateCartRequest {\n  int64 id = 1;\n  int64 userId = 2 [(validate.rules).int64 = {gt:0}];\n  int64 goodsId = 3 [(validate.rules).int64 = {gt:0}];\n  string goodsSn = 4 [(validate.rules).string.min_len = 1];\n  string goodsName = 5 [(validate.rules).string.min_len = 1];\n  int64 skuId = 6 [(validate.rules).int64 = {gt:0}];\n  int64 goodsPrice = 7 [(validate.rules).int64 = {gt:0}];\n  int32 goodsNum = 8 [(validate.rules).int32 = {gt:0}];\n  bool isSelect = 9 [(validate.rules).bool.const = true];\n}\n\nmessage UpdateCartRequest {\n  int64 id = 1;\n  int32 goodsNum = 2;\n}\nmessage UpdateCartReply {}\n\nmessage CheckResponse{\n  bool success = 1;\n}\n\nmessage DeleteCartRequest {}\nmessage DeleteCartReply {}\n\nmessage GetCartRequest {}\nmessage GetCartReply {}\n\nmessage ListCartRequest {\n  int64 userId = 1;\n}\nmessage CartListReply {\n  repeated CartInfoReply results = 2;\n}"
  },
  {
    "path": "service/order/api/cart/v1/cart_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.2.0\n// - protoc             v3.19.4\n// source: cart/v1/cart.proto\n\npackage v1\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\n// CartClient is the client API for Cart service.\n//\n// 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.\ntype CartClient interface {\n\tCreateCart(ctx context.Context, in *CreateCartRequest, opts ...grpc.CallOption) (*CartInfoReply, error)\n\tUpdateCart(ctx context.Context, in *UpdateCartRequest, opts ...grpc.CallOption) (*CheckResponse, error)\n\tDeleteCart(ctx context.Context, in *DeleteCartRequest, opts ...grpc.CallOption) (*CheckResponse, error)\n\tListCart(ctx context.Context, in *ListCartRequest, opts ...grpc.CallOption) (*CartListReply, error)\n}\n\ntype cartClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewCartClient(cc grpc.ClientConnInterface) CartClient {\n\treturn &cartClient{cc}\n}\n\nfunc (c *cartClient) CreateCart(ctx context.Context, in *CreateCartRequest, opts ...grpc.CallOption) (*CartInfoReply, error) {\n\tout := new(CartInfoReply)\n\terr := c.cc.Invoke(ctx, \"/cart.v1.Cart/CreateCart\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *cartClient) UpdateCart(ctx context.Context, in *UpdateCartRequest, opts ...grpc.CallOption) (*CheckResponse, error) {\n\tout := new(CheckResponse)\n\terr := c.cc.Invoke(ctx, \"/cart.v1.Cart/UpdateCart\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *cartClient) DeleteCart(ctx context.Context, in *DeleteCartRequest, opts ...grpc.CallOption) (*CheckResponse, error) {\n\tout := new(CheckResponse)\n\terr := c.cc.Invoke(ctx, \"/cart.v1.Cart/DeleteCart\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *cartClient) ListCart(ctx context.Context, in *ListCartRequest, opts ...grpc.CallOption) (*CartListReply, error) {\n\tout := new(CartListReply)\n\terr := c.cc.Invoke(ctx, \"/cart.v1.Cart/ListCart\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// CartServer is the server API for Cart service.\n// All implementations must embed UnimplementedCartServer\n// for forward compatibility\ntype CartServer interface {\n\tCreateCart(context.Context, *CreateCartRequest) (*CartInfoReply, error)\n\tUpdateCart(context.Context, *UpdateCartRequest) (*CheckResponse, error)\n\tDeleteCart(context.Context, *DeleteCartRequest) (*CheckResponse, error)\n\tListCart(context.Context, *ListCartRequest) (*CartListReply, error)\n\tmustEmbedUnimplementedCartServer()\n}\n\n// UnimplementedCartServer must be embedded to have forward compatible implementations.\ntype UnimplementedCartServer struct {\n}\n\nfunc (UnimplementedCartServer) CreateCart(context.Context, *CreateCartRequest) (*CartInfoReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method CreateCart not implemented\")\n}\nfunc (UnimplementedCartServer) UpdateCart(context.Context, *UpdateCartRequest) (*CheckResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method UpdateCart not implemented\")\n}\nfunc (UnimplementedCartServer) DeleteCart(context.Context, *DeleteCartRequest) (*CheckResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method DeleteCart not implemented\")\n}\nfunc (UnimplementedCartServer) ListCart(context.Context, *ListCartRequest) (*CartListReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method ListCart not implemented\")\n}\nfunc (UnimplementedCartServer) mustEmbedUnimplementedCartServer() {}\n\n// UnsafeCartServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to CartServer will\n// result in compilation errors.\ntype UnsafeCartServer interface {\n\tmustEmbedUnimplementedCartServer()\n}\n\nfunc RegisterCartServer(s grpc.ServiceRegistrar, srv CartServer) {\n\ts.RegisterService(&Cart_ServiceDesc, srv)\n}\n\nfunc _Cart_CreateCart_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(CreateCartRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(CartServer).CreateCart(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/cart.v1.Cart/CreateCart\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(CartServer).CreateCart(ctx, req.(*CreateCartRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Cart_UpdateCart_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(UpdateCartRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(CartServer).UpdateCart(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/cart.v1.Cart/UpdateCart\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(CartServer).UpdateCart(ctx, req.(*UpdateCartRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Cart_DeleteCart_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(DeleteCartRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(CartServer).DeleteCart(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/cart.v1.Cart/DeleteCart\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(CartServer).DeleteCart(ctx, req.(*DeleteCartRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Cart_ListCart_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(ListCartRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(CartServer).ListCart(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/cart.v1.Cart/ListCart\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(CartServer).ListCart(ctx, req.(*ListCartRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// Cart_ServiceDesc is the grpc.ServiceDesc for Cart service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar Cart_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"cart.v1.Cart\",\n\tHandlerType: (*CartServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"CreateCart\",\n\t\t\tHandler:    _Cart_CreateCart_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"UpdateCart\",\n\t\t\tHandler:    _Cart_UpdateCart_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"DeleteCart\",\n\t\t\tHandler:    _Cart_DeleteCart_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"ListCart\",\n\t\t\tHandler:    _Cart_ListCart_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"cart/v1/cart.proto\",\n}\n"
  },
  {
    "path": "service/order/api/goods/v1/error_reason.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.0\n// \tprotoc        v3.19.4\n// source: goods/v1/error_reason.proto\n\npackage v1\n\nimport (\n\t_ \"github.com/go-kratos/kratos/v2/errors\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype ErrorReason int32\n\nconst (\n\tErrorReason_USER_NOT_FOUND  ErrorReason = 0\n\tErrorReason_CONTENT_MISSING ErrorReason = 1\n)\n\n// Enum value maps for ErrorReason.\nvar (\n\tErrorReason_name = map[int32]string{\n\t\t0: \"USER_NOT_FOUND\",\n\t\t1: \"CONTENT_MISSING\",\n\t}\n\tErrorReason_value = map[string]int32{\n\t\t\"USER_NOT_FOUND\":  0,\n\t\t\"CONTENT_MISSING\": 1,\n\t}\n)\n\nfunc (x ErrorReason) Enum() *ErrorReason {\n\tp := new(ErrorReason)\n\t*p = x\n\treturn p\n}\n\nfunc (x ErrorReason) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (ErrorReason) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_goods_v1_error_reason_proto_enumTypes[0].Descriptor()\n}\n\nfunc (ErrorReason) Type() protoreflect.EnumType {\n\treturn &file_goods_v1_error_reason_proto_enumTypes[0]\n}\n\nfunc (x ErrorReason) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use ErrorReason.Descriptor instead.\nfunc (ErrorReason) EnumDescriptor() ([]byte, []int) {\n\treturn file_goods_v1_error_reason_proto_rawDescGZIP(), []int{0}\n}\n\nvar File_goods_v1_error_reason_proto protoreflect.FileDescriptor\n\nvar file_goods_v1_error_reason_proto_rawDesc = []byte{\n\t0x0a, 0x1b, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x72, 0x72, 0x6f, 0x72,\n\t0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x67,\n\t0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x1a, 0x13, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2f,\n\t0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2a, 0x48, 0x0a, 0x0b,\n\t0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x0e, 0x55,\n\t0x53, 0x45, 0x52, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x00, 0x1a,\n\t0x04, 0xa8, 0x45, 0x94, 0x03, 0x12, 0x19, 0x0a, 0x0f, 0x43, 0x4f, 0x4e, 0x54, 0x45, 0x4e, 0x54,\n\t0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x1a, 0x04, 0xa8, 0x45, 0x90, 0x03,\n\t0x1a, 0x04, 0xa0, 0x45, 0xf4, 0x03, 0x42, 0x28, 0x5a, 0x15, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2f,\n\t0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2f, 0x76, 0x31, 0x3b, 0x76, 0x31, 0xa2,\n\t0x02, 0x0e, 0x41, 0x50, 0x49, 0x47, 0x6f, 0x6f, 0x64, 0x73, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73,\n\t0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_goods_v1_error_reason_proto_rawDescOnce sync.Once\n\tfile_goods_v1_error_reason_proto_rawDescData = file_goods_v1_error_reason_proto_rawDesc\n)\n\nfunc file_goods_v1_error_reason_proto_rawDescGZIP() []byte {\n\tfile_goods_v1_error_reason_proto_rawDescOnce.Do(func() {\n\t\tfile_goods_v1_error_reason_proto_rawDescData = protoimpl.X.CompressGZIP(file_goods_v1_error_reason_proto_rawDescData)\n\t})\n\treturn file_goods_v1_error_reason_proto_rawDescData\n}\n\nvar file_goods_v1_error_reason_proto_enumTypes = make([]protoimpl.EnumInfo, 1)\nvar file_goods_v1_error_reason_proto_goTypes = []interface{}{\n\t(ErrorReason)(0), // 0: goods.v1.ErrorReason\n}\nvar file_goods_v1_error_reason_proto_depIdxs = []int32{\n\t0, // [0:0] is the sub-list for method output_type\n\t0, // [0:0] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_goods_v1_error_reason_proto_init() }\nfunc file_goods_v1_error_reason_proto_init() {\n\tif File_goods_v1_error_reason_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_goods_v1_error_reason_proto_rawDesc,\n\t\t\tNumEnums:      1,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_goods_v1_error_reason_proto_goTypes,\n\t\tDependencyIndexes: file_goods_v1_error_reason_proto_depIdxs,\n\t\tEnumInfos:         file_goods_v1_error_reason_proto_enumTypes,\n\t}.Build()\n\tFile_goods_v1_error_reason_proto = out.File\n\tfile_goods_v1_error_reason_proto_rawDesc = nil\n\tfile_goods_v1_error_reason_proto_goTypes = nil\n\tfile_goods_v1_error_reason_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "service/order/api/goods/v1/error_reason.pb.validate.go",
    "content": "// Code generated by protoc-gen-validate. DO NOT EDIT.\n// source: goods/v1/error_reason.proto\n\npackage v1\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"net/mail\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"sort\"\n\t\"strings\"\n\t\"time\"\n\t\"unicode/utf8\"\n\n\t\"google.golang.org/protobuf/types/known/anypb\"\n)\n\n// ensure the imports are used\nvar (\n\t_ = bytes.MinRead\n\t_ = errors.New(\"\")\n\t_ = fmt.Print\n\t_ = utf8.UTFMax\n\t_ = (*regexp.Regexp)(nil)\n\t_ = (*strings.Reader)(nil)\n\t_ = net.IPv4len\n\t_ = time.Duration(0)\n\t_ = (*url.URL)(nil)\n\t_ = (*mail.Address)(nil)\n\t_ = anypb.Any{}\n\t_ = sort.Sort\n)\n"
  },
  {
    "path": "service/order/api/goods/v1/error_reason.proto",
    "content": "syntax = \"proto3\";\n\npackage goods.v1;\nimport \"errors/errors.proto\";\n\n\noption go_package = \"goods/api/goods/v1;v1\";\noption objc_class_prefix = \"APIGoodsErrors\";\n\nenum ErrorReason {\n  option (errors.default_code) = 500;\n\n  USER_NOT_FOUND = 0 [(errors.code) = 404];\n  CONTENT_MISSING = 1 [(errors.code) = 400];\n}\n"
  },
  {
    "path": "service/order/api/goods/v1/goods.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.0\n// \tprotoc        v3.19.4\n// source: goods/v1/goods.proto\n\npackage v1\n\nimport (\n\t_ \"github.com/envoyproxy/protoc-gen-validate/validate\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\temptypb \"google.golang.org/protobuf/types/known/emptypb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype AttrValueRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId      int64  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tAttrId  int64  `protobuf:\"varint,2,opt,name=attrId,proto3\" json:\"attrId,omitempty\"`\n\tGroupId int64  `protobuf:\"varint,3,opt,name=groupId,proto3\" json:\"groupId,omitempty\"`\n\tValue   string `protobuf:\"bytes,4,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *AttrValueRequest) Reset() {\n\t*x = AttrValueRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_goods_v1_goods_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AttrValueRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AttrValueRequest) ProtoMessage() {}\n\nfunc (x *AttrValueRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_goods_v1_goods_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AttrValueRequest.ProtoReflect.Descriptor instead.\nfunc (*AttrValueRequest) Descriptor() ([]byte, []int) {\n\treturn file_goods_v1_goods_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *AttrValueRequest) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *AttrValueRequest) GetAttrId() int64 {\n\tif x != nil {\n\t\treturn x.AttrId\n\t}\n\treturn 0\n}\n\nfunc (x *AttrValueRequest) GetGroupId() int64 {\n\tif x != nil {\n\t\treturn x.GroupId\n\t}\n\treturn 0\n}\n\nfunc (x *AttrValueRequest) GetValue() string {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn \"\"\n}\n\ntype AttrRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId        int64               `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tTypeId    int64               `protobuf:\"varint,2,opt,name=typeId,proto3\" json:\"typeId,omitempty\"`\n\tGroupId   int64               `protobuf:\"varint,3,opt,name=groupId,proto3\" json:\"groupId,omitempty\"`\n\tTitle     string              `protobuf:\"bytes,4,opt,name=title,proto3\" json:\"title,omitempty\"`\n\tDesc      string              `protobuf:\"bytes,5,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\tStatus    bool                `protobuf:\"varint,6,opt,name=status,proto3\" json:\"status,omitempty\"`\n\tSort      int32               `protobuf:\"varint,7,opt,name=sort,proto3\" json:\"sort,omitempty\"`\n\tAttrValue []*AttrValueRequest `protobuf:\"bytes,8,rep,name=attrValue,proto3\" json:\"attrValue,omitempty\"`\n}\n\nfunc (x *AttrRequest) Reset() {\n\t*x = AttrRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_goods_v1_goods_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AttrRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AttrRequest) ProtoMessage() {}\n\nfunc (x *AttrRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_goods_v1_goods_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AttrRequest.ProtoReflect.Descriptor instead.\nfunc (*AttrRequest) Descriptor() ([]byte, []int) {\n\treturn file_goods_v1_goods_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *AttrRequest) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *AttrRequest) GetTypeId() int64 {\n\tif x != nil {\n\t\treturn x.TypeId\n\t}\n\treturn 0\n}\n\nfunc (x *AttrRequest) GetGroupId() int64 {\n\tif x != nil {\n\t\treturn x.GroupId\n\t}\n\treturn 0\n}\n\nfunc (x *AttrRequest) GetTitle() string {\n\tif x != nil {\n\t\treturn x.Title\n\t}\n\treturn \"\"\n}\n\nfunc (x *AttrRequest) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *AttrRequest) GetStatus() bool {\n\tif x != nil {\n\t\treturn x.Status\n\t}\n\treturn false\n}\n\nfunc (x *AttrRequest) GetSort() int32 {\n\tif x != nil {\n\t\treturn x.Sort\n\t}\n\treturn 0\n}\n\nfunc (x *AttrRequest) GetAttrValue() []*AttrValueRequest {\n\tif x != nil {\n\t\treturn x.AttrValue\n\t}\n\treturn nil\n}\n\ntype AttrValueResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId      int64  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tAttrId  int64  `protobuf:\"varint,2,opt,name=attrId,proto3\" json:\"attrId,omitempty\"`\n\tGroupId int64  `protobuf:\"varint,3,opt,name=groupId,proto3\" json:\"groupId,omitempty\"`\n\tValue   string `protobuf:\"bytes,4,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *AttrValueResponse) Reset() {\n\t*x = AttrValueResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_goods_v1_goods_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AttrValueResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AttrValueResponse) ProtoMessage() {}\n\nfunc (x *AttrValueResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_goods_v1_goods_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AttrValueResponse.ProtoReflect.Descriptor instead.\nfunc (*AttrValueResponse) Descriptor() ([]byte, []int) {\n\treturn file_goods_v1_goods_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *AttrValueResponse) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *AttrValueResponse) GetAttrId() int64 {\n\tif x != nil {\n\t\treturn x.AttrId\n\t}\n\treturn 0\n}\n\nfunc (x *AttrValueResponse) GetGroupId() int64 {\n\tif x != nil {\n\t\treturn x.GroupId\n\t}\n\treturn 0\n}\n\nfunc (x *AttrValueResponse) GetValue() string {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn \"\"\n}\n\ntype AttrResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId        int64                `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tTypeId    int64                `protobuf:\"varint,2,opt,name=typeId,proto3\" json:\"typeId,omitempty\"`\n\tGroupId   int64                `protobuf:\"varint,3,opt,name=groupId,proto3\" json:\"groupId,omitempty\"`\n\tTitle     string               `protobuf:\"bytes,4,opt,name=title,proto3\" json:\"title,omitempty\"`\n\tDesc      string               `protobuf:\"bytes,5,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\tStatus    bool                 `protobuf:\"varint,6,opt,name=status,proto3\" json:\"status,omitempty\"`\n\tSort      int32                `protobuf:\"varint,7,opt,name=sort,proto3\" json:\"sort,omitempty\"`\n\tAttrValue []*AttrValueResponse `protobuf:\"bytes,8,rep,name=attrValue,proto3\" json:\"attrValue,omitempty\"`\n}\n\nfunc (x *AttrResponse) Reset() {\n\t*x = AttrResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_goods_v1_goods_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AttrResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AttrResponse) ProtoMessage() {}\n\nfunc (x *AttrResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_goods_v1_goods_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AttrResponse.ProtoReflect.Descriptor instead.\nfunc (*AttrResponse) Descriptor() ([]byte, []int) {\n\treturn file_goods_v1_goods_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *AttrResponse) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *AttrResponse) GetTypeId() int64 {\n\tif x != nil {\n\t\treturn x.TypeId\n\t}\n\treturn 0\n}\n\nfunc (x *AttrResponse) GetGroupId() int64 {\n\tif x != nil {\n\t\treturn x.GroupId\n\t}\n\treturn 0\n}\n\nfunc (x *AttrResponse) GetTitle() string {\n\tif x != nil {\n\t\treturn x.Title\n\t}\n\treturn \"\"\n}\n\nfunc (x *AttrResponse) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *AttrResponse) GetStatus() bool {\n\tif x != nil {\n\t\treturn x.Status\n\t}\n\treturn false\n}\n\nfunc (x *AttrResponse) GetSort() int32 {\n\tif x != nil {\n\t\treturn x.Sort\n\t}\n\treturn 0\n}\n\nfunc (x *AttrResponse) GetAttrValue() []*AttrValueResponse {\n\tif x != nil {\n\t\treturn x.AttrValue\n\t}\n\treturn nil\n}\n\ntype AttrGroupRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId     int64  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tTypeId int64  `protobuf:\"varint,2,opt,name=typeId,proto3\" json:\"typeId,omitempty\"`\n\tTitle  string `protobuf:\"bytes,3,opt,name=title,proto3\" json:\"title,omitempty\"`\n\tDesc   string `protobuf:\"bytes,4,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\tStatus bool   `protobuf:\"varint,5,opt,name=status,proto3\" json:\"status,omitempty\"`\n\tSort   int32  `protobuf:\"varint,6,opt,name=sort,proto3\" json:\"sort,omitempty\"`\n}\n\nfunc (x *AttrGroupRequest) Reset() {\n\t*x = AttrGroupRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_goods_v1_goods_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AttrGroupRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AttrGroupRequest) ProtoMessage() {}\n\nfunc (x *AttrGroupRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_goods_v1_goods_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AttrGroupRequest.ProtoReflect.Descriptor instead.\nfunc (*AttrGroupRequest) Descriptor() ([]byte, []int) {\n\treturn file_goods_v1_goods_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *AttrGroupRequest) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *AttrGroupRequest) GetTypeId() int64 {\n\tif x != nil {\n\t\treturn x.TypeId\n\t}\n\treturn 0\n}\n\nfunc (x *AttrGroupRequest) GetTitle() string {\n\tif x != nil {\n\t\treturn x.Title\n\t}\n\treturn \"\"\n}\n\nfunc (x *AttrGroupRequest) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *AttrGroupRequest) GetStatus() bool {\n\tif x != nil {\n\t\treturn x.Status\n\t}\n\treturn false\n}\n\nfunc (x *AttrGroupRequest) GetSort() int32 {\n\tif x != nil {\n\t\treturn x.Sort\n\t}\n\treturn 0\n}\n\ntype AttrGroupResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId     int64  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tTypeId int64  `protobuf:\"varint,2,opt,name=typeId,proto3\" json:\"typeId,omitempty\"`\n\tTitle  string `protobuf:\"bytes,3,opt,name=title,proto3\" json:\"title,omitempty\"`\n\tDesc   string `protobuf:\"bytes,4,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\tStatus bool   `protobuf:\"varint,5,opt,name=status,proto3\" json:\"status,omitempty\"`\n\tSort   int32  `protobuf:\"varint,6,opt,name=sort,proto3\" json:\"sort,omitempty\"`\n}\n\nfunc (x *AttrGroupResponse) Reset() {\n\t*x = AttrGroupResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_goods_v1_goods_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AttrGroupResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AttrGroupResponse) ProtoMessage() {}\n\nfunc (x *AttrGroupResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_goods_v1_goods_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AttrGroupResponse.ProtoReflect.Descriptor instead.\nfunc (*AttrGroupResponse) Descriptor() ([]byte, []int) {\n\treturn file_goods_v1_goods_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *AttrGroupResponse) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *AttrGroupResponse) GetTypeId() int64 {\n\tif x != nil {\n\t\treturn x.TypeId\n\t}\n\treturn 0\n}\n\nfunc (x *AttrGroupResponse) GetTitle() string {\n\tif x != nil {\n\t\treturn x.Title\n\t}\n\treturn \"\"\n}\n\nfunc (x *AttrGroupResponse) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *AttrGroupResponse) GetStatus() bool {\n\tif x != nil {\n\t\treturn x.Status\n\t}\n\treturn false\n}\n\nfunc (x *AttrGroupResponse) GetSort() int32 {\n\tif x != nil {\n\t\treturn x.Sort\n\t}\n\treturn 0\n}\n\ntype SpecificationValue struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId     int64  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tAttrId int64  `protobuf:\"varint,2,opt,name=attrId,proto3\" json:\"attrId,omitempty\"`\n\tValue  string `protobuf:\"bytes,3,opt,name=value,proto3\" json:\"value,omitempty\"`\n\tSort   int32  `protobuf:\"varint,4,opt,name=sort,proto3\" json:\"sort,omitempty\"`\n}\n\nfunc (x *SpecificationValue) Reset() {\n\t*x = SpecificationValue{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_goods_v1_goods_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SpecificationValue) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SpecificationValue) ProtoMessage() {}\n\nfunc (x *SpecificationValue) ProtoReflect() protoreflect.Message {\n\tmi := &file_goods_v1_goods_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SpecificationValue.ProtoReflect.Descriptor instead.\nfunc (*SpecificationValue) Descriptor() ([]byte, []int) {\n\treturn file_goods_v1_goods_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *SpecificationValue) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *SpecificationValue) GetAttrId() int64 {\n\tif x != nil {\n\t\treturn x.AttrId\n\t}\n\treturn 0\n}\n\nfunc (x *SpecificationValue) GetValue() string {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn \"\"\n}\n\nfunc (x *SpecificationValue) GetSort() int32 {\n\tif x != nil {\n\t\treturn x.Sort\n\t}\n\treturn 0\n}\n\ntype SpecificationValueResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId     int64  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tAttrId int64  `protobuf:\"varint,2,opt,name=attrId,proto3\" json:\"attrId,omitempty\"`\n\tValue  string `protobuf:\"bytes,3,opt,name=value,proto3\" json:\"value,omitempty\"`\n\tSort   int32  `protobuf:\"varint,4,opt,name=sort,proto3\" json:\"sort,omitempty\"`\n}\n\nfunc (x *SpecificationValueResponse) Reset() {\n\t*x = SpecificationValueResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_goods_v1_goods_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SpecificationValueResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SpecificationValueResponse) ProtoMessage() {}\n\nfunc (x *SpecificationValueResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_goods_v1_goods_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SpecificationValueResponse.ProtoReflect.Descriptor instead.\nfunc (*SpecificationValueResponse) Descriptor() ([]byte, []int) {\n\treturn file_goods_v1_goods_proto_rawDescGZIP(), []int{7}\n}\n\nfunc (x *SpecificationValueResponse) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *SpecificationValueResponse) GetAttrId() int64 {\n\tif x != nil {\n\t\treturn x.AttrId\n\t}\n\treturn 0\n}\n\nfunc (x *SpecificationValueResponse) GetValue() string {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn \"\"\n}\n\nfunc (x *SpecificationValueResponse) GetSort() int32 {\n\tif x != nil {\n\t\treturn x.Sort\n\t}\n\treturn 0\n}\n\ntype SpecificationRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId                 int64                 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tTypeId             int64                 `protobuf:\"varint,2,opt,name=typeId,proto3\" json:\"typeId,omitempty\"`\n\tName               string                `protobuf:\"bytes,3,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tSort               int32                 `protobuf:\"varint,4,opt,name=sort,proto3\" json:\"sort,omitempty\"`\n\tStatus             bool                  `protobuf:\"varint,5,opt,name=status,proto3\" json:\"status,omitempty\"`\n\tIsSku              bool                  `protobuf:\"varint,6,opt,name=isSku,proto3\" json:\"isSku,omitempty\"`\n\tIsSelect           bool                  `protobuf:\"varint,7,opt,name=isSelect,proto3\" json:\"isSelect,omitempty\"`\n\tSpecificationValue []*SpecificationValue `protobuf:\"bytes,8,rep,name=specificationValue,proto3\" json:\"specificationValue,omitempty\"`\n}\n\nfunc (x *SpecificationRequest) Reset() {\n\t*x = SpecificationRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_goods_v1_goods_proto_msgTypes[8]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SpecificationRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SpecificationRequest) ProtoMessage() {}\n\nfunc (x *SpecificationRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_goods_v1_goods_proto_msgTypes[8]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SpecificationRequest.ProtoReflect.Descriptor instead.\nfunc (*SpecificationRequest) Descriptor() ([]byte, []int) {\n\treturn file_goods_v1_goods_proto_rawDescGZIP(), []int{8}\n}\n\nfunc (x *SpecificationRequest) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *SpecificationRequest) GetTypeId() int64 {\n\tif x != nil {\n\t\treturn x.TypeId\n\t}\n\treturn 0\n}\n\nfunc (x *SpecificationRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *SpecificationRequest) GetSort() int32 {\n\tif x != nil {\n\t\treturn x.Sort\n\t}\n\treturn 0\n}\n\nfunc (x *SpecificationRequest) GetStatus() bool {\n\tif x != nil {\n\t\treturn x.Status\n\t}\n\treturn false\n}\n\nfunc (x *SpecificationRequest) GetIsSku() bool {\n\tif x != nil {\n\t\treturn x.IsSku\n\t}\n\treturn false\n}\n\nfunc (x *SpecificationRequest) GetIsSelect() bool {\n\tif x != nil {\n\t\treturn x.IsSelect\n\t}\n\treturn false\n}\n\nfunc (x *SpecificationRequest) GetSpecificationValue() []*SpecificationValue {\n\tif x != nil {\n\t\treturn x.SpecificationValue\n\t}\n\treturn nil\n}\n\ntype SpecificationResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *SpecificationResponse) Reset() {\n\t*x = SpecificationResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_goods_v1_goods_proto_msgTypes[9]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SpecificationResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SpecificationResponse) ProtoMessage() {}\n\nfunc (x *SpecificationResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_goods_v1_goods_proto_msgTypes[9]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SpecificationResponse.ProtoReflect.Descriptor instead.\nfunc (*SpecificationResponse) Descriptor() ([]byte, []int) {\n\treturn file_goods_v1_goods_proto_rawDescGZIP(), []int{9}\n}\n\nfunc (x *SpecificationResponse) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\ntype GoodsTypeRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId        int64  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName      string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tTypeCode  string `protobuf:\"bytes,3,opt,name=typeCode,proto3\" json:\"typeCode,omitempty\"`\n\tNameAlias string `protobuf:\"bytes,4,opt,name=nameAlias,proto3\" json:\"nameAlias,omitempty\"`\n\tIsVirtual bool   `protobuf:\"varint,5,opt,name=isVirtual,proto3\" json:\"isVirtual,omitempty\"`\n\tDesc      string `protobuf:\"bytes,6,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\tSort      int32  `protobuf:\"varint,7,opt,name=sort,proto3\" json:\"sort,omitempty\"`\n\tBrandIds  string `protobuf:\"bytes,8,opt,name=brandIds,proto3\" json:\"brandIds,omitempty\"`\n}\n\nfunc (x *GoodsTypeRequest) Reset() {\n\t*x = GoodsTypeRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_goods_v1_goods_proto_msgTypes[10]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GoodsTypeRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GoodsTypeRequest) ProtoMessage() {}\n\nfunc (x *GoodsTypeRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_goods_v1_goods_proto_msgTypes[10]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GoodsTypeRequest.ProtoReflect.Descriptor instead.\nfunc (*GoodsTypeRequest) Descriptor() ([]byte, []int) {\n\treturn file_goods_v1_goods_proto_rawDescGZIP(), []int{10}\n}\n\nfunc (x *GoodsTypeRequest) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *GoodsTypeRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *GoodsTypeRequest) GetTypeCode() string {\n\tif x != nil {\n\t\treturn x.TypeCode\n\t}\n\treturn \"\"\n}\n\nfunc (x *GoodsTypeRequest) GetNameAlias() string {\n\tif x != nil {\n\t\treturn x.NameAlias\n\t}\n\treturn \"\"\n}\n\nfunc (x *GoodsTypeRequest) GetIsVirtual() bool {\n\tif x != nil {\n\t\treturn x.IsVirtual\n\t}\n\treturn false\n}\n\nfunc (x *GoodsTypeRequest) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *GoodsTypeRequest) GetSort() int32 {\n\tif x != nil {\n\t\treturn x.Sort\n\t}\n\treturn 0\n}\n\nfunc (x *GoodsTypeRequest) GetBrandIds() string {\n\tif x != nil {\n\t\treturn x.BrandIds\n\t}\n\treturn \"\"\n}\n\ntype GoodsTypeResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GoodsTypeResponse) Reset() {\n\t*x = GoodsTypeResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_goods_v1_goods_proto_msgTypes[11]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GoodsTypeResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GoodsTypeResponse) ProtoMessage() {}\n\nfunc (x *GoodsTypeResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_goods_v1_goods_proto_msgTypes[11]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GoodsTypeResponse.ProtoReflect.Descriptor instead.\nfunc (*GoodsTypeResponse) Descriptor() ([]byte, []int) {\n\treturn file_goods_v1_goods_proto_rawDescGZIP(), []int{11}\n}\n\nfunc (x *GoodsTypeResponse) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\ntype CreateGoodsRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId              int64                         `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tCategoryId      int32                         `protobuf:\"varint,2,opt,name=categoryId,proto3\" json:\"categoryId,omitempty\"`\n\tBrandId         int32                         `protobuf:\"varint,3,opt,name=brandId,proto3\" json:\"brandId,omitempty\"`\n\tTypeId          int64                         `protobuf:\"varint,4,opt,name=typeId,proto3\" json:\"typeId,omitempty\"`\n\tName            string                        `protobuf:\"bytes,5,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tNameAlias       string                        `protobuf:\"bytes,6,opt,name=nameAlias,proto3\" json:\"nameAlias,omitempty\"`\n\tGoodsTags       string                        `protobuf:\"bytes,7,opt,name=goodsTags,proto3\" json:\"goodsTags,omitempty\"`\n\tGoodsSn         string                        `protobuf:\"bytes,8,opt,name=goodsSn,proto3\" json:\"goodsSn,omitempty\"`\n\tShopPrice       int64                         `protobuf:\"varint,9,opt,name=shopPrice,proto3\" json:\"shopPrice,omitempty\"`\n\tMarketPrice     int64                         `protobuf:\"varint,10,opt,name=marketPrice,proto3\" json:\"marketPrice,omitempty\"`\n\tInventory       int64                         `protobuf:\"varint,11,opt,name=inventory,proto3\" json:\"inventory,omitempty\"`\n\tGoodsBrief      string                        `protobuf:\"bytes,12,opt,name=goodsBrief,proto3\" json:\"goodsBrief,omitempty\"`\n\tGoodsFrontImage string                        `protobuf:\"bytes,13,opt,name=goodsFrontImage,proto3\" json:\"goodsFrontImage,omitempty\"`\n\tGoodsImages     []string                      `protobuf:\"bytes,14,rep,name=goodsImages,proto3\" json:\"goodsImages,omitempty\"`\n\tShipFree        bool                          `protobuf:\"varint,15,opt,name=shipFree,proto3\" json:\"shipFree,omitempty\"`\n\tShipId          int32                         `protobuf:\"varint,16,opt,name=shipId,proto3\" json:\"shipId,omitempty\"`\n\tIsNew           bool                          `protobuf:\"varint,17,opt,name=isNew,proto3\" json:\"isNew,omitempty\"`\n\tIsHot           bool                          `protobuf:\"varint,18,opt,name=isHot,proto3\" json:\"isHot,omitempty\"`\n\tOnSale          bool                          `protobuf:\"varint,19,opt,name=onSale,proto3\" json:\"onSale,omitempty\"`\n\tSku             []*CreateGoodsRequestGoodsSku `protobuf:\"bytes,20,rep,name=sku,proto3\" json:\"sku,omitempty\"`\n}\n\nfunc (x *CreateGoodsRequest) Reset() {\n\t*x = CreateGoodsRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_goods_v1_goods_proto_msgTypes[12]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CreateGoodsRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreateGoodsRequest) ProtoMessage() {}\n\nfunc (x *CreateGoodsRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_goods_v1_goods_proto_msgTypes[12]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreateGoodsRequest.ProtoReflect.Descriptor instead.\nfunc (*CreateGoodsRequest) Descriptor() ([]byte, []int) {\n\treturn file_goods_v1_goods_proto_rawDescGZIP(), []int{12}\n}\n\nfunc (x *CreateGoodsRequest) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *CreateGoodsRequest) GetCategoryId() int32 {\n\tif x != nil {\n\t\treturn x.CategoryId\n\t}\n\treturn 0\n}\n\nfunc (x *CreateGoodsRequest) GetBrandId() int32 {\n\tif x != nil {\n\t\treturn x.BrandId\n\t}\n\treturn 0\n}\n\nfunc (x *CreateGoodsRequest) GetTypeId() int64 {\n\tif x != nil {\n\t\treturn x.TypeId\n\t}\n\treturn 0\n}\n\nfunc (x *CreateGoodsRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateGoodsRequest) GetNameAlias() string {\n\tif x != nil {\n\t\treturn x.NameAlias\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateGoodsRequest) GetGoodsTags() string {\n\tif x != nil {\n\t\treturn x.GoodsTags\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateGoodsRequest) GetGoodsSn() string {\n\tif x != nil {\n\t\treturn x.GoodsSn\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateGoodsRequest) GetShopPrice() int64 {\n\tif x != nil {\n\t\treturn x.ShopPrice\n\t}\n\treturn 0\n}\n\nfunc (x *CreateGoodsRequest) GetMarketPrice() int64 {\n\tif x != nil {\n\t\treturn x.MarketPrice\n\t}\n\treturn 0\n}\n\nfunc (x *CreateGoodsRequest) GetInventory() int64 {\n\tif x != nil {\n\t\treturn x.Inventory\n\t}\n\treturn 0\n}\n\nfunc (x *CreateGoodsRequest) GetGoodsBrief() string {\n\tif x != nil {\n\t\treturn x.GoodsBrief\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateGoodsRequest) GetGoodsFrontImage() string {\n\tif x != nil {\n\t\treturn x.GoodsFrontImage\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateGoodsRequest) GetGoodsImages() []string {\n\tif x != nil {\n\t\treturn x.GoodsImages\n\t}\n\treturn nil\n}\n\nfunc (x *CreateGoodsRequest) GetShipFree() bool {\n\tif x != nil {\n\t\treturn x.ShipFree\n\t}\n\treturn false\n}\n\nfunc (x *CreateGoodsRequest) GetShipId() int32 {\n\tif x != nil {\n\t\treturn x.ShipId\n\t}\n\treturn 0\n}\n\nfunc (x *CreateGoodsRequest) GetIsNew() bool {\n\tif x != nil {\n\t\treturn x.IsNew\n\t}\n\treturn false\n}\n\nfunc (x *CreateGoodsRequest) GetIsHot() bool {\n\tif x != nil {\n\t\treturn x.IsHot\n\t}\n\treturn false\n}\n\nfunc (x *CreateGoodsRequest) GetOnSale() bool {\n\tif x != nil {\n\t\treturn x.OnSale\n\t}\n\treturn false\n}\n\nfunc (x *CreateGoodsRequest) GetSku() []*CreateGoodsRequestGoodsSku {\n\tif x != nil {\n\t\treturn x.Sku\n\t}\n\treturn nil\n}\n\ntype CreateGoodsResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tID int64 `protobuf:\"varint,1,opt,name=ID,proto3\" json:\"ID,omitempty\"`\n}\n\nfunc (x *CreateGoodsResponse) Reset() {\n\t*x = CreateGoodsResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_goods_v1_goods_proto_msgTypes[13]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CreateGoodsResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreateGoodsResponse) ProtoMessage() {}\n\nfunc (x *CreateGoodsResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_goods_v1_goods_proto_msgTypes[13]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreateGoodsResponse.ProtoReflect.Descriptor instead.\nfunc (*CreateGoodsResponse) Descriptor() ([]byte, []int) {\n\treturn file_goods_v1_goods_proto_rawDescGZIP(), []int{13}\n}\n\nfunc (x *CreateGoodsResponse) GetID() int64 {\n\tif x != nil {\n\t\treturn x.ID\n\t}\n\treturn 0\n}\n\ntype GoodsInfoResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId          int64    `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tCategoryId  int32    `protobuf:\"varint,2,opt,name=categoryId,proto3\" json:\"categoryId,omitempty\"`\n\tBrandId     int32    `protobuf:\"varint,3,opt,name=brandId,proto3\" json:\"brandId,omitempty\"`\n\tName        string   `protobuf:\"bytes,4,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tGoodsSn     string   `protobuf:\"bytes,5,opt,name=goodsSn,proto3\" json:\"goodsSn,omitempty\"`\n\tClickNum    int64    `protobuf:\"varint,6,opt,name=clickNum,proto3\" json:\"clickNum,omitempty\"`\n\tSoldNum     int64    `protobuf:\"varint,7,opt,name=soldNum,proto3\" json:\"soldNum,omitempty\"`\n\tFavNum      int64    `protobuf:\"varint,8,opt,name=favNum,proto3\" json:\"favNum,omitempty\"`\n\tMarketPrice int64    `protobuf:\"varint,9,opt,name=marketPrice,proto3\" json:\"marketPrice,omitempty\"`\n\tGoodsBrief  string   `protobuf:\"bytes,10,opt,name=goodsBrief,proto3\" json:\"goodsBrief,omitempty\"`\n\tGoodsDesc   string   `protobuf:\"bytes,11,opt,name=goodsDesc,proto3\" json:\"goodsDesc,omitempty\"`\n\tShipFree    bool     `protobuf:\"varint,12,opt,name=shipFree,proto3\" json:\"shipFree,omitempty\"`\n\tImages      string   `protobuf:\"bytes,13,opt,name=images,proto3\" json:\"images,omitempty\"`\n\tGoodsImages []string `protobuf:\"bytes,14,rep,name=goodsImages,proto3\" json:\"goodsImages,omitempty\"`\n\tIsNew       bool     `protobuf:\"varint,15,opt,name=isNew,proto3\" json:\"isNew,omitempty\"`\n\tIsHot       bool     `protobuf:\"varint,16,opt,name=isHot,proto3\" json:\"isHot,omitempty\"`\n\tOnSale      bool     `protobuf:\"varint,17,opt,name=onSale,proto3\" json:\"onSale,omitempty\"`\n}\n\nfunc (x *GoodsInfoResponse) Reset() {\n\t*x = GoodsInfoResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_goods_v1_goods_proto_msgTypes[14]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GoodsInfoResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GoodsInfoResponse) ProtoMessage() {}\n\nfunc (x *GoodsInfoResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_goods_v1_goods_proto_msgTypes[14]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GoodsInfoResponse.ProtoReflect.Descriptor instead.\nfunc (*GoodsInfoResponse) Descriptor() ([]byte, []int) {\n\treturn file_goods_v1_goods_proto_rawDescGZIP(), []int{14}\n}\n\nfunc (x *GoodsInfoResponse) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *GoodsInfoResponse) GetCategoryId() int32 {\n\tif x != nil {\n\t\treturn x.CategoryId\n\t}\n\treturn 0\n}\n\nfunc (x *GoodsInfoResponse) GetBrandId() int32 {\n\tif x != nil {\n\t\treturn x.BrandId\n\t}\n\treturn 0\n}\n\nfunc (x *GoodsInfoResponse) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *GoodsInfoResponse) GetGoodsSn() string {\n\tif x != nil {\n\t\treturn x.GoodsSn\n\t}\n\treturn \"\"\n}\n\nfunc (x *GoodsInfoResponse) GetClickNum() int64 {\n\tif x != nil {\n\t\treturn x.ClickNum\n\t}\n\treturn 0\n}\n\nfunc (x *GoodsInfoResponse) GetSoldNum() int64 {\n\tif x != nil {\n\t\treturn x.SoldNum\n\t}\n\treturn 0\n}\n\nfunc (x *GoodsInfoResponse) GetFavNum() int64 {\n\tif x != nil {\n\t\treturn x.FavNum\n\t}\n\treturn 0\n}\n\nfunc (x *GoodsInfoResponse) GetMarketPrice() int64 {\n\tif x != nil {\n\t\treturn x.MarketPrice\n\t}\n\treturn 0\n}\n\nfunc (x *GoodsInfoResponse) GetGoodsBrief() string {\n\tif x != nil {\n\t\treturn x.GoodsBrief\n\t}\n\treturn \"\"\n}\n\nfunc (x *GoodsInfoResponse) GetGoodsDesc() string {\n\tif x != nil {\n\t\treturn x.GoodsDesc\n\t}\n\treturn \"\"\n}\n\nfunc (x *GoodsInfoResponse) GetShipFree() bool {\n\tif x != nil {\n\t\treturn x.ShipFree\n\t}\n\treturn false\n}\n\nfunc (x *GoodsInfoResponse) GetImages() string {\n\tif x != nil {\n\t\treturn x.Images\n\t}\n\treturn \"\"\n}\n\nfunc (x *GoodsInfoResponse) GetGoodsImages() []string {\n\tif x != nil {\n\t\treturn x.GoodsImages\n\t}\n\treturn nil\n}\n\nfunc (x *GoodsInfoResponse) GetIsNew() bool {\n\tif x != nil {\n\t\treturn x.IsNew\n\t}\n\treturn false\n}\n\nfunc (x *GoodsInfoResponse) GetIsHot() bool {\n\tif x != nil {\n\t\treturn x.IsHot\n\t}\n\treturn false\n}\n\nfunc (x *GoodsInfoResponse) GetOnSale() bool {\n\tif x != nil {\n\t\treturn x.OnSale\n\t}\n\treturn false\n}\n\ntype GoodsListResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tTotal int64                `protobuf:\"varint,1,opt,name=total,proto3\" json:\"total,omitempty\"`\n\tList  []*GoodsInfoResponse `protobuf:\"bytes,2,rep,name=list,proto3\" json:\"list,omitempty\"`\n}\n\nfunc (x *GoodsListResponse) Reset() {\n\t*x = GoodsListResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_goods_v1_goods_proto_msgTypes[15]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GoodsListResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GoodsListResponse) ProtoMessage() {}\n\nfunc (x *GoodsListResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_goods_v1_goods_proto_msgTypes[15]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GoodsListResponse.ProtoReflect.Descriptor instead.\nfunc (*GoodsListResponse) Descriptor() ([]byte, []int) {\n\treturn file_goods_v1_goods_proto_rawDescGZIP(), []int{15}\n}\n\nfunc (x *GoodsListResponse) GetTotal() int64 {\n\tif x != nil {\n\t\treturn x.Total\n\t}\n\treturn 0\n}\n\nfunc (x *GoodsListResponse) GetList() []*GoodsInfoResponse {\n\tif x != nil {\n\t\treturn x.List\n\t}\n\treturn nil\n}\n\ntype GoodsFilterRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tKeywords    string `protobuf:\"bytes,1,opt,name=keywords,proto3\" json:\"keywords,omitempty\"`\n\tCategoryId  int32  `protobuf:\"varint,2,opt,name=categoryId,proto3\" json:\"categoryId,omitempty\"`\n\tBrandId     int32  `protobuf:\"varint,3,opt,name=brandId,proto3\" json:\"brandId,omitempty\"`\n\tMinPrice    int64  `protobuf:\"varint,4,opt,name=minPrice,proto3\" json:\"minPrice,omitempty\"`\n\tMaxPrice    int64  `protobuf:\"varint,5,opt,name=maxPrice,proto3\" json:\"maxPrice,omitempty\"`\n\tIsHot       bool   `protobuf:\"varint,6,opt,name=isHot,proto3\" json:\"isHot,omitempty\"`\n\tIsNew       bool   `protobuf:\"varint,7,opt,name=isNew,proto3\" json:\"isNew,omitempty\"`\n\tIsTab       bool   `protobuf:\"varint,8,opt,name=isTab,proto3\" json:\"isTab,omitempty\"`\n\tClickNum    int64  `protobuf:\"varint,9,opt,name=clickNum,proto3\" json:\"clickNum,omitempty\"`\n\tSoldNum     int64  `protobuf:\"varint,10,opt,name=soldNum,proto3\" json:\"soldNum,omitempty\"`\n\tFavNum      int64  `protobuf:\"varint,11,opt,name=favNum,proto3\" json:\"favNum,omitempty\"`\n\tPages       int64  `protobuf:\"varint,12,opt,name=pages,proto3\" json:\"pages,omitempty\"`\n\tPagePerNums int64  `protobuf:\"varint,13,opt,name=pagePerNums,proto3\" json:\"pagePerNums,omitempty\"`\n\tId          int64  `protobuf:\"varint,14,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GoodsFilterRequest) Reset() {\n\t*x = GoodsFilterRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_goods_v1_goods_proto_msgTypes[16]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GoodsFilterRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GoodsFilterRequest) ProtoMessage() {}\n\nfunc (x *GoodsFilterRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_goods_v1_goods_proto_msgTypes[16]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GoodsFilterRequest.ProtoReflect.Descriptor instead.\nfunc (*GoodsFilterRequest) Descriptor() ([]byte, []int) {\n\treturn file_goods_v1_goods_proto_rawDescGZIP(), []int{16}\n}\n\nfunc (x *GoodsFilterRequest) GetKeywords() string {\n\tif x != nil {\n\t\treturn x.Keywords\n\t}\n\treturn \"\"\n}\n\nfunc (x *GoodsFilterRequest) GetCategoryId() int32 {\n\tif x != nil {\n\t\treturn x.CategoryId\n\t}\n\treturn 0\n}\n\nfunc (x *GoodsFilterRequest) GetBrandId() int32 {\n\tif x != nil {\n\t\treturn x.BrandId\n\t}\n\treturn 0\n}\n\nfunc (x *GoodsFilterRequest) GetMinPrice() int64 {\n\tif x != nil {\n\t\treturn x.MinPrice\n\t}\n\treturn 0\n}\n\nfunc (x *GoodsFilterRequest) GetMaxPrice() int64 {\n\tif x != nil {\n\t\treturn x.MaxPrice\n\t}\n\treturn 0\n}\n\nfunc (x *GoodsFilterRequest) GetIsHot() bool {\n\tif x != nil {\n\t\treturn x.IsHot\n\t}\n\treturn false\n}\n\nfunc (x *GoodsFilterRequest) GetIsNew() bool {\n\tif x != nil {\n\t\treturn x.IsNew\n\t}\n\treturn false\n}\n\nfunc (x *GoodsFilterRequest) GetIsTab() bool {\n\tif x != nil {\n\t\treturn x.IsTab\n\t}\n\treturn false\n}\n\nfunc (x *GoodsFilterRequest) GetClickNum() int64 {\n\tif x != nil {\n\t\treturn x.ClickNum\n\t}\n\treturn 0\n}\n\nfunc (x *GoodsFilterRequest) GetSoldNum() int64 {\n\tif x != nil {\n\t\treturn x.SoldNum\n\t}\n\treturn 0\n}\n\nfunc (x *GoodsFilterRequest) GetFavNum() int64 {\n\tif x != nil {\n\t\treturn x.FavNum\n\t}\n\treturn 0\n}\n\nfunc (x *GoodsFilterRequest) GetPages() int64 {\n\tif x != nil {\n\t\treturn x.Pages\n\t}\n\treturn 0\n}\n\nfunc (x *GoodsFilterRequest) GetPagePerNums() int64 {\n\tif x != nil {\n\t\treturn x.PagePerNums\n\t}\n\treturn 0\n}\n\nfunc (x *GoodsFilterRequest) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\n// 商品分类\ntype CategoryInfoResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId             int32  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName           string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tParentCategory int32  `protobuf:\"varint,3,opt,name=parentCategory,proto3\" json:\"parentCategory,omitempty\"`\n\tLevel          int32  `protobuf:\"varint,4,opt,name=level,proto3\" json:\"level,omitempty\"`\n\tIsTab          bool   `protobuf:\"varint,5,opt,name=isTab,proto3\" json:\"isTab,omitempty\"`\n\tSort           int32  `protobuf:\"varint,6,opt,name=sort,proto3\" json:\"sort,omitempty\"`\n}\n\nfunc (x *CategoryInfoResponse) Reset() {\n\t*x = CategoryInfoResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_goods_v1_goods_proto_msgTypes[17]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CategoryInfoResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CategoryInfoResponse) ProtoMessage() {}\n\nfunc (x *CategoryInfoResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_goods_v1_goods_proto_msgTypes[17]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CategoryInfoResponse.ProtoReflect.Descriptor instead.\nfunc (*CategoryInfoResponse) Descriptor() ([]byte, []int) {\n\treturn file_goods_v1_goods_proto_rawDescGZIP(), []int{17}\n}\n\nfunc (x *CategoryInfoResponse) GetId() int32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *CategoryInfoResponse) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CategoryInfoResponse) GetParentCategory() int32 {\n\tif x != nil {\n\t\treturn x.ParentCategory\n\t}\n\treturn 0\n}\n\nfunc (x *CategoryInfoResponse) GetLevel() int32 {\n\tif x != nil {\n\t\treturn x.Level\n\t}\n\treturn 0\n}\n\nfunc (x *CategoryInfoResponse) GetIsTab() bool {\n\tif x != nil {\n\t\treturn x.IsTab\n\t}\n\treturn false\n}\n\nfunc (x *CategoryInfoResponse) GetSort() int32 {\n\tif x != nil {\n\t\treturn x.Sort\n\t}\n\treturn 0\n}\n\ntype CategoryListResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tJsonData string `protobuf:\"bytes,1,opt,name=jsonData,proto3\" json:\"jsonData,omitempty\"`\n}\n\nfunc (x *CategoryListResponse) Reset() {\n\t*x = CategoryListResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_goods_v1_goods_proto_msgTypes[18]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CategoryListResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CategoryListResponse) ProtoMessage() {}\n\nfunc (x *CategoryListResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_goods_v1_goods_proto_msgTypes[18]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CategoryListResponse.ProtoReflect.Descriptor instead.\nfunc (*CategoryListResponse) Descriptor() ([]byte, []int) {\n\treturn file_goods_v1_goods_proto_rawDescGZIP(), []int{18}\n}\n\nfunc (x *CategoryListResponse) GetJsonData() string {\n\tif x != nil {\n\t\treturn x.JsonData\n\t}\n\treturn \"\"\n}\n\ntype CategoryListRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId    int32 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tLevel int32 `protobuf:\"varint,2,opt,name=level,proto3\" json:\"level,omitempty\"`\n}\n\nfunc (x *CategoryListRequest) Reset() {\n\t*x = CategoryListRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_goods_v1_goods_proto_msgTypes[19]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CategoryListRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CategoryListRequest) ProtoMessage() {}\n\nfunc (x *CategoryListRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_goods_v1_goods_proto_msgTypes[19]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CategoryListRequest.ProtoReflect.Descriptor instead.\nfunc (*CategoryListRequest) Descriptor() ([]byte, []int) {\n\treturn file_goods_v1_goods_proto_rawDescGZIP(), []int{19}\n}\n\nfunc (x *CategoryListRequest) GetId() int32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *CategoryListRequest) GetLevel() int32 {\n\tif x != nil {\n\t\treturn x.Level\n\t}\n\treturn 0\n}\n\ntype SubCategoryListResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tInfo        *CategoryInfoResponse   `protobuf:\"bytes,1,opt,name=info,proto3\" json:\"info,omitempty\"`\n\tSubCategory []*CategoryInfoResponse `protobuf:\"bytes,2,rep,name=subCategory,proto3\" json:\"subCategory,omitempty\"`\n}\n\nfunc (x *SubCategoryListResponse) Reset() {\n\t*x = SubCategoryListResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_goods_v1_goods_proto_msgTypes[20]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SubCategoryListResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SubCategoryListResponse) ProtoMessage() {}\n\nfunc (x *SubCategoryListResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_goods_v1_goods_proto_msgTypes[20]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SubCategoryListResponse.ProtoReflect.Descriptor instead.\nfunc (*SubCategoryListResponse) Descriptor() ([]byte, []int) {\n\treturn file_goods_v1_goods_proto_rawDescGZIP(), []int{20}\n}\n\nfunc (x *SubCategoryListResponse) GetInfo() *CategoryInfoResponse {\n\tif x != nil {\n\t\treturn x.Info\n\t}\n\treturn nil\n}\n\nfunc (x *SubCategoryListResponse) GetSubCategory() []*CategoryInfoResponse {\n\tif x != nil {\n\t\treturn x.SubCategory\n\t}\n\treturn nil\n}\n\ntype CategoryInfoRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId             int32  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName           string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tParentCategory int32  `protobuf:\"varint,3,opt,name=parentCategory,proto3\" json:\"parentCategory,omitempty\"`\n\tLevel          int32  `protobuf:\"varint,4,opt,name=level,proto3\" json:\"level,omitempty\"`\n\tIsTab          bool   `protobuf:\"varint,5,opt,name=isTab,proto3\" json:\"isTab,omitempty\"`\n\tSort           int32  `protobuf:\"varint,6,opt,name=sort,proto3\" json:\"sort,omitempty\"`\n}\n\nfunc (x *CategoryInfoRequest) Reset() {\n\t*x = CategoryInfoRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_goods_v1_goods_proto_msgTypes[21]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CategoryInfoRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CategoryInfoRequest) ProtoMessage() {}\n\nfunc (x *CategoryInfoRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_goods_v1_goods_proto_msgTypes[21]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CategoryInfoRequest.ProtoReflect.Descriptor instead.\nfunc (*CategoryInfoRequest) Descriptor() ([]byte, []int) {\n\treturn file_goods_v1_goods_proto_rawDescGZIP(), []int{21}\n}\n\nfunc (x *CategoryInfoRequest) GetId() int32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *CategoryInfoRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CategoryInfoRequest) GetParentCategory() int32 {\n\tif x != nil {\n\t\treturn x.ParentCategory\n\t}\n\treturn 0\n}\n\nfunc (x *CategoryInfoRequest) GetLevel() int32 {\n\tif x != nil {\n\t\treturn x.Level\n\t}\n\treturn 0\n}\n\nfunc (x *CategoryInfoRequest) GetIsTab() bool {\n\tif x != nil {\n\t\treturn x.IsTab\n\t}\n\treturn false\n}\n\nfunc (x *CategoryInfoRequest) GetSort() int32 {\n\tif x != nil {\n\t\treturn x.Sort\n\t}\n\treturn 0\n}\n\ntype BatchCategoryInfoRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId        []int32 `protobuf:\"varint,1,rep,packed,name=id,proto3\" json:\"id,omitempty\"`\n\tGoodsNums int32   `protobuf:\"varint,2,opt,name=goodsNums,proto3\" json:\"goodsNums,omitempty\"`\n\tBrandNums int32   `protobuf:\"varint,3,opt,name=brandNums,proto3\" json:\"brandNums,omitempty\"`\n}\n\nfunc (x *BatchCategoryInfoRequest) Reset() {\n\t*x = BatchCategoryInfoRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_goods_v1_goods_proto_msgTypes[22]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *BatchCategoryInfoRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*BatchCategoryInfoRequest) ProtoMessage() {}\n\nfunc (x *BatchCategoryInfoRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_goods_v1_goods_proto_msgTypes[22]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use BatchCategoryInfoRequest.ProtoReflect.Descriptor instead.\nfunc (*BatchCategoryInfoRequest) Descriptor() ([]byte, []int) {\n\treturn file_goods_v1_goods_proto_rawDescGZIP(), []int{22}\n}\n\nfunc (x *BatchCategoryInfoRequest) GetId() []int32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn nil\n}\n\nfunc (x *BatchCategoryInfoRequest) GetGoodsNums() int32 {\n\tif x != nil {\n\t\treturn x.GoodsNums\n\t}\n\treturn 0\n}\n\nfunc (x *BatchCategoryInfoRequest) GetBrandNums() int32 {\n\tif x != nil {\n\t\treturn x.BrandNums\n\t}\n\treturn 0\n}\n\ntype DeleteCategoryRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId int32 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *DeleteCategoryRequest) Reset() {\n\t*x = DeleteCategoryRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_goods_v1_goods_proto_msgTypes[23]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *DeleteCategoryRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*DeleteCategoryRequest) ProtoMessage() {}\n\nfunc (x *DeleteCategoryRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_goods_v1_goods_proto_msgTypes[23]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use DeleteCategoryRequest.ProtoReflect.Descriptor instead.\nfunc (*DeleteCategoryRequest) Descriptor() ([]byte, []int) {\n\treturn file_goods_v1_goods_proto_rawDescGZIP(), []int{23}\n}\n\nfunc (x *DeleteCategoryRequest) GetId() int32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\ntype BrandListRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPages       int32 `protobuf:\"varint,1,opt,name=pages,proto3\" json:\"pages,omitempty\"`\n\tPagePerNums int32 `protobuf:\"varint,2,opt,name=pagePerNums,proto3\" json:\"pagePerNums,omitempty\"`\n}\n\nfunc (x *BrandListRequest) Reset() {\n\t*x = BrandListRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_goods_v1_goods_proto_msgTypes[24]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *BrandListRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*BrandListRequest) ProtoMessage() {}\n\nfunc (x *BrandListRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_goods_v1_goods_proto_msgTypes[24]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use BrandListRequest.ProtoReflect.Descriptor instead.\nfunc (*BrandListRequest) Descriptor() ([]byte, []int) {\n\treturn file_goods_v1_goods_proto_rawDescGZIP(), []int{24}\n}\n\nfunc (x *BrandListRequest) GetPages() int32 {\n\tif x != nil {\n\t\treturn x.Pages\n\t}\n\treturn 0\n}\n\nfunc (x *BrandListRequest) GetPagePerNums() int32 {\n\tif x != nil {\n\t\treturn x.PagePerNums\n\t}\n\treturn 0\n}\n\ntype BrandRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId    int32  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName  string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tLogo  string `protobuf:\"bytes,3,opt,name=logo,proto3\" json:\"logo,omitempty\"`\n\tDesc  string `protobuf:\"bytes,4,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\tIsTab bool   `protobuf:\"varint,5,opt,name=isTab,proto3\" json:\"isTab,omitempty\"`\n\tSort  int32  `protobuf:\"varint,6,opt,name=sort,proto3\" json:\"sort,omitempty\"`\n}\n\nfunc (x *BrandRequest) Reset() {\n\t*x = BrandRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_goods_v1_goods_proto_msgTypes[25]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *BrandRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*BrandRequest) ProtoMessage() {}\n\nfunc (x *BrandRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_goods_v1_goods_proto_msgTypes[25]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use BrandRequest.ProtoReflect.Descriptor instead.\nfunc (*BrandRequest) Descriptor() ([]byte, []int) {\n\treturn file_goods_v1_goods_proto_rawDescGZIP(), []int{25}\n}\n\nfunc (x *BrandRequest) GetId() int32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *BrandRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *BrandRequest) GetLogo() string {\n\tif x != nil {\n\t\treturn x.Logo\n\t}\n\treturn \"\"\n}\n\nfunc (x *BrandRequest) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *BrandRequest) GetIsTab() bool {\n\tif x != nil {\n\t\treturn x.IsTab\n\t}\n\treturn false\n}\n\nfunc (x *BrandRequest) GetSort() int32 {\n\tif x != nil {\n\t\treturn x.Sort\n\t}\n\treturn 0\n}\n\ntype BrandInfoResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId    int32  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName  string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tLogo  string `protobuf:\"bytes,3,opt,name=logo,proto3\" json:\"logo,omitempty\"`\n\tDesc  string `protobuf:\"bytes,4,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\tIsTab bool   `protobuf:\"varint,5,opt,name=isTab,proto3\" json:\"isTab,omitempty\"`\n\tSort  int32  `protobuf:\"varint,6,opt,name=sort,proto3\" json:\"sort,omitempty\"`\n}\n\nfunc (x *BrandInfoResponse) Reset() {\n\t*x = BrandInfoResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_goods_v1_goods_proto_msgTypes[26]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *BrandInfoResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*BrandInfoResponse) ProtoMessage() {}\n\nfunc (x *BrandInfoResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_goods_v1_goods_proto_msgTypes[26]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use BrandInfoResponse.ProtoReflect.Descriptor instead.\nfunc (*BrandInfoResponse) Descriptor() ([]byte, []int) {\n\treturn file_goods_v1_goods_proto_rawDescGZIP(), []int{26}\n}\n\nfunc (x *BrandInfoResponse) GetId() int32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *BrandInfoResponse) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *BrandInfoResponse) GetLogo() string {\n\tif x != nil {\n\t\treturn x.Logo\n\t}\n\treturn \"\"\n}\n\nfunc (x *BrandInfoResponse) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *BrandInfoResponse) GetIsTab() bool {\n\tif x != nil {\n\t\treturn x.IsTab\n\t}\n\treturn false\n}\n\nfunc (x *BrandInfoResponse) GetSort() int32 {\n\tif x != nil {\n\t\treturn x.Sort\n\t}\n\treturn 0\n}\n\ntype BrandListResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tTotal int32                `protobuf:\"varint,1,opt,name=total,proto3\" json:\"total,omitempty\"`\n\tData  []*BrandInfoResponse `protobuf:\"bytes,2,rep,name=data,proto3\" json:\"data,omitempty\"`\n}\n\nfunc (x *BrandListResponse) Reset() {\n\t*x = BrandListResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_goods_v1_goods_proto_msgTypes[27]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *BrandListResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*BrandListResponse) ProtoMessage() {}\n\nfunc (x *BrandListResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_goods_v1_goods_proto_msgTypes[27]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use BrandListResponse.ProtoReflect.Descriptor instead.\nfunc (*BrandListResponse) Descriptor() ([]byte, []int) {\n\treturn file_goods_v1_goods_proto_rawDescGZIP(), []int{27}\n}\n\nfunc (x *BrandListResponse) GetTotal() int32 {\n\tif x != nil {\n\t\treturn x.Total\n\t}\n\treturn 0\n}\n\nfunc (x *BrandListResponse) GetData() []*BrandInfoResponse {\n\tif x != nil {\n\t\treturn x.Data\n\t}\n\treturn nil\n}\n\n// 根据商品类型 选择商品规格信息并选择\n// 商品 sku 属性值 里面有规格的ID和属性的ID，分别是几组信息\ntype CreateGoodsRequestGoodsSku struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId                int64                                      `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tGoodsId           int64                                      `protobuf:\"varint,2,opt,name=goodsId,proto3\" json:\"goodsId,omitempty\"`\n\tSkuName           string                                     `protobuf:\"bytes,3,opt,name=skuName,proto3\" json:\"skuName,omitempty\"`\n\tCode              string                                     `protobuf:\"bytes,4,opt,name=code,proto3\" json:\"code,omitempty\"`\n\tBarCode           string                                     `protobuf:\"bytes,5,opt,name=barCode,proto3\" json:\"barCode,omitempty\"`\n\tPrice             int64                                      `protobuf:\"varint,6,opt,name=price,proto3\" json:\"price,omitempty\"`\n\tPromotionPrice    int64                                      `protobuf:\"varint,7,opt,name=promotionPrice,proto3\" json:\"promotionPrice,omitempty\"`\n\tPoints            int64                                      `protobuf:\"varint,8,opt,name=points,proto3\" json:\"points,omitempty\"`\n\tImage             string                                     `protobuf:\"bytes,9,opt,name=image,proto3\" json:\"image,omitempty\"`\n\tSort              int32                                      `protobuf:\"varint,10,opt,name=sort,proto3\" json:\"sort,omitempty\"`\n\tInventory         int64                                      `protobuf:\"varint,11,opt,name=inventory,proto3\" json:\"inventory,omitempty\"` // sku 库存\n\tSpecificationInfo []*CreateGoodsRequestGoodsSkuSpecification `protobuf:\"bytes,12,rep,name=specificationInfo,proto3\" json:\"specificationInfo,omitempty\"`\n\tGroupAttrInfo     []*CreateGoodsRequestGoodsSkuGroupAttr     `protobuf:\"bytes,13,rep,name=groupAttrInfo,proto3\" json:\"groupAttrInfo,omitempty\"`\n}\n\nfunc (x *CreateGoodsRequestGoodsSku) Reset() {\n\t*x = CreateGoodsRequestGoodsSku{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_goods_v1_goods_proto_msgTypes[28]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CreateGoodsRequestGoodsSku) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreateGoodsRequestGoodsSku) ProtoMessage() {}\n\nfunc (x *CreateGoodsRequestGoodsSku) ProtoReflect() protoreflect.Message {\n\tmi := &file_goods_v1_goods_proto_msgTypes[28]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreateGoodsRequestGoodsSku.ProtoReflect.Descriptor instead.\nfunc (*CreateGoodsRequestGoodsSku) Descriptor() ([]byte, []int) {\n\treturn file_goods_v1_goods_proto_rawDescGZIP(), []int{12, 0}\n}\n\nfunc (x *CreateGoodsRequestGoodsSku) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *CreateGoodsRequestGoodsSku) GetGoodsId() int64 {\n\tif x != nil {\n\t\treturn x.GoodsId\n\t}\n\treturn 0\n}\n\nfunc (x *CreateGoodsRequestGoodsSku) GetSkuName() string {\n\tif x != nil {\n\t\treturn x.SkuName\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateGoodsRequestGoodsSku) GetCode() string {\n\tif x != nil {\n\t\treturn x.Code\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateGoodsRequestGoodsSku) GetBarCode() string {\n\tif x != nil {\n\t\treturn x.BarCode\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateGoodsRequestGoodsSku) GetPrice() int64 {\n\tif x != nil {\n\t\treturn x.Price\n\t}\n\treturn 0\n}\n\nfunc (x *CreateGoodsRequestGoodsSku) GetPromotionPrice() int64 {\n\tif x != nil {\n\t\treturn x.PromotionPrice\n\t}\n\treturn 0\n}\n\nfunc (x *CreateGoodsRequestGoodsSku) GetPoints() int64 {\n\tif x != nil {\n\t\treturn x.Points\n\t}\n\treturn 0\n}\n\nfunc (x *CreateGoodsRequestGoodsSku) GetImage() string {\n\tif x != nil {\n\t\treturn x.Image\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateGoodsRequestGoodsSku) GetSort() int32 {\n\tif x != nil {\n\t\treturn x.Sort\n\t}\n\treturn 0\n}\n\nfunc (x *CreateGoodsRequestGoodsSku) GetInventory() int64 {\n\tif x != nil {\n\t\treturn x.Inventory\n\t}\n\treturn 0\n}\n\nfunc (x *CreateGoodsRequestGoodsSku) GetSpecificationInfo() []*CreateGoodsRequestGoodsSkuSpecification {\n\tif x != nil {\n\t\treturn x.SpecificationInfo\n\t}\n\treturn nil\n}\n\nfunc (x *CreateGoodsRequestGoodsSku) GetGroupAttrInfo() []*CreateGoodsRequestGoodsSkuGroupAttr {\n\tif x != nil {\n\t\treturn x.GroupAttrInfo\n\t}\n\treturn nil\n}\n\n// 规格\ntype CreateGoodsRequestGoodsSkuSpecification struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tSId int64 `protobuf:\"varint,1,opt,name=sId,proto3\" json:\"sId,omitempty\"`\n\tVId int64 `protobuf:\"varint,2,opt,name=vId,proto3\" json:\"vId,omitempty\"`\n}\n\nfunc (x *CreateGoodsRequestGoodsSkuSpecification) Reset() {\n\t*x = CreateGoodsRequestGoodsSkuSpecification{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_goods_v1_goods_proto_msgTypes[29]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CreateGoodsRequestGoodsSkuSpecification) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreateGoodsRequestGoodsSkuSpecification) ProtoMessage() {}\n\nfunc (x *CreateGoodsRequestGoodsSkuSpecification) ProtoReflect() protoreflect.Message {\n\tmi := &file_goods_v1_goods_proto_msgTypes[29]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreateGoodsRequestGoodsSkuSpecification.ProtoReflect.Descriptor instead.\nfunc (*CreateGoodsRequestGoodsSkuSpecification) Descriptor() ([]byte, []int) {\n\treturn file_goods_v1_goods_proto_rawDescGZIP(), []int{12, 0, 0}\n}\n\nfunc (x *CreateGoodsRequestGoodsSkuSpecification) GetSId() int64 {\n\tif x != nil {\n\t\treturn x.SId\n\t}\n\treturn 0\n}\n\nfunc (x *CreateGoodsRequestGoodsSkuSpecification) GetVId() int64 {\n\tif x != nil {\n\t\treturn x.VId\n\t}\n\treturn 0\n}\n\n// 属性组\ntype CreateGoodsRequestGoodsSkuGroupAttr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tGroupId   int64                                      `protobuf:\"varint,1,opt,name=groupId,proto3\" json:\"groupId,omitempty\"`\n\tGroupName string                                     `protobuf:\"bytes,2,opt,name=groupName,proto3\" json:\"groupName,omitempty\"`\n\tAttrInfo  []*CreateGoodsRequestGoodsSkuGroupAttrAttr `protobuf:\"bytes,3,rep,name=attrInfo,proto3\" json:\"attrInfo,omitempty\"`\n}\n\nfunc (x *CreateGoodsRequestGoodsSkuGroupAttr) Reset() {\n\t*x = CreateGoodsRequestGoodsSkuGroupAttr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_goods_v1_goods_proto_msgTypes[30]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CreateGoodsRequestGoodsSkuGroupAttr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreateGoodsRequestGoodsSkuGroupAttr) ProtoMessage() {}\n\nfunc (x *CreateGoodsRequestGoodsSkuGroupAttr) ProtoReflect() protoreflect.Message {\n\tmi := &file_goods_v1_goods_proto_msgTypes[30]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreateGoodsRequestGoodsSkuGroupAttr.ProtoReflect.Descriptor instead.\nfunc (*CreateGoodsRequestGoodsSkuGroupAttr) Descriptor() ([]byte, []int) {\n\treturn file_goods_v1_goods_proto_rawDescGZIP(), []int{12, 0, 1}\n}\n\nfunc (x *CreateGoodsRequestGoodsSkuGroupAttr) GetGroupId() int64 {\n\tif x != nil {\n\t\treturn x.GroupId\n\t}\n\treturn 0\n}\n\nfunc (x *CreateGoodsRequestGoodsSkuGroupAttr) GetGroupName() string {\n\tif x != nil {\n\t\treturn x.GroupName\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateGoodsRequestGoodsSkuGroupAttr) GetAttrInfo() []*CreateGoodsRequestGoodsSkuGroupAttrAttr {\n\tif x != nil {\n\t\treturn x.AttrInfo\n\t}\n\treturn nil\n}\n\ntype CreateGoodsRequestGoodsSkuGroupAttrAttr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tAttrId        int64  `protobuf:\"varint,1,opt,name=attrId,proto3\" json:\"attrId,omitempty\"`\n\tAttrName      string `protobuf:\"bytes,2,opt,name=attrName,proto3\" json:\"attrName,omitempty\"`\n\tAttrValueId   int64  `protobuf:\"varint,3,opt,name=attrValueId,proto3\" json:\"attrValueId,omitempty\"`\n\tAttrValueName string `protobuf:\"bytes,4,opt,name=attrValueName,proto3\" json:\"attrValueName,omitempty\"`\n}\n\nfunc (x *CreateGoodsRequestGoodsSkuGroupAttrAttr) Reset() {\n\t*x = CreateGoodsRequestGoodsSkuGroupAttrAttr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_goods_v1_goods_proto_msgTypes[31]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CreateGoodsRequestGoodsSkuGroupAttrAttr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreateGoodsRequestGoodsSkuGroupAttrAttr) ProtoMessage() {}\n\nfunc (x *CreateGoodsRequestGoodsSkuGroupAttrAttr) ProtoReflect() protoreflect.Message {\n\tmi := &file_goods_v1_goods_proto_msgTypes[31]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreateGoodsRequestGoodsSkuGroupAttrAttr.ProtoReflect.Descriptor instead.\nfunc (*CreateGoodsRequestGoodsSkuGroupAttrAttr) Descriptor() ([]byte, []int) {\n\treturn file_goods_v1_goods_proto_rawDescGZIP(), []int{12, 0, 1, 0}\n}\n\nfunc (x *CreateGoodsRequestGoodsSkuGroupAttrAttr) GetAttrId() int64 {\n\tif x != nil {\n\t\treturn x.AttrId\n\t}\n\treturn 0\n}\n\nfunc (x *CreateGoodsRequestGoodsSkuGroupAttrAttr) GetAttrName() string {\n\tif x != nil {\n\t\treturn x.AttrName\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateGoodsRequestGoodsSkuGroupAttrAttr) GetAttrValueId() int64 {\n\tif x != nil {\n\t\treturn x.AttrValueId\n\t}\n\treturn 0\n}\n\nfunc (x *CreateGoodsRequestGoodsSkuGroupAttrAttr) GetAttrValueName() string {\n\tif x != nil {\n\t\treturn x.AttrValueName\n\t}\n\treturn \"\"\n}\n\nvar File_goods_v1_goods_proto protoreflect.FileDescriptor\n\nvar file_goods_v1_goods_proto_rawDesc = []byte{\n\t0x0a, 0x14, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x6f, 0x6f, 0x64, 0x73,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31,\n\t0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76,\n\t0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x7c, 0x0a, 0x10, 0x41, 0x74, 0x74, 0x72, 0x56, 0x61,\n\t0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x74,\n\t0x74, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x61, 0x74, 0x74, 0x72,\n\t0x49, 0x64, 0x12, 0x21, 0x0a, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x28, 0x01, 0x52, 0x07, 0x67, 0x72,\n\t0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04,\n\t0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x03, 0x52, 0x05, 0x76,\n\t0x61, 0x6c, 0x75, 0x65, 0x22, 0x83, 0x02, 0x0a, 0x0b, 0x41, 0x74, 0x74, 0x72, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03,\n\t0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x06, 0x74, 0x79, 0x70, 0x65, 0x49, 0x64, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x28, 0x01, 0x52, 0x06, 0x74,\n\t0x79, 0x70, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x28, 0x01, 0x52,\n\t0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c,\n\t0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01,\n\t0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18,\n\t0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x73,\n\t0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x74, 0x61,\n\t0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28,\n\t0x05, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x1a, 0x02, 0x28, 0x01, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74,\n\t0x12, 0x38, 0x0a, 0x09, 0x61, 0x74, 0x74, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x08, 0x20,\n\t0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41,\n\t0x74, 0x74, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52,\n\t0x09, 0x61, 0x74, 0x74, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x6b, 0x0a, 0x11, 0x41, 0x74,\n\t0x74, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,\n\t0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12,\n\t0x16, 0x0a, 0x06, 0x61, 0x74, 0x74, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52,\n\t0x06, 0x61, 0x74, 0x74, 0x72, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70,\n\t0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49,\n\t0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xe1, 0x01, 0x0a, 0x0c, 0x41, 0x74, 0x74, 0x72,\n\t0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x79, 0x70, 0x65,\n\t0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x74, 0x79, 0x70, 0x65, 0x49, 0x64,\n\t0x12, 0x18, 0x0a, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x03, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69,\n\t0x74, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65,\n\t0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,\n\t0x64, 0x65, 0x73, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06,\n\t0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04,\n\t0x73, 0x6f, 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74,\n\t0x12, 0x39, 0x0a, 0x09, 0x61, 0x74, 0x74, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x08, 0x20,\n\t0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41,\n\t0x74, 0x74, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x52, 0x09, 0x61, 0x74, 0x74, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xab, 0x01, 0x0a, 0x10,\n\t0x41, 0x74, 0x74, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64,\n\t0x12, 0x1f, 0x0a, 0x06, 0x74, 0x79, 0x70, 0x65, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03,\n\t0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x28, 0x01, 0x52, 0x06, 0x74, 0x79, 0x70, 0x65, 0x49,\n\t0x64, 0x12, 0x1d, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x03, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65,\n\t0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,\n\t0x64, 0x65, 0x73, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05,\n\t0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x04,\n\t0x73, 0x6f, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x1a,\n\t0x02, 0x28, 0x01, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x22, 0x91, 0x01, 0x0a, 0x11, 0x41, 0x74,\n\t0x74, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,\n\t0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12,\n\t0x16, 0x0a, 0x06, 0x74, 0x79, 0x70, 0x65, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52,\n\t0x06, 0x74, 0x79, 0x70, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x12, 0x0a,\n\t0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x73,\n\t0x63, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28,\n\t0x08, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6f, 0x72,\n\t0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x22, 0x78, 0x0a,\n\t0x12, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61,\n\t0x6c, 0x75, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52,\n\t0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x74, 0x74, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x03, 0x52, 0x06, 0x61, 0x74, 0x74, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x05, 0x76,\n\t0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72,\n\t0x02, 0x10, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1b, 0x0a, 0x04, 0x73, 0x6f,\n\t0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x1a, 0x02, 0x28,\n\t0x01, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x22, 0x6e, 0x0a, 0x1a, 0x53, 0x70, 0x65, 0x63, 0x69,\n\t0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73,\n\t0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x74, 0x74, 0x72, 0x49, 0x64, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x61, 0x74, 0x74, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a,\n\t0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61,\n\t0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28,\n\t0x05, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x22, 0x99, 0x02, 0x0a, 0x14, 0x53, 0x70, 0x65, 0x63,\n\t0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64,\n\t0x12, 0x1f, 0x0a, 0x06, 0x74, 0x79, 0x70, 0x65, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03,\n\t0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x28, 0x01, 0x52, 0x06, 0x74, 0x79, 0x70, 0x65, 0x49,\n\t0x64, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42,\n\t0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x02, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b,\n\t0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, 0xfa, 0x42,\n\t0x04, 0x1a, 0x02, 0x28, 0x01, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73,\n\t0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x74, 0x61,\n\t0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x73, 0x53, 0x6b, 0x75, 0x18, 0x06, 0x20, 0x01,\n\t0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x53, 0x6b, 0x75, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x53,\n\t0x65, 0x6c, 0x65, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x53,\n\t0x65, 0x6c, 0x65, 0x63, 0x74, 0x12, 0x4c, 0x0a, 0x12, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69,\n\t0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x08, 0x20, 0x03, 0x28,\n\t0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x65,\n\t0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52,\n\t0x12, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61,\n\t0x6c, 0x75, 0x65, 0x22, 0x27, 0x0a, 0x15, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02,\n\t0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x22, 0xed, 0x01, 0x0a,\n\t0x10, 0x47, 0x6f, 0x6f, 0x64, 0x73, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,\n\t0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69,\n\t0x64, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42,\n\t0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x03, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x23,\n\t0x0a, 0x08, 0x74, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x03, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x43,\n\t0x6f, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x41, 0x6c, 0x69, 0x61, 0x73,\n\t0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x41, 0x6c, 0x69, 0x61,\n\t0x73, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x73, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x18, 0x05,\n\t0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x12,\n\t0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64,\n\t0x65, 0x73, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28,\n\t0x05, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x12, 0x23, 0x0a, 0x08, 0x62, 0x72, 0x61, 0x6e, 0x64,\n\t0x49, 0x64, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02,\n\t0x10, 0x01, 0x52, 0x08, 0x62, 0x72, 0x61, 0x6e, 0x64, 0x49, 0x64, 0x73, 0x22, 0x23, 0x0a, 0x11,\n\t0x47, 0x6f, 0x6f, 0x64, 0x73, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,\n\t0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69,\n\t0x64, 0x22, 0xf0, 0x0b, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x6f, 0x6f, 0x64,\n\t0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x27, 0x0a, 0x0a, 0x63, 0x61, 0x74, 0x65,\n\t0x67, 0x6f, 0x72, 0x79, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, 0xfa, 0x42,\n\t0x04, 0x1a, 0x02, 0x28, 0x01, 0x52, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x49,\n\t0x64, 0x12, 0x21, 0x0a, 0x07, 0x62, 0x72, 0x61, 0x6e, 0x64, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x05, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x1a, 0x02, 0x28, 0x01, 0x52, 0x07, 0x62, 0x72, 0x61,\n\t0x6e, 0x64, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x06, 0x74, 0x79, 0x70, 0x65, 0x49, 0x64, 0x18, 0x04,\n\t0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x28, 0x01, 0x52, 0x06, 0x74,\n\t0x79, 0x70, 0x65, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d,\n\t0x65, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61,\n\t0x6d, 0x65, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x67, 0x6f, 0x6f, 0x64, 0x73,\n\t0x54, 0x61, 0x67, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x6f, 0x6f, 0x64,\n\t0x73, 0x54, 0x61, 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x53, 0x6e,\n\t0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x53, 0x6e, 0x12,\n\t0x1c, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x70, 0x50, 0x72, 0x69, 0x63, 0x65, 0x18, 0x09, 0x20, 0x01,\n\t0x28, 0x03, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x70, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x20, 0x0a,\n\t0x0b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x18, 0x0a, 0x20, 0x01,\n\t0x28, 0x03, 0x52, 0x0b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12,\n\t0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x0b, 0x20, 0x01,\n\t0x28, 0x03, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1e, 0x0a,\n\t0x0a, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x42, 0x72, 0x69, 0x65, 0x66, 0x18, 0x0c, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x0a, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x42, 0x72, 0x69, 0x65, 0x66, 0x12, 0x28, 0x0a,\n\t0x0f, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x46, 0x72, 0x6f, 0x6e, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65,\n\t0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x46, 0x72, 0x6f,\n\t0x6e, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x67, 0x6f, 0x6f, 0x64, 0x73,\n\t0x49, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x67, 0x6f,\n\t0x6f, 0x64, 0x73, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x68, 0x69,\n\t0x70, 0x46, 0x72, 0x65, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x73, 0x68, 0x69,\n\t0x70, 0x46, 0x72, 0x65, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x69, 0x70, 0x49, 0x64, 0x18,\n\t0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x73, 0x68, 0x69, 0x70, 0x49, 0x64, 0x12, 0x14, 0x0a,\n\t0x05, 0x69, 0x73, 0x4e, 0x65, 0x77, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73,\n\t0x4e, 0x65, 0x77, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x73, 0x48, 0x6f, 0x74, 0x18, 0x12, 0x20, 0x01,\n\t0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x48, 0x6f, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x6e, 0x53,\n\t0x61, 0x6c, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6f, 0x6e, 0x53, 0x61, 0x6c,\n\t0x65, 0x12, 0x37, 0x0a, 0x03, 0x73, 0x6b, 0x75, 0x18, 0x14, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,\n\t0x47, 0x6f, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x64, 0x73, 0x53, 0x6b, 0x75, 0x52, 0x03, 0x73, 0x6b, 0x75, 0x1a, 0xf7, 0x06, 0x0a, 0x08, 0x67,\n\t0x6f, 0x6f, 0x64, 0x73, 0x53, 0x6b, 0x75, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x67, 0x6f, 0x6f, 0x64, 0x73,\n\t0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x49,\n\t0x64, 0x12, 0x21, 0x0a, 0x07, 0x73, 0x6b, 0x75, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x73, 0x6b, 0x75,\n\t0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01,\n\t0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x63, 0x6f, 0x64,\n\t0x65, 0x12, 0x21, 0x0a, 0x07, 0x62, 0x61, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01,\n\t0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x62, 0x61, 0x72,\n\t0x43, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x06, 0x20,\n\t0x01, 0x28, 0x03, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x70, 0x72,\n\t0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01,\n\t0x28, 0x03, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x69,\n\t0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x08, 0x20, 0x01,\n\t0x28, 0x03, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d,\n\t0x61, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65,\n\t0x12, 0x12, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04,\n\t0x73, 0x6f, 0x72, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72,\n\t0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f,\n\t0x72, 0x79, 0x12, 0x61, 0x0a, 0x11, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47,\n\t0x6f, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x67, 0x6f, 0x6f, 0x64,\n\t0x73, 0x53, 0x6b, 0x75, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x52, 0x11, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x55, 0x0a, 0x0d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x74,\n\t0x74, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x6f,\n\t0x6f, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73,\n\t0x53, 0x6b, 0x75, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x74, 0x74, 0x72, 0x52, 0x0d, 0x67,\n\t0x72, 0x6f, 0x75, 0x70, 0x41, 0x74, 0x74, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0x45, 0x0a, 0x0d,\n\t0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a,\n\t0x03, 0x73, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22,\n\t0x02, 0x28, 0x01, 0x52, 0x03, 0x73, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x03, 0x76, 0x49, 0x64, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x28, 0x01, 0x52, 0x03,\n\t0x76, 0x49, 0x64, 0x1a, 0xbe, 0x02, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x74, 0x74,\n\t0x72, 0x12, 0x18, 0x0a, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x03, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x67,\n\t0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09,\n\t0x67, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x50, 0x0a, 0x08, 0x61, 0x74, 0x74,\n\t0x72, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x6f, 0x6f,\n\t0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x53,\n\t0x6b, 0x75, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x74, 0x74, 0x72, 0x2e, 0x61, 0x74, 0x74,\n\t0x72, 0x52, 0x08, 0x61, 0x74, 0x74, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0xa6, 0x01, 0x0a, 0x04,\n\t0x61, 0x74, 0x74, 0x72, 0x12, 0x1f, 0x0a, 0x06, 0x61, 0x74, 0x74, 0x72, 0x49, 0x64, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x28, 0x01, 0x52, 0x06, 0x61,\n\t0x74, 0x74, 0x72, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x08, 0x61, 0x74, 0x74, 0x72, 0x4e, 0x61, 0x6d,\n\t0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01,\n\t0x52, 0x08, 0x61, 0x74, 0x74, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x0b, 0x61, 0x74,\n\t0x74, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42,\n\t0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x28, 0x01, 0x52, 0x0b, 0x61, 0x74, 0x74, 0x72, 0x56, 0x61,\n\t0x6c, 0x75, 0x65, 0x49, 0x64, 0x12, 0x2d, 0x0a, 0x0d, 0x61, 0x74, 0x74, 0x72, 0x56, 0x61, 0x6c,\n\t0x75, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42,\n\t0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0d, 0x61, 0x74, 0x74, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65,\n\t0x4e, 0x61, 0x6d, 0x65, 0x22, 0x25, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x6f,\n\t0x6f, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x49,\n\t0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x49, 0x44, 0x22, 0xd3, 0x03, 0x0a, 0x11,\n\t0x47, 0x6f, 0x6f, 0x64, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,\n\t0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69,\n\t0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x49, 0x64, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x49,\n\t0x64, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x72, 0x61, 0x6e, 0x64, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x05, 0x52, 0x07, 0x62, 0x72, 0x61, 0x6e, 0x64, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,\n\t0x18, 0x0a, 0x07, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x53, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x07, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x53, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6c, 0x69,\n\t0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x63, 0x6c, 0x69,\n\t0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x6f, 0x6c, 0x64, 0x4e, 0x75, 0x6d,\n\t0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x73, 0x6f, 0x6c, 0x64, 0x4e, 0x75, 0x6d, 0x12,\n\t0x16, 0x0a, 0x06, 0x66, 0x61, 0x76, 0x4e, 0x75, 0x6d, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52,\n\t0x06, 0x66, 0x61, 0x76, 0x4e, 0x75, 0x6d, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x72, 0x6b, 0x65,\n\t0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x6d, 0x61,\n\t0x72, 0x6b, 0x65, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x67, 0x6f, 0x6f,\n\t0x64, 0x73, 0x42, 0x72, 0x69, 0x65, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x67,\n\t0x6f, 0x6f, 0x64, 0x73, 0x42, 0x72, 0x69, 0x65, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x67, 0x6f, 0x6f,\n\t0x64, 0x73, 0x44, 0x65, 0x73, 0x63, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x6f,\n\t0x6f, 0x64, 0x73, 0x44, 0x65, 0x73, 0x63, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x68, 0x69, 0x70, 0x46,\n\t0x72, 0x65, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x73, 0x68, 0x69, 0x70, 0x46,\n\t0x72, 0x65, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x18, 0x0d, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x67,\n\t0x6f, 0x6f, 0x64, 0x73, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09,\n\t0x52, 0x0b, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x12, 0x14, 0x0a,\n\t0x05, 0x69, 0x73, 0x4e, 0x65, 0x77, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73,\n\t0x4e, 0x65, 0x77, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x73, 0x48, 0x6f, 0x74, 0x18, 0x10, 0x20, 0x01,\n\t0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x48, 0x6f, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x6e, 0x53,\n\t0x61, 0x6c, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6f, 0x6e, 0x53, 0x61, 0x6c,\n\t0x65, 0x22, 0x5a, 0x0a, 0x11, 0x47, 0x6f, 0x6f, 0x64, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65,\n\t0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x2f, 0x0a, 0x04,\n\t0x6c, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x6f, 0x6f, 0x64, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52,\n\t0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x22, 0xfa, 0x02,\n\t0x0a, 0x12, 0x47, 0x6f, 0x6f, 0x64, 0x73, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73,\n\t0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x49, 0x64, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x49, 0x64,\n\t0x12, 0x18, 0x0a, 0x07, 0x62, 0x72, 0x61, 0x6e, 0x64, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x05, 0x52, 0x07, 0x62, 0x72, 0x61, 0x6e, 0x64, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x69,\n\t0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x69,\n\t0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x50, 0x72, 0x69,\n\t0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x50, 0x72, 0x69,\n\t0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x73, 0x48, 0x6f, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28,\n\t0x08, 0x52, 0x05, 0x69, 0x73, 0x48, 0x6f, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x73, 0x4e, 0x65,\n\t0x77, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x4e, 0x65, 0x77, 0x12, 0x14,\n\t0x0a, 0x05, 0x69, 0x73, 0x54, 0x61, 0x62, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69,\n\t0x73, 0x54, 0x61, 0x62, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x4e, 0x75, 0x6d,\n\t0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x4e, 0x75, 0x6d,\n\t0x12, 0x18, 0x0a, 0x07, 0x73, 0x6f, 0x6c, 0x64, 0x4e, 0x75, 0x6d, 0x18, 0x0a, 0x20, 0x01, 0x28,\n\t0x03, 0x52, 0x07, 0x73, 0x6f, 0x6c, 0x64, 0x4e, 0x75, 0x6d, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x61,\n\t0x76, 0x4e, 0x75, 0x6d, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x66, 0x61, 0x76, 0x4e,\n\t0x75, 0x6d, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x67, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28,\n\t0x03, 0x52, 0x05, 0x70, 0x61, 0x67, 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x67, 0x65,\n\t0x50, 0x65, 0x72, 0x4e, 0x75, 0x6d, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x70,\n\t0x61, 0x67, 0x65, 0x50, 0x65, 0x72, 0x4e, 0x75, 0x6d, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,\n\t0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x22, 0xa2, 0x01, 0x0a, 0x14, 0x43,\n\t0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f,\n\t0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52,\n\t0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x70, 0x61, 0x72, 0x65, 0x6e,\n\t0x74, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52,\n\t0x0e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12,\n\t0x14, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05,\n\t0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x73, 0x54, 0x61, 0x62, 0x18, 0x05,\n\t0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x54, 0x61, 0x62, 0x12, 0x12, 0x0a, 0x04, 0x73,\n\t0x6f, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x22,\n\t0x32, 0x0a, 0x14, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52,\n\t0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6a, 0x73, 0x6f, 0x6e, 0x44,\n\t0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6a, 0x73, 0x6f, 0x6e, 0x44,\n\t0x61, 0x74, 0x61, 0x22, 0x3b, 0x0a, 0x13, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x4c,\n\t0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x65,\n\t0x76, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c,\n\t0x22, 0x8f, 0x01, 0x0a, 0x17, 0x53, 0x75, 0x62, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79,\n\t0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x04,\n\t0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x49, 0x6e,\n\t0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f,\n\t0x12, 0x40, 0x0a, 0x0b, 0x73, 0x75, 0x62, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18,\n\t0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31,\n\t0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73,\n\t0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0b, 0x73, 0x75, 0x62, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f,\n\t0x72, 0x79, 0x22, 0xa1, 0x01, 0x0a, 0x13, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x49,\n\t0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x26,\n\t0x0a, 0x0e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x61,\n\t0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18,\n\t0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x14, 0x0a, 0x05,\n\t0x69, 0x73, 0x54, 0x61, 0x62, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x54,\n\t0x61, 0x62, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05,\n\t0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x22, 0x66, 0x0a, 0x18, 0x42, 0x61, 0x74, 0x63, 0x68, 0x43,\n\t0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65,\n\t0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, 0x52, 0x02,\n\t0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x4e, 0x75, 0x6d, 0x73, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x4e, 0x75, 0x6d, 0x73,\n\t0x12, 0x1c, 0x0a, 0x09, 0x62, 0x72, 0x61, 0x6e, 0x64, 0x4e, 0x75, 0x6d, 0x73, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x05, 0x52, 0x09, 0x62, 0x72, 0x61, 0x6e, 0x64, 0x4e, 0x75, 0x6d, 0x73, 0x22, 0x27,\n\t0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79,\n\t0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x22, 0x4a, 0x0a, 0x10, 0x42, 0x72, 0x61, 0x6e, 0x64,\n\t0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70,\n\t0x61, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x70, 0x61, 0x67, 0x65,\n\t0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x67, 0x65, 0x50, 0x65, 0x72, 0x4e, 0x75, 0x6d, 0x73,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x70, 0x61, 0x67, 0x65, 0x50, 0x65, 0x72, 0x4e,\n\t0x75, 0x6d, 0x73, 0x22, 0x84, 0x01, 0x0a, 0x0c, 0x42, 0x72, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05,\n\t0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x6f,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x6f, 0x12, 0x12, 0x0a, 0x04,\n\t0x64, 0x65, 0x73, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63,\n\t0x12, 0x14, 0x0a, 0x05, 0x69, 0x73, 0x54, 0x61, 0x62, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52,\n\t0x05, 0x69, 0x73, 0x54, 0x61, 0x62, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18, 0x06,\n\t0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x22, 0x89, 0x01, 0x0a, 0x11, 0x42,\n\t0x72, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64,\n\t0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x6f, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63,\n\t0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x14, 0x0a, 0x05,\n\t0x69, 0x73, 0x54, 0x61, 0x62, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x54,\n\t0x61, 0x62, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05,\n\t0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x22, 0x5a, 0x0a, 0x11, 0x42, 0x72, 0x61, 0x6e, 0x64, 0x4c,\n\t0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74,\n\t0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61,\n\t0x6c, 0x12, 0x2f, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x72, 0x61, 0x6e, 0x64,\n\t0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x04, 0x64, 0x61,\n\t0x74, 0x61, 0x32, 0xa6, 0x09, 0x0a, 0x05, 0x47, 0x6f, 0x6f, 0x64, 0x73, 0x12, 0x4c, 0x0a, 0x12,\n\t0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x4c, 0x69,\n\t0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1e, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x4c, 0x69,\n\t0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x0e, 0x47, 0x65,\n\t0x74, 0x53, 0x75, 0x62, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79,\n\t0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f,\n\t0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f,\n\t0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79,\n\t0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x74, 0x65,\n\t0x67, 0x6f, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,\n\t0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67,\n\t0x6f, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,\n\t0x49, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72,\n\t0x79, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c,\n\t0x65, 0x74, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65,\n\t0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x47, 0x0a, 0x0e, 0x55, 0x70,\n\t0x64, 0x61, 0x74, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79,\n\t0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d,\n\t0x70, 0x74, 0x79, 0x12, 0x44, 0x0a, 0x09, 0x42, 0x72, 0x61, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74,\n\t0x12, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x72, 0x61, 0x6e,\n\t0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x72, 0x61, 0x6e, 0x64, 0x4c, 0x69, 0x73,\n\t0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0b, 0x43, 0x72, 0x65,\n\t0x61, 0x74, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x64, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73,\n\t0x2e, 0x76, 0x31, 0x2e, 0x42, 0x72, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x1a, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x72, 0x61, 0x6e,\n\t0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a,\n\t0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x64, 0x12, 0x16, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x72, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3d, 0x0a, 0x0b,\n\t0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x64, 0x12, 0x16, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x72, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75,\n\t0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x4a, 0x0a, 0x0f, 0x43,\n\t0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x6f, 0x6f, 0x64, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x6f, 0x6f, 0x64, 0x73, 0x54,\n\t0x79, 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x6f, 0x6f, 0x64, 0x73, 0x54, 0x79, 0x70, 0x65, 0x52,\n\t0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74,\n\t0x65, 0x47, 0x6f, 0x6f, 0x64, 0x73, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53,\n\t0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75,\n\t0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53,\n\t0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70,\n\t0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x74,\n\t0x74, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e,\n\t0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75,\n\t0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41,\n\t0x74, 0x74, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x12, 0x40, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x74, 0x74, 0x72, 0x56, 0x61,\n\t0x6c, 0x75, 0x65, 0x12, 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41,\n\t0x74, 0x74, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,\n\t0x73, 0x65, 0x12, 0x4a, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x6f, 0x6f, 0x64,\n\t0x73, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65,\n\t0x61, 0x74, 0x65, 0x47, 0x6f, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,\n\t0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74,\n\t0x65, 0x47, 0x6f, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43,\n\t0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x6f, 0x6f, 0x64, 0x73, 0x12, 0x1c, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47,\n\t0x6f, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d,\n\t0x70, 0x74, 0x79, 0x12, 0x46, 0x0a, 0x09, 0x47, 0x6f, 0x6f, 0x64, 0x73, 0x4c, 0x69, 0x73, 0x74,\n\t0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x6f, 0x6f, 0x64,\n\t0x73, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x6f, 0x6f, 0x64, 0x73, 0x4c,\n\t0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x17, 0x5a, 0x15, 0x67,\n\t0x6f, 0x6f, 0x64, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x2f, 0x76,\n\t0x31, 0x3b, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_goods_v1_goods_proto_rawDescOnce sync.Once\n\tfile_goods_v1_goods_proto_rawDescData = file_goods_v1_goods_proto_rawDesc\n)\n\nfunc file_goods_v1_goods_proto_rawDescGZIP() []byte {\n\tfile_goods_v1_goods_proto_rawDescOnce.Do(func() {\n\t\tfile_goods_v1_goods_proto_rawDescData = protoimpl.X.CompressGZIP(file_goods_v1_goods_proto_rawDescData)\n\t})\n\treturn file_goods_v1_goods_proto_rawDescData\n}\n\nvar file_goods_v1_goods_proto_msgTypes = make([]protoimpl.MessageInfo, 32)\nvar file_goods_v1_goods_proto_goTypes = []interface{}{\n\t(*AttrValueRequest)(nil),                        // 0: goods.v1.AttrValueRequest\n\t(*AttrRequest)(nil),                             // 1: goods.v1.AttrRequest\n\t(*AttrValueResponse)(nil),                       // 2: goods.v1.AttrValueResponse\n\t(*AttrResponse)(nil),                            // 3: goods.v1.AttrResponse\n\t(*AttrGroupRequest)(nil),                        // 4: goods.v1.AttrGroupRequest\n\t(*AttrGroupResponse)(nil),                       // 5: goods.v1.AttrGroupResponse\n\t(*SpecificationValue)(nil),                      // 6: goods.v1.SpecificationValue\n\t(*SpecificationValueResponse)(nil),              // 7: goods.v1.SpecificationValueResponse\n\t(*SpecificationRequest)(nil),                    // 8: goods.v1.SpecificationRequest\n\t(*SpecificationResponse)(nil),                   // 9: goods.v1.SpecificationResponse\n\t(*GoodsTypeRequest)(nil),                        // 10: goods.v1.GoodsTypeRequest\n\t(*GoodsTypeResponse)(nil),                       // 11: goods.v1.GoodsTypeResponse\n\t(*CreateGoodsRequest)(nil),                      // 12: goods.v1.CreateGoodsRequest\n\t(*CreateGoodsResponse)(nil),                     // 13: goods.v1.CreateGoodsResponse\n\t(*GoodsInfoResponse)(nil),                       // 14: goods.v1.GoodsInfoResponse\n\t(*GoodsListResponse)(nil),                       // 15: goods.v1.GoodsListResponse\n\t(*GoodsFilterRequest)(nil),                      // 16: goods.v1.GoodsFilterRequest\n\t(*CategoryInfoResponse)(nil),                    // 17: goods.v1.CategoryInfoResponse\n\t(*CategoryListResponse)(nil),                    // 18: goods.v1.CategoryListResponse\n\t(*CategoryListRequest)(nil),                     // 19: goods.v1.CategoryListRequest\n\t(*SubCategoryListResponse)(nil),                 // 20: goods.v1.SubCategoryListResponse\n\t(*CategoryInfoRequest)(nil),                     // 21: goods.v1.CategoryInfoRequest\n\t(*BatchCategoryInfoRequest)(nil),                // 22: goods.v1.BatchCategoryInfoRequest\n\t(*DeleteCategoryRequest)(nil),                   // 23: goods.v1.DeleteCategoryRequest\n\t(*BrandListRequest)(nil),                        // 24: goods.v1.BrandListRequest\n\t(*BrandRequest)(nil),                            // 25: goods.v1.BrandRequest\n\t(*BrandInfoResponse)(nil),                       // 26: goods.v1.BrandInfoResponse\n\t(*BrandListResponse)(nil),                       // 27: goods.v1.BrandListResponse\n\t(*CreateGoodsRequestGoodsSku)(nil),              // 28: goods.v1.CreateGoodsRequest.goodsSku\n\t(*CreateGoodsRequestGoodsSkuSpecification)(nil), // 29: goods.v1.CreateGoodsRequest.goodsSku.specification\n\t(*CreateGoodsRequestGoodsSkuGroupAttr)(nil),     // 30: goods.v1.CreateGoodsRequest.goodsSku.groupAttr\n\t(*CreateGoodsRequestGoodsSkuGroupAttrAttr)(nil), // 31: goods.v1.CreateGoodsRequest.goodsSku.groupAttr.attr\n\t(*emptypb.Empty)(nil),                           // 32: google.protobuf.Empty\n}\nvar file_goods_v1_goods_proto_depIdxs = []int32{\n\t0,  // 0: goods.v1.AttrRequest.attrValue:type_name -> goods.v1.AttrValueRequest\n\t2,  // 1: goods.v1.AttrResponse.attrValue:type_name -> goods.v1.AttrValueResponse\n\t6,  // 2: goods.v1.SpecificationRequest.specificationValue:type_name -> goods.v1.SpecificationValue\n\t28, // 3: goods.v1.CreateGoodsRequest.sku:type_name -> goods.v1.CreateGoodsRequest.goodsSku\n\t14, // 4: goods.v1.GoodsListResponse.list:type_name -> goods.v1.GoodsInfoResponse\n\t17, // 5: goods.v1.SubCategoryListResponse.info:type_name -> goods.v1.CategoryInfoResponse\n\t17, // 6: goods.v1.SubCategoryListResponse.subCategory:type_name -> goods.v1.CategoryInfoResponse\n\t26, // 7: goods.v1.BrandListResponse.data:type_name -> goods.v1.BrandInfoResponse\n\t29, // 8: goods.v1.CreateGoodsRequest.goodsSku.specificationInfo:type_name -> goods.v1.CreateGoodsRequest.goodsSku.specification\n\t30, // 9: goods.v1.CreateGoodsRequest.goodsSku.groupAttrInfo:type_name -> goods.v1.CreateGoodsRequest.goodsSku.groupAttr\n\t31, // 10: goods.v1.CreateGoodsRequest.goodsSku.groupAttr.attrInfo:type_name -> goods.v1.CreateGoodsRequest.goodsSku.groupAttr.attr\n\t32, // 11: goods.v1.Goods.GetAllCategoryList:input_type -> google.protobuf.Empty\n\t19, // 12: goods.v1.Goods.GetSubCategory:input_type -> goods.v1.CategoryListRequest\n\t21, // 13: goods.v1.Goods.CreateCategory:input_type -> goods.v1.CategoryInfoRequest\n\t23, // 14: goods.v1.Goods.DeleteCategory:input_type -> goods.v1.DeleteCategoryRequest\n\t21, // 15: goods.v1.Goods.UpdateCategory:input_type -> goods.v1.CategoryInfoRequest\n\t24, // 16: goods.v1.Goods.BrandList:input_type -> goods.v1.BrandListRequest\n\t25, // 17: goods.v1.Goods.CreateBrand:input_type -> goods.v1.BrandRequest\n\t25, // 18: goods.v1.Goods.DeleteBrand:input_type -> goods.v1.BrandRequest\n\t25, // 19: goods.v1.Goods.UpdateBrand:input_type -> goods.v1.BrandRequest\n\t10, // 20: goods.v1.Goods.CreateGoodsType:input_type -> goods.v1.GoodsTypeRequest\n\t8,  // 21: goods.v1.Goods.CreateGoodsSpecification:input_type -> goods.v1.SpecificationRequest\n\t4,  // 22: goods.v1.Goods.CreateAttrGroup:input_type -> goods.v1.AttrGroupRequest\n\t1,  // 23: goods.v1.Goods.CreateAttrValue:input_type -> goods.v1.AttrRequest\n\t12, // 24: goods.v1.Goods.CreateGoods:input_type -> goods.v1.CreateGoodsRequest\n\t12, // 25: goods.v1.Goods.UpdateGoods:input_type -> goods.v1.CreateGoodsRequest\n\t16, // 26: goods.v1.Goods.GoodsList:input_type -> goods.v1.GoodsFilterRequest\n\t18, // 27: goods.v1.Goods.GetAllCategoryList:output_type -> goods.v1.CategoryListResponse\n\t20, // 28: goods.v1.Goods.GetSubCategory:output_type -> goods.v1.SubCategoryListResponse\n\t17, // 29: goods.v1.Goods.CreateCategory:output_type -> goods.v1.CategoryInfoResponse\n\t32, // 30: goods.v1.Goods.DeleteCategory:output_type -> google.protobuf.Empty\n\t32, // 31: goods.v1.Goods.UpdateCategory:output_type -> google.protobuf.Empty\n\t27, // 32: goods.v1.Goods.BrandList:output_type -> goods.v1.BrandListResponse\n\t26, // 33: goods.v1.Goods.CreateBrand:output_type -> goods.v1.BrandInfoResponse\n\t32, // 34: goods.v1.Goods.DeleteBrand:output_type -> google.protobuf.Empty\n\t32, // 35: goods.v1.Goods.UpdateBrand:output_type -> google.protobuf.Empty\n\t11, // 36: goods.v1.Goods.CreateGoodsType:output_type -> goods.v1.GoodsTypeResponse\n\t9,  // 37: goods.v1.Goods.CreateGoodsSpecification:output_type -> goods.v1.SpecificationResponse\n\t5,  // 38: goods.v1.Goods.CreateAttrGroup:output_type -> goods.v1.AttrGroupResponse\n\t3,  // 39: goods.v1.Goods.CreateAttrValue:output_type -> goods.v1.AttrResponse\n\t13, // 40: goods.v1.Goods.CreateGoods:output_type -> goods.v1.CreateGoodsResponse\n\t32, // 41: goods.v1.Goods.UpdateGoods:output_type -> google.protobuf.Empty\n\t15, // 42: goods.v1.Goods.GoodsList:output_type -> goods.v1.GoodsListResponse\n\t27, // [27:43] is the sub-list for method output_type\n\t11, // [11:27] is the sub-list for method input_type\n\t11, // [11:11] is the sub-list for extension type_name\n\t11, // [11:11] is the sub-list for extension extendee\n\t0,  // [0:11] is the sub-list for field type_name\n}\n\nfunc init() { file_goods_v1_goods_proto_init() }\nfunc file_goods_v1_goods_proto_init() {\n\tif File_goods_v1_goods_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_goods_v1_goods_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AttrValueRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_goods_v1_goods_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AttrRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_goods_v1_goods_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AttrValueResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_goods_v1_goods_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AttrResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_goods_v1_goods_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AttrGroupRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_goods_v1_goods_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AttrGroupResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_goods_v1_goods_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SpecificationValue); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_goods_v1_goods_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SpecificationValueResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_goods_v1_goods_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SpecificationRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_goods_v1_goods_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SpecificationResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_goods_v1_goods_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GoodsTypeRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_goods_v1_goods_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GoodsTypeResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_goods_v1_goods_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CreateGoodsRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_goods_v1_goods_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CreateGoodsResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_goods_v1_goods_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GoodsInfoResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_goods_v1_goods_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GoodsListResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_goods_v1_goods_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GoodsFilterRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_goods_v1_goods_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CategoryInfoResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_goods_v1_goods_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CategoryListResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_goods_v1_goods_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CategoryListRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_goods_v1_goods_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SubCategoryListResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_goods_v1_goods_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CategoryInfoRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_goods_v1_goods_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*BatchCategoryInfoRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_goods_v1_goods_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*DeleteCategoryRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_goods_v1_goods_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*BrandListRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_goods_v1_goods_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*BrandRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_goods_v1_goods_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*BrandInfoResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_goods_v1_goods_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*BrandListResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_goods_v1_goods_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CreateGoodsRequestGoodsSku); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_goods_v1_goods_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CreateGoodsRequestGoodsSkuSpecification); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_goods_v1_goods_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CreateGoodsRequestGoodsSkuGroupAttr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_goods_v1_goods_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CreateGoodsRequestGoodsSkuGroupAttrAttr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_goods_v1_goods_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   32,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_goods_v1_goods_proto_goTypes,\n\t\tDependencyIndexes: file_goods_v1_goods_proto_depIdxs,\n\t\tMessageInfos:      file_goods_v1_goods_proto_msgTypes,\n\t}.Build()\n\tFile_goods_v1_goods_proto = out.File\n\tfile_goods_v1_goods_proto_rawDesc = nil\n\tfile_goods_v1_goods_proto_goTypes = nil\n\tfile_goods_v1_goods_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "service/order/api/goods/v1/goods.pb.validate.go",
    "content": "// Code generated by protoc-gen-validate. DO NOT EDIT.\n// source: goods/v1/goods.proto\n\npackage v1\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"net/mail\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"sort\"\n\t\"strings\"\n\t\"time\"\n\t\"unicode/utf8\"\n\n\t\"google.golang.org/protobuf/types/known/anypb\"\n)\n\n// ensure the imports are used\nvar (\n\t_ = bytes.MinRead\n\t_ = errors.New(\"\")\n\t_ = fmt.Print\n\t_ = utf8.UTFMax\n\t_ = (*regexp.Regexp)(nil)\n\t_ = (*strings.Reader)(nil)\n\t_ = net.IPv4len\n\t_ = time.Duration(0)\n\t_ = (*url.URL)(nil)\n\t_ = (*mail.Address)(nil)\n\t_ = anypb.Any{}\n\t_ = sort.Sort\n)\n\n// Validate checks the field values on AttrValueRequest with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *AttrValueRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on AttrValueRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// AttrValueRequestMultiError, or nil if none found.\nfunc (m *AttrValueRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *AttrValueRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for AttrId\n\n\tif m.GetGroupId() < 1 {\n\t\terr := AttrValueRequestValidationError{\n\t\t\tfield:  \"GroupId\",\n\t\t\treason: \"value must be greater than or equal to 1\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetValue()) < 3 {\n\t\terr := AttrValueRequestValidationError{\n\t\t\tfield:  \"Value\",\n\t\t\treason: \"value length must be at least 3 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn AttrValueRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// AttrValueRequestMultiError is an error wrapping multiple validation errors\n// returned by AttrValueRequest.ValidateAll() if the designated constraints\n// aren't met.\ntype AttrValueRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m AttrValueRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m AttrValueRequestMultiError) AllErrors() []error { return m }\n\n// AttrValueRequestValidationError is the validation error returned by\n// AttrValueRequest.Validate if the designated constraints aren't met.\ntype AttrValueRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e AttrValueRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e AttrValueRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e AttrValueRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e AttrValueRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e AttrValueRequestValidationError) ErrorName() string { return \"AttrValueRequestValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e AttrValueRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sAttrValueRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = AttrValueRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = AttrValueRequestValidationError{}\n\n// Validate checks the field values on AttrRequest with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *AttrRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on AttrRequest with the rules defined in\n// the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in AttrRequestMultiError, or\n// nil if none found.\nfunc (m *AttrRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *AttrRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\tif m.GetTypeId() < 1 {\n\t\terr := AttrRequestValidationError{\n\t\t\tfield:  \"TypeId\",\n\t\t\treason: \"value must be greater than or equal to 1\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif m.GetGroupId() < 1 {\n\t\terr := AttrRequestValidationError{\n\t\t\tfield:  \"GroupId\",\n\t\t\treason: \"value must be greater than or equal to 1\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetTitle()) < 1 {\n\t\terr := AttrRequestValidationError{\n\t\t\tfield:  \"Title\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\t// no validation rules for Desc\n\n\t// no validation rules for Status\n\n\tif m.GetSort() < 1 {\n\t\terr := AttrRequestValidationError{\n\t\t\tfield:  \"Sort\",\n\t\t\treason: \"value must be greater than or equal to 1\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tfor idx, item := range m.GetAttrValue() {\n\t\t_, _ = idx, item\n\n\t\tif all {\n\t\t\tswitch v := interface{}(item).(type) {\n\t\t\tcase interface{ ValidateAll() error }:\n\t\t\t\tif err := v.ValidateAll(); err != nil {\n\t\t\t\t\terrors = append(errors, AttrRequestValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"AttrValue[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\tcase interface{ Validate() error }:\n\t\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\t\terrors = append(errors, AttrRequestValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"AttrValue[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t} else if v, ok := interface{}(item).(interface{ Validate() error }); ok {\n\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\treturn AttrRequestValidationError{\n\t\t\t\t\tfield:  fmt.Sprintf(\"AttrValue[%v]\", idx),\n\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\tcause:  err,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn AttrRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// AttrRequestMultiError is an error wrapping multiple validation errors\n// returned by AttrRequest.ValidateAll() if the designated constraints aren't met.\ntype AttrRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m AttrRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m AttrRequestMultiError) AllErrors() []error { return m }\n\n// AttrRequestValidationError is the validation error returned by\n// AttrRequest.Validate if the designated constraints aren't met.\ntype AttrRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e AttrRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e AttrRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e AttrRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e AttrRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e AttrRequestValidationError) ErrorName() string { return \"AttrRequestValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e AttrRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sAttrRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = AttrRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = AttrRequestValidationError{}\n\n// Validate checks the field values on AttrValueResponse with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *AttrValueResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on AttrValueResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// AttrValueResponseMultiError, or nil if none found.\nfunc (m *AttrValueResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *AttrValueResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for AttrId\n\n\t// no validation rules for GroupId\n\n\t// no validation rules for Value\n\n\tif len(errors) > 0 {\n\t\treturn AttrValueResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// AttrValueResponseMultiError is an error wrapping multiple validation errors\n// returned by AttrValueResponse.ValidateAll() if the designated constraints\n// aren't met.\ntype AttrValueResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m AttrValueResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m AttrValueResponseMultiError) AllErrors() []error { return m }\n\n// AttrValueResponseValidationError is the validation error returned by\n// AttrValueResponse.Validate if the designated constraints aren't met.\ntype AttrValueResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e AttrValueResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e AttrValueResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e AttrValueResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e AttrValueResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e AttrValueResponseValidationError) ErrorName() string {\n\treturn \"AttrValueResponseValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e AttrValueResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sAttrValueResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = AttrValueResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = AttrValueResponseValidationError{}\n\n// Validate checks the field values on AttrResponse with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *AttrResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on AttrResponse with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in AttrResponseMultiError, or\n// nil if none found.\nfunc (m *AttrResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *AttrResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for TypeId\n\n\t// no validation rules for GroupId\n\n\t// no validation rules for Title\n\n\t// no validation rules for Desc\n\n\t// no validation rules for Status\n\n\t// no validation rules for Sort\n\n\tfor idx, item := range m.GetAttrValue() {\n\t\t_, _ = idx, item\n\n\t\tif all {\n\t\t\tswitch v := interface{}(item).(type) {\n\t\t\tcase interface{ ValidateAll() error }:\n\t\t\t\tif err := v.ValidateAll(); err != nil {\n\t\t\t\t\terrors = append(errors, AttrResponseValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"AttrValue[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\tcase interface{ Validate() error }:\n\t\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\t\terrors = append(errors, AttrResponseValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"AttrValue[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t} else if v, ok := interface{}(item).(interface{ Validate() error }); ok {\n\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\treturn AttrResponseValidationError{\n\t\t\t\t\tfield:  fmt.Sprintf(\"AttrValue[%v]\", idx),\n\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\tcause:  err,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn AttrResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// AttrResponseMultiError is an error wrapping multiple validation errors\n// returned by AttrResponse.ValidateAll() if the designated constraints aren't met.\ntype AttrResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m AttrResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m AttrResponseMultiError) AllErrors() []error { return m }\n\n// AttrResponseValidationError is the validation error returned by\n// AttrResponse.Validate if the designated constraints aren't met.\ntype AttrResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e AttrResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e AttrResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e AttrResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e AttrResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e AttrResponseValidationError) ErrorName() string { return \"AttrResponseValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e AttrResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sAttrResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = AttrResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = AttrResponseValidationError{}\n\n// Validate checks the field values on AttrGroupRequest with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *AttrGroupRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on AttrGroupRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// AttrGroupRequestMultiError, or nil if none found.\nfunc (m *AttrGroupRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *AttrGroupRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\tif m.GetTypeId() < 1 {\n\t\terr := AttrGroupRequestValidationError{\n\t\t\tfield:  \"TypeId\",\n\t\t\treason: \"value must be greater than or equal to 1\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetTitle()) < 3 {\n\t\terr := AttrGroupRequestValidationError{\n\t\t\tfield:  \"Title\",\n\t\t\treason: \"value length must be at least 3 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\t// no validation rules for Desc\n\n\t// no validation rules for Status\n\n\tif m.GetSort() < 1 {\n\t\terr := AttrGroupRequestValidationError{\n\t\t\tfield:  \"Sort\",\n\t\t\treason: \"value must be greater than or equal to 1\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn AttrGroupRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// AttrGroupRequestMultiError is an error wrapping multiple validation errors\n// returned by AttrGroupRequest.ValidateAll() if the designated constraints\n// aren't met.\ntype AttrGroupRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m AttrGroupRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m AttrGroupRequestMultiError) AllErrors() []error { return m }\n\n// AttrGroupRequestValidationError is the validation error returned by\n// AttrGroupRequest.Validate if the designated constraints aren't met.\ntype AttrGroupRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e AttrGroupRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e AttrGroupRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e AttrGroupRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e AttrGroupRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e AttrGroupRequestValidationError) ErrorName() string { return \"AttrGroupRequestValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e AttrGroupRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sAttrGroupRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = AttrGroupRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = AttrGroupRequestValidationError{}\n\n// Validate checks the field values on AttrGroupResponse with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *AttrGroupResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on AttrGroupResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// AttrGroupResponseMultiError, or nil if none found.\nfunc (m *AttrGroupResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *AttrGroupResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for TypeId\n\n\t// no validation rules for Title\n\n\t// no validation rules for Desc\n\n\t// no validation rules for Status\n\n\t// no validation rules for Sort\n\n\tif len(errors) > 0 {\n\t\treturn AttrGroupResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// AttrGroupResponseMultiError is an error wrapping multiple validation errors\n// returned by AttrGroupResponse.ValidateAll() if the designated constraints\n// aren't met.\ntype AttrGroupResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m AttrGroupResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m AttrGroupResponseMultiError) AllErrors() []error { return m }\n\n// AttrGroupResponseValidationError is the validation error returned by\n// AttrGroupResponse.Validate if the designated constraints aren't met.\ntype AttrGroupResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e AttrGroupResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e AttrGroupResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e AttrGroupResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e AttrGroupResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e AttrGroupResponseValidationError) ErrorName() string {\n\treturn \"AttrGroupResponseValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e AttrGroupResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sAttrGroupResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = AttrGroupResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = AttrGroupResponseValidationError{}\n\n// Validate checks the field values on SpecificationValue with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the first error encountered is returned, or nil if there are no violations.\nfunc (m *SpecificationValue) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on SpecificationValue with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// SpecificationValueMultiError, or nil if none found.\nfunc (m *SpecificationValue) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *SpecificationValue) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for AttrId\n\n\tif utf8.RuneCountInString(m.GetValue()) < 3 {\n\t\terr := SpecificationValueValidationError{\n\t\t\tfield:  \"Value\",\n\t\t\treason: \"value length must be at least 3 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif m.GetSort() < 1 {\n\t\terr := SpecificationValueValidationError{\n\t\t\tfield:  \"Sort\",\n\t\t\treason: \"value must be greater than or equal to 1\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn SpecificationValueMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// SpecificationValueMultiError is an error wrapping multiple validation errors\n// returned by SpecificationValue.ValidateAll() if the designated constraints\n// aren't met.\ntype SpecificationValueMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m SpecificationValueMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m SpecificationValueMultiError) AllErrors() []error { return m }\n\n// SpecificationValueValidationError is the validation error returned by\n// SpecificationValue.Validate if the designated constraints aren't met.\ntype SpecificationValueValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e SpecificationValueValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e SpecificationValueValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e SpecificationValueValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e SpecificationValueValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e SpecificationValueValidationError) ErrorName() string {\n\treturn \"SpecificationValueValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e SpecificationValueValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sSpecificationValue.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = SpecificationValueValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = SpecificationValueValidationError{}\n\n// Validate checks the field values on SpecificationValueResponse with the\n// rules defined in the proto definition for this message. If any rules are\n// violated, the first error encountered is returned, or nil if there are no violations.\nfunc (m *SpecificationValueResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on SpecificationValueResponse with the\n// rules defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// SpecificationValueResponseMultiError, or nil if none found.\nfunc (m *SpecificationValueResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *SpecificationValueResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for AttrId\n\n\t// no validation rules for Value\n\n\t// no validation rules for Sort\n\n\tif len(errors) > 0 {\n\t\treturn SpecificationValueResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// SpecificationValueResponseMultiError is an error wrapping multiple\n// validation errors returned by SpecificationValueResponse.ValidateAll() if\n// the designated constraints aren't met.\ntype SpecificationValueResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m SpecificationValueResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m SpecificationValueResponseMultiError) AllErrors() []error { return m }\n\n// SpecificationValueResponseValidationError is the validation error returned\n// by SpecificationValueResponse.Validate if the designated constraints aren't met.\ntype SpecificationValueResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e SpecificationValueResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e SpecificationValueResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e SpecificationValueResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e SpecificationValueResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e SpecificationValueResponseValidationError) ErrorName() string {\n\treturn \"SpecificationValueResponseValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e SpecificationValueResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sSpecificationValueResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = SpecificationValueResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = SpecificationValueResponseValidationError{}\n\n// Validate checks the field values on SpecificationRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the first error encountered is returned, or nil if there are no violations.\nfunc (m *SpecificationRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on SpecificationRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// SpecificationRequestMultiError, or nil if none found.\nfunc (m *SpecificationRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *SpecificationRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\tif m.GetTypeId() < 1 {\n\t\terr := SpecificationRequestValidationError{\n\t\t\tfield:  \"TypeId\",\n\t\t\treason: \"value must be greater than or equal to 1\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetName()) < 2 {\n\t\terr := SpecificationRequestValidationError{\n\t\t\tfield:  \"Name\",\n\t\t\treason: \"value length must be at least 2 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif m.GetSort() < 1 {\n\t\terr := SpecificationRequestValidationError{\n\t\t\tfield:  \"Sort\",\n\t\t\treason: \"value must be greater than or equal to 1\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\t// no validation rules for Status\n\n\t// no validation rules for IsSku\n\n\t// no validation rules for IsSelect\n\n\tfor idx, item := range m.GetSpecificationValue() {\n\t\t_, _ = idx, item\n\n\t\tif all {\n\t\t\tswitch v := interface{}(item).(type) {\n\t\t\tcase interface{ ValidateAll() error }:\n\t\t\t\tif err := v.ValidateAll(); err != nil {\n\t\t\t\t\terrors = append(errors, SpecificationRequestValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"SpecificationValue[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\tcase interface{ Validate() error }:\n\t\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\t\terrors = append(errors, SpecificationRequestValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"SpecificationValue[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t} else if v, ok := interface{}(item).(interface{ Validate() error }); ok {\n\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\treturn SpecificationRequestValidationError{\n\t\t\t\t\tfield:  fmt.Sprintf(\"SpecificationValue[%v]\", idx),\n\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\tcause:  err,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn SpecificationRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// SpecificationRequestMultiError is an error wrapping multiple validation\n// errors returned by SpecificationRequest.ValidateAll() if the designated\n// constraints aren't met.\ntype SpecificationRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m SpecificationRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m SpecificationRequestMultiError) AllErrors() []error { return m }\n\n// SpecificationRequestValidationError is the validation error returned by\n// SpecificationRequest.Validate if the designated constraints aren't met.\ntype SpecificationRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e SpecificationRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e SpecificationRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e SpecificationRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e SpecificationRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e SpecificationRequestValidationError) ErrorName() string {\n\treturn \"SpecificationRequestValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e SpecificationRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sSpecificationRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = SpecificationRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = SpecificationRequestValidationError{}\n\n// Validate checks the field values on SpecificationResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the first error encountered is returned, or nil if there are no violations.\nfunc (m *SpecificationResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on SpecificationResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// SpecificationResponseMultiError, or nil if none found.\nfunc (m *SpecificationResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *SpecificationResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\tif len(errors) > 0 {\n\t\treturn SpecificationResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// SpecificationResponseMultiError is an error wrapping multiple validation\n// errors returned by SpecificationResponse.ValidateAll() if the designated\n// constraints aren't met.\ntype SpecificationResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m SpecificationResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m SpecificationResponseMultiError) AllErrors() []error { return m }\n\n// SpecificationResponseValidationError is the validation error returned by\n// SpecificationResponse.Validate if the designated constraints aren't met.\ntype SpecificationResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e SpecificationResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e SpecificationResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e SpecificationResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e SpecificationResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e SpecificationResponseValidationError) ErrorName() string {\n\treturn \"SpecificationResponseValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e SpecificationResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sSpecificationResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = SpecificationResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = SpecificationResponseValidationError{}\n\n// Validate checks the field values on GoodsTypeRequest with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *GoodsTypeRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on GoodsTypeRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// GoodsTypeRequestMultiError, or nil if none found.\nfunc (m *GoodsTypeRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *GoodsTypeRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\tif utf8.RuneCountInString(m.GetName()) < 3 {\n\t\terr := GoodsTypeRequestValidationError{\n\t\t\tfield:  \"Name\",\n\t\t\treason: \"value length must be at least 3 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetTypeCode()) < 3 {\n\t\terr := GoodsTypeRequestValidationError{\n\t\t\tfield:  \"TypeCode\",\n\t\t\treason: \"value length must be at least 3 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\t// no validation rules for NameAlias\n\n\t// no validation rules for IsVirtual\n\n\t// no validation rules for Desc\n\n\t// no validation rules for Sort\n\n\tif utf8.RuneCountInString(m.GetBrandIds()) < 1 {\n\t\terr := GoodsTypeRequestValidationError{\n\t\t\tfield:  \"BrandIds\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn GoodsTypeRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// GoodsTypeRequestMultiError is an error wrapping multiple validation errors\n// returned by GoodsTypeRequest.ValidateAll() if the designated constraints\n// aren't met.\ntype GoodsTypeRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m GoodsTypeRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m GoodsTypeRequestMultiError) AllErrors() []error { return m }\n\n// GoodsTypeRequestValidationError is the validation error returned by\n// GoodsTypeRequest.Validate if the designated constraints aren't met.\ntype GoodsTypeRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e GoodsTypeRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e GoodsTypeRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e GoodsTypeRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e GoodsTypeRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e GoodsTypeRequestValidationError) ErrorName() string { return \"GoodsTypeRequestValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e GoodsTypeRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sGoodsTypeRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = GoodsTypeRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = GoodsTypeRequestValidationError{}\n\n// Validate checks the field values on GoodsTypeResponse with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *GoodsTypeResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on GoodsTypeResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// GoodsTypeResponseMultiError, or nil if none found.\nfunc (m *GoodsTypeResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *GoodsTypeResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\tif len(errors) > 0 {\n\t\treturn GoodsTypeResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// GoodsTypeResponseMultiError is an error wrapping multiple validation errors\n// returned by GoodsTypeResponse.ValidateAll() if the designated constraints\n// aren't met.\ntype GoodsTypeResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m GoodsTypeResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m GoodsTypeResponseMultiError) AllErrors() []error { return m }\n\n// GoodsTypeResponseValidationError is the validation error returned by\n// GoodsTypeResponse.Validate if the designated constraints aren't met.\ntype GoodsTypeResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e GoodsTypeResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e GoodsTypeResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e GoodsTypeResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e GoodsTypeResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e GoodsTypeResponseValidationError) ErrorName() string {\n\treturn \"GoodsTypeResponseValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e GoodsTypeResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sGoodsTypeResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = GoodsTypeResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = GoodsTypeResponseValidationError{}\n\n// Validate checks the field values on CreateGoodsRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the first error encountered is returned, or nil if there are no violations.\nfunc (m *CreateGoodsRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CreateGoodsRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// CreateGoodsRequestMultiError, or nil if none found.\nfunc (m *CreateGoodsRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CreateGoodsRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\tif m.GetCategoryId() < 1 {\n\t\terr := CreateGoodsRequestValidationError{\n\t\t\tfield:  \"CategoryId\",\n\t\t\treason: \"value must be greater than or equal to 1\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif m.GetBrandId() < 1 {\n\t\terr := CreateGoodsRequestValidationError{\n\t\t\tfield:  \"BrandId\",\n\t\t\treason: \"value must be greater than or equal to 1\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif m.GetTypeId() < 1 {\n\t\terr := CreateGoodsRequestValidationError{\n\t\t\tfield:  \"TypeId\",\n\t\t\treason: \"value must be greater than or equal to 1\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\t// no validation rules for Name\n\n\t// no validation rules for NameAlias\n\n\t// no validation rules for GoodsTags\n\n\t// no validation rules for GoodsSn\n\n\t// no validation rules for ShopPrice\n\n\t// no validation rules for MarketPrice\n\n\t// no validation rules for Inventory\n\n\t// no validation rules for GoodsBrief\n\n\t// no validation rules for GoodsFrontImage\n\n\t// no validation rules for ShipFree\n\n\t// no validation rules for ShipId\n\n\t// no validation rules for IsNew\n\n\t// no validation rules for IsHot\n\n\t// no validation rules for OnSale\n\n\tfor idx, item := range m.GetSku() {\n\t\t_, _ = idx, item\n\n\t\tif all {\n\t\t\tswitch v := interface{}(item).(type) {\n\t\t\tcase interface{ ValidateAll() error }:\n\t\t\t\tif err := v.ValidateAll(); err != nil {\n\t\t\t\t\terrors = append(errors, CreateGoodsRequestValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"Sku[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\tcase interface{ Validate() error }:\n\t\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\t\terrors = append(errors, CreateGoodsRequestValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"Sku[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t} else if v, ok := interface{}(item).(interface{ Validate() error }); ok {\n\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\treturn CreateGoodsRequestValidationError{\n\t\t\t\t\tfield:  fmt.Sprintf(\"Sku[%v]\", idx),\n\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\tcause:  err,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn CreateGoodsRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CreateGoodsRequestMultiError is an error wrapping multiple validation errors\n// returned by CreateGoodsRequest.ValidateAll() if the designated constraints\n// aren't met.\ntype CreateGoodsRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CreateGoodsRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CreateGoodsRequestMultiError) AllErrors() []error { return m }\n\n// CreateGoodsRequestValidationError is the validation error returned by\n// CreateGoodsRequest.Validate if the designated constraints aren't met.\ntype CreateGoodsRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CreateGoodsRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CreateGoodsRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CreateGoodsRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CreateGoodsRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CreateGoodsRequestValidationError) ErrorName() string {\n\treturn \"CreateGoodsRequestValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e CreateGoodsRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCreateGoodsRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CreateGoodsRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CreateGoodsRequestValidationError{}\n\n// Validate checks the field values on CreateGoodsResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the first error encountered is returned, or nil if there are no violations.\nfunc (m *CreateGoodsResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CreateGoodsResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// CreateGoodsResponseMultiError, or nil if none found.\nfunc (m *CreateGoodsResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CreateGoodsResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for ID\n\n\tif len(errors) > 0 {\n\t\treturn CreateGoodsResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CreateGoodsResponseMultiError is an error wrapping multiple validation\n// errors returned by CreateGoodsResponse.ValidateAll() if the designated\n// constraints aren't met.\ntype CreateGoodsResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CreateGoodsResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CreateGoodsResponseMultiError) AllErrors() []error { return m }\n\n// CreateGoodsResponseValidationError is the validation error returned by\n// CreateGoodsResponse.Validate if the designated constraints aren't met.\ntype CreateGoodsResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CreateGoodsResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CreateGoodsResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CreateGoodsResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CreateGoodsResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CreateGoodsResponseValidationError) ErrorName() string {\n\treturn \"CreateGoodsResponseValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e CreateGoodsResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCreateGoodsResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CreateGoodsResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CreateGoodsResponseValidationError{}\n\n// Validate checks the field values on GoodsInfoResponse with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *GoodsInfoResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on GoodsInfoResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// GoodsInfoResponseMultiError, or nil if none found.\nfunc (m *GoodsInfoResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *GoodsInfoResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for CategoryId\n\n\t// no validation rules for BrandId\n\n\t// no validation rules for Name\n\n\t// no validation rules for GoodsSn\n\n\t// no validation rules for ClickNum\n\n\t// no validation rules for SoldNum\n\n\t// no validation rules for FavNum\n\n\t// no validation rules for MarketPrice\n\n\t// no validation rules for GoodsBrief\n\n\t// no validation rules for GoodsDesc\n\n\t// no validation rules for ShipFree\n\n\t// no validation rules for Images\n\n\t// no validation rules for IsNew\n\n\t// no validation rules for IsHot\n\n\t// no validation rules for OnSale\n\n\tif len(errors) > 0 {\n\t\treturn GoodsInfoResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// GoodsInfoResponseMultiError is an error wrapping multiple validation errors\n// returned by GoodsInfoResponse.ValidateAll() if the designated constraints\n// aren't met.\ntype GoodsInfoResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m GoodsInfoResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m GoodsInfoResponseMultiError) AllErrors() []error { return m }\n\n// GoodsInfoResponseValidationError is the validation error returned by\n// GoodsInfoResponse.Validate if the designated constraints aren't met.\ntype GoodsInfoResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e GoodsInfoResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e GoodsInfoResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e GoodsInfoResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e GoodsInfoResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e GoodsInfoResponseValidationError) ErrorName() string {\n\treturn \"GoodsInfoResponseValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e GoodsInfoResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sGoodsInfoResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = GoodsInfoResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = GoodsInfoResponseValidationError{}\n\n// Validate checks the field values on GoodsListResponse with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *GoodsListResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on GoodsListResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// GoodsListResponseMultiError, or nil if none found.\nfunc (m *GoodsListResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *GoodsListResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Total\n\n\tfor idx, item := range m.GetList() {\n\t\t_, _ = idx, item\n\n\t\tif all {\n\t\t\tswitch v := interface{}(item).(type) {\n\t\t\tcase interface{ ValidateAll() error }:\n\t\t\t\tif err := v.ValidateAll(); err != nil {\n\t\t\t\t\terrors = append(errors, GoodsListResponseValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"List[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\tcase interface{ Validate() error }:\n\t\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\t\terrors = append(errors, GoodsListResponseValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"List[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t} else if v, ok := interface{}(item).(interface{ Validate() error }); ok {\n\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\treturn GoodsListResponseValidationError{\n\t\t\t\t\tfield:  fmt.Sprintf(\"List[%v]\", idx),\n\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\tcause:  err,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn GoodsListResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// GoodsListResponseMultiError is an error wrapping multiple validation errors\n// returned by GoodsListResponse.ValidateAll() if the designated constraints\n// aren't met.\ntype GoodsListResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m GoodsListResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m GoodsListResponseMultiError) AllErrors() []error { return m }\n\n// GoodsListResponseValidationError is the validation error returned by\n// GoodsListResponse.Validate if the designated constraints aren't met.\ntype GoodsListResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e GoodsListResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e GoodsListResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e GoodsListResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e GoodsListResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e GoodsListResponseValidationError) ErrorName() string {\n\treturn \"GoodsListResponseValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e GoodsListResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sGoodsListResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = GoodsListResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = GoodsListResponseValidationError{}\n\n// Validate checks the field values on GoodsFilterRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the first error encountered is returned, or nil if there are no violations.\nfunc (m *GoodsFilterRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on GoodsFilterRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// GoodsFilterRequestMultiError, or nil if none found.\nfunc (m *GoodsFilterRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *GoodsFilterRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Keywords\n\n\t// no validation rules for CategoryId\n\n\t// no validation rules for BrandId\n\n\t// no validation rules for MinPrice\n\n\t// no validation rules for MaxPrice\n\n\t// no validation rules for IsHot\n\n\t// no validation rules for IsNew\n\n\t// no validation rules for IsTab\n\n\t// no validation rules for ClickNum\n\n\t// no validation rules for SoldNum\n\n\t// no validation rules for FavNum\n\n\t// no validation rules for Pages\n\n\t// no validation rules for PagePerNums\n\n\t// no validation rules for Id\n\n\tif len(errors) > 0 {\n\t\treturn GoodsFilterRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// GoodsFilterRequestMultiError is an error wrapping multiple validation errors\n// returned by GoodsFilterRequest.ValidateAll() if the designated constraints\n// aren't met.\ntype GoodsFilterRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m GoodsFilterRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m GoodsFilterRequestMultiError) AllErrors() []error { return m }\n\n// GoodsFilterRequestValidationError is the validation error returned by\n// GoodsFilterRequest.Validate if the designated constraints aren't met.\ntype GoodsFilterRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e GoodsFilterRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e GoodsFilterRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e GoodsFilterRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e GoodsFilterRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e GoodsFilterRequestValidationError) ErrorName() string {\n\treturn \"GoodsFilterRequestValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e GoodsFilterRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sGoodsFilterRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = GoodsFilterRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = GoodsFilterRequestValidationError{}\n\n// Validate checks the field values on CategoryInfoResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the first error encountered is returned, or nil if there are no violations.\nfunc (m *CategoryInfoResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CategoryInfoResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// CategoryInfoResponseMultiError, or nil if none found.\nfunc (m *CategoryInfoResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CategoryInfoResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for Name\n\n\t// no validation rules for ParentCategory\n\n\t// no validation rules for Level\n\n\t// no validation rules for IsTab\n\n\t// no validation rules for Sort\n\n\tif len(errors) > 0 {\n\t\treturn CategoryInfoResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CategoryInfoResponseMultiError is an error wrapping multiple validation\n// errors returned by CategoryInfoResponse.ValidateAll() if the designated\n// constraints aren't met.\ntype CategoryInfoResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CategoryInfoResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CategoryInfoResponseMultiError) AllErrors() []error { return m }\n\n// CategoryInfoResponseValidationError is the validation error returned by\n// CategoryInfoResponse.Validate if the designated constraints aren't met.\ntype CategoryInfoResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CategoryInfoResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CategoryInfoResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CategoryInfoResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CategoryInfoResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CategoryInfoResponseValidationError) ErrorName() string {\n\treturn \"CategoryInfoResponseValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e CategoryInfoResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCategoryInfoResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CategoryInfoResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CategoryInfoResponseValidationError{}\n\n// Validate checks the field values on CategoryListResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the first error encountered is returned, or nil if there are no violations.\nfunc (m *CategoryListResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CategoryListResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// CategoryListResponseMultiError, or nil if none found.\nfunc (m *CategoryListResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CategoryListResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for JsonData\n\n\tif len(errors) > 0 {\n\t\treturn CategoryListResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CategoryListResponseMultiError is an error wrapping multiple validation\n// errors returned by CategoryListResponse.ValidateAll() if the designated\n// constraints aren't met.\ntype CategoryListResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CategoryListResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CategoryListResponseMultiError) AllErrors() []error { return m }\n\n// CategoryListResponseValidationError is the validation error returned by\n// CategoryListResponse.Validate if the designated constraints aren't met.\ntype CategoryListResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CategoryListResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CategoryListResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CategoryListResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CategoryListResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CategoryListResponseValidationError) ErrorName() string {\n\treturn \"CategoryListResponseValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e CategoryListResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCategoryListResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CategoryListResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CategoryListResponseValidationError{}\n\n// Validate checks the field values on CategoryListRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the first error encountered is returned, or nil if there are no violations.\nfunc (m *CategoryListRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CategoryListRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// CategoryListRequestMultiError, or nil if none found.\nfunc (m *CategoryListRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CategoryListRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for Level\n\n\tif len(errors) > 0 {\n\t\treturn CategoryListRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CategoryListRequestMultiError is an error wrapping multiple validation\n// errors returned by CategoryListRequest.ValidateAll() if the designated\n// constraints aren't met.\ntype CategoryListRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CategoryListRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CategoryListRequestMultiError) AllErrors() []error { return m }\n\n// CategoryListRequestValidationError is the validation error returned by\n// CategoryListRequest.Validate if the designated constraints aren't met.\ntype CategoryListRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CategoryListRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CategoryListRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CategoryListRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CategoryListRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CategoryListRequestValidationError) ErrorName() string {\n\treturn \"CategoryListRequestValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e CategoryListRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCategoryListRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CategoryListRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CategoryListRequestValidationError{}\n\n// Validate checks the field values on SubCategoryListResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the first error encountered is returned, or nil if there are no violations.\nfunc (m *SubCategoryListResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on SubCategoryListResponse with the\n// rules defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// SubCategoryListResponseMultiError, or nil if none found.\nfunc (m *SubCategoryListResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *SubCategoryListResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\tif all {\n\t\tswitch v := interface{}(m.GetInfo()).(type) {\n\t\tcase interface{ ValidateAll() error }:\n\t\t\tif err := v.ValidateAll(); err != nil {\n\t\t\t\terrors = append(errors, SubCategoryListResponseValidationError{\n\t\t\t\t\tfield:  \"Info\",\n\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\tcause:  err,\n\t\t\t\t})\n\t\t\t}\n\t\tcase interface{ Validate() error }:\n\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\terrors = append(errors, SubCategoryListResponseValidationError{\n\t\t\t\t\tfield:  \"Info\",\n\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\tcause:  err,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t} else if v, ok := interface{}(m.GetInfo()).(interface{ Validate() error }); ok {\n\t\tif err := v.Validate(); err != nil {\n\t\t\treturn SubCategoryListResponseValidationError{\n\t\t\t\tfield:  \"Info\",\n\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\tcause:  err,\n\t\t\t}\n\t\t}\n\t}\n\n\tfor idx, item := range m.GetSubCategory() {\n\t\t_, _ = idx, item\n\n\t\tif all {\n\t\t\tswitch v := interface{}(item).(type) {\n\t\t\tcase interface{ ValidateAll() error }:\n\t\t\t\tif err := v.ValidateAll(); err != nil {\n\t\t\t\t\terrors = append(errors, SubCategoryListResponseValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"SubCategory[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\tcase interface{ Validate() error }:\n\t\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\t\terrors = append(errors, SubCategoryListResponseValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"SubCategory[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t} else if v, ok := interface{}(item).(interface{ Validate() error }); ok {\n\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\treturn SubCategoryListResponseValidationError{\n\t\t\t\t\tfield:  fmt.Sprintf(\"SubCategory[%v]\", idx),\n\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\tcause:  err,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn SubCategoryListResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// SubCategoryListResponseMultiError is an error wrapping multiple validation\n// errors returned by SubCategoryListResponse.ValidateAll() if the designated\n// constraints aren't met.\ntype SubCategoryListResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m SubCategoryListResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m SubCategoryListResponseMultiError) AllErrors() []error { return m }\n\n// SubCategoryListResponseValidationError is the validation error returned by\n// SubCategoryListResponse.Validate if the designated constraints aren't met.\ntype SubCategoryListResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e SubCategoryListResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e SubCategoryListResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e SubCategoryListResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e SubCategoryListResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e SubCategoryListResponseValidationError) ErrorName() string {\n\treturn \"SubCategoryListResponseValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e SubCategoryListResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sSubCategoryListResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = SubCategoryListResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = SubCategoryListResponseValidationError{}\n\n// Validate checks the field values on CategoryInfoRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the first error encountered is returned, or nil if there are no violations.\nfunc (m *CategoryInfoRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CategoryInfoRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// CategoryInfoRequestMultiError, or nil if none found.\nfunc (m *CategoryInfoRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CategoryInfoRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for Name\n\n\t// no validation rules for ParentCategory\n\n\t// no validation rules for Level\n\n\t// no validation rules for IsTab\n\n\t// no validation rules for Sort\n\n\tif len(errors) > 0 {\n\t\treturn CategoryInfoRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CategoryInfoRequestMultiError is an error wrapping multiple validation\n// errors returned by CategoryInfoRequest.ValidateAll() if the designated\n// constraints aren't met.\ntype CategoryInfoRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CategoryInfoRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CategoryInfoRequestMultiError) AllErrors() []error { return m }\n\n// CategoryInfoRequestValidationError is the validation error returned by\n// CategoryInfoRequest.Validate if the designated constraints aren't met.\ntype CategoryInfoRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CategoryInfoRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CategoryInfoRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CategoryInfoRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CategoryInfoRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CategoryInfoRequestValidationError) ErrorName() string {\n\treturn \"CategoryInfoRequestValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e CategoryInfoRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCategoryInfoRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CategoryInfoRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CategoryInfoRequestValidationError{}\n\n// Validate checks the field values on BatchCategoryInfoRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the first error encountered is returned, or nil if there are no violations.\nfunc (m *BatchCategoryInfoRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on BatchCategoryInfoRequest with the\n// rules defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// BatchCategoryInfoRequestMultiError, or nil if none found.\nfunc (m *BatchCategoryInfoRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *BatchCategoryInfoRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for GoodsNums\n\n\t// no validation rules for BrandNums\n\n\tif len(errors) > 0 {\n\t\treturn BatchCategoryInfoRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// BatchCategoryInfoRequestMultiError is an error wrapping multiple validation\n// errors returned by BatchCategoryInfoRequest.ValidateAll() if the designated\n// constraints aren't met.\ntype BatchCategoryInfoRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m BatchCategoryInfoRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m BatchCategoryInfoRequestMultiError) AllErrors() []error { return m }\n\n// BatchCategoryInfoRequestValidationError is the validation error returned by\n// BatchCategoryInfoRequest.Validate if the designated constraints aren't met.\ntype BatchCategoryInfoRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e BatchCategoryInfoRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e BatchCategoryInfoRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e BatchCategoryInfoRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e BatchCategoryInfoRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e BatchCategoryInfoRequestValidationError) ErrorName() string {\n\treturn \"BatchCategoryInfoRequestValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e BatchCategoryInfoRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sBatchCategoryInfoRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = BatchCategoryInfoRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = BatchCategoryInfoRequestValidationError{}\n\n// Validate checks the field values on DeleteCategoryRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the first error encountered is returned, or nil if there are no violations.\nfunc (m *DeleteCategoryRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on DeleteCategoryRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// DeleteCategoryRequestMultiError, or nil if none found.\nfunc (m *DeleteCategoryRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *DeleteCategoryRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\tif len(errors) > 0 {\n\t\treturn DeleteCategoryRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// DeleteCategoryRequestMultiError is an error wrapping multiple validation\n// errors returned by DeleteCategoryRequest.ValidateAll() if the designated\n// constraints aren't met.\ntype DeleteCategoryRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m DeleteCategoryRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m DeleteCategoryRequestMultiError) AllErrors() []error { return m }\n\n// DeleteCategoryRequestValidationError is the validation error returned by\n// DeleteCategoryRequest.Validate if the designated constraints aren't met.\ntype DeleteCategoryRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e DeleteCategoryRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e DeleteCategoryRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e DeleteCategoryRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e DeleteCategoryRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e DeleteCategoryRequestValidationError) ErrorName() string {\n\treturn \"DeleteCategoryRequestValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e DeleteCategoryRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sDeleteCategoryRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = DeleteCategoryRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = DeleteCategoryRequestValidationError{}\n\n// Validate checks the field values on BrandListRequest with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *BrandListRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on BrandListRequest with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// BrandListRequestMultiError, or nil if none found.\nfunc (m *BrandListRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *BrandListRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Pages\n\n\t// no validation rules for PagePerNums\n\n\tif len(errors) > 0 {\n\t\treturn BrandListRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// BrandListRequestMultiError is an error wrapping multiple validation errors\n// returned by BrandListRequest.ValidateAll() if the designated constraints\n// aren't met.\ntype BrandListRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m BrandListRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m BrandListRequestMultiError) AllErrors() []error { return m }\n\n// BrandListRequestValidationError is the validation error returned by\n// BrandListRequest.Validate if the designated constraints aren't met.\ntype BrandListRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e BrandListRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e BrandListRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e BrandListRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e BrandListRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e BrandListRequestValidationError) ErrorName() string { return \"BrandListRequestValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e BrandListRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sBrandListRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = BrandListRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = BrandListRequestValidationError{}\n\n// Validate checks the field values on BrandRequest with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *BrandRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on BrandRequest with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in BrandRequestMultiError, or\n// nil if none found.\nfunc (m *BrandRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *BrandRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for Name\n\n\t// no validation rules for Logo\n\n\t// no validation rules for Desc\n\n\t// no validation rules for IsTab\n\n\t// no validation rules for Sort\n\n\tif len(errors) > 0 {\n\t\treturn BrandRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// BrandRequestMultiError is an error wrapping multiple validation errors\n// returned by BrandRequest.ValidateAll() if the designated constraints aren't met.\ntype BrandRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m BrandRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m BrandRequestMultiError) AllErrors() []error { return m }\n\n// BrandRequestValidationError is the validation error returned by\n// BrandRequest.Validate if the designated constraints aren't met.\ntype BrandRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e BrandRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e BrandRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e BrandRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e BrandRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e BrandRequestValidationError) ErrorName() string { return \"BrandRequestValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e BrandRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sBrandRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = BrandRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = BrandRequestValidationError{}\n\n// Validate checks the field values on BrandInfoResponse with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *BrandInfoResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on BrandInfoResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// BrandInfoResponseMultiError, or nil if none found.\nfunc (m *BrandInfoResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *BrandInfoResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for Name\n\n\t// no validation rules for Logo\n\n\t// no validation rules for Desc\n\n\t// no validation rules for IsTab\n\n\t// no validation rules for Sort\n\n\tif len(errors) > 0 {\n\t\treturn BrandInfoResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// BrandInfoResponseMultiError is an error wrapping multiple validation errors\n// returned by BrandInfoResponse.ValidateAll() if the designated constraints\n// aren't met.\ntype BrandInfoResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m BrandInfoResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m BrandInfoResponseMultiError) AllErrors() []error { return m }\n\n// BrandInfoResponseValidationError is the validation error returned by\n// BrandInfoResponse.Validate if the designated constraints aren't met.\ntype BrandInfoResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e BrandInfoResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e BrandInfoResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e BrandInfoResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e BrandInfoResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e BrandInfoResponseValidationError) ErrorName() string {\n\treturn \"BrandInfoResponseValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e BrandInfoResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sBrandInfoResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = BrandInfoResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = BrandInfoResponseValidationError{}\n\n// Validate checks the field values on BrandListResponse with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *BrandListResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on BrandListResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// BrandListResponseMultiError, or nil if none found.\nfunc (m *BrandListResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *BrandListResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Total\n\n\tfor idx, item := range m.GetData() {\n\t\t_, _ = idx, item\n\n\t\tif all {\n\t\t\tswitch v := interface{}(item).(type) {\n\t\t\tcase interface{ ValidateAll() error }:\n\t\t\t\tif err := v.ValidateAll(); err != nil {\n\t\t\t\t\terrors = append(errors, BrandListResponseValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"Data[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\tcase interface{ Validate() error }:\n\t\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\t\terrors = append(errors, BrandListResponseValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"Data[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t} else if v, ok := interface{}(item).(interface{ Validate() error }); ok {\n\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\treturn BrandListResponseValidationError{\n\t\t\t\t\tfield:  fmt.Sprintf(\"Data[%v]\", idx),\n\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\tcause:  err,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn BrandListResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// BrandListResponseMultiError is an error wrapping multiple validation errors\n// returned by BrandListResponse.ValidateAll() if the designated constraints\n// aren't met.\ntype BrandListResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m BrandListResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m BrandListResponseMultiError) AllErrors() []error { return m }\n\n// BrandListResponseValidationError is the validation error returned by\n// BrandListResponse.Validate if the designated constraints aren't met.\ntype BrandListResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e BrandListResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e BrandListResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e BrandListResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e BrandListResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e BrandListResponseValidationError) ErrorName() string {\n\treturn \"BrandListResponseValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e BrandListResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sBrandListResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = BrandListResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = BrandListResponseValidationError{}\n\n// Validate checks the field values on CreateGoodsRequestGoodsSku with the\n// rules defined in the proto definition for this message. If any rules are\n// violated, the first error encountered is returned, or nil if there are no violations.\nfunc (m *CreateGoodsRequestGoodsSku) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CreateGoodsRequestGoodsSku with the\n// rules defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// CreateGoodsRequestGoodsSkuMultiError, or nil if none found.\nfunc (m *CreateGoodsRequestGoodsSku) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CreateGoodsRequestGoodsSku) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for GoodsId\n\n\tif utf8.RuneCountInString(m.GetSkuName()) < 1 {\n\t\terr := CreateGoodsRequestGoodsSkuValidationError{\n\t\t\tfield:  \"SkuName\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetCode()) < 1 {\n\t\terr := CreateGoodsRequestGoodsSkuValidationError{\n\t\t\tfield:  \"Code\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetBarCode()) < 1 {\n\t\terr := CreateGoodsRequestGoodsSkuValidationError{\n\t\t\tfield:  \"BarCode\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\t// no validation rules for Price\n\n\t// no validation rules for PromotionPrice\n\n\t// no validation rules for Points\n\n\t// no validation rules for Image\n\n\t// no validation rules for Sort\n\n\t// no validation rules for Inventory\n\n\tfor idx, item := range m.GetSpecificationInfo() {\n\t\t_, _ = idx, item\n\n\t\tif all {\n\t\t\tswitch v := interface{}(item).(type) {\n\t\t\tcase interface{ ValidateAll() error }:\n\t\t\t\tif err := v.ValidateAll(); err != nil {\n\t\t\t\t\terrors = append(errors, CreateGoodsRequestGoodsSkuValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"SpecificationInfo[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\tcase interface{ Validate() error }:\n\t\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\t\terrors = append(errors, CreateGoodsRequestGoodsSkuValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"SpecificationInfo[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t} else if v, ok := interface{}(item).(interface{ Validate() error }); ok {\n\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\treturn CreateGoodsRequestGoodsSkuValidationError{\n\t\t\t\t\tfield:  fmt.Sprintf(\"SpecificationInfo[%v]\", idx),\n\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\tcause:  err,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\tfor idx, item := range m.GetGroupAttrInfo() {\n\t\t_, _ = idx, item\n\n\t\tif all {\n\t\t\tswitch v := interface{}(item).(type) {\n\t\t\tcase interface{ ValidateAll() error }:\n\t\t\t\tif err := v.ValidateAll(); err != nil {\n\t\t\t\t\terrors = append(errors, CreateGoodsRequestGoodsSkuValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"GroupAttrInfo[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\tcase interface{ Validate() error }:\n\t\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\t\terrors = append(errors, CreateGoodsRequestGoodsSkuValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"GroupAttrInfo[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t} else if v, ok := interface{}(item).(interface{ Validate() error }); ok {\n\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\treturn CreateGoodsRequestGoodsSkuValidationError{\n\t\t\t\t\tfield:  fmt.Sprintf(\"GroupAttrInfo[%v]\", idx),\n\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\tcause:  err,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn CreateGoodsRequestGoodsSkuMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CreateGoodsRequestGoodsSkuMultiError is an error wrapping multiple\n// validation errors returned by CreateGoodsRequestGoodsSku.ValidateAll() if\n// the designated constraints aren't met.\ntype CreateGoodsRequestGoodsSkuMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CreateGoodsRequestGoodsSkuMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CreateGoodsRequestGoodsSkuMultiError) AllErrors() []error { return m }\n\n// CreateGoodsRequestGoodsSkuValidationError is the validation error returned\n// by CreateGoodsRequestGoodsSku.Validate if the designated constraints aren't met.\ntype CreateGoodsRequestGoodsSkuValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CreateGoodsRequestGoodsSkuValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CreateGoodsRequestGoodsSkuValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CreateGoodsRequestGoodsSkuValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CreateGoodsRequestGoodsSkuValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CreateGoodsRequestGoodsSkuValidationError) ErrorName() string {\n\treturn \"CreateGoodsRequestGoodsSkuValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e CreateGoodsRequestGoodsSkuValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCreateGoodsRequestGoodsSku.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CreateGoodsRequestGoodsSkuValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CreateGoodsRequestGoodsSkuValidationError{}\n\n// Validate checks the field values on CreateGoodsRequestGoodsSkuSpecification\n// with the rules defined in the proto definition for this message. If any\n// rules are violated, the first error encountered is returned, or nil if\n// there are no violations.\nfunc (m *CreateGoodsRequestGoodsSkuSpecification) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on\n// CreateGoodsRequestGoodsSkuSpecification with the rules defined in the proto\n// definition for this message. If any rules are violated, the result is a\n// list of violation errors wrapped in\n// CreateGoodsRequestGoodsSkuSpecificationMultiError, or nil if none found.\nfunc (m *CreateGoodsRequestGoodsSkuSpecification) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CreateGoodsRequestGoodsSkuSpecification) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\tif m.GetSId() < 1 {\n\t\terr := CreateGoodsRequestGoodsSkuSpecificationValidationError{\n\t\t\tfield:  \"SId\",\n\t\t\treason: \"value must be greater than or equal to 1\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif m.GetVId() < 1 {\n\t\terr := CreateGoodsRequestGoodsSkuSpecificationValidationError{\n\t\t\tfield:  \"VId\",\n\t\t\treason: \"value must be greater than or equal to 1\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn CreateGoodsRequestGoodsSkuSpecificationMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CreateGoodsRequestGoodsSkuSpecificationMultiError is an error wrapping\n// multiple validation errors returned by\n// CreateGoodsRequestGoodsSkuSpecification.ValidateAll() if the designated\n// constraints aren't met.\ntype CreateGoodsRequestGoodsSkuSpecificationMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CreateGoodsRequestGoodsSkuSpecificationMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CreateGoodsRequestGoodsSkuSpecificationMultiError) AllErrors() []error { return m }\n\n// CreateGoodsRequestGoodsSkuSpecificationValidationError is the validation\n// error returned by CreateGoodsRequestGoodsSkuSpecification.Validate if the\n// designated constraints aren't met.\ntype CreateGoodsRequestGoodsSkuSpecificationValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CreateGoodsRequestGoodsSkuSpecificationValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CreateGoodsRequestGoodsSkuSpecificationValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CreateGoodsRequestGoodsSkuSpecificationValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CreateGoodsRequestGoodsSkuSpecificationValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CreateGoodsRequestGoodsSkuSpecificationValidationError) ErrorName() string {\n\treturn \"CreateGoodsRequestGoodsSkuSpecificationValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e CreateGoodsRequestGoodsSkuSpecificationValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCreateGoodsRequestGoodsSkuSpecification.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CreateGoodsRequestGoodsSkuSpecificationValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CreateGoodsRequestGoodsSkuSpecificationValidationError{}\n\n// Validate checks the field values on CreateGoodsRequestGoodsSkuGroupAttr with\n// the rules defined in the proto definition for this message. If any rules\n// are violated, the first error encountered is returned, or nil if there are\n// no violations.\nfunc (m *CreateGoodsRequestGoodsSkuGroupAttr) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CreateGoodsRequestGoodsSkuGroupAttr\n// with the rules defined in the proto definition for this message. If any\n// rules are violated, the result is a list of violation errors wrapped in\n// CreateGoodsRequestGoodsSkuGroupAttrMultiError, or nil if none found.\nfunc (m *CreateGoodsRequestGoodsSkuGroupAttr) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CreateGoodsRequestGoodsSkuGroupAttr) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for GroupId\n\n\t// no validation rules for GroupName\n\n\tfor idx, item := range m.GetAttrInfo() {\n\t\t_, _ = idx, item\n\n\t\tif all {\n\t\t\tswitch v := interface{}(item).(type) {\n\t\t\tcase interface{ ValidateAll() error }:\n\t\t\t\tif err := v.ValidateAll(); err != nil {\n\t\t\t\t\terrors = append(errors, CreateGoodsRequestGoodsSkuGroupAttrValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"AttrInfo[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\tcase interface{ Validate() error }:\n\t\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\t\terrors = append(errors, CreateGoodsRequestGoodsSkuGroupAttrValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"AttrInfo[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t} else if v, ok := interface{}(item).(interface{ Validate() error }); ok {\n\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\treturn CreateGoodsRequestGoodsSkuGroupAttrValidationError{\n\t\t\t\t\tfield:  fmt.Sprintf(\"AttrInfo[%v]\", idx),\n\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\tcause:  err,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn CreateGoodsRequestGoodsSkuGroupAttrMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CreateGoodsRequestGoodsSkuGroupAttrMultiError is an error wrapping multiple\n// validation errors returned by\n// CreateGoodsRequestGoodsSkuGroupAttr.ValidateAll() if the designated\n// constraints aren't met.\ntype CreateGoodsRequestGoodsSkuGroupAttrMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CreateGoodsRequestGoodsSkuGroupAttrMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CreateGoodsRequestGoodsSkuGroupAttrMultiError) AllErrors() []error { return m }\n\n// CreateGoodsRequestGoodsSkuGroupAttrValidationError is the validation error\n// returned by CreateGoodsRequestGoodsSkuGroupAttr.Validate if the designated\n// constraints aren't met.\ntype CreateGoodsRequestGoodsSkuGroupAttrValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CreateGoodsRequestGoodsSkuGroupAttrValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CreateGoodsRequestGoodsSkuGroupAttrValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CreateGoodsRequestGoodsSkuGroupAttrValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CreateGoodsRequestGoodsSkuGroupAttrValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CreateGoodsRequestGoodsSkuGroupAttrValidationError) ErrorName() string {\n\treturn \"CreateGoodsRequestGoodsSkuGroupAttrValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e CreateGoodsRequestGoodsSkuGroupAttrValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCreateGoodsRequestGoodsSkuGroupAttr.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CreateGoodsRequestGoodsSkuGroupAttrValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CreateGoodsRequestGoodsSkuGroupAttrValidationError{}\n\n// Validate checks the field values on CreateGoodsRequestGoodsSkuGroupAttrAttr\n// with the rules defined in the proto definition for this message. If any\n// rules are violated, the first error encountered is returned, or nil if\n// there are no violations.\nfunc (m *CreateGoodsRequestGoodsSkuGroupAttrAttr) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on\n// CreateGoodsRequestGoodsSkuGroupAttrAttr with the rules defined in the proto\n// definition for this message. If any rules are violated, the result is a\n// list of violation errors wrapped in\n// CreateGoodsRequestGoodsSkuGroupAttrAttrMultiError, or nil if none found.\nfunc (m *CreateGoodsRequestGoodsSkuGroupAttrAttr) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CreateGoodsRequestGoodsSkuGroupAttrAttr) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\tif m.GetAttrId() < 1 {\n\t\terr := CreateGoodsRequestGoodsSkuGroupAttrAttrValidationError{\n\t\t\tfield:  \"AttrId\",\n\t\t\treason: \"value must be greater than or equal to 1\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetAttrName()) < 1 {\n\t\terr := CreateGoodsRequestGoodsSkuGroupAttrAttrValidationError{\n\t\t\tfield:  \"AttrName\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif m.GetAttrValueId() < 1 {\n\t\terr := CreateGoodsRequestGoodsSkuGroupAttrAttrValidationError{\n\t\t\tfield:  \"AttrValueId\",\n\t\t\treason: \"value must be greater than or equal to 1\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetAttrValueName()) < 1 {\n\t\terr := CreateGoodsRequestGoodsSkuGroupAttrAttrValidationError{\n\t\t\tfield:  \"AttrValueName\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn CreateGoodsRequestGoodsSkuGroupAttrAttrMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CreateGoodsRequestGoodsSkuGroupAttrAttrMultiError is an error wrapping\n// multiple validation errors returned by\n// CreateGoodsRequestGoodsSkuGroupAttrAttr.ValidateAll() if the designated\n// constraints aren't met.\ntype CreateGoodsRequestGoodsSkuGroupAttrAttrMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CreateGoodsRequestGoodsSkuGroupAttrAttrMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CreateGoodsRequestGoodsSkuGroupAttrAttrMultiError) AllErrors() []error { return m }\n\n// CreateGoodsRequestGoodsSkuGroupAttrAttrValidationError is the validation\n// error returned by CreateGoodsRequestGoodsSkuGroupAttrAttr.Validate if the\n// designated constraints aren't met.\ntype CreateGoodsRequestGoodsSkuGroupAttrAttrValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CreateGoodsRequestGoodsSkuGroupAttrAttrValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CreateGoodsRequestGoodsSkuGroupAttrAttrValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CreateGoodsRequestGoodsSkuGroupAttrAttrValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CreateGoodsRequestGoodsSkuGroupAttrAttrValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CreateGoodsRequestGoodsSkuGroupAttrAttrValidationError) ErrorName() string {\n\treturn \"CreateGoodsRequestGoodsSkuGroupAttrAttrValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e CreateGoodsRequestGoodsSkuGroupAttrAttrValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCreateGoodsRequestGoodsSkuGroupAttrAttr.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CreateGoodsRequestGoodsSkuGroupAttrAttrValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CreateGoodsRequestGoodsSkuGroupAttrAttrValidationError{}\n"
  },
  {
    "path": "service/order/api/goods/v1/goods.proto",
    "content": "syntax = \"proto3\";\n\npackage goods.v1;\n\nimport \"google/protobuf/empty.proto\";\nimport \"validate/validate.proto\";\n\noption go_package = \"goods/api/goods/v1;v1\";\n\nservice Goods {\n  // 商品分类\n  rpc GetAllCategoryList(google.protobuf.Empty) returns(CategoryListResponse); // 获取所有的分类\n  rpc GetSubCategory(CategoryListRequest) returns(SubCategoryListResponse);// 获取子分类\n  rpc CreateCategory(CategoryInfoRequest) returns(CategoryInfoResponse); // 新建分类信息\n  rpc DeleteCategory(DeleteCategoryRequest) returns(google.protobuf.Empty); // 删除分类\n  rpc UpdateCategory(CategoryInfoRequest) returns(google.protobuf.Empty); // 修改分类信息\n\n  // 商品品牌\n  rpc BrandList(BrandListRequest) returns(BrandListResponse);\n  rpc CreateBrand(BrandRequest) returns(BrandInfoResponse);\n  rpc DeleteBrand(BrandRequest) returns(google.protobuf.Empty);\n  rpc UpdateBrand(BrandRequest) returns(google.protobuf.Empty);\n\n  // 商品类型 goods_property_names\n  // 商品类型不同于商品分类，指的是依据某一类商品的相同属性归纳成的属性集合 // 手机类型都有屏幕尺寸、网络制式等共同的属性\n  rpc CreateGoodsType(GoodsTypeRequest) returns(GoodsTypeResponse); // 商品类型基本信息创建\n\n  // 创建商品规格 也就是 手机的颜色、内存版本、购买方式之类的\n  // 商品规格的值，比如手机颜色对应的有 红、白、黑，内存，128g、256g, 也一起创建了\n  rpc CreateGoodsSpecification(SpecificationRequest) returns(SpecificationResponse); // 商品规格或属性的信息\n\n  // 商品参数属性 ,手机:主体,屏幕, 操作系统,网络支持之类的\n  rpc CreateAttrGroup(AttrGroupRequest) returns(AttrGroupResponse);\n\n  // 商品参数属性组下的一些信息 ,主体:上市年份 产品名称 ,网络支持 5G网络,双卡双待类型,\n  rpc CreateAttrValue(AttrRequest) returns(AttrResponse);\n\n  // 商品接口\n  rpc CreateGoods(CreateGoodsRequest) returns (CreateGoodsResponse);\n  rpc UpdateGoods(CreateGoodsRequest) returns (google.protobuf.Empty);\n  rpc GoodsList(GoodsFilterRequest) returns(GoodsListResponse);\n  //  rpc GetGoodsDetail(GoodInfoRequest) returns(GoodsInfoResponse);\n  //  rpc BatchGetGoods(BatchGoodsIdInfo) returns(GoodsListResponse); // 现在用户提交订单有多个商品，你得批量查询商品的信息吧\n  //  rpc DeleteGoods(DeleteGoodsInfo) returns (google.protobuf.Empty);\n}\n\nmessage AttrValueRequest {\n  int64 id = 1;\n  int64 attrId = 2;\n  int64 groupId = 3 [(validate.rules).int64.gte = 1];\n  string value = 4 [(validate.rules).string.min_len = 3];\n}\n\nmessage AttrRequest {\n  int64 id = 1;\n  int64 typeId = 2 [(validate.rules).int64.gte = 1];\n  int64 groupId = 3 [(validate.rules).int64.gte = 1];\n  string title = 4 [(validate.rules).string = {min_len: 1}];\n  string  desc = 5;\n  bool status = 6;\n  int32 sort = 7 [(validate.rules).int32.gte = 1];\n  repeated AttrValueRequest attrValue = 8;\n}\n\nmessage AttrValueResponse {\n  int64 id = 1;\n  int64 attrId = 2;\n  int64 groupId = 3;\n  string value = 4;\n}\n\nmessage AttrResponse {\n  int64 id = 1;\n  int64 typeId = 2;\n  int64 groupId = 3;\n  string title = 4;\n  string  desc = 5;\n  bool status = 6;\n  int32 sort = 7;\n  repeated AttrValueResponse attrValue = 8;\n}\n\nmessage AttrGroupRequest {\n  int64 id = 1;\n  int64 typeId = 2 [(validate.rules).int64.gte = 1];\n  string title = 3 [(validate.rules).string.min_len = 3];\n  string  desc = 4;\n  bool status = 5;\n  int32 sort = 6 [(validate.rules).int32.gte = 1];\n}\nmessage AttrGroupResponse {\n  int64 id = 1;\n  int64 typeId = 2;\n  string title = 3;\n  string  desc = 4;\n  bool status = 5;\n  int32 sort = 6;\n}\n\nmessage SpecificationValue {\n  int64 id = 1;\n  int64 attrId = 2;\n  string value = 3 [(validate.rules).string.min_len = 3];\n  int32 sort = 4 [(validate.rules).int32.gte = 1];\n}\n\nmessage SpecificationValueResponse {\n  int64 id = 1;\n  int64 attrId = 2;\n  string value = 3 ;\n  int32 sort = 4;\n}\n\nmessage SpecificationRequest {\n  int64 id = 1;\n  int64 typeId = 2 [(validate.rules).int64.gte = 1];\n  string name = 3 [(validate.rules).string.min_len = 2];\n  int32 sort = 4 [(validate.rules).int32.gte = 1];\n  bool status = 5;\n  bool isSku = 6;\n  bool isSelect = 7;\n  repeated SpecificationValue specificationValue = 8;\n}\n\nmessage SpecificationResponse {\n  int64 id = 1;\n}\nmessage GoodsTypeRequest {\n  int64 id = 1;\n  string name = 2  [(validate.rules).string.min_len = 3];\n  string typeCode = 3 [(validate.rules).string.min_len = 3];\n  string nameAlias = 4;\n  bool isVirtual = 5;\n  string desc = 6;\n  int32 sort = 7;\n  string brandIds = 8 [(validate.rules).string.min_len = 1];\n}\nmessage GoodsTypeResponse {\n  int64 id = 1;\n}\n\nmessage CreateGoodsRequest {\n  int64 id = 1;\n  int32 categoryId = 2 [(validate.rules).int32.gte = 1];\n  int32 brandId = 3 [(validate.rules).int32.gte = 1];\n  int64 typeId = 4 [(validate.rules).int64.gte = 1];\n  string name = 5;\n  string nameAlias = 6;\n  string goodsTags = 7;\n  string goodsSn = 8;\n  int64 shopPrice = 9;\n  int64 marketPrice = 10;\n  int64 inventory = 11;\n  string goodsBrief = 12;\n  string goodsFrontImage = 13;\n  repeated string goodsImages = 14;\n  bool shipFree = 15;\n  int32 shipId = 16;\n  bool isNew = 17;\n  bool isHot = 18;\n  bool onSale = 19;\n  // 根据商品类型 选择商品规格信息并选择\n  // 商品 sku 属性值 里面有规格的ID和属性的ID，分别是几组信息\n  message goodsSku {\n    int64 id = 1;\n    int64 goodsId = 2;\n    string skuName = 3 [(validate.rules).string.min_len = 1];\n    string code = 4 [(validate.rules).string.min_len = 1];\n    string barCode = 5 [(validate.rules).string.min_len = 1];\n    int64 price = 6;\n    int64 promotionPrice = 7;\n    int64 points = 8;\n    string image = 9;\n    int32 sort = 10;\n    int64 inventory = 11; // sku 库存\n    // 规格\n    message specification {\n      int64 sId = 1 [(validate.rules).int64.gte = 1];\n      int64 vId = 2 [(validate.rules).int64.gte = 1];\n    }\n    repeated specification specificationInfo = 12;\n    // 属性组\n    message groupAttr {\n      int64 groupId = 1;\n      string groupName = 2;\n      message attr {\n        int64 attrId = 1 [(validate.rules).int64.gte = 1];\n        string attrName = 2 [(validate.rules).string.min_len = 1];\n        int64 attrValueId = 3 [(validate.rules).int64.gte = 1];\n        string attrValueName = 4 [(validate.rules).string.min_len = 1];\n      }\n      repeated attr attrInfo = 3;\n    }\n    repeated groupAttr groupAttrInfo = 13;\n  }\n  repeated goodsSku sku = 20;\n}\nmessage CreateGoodsResponse {\n  int64 ID = 1;\n}\n\nmessage GoodsInfoResponse {\n  int64 id = 1;\n  int32 categoryId = 2;\n  int32 brandId = 3;\n  string name = 4;\n  string goodsSn = 5;\n  int64 clickNum = 6;\n  int64 soldNum = 7;\n  int64 favNum = 8;\n  int64 marketPrice = 9;\n  string goodsBrief = 10;\n  string goodsDesc = 11;\n  bool shipFree = 12;\n  string images = 13;\n  repeated string goodsImages = 14;\n  bool isNew = 15;\n  bool isHot = 16;\n  bool onSale = 17;\n}\n\nmessage GoodsListResponse {\n  int64 total = 1;\n  repeated GoodsInfoResponse list = 2;\n}\n\nmessage GoodsFilterRequest  {\n  string keywords = 1;\n  int32 categoryId = 2;\n  int32 brandId = 3;\n  int64 minPrice = 4;\n  int64 maxPrice = 5;\n  bool  isHot = 6;\n  bool  isNew = 7;\n  bool  isTab = 8;\n  int64 clickNum = 9;\n  int64 soldNum = 10;\n  int64 favNum = 11;\n  int64 pages = 12;\n  int64 pagePerNums = 13;\n  int64 id = 14;\n}\n\n// 商品分类\nmessage CategoryInfoResponse {\n  int32 id = 1;\n  string name = 2;\n  int32 parentCategory = 3;\n  int32 level = 4;\n  bool isTab = 5;\n  int32 sort = 6;\n}\n\nmessage CategoryListResponse {\n  string jsonData = 1;\n}\nmessage CategoryListRequest {\n  int32 id = 1;\n  int32 level = 2;\n}\nmessage SubCategoryListResponse {\n  CategoryInfoResponse info = 1;\n  repeated CategoryInfoResponse subCategory = 2;\n}\nmessage CategoryInfoRequest {\n  int32 id = 1;\n  string name = 2;\n  int32 parentCategory = 3;\n  int32 level = 4;\n  bool isTab = 5;\n  int32 sort = 6;\n}\nmessage BatchCategoryInfoRequest {\n  repeated int32 id = 1;\n  int32 goodsNums = 2;\n  int32 brandNums = 3;\n}\n\nmessage DeleteCategoryRequest {\n  int32 id = 1;\n}\n\nmessage BrandListRequest {\n  int32 pages = 1;\n  int32 pagePerNums = 2;\n}\n\nmessage BrandRequest {\n  int32 id = 1;\n  string name = 2;\n  string logo = 3;\n  string desc = 4;\n  bool isTab = 5;\n  int32 sort = 6;\n}\n\nmessage BrandInfoResponse {\n  int32 id = 1;\n  string name = 2;\n  string logo = 3;\n  string desc = 4;\n  bool isTab = 5;\n  int32 sort = 6;\n}\n\nmessage BrandListResponse {\n  int32 total = 1;\n  repeated BrandInfoResponse data = 2;\n}"
  },
  {
    "path": "service/order/api/goods/v1/goods_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.2.0\n// - protoc             v3.19.4\n// source: goods/v1/goods.proto\n\npackage v1\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n\temptypb \"google.golang.org/protobuf/types/known/emptypb\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\n// GoodsClient is the client API for Goods service.\n//\n// 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.\ntype GoodsClient interface {\n\t// 商品分类\n\tGetAllCategoryList(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*CategoryListResponse, error)\n\tGetSubCategory(ctx context.Context, in *CategoryListRequest, opts ...grpc.CallOption) (*SubCategoryListResponse, error)\n\tCreateCategory(ctx context.Context, in *CategoryInfoRequest, opts ...grpc.CallOption) (*CategoryInfoResponse, error)\n\tDeleteCategory(ctx context.Context, in *DeleteCategoryRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)\n\tUpdateCategory(ctx context.Context, in *CategoryInfoRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)\n\t// 商品品牌\n\tBrandList(ctx context.Context, in *BrandListRequest, opts ...grpc.CallOption) (*BrandListResponse, error)\n\tCreateBrand(ctx context.Context, in *BrandRequest, opts ...grpc.CallOption) (*BrandInfoResponse, error)\n\tDeleteBrand(ctx context.Context, in *BrandRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)\n\tUpdateBrand(ctx context.Context, in *BrandRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)\n\t// 商品类型 goods_property_names\n\t// 商品类型不同于商品分类，指的是依据某一类商品的相同属性归纳成的属性集合 // 手机类型都有屏幕尺寸、网络制式等共同的属性\n\tCreateGoodsType(ctx context.Context, in *GoodsTypeRequest, opts ...grpc.CallOption) (*GoodsTypeResponse, error)\n\t// 创建商品规格 也就是 手机的颜色、内存版本、购买方式之类的\n\t// 商品规格的值，比如手机颜色对应的有 红、白、黑，内存，128g、256g, 也一起创建了\n\tCreateGoodsSpecification(ctx context.Context, in *SpecificationRequest, opts ...grpc.CallOption) (*SpecificationResponse, error)\n\t// 商品参数属性 ,手机:主体,屏幕, 操作系统,网络支持之类的\n\tCreateAttrGroup(ctx context.Context, in *AttrGroupRequest, opts ...grpc.CallOption) (*AttrGroupResponse, error)\n\t// 商品参数属性组下的一些信息 ,主体:上市年份 产品名称 ,网络支持 5G网络,双卡双待类型,\n\tCreateAttrValue(ctx context.Context, in *AttrRequest, opts ...grpc.CallOption) (*AttrResponse, error)\n\t// 商品接口\n\tCreateGoods(ctx context.Context, in *CreateGoodsRequest, opts ...grpc.CallOption) (*CreateGoodsResponse, error)\n\tUpdateGoods(ctx context.Context, in *CreateGoodsRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)\n\tGoodsList(ctx context.Context, in *GoodsFilterRequest, opts ...grpc.CallOption) (*GoodsListResponse, error)\n}\n\ntype goodsClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewGoodsClient(cc grpc.ClientConnInterface) GoodsClient {\n\treturn &goodsClient{cc}\n}\n\nfunc (c *goodsClient) GetAllCategoryList(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*CategoryListResponse, error) {\n\tout := new(CategoryListResponse)\n\terr := c.cc.Invoke(ctx, \"/goods.v1.Goods/GetAllCategoryList\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *goodsClient) GetSubCategory(ctx context.Context, in *CategoryListRequest, opts ...grpc.CallOption) (*SubCategoryListResponse, error) {\n\tout := new(SubCategoryListResponse)\n\terr := c.cc.Invoke(ctx, \"/goods.v1.Goods/GetSubCategory\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *goodsClient) CreateCategory(ctx context.Context, in *CategoryInfoRequest, opts ...grpc.CallOption) (*CategoryInfoResponse, error) {\n\tout := new(CategoryInfoResponse)\n\terr := c.cc.Invoke(ctx, \"/goods.v1.Goods/CreateCategory\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *goodsClient) DeleteCategory(ctx context.Context, in *DeleteCategoryRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {\n\tout := new(emptypb.Empty)\n\terr := c.cc.Invoke(ctx, \"/goods.v1.Goods/DeleteCategory\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *goodsClient) UpdateCategory(ctx context.Context, in *CategoryInfoRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {\n\tout := new(emptypb.Empty)\n\terr := c.cc.Invoke(ctx, \"/goods.v1.Goods/UpdateCategory\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *goodsClient) BrandList(ctx context.Context, in *BrandListRequest, opts ...grpc.CallOption) (*BrandListResponse, error) {\n\tout := new(BrandListResponse)\n\terr := c.cc.Invoke(ctx, \"/goods.v1.Goods/BrandList\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *goodsClient) CreateBrand(ctx context.Context, in *BrandRequest, opts ...grpc.CallOption) (*BrandInfoResponse, error) {\n\tout := new(BrandInfoResponse)\n\terr := c.cc.Invoke(ctx, \"/goods.v1.Goods/CreateBrand\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *goodsClient) DeleteBrand(ctx context.Context, in *BrandRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {\n\tout := new(emptypb.Empty)\n\terr := c.cc.Invoke(ctx, \"/goods.v1.Goods/DeleteBrand\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *goodsClient) UpdateBrand(ctx context.Context, in *BrandRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {\n\tout := new(emptypb.Empty)\n\terr := c.cc.Invoke(ctx, \"/goods.v1.Goods/UpdateBrand\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *goodsClient) CreateGoodsType(ctx context.Context, in *GoodsTypeRequest, opts ...grpc.CallOption) (*GoodsTypeResponse, error) {\n\tout := new(GoodsTypeResponse)\n\terr := c.cc.Invoke(ctx, \"/goods.v1.Goods/CreateGoodsType\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *goodsClient) CreateGoodsSpecification(ctx context.Context, in *SpecificationRequest, opts ...grpc.CallOption) (*SpecificationResponse, error) {\n\tout := new(SpecificationResponse)\n\terr := c.cc.Invoke(ctx, \"/goods.v1.Goods/CreateGoodsSpecification\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *goodsClient) CreateAttrGroup(ctx context.Context, in *AttrGroupRequest, opts ...grpc.CallOption) (*AttrGroupResponse, error) {\n\tout := new(AttrGroupResponse)\n\terr := c.cc.Invoke(ctx, \"/goods.v1.Goods/CreateAttrGroup\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *goodsClient) CreateAttrValue(ctx context.Context, in *AttrRequest, opts ...grpc.CallOption) (*AttrResponse, error) {\n\tout := new(AttrResponse)\n\terr := c.cc.Invoke(ctx, \"/goods.v1.Goods/CreateAttrValue\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *goodsClient) CreateGoods(ctx context.Context, in *CreateGoodsRequest, opts ...grpc.CallOption) (*CreateGoodsResponse, error) {\n\tout := new(CreateGoodsResponse)\n\terr := c.cc.Invoke(ctx, \"/goods.v1.Goods/CreateGoods\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *goodsClient) UpdateGoods(ctx context.Context, in *CreateGoodsRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {\n\tout := new(emptypb.Empty)\n\terr := c.cc.Invoke(ctx, \"/goods.v1.Goods/UpdateGoods\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *goodsClient) GoodsList(ctx context.Context, in *GoodsFilterRequest, opts ...grpc.CallOption) (*GoodsListResponse, error) {\n\tout := new(GoodsListResponse)\n\terr := c.cc.Invoke(ctx, \"/goods.v1.Goods/GoodsList\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// GoodsServer is the server API for Goods service.\n// All implementations must embed UnimplementedGoodsServer\n// for forward compatibility\ntype GoodsServer interface {\n\t// 商品分类\n\tGetAllCategoryList(context.Context, *emptypb.Empty) (*CategoryListResponse, error)\n\tGetSubCategory(context.Context, *CategoryListRequest) (*SubCategoryListResponse, error)\n\tCreateCategory(context.Context, *CategoryInfoRequest) (*CategoryInfoResponse, error)\n\tDeleteCategory(context.Context, *DeleteCategoryRequest) (*emptypb.Empty, error)\n\tUpdateCategory(context.Context, *CategoryInfoRequest) (*emptypb.Empty, error)\n\t// 商品品牌\n\tBrandList(context.Context, *BrandListRequest) (*BrandListResponse, error)\n\tCreateBrand(context.Context, *BrandRequest) (*BrandInfoResponse, error)\n\tDeleteBrand(context.Context, *BrandRequest) (*emptypb.Empty, error)\n\tUpdateBrand(context.Context, *BrandRequest) (*emptypb.Empty, error)\n\t// 商品类型 goods_property_names\n\t// 商品类型不同于商品分类，指的是依据某一类商品的相同属性归纳成的属性集合 // 手机类型都有屏幕尺寸、网络制式等共同的属性\n\tCreateGoodsType(context.Context, *GoodsTypeRequest) (*GoodsTypeResponse, error)\n\t// 创建商品规格 也就是 手机的颜色、内存版本、购买方式之类的\n\t// 商品规格的值，比如手机颜色对应的有 红、白、黑，内存，128g、256g, 也一起创建了\n\tCreateGoodsSpecification(context.Context, *SpecificationRequest) (*SpecificationResponse, error)\n\t// 商品参数属性 ,手机:主体,屏幕, 操作系统,网络支持之类的\n\tCreateAttrGroup(context.Context, *AttrGroupRequest) (*AttrGroupResponse, error)\n\t// 商品参数属性组下的一些信息 ,主体:上市年份 产品名称 ,网络支持 5G网络,双卡双待类型,\n\tCreateAttrValue(context.Context, *AttrRequest) (*AttrResponse, error)\n\t// 商品接口\n\tCreateGoods(context.Context, *CreateGoodsRequest) (*CreateGoodsResponse, error)\n\tUpdateGoods(context.Context, *CreateGoodsRequest) (*emptypb.Empty, error)\n\tGoodsList(context.Context, *GoodsFilterRequest) (*GoodsListResponse, error)\n\tmustEmbedUnimplementedGoodsServer()\n}\n\n// UnimplementedGoodsServer must be embedded to have forward compatible implementations.\ntype UnimplementedGoodsServer struct {\n}\n\nfunc (UnimplementedGoodsServer) GetAllCategoryList(context.Context, *emptypb.Empty) (*CategoryListResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetAllCategoryList not implemented\")\n}\nfunc (UnimplementedGoodsServer) GetSubCategory(context.Context, *CategoryListRequest) (*SubCategoryListResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetSubCategory not implemented\")\n}\nfunc (UnimplementedGoodsServer) CreateCategory(context.Context, *CategoryInfoRequest) (*CategoryInfoResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method CreateCategory not implemented\")\n}\nfunc (UnimplementedGoodsServer) DeleteCategory(context.Context, *DeleteCategoryRequest) (*emptypb.Empty, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method DeleteCategory not implemented\")\n}\nfunc (UnimplementedGoodsServer) UpdateCategory(context.Context, *CategoryInfoRequest) (*emptypb.Empty, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method UpdateCategory not implemented\")\n}\nfunc (UnimplementedGoodsServer) BrandList(context.Context, *BrandListRequest) (*BrandListResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method BrandList not implemented\")\n}\nfunc (UnimplementedGoodsServer) CreateBrand(context.Context, *BrandRequest) (*BrandInfoResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method CreateBrand not implemented\")\n}\nfunc (UnimplementedGoodsServer) DeleteBrand(context.Context, *BrandRequest) (*emptypb.Empty, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method DeleteBrand not implemented\")\n}\nfunc (UnimplementedGoodsServer) UpdateBrand(context.Context, *BrandRequest) (*emptypb.Empty, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method UpdateBrand not implemented\")\n}\nfunc (UnimplementedGoodsServer) CreateGoodsType(context.Context, *GoodsTypeRequest) (*GoodsTypeResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method CreateGoodsType not implemented\")\n}\nfunc (UnimplementedGoodsServer) CreateGoodsSpecification(context.Context, *SpecificationRequest) (*SpecificationResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method CreateGoodsSpecification not implemented\")\n}\nfunc (UnimplementedGoodsServer) CreateAttrGroup(context.Context, *AttrGroupRequest) (*AttrGroupResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method CreateAttrGroup not implemented\")\n}\nfunc (UnimplementedGoodsServer) CreateAttrValue(context.Context, *AttrRequest) (*AttrResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method CreateAttrValue not implemented\")\n}\nfunc (UnimplementedGoodsServer) CreateGoods(context.Context, *CreateGoodsRequest) (*CreateGoodsResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method CreateGoods not implemented\")\n}\nfunc (UnimplementedGoodsServer) UpdateGoods(context.Context, *CreateGoodsRequest) (*emptypb.Empty, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method UpdateGoods not implemented\")\n}\nfunc (UnimplementedGoodsServer) GoodsList(context.Context, *GoodsFilterRequest) (*GoodsListResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GoodsList not implemented\")\n}\nfunc (UnimplementedGoodsServer) mustEmbedUnimplementedGoodsServer() {}\n\n// UnsafeGoodsServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to GoodsServer will\n// result in compilation errors.\ntype UnsafeGoodsServer interface {\n\tmustEmbedUnimplementedGoodsServer()\n}\n\nfunc RegisterGoodsServer(s grpc.ServiceRegistrar, srv GoodsServer) {\n\ts.RegisterService(&Goods_ServiceDesc, srv)\n}\n\nfunc _Goods_GetAllCategoryList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(emptypb.Empty)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GoodsServer).GetAllCategoryList(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/goods.v1.Goods/GetAllCategoryList\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GoodsServer).GetAllCategoryList(ctx, req.(*emptypb.Empty))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Goods_GetSubCategory_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(CategoryListRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GoodsServer).GetSubCategory(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/goods.v1.Goods/GetSubCategory\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GoodsServer).GetSubCategory(ctx, req.(*CategoryListRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Goods_CreateCategory_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(CategoryInfoRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GoodsServer).CreateCategory(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/goods.v1.Goods/CreateCategory\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GoodsServer).CreateCategory(ctx, req.(*CategoryInfoRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Goods_DeleteCategory_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(DeleteCategoryRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GoodsServer).DeleteCategory(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/goods.v1.Goods/DeleteCategory\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GoodsServer).DeleteCategory(ctx, req.(*DeleteCategoryRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Goods_UpdateCategory_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(CategoryInfoRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GoodsServer).UpdateCategory(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/goods.v1.Goods/UpdateCategory\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GoodsServer).UpdateCategory(ctx, req.(*CategoryInfoRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Goods_BrandList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(BrandListRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GoodsServer).BrandList(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/goods.v1.Goods/BrandList\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GoodsServer).BrandList(ctx, req.(*BrandListRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Goods_CreateBrand_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(BrandRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GoodsServer).CreateBrand(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/goods.v1.Goods/CreateBrand\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GoodsServer).CreateBrand(ctx, req.(*BrandRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Goods_DeleteBrand_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(BrandRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GoodsServer).DeleteBrand(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/goods.v1.Goods/DeleteBrand\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GoodsServer).DeleteBrand(ctx, req.(*BrandRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Goods_UpdateBrand_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(BrandRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GoodsServer).UpdateBrand(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/goods.v1.Goods/UpdateBrand\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GoodsServer).UpdateBrand(ctx, req.(*BrandRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Goods_CreateGoodsType_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GoodsTypeRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GoodsServer).CreateGoodsType(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/goods.v1.Goods/CreateGoodsType\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GoodsServer).CreateGoodsType(ctx, req.(*GoodsTypeRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Goods_CreateGoodsSpecification_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(SpecificationRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GoodsServer).CreateGoodsSpecification(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/goods.v1.Goods/CreateGoodsSpecification\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GoodsServer).CreateGoodsSpecification(ctx, req.(*SpecificationRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Goods_CreateAttrGroup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(AttrGroupRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GoodsServer).CreateAttrGroup(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/goods.v1.Goods/CreateAttrGroup\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GoodsServer).CreateAttrGroup(ctx, req.(*AttrGroupRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Goods_CreateAttrValue_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(AttrRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GoodsServer).CreateAttrValue(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/goods.v1.Goods/CreateAttrValue\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GoodsServer).CreateAttrValue(ctx, req.(*AttrRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Goods_CreateGoods_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(CreateGoodsRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GoodsServer).CreateGoods(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/goods.v1.Goods/CreateGoods\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GoodsServer).CreateGoods(ctx, req.(*CreateGoodsRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Goods_UpdateGoods_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(CreateGoodsRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GoodsServer).UpdateGoods(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/goods.v1.Goods/UpdateGoods\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GoodsServer).UpdateGoods(ctx, req.(*CreateGoodsRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Goods_GoodsList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GoodsFilterRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GoodsServer).GoodsList(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/goods.v1.Goods/GoodsList\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GoodsServer).GoodsList(ctx, req.(*GoodsFilterRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// Goods_ServiceDesc is the grpc.ServiceDesc for Goods service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar Goods_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"goods.v1.Goods\",\n\tHandlerType: (*GoodsServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetAllCategoryList\",\n\t\t\tHandler:    _Goods_GetAllCategoryList_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetSubCategory\",\n\t\t\tHandler:    _Goods_GetSubCategory_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"CreateCategory\",\n\t\t\tHandler:    _Goods_CreateCategory_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"DeleteCategory\",\n\t\t\tHandler:    _Goods_DeleteCategory_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"UpdateCategory\",\n\t\t\tHandler:    _Goods_UpdateCategory_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"BrandList\",\n\t\t\tHandler:    _Goods_BrandList_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"CreateBrand\",\n\t\t\tHandler:    _Goods_CreateBrand_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"DeleteBrand\",\n\t\t\tHandler:    _Goods_DeleteBrand_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"UpdateBrand\",\n\t\t\tHandler:    _Goods_UpdateBrand_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"CreateGoodsType\",\n\t\t\tHandler:    _Goods_CreateGoodsType_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"CreateGoodsSpecification\",\n\t\t\tHandler:    _Goods_CreateGoodsSpecification_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"CreateAttrGroup\",\n\t\t\tHandler:    _Goods_CreateAttrGroup_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"CreateAttrValue\",\n\t\t\tHandler:    _Goods_CreateAttrValue_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"CreateGoods\",\n\t\t\tHandler:    _Goods_CreateGoods_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"UpdateGoods\",\n\t\t\tHandler:    _Goods_UpdateGoods_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GoodsList\",\n\t\t\tHandler:    _Goods_GoodsList_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"goods/v1/goods.proto\",\n}\n"
  },
  {
    "path": "service/order/api/order/v1/error_reason.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.0\n// \tprotoc        v3.19.4\n// source: order/v1/error_reason.proto\n\npackage v1\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype ErrorReason int32\n\nconst (\n\tErrorReason_ORDER_UNSPECIFIED ErrorReason = 0\n\tErrorReason_ORDER_NOT_FOUND   ErrorReason = 1\n)\n\n// Enum value maps for ErrorReason.\nvar (\n\tErrorReason_name = map[int32]string{\n\t\t0: \"ORDER_UNSPECIFIED\",\n\t\t1: \"ORDER_NOT_FOUND\",\n\t}\n\tErrorReason_value = map[string]int32{\n\t\t\"ORDER_UNSPECIFIED\": 0,\n\t\t\"ORDER_NOT_FOUND\":   1,\n\t}\n)\n\nfunc (x ErrorReason) Enum() *ErrorReason {\n\tp := new(ErrorReason)\n\t*p = x\n\treturn p\n}\n\nfunc (x ErrorReason) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (ErrorReason) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_order_v1_error_reason_proto_enumTypes[0].Descriptor()\n}\n\nfunc (ErrorReason) Type() protoreflect.EnumType {\n\treturn &file_order_v1_error_reason_proto_enumTypes[0]\n}\n\nfunc (x ErrorReason) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use ErrorReason.Descriptor instead.\nfunc (ErrorReason) EnumDescriptor() ([]byte, []int) {\n\treturn file_order_v1_error_reason_proto_rawDescGZIP(), []int{0}\n}\n\nvar File_order_v1_error_reason_proto protoreflect.FileDescriptor\n\nvar file_order_v1_error_reason_proto_rawDesc = []byte{\n\t0x0a, 0x1b, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x72, 0x72, 0x6f, 0x72,\n\t0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x4f,\n\t0x72, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2a, 0x39, 0x0a, 0x0b, 0x45, 0x72, 0x72, 0x6f, 0x72,\n\t0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x15, 0x0a, 0x11, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f,\n\t0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x13, 0x0a,\n\t0x0f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44,\n\t0x10, 0x01, 0x42, 0x30, 0x0a, 0x08, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x50, 0x01,\n\t0x5a, 0x15, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6f, 0x72, 0x64, 0x65,\n\t0x72, 0x2f, 0x76, 0x31, 0x3b, 0x76, 0x31, 0xa2, 0x02, 0x0a, 0x41, 0x50, 0x49, 0x4f, 0x72, 0x64,\n\t0x65, 0x72, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_order_v1_error_reason_proto_rawDescOnce sync.Once\n\tfile_order_v1_error_reason_proto_rawDescData = file_order_v1_error_reason_proto_rawDesc\n)\n\nfunc file_order_v1_error_reason_proto_rawDescGZIP() []byte {\n\tfile_order_v1_error_reason_proto_rawDescOnce.Do(func() {\n\t\tfile_order_v1_error_reason_proto_rawDescData = protoimpl.X.CompressGZIP(file_order_v1_error_reason_proto_rawDescData)\n\t})\n\treturn file_order_v1_error_reason_proto_rawDescData\n}\n\nvar file_order_v1_error_reason_proto_enumTypes = make([]protoimpl.EnumInfo, 1)\nvar file_order_v1_error_reason_proto_goTypes = []interface{}{\n\t(ErrorReason)(0), // 0: Order.v1.ErrorReason\n}\nvar file_order_v1_error_reason_proto_depIdxs = []int32{\n\t0, // [0:0] is the sub-list for method output_type\n\t0, // [0:0] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_order_v1_error_reason_proto_init() }\nfunc file_order_v1_error_reason_proto_init() {\n\tif File_order_v1_error_reason_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_order_v1_error_reason_proto_rawDesc,\n\t\t\tNumEnums:      1,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_order_v1_error_reason_proto_goTypes,\n\t\tDependencyIndexes: file_order_v1_error_reason_proto_depIdxs,\n\t\tEnumInfos:         file_order_v1_error_reason_proto_enumTypes,\n\t}.Build()\n\tFile_order_v1_error_reason_proto = out.File\n\tfile_order_v1_error_reason_proto_rawDesc = nil\n\tfile_order_v1_error_reason_proto_goTypes = nil\n\tfile_order_v1_error_reason_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "service/order/api/order/v1/error_reason.pb.validate.go",
    "content": "// Code generated by protoc-gen-validate. DO NOT EDIT.\n// source: order/v1/error_reason.proto\n\npackage v1\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"net/mail\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"sort\"\n\t\"strings\"\n\t\"time\"\n\t\"unicode/utf8\"\n\n\t\"google.golang.org/protobuf/types/known/anypb\"\n)\n\n// ensure the imports are used\nvar (\n\t_ = bytes.MinRead\n\t_ = errors.New(\"\")\n\t_ = fmt.Print\n\t_ = utf8.UTFMax\n\t_ = (*regexp.Regexp)(nil)\n\t_ = (*strings.Reader)(nil)\n\t_ = net.IPv4len\n\t_ = time.Duration(0)\n\t_ = (*url.URL)(nil)\n\t_ = (*mail.Address)(nil)\n\t_ = anypb.Any{}\n\t_ = sort.Sort\n)\n"
  },
  {
    "path": "service/order/api/order/v1/error_reason.proto",
    "content": "syntax = \"proto3\";\n\npackage Order.v1;\n\noption go_package = \"order/api/order/v1;v1\";\noption java_multiple_files = true;\noption java_package = \"Order.v1\";\noption objc_class_prefix = \"APIOrderV1\";\n\nenum ErrorReason {\n  ORDER_UNSPECIFIED = 0;\n  ORDER_NOT_FOUND = 1;\n}\n"
  },
  {
    "path": "service/order/api/order/v1/order.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.0\n// \tprotoc        v3.19.4\n// source: order/v1/order.proto\n\npackage v1\n\nimport (\n\t_ \"github.com/envoyproxy/protoc-gen-validate/validate\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CartItem struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tCartId   int64 `protobuf:\"varint,1,opt,name=cartId,proto3\" json:\"cartId,omitempty\"`\n\tSkuId    int64 `protobuf:\"varint,2,opt,name=skuId,proto3\" json:\"skuId,omitempty\"`\n\tSkuPrice int64 `protobuf:\"varint,3,opt,name=skuPrice,proto3\" json:\"skuPrice,omitempty\"`\n\tSkuNum   int32 `protobuf:\"varint,4,opt,name=skuNum,proto3\" json:\"skuNum,omitempty\"`\n}\n\nfunc (x *CartItem) Reset() {\n\t*x = CartItem{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_v1_order_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CartItem) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CartItem) ProtoMessage() {}\n\nfunc (x *CartItem) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_v1_order_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CartItem.ProtoReflect.Descriptor instead.\nfunc (*CartItem) Descriptor() ([]byte, []int) {\n\treturn file_order_v1_order_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CartItem) GetCartId() int64 {\n\tif x != nil {\n\t\treturn x.CartId\n\t}\n\treturn 0\n}\n\nfunc (x *CartItem) GetSkuId() int64 {\n\tif x != nil {\n\t\treturn x.SkuId\n\t}\n\treturn 0\n}\n\nfunc (x *CartItem) GetSkuPrice() int64 {\n\tif x != nil {\n\t\treturn x.SkuPrice\n\t}\n\treturn 0\n}\n\nfunc (x *CartItem) GetSkuNum() int32 {\n\tif x != nil {\n\t\treturn x.SkuNum\n\t}\n\treturn 0\n}\n\ntype OrderRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId       int64       `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tUserId   int64       `protobuf:\"varint,2,opt,name=userId,proto3\" json:\"userId,omitempty\"`\n\tAddress  int64       `protobuf:\"varint,3,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tCartItem []*CartItem `protobuf:\"bytes,4,rep,name=cartItem,proto3\" json:\"cartItem,omitempty\"` //  购物车购买\n}\n\nfunc (x *OrderRequest) Reset() {\n\t*x = OrderRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_v1_order_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *OrderRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*OrderRequest) ProtoMessage() {}\n\nfunc (x *OrderRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_v1_order_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use OrderRequest.ProtoReflect.Descriptor instead.\nfunc (*OrderRequest) Descriptor() ([]byte, []int) {\n\treturn file_order_v1_order_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *OrderRequest) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *OrderRequest) GetUserId() int64 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *OrderRequest) GetAddress() int64 {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn 0\n}\n\nfunc (x *OrderRequest) GetCartItem() []*CartItem {\n\tif x != nil {\n\t\treturn x.CartItem\n\t}\n\treturn nil\n}\n\ntype OrderInfoResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId      int32   `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tUserId  int32   `protobuf:\"varint,2,opt,name=userId,proto3\" json:\"userId,omitempty\"`\n\tOrderSn string  `protobuf:\"bytes,3,opt,name=orderSn,proto3\" json:\"orderSn,omitempty\"`\n\tPayType string  `protobuf:\"bytes,4,opt,name=payType,proto3\" json:\"payType,omitempty\"`\n\tStatus  string  `protobuf:\"bytes,5,opt,name=status,proto3\" json:\"status,omitempty\"`\n\tPost    string  `protobuf:\"bytes,6,opt,name=post,proto3\" json:\"post,omitempty\"`\n\tTotal   float32 `protobuf:\"fixed32,7,opt,name=total,proto3\" json:\"total,omitempty\"`\n\tAddress string  `protobuf:\"bytes,8,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tName    string  `protobuf:\"bytes,9,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tMobile  string  `protobuf:\"bytes,10,opt,name=mobile,proto3\" json:\"mobile,omitempty\"`\n\tAddTime string  `protobuf:\"bytes,11,opt,name=addTime,proto3\" json:\"addTime,omitempty\"`\n}\n\nfunc (x *OrderInfoResponse) Reset() {\n\t*x = OrderInfoResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_v1_order_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *OrderInfoResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*OrderInfoResponse) ProtoMessage() {}\n\nfunc (x *OrderInfoResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_v1_order_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use OrderInfoResponse.ProtoReflect.Descriptor instead.\nfunc (*OrderInfoResponse) Descriptor() ([]byte, []int) {\n\treturn file_order_v1_order_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *OrderInfoResponse) GetId() int32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *OrderInfoResponse) GetUserId() int32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *OrderInfoResponse) GetOrderSn() string {\n\tif x != nil {\n\t\treturn x.OrderSn\n\t}\n\treturn \"\"\n}\n\nfunc (x *OrderInfoResponse) GetPayType() string {\n\tif x != nil {\n\t\treturn x.PayType\n\t}\n\treturn \"\"\n}\n\nfunc (x *OrderInfoResponse) GetStatus() string {\n\tif x != nil {\n\t\treturn x.Status\n\t}\n\treturn \"\"\n}\n\nfunc (x *OrderInfoResponse) GetPost() string {\n\tif x != nil {\n\t\treturn x.Post\n\t}\n\treturn \"\"\n}\n\nfunc (x *OrderInfoResponse) GetTotal() float32 {\n\tif x != nil {\n\t\treturn x.Total\n\t}\n\treturn 0\n}\n\nfunc (x *OrderInfoResponse) GetAddress() string {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn \"\"\n}\n\nfunc (x *OrderInfoResponse) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *OrderInfoResponse) GetMobile() string {\n\tif x != nil {\n\t\treturn x.Mobile\n\t}\n\treturn \"\"\n}\n\nfunc (x *OrderInfoResponse) GetAddTime() string {\n\tif x != nil {\n\t\treturn x.AddTime\n\t}\n\treturn \"\"\n}\n\nvar File_order_v1_order_proto protoreflect.FileDescriptor\n\nvar file_order_v1_order_proto_rawDesc = []byte{\n\t0x0a, 0x14, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x64, 0x65, 0x72,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31,\n\t0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64,\n\t0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x6c, 0x0a, 0x08, 0x43, 0x61, 0x72,\n\t0x74, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x61, 0x72, 0x74, 0x49, 0x64, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x63, 0x61, 0x72, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a,\n\t0x05, 0x73, 0x6b, 0x75, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x73, 0x6b,\n\t0x75, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x6b, 0x75, 0x50, 0x72, 0x69, 0x63, 0x65, 0x18,\n\t0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x73, 0x6b, 0x75, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12,\n\t0x16, 0x0a, 0x06, 0x73, 0x6b, 0x75, 0x4e, 0x75, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52,\n\t0x06, 0x73, 0x6b, 0x75, 0x4e, 0x75, 0x6d, 0x22, 0x92, 0x01, 0x0a, 0x0c, 0x4f, 0x72, 0x64, 0x65,\n\t0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72,\n\t0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x20,\n\t0x00, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x07, 0x61, 0x64, 0x64,\n\t0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22,\n\t0x02, 0x20, 0x00, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2e, 0x0a, 0x08,\n\t0x63, 0x61, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12,\n\t0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74,\n\t0x65, 0x6d, 0x52, 0x08, 0x63, 0x61, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x22, 0x91, 0x02, 0x0a,\n\t0x11, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,\n\t0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02,\n\t0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x05, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x72,\n\t0x64, 0x65, 0x72, 0x53, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64,\n\t0x65, 0x72, 0x53, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x54, 0x79, 0x70, 0x65, 0x18,\n\t0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16,\n\t0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,\n\t0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x18, 0x06,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f,\n\t0x74, 0x61, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c,\n\t0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16,\n\t0x0a, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,\n\t0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x54, 0x69, 0x6d,\n\t0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x54, 0x69, 0x6d, 0x65,\n\t0x32, 0x4b, 0x0a, 0x05, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x42, 0x0a, 0x0b, 0x43, 0x72, 0x65,\n\t0x61, 0x74, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x16, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72,\n\t0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x1a, 0x1b, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x64, 0x65,\n\t0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x17, 0x5a,\n\t0x15, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6f, 0x72, 0x64, 0x65, 0x72,\n\t0x2f, 0x76, 0x31, 0x3b, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_order_v1_order_proto_rawDescOnce sync.Once\n\tfile_order_v1_order_proto_rawDescData = file_order_v1_order_proto_rawDesc\n)\n\nfunc file_order_v1_order_proto_rawDescGZIP() []byte {\n\tfile_order_v1_order_proto_rawDescOnce.Do(func() {\n\t\tfile_order_v1_order_proto_rawDescData = protoimpl.X.CompressGZIP(file_order_v1_order_proto_rawDescData)\n\t})\n\treturn file_order_v1_order_proto_rawDescData\n}\n\nvar file_order_v1_order_proto_msgTypes = make([]protoimpl.MessageInfo, 3)\nvar file_order_v1_order_proto_goTypes = []interface{}{\n\t(*CartItem)(nil),          // 0: order.v1.CartItem\n\t(*OrderRequest)(nil),      // 1: order.v1.OrderRequest\n\t(*OrderInfoResponse)(nil), // 2: order.v1.OrderInfoResponse\n}\nvar file_order_v1_order_proto_depIdxs = []int32{\n\t0, // 0: order.v1.OrderRequest.cartItem:type_name -> order.v1.CartItem\n\t1, // 1: order.v1.Order.CreateOrder:input_type -> order.v1.OrderRequest\n\t2, // 2: order.v1.Order.CreateOrder:output_type -> order.v1.OrderInfoResponse\n\t2, // [2:3] is the sub-list for method output_type\n\t1, // [1:2] is the sub-list for method input_type\n\t1, // [1:1] is the sub-list for extension type_name\n\t1, // [1:1] is the sub-list for extension extendee\n\t0, // [0:1] is the sub-list for field type_name\n}\n\nfunc init() { file_order_v1_order_proto_init() }\nfunc file_order_v1_order_proto_init() {\n\tif File_order_v1_order_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_order_v1_order_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CartItem); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_v1_order_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*OrderRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_v1_order_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*OrderInfoResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_order_v1_order_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   3,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_order_v1_order_proto_goTypes,\n\t\tDependencyIndexes: file_order_v1_order_proto_depIdxs,\n\t\tMessageInfos:      file_order_v1_order_proto_msgTypes,\n\t}.Build()\n\tFile_order_v1_order_proto = out.File\n\tfile_order_v1_order_proto_rawDesc = nil\n\tfile_order_v1_order_proto_goTypes = nil\n\tfile_order_v1_order_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "service/order/api/order/v1/order.pb.validate.go",
    "content": "// Code generated by protoc-gen-validate. DO NOT EDIT.\n// source: order/v1/order.proto\n\npackage v1\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"net/mail\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"sort\"\n\t\"strings\"\n\t\"time\"\n\t\"unicode/utf8\"\n\n\t\"google.golang.org/protobuf/types/known/anypb\"\n)\n\n// ensure the imports are used\nvar (\n\t_ = bytes.MinRead\n\t_ = errors.New(\"\")\n\t_ = fmt.Print\n\t_ = utf8.UTFMax\n\t_ = (*regexp.Regexp)(nil)\n\t_ = (*strings.Reader)(nil)\n\t_ = net.IPv4len\n\t_ = time.Duration(0)\n\t_ = (*url.URL)(nil)\n\t_ = (*mail.Address)(nil)\n\t_ = anypb.Any{}\n\t_ = sort.Sort\n)\n\n// Validate checks the field values on CartItem with the rules defined in the\n// proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *CartItem) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CartItem with the rules defined in\n// the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in CartItemMultiError, or nil\n// if none found.\nfunc (m *CartItem) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CartItem) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for CartId\n\n\t// no validation rules for SkuId\n\n\t// no validation rules for SkuPrice\n\n\t// no validation rules for SkuNum\n\n\tif len(errors) > 0 {\n\t\treturn CartItemMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CartItemMultiError is an error wrapping multiple validation errors returned\n// by CartItem.ValidateAll() if the designated constraints aren't met.\ntype CartItemMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CartItemMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CartItemMultiError) AllErrors() []error { return m }\n\n// CartItemValidationError is the validation error returned by\n// CartItem.Validate if the designated constraints aren't met.\ntype CartItemValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CartItemValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CartItemValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CartItemValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CartItemValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CartItemValidationError) ErrorName() string { return \"CartItemValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e CartItemValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCartItem.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CartItemValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CartItemValidationError{}\n\n// Validate checks the field values on OrderRequest with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *OrderRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on OrderRequest with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in OrderRequestMultiError, or\n// nil if none found.\nfunc (m *OrderRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *OrderRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\tif m.GetUserId() <= 0 {\n\t\terr := OrderRequestValidationError{\n\t\t\tfield:  \"UserId\",\n\t\t\treason: \"value must be greater than 0\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif m.GetAddress() <= 0 {\n\t\terr := OrderRequestValidationError{\n\t\t\tfield:  \"Address\",\n\t\t\treason: \"value must be greater than 0\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tfor idx, item := range m.GetCartItem() {\n\t\t_, _ = idx, item\n\n\t\tif all {\n\t\t\tswitch v := interface{}(item).(type) {\n\t\t\tcase interface{ ValidateAll() error }:\n\t\t\t\tif err := v.ValidateAll(); err != nil {\n\t\t\t\t\terrors = append(errors, OrderRequestValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"CartItem[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\tcase interface{ Validate() error }:\n\t\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\t\terrors = append(errors, OrderRequestValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"CartItem[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t} else if v, ok := interface{}(item).(interface{ Validate() error }); ok {\n\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\treturn OrderRequestValidationError{\n\t\t\t\t\tfield:  fmt.Sprintf(\"CartItem[%v]\", idx),\n\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\tcause:  err,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn OrderRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// OrderRequestMultiError is an error wrapping multiple validation errors\n// returned by OrderRequest.ValidateAll() if the designated constraints aren't met.\ntype OrderRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m OrderRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m OrderRequestMultiError) AllErrors() []error { return m }\n\n// OrderRequestValidationError is the validation error returned by\n// OrderRequest.Validate if the designated constraints aren't met.\ntype OrderRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e OrderRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e OrderRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e OrderRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e OrderRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e OrderRequestValidationError) ErrorName() string { return \"OrderRequestValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e OrderRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sOrderRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = OrderRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = OrderRequestValidationError{}\n\n// Validate checks the field values on OrderInfoResponse with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *OrderInfoResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on OrderInfoResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// OrderInfoResponseMultiError, or nil if none found.\nfunc (m *OrderInfoResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *OrderInfoResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for UserId\n\n\t// no validation rules for OrderSn\n\n\t// no validation rules for PayType\n\n\t// no validation rules for Status\n\n\t// no validation rules for Post\n\n\t// no validation rules for Total\n\n\t// no validation rules for Address\n\n\t// no validation rules for Name\n\n\t// no validation rules for Mobile\n\n\t// no validation rules for AddTime\n\n\tif len(errors) > 0 {\n\t\treturn OrderInfoResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// OrderInfoResponseMultiError is an error wrapping multiple validation errors\n// returned by OrderInfoResponse.ValidateAll() if the designated constraints\n// aren't met.\ntype OrderInfoResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m OrderInfoResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m OrderInfoResponseMultiError) AllErrors() []error { return m }\n\n// OrderInfoResponseValidationError is the validation error returned by\n// OrderInfoResponse.Validate if the designated constraints aren't met.\ntype OrderInfoResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e OrderInfoResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e OrderInfoResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e OrderInfoResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e OrderInfoResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e OrderInfoResponseValidationError) ErrorName() string {\n\treturn \"OrderInfoResponseValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e OrderInfoResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sOrderInfoResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = OrderInfoResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = OrderInfoResponseValidationError{}\n"
  },
  {
    "path": "service/order/api/order/v1/order.proto",
    "content": "syntax = \"proto3\";\n\npackage order.v1;\n\nimport \"validate/validate.proto\";\n\noption go_package = \"order/api/order/v1;v1\";\n\nservice Order {\n  rpc CreateOrder(OrderRequest) returns (OrderInfoResponse); // 创建订单\n}\n\n\nmessage CartItem {\n  int64 cartId = 1;\n  int64 skuId = 2;\n  int64 skuPrice = 3;\n  int32 skuNum = 4;\n}\n\nmessage OrderRequest {\n  int64 id = 1;\n  int64 userId = 2 [(validate.rules).int64 = {gt:0}];\n  int64 address = 3 [(validate.rules).int64 = {gt:0}];\n  repeated CartItem cartItem = 4; //  购物车购买\n}\n\nmessage OrderInfoResponse {\n  int32 id = 1;\n  int32 userId = 2;\n  string orderSn = 3;\n  string payType = 4;\n  string status = 5;\n  string post = 6;\n  float total = 7;\n  string address = 8;\n  string name = 9;\n  string mobile = 10;\n  string addTime = 11;\n}\n\n"
  },
  {
    "path": "service/order/api/order/v1/order_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.2.0\n// - protoc             v3.19.4\n// source: order/v1/order.proto\n\npackage v1\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\n// OrderClient is the client API for Order service.\n//\n// 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.\ntype OrderClient interface {\n\tCreateOrder(ctx context.Context, in *OrderRequest, opts ...grpc.CallOption) (*OrderInfoResponse, error)\n}\n\ntype orderClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewOrderClient(cc grpc.ClientConnInterface) OrderClient {\n\treturn &orderClient{cc}\n}\n\nfunc (c *orderClient) CreateOrder(ctx context.Context, in *OrderRequest, opts ...grpc.CallOption) (*OrderInfoResponse, error) {\n\tout := new(OrderInfoResponse)\n\terr := c.cc.Invoke(ctx, \"/order.v1.Order/CreateOrder\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// OrderServer is the server API for Order service.\n// All implementations must embed UnimplementedOrderServer\n// for forward compatibility\ntype OrderServer interface {\n\tCreateOrder(context.Context, *OrderRequest) (*OrderInfoResponse, error)\n\tmustEmbedUnimplementedOrderServer()\n}\n\n// UnimplementedOrderServer must be embedded to have forward compatible implementations.\ntype UnimplementedOrderServer struct {\n}\n\nfunc (UnimplementedOrderServer) CreateOrder(context.Context, *OrderRequest) (*OrderInfoResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method CreateOrder not implemented\")\n}\nfunc (UnimplementedOrderServer) mustEmbedUnimplementedOrderServer() {}\n\n// UnsafeOrderServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to OrderServer will\n// result in compilation errors.\ntype UnsafeOrderServer interface {\n\tmustEmbedUnimplementedOrderServer()\n}\n\nfunc RegisterOrderServer(s grpc.ServiceRegistrar, srv OrderServer) {\n\ts.RegisterService(&Order_ServiceDesc, srv)\n}\n\nfunc _Order_CreateOrder_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(OrderRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(OrderServer).CreateOrder(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/order.v1.Order/CreateOrder\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(OrderServer).CreateOrder(ctx, req.(*OrderRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// Order_ServiceDesc is the grpc.ServiceDesc for Order service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar Order_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"order.v1.Order\",\n\tHandlerType: (*OrderServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"CreateOrder\",\n\t\t\tHandler:    _Order_CreateOrder_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"order/v1/order.proto\",\n}\n"
  },
  {
    "path": "service/order/api/user/v1/user.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.0\n// \tprotoc        v3.19.4\n// source: user/v1/user.proto\n\npackage v1\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\temptypb \"google.golang.org/protobuf/types/known/emptypb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype ListAddressReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUid int64 `protobuf:\"varint,1,opt,name=uid,proto3\" json:\"uid,omitempty\"`\n}\n\nfunc (x *ListAddressReq) Reset() {\n\t*x = ListAddressReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_v1_user_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListAddressReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListAddressReq) ProtoMessage() {}\n\nfunc (x *ListAddressReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_v1_user_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListAddressReq.ProtoReflect.Descriptor instead.\nfunc (*ListAddressReq) Descriptor() ([]byte, []int) {\n\treturn file_user_v1_user_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *ListAddressReq) GetUid() int64 {\n\tif x != nil {\n\t\treturn x.Uid\n\t}\n\treturn 0\n}\n\ntype AddressInfo struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId        int64  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName      string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tMobile    string `protobuf:\"bytes,3,opt,name=mobile,proto3\" json:\"mobile,omitempty\"`\n\tProvince  string `protobuf:\"bytes,4,opt,name=Province,proto3\" json:\"Province,omitempty\"`\n\tCity      string `protobuf:\"bytes,5,opt,name=City,proto3\" json:\"City,omitempty\"`\n\tDistricts string `protobuf:\"bytes,6,opt,name=Districts,proto3\" json:\"Districts,omitempty\"`\n\tAddress   string `protobuf:\"bytes,7,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tPostCode  string `protobuf:\"bytes,8,opt,name=post_code,json=postCode,proto3\" json:\"post_code,omitempty\"`\n\tIsDefault int32  `protobuf:\"varint,9,opt,name=is_default,json=isDefault,proto3\" json:\"is_default,omitempty\"`\n}\n\nfunc (x *AddressInfo) Reset() {\n\t*x = AddressInfo{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_v1_user_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AddressInfo) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AddressInfo) ProtoMessage() {}\n\nfunc (x *AddressInfo) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_v1_user_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AddressInfo.ProtoReflect.Descriptor instead.\nfunc (*AddressInfo) Descriptor() ([]byte, []int) {\n\treturn file_user_v1_user_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *AddressInfo) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *AddressInfo) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetMobile() string {\n\tif x != nil {\n\t\treturn x.Mobile\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetProvince() string {\n\tif x != nil {\n\t\treturn x.Province\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetCity() string {\n\tif x != nil {\n\t\treturn x.City\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetDistricts() string {\n\tif x != nil {\n\t\treturn x.Districts\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetAddress() string {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetPostCode() string {\n\tif x != nil {\n\t\treturn x.PostCode\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetIsDefault() int32 {\n\tif x != nil {\n\t\treturn x.IsDefault\n\t}\n\treturn 0\n}\n\ntype ListAddressReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tResults []*AddressInfo `protobuf:\"bytes,1,rep,name=results,proto3\" json:\"results,omitempty\"`\n}\n\nfunc (x *ListAddressReply) Reset() {\n\t*x = ListAddressReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_v1_user_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListAddressReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListAddressReply) ProtoMessage() {}\n\nfunc (x *ListAddressReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_v1_user_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListAddressReply.ProtoReflect.Descriptor instead.\nfunc (*ListAddressReply) Descriptor() ([]byte, []int) {\n\treturn file_user_v1_user_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *ListAddressReply) GetResults() []*AddressInfo {\n\tif x != nil {\n\t\treturn x.Results\n\t}\n\treturn nil\n}\n\ntype CreateAddressReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUid       int64  `protobuf:\"varint,1,opt,name=uid,proto3\" json:\"uid,omitempty\"`\n\tName      string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tMobile    string `protobuf:\"bytes,3,opt,name=mobile,proto3\" json:\"mobile,omitempty\"`\n\tProvince  string `protobuf:\"bytes,4,opt,name=Province,proto3\" json:\"Province,omitempty\"`\n\tCity      string `protobuf:\"bytes,5,opt,name=City,proto3\" json:\"City,omitempty\"`\n\tDistricts string `protobuf:\"bytes,6,opt,name=Districts,proto3\" json:\"Districts,omitempty\"`\n\tAddress   string `protobuf:\"bytes,7,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tPostCode  string `protobuf:\"bytes,8,opt,name=post_code,json=postCode,proto3\" json:\"post_code,omitempty\"`\n\tIsDefault int32  `protobuf:\"varint,9,opt,name=is_default,json=isDefault,proto3\" json:\"is_default,omitempty\"`\n}\n\nfunc (x *CreateAddressReq) Reset() {\n\t*x = CreateAddressReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_v1_user_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CreateAddressReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreateAddressReq) ProtoMessage() {}\n\nfunc (x *CreateAddressReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_v1_user_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreateAddressReq.ProtoReflect.Descriptor instead.\nfunc (*CreateAddressReq) Descriptor() ([]byte, []int) {\n\treturn file_user_v1_user_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *CreateAddressReq) GetUid() int64 {\n\tif x != nil {\n\t\treturn x.Uid\n\t}\n\treturn 0\n}\n\nfunc (x *CreateAddressReq) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetMobile() string {\n\tif x != nil {\n\t\treturn x.Mobile\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetProvince() string {\n\tif x != nil {\n\t\treturn x.Province\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetCity() string {\n\tif x != nil {\n\t\treturn x.City\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetDistricts() string {\n\tif x != nil {\n\t\treturn x.Districts\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetAddress() string {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetPostCode() string {\n\tif x != nil {\n\t\treturn x.PostCode\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetIsDefault() int32 {\n\tif x != nil {\n\t\treturn x.IsDefault\n\t}\n\treturn 0\n}\n\ntype UpdateAddressReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUid       int64  `protobuf:\"varint,1,opt,name=uid,proto3\" json:\"uid,omitempty\"`\n\tName      string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tMobile    string `protobuf:\"bytes,3,opt,name=mobile,proto3\" json:\"mobile,omitempty\"`\n\tProvince  string `protobuf:\"bytes,4,opt,name=Province,proto3\" json:\"Province,omitempty\"`\n\tCity      string `protobuf:\"bytes,5,opt,name=City,proto3\" json:\"City,omitempty\"`\n\tDistricts string `protobuf:\"bytes,6,opt,name=Districts,proto3\" json:\"Districts,omitempty\"`\n\tAddress   string `protobuf:\"bytes,7,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tPostCode  string `protobuf:\"bytes,8,opt,name=post_code,json=postCode,proto3\" json:\"post_code,omitempty\"`\n\tIsDefault int32  `protobuf:\"varint,9,opt,name=is_default,json=isDefault,proto3\" json:\"is_default,omitempty\"`\n\tId        int64  `protobuf:\"varint,10,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *UpdateAddressReq) Reset() {\n\t*x = UpdateAddressReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_v1_user_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *UpdateAddressReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UpdateAddressReq) ProtoMessage() {}\n\nfunc (x *UpdateAddressReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_v1_user_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UpdateAddressReq.ProtoReflect.Descriptor instead.\nfunc (*UpdateAddressReq) Descriptor() ([]byte, []int) {\n\treturn file_user_v1_user_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *UpdateAddressReq) GetUid() int64 {\n\tif x != nil {\n\t\treturn x.Uid\n\t}\n\treturn 0\n}\n\nfunc (x *UpdateAddressReq) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetMobile() string {\n\tif x != nil {\n\t\treturn x.Mobile\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetProvince() string {\n\tif x != nil {\n\t\treturn x.Province\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetCity() string {\n\tif x != nil {\n\t\treturn x.City\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetDistricts() string {\n\tif x != nil {\n\t\treturn x.Districts\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetAddress() string {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetPostCode() string {\n\tif x != nil {\n\t\treturn x.PostCode\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetIsDefault() int32 {\n\tif x != nil {\n\t\treturn x.IsDefault\n\t}\n\treturn 0\n}\n\nfunc (x *UpdateAddressReq) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\ntype AddressReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId  int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tUid int64 `protobuf:\"varint,2,opt,name=uid,proto3\" json:\"uid,omitempty\"`\n}\n\nfunc (x *AddressReq) Reset() {\n\t*x = AddressReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_v1_user_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AddressReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AddressReq) ProtoMessage() {}\n\nfunc (x *AddressReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_v1_user_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AddressReq.ProtoReflect.Descriptor instead.\nfunc (*AddressReq) Descriptor() ([]byte, []int) {\n\treturn file_user_v1_user_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *AddressReq) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *AddressReq) GetUid() int64 {\n\tif x != nil {\n\t\treturn x.Uid\n\t}\n\treturn 0\n}\n\ntype CheckResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tSuccess bool `protobuf:\"varint,1,opt,name=success,proto3\" json:\"success,omitempty\"`\n}\n\nfunc (x *CheckResponse) Reset() {\n\t*x = CheckResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_v1_user_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CheckResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CheckResponse) ProtoMessage() {}\n\nfunc (x *CheckResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_v1_user_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CheckResponse.ProtoReflect.Descriptor instead.\nfunc (*CheckResponse) Descriptor() ([]byte, []int) {\n\treturn file_user_v1_user_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *CheckResponse) GetSuccess() bool {\n\tif x != nil {\n\t\treturn x.Success\n\t}\n\treturn false\n}\n\n// 分页\ntype PageInfo struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPn    uint32 `protobuf:\"varint,1,opt,name=pn,proto3\" json:\"pn,omitempty\"`\n\tPSize uint32 `protobuf:\"varint,2,opt,name=pSize,proto3\" json:\"pSize,omitempty\"`\n}\n\nfunc (x *PageInfo) Reset() {\n\t*x = PageInfo{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_v1_user_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *PageInfo) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*PageInfo) ProtoMessage() {}\n\nfunc (x *PageInfo) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_v1_user_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use PageInfo.ProtoReflect.Descriptor instead.\nfunc (*PageInfo) Descriptor() ([]byte, []int) {\n\treturn file_user_v1_user_proto_rawDescGZIP(), []int{7}\n}\n\nfunc (x *PageInfo) GetPn() uint32 {\n\tif x != nil {\n\t\treturn x.Pn\n\t}\n\treturn 0\n}\n\nfunc (x *PageInfo) GetPSize() uint32 {\n\tif x != nil {\n\t\treturn x.PSize\n\t}\n\treturn 0\n}\n\n// 用户信息\ntype UserInfoResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId       int64  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tPassword string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\"`\n\tMobile   string `protobuf:\"bytes,3,opt,name=mobile,proto3\" json:\"mobile,omitempty\"`\n\tNickName string `protobuf:\"bytes,4,opt,name=nickName,proto3\" json:\"nickName,omitempty\"`\n\tBirthday uint64 `protobuf:\"varint,5,opt,name=birthday,proto3\" json:\"birthday,omitempty\"`\n\tGender   string `protobuf:\"bytes,6,opt,name=gender,proto3\" json:\"gender,omitempty\"`\n\tRole     int32  `protobuf:\"varint,7,opt,name=role,proto3\" json:\"role,omitempty\"`\n}\n\nfunc (x *UserInfoResponse) Reset() {\n\t*x = UserInfoResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_v1_user_proto_msgTypes[8]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *UserInfoResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UserInfoResponse) ProtoMessage() {}\n\nfunc (x *UserInfoResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_v1_user_proto_msgTypes[8]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UserInfoResponse.ProtoReflect.Descriptor instead.\nfunc (*UserInfoResponse) Descriptor() ([]byte, []int) {\n\treturn file_user_v1_user_proto_rawDescGZIP(), []int{8}\n}\n\nfunc (x *UserInfoResponse) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *UserInfoResponse) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *UserInfoResponse) GetMobile() string {\n\tif x != nil {\n\t\treturn x.Mobile\n\t}\n\treturn \"\"\n}\n\nfunc (x *UserInfoResponse) GetNickName() string {\n\tif x != nil {\n\t\treturn x.NickName\n\t}\n\treturn \"\"\n}\n\nfunc (x *UserInfoResponse) GetBirthday() uint64 {\n\tif x != nil {\n\t\treturn x.Birthday\n\t}\n\treturn 0\n}\n\nfunc (x *UserInfoResponse) GetGender() string {\n\tif x != nil {\n\t\treturn x.Gender\n\t}\n\treturn \"\"\n}\n\nfunc (x *UserInfoResponse) GetRole() int32 {\n\tif x != nil {\n\t\treturn x.Role\n\t}\n\treturn 0\n}\n\n// 用户列表\ntype UserListResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tTotal int32               `protobuf:\"varint,1,opt,name=total,proto3\" json:\"total,omitempty\"`\n\tData  []*UserInfoResponse `protobuf:\"bytes,2,rep,name=data,proto3\" json:\"data,omitempty\"`\n}\n\nfunc (x *UserListResponse) Reset() {\n\t*x = UserListResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_v1_user_proto_msgTypes[9]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *UserListResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UserListResponse) ProtoMessage() {}\n\nfunc (x *UserListResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_v1_user_proto_msgTypes[9]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UserListResponse.ProtoReflect.Descriptor instead.\nfunc (*UserListResponse) Descriptor() ([]byte, []int) {\n\treturn file_user_v1_user_proto_rawDescGZIP(), []int{9}\n}\n\nfunc (x *UserListResponse) GetTotal() int32 {\n\tif x != nil {\n\t\treturn x.Total\n\t}\n\treturn 0\n}\n\nfunc (x *UserListResponse) GetData() []*UserInfoResponse {\n\tif x != nil {\n\t\treturn x.Data\n\t}\n\treturn nil\n}\n\ntype MobileRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMobile string `protobuf:\"bytes,1,opt,name=mobile,proto3\" json:\"mobile,omitempty\"`\n}\n\nfunc (x *MobileRequest) Reset() {\n\t*x = MobileRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_v1_user_proto_msgTypes[10]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MobileRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MobileRequest) ProtoMessage() {}\n\nfunc (x *MobileRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_v1_user_proto_msgTypes[10]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MobileRequest.ProtoReflect.Descriptor instead.\nfunc (*MobileRequest) Descriptor() ([]byte, []int) {\n\treturn file_user_v1_user_proto_rawDescGZIP(), []int{10}\n}\n\nfunc (x *MobileRequest) GetMobile() string {\n\tif x != nil {\n\t\treturn x.Mobile\n\t}\n\treturn \"\"\n}\n\ntype IdRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *IdRequest) Reset() {\n\t*x = IdRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_v1_user_proto_msgTypes[11]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *IdRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*IdRequest) ProtoMessage() {}\n\nfunc (x *IdRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_v1_user_proto_msgTypes[11]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use IdRequest.ProtoReflect.Descriptor instead.\nfunc (*IdRequest) Descriptor() ([]byte, []int) {\n\treturn file_user_v1_user_proto_rawDescGZIP(), []int{11}\n}\n\nfunc (x *IdRequest) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\n// 创建用户\ntype CreateUserInfo struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tNickName string `protobuf:\"bytes,1,opt,name=nickName,proto3\" json:\"nickName,omitempty\"`\n\tPassword string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\"`\n\tMobile   string `protobuf:\"bytes,3,opt,name=mobile,proto3\" json:\"mobile,omitempty\"`\n}\n\nfunc (x *CreateUserInfo) Reset() {\n\t*x = CreateUserInfo{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_v1_user_proto_msgTypes[12]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CreateUserInfo) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreateUserInfo) ProtoMessage() {}\n\nfunc (x *CreateUserInfo) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_v1_user_proto_msgTypes[12]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreateUserInfo.ProtoReflect.Descriptor instead.\nfunc (*CreateUserInfo) Descriptor() ([]byte, []int) {\n\treturn file_user_v1_user_proto_rawDescGZIP(), []int{12}\n}\n\nfunc (x *CreateUserInfo) GetNickName() string {\n\tif x != nil {\n\t\treturn x.NickName\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateUserInfo) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateUserInfo) GetMobile() string {\n\tif x != nil {\n\t\treturn x.Mobile\n\t}\n\treturn \"\"\n}\n\ntype UpdateUserInfo struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId       int64  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tNickName string `protobuf:\"bytes,2,opt,name=nickName,proto3\" json:\"nickName,omitempty\"`\n\tGender   string `protobuf:\"bytes,3,opt,name=gender,proto3\" json:\"gender,omitempty\"`\n\tBirthday uint64 `protobuf:\"varint,4,opt,name=birthday,proto3\" json:\"birthday,omitempty\"`\n}\n\nfunc (x *UpdateUserInfo) Reset() {\n\t*x = UpdateUserInfo{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_v1_user_proto_msgTypes[13]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *UpdateUserInfo) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UpdateUserInfo) ProtoMessage() {}\n\nfunc (x *UpdateUserInfo) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_v1_user_proto_msgTypes[13]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UpdateUserInfo.ProtoReflect.Descriptor instead.\nfunc (*UpdateUserInfo) Descriptor() ([]byte, []int) {\n\treturn file_user_v1_user_proto_rawDescGZIP(), []int{13}\n}\n\nfunc (x *UpdateUserInfo) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *UpdateUserInfo) GetNickName() string {\n\tif x != nil {\n\t\treturn x.NickName\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateUserInfo) GetGender() string {\n\tif x != nil {\n\t\treturn x.Gender\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateUserInfo) GetBirthday() uint64 {\n\tif x != nil {\n\t\treturn x.Birthday\n\t}\n\treturn 0\n}\n\ntype PasswordCheckInfo struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPassword          string `protobuf:\"bytes,1,opt,name=password,proto3\" json:\"password,omitempty\"`\n\tEncryptedPassword string `protobuf:\"bytes,2,opt,name=encryptedPassword,proto3\" json:\"encryptedPassword,omitempty\"`\n}\n\nfunc (x *PasswordCheckInfo) Reset() {\n\t*x = PasswordCheckInfo{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_v1_user_proto_msgTypes[14]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *PasswordCheckInfo) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*PasswordCheckInfo) ProtoMessage() {}\n\nfunc (x *PasswordCheckInfo) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_v1_user_proto_msgTypes[14]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use PasswordCheckInfo.ProtoReflect.Descriptor instead.\nfunc (*PasswordCheckInfo) Descriptor() ([]byte, []int) {\n\treturn file_user_v1_user_proto_rawDescGZIP(), []int{14}\n}\n\nfunc (x *PasswordCheckInfo) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *PasswordCheckInfo) GetEncryptedPassword() string {\n\tif x != nil {\n\t\treturn x.EncryptedPassword\n\t}\n\treturn \"\"\n}\n\nvar File_user_v1_user_proto protoreflect.FileDescriptor\n\nvar file_user_v1_user_proto_rawDesc = []byte{\n\t0x0a, 0x12, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x12, 0x07, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65,\n\t0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x22, 0x0a, 0x0e, 0x4c, 0x69,\n\t0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x12, 0x10, 0x0a, 0x03,\n\t0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0xed,\n\t0x01, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e,\n\t0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12,\n\t0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72,\n\t0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72,\n\t0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x69, 0x74, 0x79, 0x18, 0x05,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x43, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x69,\n\t0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44,\n\t0x69, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72,\n\t0x65, 0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65,\n\t0x73, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18,\n\t0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12,\n\t0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x09, 0x20,\n\t0x01, 0x28, 0x05, 0x52, 0x09, 0x69, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x42,\n\t0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x70,\n\t0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20,\n\t0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64,\n\t0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c,\n\t0x74, 0x73, 0x22, 0xf4, 0x01, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x64, 0x64,\n\t0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a,\n\t0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d,\n\t0x6f, 0x62, 0x69, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63,\n\t0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63,\n\t0x65, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x04, 0x43, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x63,\n\t0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69,\n\t0x63, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x07,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1b, 0x0a,\n\t0x09, 0x70, 0x6f, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x08, 0x70, 0x6f, 0x73, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73,\n\t0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09,\n\t0x69, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x84, 0x02, 0x0a, 0x10, 0x55, 0x70,\n\t0x64, 0x61, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x12, 0x10,\n\t0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x75, 0x69, 0x64,\n\t0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x18, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08,\n\t0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,\n\t0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x69, 0x74, 0x79,\n\t0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x43, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09,\n\t0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x09, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64,\n\t0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64,\n\t0x72, 0x65, 0x73, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x64,\n\t0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x74, 0x43, 0x6f, 0x64,\n\t0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18,\n\t0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x69, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74,\n\t0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64,\n\t0x22, 0x2e, 0x0a, 0x0a, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x12, 0x0e,\n\t0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10,\n\t0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x75, 0x69, 0x64,\n\t0x22, 0x29, 0x0a, 0x0d, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,\n\t0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x30, 0x0a, 0x08, 0x50,\n\t0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x70, 0x6e, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x0d, 0x52, 0x02, 0x70, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x53, 0x69, 0x7a, 0x65,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x70, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xba, 0x01,\n\t0x0a, 0x10, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,\n\t0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02,\n\t0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x16,\n\t0x0a, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,\n\t0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x4e, 0x61,\n\t0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x4e, 0x61,\n\t0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x69, 0x72, 0x74, 0x68, 0x64, 0x61, 0x79, 0x18, 0x05,\n\t0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x62, 0x69, 0x72, 0x74, 0x68, 0x64, 0x61, 0x79, 0x12, 0x16,\n\t0x0a, 0x06, 0x67, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,\n\t0x67, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x07,\n\t0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x57, 0x0a, 0x10, 0x55, 0x73,\n\t0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14,\n\t0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74,\n\t0x6f, 0x74, 0x61, 0x6c, 0x12, 0x2d, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03,\n\t0x28, 0x0b, 0x32, 0x19, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65,\n\t0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x04, 0x64,\n\t0x61, 0x74, 0x61, 0x22, 0x27, 0x0a, 0x0d, 0x4d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x22, 0x1b, 0x0a, 0x09,\n\t0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x22, 0x60, 0x0a, 0x0e, 0x43, 0x72, 0x65,\n\t0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x6e,\n\t0x69, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e,\n\t0x69, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77,\n\t0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77,\n\t0x6f, 0x72, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x22, 0x70, 0x0a, 0x0e, 0x55,\n\t0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a,\n\t0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a,\n\t0x08, 0x6e, 0x69, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x08, 0x6e, 0x69, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x67, 0x65, 0x6e,\n\t0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x67, 0x65, 0x6e, 0x64, 0x65,\n\t0x72, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x69, 0x72, 0x74, 0x68, 0x64, 0x61, 0x79, 0x18, 0x04, 0x20,\n\t0x01, 0x28, 0x04, 0x52, 0x08, 0x62, 0x69, 0x72, 0x74, 0x68, 0x64, 0x61, 0x79, 0x22, 0x5d, 0x0a,\n\t0x11, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x6e,\n\t0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x2c,\n\t0x0a, 0x11, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x50, 0x61, 0x73, 0x73, 0x77,\n\t0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x65, 0x6e, 0x63, 0x72, 0x79,\n\t0x70, 0x74, 0x65, 0x64, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x32, 0xa4, 0x06, 0x0a,\n\t0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x3d, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72,\n\t0x4c, 0x69, 0x73, 0x74, 0x12, 0x11, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50,\n\t0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0x19, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76,\n\t0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,\n\t0x73, 0x65, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x42,\n\t0x79, 0x4d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x12, 0x16, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76,\n\t0x31, 0x2e, 0x4d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,\n\t0x19, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e,\n\t0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x0b,\n\t0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x42, 0x79, 0x49, 0x64, 0x12, 0x12, 0x2e, 0x75, 0x73,\n\t0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,\n\t0x19, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e,\n\t0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0a,\n\t0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x17, 0x2e, 0x75, 0x73, 0x65,\n\t0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49,\n\t0x6e, 0x66, 0x6f, 0x1a, 0x19, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73,\n\t0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00,\n\t0x12, 0x3f, 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x17,\n\t0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55,\n\t0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22,\n\t0x00, 0x12, 0x45, 0x0a, 0x0d, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f,\n\t0x72, 0x64, 0x12, 0x1a, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x73,\n\t0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0x16,\n\t0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65,\n\t0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x43, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74,\n\t0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x17, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76,\n\t0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71,\n\t0x1a, 0x19, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41,\n\t0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a,\n\t0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x19,\n\t0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41,\n\t0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x75, 0x73, 0x65, 0x72,\n\t0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x22,\n\t0x00, 0x12, 0x44, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65,\n\t0x73, 0x73, 0x12, 0x19, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64,\n\t0x61, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e,\n\t0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73,\n\t0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x0e, 0x44, 0x65, 0x66, 0x61, 0x75,\n\t0x6c, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x13, 0x2e, 0x75, 0x73, 0x65, 0x72,\n\t0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x16,\n\t0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65,\n\t0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65,\n\t0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x13, 0x2e, 0x75, 0x73, 0x65, 0x72,\n\t0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x16,\n\t0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65,\n\t0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x39, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x41,\n\t0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x13, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31,\n\t0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x75, 0x73,\n\t0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x66,\n\t0x6f, 0x22, 0x00, 0x42, 0x15, 0x5a, 0x13, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x2f,\n\t0x75, 0x73, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x3b, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x33,\n}\n\nvar (\n\tfile_user_v1_user_proto_rawDescOnce sync.Once\n\tfile_user_v1_user_proto_rawDescData = file_user_v1_user_proto_rawDesc\n)\n\nfunc file_user_v1_user_proto_rawDescGZIP() []byte {\n\tfile_user_v1_user_proto_rawDescOnce.Do(func() {\n\t\tfile_user_v1_user_proto_rawDescData = protoimpl.X.CompressGZIP(file_user_v1_user_proto_rawDescData)\n\t})\n\treturn file_user_v1_user_proto_rawDescData\n}\n\nvar file_user_v1_user_proto_msgTypes = make([]protoimpl.MessageInfo, 15)\nvar file_user_v1_user_proto_goTypes = []interface{}{\n\t(*ListAddressReq)(nil),    // 0: user.v1.ListAddressReq\n\t(*AddressInfo)(nil),       // 1: user.v1.AddressInfo\n\t(*ListAddressReply)(nil),  // 2: user.v1.ListAddressReply\n\t(*CreateAddressReq)(nil),  // 3: user.v1.CreateAddressReq\n\t(*UpdateAddressReq)(nil),  // 4: user.v1.UpdateAddressReq\n\t(*AddressReq)(nil),        // 5: user.v1.AddressReq\n\t(*CheckResponse)(nil),     // 6: user.v1.CheckResponse\n\t(*PageInfo)(nil),          // 7: user.v1.PageInfo\n\t(*UserInfoResponse)(nil),  // 8: user.v1.UserInfoResponse\n\t(*UserListResponse)(nil),  // 9: user.v1.UserListResponse\n\t(*MobileRequest)(nil),     // 10: user.v1.MobileRequest\n\t(*IdRequest)(nil),         // 11: user.v1.IdRequest\n\t(*CreateUserInfo)(nil),    // 12: user.v1.CreateUserInfo\n\t(*UpdateUserInfo)(nil),    // 13: user.v1.UpdateUserInfo\n\t(*PasswordCheckInfo)(nil), // 14: user.v1.PasswordCheckInfo\n\t(*emptypb.Empty)(nil),     // 15: google.protobuf.Empty\n}\nvar file_user_v1_user_proto_depIdxs = []int32{\n\t1,  // 0: user.v1.ListAddressReply.results:type_name -> user.v1.AddressInfo\n\t8,  // 1: user.v1.UserListResponse.data:type_name -> user.v1.UserInfoResponse\n\t7,  // 2: user.v1.User.GetUserList:input_type -> user.v1.PageInfo\n\t10, // 3: user.v1.User.GetUserByMobile:input_type -> user.v1.MobileRequest\n\t11, // 4: user.v1.User.GetUserById:input_type -> user.v1.IdRequest\n\t12, // 5: user.v1.User.CreateUser:input_type -> user.v1.CreateUserInfo\n\t13, // 6: user.v1.User.UpdateUser:input_type -> user.v1.UpdateUserInfo\n\t14, // 7: user.v1.User.CheckPassword:input_type -> user.v1.PasswordCheckInfo\n\t0,  // 8: user.v1.User.ListAddress:input_type -> user.v1.ListAddressReq\n\t3,  // 9: user.v1.User.CreateAddress:input_type -> user.v1.CreateAddressReq\n\t4,  // 10: user.v1.User.UpdateAddress:input_type -> user.v1.UpdateAddressReq\n\t5,  // 11: user.v1.User.DefaultAddress:input_type -> user.v1.AddressReq\n\t5,  // 12: user.v1.User.DeleteAddress:input_type -> user.v1.AddressReq\n\t5,  // 13: user.v1.User.GetAddress:input_type -> user.v1.AddressReq\n\t9,  // 14: user.v1.User.GetUserList:output_type -> user.v1.UserListResponse\n\t8,  // 15: user.v1.User.GetUserByMobile:output_type -> user.v1.UserInfoResponse\n\t8,  // 16: user.v1.User.GetUserById:output_type -> user.v1.UserInfoResponse\n\t8,  // 17: user.v1.User.CreateUser:output_type -> user.v1.UserInfoResponse\n\t15, // 18: user.v1.User.UpdateUser:output_type -> google.protobuf.Empty\n\t6,  // 19: user.v1.User.CheckPassword:output_type -> user.v1.CheckResponse\n\t2,  // 20: user.v1.User.ListAddress:output_type -> user.v1.ListAddressReply\n\t1,  // 21: user.v1.User.CreateAddress:output_type -> user.v1.AddressInfo\n\t6,  // 22: user.v1.User.UpdateAddress:output_type -> user.v1.CheckResponse\n\t6,  // 23: user.v1.User.DefaultAddress:output_type -> user.v1.CheckResponse\n\t6,  // 24: user.v1.User.DeleteAddress:output_type -> user.v1.CheckResponse\n\t1,  // 25: user.v1.User.GetAddress:output_type -> user.v1.AddressInfo\n\t14, // [14:26] is the sub-list for method output_type\n\t2,  // [2:14] is the sub-list for method input_type\n\t2,  // [2:2] is the sub-list for extension type_name\n\t2,  // [2:2] is the sub-list for extension extendee\n\t0,  // [0:2] is the sub-list for field type_name\n}\n\nfunc init() { file_user_v1_user_proto_init() }\nfunc file_user_v1_user_proto_init() {\n\tif File_user_v1_user_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_user_v1_user_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListAddressReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_v1_user_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AddressInfo); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_v1_user_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListAddressReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_v1_user_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CreateAddressReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_v1_user_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*UpdateAddressReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_v1_user_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AddressReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_v1_user_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CheckResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_v1_user_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*PageInfo); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_v1_user_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*UserInfoResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_v1_user_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*UserListResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_v1_user_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MobileRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_v1_user_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*IdRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_v1_user_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CreateUserInfo); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_v1_user_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*UpdateUserInfo); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_v1_user_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*PasswordCheckInfo); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_user_v1_user_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   15,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_user_v1_user_proto_goTypes,\n\t\tDependencyIndexes: file_user_v1_user_proto_depIdxs,\n\t\tMessageInfos:      file_user_v1_user_proto_msgTypes,\n\t}.Build()\n\tFile_user_v1_user_proto = out.File\n\tfile_user_v1_user_proto_rawDesc = nil\n\tfile_user_v1_user_proto_goTypes = nil\n\tfile_user_v1_user_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "service/order/api/user/v1/user.pb.validate.go",
    "content": "// Code generated by protoc-gen-validate. DO NOT EDIT.\n// source: user/v1/user.proto\n\npackage v1\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"net/mail\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"sort\"\n\t\"strings\"\n\t\"time\"\n\t\"unicode/utf8\"\n\n\t\"google.golang.org/protobuf/types/known/anypb\"\n)\n\n// ensure the imports are used\nvar (\n\t_ = bytes.MinRead\n\t_ = errors.New(\"\")\n\t_ = fmt.Print\n\t_ = utf8.UTFMax\n\t_ = (*regexp.Regexp)(nil)\n\t_ = (*strings.Reader)(nil)\n\t_ = net.IPv4len\n\t_ = time.Duration(0)\n\t_ = (*url.URL)(nil)\n\t_ = (*mail.Address)(nil)\n\t_ = anypb.Any{}\n\t_ = sort.Sort\n)\n\n// Validate checks the field values on ListAddressReq with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *ListAddressReq) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on ListAddressReq with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in ListAddressReqMultiError,\n// or nil if none found.\nfunc (m *ListAddressReq) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *ListAddressReq) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Uid\n\n\tif len(errors) > 0 {\n\t\treturn ListAddressReqMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// ListAddressReqMultiError is an error wrapping multiple validation errors\n// returned by ListAddressReq.ValidateAll() if the designated constraints\n// aren't met.\ntype ListAddressReqMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m ListAddressReqMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m ListAddressReqMultiError) AllErrors() []error { return m }\n\n// ListAddressReqValidationError is the validation error returned by\n// ListAddressReq.Validate if the designated constraints aren't met.\ntype ListAddressReqValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e ListAddressReqValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e ListAddressReqValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e ListAddressReqValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e ListAddressReqValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e ListAddressReqValidationError) ErrorName() string { return \"ListAddressReqValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e ListAddressReqValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sListAddressReq.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = ListAddressReqValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = ListAddressReqValidationError{}\n\n// Validate checks the field values on AddressInfo with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *AddressInfo) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on AddressInfo with the rules defined in\n// the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in AddressInfoMultiError, or\n// nil if none found.\nfunc (m *AddressInfo) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *AddressInfo) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for Name\n\n\t// no validation rules for Mobile\n\n\t// no validation rules for Province\n\n\t// no validation rules for City\n\n\t// no validation rules for Districts\n\n\t// no validation rules for Address\n\n\t// no validation rules for PostCode\n\n\t// no validation rules for IsDefault\n\n\tif len(errors) > 0 {\n\t\treturn AddressInfoMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// AddressInfoMultiError is an error wrapping multiple validation errors\n// returned by AddressInfo.ValidateAll() if the designated constraints aren't met.\ntype AddressInfoMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m AddressInfoMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m AddressInfoMultiError) AllErrors() []error { return m }\n\n// AddressInfoValidationError is the validation error returned by\n// AddressInfo.Validate if the designated constraints aren't met.\ntype AddressInfoValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e AddressInfoValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e AddressInfoValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e AddressInfoValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e AddressInfoValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e AddressInfoValidationError) ErrorName() string { return \"AddressInfoValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e AddressInfoValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sAddressInfo.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = AddressInfoValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = AddressInfoValidationError{}\n\n// Validate checks the field values on ListAddressReply with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *ListAddressReply) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on ListAddressReply with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// ListAddressReplyMultiError, or nil if none found.\nfunc (m *ListAddressReply) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *ListAddressReply) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\tfor idx, item := range m.GetResults() {\n\t\t_, _ = idx, item\n\n\t\tif all {\n\t\t\tswitch v := interface{}(item).(type) {\n\t\t\tcase interface{ ValidateAll() error }:\n\t\t\t\tif err := v.ValidateAll(); err != nil {\n\t\t\t\t\terrors = append(errors, ListAddressReplyValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"Results[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\tcase interface{ Validate() error }:\n\t\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\t\terrors = append(errors, ListAddressReplyValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"Results[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t} else if v, ok := interface{}(item).(interface{ Validate() error }); ok {\n\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\treturn ListAddressReplyValidationError{\n\t\t\t\t\tfield:  fmt.Sprintf(\"Results[%v]\", idx),\n\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\tcause:  err,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn ListAddressReplyMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// ListAddressReplyMultiError is an error wrapping multiple validation errors\n// returned by ListAddressReply.ValidateAll() if the designated constraints\n// aren't met.\ntype ListAddressReplyMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m ListAddressReplyMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m ListAddressReplyMultiError) AllErrors() []error { return m }\n\n// ListAddressReplyValidationError is the validation error returned by\n// ListAddressReply.Validate if the designated constraints aren't met.\ntype ListAddressReplyValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e ListAddressReplyValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e ListAddressReplyValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e ListAddressReplyValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e ListAddressReplyValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e ListAddressReplyValidationError) ErrorName() string { return \"ListAddressReplyValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e ListAddressReplyValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sListAddressReply.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = ListAddressReplyValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = ListAddressReplyValidationError{}\n\n// Validate checks the field values on CreateAddressReq with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *CreateAddressReq) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CreateAddressReq with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// CreateAddressReqMultiError, or nil if none found.\nfunc (m *CreateAddressReq) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CreateAddressReq) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Uid\n\n\t// no validation rules for Name\n\n\t// no validation rules for Mobile\n\n\t// no validation rules for Province\n\n\t// no validation rules for City\n\n\t// no validation rules for Districts\n\n\t// no validation rules for Address\n\n\t// no validation rules for PostCode\n\n\t// no validation rules for IsDefault\n\n\tif len(errors) > 0 {\n\t\treturn CreateAddressReqMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CreateAddressReqMultiError is an error wrapping multiple validation errors\n// returned by CreateAddressReq.ValidateAll() if the designated constraints\n// aren't met.\ntype CreateAddressReqMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CreateAddressReqMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CreateAddressReqMultiError) AllErrors() []error { return m }\n\n// CreateAddressReqValidationError is the validation error returned by\n// CreateAddressReq.Validate if the designated constraints aren't met.\ntype CreateAddressReqValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CreateAddressReqValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CreateAddressReqValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CreateAddressReqValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CreateAddressReqValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CreateAddressReqValidationError) ErrorName() string { return \"CreateAddressReqValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e CreateAddressReqValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCreateAddressReq.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CreateAddressReqValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CreateAddressReqValidationError{}\n\n// Validate checks the field values on UpdateAddressReq with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *UpdateAddressReq) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on UpdateAddressReq with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// UpdateAddressReqMultiError, or nil if none found.\nfunc (m *UpdateAddressReq) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *UpdateAddressReq) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Uid\n\n\t// no validation rules for Name\n\n\t// no validation rules for Mobile\n\n\t// no validation rules for Province\n\n\t// no validation rules for City\n\n\t// no validation rules for Districts\n\n\t// no validation rules for Address\n\n\t// no validation rules for PostCode\n\n\t// no validation rules for IsDefault\n\n\t// no validation rules for Id\n\n\tif len(errors) > 0 {\n\t\treturn UpdateAddressReqMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// UpdateAddressReqMultiError is an error wrapping multiple validation errors\n// returned by UpdateAddressReq.ValidateAll() if the designated constraints\n// aren't met.\ntype UpdateAddressReqMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m UpdateAddressReqMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m UpdateAddressReqMultiError) AllErrors() []error { return m }\n\n// UpdateAddressReqValidationError is the validation error returned by\n// UpdateAddressReq.Validate if the designated constraints aren't met.\ntype UpdateAddressReqValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e UpdateAddressReqValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e UpdateAddressReqValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e UpdateAddressReqValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e UpdateAddressReqValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e UpdateAddressReqValidationError) ErrorName() string { return \"UpdateAddressReqValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e UpdateAddressReqValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sUpdateAddressReq.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = UpdateAddressReqValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = UpdateAddressReqValidationError{}\n\n// Validate checks the field values on AddressReq with the rules defined in the\n// proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *AddressReq) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on AddressReq with the rules defined in\n// the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in AddressReqMultiError, or\n// nil if none found.\nfunc (m *AddressReq) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *AddressReq) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for Uid\n\n\tif len(errors) > 0 {\n\t\treturn AddressReqMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// AddressReqMultiError is an error wrapping multiple validation errors\n// returned by AddressReq.ValidateAll() if the designated constraints aren't met.\ntype AddressReqMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m AddressReqMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m AddressReqMultiError) AllErrors() []error { return m }\n\n// AddressReqValidationError is the validation error returned by\n// AddressReq.Validate if the designated constraints aren't met.\ntype AddressReqValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e AddressReqValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e AddressReqValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e AddressReqValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e AddressReqValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e AddressReqValidationError) ErrorName() string { return \"AddressReqValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e AddressReqValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sAddressReq.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = AddressReqValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = AddressReqValidationError{}\n\n// Validate checks the field values on CheckResponse with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *CheckResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CheckResponse with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in CheckResponseMultiError, or\n// nil if none found.\nfunc (m *CheckResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CheckResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Success\n\n\tif len(errors) > 0 {\n\t\treturn CheckResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CheckResponseMultiError is an error wrapping multiple validation errors\n// returned by CheckResponse.ValidateAll() if the designated constraints\n// aren't met.\ntype CheckResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CheckResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CheckResponseMultiError) AllErrors() []error { return m }\n\n// CheckResponseValidationError is the validation error returned by\n// CheckResponse.Validate if the designated constraints aren't met.\ntype CheckResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CheckResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CheckResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CheckResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CheckResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CheckResponseValidationError) ErrorName() string { return \"CheckResponseValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e CheckResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCheckResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CheckResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CheckResponseValidationError{}\n\n// Validate checks the field values on PageInfo with the rules defined in the\n// proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *PageInfo) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on PageInfo with the rules defined in\n// the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in PageInfoMultiError, or nil\n// if none found.\nfunc (m *PageInfo) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *PageInfo) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Pn\n\n\t// no validation rules for PSize\n\n\tif len(errors) > 0 {\n\t\treturn PageInfoMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// PageInfoMultiError is an error wrapping multiple validation errors returned\n// by PageInfo.ValidateAll() if the designated constraints aren't met.\ntype PageInfoMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m PageInfoMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m PageInfoMultiError) AllErrors() []error { return m }\n\n// PageInfoValidationError is the validation error returned by\n// PageInfo.Validate if the designated constraints aren't met.\ntype PageInfoValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e PageInfoValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e PageInfoValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e PageInfoValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e PageInfoValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e PageInfoValidationError) ErrorName() string { return \"PageInfoValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e PageInfoValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sPageInfo.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = PageInfoValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = PageInfoValidationError{}\n\n// Validate checks the field values on UserInfoResponse with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *UserInfoResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on UserInfoResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// UserInfoResponseMultiError, or nil if none found.\nfunc (m *UserInfoResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *UserInfoResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for Password\n\n\t// no validation rules for Mobile\n\n\t// no validation rules for NickName\n\n\t// no validation rules for Birthday\n\n\t// no validation rules for Gender\n\n\t// no validation rules for Role\n\n\tif len(errors) > 0 {\n\t\treturn UserInfoResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// UserInfoResponseMultiError is an error wrapping multiple validation errors\n// returned by UserInfoResponse.ValidateAll() if the designated constraints\n// aren't met.\ntype UserInfoResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m UserInfoResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m UserInfoResponseMultiError) AllErrors() []error { return m }\n\n// UserInfoResponseValidationError is the validation error returned by\n// UserInfoResponse.Validate if the designated constraints aren't met.\ntype UserInfoResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e UserInfoResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e UserInfoResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e UserInfoResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e UserInfoResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e UserInfoResponseValidationError) ErrorName() string { return \"UserInfoResponseValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e UserInfoResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sUserInfoResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = UserInfoResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = UserInfoResponseValidationError{}\n\n// Validate checks the field values on UserListResponse with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *UserListResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on UserListResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// UserListResponseMultiError, or nil if none found.\nfunc (m *UserListResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *UserListResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Total\n\n\tfor idx, item := range m.GetData() {\n\t\t_, _ = idx, item\n\n\t\tif all {\n\t\t\tswitch v := interface{}(item).(type) {\n\t\t\tcase interface{ ValidateAll() error }:\n\t\t\t\tif err := v.ValidateAll(); err != nil {\n\t\t\t\t\terrors = append(errors, UserListResponseValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"Data[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\tcase interface{ Validate() error }:\n\t\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\t\terrors = append(errors, UserListResponseValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"Data[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t} else if v, ok := interface{}(item).(interface{ Validate() error }); ok {\n\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\treturn UserListResponseValidationError{\n\t\t\t\t\tfield:  fmt.Sprintf(\"Data[%v]\", idx),\n\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\tcause:  err,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn UserListResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// UserListResponseMultiError is an error wrapping multiple validation errors\n// returned by UserListResponse.ValidateAll() if the designated constraints\n// aren't met.\ntype UserListResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m UserListResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m UserListResponseMultiError) AllErrors() []error { return m }\n\n// UserListResponseValidationError is the validation error returned by\n// UserListResponse.Validate if the designated constraints aren't met.\ntype UserListResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e UserListResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e UserListResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e UserListResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e UserListResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e UserListResponseValidationError) ErrorName() string { return \"UserListResponseValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e UserListResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sUserListResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = UserListResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = UserListResponseValidationError{}\n\n// Validate checks the field values on MobileRequest with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *MobileRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on MobileRequest with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in MobileRequestMultiError, or\n// nil if none found.\nfunc (m *MobileRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *MobileRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Mobile\n\n\tif len(errors) > 0 {\n\t\treturn MobileRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// MobileRequestMultiError is an error wrapping multiple validation errors\n// returned by MobileRequest.ValidateAll() if the designated constraints\n// aren't met.\ntype MobileRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m MobileRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m MobileRequestMultiError) AllErrors() []error { return m }\n\n// MobileRequestValidationError is the validation error returned by\n// MobileRequest.Validate if the designated constraints aren't met.\ntype MobileRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e MobileRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e MobileRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e MobileRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e MobileRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e MobileRequestValidationError) ErrorName() string { return \"MobileRequestValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e MobileRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sMobileRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = MobileRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = MobileRequestValidationError{}\n\n// Validate checks the field values on IdRequest with the rules defined in the\n// proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *IdRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on IdRequest with the rules defined in\n// the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in IdRequestMultiError, or nil\n// if none found.\nfunc (m *IdRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *IdRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\tif len(errors) > 0 {\n\t\treturn IdRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// IdRequestMultiError is an error wrapping multiple validation errors returned\n// by IdRequest.ValidateAll() if the designated constraints aren't met.\ntype IdRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m IdRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m IdRequestMultiError) AllErrors() []error { return m }\n\n// IdRequestValidationError is the validation error returned by\n// IdRequest.Validate if the designated constraints aren't met.\ntype IdRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e IdRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e IdRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e IdRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e IdRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e IdRequestValidationError) ErrorName() string { return \"IdRequestValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e IdRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sIdRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = IdRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = IdRequestValidationError{}\n\n// Validate checks the field values on CreateUserInfo with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *CreateUserInfo) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CreateUserInfo with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in CreateUserInfoMultiError,\n// or nil if none found.\nfunc (m *CreateUserInfo) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CreateUserInfo) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for NickName\n\n\t// no validation rules for Password\n\n\t// no validation rules for Mobile\n\n\tif len(errors) > 0 {\n\t\treturn CreateUserInfoMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CreateUserInfoMultiError is an error wrapping multiple validation errors\n// returned by CreateUserInfo.ValidateAll() if the designated constraints\n// aren't met.\ntype CreateUserInfoMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CreateUserInfoMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CreateUserInfoMultiError) AllErrors() []error { return m }\n\n// CreateUserInfoValidationError is the validation error returned by\n// CreateUserInfo.Validate if the designated constraints aren't met.\ntype CreateUserInfoValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CreateUserInfoValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CreateUserInfoValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CreateUserInfoValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CreateUserInfoValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CreateUserInfoValidationError) ErrorName() string { return \"CreateUserInfoValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e CreateUserInfoValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCreateUserInfo.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CreateUserInfoValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CreateUserInfoValidationError{}\n\n// Validate checks the field values on UpdateUserInfo with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *UpdateUserInfo) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on UpdateUserInfo with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in UpdateUserInfoMultiError,\n// or nil if none found.\nfunc (m *UpdateUserInfo) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *UpdateUserInfo) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for NickName\n\n\t// no validation rules for Gender\n\n\t// no validation rules for Birthday\n\n\tif len(errors) > 0 {\n\t\treturn UpdateUserInfoMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// UpdateUserInfoMultiError is an error wrapping multiple validation errors\n// returned by UpdateUserInfo.ValidateAll() if the designated constraints\n// aren't met.\ntype UpdateUserInfoMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m UpdateUserInfoMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m UpdateUserInfoMultiError) AllErrors() []error { return m }\n\n// UpdateUserInfoValidationError is the validation error returned by\n// UpdateUserInfo.Validate if the designated constraints aren't met.\ntype UpdateUserInfoValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e UpdateUserInfoValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e UpdateUserInfoValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e UpdateUserInfoValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e UpdateUserInfoValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e UpdateUserInfoValidationError) ErrorName() string { return \"UpdateUserInfoValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e UpdateUserInfoValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sUpdateUserInfo.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = UpdateUserInfoValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = UpdateUserInfoValidationError{}\n\n// Validate checks the field values on PasswordCheckInfo with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *PasswordCheckInfo) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on PasswordCheckInfo with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// PasswordCheckInfoMultiError, or nil if none found.\nfunc (m *PasswordCheckInfo) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *PasswordCheckInfo) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Password\n\n\t// no validation rules for EncryptedPassword\n\n\tif len(errors) > 0 {\n\t\treturn PasswordCheckInfoMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// PasswordCheckInfoMultiError is an error wrapping multiple validation errors\n// returned by PasswordCheckInfo.ValidateAll() if the designated constraints\n// aren't met.\ntype PasswordCheckInfoMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m PasswordCheckInfoMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m PasswordCheckInfoMultiError) AllErrors() []error { return m }\n\n// PasswordCheckInfoValidationError is the validation error returned by\n// PasswordCheckInfo.Validate if the designated constraints aren't met.\ntype PasswordCheckInfoValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e PasswordCheckInfoValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e PasswordCheckInfoValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e PasswordCheckInfoValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e PasswordCheckInfoValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e PasswordCheckInfoValidationError) ErrorName() string {\n\treturn \"PasswordCheckInfoValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e PasswordCheckInfoValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sPasswordCheckInfo.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = PasswordCheckInfoValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = PasswordCheckInfoValidationError{}\n"
  },
  {
    "path": "service/order/api/user/v1/user.proto",
    "content": "syntax = \"proto3\";\n\npackage user.v1;\n\nimport \"google/protobuf/empty.proto\";\n\noption go_package = \"user/api/user/v1;v1\";\n\nservice User{\n  rpc GetUserList(PageInfo) returns (UserListResponse){}; // 用户列表\n  rpc GetUserByMobile(MobileRequest) returns (UserInfoResponse){}; // 通过 mobile 查询用户\n  rpc GetUserById(IdRequest) returns (UserInfoResponse){}; // 通过 Id 查询用户\n  rpc CreateUser(CreateUserInfo) returns (UserInfoResponse){}; // 创建用户\n  rpc UpdateUser(UpdateUserInfo) returns (google.protobuf.Empty){}; // 更新用户\n  rpc CheckPassword(PasswordCheckInfo) returns (CheckResponse){}; // 检查用户密码\n\n  // 收货地址\n  rpc ListAddress(ListAddressReq) returns (ListAddressReply) {} // 所有收货地址列表\n  rpc CreateAddress(CreateAddressReq) returns (AddressInfo) {} // 新增收货地址\n  rpc UpdateAddress(UpdateAddressReq) returns (CheckResponse) {} // 修改收货地址\n  rpc DefaultAddress(AddressReq) returns (CheckResponse) {} // 设置默认地址\n  rpc DeleteAddress(AddressReq) returns (CheckResponse) {} // 删除收货地址\n  rpc GetAddress(AddressReq) returns (AddressInfo) {} // 查询收货地址\n}\n\nmessage ListAddressReq {\n  int64 uid = 1;\n}\n\nmessage AddressInfo {\n  int64 id = 1;\n  string name = 2;\n  string mobile = 3;\n  string Province = 4;\n  string City = 5;\n  string Districts = 6;\n  string address = 7;\n  string post_code = 8;\n  int32 is_default = 9;\n}\nmessage ListAddressReply {\n  repeated AddressInfo results = 1;\n}\n\nmessage CreateAddressReq {\n  int64 uid = 1;\n  string name = 2;\n  string mobile = 3;\n  string Province = 4;\n  string City = 5;\n  string Districts = 6;\n  string address = 7;\n  string post_code = 8;\n  int32 is_default = 9;\n}\n\nmessage UpdateAddressReq {\n  int64 uid = 1;\n  string name = 2;\n  string mobile = 3;\n  string Province = 4;\n  string City = 5;\n  string Districts = 6;\n  string address = 7;\n  string post_code = 8;\n  int32 is_default = 9;\n  int64 id = 10;\n}\n\nmessage AddressReq {\n  int64 id = 1;\n  int64 uid = 2;\n}\n\nmessage CheckResponse{\n  bool success = 1;\n}\n\n// 分页\nmessage PageInfo{\n  uint32 pn = 1;\n  uint32 pSize = 2;\n}\n\n// 用户信息\nmessage UserInfoResponse{\n  int64 id = 1;\n  string password = 2;\n  string mobile = 3;\n  string nickName = 4;\n  uint64 birthday = 5;\n  string gender = 6;\n  int32 role = 7;\n}\n\n// 用户列表\nmessage UserListResponse{\n  int32 total = 1;\n  repeated UserInfoResponse data = 2;\n}\n\nmessage MobileRequest{\n  string mobile = 1;\n}\n\nmessage IdRequest{\n  int64 id = 1;\n}\n\n// 创建用户\nmessage  CreateUserInfo{\n  string nickName = 1;\n  string password = 2;\n  string mobile = 3;\n}\n\nmessage  UpdateUserInfo{\n  int64 id = 1;\n  string nickName = 2;\n  string gender = 3;\n  uint64 birthday = 4;\n}\n\nmessage PasswordCheckInfo{\n  string password = 1;\n  string encryptedPassword = 2;\n}"
  },
  {
    "path": "service/order/api/user/v1/user_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.2.0\n// - protoc             v3.19.4\n// source: user/v1/user.proto\n\npackage v1\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n\temptypb \"google.golang.org/protobuf/types/known/emptypb\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\n// UserClient is the client API for User service.\n//\n// 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.\ntype UserClient interface {\n\tGetUserList(ctx context.Context, in *PageInfo, opts ...grpc.CallOption) (*UserListResponse, error)\n\tGetUserByMobile(ctx context.Context, in *MobileRequest, opts ...grpc.CallOption) (*UserInfoResponse, error)\n\tGetUserById(ctx context.Context, in *IdRequest, opts ...grpc.CallOption) (*UserInfoResponse, error)\n\tCreateUser(ctx context.Context, in *CreateUserInfo, opts ...grpc.CallOption) (*UserInfoResponse, error)\n\tUpdateUser(ctx context.Context, in *UpdateUserInfo, opts ...grpc.CallOption) (*emptypb.Empty, error)\n\tCheckPassword(ctx context.Context, in *PasswordCheckInfo, opts ...grpc.CallOption) (*CheckResponse, error)\n\t// 收货地址\n\tListAddress(ctx context.Context, in *ListAddressReq, opts ...grpc.CallOption) (*ListAddressReply, error)\n\tCreateAddress(ctx context.Context, in *CreateAddressReq, opts ...grpc.CallOption) (*AddressInfo, error)\n\tUpdateAddress(ctx context.Context, in *UpdateAddressReq, opts ...grpc.CallOption) (*CheckResponse, error)\n\tDefaultAddress(ctx context.Context, in *AddressReq, opts ...grpc.CallOption) (*CheckResponse, error)\n\tDeleteAddress(ctx context.Context, in *AddressReq, opts ...grpc.CallOption) (*CheckResponse, error)\n\tGetAddress(ctx context.Context, in *AddressReq, opts ...grpc.CallOption) (*AddressInfo, error)\n}\n\ntype userClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewUserClient(cc grpc.ClientConnInterface) UserClient {\n\treturn &userClient{cc}\n}\n\nfunc (c *userClient) GetUserList(ctx context.Context, in *PageInfo, opts ...grpc.CallOption) (*UserListResponse, error) {\n\tout := new(UserListResponse)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/GetUserList\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) GetUserByMobile(ctx context.Context, in *MobileRequest, opts ...grpc.CallOption) (*UserInfoResponse, error) {\n\tout := new(UserInfoResponse)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/GetUserByMobile\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) GetUserById(ctx context.Context, in *IdRequest, opts ...grpc.CallOption) (*UserInfoResponse, error) {\n\tout := new(UserInfoResponse)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/GetUserById\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) CreateUser(ctx context.Context, in *CreateUserInfo, opts ...grpc.CallOption) (*UserInfoResponse, error) {\n\tout := new(UserInfoResponse)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/CreateUser\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) UpdateUser(ctx context.Context, in *UpdateUserInfo, opts ...grpc.CallOption) (*emptypb.Empty, error) {\n\tout := new(emptypb.Empty)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/UpdateUser\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) CheckPassword(ctx context.Context, in *PasswordCheckInfo, opts ...grpc.CallOption) (*CheckResponse, error) {\n\tout := new(CheckResponse)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/CheckPassword\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) ListAddress(ctx context.Context, in *ListAddressReq, opts ...grpc.CallOption) (*ListAddressReply, error) {\n\tout := new(ListAddressReply)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/ListAddress\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) CreateAddress(ctx context.Context, in *CreateAddressReq, opts ...grpc.CallOption) (*AddressInfo, error) {\n\tout := new(AddressInfo)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/CreateAddress\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) UpdateAddress(ctx context.Context, in *UpdateAddressReq, opts ...grpc.CallOption) (*CheckResponse, error) {\n\tout := new(CheckResponse)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/UpdateAddress\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) DefaultAddress(ctx context.Context, in *AddressReq, opts ...grpc.CallOption) (*CheckResponse, error) {\n\tout := new(CheckResponse)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/DefaultAddress\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) DeleteAddress(ctx context.Context, in *AddressReq, opts ...grpc.CallOption) (*CheckResponse, error) {\n\tout := new(CheckResponse)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/DeleteAddress\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) GetAddress(ctx context.Context, in *AddressReq, opts ...grpc.CallOption) (*AddressInfo, error) {\n\tout := new(AddressInfo)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/GetAddress\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// UserServer is the server API for User service.\n// All implementations must embed UnimplementedUserServer\n// for forward compatibility\ntype UserServer interface {\n\tGetUserList(context.Context, *PageInfo) (*UserListResponse, error)\n\tGetUserByMobile(context.Context, *MobileRequest) (*UserInfoResponse, error)\n\tGetUserById(context.Context, *IdRequest) (*UserInfoResponse, error)\n\tCreateUser(context.Context, *CreateUserInfo) (*UserInfoResponse, error)\n\tUpdateUser(context.Context, *UpdateUserInfo) (*emptypb.Empty, error)\n\tCheckPassword(context.Context, *PasswordCheckInfo) (*CheckResponse, error)\n\t// 收货地址\n\tListAddress(context.Context, *ListAddressReq) (*ListAddressReply, error)\n\tCreateAddress(context.Context, *CreateAddressReq) (*AddressInfo, error)\n\tUpdateAddress(context.Context, *UpdateAddressReq) (*CheckResponse, error)\n\tDefaultAddress(context.Context, *AddressReq) (*CheckResponse, error)\n\tDeleteAddress(context.Context, *AddressReq) (*CheckResponse, error)\n\tGetAddress(context.Context, *AddressReq) (*AddressInfo, error)\n\tmustEmbedUnimplementedUserServer()\n}\n\n// UnimplementedUserServer must be embedded to have forward compatible implementations.\ntype UnimplementedUserServer struct {\n}\n\nfunc (UnimplementedUserServer) GetUserList(context.Context, *PageInfo) (*UserListResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetUserList not implemented\")\n}\nfunc (UnimplementedUserServer) GetUserByMobile(context.Context, *MobileRequest) (*UserInfoResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetUserByMobile not implemented\")\n}\nfunc (UnimplementedUserServer) GetUserById(context.Context, *IdRequest) (*UserInfoResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetUserById not implemented\")\n}\nfunc (UnimplementedUserServer) CreateUser(context.Context, *CreateUserInfo) (*UserInfoResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method CreateUser not implemented\")\n}\nfunc (UnimplementedUserServer) UpdateUser(context.Context, *UpdateUserInfo) (*emptypb.Empty, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method UpdateUser not implemented\")\n}\nfunc (UnimplementedUserServer) CheckPassword(context.Context, *PasswordCheckInfo) (*CheckResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method CheckPassword not implemented\")\n}\nfunc (UnimplementedUserServer) ListAddress(context.Context, *ListAddressReq) (*ListAddressReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method ListAddress not implemented\")\n}\nfunc (UnimplementedUserServer) CreateAddress(context.Context, *CreateAddressReq) (*AddressInfo, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method CreateAddress not implemented\")\n}\nfunc (UnimplementedUserServer) UpdateAddress(context.Context, *UpdateAddressReq) (*CheckResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method UpdateAddress not implemented\")\n}\nfunc (UnimplementedUserServer) DefaultAddress(context.Context, *AddressReq) (*CheckResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method DefaultAddress not implemented\")\n}\nfunc (UnimplementedUserServer) DeleteAddress(context.Context, *AddressReq) (*CheckResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method DeleteAddress not implemented\")\n}\nfunc (UnimplementedUserServer) GetAddress(context.Context, *AddressReq) (*AddressInfo, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetAddress not implemented\")\n}\nfunc (UnimplementedUserServer) mustEmbedUnimplementedUserServer() {}\n\n// UnsafeUserServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to UserServer will\n// result in compilation errors.\ntype UnsafeUserServer interface {\n\tmustEmbedUnimplementedUserServer()\n}\n\nfunc RegisterUserServer(s grpc.ServiceRegistrar, srv UserServer) {\n\ts.RegisterService(&User_ServiceDesc, srv)\n}\n\nfunc _User_GetUserList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(PageInfo)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).GetUserList(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/GetUserList\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).GetUserList(ctx, req.(*PageInfo))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_GetUserByMobile_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(MobileRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).GetUserByMobile(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/GetUserByMobile\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).GetUserByMobile(ctx, req.(*MobileRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_GetUserById_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(IdRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).GetUserById(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/GetUserById\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).GetUserById(ctx, req.(*IdRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_CreateUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(CreateUserInfo)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).CreateUser(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/CreateUser\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).CreateUser(ctx, req.(*CreateUserInfo))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_UpdateUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(UpdateUserInfo)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).UpdateUser(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/UpdateUser\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).UpdateUser(ctx, req.(*UpdateUserInfo))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_CheckPassword_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(PasswordCheckInfo)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).CheckPassword(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/CheckPassword\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).CheckPassword(ctx, req.(*PasswordCheckInfo))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_ListAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(ListAddressReq)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).ListAddress(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/ListAddress\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).ListAddress(ctx, req.(*ListAddressReq))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_CreateAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(CreateAddressReq)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).CreateAddress(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/CreateAddress\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).CreateAddress(ctx, req.(*CreateAddressReq))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_UpdateAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(UpdateAddressReq)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).UpdateAddress(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/UpdateAddress\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).UpdateAddress(ctx, req.(*UpdateAddressReq))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_DefaultAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(AddressReq)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).DefaultAddress(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/DefaultAddress\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).DefaultAddress(ctx, req.(*AddressReq))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_DeleteAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(AddressReq)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).DeleteAddress(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/DeleteAddress\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).DeleteAddress(ctx, req.(*AddressReq))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_GetAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(AddressReq)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).GetAddress(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/GetAddress\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).GetAddress(ctx, req.(*AddressReq))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// User_ServiceDesc is the grpc.ServiceDesc for User service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar User_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"user.v1.User\",\n\tHandlerType: (*UserServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetUserList\",\n\t\t\tHandler:    _User_GetUserList_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetUserByMobile\",\n\t\t\tHandler:    _User_GetUserByMobile_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetUserById\",\n\t\t\tHandler:    _User_GetUserById_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"CreateUser\",\n\t\t\tHandler:    _User_CreateUser_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"UpdateUser\",\n\t\t\tHandler:    _User_UpdateUser_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"CheckPassword\",\n\t\t\tHandler:    _User_CheckPassword_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"ListAddress\",\n\t\t\tHandler:    _User_ListAddress_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"CreateAddress\",\n\t\t\tHandler:    _User_CreateAddress_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"UpdateAddress\",\n\t\t\tHandler:    _User_UpdateAddress_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"DefaultAddress\",\n\t\t\tHandler:    _User_DefaultAddress_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"DeleteAddress\",\n\t\t\tHandler:    _User_DeleteAddress_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetAddress\",\n\t\t\tHandler:    _User_GetAddress_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"user/v1/user.proto\",\n}\n"
  },
  {
    "path": "service/order/cmd/order/main.go",
    "content": "package main\n\nimport (\n\t\"flag\"\n\t\"github.com/go-kratos/kratos/v2\"\n\t\"github.com/go-kratos/kratos/v2/registry\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/exporters/jaeger\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\ttracesdk \"go.opentelemetry.io/otel/sdk/trace\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.4.0\"\n\t\"os\"\n\n\t\"github.com/go-kratos/kratos/v2/config\"\n\t\"github.com/go-kratos/kratos/v2/config/file\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"github.com/go-kratos/kratos/v2/middleware/tracing\"\n\t\"github.com/go-kratos/kratos/v2/transport/grpc\"\n\t\"order/internal/conf\"\n)\n\n// go build -ldflags \"-X main.Version=x.y.z\"\nvar (\n\t// Name is the name of the compiled software.\n\tName = \"shop.order.service\"\n\t// Version is the version of the compiled software.\n\tVersion string\n\t// flagconf is the config flag.\n\tflagconf string\n\n\tid, _ = os.Hostname()\n)\n\nfunc init() {\n\tflag.StringVar(&flagconf, \"conf\", \"../../configs\", \"config path, eg: -conf config.yaml\")\n}\n\nfunc newApp(logger log.Logger, gs *grpc.Server, rr registry.Registrar) *kratos.App {\n\treturn kratos.New(\n\t\tkratos.ID(id+\"order service\"),\n\t\tkratos.Name(Name),\n\t\tkratos.Version(Version),\n\t\tkratos.Metadata(map[string]string{}),\n\t\tkratos.Logger(logger),\n\t\tkratos.Server(\n\t\t\tgs,\n\t\t),\n\t\tkratos.Registrar(rr),\n\t)\n}\n\nfunc main() {\n\tflag.Parse()\n\tlogger := log.With(log.NewStdLogger(os.Stdout),\n\t\t\"ts\", log.DefaultTimestamp,\n\t\t\"caller\", log.DefaultCaller,\n\t\t\"service.id\", id,\n\t\t\"service.name\", Name,\n\t\t\"service.version\", Version,\n\t\t\"trace.id\", tracing.TraceID(),\n\t\t\"span.id\", tracing.SpanID(),\n\t)\n\tc := config.New(\n\t\tconfig.WithSource(\n\t\t\tfile.NewSource(flagconf),\n\t\t),\n\t)\n\tdefer c.Close()\n\n\tif err := c.Load(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tvar bc conf.Bootstrap\n\tif err := c.Scan(&bc); err != nil {\n\t\tpanic(err)\n\t}\n\n\tif err := setTracerProvider(bc.Trace.Endpoint); err != nil {\n\t\tpanic(err)\n\t}\n\n\tvar rc conf.Registry\n\tif err := c.Scan(&rc); err != nil {\n\t\tpanic(err)\n\t}\n\n\tapp, cleanup, err := wireApp(bc.Server, &rc, bc.Data, bc.Auth, bc.Service, logger)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdefer cleanup()\n\n\t// start and wait for stop signal\n\tif err := app.Run(); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// Set global trace provider\nfunc setTracerProvider(url string) error {\n\t// Create the Jaeger exporter\n\texp, err := jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(url)))\n\tif err != nil {\n\t\treturn err\n\t}\n\ttp := tracesdk.NewTracerProvider(\n\t\t// Set the sampling rate based on the parent span to 100%\n\t\ttracesdk.WithSampler(tracesdk.ParentBased(tracesdk.TraceIDRatioBased(1.0))),\n\t\t// Always be sure to batch in production.\n\t\ttracesdk.WithBatcher(exp),\n\t\t// Record information about this application in an Resource.\n\t\ttracesdk.WithResource(resource.NewSchemaless(\n\t\t\tsemconv.ServiceNameKey.String(Name),\n\t\t\tattribute.String(\"env\", \"dev\"),\n\t\t)),\n\t)\n\totel.SetTracerProvider(tp)\n\treturn nil\n}\n"
  },
  {
    "path": "service/order/cmd/order/wire.go",
    "content": "//go:build wireinject\n// +build wireinject\n\n// The build tag makes sure the stub is not built in the final build.\n\npackage main\n\nimport (\n\t\"github.com/go-kratos/kratos/v2\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"github.com/google/wire\"\n\t\"order/internal/biz\"\n\t\"order/internal/conf\"\n\t\"order/internal/data\"\n\t\"order/internal/server\"\n\t\"order/internal/service\"\n)\n\n// wireApp init kratos application.\nfunc wireApp(*conf.Server, *conf.Registry, *conf.Data, *conf.Auth, *conf.Service, log.Logger) (*kratos.App, func(), error) {\n\tpanic(wire.Build(server.ProviderSet, data.ProviderSet, biz.ProviderSet, service.ProviderSet, newApp))\n}\n"
  },
  {
    "path": "service/order/cmd/order/wire_gen.go",
    "content": "// Code generated by Wire. DO NOT EDIT.\n\n//go:generate go run github.com/google/wire/cmd/wire\n//go:build !wireinject\n// +build !wireinject\n\npackage main\n\nimport (\n\t\"github.com/go-kratos/kratos/v2\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"order/internal/biz\"\n\t\"order/internal/conf\"\n\t\"order/internal/data\"\n\t\"order/internal/server\"\n\t\"order/internal/service\"\n)\n\n// Injectors from wire.go:\n\n// wireApp init kratos application.\nfunc wireApp(confServer *conf.Server, registry *conf.Registry, confData *conf.Data, auth *conf.Auth, confService *conf.Service, logger log.Logger) (*kratos.App, func(), error) {\n\tdb := data.NewDB(confData)\n\tclient := data.NewRedis(confData)\n\tdataData, cleanup, err := data.NewData(confData, logger, db, client)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\torderRepo := data.NewOrderRepo(dataData, logger)\n\tdiscovery := data.NewDiscovery(registry)\n\tuserClient := data.NewUserServiceClient(auth, confService, discovery)\n\tcartClient := data.NewCartServiceClient(auth, confService, discovery)\n\tgoodsClient := data.NewGoodsServiceClient(auth, confService, discovery)\n\torderUsecase := biz.NewOrderUsecase(orderRepo, userClient, cartClient, goodsClient, logger)\n\torderService := service.NewOrderService(orderUsecase, logger)\n\tgrpcServer := server.NewGRPCServer(confServer, orderService, logger)\n\tregistrar := server.NewRegistrar(registry)\n\tapp := newApp(logger, grpcServer, registrar)\n\treturn app, func() {\n\t\tcleanup()\n\t}, nil\n}\n"
  },
  {
    "path": "service/order/configs/config.yaml",
    "content": "server:\n  http:\n    addr: 0.0.0.0:8000\n    timeout: 1s\n  grpc:\n    addr: 0.0.0.0:50054\n    timeout: 1s\ndata:\n  database:\n    driver: mysql\n    source: root:root@tcp(127.0.0.1:3306)/shop_order?charset=utf8mb4&parseTime=True&loc=Local\n  redis:\n    addr: 127.0.0.1:6379\n    dial_timeout: 1s\n    read_timeout: 0.2s\n    write_timeout: 0.2s\ntrace:\n  endpoint: http://127.0.0.1:14268/api/traces\nauth:\n  jwt_key: hqFr%3ddt32DGlSTOI5cO6@TH#fFwYnP$S\nservice:\n  user:\n    endpoint: discovery:///shop.user.service\n  cart:\n    endpoint: discovery:///shop.cart.service\n  goods:\n    endpoint: discovery:///shop.goods.service"
  },
  {
    "path": "service/order/configs/registry.yaml",
    "content": "consul:\n    address: 127.0.0.1:8500\n    scheme: http"
  },
  {
    "path": "service/order/go.mod",
    "content": "module order\n\ngo 1.17\n\nrequire (\n\tgithub.com/go-kratos/kratos/contrib/registry/consul/v2 v2.0.0-20220422120629-fbf7855cf262\n\tgithub.com/go-kratos/kratos/v2 v2.2.1\n\tgithub.com/go-redis/redis/extra/redisotel v0.3.0\n\tgithub.com/go-redis/redis/v8 v8.11.5\n\tgithub.com/golang/mock v1.4.4\n\tgithub.com/google/wire v0.5.0\n\tgithub.com/hashicorp/consul/api v1.12.0\n\tgithub.com/onsi/ginkgo v1.16.5\n\tgithub.com/onsi/gomega v1.19.0\n\tgithub.com/ory/dockertest/v3 v3.8.1\n\tgithub.com/pkg/errors v0.9.1\n\tgo.opentelemetry.io/otel v1.6.3\n\tgo.opentelemetry.io/otel/exporters/jaeger v1.6.3\n\tgo.opentelemetry.io/otel/sdk v1.6.3\n\tgoogle.golang.org/protobuf v1.28.0\n\tgorm.io/driver/mysql v1.3.3\n\tgorm.io/gorm v1.23.4\n)\n\nrequire (\n\tgithub.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 // indirect\n\tgithub.com/Microsoft/go-winio v0.5.1 // indirect\n\tgithub.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect\n\tgithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.1.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.1.2 // indirect\n\tgithub.com/containerd/continuity v0.0.0-20190827140505-75bee3e2ccb6 // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/docker/cli v20.10.11+incompatible // indirect\n\tgithub.com/docker/docker v20.10.7+incompatible // indirect\n\tgithub.com/docker/go-connections v0.4.0 // indirect\n\tgithub.com/docker/go-units v0.4.0 // indirect\n\tgithub.com/envoyproxy/protoc-gen-validate v0.6.7 // indirect\n\tgithub.com/fatih/color v1.9.0 // indirect\n\tgithub.com/fsnotify/fsnotify v1.5.1 // indirect\n\tgithub.com/go-logr/logr v1.2.3 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/go-playground/form/v4 v4.2.0 // indirect\n\tgithub.com/go-redis/redis/extra/rediscmd v0.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.6.0 // indirect\n\tgithub.com/gogo/protobuf v1.3.2 // indirect\n\tgithub.com/golang/protobuf v1.5.2 // indirect\n\tgithub.com/google/btree v1.0.0 // indirect\n\tgithub.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect\n\tgithub.com/google/uuid v1.3.0 // indirect\n\tgithub.com/gorilla/mux v1.8.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.1 // indirect\n\tgithub.com/hashicorp/go-hclog v0.12.0 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.0.0 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v0.5.1 // indirect\n\tgithub.com/hashicorp/serf v0.9.6 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/imdario/mergo v0.3.12 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.4 // indirect\n\tgithub.com/lyft/protoc-gen-star v0.6.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.6 // indirect\n\tgithub.com/mattn/go-isatty v0.0.12 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.4.1 // indirect\n\tgithub.com/moby/term v0.0.0-20201216013528-df9cb8a40635 // indirect\n\tgithub.com/nxadm/tail v1.4.8 // indirect\n\tgithub.com/opencontainers/go-digest v1.0.0-rc1 // indirect\n\tgithub.com/opencontainers/image-spec v1.0.2 // indirect\n\tgithub.com/opencontainers/runc v1.0.2 // indirect\n\tgithub.com/sirupsen/logrus v1.8.1 // indirect\n\tgithub.com/spf13/afero v1.8.2 // indirect\n\tgithub.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect\n\tgithub.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect\n\tgithub.com/xeipuuv/gojsonschema v1.2.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.6.3 // indirect\n\tgolang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect\n\tgolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect\n\tgolang.org/x/net v0.0.0-20220615171555-694bf12d69de // indirect\n\tgolang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect\n\tgolang.org/x/sys v0.0.0-20220615213510-4f61da869c0c // indirect\n\tgolang.org/x/text v0.3.7 // indirect\n\tgolang.org/x/tools v0.1.11 // indirect\n\tgolang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f // indirect\n\tgoogle.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90 // indirect\n\tgoogle.golang.org/grpc v1.47.0 // indirect\n\tgoogle.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0 // indirect\n\tgopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect\n\tgopkg.in/yaml.v2 v2.4.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect\n)\n"
  },
  {
    "path": "service/order/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=\ncloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=\ncloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ncloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngithub.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8=\ngithub.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/Microsoft/go-winio v0.5.1 h1:aPJp2QD7OOrhO5tQXqQoGSJc+DjDtWTGLOmNyAm6FgY=\ngithub.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=\ngithub.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw=\ngithub.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk=\ngithub.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=\ngithub.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8=\ngithub.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA=\ngithub.com/cenkalti/backoff/v4 v4.1.2 h1:6Yo7N8UP2K6LWZnW94DLVSSrbobcWdVzAYOisuDPIFo=\ngithub.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=\ngithub.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=\ngithub.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ=\ngithub.com/containerd/continuity v0.0.0-20190827140505-75bee3e2ccb6 h1:NmTXa/uVnDyp0TY5MKi197+3HWcnYWfnHGyaFthlnGw=\ngithub.com/containerd/continuity v0.0.0-20190827140505-75bee3e2ccb6/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=\ngithub.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=\ngithub.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=\ngithub.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw=\ngithub.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/docker/cli v20.10.11+incompatible h1:tXU1ezXcruZQRrMP8RN2z9N91h+6egZTS1gsPsKantc=\ngithub.com/docker/cli v20.10.11+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=\ngithub.com/docker/docker v20.10.7+incompatible h1:Z6O9Nhsjv+ayUEeI1IojKbYcsGdgYSNqxe1s2MYzUhQ=\ngithub.com/docker/docker v20.10.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=\ngithub.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=\ngithub.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=\ngithub.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw=\ngithub.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=\ngithub.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=\ngithub.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/envoyproxy/protoc-gen-validate v0.6.7 h1:qcZcULcd/abmQg6dwigimCNEyi4gg31M/xaciQlDml8=\ngithub.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=\ngithub.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=\ngithub.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=\ngithub.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI=\ngithub.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU=\ngithub.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kratos/aegis v0.1.1/go.mod h1:jYeSQ3Gesba478zEnujOiG5QdsyF3Xk/8owFUeKcHxw=\ngithub.com/go-kratos/kratos/contrib/registry/consul/v2 v2.0.0-20220422120629-fbf7855cf262 h1:lYjRFN2hg3Gl88SS+jHR+JkJRUBeH2i2gZRax8qJAdI=\ngithub.com/go-kratos/kratos/contrib/registry/consul/v2 v2.0.0-20220422120629-fbf7855cf262/go.mod h1:CFHMR6oi+wIEdqxjH4TwKvPlMWUfRY3SMke9++r/dB8=\ngithub.com/go-kratos/kratos/v2 v2.2.1 h1:sm29txvyqiQw4v+MftnYWTMgEBjjzWHjrim8kaTVQWE=\ngithub.com/go-kratos/kratos/v2 v2.2.1/go.mod h1:yebXu5KMayLjXZzMTY5HWIPRDwcBehHpiNF/Ot8A2pA=\ngithub.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=\ngithub.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=\ngithub.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=\ngithub.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=\ngithub.com/go-playground/form/v4 v4.2.0 h1:N1wh+Goz61e6w66vo8vJkQt+uwZSoLz50kZPJWR8eic=\ngithub.com/go-playground/form/v4 v4.2.0/go.mod h1:q1a2BY+AQUUzhl6xA/6hBetay6dEIhMHjgvJiGo6K7U=\ngithub.com/go-redis/redis/extra/rediscmd v0.2.0 h1:A3bhCsCKsedClEH9/jYlcKqOuBoeeV+H0yDie5t+a6w=\ngithub.com/go-redis/redis/extra/rediscmd v0.2.0/go.mod h1:Z5bP1EHl9PvWhx/DupfCdZwB0JgOO3aVxWc/PFux+BE=\ngithub.com/go-redis/redis/extra/redisotel v0.3.0 h1:8rrizwFAUUeMgmelyiQi9KeFwmpQhay9E+/rE6qHsBM=\ngithub.com/go-redis/redis/extra/redisotel v0.3.0/go.mod h1:sGV3dQnPMBUuqzowEP2nZPhLXCMeh83nY64yaju249c=\ngithub.com/go-redis/redis/v8 v8.3.2/go.mod h1:jszGxBCez8QA1HWSmQxJO9Y82kNibbUmeYhKWrBejTU=\ngithub.com/go-redis/redis/v8 v8.5.0/go.mod h1:YmEcgBDttjnkbMzDAhDtQxY9yVA7jMN6PCR5HeMvqFE=\ngithub.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI=\ngithub.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo=\ngithub.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=\ngithub.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=\ngithub.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=\ngithub.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=\ngithub.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=\ngithub.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=\ngithub.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=\ngithub.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/wire v0.5.0 h1:I7ELFeVBr3yfPIcc8+MWvrjk+3VjbcSzoXm3JVa+jD8=\ngithub.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=\ngithub.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=\ngithub.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=\ngithub.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=\ngithub.com/hashicorp/consul/api v1.9.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M=\ngithub.com/hashicorp/consul/api v1.12.0 h1:k3y1FYv6nuKyNTqj6w9gXOx5r5CfLj/k/euUeBXj1OY=\ngithub.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0=\ngithub.com/hashicorp/consul/sdk v0.8.0 h1:OJtKBtEjboEZvG6AOUdh4Z1Zbyu0WcxQ0qatRrZHTVU=\ngithub.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms=\ngithub.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-hclog v0.12.0 h1:d4QkX8FRTYaKaCZBoXYY8zJX2BXjWxurN/GA2tkrmZM=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=\ngithub.com/hashicorp/memberlist v0.3.0 h1:8+567mCcFDnS5ADl7lrpxPMWiFCElyUEeW0gtj34fMA=\ngithub.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=\ngithub.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk=\ngithub.com/hashicorp/serf v0.9.6 h1:uuEX1kLR6aoda1TBttmJQKDLZE1Ob7KN0NPdE7EtCDc=\ngithub.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4=\ngithub.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=\ngithub.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.4 h1:tHnRBy1i5F2Dh8BAFxqFzxKqqvezXrL2OW1TnX+Mlas=\ngithub.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/lib/pq v0.0.0-20180327071824-d34b9ff171c2 h1:hRGSmZu7j271trc9sneMrpOW7GN5ngLm8YUZIPzf394=\ngithub.com/lib/pq v0.0.0-20180327071824-d34b9ff171c2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=\ngithub.com/lyft/protoc-gen-star v0.6.0 h1:xOpFu4vwmIoUeUrRuAtdCrZZymT/6AkW/bsUWA506Fo=\ngithub.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0=\ngithub.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A=\ngithub.com/moby/term v0.0.0-20201216013528-df9cb8a40635 h1:rzf0wL0CHVc8CEsgyygG0Mn9CNCCPZqOPaz8RiiHYQk=\ngithub.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc=\ngithub.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ=\ngithub.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=\ngithub.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=\ngithub.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=\ngithub.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=\ngithub.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=\ngithub.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=\ngithub.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg=\ngithub.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=\ngithub.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=\ngithub.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=\ngithub.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=\ngithub.com/onsi/ginkgo/v2 v2.1.3 h1:e/3Cwtogj0HA+25nMP1jCMDIf8RtRYbGwGGuBIFztkc=\ngithub.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=\ngithub.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=\ngithub.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=\ngithub.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=\ngithub.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48=\ngithub.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=\ngithub.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs=\ngithub.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw=\ngithub.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro=\ngithub.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ=\ngithub.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=\ngithub.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM=\ngithub.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=\ngithub.com/opencontainers/runc v1.0.2 h1:opHZMaswlyxz1OuGpBE53Dwe4/xF7EZTY0A2L/FpCOg=\ngithub.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0=\ngithub.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=\ngithub.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8=\ngithub.com/ory/dockertest/v3 v3.8.1 h1:vU/8d1We4qIad2YM0kOwRVtnyue7ExvacPiw1yDm17g=\ngithub.com/ory/dockertest/v3 v3.8.1/go.mod h1:wSRQ3wmkz+uSARYMk7kVJFDBGm8x5gSxIhI7NDc+BAQ=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=\ngithub.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo=\ngithub.com/shirou/gopsutil/v3 v3.21.8/go.mod h1:YWp/H8Qs5fVmf17v7JNZzA0mPJ+mS2e9JdiUF9LlKzQ=\ngithub.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=\ngithub.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=\ngithub.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=\ngithub.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=\ngithub.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=\ngithub.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4=\ngithub.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=\ngithub.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo=\ngithub.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo=\ngithub.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=\ngithub.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=\ngithub.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs=\ngithub.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8=\ngithub.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=\ngithub.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE=\ngithub.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU=\ngithub.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c=\ngithub.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=\ngithub.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=\ngithub.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=\ngithub.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=\ngithub.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=\ngo.opentelemetry.io/otel v0.13.0/go.mod h1:dlSNewoRYikTkotEnxdmuBHgzT+k/idJSfDv/FxEnOY=\ngo.opentelemetry.io/otel v0.16.0/go.mod h1:e4GKElweB8W2gWUqbghw0B8t5MCTccc9212eNHnOHwA=\ngo.opentelemetry.io/otel v0.17.0/go.mod h1:Oqtdxmf7UtEvL037ohlgnaYa1h7GtMh0NcSd9eqkC9s=\ngo.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs=\ngo.opentelemetry.io/otel v1.6.3 h1:FLOfo8f9JzFVFVyU+MSRJc2HdEAXQgm7pIv2uFKRSZE=\ngo.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI=\ngo.opentelemetry.io/otel/exporters/jaeger v1.6.3 h1:7tvBU1Ydbzq080efuepYYqC1Pv3/vOFBgCSrxLb24d0=\ngo.opentelemetry.io/otel/exporters/jaeger v1.6.3/go.mod h1:YgX3eZWbJzgrNyNHCK0otGreAMBTIAcObtZS2VRi6sU=\ngo.opentelemetry.io/otel/metric v0.17.0/go.mod h1:hUz9lH1rNXyEwWAhIWCMFWKhYtpASgSnObJFnU26dJ0=\ngo.opentelemetry.io/otel/oteltest v0.17.0/go.mod h1:JT/LGFxPwpN+nlsTiinSYjdIx3hZIGqHCpChcIZmdoE=\ngo.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs=\ngo.opentelemetry.io/otel/sdk v1.6.3 h1:prSHYdwCQOX5DrsEzxowH3nLhoAzEBdZhvrR79scfLs=\ngo.opentelemetry.io/otel/sdk v1.6.3/go.mod h1:A4iWF7HTXa+GWL/AaqESz28VuSBIcZ+0CV+IzJ5NMiQ=\ngo.opentelemetry.io/otel/trace v0.17.0/go.mod h1:bIujpqg6ZL6xUTubIUgziI1jSaUPthmabA/ygf/6Cfg=\ngo.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk=\ngo.opentelemetry.io/otel/trace v1.6.3 h1:IqN4L+5b0mPNjdXIiZ90Ni4Bl5BRkDQywePLWemd9bc=\ngo.opentelemetry.io/otel/trace v1.6.3/go.mod h1:GNJQusJlUgZl9/TQBPKU/Y/ty+0iVB5fjhKeJGZPGFs=\ngo.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=\ngolang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=\ngolang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug=\ngolang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=\ngolang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220615171555-694bf12d69de h1:ogOG2+P6LjO2j55AkRScrkB2BFpd+Z8TY2wcM0Z3MGo=\ngolang.org/x/net v0.0.0-20220615171555-694bf12d69de/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220615213510-4f61da869c0c h1:aFV+BgZ4svzjfabn8ERpuB4JI4N6/rdy1iusx77G3oU=\ngolang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190422233926-fe54fb35175b/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=\ngolang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.11 h1:loJ25fNOEhSXfHrpoGj91eCUThwdNX6u24rO1xnNteY=\ngolang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f h1:uF6paiQQebLeSXkrTqHqz0MXhXXS1KgF41eUdBNvxK0=\ngolang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=\ngoogle.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE=\ngoogle.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=\ngoogle.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf h1:SVYXkUz2yZS9FWb2Gm8ivSlbNQzL2Z/NpPKE3RG2jWk=\ngoogle.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=\ngoogle.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90 h1:4SPz2GL2CXJt28MTF8V6Ap/9ZiVbQlJeGSd9qtA7DLs=\ngoogle.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=\ngoogle.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=\ngoogle.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=\ngoogle.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=\ngoogle.golang.org/grpc v1.44.0 h1:weqSxi/TMs1SqFRMHCtBgXRs8k3X39QIDEZ0pRcttUg=\ngoogle.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=\ngoogle.golang.org/grpc v1.47.0 h1:9n77onPX5F3qfFCqjy9dhn8PbNQsIKeVU04J9G7umt8=\ngoogle.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=\ngoogle.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0 h1:TLkBREm4nIsEcexnCjgQd5GQWaHcqMzwQV0TX9pq8S0=\ngoogle.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0/go.mod h1:DNq5QpG7LJqD2AamLZ7zvKE0DEpVl2BSEVjFycAAjRY=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=\ngopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=\ngopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.3.3 h1:jXG9ANrwBc4+bMvBcSl8zCfPBaVoPyBEBshA8dA93X8=\ngorm.io/driver/mysql v1.3.3/go.mod h1:ChK6AHbHgDCFZyJp0F+BmVGb06PSIoh9uVYKAlRbb2U=\ngorm.io/gorm v1.23.1/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=\ngorm.io/gorm v1.23.4 h1:1BKWM67O6CflSLcwGQR7ccfmC4ebOxQrTfOQGRE9wjg=\ngorm.io/gorm v1.23.4/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=\ngotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk=\ngotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0=\ngotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\n"
  },
  {
    "path": "service/order/internal/biz/README.md",
    "content": "# Biz\n"
  },
  {
    "path": "service/order/internal/biz/biz.go",
    "content": "package biz\n\nimport (\n\t\"context\"\n\n\t\"github.com/google/wire\"\n)\n\n// ProviderSet is biz providers.\nvar ProviderSet = wire.NewSet(NewOrderUsecase)\n\ntype Transaction interface {\n\tExecTx(context.Context, func(ctx context.Context) error) error\n}\n"
  },
  {
    "path": "service/order/internal/biz/order.go",
    "content": "package biz\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\tcartV1 \"order/api/cart/v1\"\n\tgoodsV1 \"order/api/goods/v1\"\n\tuserV1 \"order/api/user/v1\"\n\t\"order/internal/domain\"\n)\n\n//go:generate mockgen -destination=../mocks/mrepo/order.go -package=mrepo . OrderRepo\ntype OrderRepo interface {\n\tGetAddressByID(ctx context.Context, aid int64, userId int64) (*domain.OrderAddress, error)\n}\n\ntype OrderUsecase struct {\n\trepo     OrderRepo\n\tuserRPC  userV1.UserClient\n\tcartRPC  cartV1.CartClient\n\tgoodsRPC goodsV1.GoodsClient\n\tlog      *log.Helper\n}\n\nfunc NewOrderUsecase(repo OrderRepo, userRPC userV1.UserClient, cartRPC cartV1.CartClient, goodsRPC goodsV1.GoodsClient,\n\tlogger log.Logger) *OrderUsecase {\n\n\treturn &OrderUsecase{\n\t\trepo:     repo,\n\t\tuserRPC:  userRPC,\n\t\tcartRPC:  cartRPC,\n\t\tgoodsRPC: goodsRPC,\n\t\tlog:      log.NewHelper(logger),\n\t}\n}\n\nfunc (oc *OrderUsecase) CreateOrder(ctx context.Context, order *domain.CreateOrder) {\n\t// 跨服务（购物车)查询购物车信息\n\t{\n\t\t// 已选中，根据用户ID，查询这个用户的所有已经选中的购物车商品\n\t\tcartList, err := oc.cartRPC.ListCart(ctx, &cartV1.ListCartRequest{UserId: order.UserId})\n\t\tif err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\n\t\t// 判断购物车的数量跟用户提交数量是否一致\n\t\tif len(cartList.Results) != len(order.CartItem) {\n\t\t\tfmt.Println(err)\n\t\t}\n\n\t\t// 判断购物车是否真实存在\n\t\tfor _, cart := range cartList.Results {\n\t\t\tif ci := order.CartItem.FindById(cart.Id); ci == nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t}\n\t}\n\n\t{\n\t\t// 跨服务（商品服务）查询商品信息\n\n\t\t// 商品ID，去查询商品对比价格\n\t\tskuIds := order.CartItem.GetSkuId()\n\t\tcartList, err := oc.goodsRPC.SkuList(ctx, &goodsV1.SkuIds{UserId: order.UserId})\n\n\t}\n\n\t// 跨服务 查询用户收货地址\n\t{\n\t\taddress, err := oc.userRPC.GetAddress(ctx, &userV1.AddressReq{\n\t\t\tId:  order.AddressId,\n\t\t\tUid: order.UserId,\n\t\t})\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tfmt.Println(address)\n\t}\n\n\t// 跨服务 查询库存信息\n\t// 删除购物车的数据 （分布式 rocketmq）\n\t// 支付抠库存（分布式 rocketmq）\n}\n"
  },
  {
    "path": "service/order/internal/conf/conf.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.0\n// \tprotoc        v3.19.4\n// source: conf/conf.proto\n\npackage conf\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tdurationpb \"google.golang.org/protobuf/types/known/durationpb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Bootstrap struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tServer  *Server  `protobuf:\"bytes,1,opt,name=server,proto3\" json:\"server,omitempty\"`\n\tData    *Data    `protobuf:\"bytes,2,opt,name=data,proto3\" json:\"data,omitempty\"`\n\tTrace   *Trace   `protobuf:\"bytes,3,opt,name=trace,proto3\" json:\"trace,omitempty\"`\n\tAuth    *Auth    `protobuf:\"bytes,4,opt,name=auth,proto3\" json:\"auth,omitempty\"`\n\tService *Service `protobuf:\"bytes,5,opt,name=service,proto3\" json:\"service,omitempty\"`\n}\n\nfunc (x *Bootstrap) Reset() {\n\t*x = Bootstrap{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_conf_conf_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Bootstrap) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Bootstrap) ProtoMessage() {}\n\nfunc (x *Bootstrap) ProtoReflect() protoreflect.Message {\n\tmi := &file_conf_conf_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Bootstrap.ProtoReflect.Descriptor instead.\nfunc (*Bootstrap) Descriptor() ([]byte, []int) {\n\treturn file_conf_conf_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Bootstrap) GetServer() *Server {\n\tif x != nil {\n\t\treturn x.Server\n\t}\n\treturn nil\n}\n\nfunc (x *Bootstrap) GetData() *Data {\n\tif x != nil {\n\t\treturn x.Data\n\t}\n\treturn nil\n}\n\nfunc (x *Bootstrap) GetTrace() *Trace {\n\tif x != nil {\n\t\treturn x.Trace\n\t}\n\treturn nil\n}\n\nfunc (x *Bootstrap) GetAuth() *Auth {\n\tif x != nil {\n\t\treturn x.Auth\n\t}\n\treturn nil\n}\n\nfunc (x *Bootstrap) GetService() *Service {\n\tif x != nil {\n\t\treturn x.Service\n\t}\n\treturn nil\n}\n\ntype Server struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tHttp *Server_HTTP `protobuf:\"bytes,1,opt,name=http,proto3\" json:\"http,omitempty\"`\n\tGrpc *Server_GRPC `protobuf:\"bytes,2,opt,name=grpc,proto3\" json:\"grpc,omitempty\"`\n}\n\nfunc (x *Server) Reset() {\n\t*x = Server{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_conf_conf_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Server) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Server) ProtoMessage() {}\n\nfunc (x *Server) ProtoReflect() protoreflect.Message {\n\tmi := &file_conf_conf_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Server.ProtoReflect.Descriptor instead.\nfunc (*Server) Descriptor() ([]byte, []int) {\n\treturn file_conf_conf_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Server) GetHttp() *Server_HTTP {\n\tif x != nil {\n\t\treturn x.Http\n\t}\n\treturn nil\n}\n\nfunc (x *Server) GetGrpc() *Server_GRPC {\n\tif x != nil {\n\t\treturn x.Grpc\n\t}\n\treturn nil\n}\n\ntype Data struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tDatabase *Data_Database `protobuf:\"bytes,1,opt,name=database,proto3\" json:\"database,omitempty\"`\n\tRedis    *Data_Redis    `protobuf:\"bytes,2,opt,name=redis,proto3\" json:\"redis,omitempty\"`\n}\n\nfunc (x *Data) Reset() {\n\t*x = Data{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_conf_conf_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Data) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Data) ProtoMessage() {}\n\nfunc (x *Data) ProtoReflect() protoreflect.Message {\n\tmi := &file_conf_conf_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Data.ProtoReflect.Descriptor instead.\nfunc (*Data) Descriptor() ([]byte, []int) {\n\treturn file_conf_conf_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *Data) GetDatabase() *Data_Database {\n\tif x != nil {\n\t\treturn x.Database\n\t}\n\treturn nil\n}\n\nfunc (x *Data) GetRedis() *Data_Redis {\n\tif x != nil {\n\t\treturn x.Redis\n\t}\n\treturn nil\n}\n\ntype Auth struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tJwtKey string `protobuf:\"bytes,1,opt,name=jwt_key,json=jwtKey,proto3\" json:\"jwt_key,omitempty\"`\n}\n\nfunc (x *Auth) Reset() {\n\t*x = Auth{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_conf_conf_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Auth) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Auth) ProtoMessage() {}\n\nfunc (x *Auth) ProtoReflect() protoreflect.Message {\n\tmi := &file_conf_conf_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Auth.ProtoReflect.Descriptor instead.\nfunc (*Auth) Descriptor() ([]byte, []int) {\n\treturn file_conf_conf_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *Auth) GetJwtKey() string {\n\tif x != nil {\n\t\treturn x.JwtKey\n\t}\n\treturn \"\"\n}\n\ntype Registry struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tConsul *Registry_Consul `protobuf:\"bytes,1,opt,name=consul,proto3\" json:\"consul,omitempty\"`\n}\n\nfunc (x *Registry) Reset() {\n\t*x = Registry{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_conf_conf_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Registry) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Registry) ProtoMessage() {}\n\nfunc (x *Registry) ProtoReflect() protoreflect.Message {\n\tmi := &file_conf_conf_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Registry.ProtoReflect.Descriptor instead.\nfunc (*Registry) Descriptor() ([]byte, []int) {\n\treturn file_conf_conf_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *Registry) GetConsul() *Registry_Consul {\n\tif x != nil {\n\t\treturn x.Consul\n\t}\n\treturn nil\n}\n\ntype Trace struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEndpoint string `protobuf:\"bytes,1,opt,name=endpoint,proto3\" json:\"endpoint,omitempty\"`\n}\n\nfunc (x *Trace) Reset() {\n\t*x = Trace{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_conf_conf_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Trace) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Trace) ProtoMessage() {}\n\nfunc (x *Trace) ProtoReflect() protoreflect.Message {\n\tmi := &file_conf_conf_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Trace.ProtoReflect.Descriptor instead.\nfunc (*Trace) Descriptor() ([]byte, []int) {\n\treturn file_conf_conf_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *Trace) GetEndpoint() string {\n\tif x != nil {\n\t\treturn x.Endpoint\n\t}\n\treturn \"\"\n}\n\ntype Service struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUser  *Service_User  `protobuf:\"bytes,1,opt,name=user,proto3\" json:\"user,omitempty\"`\n\tCart  *Service_Cart  `protobuf:\"bytes,2,opt,name=cart,proto3\" json:\"cart,omitempty\"`\n\tGoods *Service_Goods `protobuf:\"bytes,3,opt,name=goods,proto3\" json:\"goods,omitempty\"`\n}\n\nfunc (x *Service) Reset() {\n\t*x = Service{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_conf_conf_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Service) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Service) ProtoMessage() {}\n\nfunc (x *Service) ProtoReflect() protoreflect.Message {\n\tmi := &file_conf_conf_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Service.ProtoReflect.Descriptor instead.\nfunc (*Service) Descriptor() ([]byte, []int) {\n\treturn file_conf_conf_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *Service) GetUser() *Service_User {\n\tif x != nil {\n\t\treturn x.User\n\t}\n\treturn nil\n}\n\nfunc (x *Service) GetCart() *Service_Cart {\n\tif x != nil {\n\t\treturn x.Cart\n\t}\n\treturn nil\n}\n\nfunc (x *Service) GetGoods() *Service_Goods {\n\tif x != nil {\n\t\treturn x.Goods\n\t}\n\treturn nil\n}\n\ntype Server_HTTP struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tNetwork string               `protobuf:\"bytes,1,opt,name=network,proto3\" json:\"network,omitempty\"`\n\tAddr    string               `protobuf:\"bytes,2,opt,name=addr,proto3\" json:\"addr,omitempty\"`\n\tTimeout *durationpb.Duration `protobuf:\"bytes,3,opt,name=timeout,proto3\" json:\"timeout,omitempty\"`\n}\n\nfunc (x *Server_HTTP) Reset() {\n\t*x = Server_HTTP{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_conf_conf_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Server_HTTP) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Server_HTTP) ProtoMessage() {}\n\nfunc (x *Server_HTTP) ProtoReflect() protoreflect.Message {\n\tmi := &file_conf_conf_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Server_HTTP.ProtoReflect.Descriptor instead.\nfunc (*Server_HTTP) Descriptor() ([]byte, []int) {\n\treturn file_conf_conf_proto_rawDescGZIP(), []int{1, 0}\n}\n\nfunc (x *Server_HTTP) GetNetwork() string {\n\tif x != nil {\n\t\treturn x.Network\n\t}\n\treturn \"\"\n}\n\nfunc (x *Server_HTTP) GetAddr() string {\n\tif x != nil {\n\t\treturn x.Addr\n\t}\n\treturn \"\"\n}\n\nfunc (x *Server_HTTP) GetTimeout() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.Timeout\n\t}\n\treturn nil\n}\n\ntype Server_GRPC struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tNetwork string               `protobuf:\"bytes,1,opt,name=network,proto3\" json:\"network,omitempty\"`\n\tAddr    string               `protobuf:\"bytes,2,opt,name=addr,proto3\" json:\"addr,omitempty\"`\n\tTimeout *durationpb.Duration `protobuf:\"bytes,3,opt,name=timeout,proto3\" json:\"timeout,omitempty\"`\n}\n\nfunc (x *Server_GRPC) Reset() {\n\t*x = Server_GRPC{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_conf_conf_proto_msgTypes[8]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Server_GRPC) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Server_GRPC) ProtoMessage() {}\n\nfunc (x *Server_GRPC) ProtoReflect() protoreflect.Message {\n\tmi := &file_conf_conf_proto_msgTypes[8]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Server_GRPC.ProtoReflect.Descriptor instead.\nfunc (*Server_GRPC) Descriptor() ([]byte, []int) {\n\treturn file_conf_conf_proto_rawDescGZIP(), []int{1, 1}\n}\n\nfunc (x *Server_GRPC) GetNetwork() string {\n\tif x != nil {\n\t\treturn x.Network\n\t}\n\treturn \"\"\n}\n\nfunc (x *Server_GRPC) GetAddr() string {\n\tif x != nil {\n\t\treturn x.Addr\n\t}\n\treturn \"\"\n}\n\nfunc (x *Server_GRPC) GetTimeout() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.Timeout\n\t}\n\treturn nil\n}\n\ntype Data_Database struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tDriver string `protobuf:\"bytes,1,opt,name=driver,proto3\" json:\"driver,omitempty\"`\n\tSource string `protobuf:\"bytes,2,opt,name=source,proto3\" json:\"source,omitempty\"`\n}\n\nfunc (x *Data_Database) Reset() {\n\t*x = Data_Database{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_conf_conf_proto_msgTypes[9]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Data_Database) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Data_Database) ProtoMessage() {}\n\nfunc (x *Data_Database) ProtoReflect() protoreflect.Message {\n\tmi := &file_conf_conf_proto_msgTypes[9]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Data_Database.ProtoReflect.Descriptor instead.\nfunc (*Data_Database) Descriptor() ([]byte, []int) {\n\treturn file_conf_conf_proto_rawDescGZIP(), []int{2, 0}\n}\n\nfunc (x *Data_Database) GetDriver() string {\n\tif x != nil {\n\t\treturn x.Driver\n\t}\n\treturn \"\"\n}\n\nfunc (x *Data_Database) GetSource() string {\n\tif x != nil {\n\t\treturn x.Source\n\t}\n\treturn \"\"\n}\n\ntype Data_Redis struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tNetwork      string               `protobuf:\"bytes,1,opt,name=network,proto3\" json:\"network,omitempty\"`\n\tAddr         string               `protobuf:\"bytes,2,opt,name=addr,proto3\" json:\"addr,omitempty\"`\n\tPassword     string               `protobuf:\"bytes,3,opt,name=password,proto3\" json:\"password,omitempty\"`\n\tDb           int32                `protobuf:\"varint,4,opt,name=db,proto3\" json:\"db,omitempty\"`\n\tDialTimeout  *durationpb.Duration `protobuf:\"bytes,5,opt,name=dial_timeout,json=dialTimeout,proto3\" json:\"dial_timeout,omitempty\"`\n\tReadTimeout  *durationpb.Duration `protobuf:\"bytes,6,opt,name=read_timeout,json=readTimeout,proto3\" json:\"read_timeout,omitempty\"`\n\tWriteTimeout *durationpb.Duration `protobuf:\"bytes,7,opt,name=write_timeout,json=writeTimeout,proto3\" json:\"write_timeout,omitempty\"`\n}\n\nfunc (x *Data_Redis) Reset() {\n\t*x = Data_Redis{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_conf_conf_proto_msgTypes[10]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Data_Redis) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Data_Redis) ProtoMessage() {}\n\nfunc (x *Data_Redis) ProtoReflect() protoreflect.Message {\n\tmi := &file_conf_conf_proto_msgTypes[10]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Data_Redis.ProtoReflect.Descriptor instead.\nfunc (*Data_Redis) Descriptor() ([]byte, []int) {\n\treturn file_conf_conf_proto_rawDescGZIP(), []int{2, 1}\n}\n\nfunc (x *Data_Redis) GetNetwork() string {\n\tif x != nil {\n\t\treturn x.Network\n\t}\n\treturn \"\"\n}\n\nfunc (x *Data_Redis) GetAddr() string {\n\tif x != nil {\n\t\treturn x.Addr\n\t}\n\treturn \"\"\n}\n\nfunc (x *Data_Redis) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *Data_Redis) GetDb() int32 {\n\tif x != nil {\n\t\treturn x.Db\n\t}\n\treturn 0\n}\n\nfunc (x *Data_Redis) GetDialTimeout() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.DialTimeout\n\t}\n\treturn nil\n}\n\nfunc (x *Data_Redis) GetReadTimeout() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.ReadTimeout\n\t}\n\treturn nil\n}\n\nfunc (x *Data_Redis) GetWriteTimeout() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.WriteTimeout\n\t}\n\treturn nil\n}\n\ntype Registry_Consul struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tAddress string `protobuf:\"bytes,1,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tScheme  string `protobuf:\"bytes,2,opt,name=scheme,proto3\" json:\"scheme,omitempty\"`\n}\n\nfunc (x *Registry_Consul) Reset() {\n\t*x = Registry_Consul{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_conf_conf_proto_msgTypes[11]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Registry_Consul) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Registry_Consul) ProtoMessage() {}\n\nfunc (x *Registry_Consul) ProtoReflect() protoreflect.Message {\n\tmi := &file_conf_conf_proto_msgTypes[11]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Registry_Consul.ProtoReflect.Descriptor instead.\nfunc (*Registry_Consul) Descriptor() ([]byte, []int) {\n\treturn file_conf_conf_proto_rawDescGZIP(), []int{4, 0}\n}\n\nfunc (x *Registry_Consul) GetAddress() string {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn \"\"\n}\n\nfunc (x *Registry_Consul) GetScheme() string {\n\tif x != nil {\n\t\treturn x.Scheme\n\t}\n\treturn \"\"\n}\n\ntype Service_User struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEndpoint string `protobuf:\"bytes,1,opt,name=endpoint,proto3\" json:\"endpoint,omitempty\"`\n}\n\nfunc (x *Service_User) Reset() {\n\t*x = Service_User{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_conf_conf_proto_msgTypes[12]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Service_User) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Service_User) ProtoMessage() {}\n\nfunc (x *Service_User) ProtoReflect() protoreflect.Message {\n\tmi := &file_conf_conf_proto_msgTypes[12]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Service_User.ProtoReflect.Descriptor instead.\nfunc (*Service_User) Descriptor() ([]byte, []int) {\n\treturn file_conf_conf_proto_rawDescGZIP(), []int{6, 0}\n}\n\nfunc (x *Service_User) GetEndpoint() string {\n\tif x != nil {\n\t\treturn x.Endpoint\n\t}\n\treturn \"\"\n}\n\ntype Service_Cart struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEndpoint string `protobuf:\"bytes,1,opt,name=endpoint,proto3\" json:\"endpoint,omitempty\"`\n}\n\nfunc (x *Service_Cart) Reset() {\n\t*x = Service_Cart{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_conf_conf_proto_msgTypes[13]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Service_Cart) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Service_Cart) ProtoMessage() {}\n\nfunc (x *Service_Cart) ProtoReflect() protoreflect.Message {\n\tmi := &file_conf_conf_proto_msgTypes[13]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Service_Cart.ProtoReflect.Descriptor instead.\nfunc (*Service_Cart) Descriptor() ([]byte, []int) {\n\treturn file_conf_conf_proto_rawDescGZIP(), []int{6, 1}\n}\n\nfunc (x *Service_Cart) GetEndpoint() string {\n\tif x != nil {\n\t\treturn x.Endpoint\n\t}\n\treturn \"\"\n}\n\ntype Service_Goods struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEndpoint string `protobuf:\"bytes,1,opt,name=endpoint,proto3\" json:\"endpoint,omitempty\"`\n}\n\nfunc (x *Service_Goods) Reset() {\n\t*x = Service_Goods{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_conf_conf_proto_msgTypes[14]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Service_Goods) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Service_Goods) ProtoMessage() {}\n\nfunc (x *Service_Goods) ProtoReflect() protoreflect.Message {\n\tmi := &file_conf_conf_proto_msgTypes[14]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Service_Goods.ProtoReflect.Descriptor instead.\nfunc (*Service_Goods) Descriptor() ([]byte, []int) {\n\treturn file_conf_conf_proto_rawDescGZIP(), []int{6, 2}\n}\n\nfunc (x *Service_Goods) GetEndpoint() string {\n\tif x != nil {\n\t\treturn x.Endpoint\n\t}\n\treturn \"\"\n}\n\nvar File_conf_conf_proto protoreflect.FileDescriptor\n\nvar file_conf_conf_proto_rawDesc = []byte{\n\t0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x66, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x09, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x1a, 0x1e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd6, 0x01, 0x0a,\n\t0x09, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x12, 0x29, 0x0a, 0x06, 0x73, 0x65,\n\t0x72, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x72, 0x64,\n\t0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x06, 0x73,\n\t0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e,\n\t0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x26, 0x0a, 0x05, 0x74, 0x72,\n\t0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6f, 0x72, 0x64, 0x65,\n\t0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x52, 0x05, 0x74, 0x72, 0x61,\n\t0x63, 0x65, 0x12, 0x23, 0x0a, 0x04, 0x61, 0x75, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x0f, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x75, 0x74,\n\t0x68, 0x52, 0x04, 0x61, 0x75, 0x74, 0x68, 0x12, 0x2c, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69,\n\t0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72,\n\t0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x73, 0x65,\n\t0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0xb6, 0x02, 0x0a, 0x06, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72,\n\t0x12, 0x2a, 0x0a, 0x04, 0x68, 0x74, 0x74, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16,\n\t0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65,\n\t0x72, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x52, 0x04, 0x68, 0x74, 0x74, 0x70, 0x12, 0x2a, 0x0a, 0x04,\n\t0x67, 0x72, 0x70, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x72, 0x64,\n\t0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x47, 0x52,\n\t0x50, 0x43, 0x52, 0x04, 0x67, 0x72, 0x70, 0x63, 0x1a, 0x69, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50,\n\t0x12, 0x18, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x64,\n\t0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x33,\n\t0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65,\n\t0x6f, 0x75, 0x74, 0x1a, 0x69, 0x0a, 0x04, 0x47, 0x52, 0x50, 0x43, 0x12, 0x18, 0x0a, 0x07, 0x6e,\n\t0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65,\n\t0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d,\n\t0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0xc5,\n\t0x03, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x34, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62,\n\t0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x72, 0x64, 0x65,\n\t0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62,\n\t0x61, 0x73, 0x65, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x2b, 0x0a,\n\t0x05, 0x72, 0x65, 0x64, 0x69, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f,\n\t0x72, 0x64, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65,\n\t0x64, 0x69, 0x73, 0x52, 0x05, 0x72, 0x65, 0x64, 0x69, 0x73, 0x1a, 0x3a, 0x0a, 0x08, 0x44, 0x61,\n\t0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x12, 0x16,\n\t0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,\n\t0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0x9d, 0x02, 0x0a, 0x05, 0x52, 0x65, 0x64, 0x69, 0x73,\n\t0x12, 0x18, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x64,\n\t0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x1a,\n\t0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x64, 0x62,\n\t0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x64, 0x62, 0x12, 0x3c, 0x0a, 0x0c, 0x64, 0x69,\n\t0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,\n\t0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x64, 0x69, 0x61,\n\t0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x65, 0x61, 0x64,\n\t0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,\n\t0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x72, 0x65, 0x61, 0x64, 0x54,\n\t0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x3e, 0x0a, 0x0d, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f,\n\t0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,\n\t0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54,\n\t0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0x1f, 0x0a, 0x04, 0x41, 0x75, 0x74, 0x68, 0x12, 0x17,\n\t0x0a, 0x07, 0x6a, 0x77, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x06, 0x6a, 0x77, 0x74, 0x4b, 0x65, 0x79, 0x22, 0x7a, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73,\n\t0x74, 0x72, 0x79, 0x12, 0x32, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e,\n\t0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x52,\n\t0x06, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x1a, 0x3a, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x73, 0x75,\n\t0x6c, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73,\n\t0x63, 0x68, 0x65, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68,\n\t0x65, 0x6d, 0x65, 0x22, 0x23, 0x0a, 0x05, 0x54, 0x72, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08,\n\t0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,\n\t0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0x80, 0x02, 0x0a, 0x07, 0x53, 0x65, 0x72,\n\t0x76, 0x69, 0x63, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65,\n\t0x72, 0x12, 0x2b, 0x0a, 0x04, 0x63, 0x61, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x17, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x2e, 0x43, 0x61, 0x72, 0x74, 0x52, 0x04, 0x63, 0x61, 0x72, 0x74, 0x12, 0x2e,\n\t0x0a, 0x05, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e,\n\t0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,\n\t0x65, 0x2e, 0x47, 0x6f, 0x6f, 0x64, 0x73, 0x52, 0x05, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x1a, 0x22,\n\t0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69,\n\t0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69,\n\t0x6e, 0x74, 0x1a, 0x22, 0x0a, 0x04, 0x43, 0x61, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e,\n\t0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e,\n\t0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x1a, 0x23, 0x0a, 0x05, 0x47, 0x6f, 0x6f, 0x64, 0x73, 0x12,\n\t0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x42, 0x1c, 0x5a, 0x1a, 0x73,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f,\n\t0x63, 0x6f, 0x6e, 0x66, 0x3b, 0x63, 0x6f, 0x6e, 0x66, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x33,\n}\n\nvar (\n\tfile_conf_conf_proto_rawDescOnce sync.Once\n\tfile_conf_conf_proto_rawDescData = file_conf_conf_proto_rawDesc\n)\n\nfunc file_conf_conf_proto_rawDescGZIP() []byte {\n\tfile_conf_conf_proto_rawDescOnce.Do(func() {\n\t\tfile_conf_conf_proto_rawDescData = protoimpl.X.CompressGZIP(file_conf_conf_proto_rawDescData)\n\t})\n\treturn file_conf_conf_proto_rawDescData\n}\n\nvar file_conf_conf_proto_msgTypes = make([]protoimpl.MessageInfo, 15)\nvar file_conf_conf_proto_goTypes = []interface{}{\n\t(*Bootstrap)(nil),           // 0: order.api.Bootstrap\n\t(*Server)(nil),              // 1: order.api.Server\n\t(*Data)(nil),                // 2: order.api.Data\n\t(*Auth)(nil),                // 3: order.api.Auth\n\t(*Registry)(nil),            // 4: order.api.Registry\n\t(*Trace)(nil),               // 5: order.api.Trace\n\t(*Service)(nil),             // 6: order.api.Service\n\t(*Server_HTTP)(nil),         // 7: order.api.Server.HTTP\n\t(*Server_GRPC)(nil),         // 8: order.api.Server.GRPC\n\t(*Data_Database)(nil),       // 9: order.api.Data.Database\n\t(*Data_Redis)(nil),          // 10: order.api.Data.Redis\n\t(*Registry_Consul)(nil),     // 11: order.api.Registry.Consul\n\t(*Service_User)(nil),        // 12: order.api.Service.User\n\t(*Service_Cart)(nil),        // 13: order.api.Service.Cart\n\t(*Service_Goods)(nil),       // 14: order.api.Service.Goods\n\t(*durationpb.Duration)(nil), // 15: google.protobuf.Duration\n}\nvar file_conf_conf_proto_depIdxs = []int32{\n\t1,  // 0: order.api.Bootstrap.server:type_name -> order.api.Server\n\t2,  // 1: order.api.Bootstrap.data:type_name -> order.api.Data\n\t5,  // 2: order.api.Bootstrap.trace:type_name -> order.api.Trace\n\t3,  // 3: order.api.Bootstrap.auth:type_name -> order.api.Auth\n\t6,  // 4: order.api.Bootstrap.service:type_name -> order.api.Service\n\t7,  // 5: order.api.Server.http:type_name -> order.api.Server.HTTP\n\t8,  // 6: order.api.Server.grpc:type_name -> order.api.Server.GRPC\n\t9,  // 7: order.api.Data.database:type_name -> order.api.Data.Database\n\t10, // 8: order.api.Data.redis:type_name -> order.api.Data.Redis\n\t11, // 9: order.api.Registry.consul:type_name -> order.api.Registry.Consul\n\t12, // 10: order.api.Service.user:type_name -> order.api.Service.User\n\t13, // 11: order.api.Service.cart:type_name -> order.api.Service.Cart\n\t14, // 12: order.api.Service.goods:type_name -> order.api.Service.Goods\n\t15, // 13: order.api.Server.HTTP.timeout:type_name -> google.protobuf.Duration\n\t15, // 14: order.api.Server.GRPC.timeout:type_name -> google.protobuf.Duration\n\t15, // 15: order.api.Data.Redis.dial_timeout:type_name -> google.protobuf.Duration\n\t15, // 16: order.api.Data.Redis.read_timeout:type_name -> google.protobuf.Duration\n\t15, // 17: order.api.Data.Redis.write_timeout:type_name -> google.protobuf.Duration\n\t18, // [18:18] is the sub-list for method output_type\n\t18, // [18:18] is the sub-list for method input_type\n\t18, // [18:18] is the sub-list for extension type_name\n\t18, // [18:18] is the sub-list for extension extendee\n\t0,  // [0:18] is the sub-list for field type_name\n}\n\nfunc init() { file_conf_conf_proto_init() }\nfunc file_conf_conf_proto_init() {\n\tif File_conf_conf_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_conf_conf_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Bootstrap); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_conf_conf_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Server); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_conf_conf_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Data); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_conf_conf_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Auth); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_conf_conf_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Registry); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_conf_conf_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Trace); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_conf_conf_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Service); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_conf_conf_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Server_HTTP); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_conf_conf_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Server_GRPC); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_conf_conf_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Data_Database); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_conf_conf_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Data_Redis); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_conf_conf_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Registry_Consul); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_conf_conf_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Service_User); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_conf_conf_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Service_Cart); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_conf_conf_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Service_Goods); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_conf_conf_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   15,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_conf_conf_proto_goTypes,\n\t\tDependencyIndexes: file_conf_conf_proto_depIdxs,\n\t\tMessageInfos:      file_conf_conf_proto_msgTypes,\n\t}.Build()\n\tFile_conf_conf_proto = out.File\n\tfile_conf_conf_proto_rawDesc = nil\n\tfile_conf_conf_proto_goTypes = nil\n\tfile_conf_conf_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "service/order/internal/conf/conf.proto",
    "content": "syntax = \"proto3\";\npackage order.api;\n\noption go_package = \"service/internal/conf;conf\";\n\nimport \"google/protobuf/duration.proto\";\n\nmessage Bootstrap {\n  Server server = 1;\n  Data data = 2;\n  Trace trace = 3;\n  Auth auth = 4;\n  Service service = 5;\n}\n\nmessage Server {\n  message HTTP {\n    string network = 1;\n    string addr = 2;\n    google.protobuf.Duration timeout = 3;\n  }\n  message GRPC {\n    string network = 1;\n    string addr = 2;\n    google.protobuf.Duration timeout = 3;\n  }\n  HTTP http = 1;\n  GRPC grpc = 2;\n}\n\nmessage Data {\n  message Database {\n    string driver = 1;\n    string source = 2;\n  }\n  message Redis {\n    string network = 1;\n    string addr = 2;\n    string password = 3;\n    int32 db = 4;\n    google.protobuf.Duration dial_timeout = 5;\n    google.protobuf.Duration read_timeout = 6;\n    google.protobuf.Duration write_timeout = 7;\n  }\n  Database database = 1;\n  Redis redis = 2;\n}\n\nmessage Auth {\n  string jwt_key = 1;\n}\n\nmessage Registry {\n  message Consul {\n    string address = 1;\n    string scheme = 2;\n  }\n  Consul consul = 1;\n}\n\nmessage Trace {\n  string endpoint = 1;\n}\n\n\nmessage Service {\n  message User {\n    string endpoint = 1;\n  }\n  message Cart {\n    string endpoint = 1;\n  }\n  message Goods {\n    string endpoint = 1;\n  }\n  User user = 1;\n  Cart cart = 2;\n  Goods goods = 3;\n}"
  },
  {
    "path": "service/order/internal/data/data.go",
    "content": "package data\n\nimport (\n\t\"context\"\n\t\"github.com/go-kratos/kratos/contrib/registry/consul/v2\"\n\t\"github.com/go-kratos/kratos/v2/middleware/recovery\"\n\t\"github.com/go-kratos/kratos/v2/middleware/tracing\"\n\t\"github.com/go-kratos/kratos/v2/registry\"\n\t\"github.com/go-kratos/kratos/v2/transport/grpc\"\n\tconsulAPI \"github.com/hashicorp/consul/api\"\n\tgrpcx \"google.golang.org/grpc\"\n\tslog \"log\"\n\t\"order/internal/biz\"\n\t\"order/internal/conf\"\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"github.com/go-redis/redis/extra/redisotel\"\n\t\"github.com/go-redis/redis/v8\"\n\t\"github.com/google/wire\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n\t\"gorm.io/gorm/logger\"\n\t\"gorm.io/gorm/schema\"\n\tcartV1 \"order/api/cart/v1\"\n\tgoodsV1 \"order/api/goods/v1\"\n\tuserV1 \"order/api/user/v1\"\n)\n\n// ProviderSet is data providers.\nvar ProviderSet = wire.NewSet(NewData, NewDB, NewTransaction, NewRedis, NewOrderRepo, NewUserServiceClient,\n\tNewCartServiceClient, NewGoodsServiceClient, NewDiscovery)\n\ntype Data struct {\n\tdb  *gorm.DB\n\trdb *redis.Client\n}\ntype contextTxKey struct{}\n\n// NewData .\nfunc NewData(c *conf.Data, logger log.Logger, db *gorm.DB, rdb *redis.Client) (*Data, func(), error) {\n\tcleanup := func() {\n\t\tlog.NewHelper(logger).Info(\"closing the data resources\")\n\t}\n\treturn &Data{db: db, rdb: rdb}, cleanup, nil\n}\n\nfunc NewTransaction(d *Data) biz.Transaction {\n\treturn d\n}\n\nfunc (d *Data) DB(ctx context.Context) *gorm.DB {\n\ttx, ok := ctx.Value(contextTxKey{}).(*gorm.DB)\n\tif ok {\n\t\treturn tx\n\t}\n\treturn d.db\n}\n\n// ExecTx gorm Transaction\nfunc (d *Data) ExecTx(ctx context.Context, fn func(ctx context.Context) error) error {\n\treturn d.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error {\n\t\tctx = context.WithValue(ctx, contextTxKey{}, tx)\n\t\treturn fn(ctx)\n\t})\n}\n\n// NewDB .\nfunc NewDB(c *conf.Data) *gorm.DB {\n\t// 终端打印输入 sql 执行记录\n\tnewLogger := logger.New(\n\t\tslog.New(os.Stdout, \"\\r\\n\", slog.LstdFlags), // io writer\n\t\tlogger.Config{\n\t\t\tSlowThreshold: time.Second, // 慢查询 SQL 阈值\n\t\t\tColorful:      true,        // 禁用彩色打印\n\t\t\t//IgnoreRecordNotFoundError: false,\n\t\t\tLogLevel: logger.Info, // Log lever\n\t\t},\n\t)\n\n\tdb, err := gorm.Open(mysql.Open(c.Database.Source), &gorm.Config{\n\t\tLogger:                                   newLogger,\n\t\tDisableForeignKeyConstraintWhenMigrating: true,\n\t\tNamingStrategy:                           schema.NamingStrategy{\n\t\t\t//SingularTable: true, // 表名是否加 s\n\t\t},\n\t})\n\n\tif err != nil {\n\t\tlog.Errorf(\"failed opening connection to sqlite: %v\", err)\n\t\tpanic(\"failed to connect database\")\n\t}\n\t// &Order{}, &OrderGoods{},\n\t_ = db.AutoMigrate(&Order{}, &OrderGoods{}, &OrderPay{}, &OrderAddress{})\n\treturn db\n}\n\nfunc NewRedis(c *conf.Data) *redis.Client {\n\trdb := redis.NewClient(&redis.Options{\n\t\tAddr:         c.Redis.Addr,\n\t\tPassword:     c.Redis.Password,\n\t\tDB:           int(c.Redis.Db),\n\t\tDialTimeout:  c.Redis.DialTimeout.AsDuration(),\n\t\tWriteTimeout: c.Redis.WriteTimeout.AsDuration(),\n\t\tReadTimeout:  c.Redis.ReadTimeout.AsDuration(),\n\t})\n\trdb.AddHook(redisotel.TracingHook{})\n\tif err := rdb.Close(); err != nil {\n\t\tlog.Error(err)\n\t}\n\treturn rdb\n}\n\n// NewUserServiceClient 链接用户服务 grpc\nfunc NewUserServiceClient(ac *conf.Auth, sr *conf.Service, rr registry.Discovery) userV1.UserClient {\n\tconn, err := grpc.DialInsecure(\n\t\tcontext.Background(),\n\t\tgrpc.WithEndpoint(sr.User.Endpoint),\n\t\tgrpc.WithDiscovery(rr),\n\t\tgrpc.WithMiddleware(\n\t\t\ttracing.Client(),\n\t\t\trecovery.Recovery(),\n\t\t),\n\t\tgrpc.WithTimeout(2*time.Second),\n\t\tgrpc.WithOptions(grpcx.WithStatsHandler(&tracing.ClientHandler{})),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tc := userV1.NewUserClient(conn)\n\treturn c\n}\n\n// NewCartServiceClient 链接购物车 grpc\nfunc NewCartServiceClient(ac *conf.Auth, sr *conf.Service, rr registry.Discovery) cartV1.CartClient {\n\tconn, err := grpc.DialInsecure(\n\t\tcontext.Background(),\n\t\tgrpc.WithEndpoint(sr.Cart.Endpoint),\n\t\tgrpc.WithDiscovery(rr),\n\t\tgrpc.WithMiddleware(\n\t\t\ttracing.Client(),\n\t\t\trecovery.Recovery(),\n\t\t),\n\t\tgrpc.WithTimeout(2*time.Second),\n\t\tgrpc.WithOptions(grpcx.WithStatsHandler(&tracing.ClientHandler{})),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tc := cartV1.NewCartClient(conn)\n\treturn c\n}\n\n// NewGoodsServiceClient 链接购物车 grpc\nfunc NewGoodsServiceClient(ac *conf.Auth, sr *conf.Service, rr registry.Discovery) goodsV1.GoodsClient {\n\tconn, err := grpc.DialInsecure(\n\t\tcontext.Background(),\n\t\tgrpc.WithEndpoint(sr.Cart.Endpoint),\n\t\tgrpc.WithDiscovery(rr),\n\t\tgrpc.WithMiddleware(\n\t\t\ttracing.Client(),\n\t\t\trecovery.Recovery(),\n\t\t),\n\t\tgrpc.WithTimeout(2*time.Second),\n\t\tgrpc.WithOptions(grpcx.WithStatsHandler(&tracing.ClientHandler{})),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tc := goodsV1.NewGoodsClient(conn)\n\treturn c\n}\n\nfunc NewDiscovery(conf *conf.Registry) registry.Discovery {\n\tc := consulAPI.DefaultConfig()\n\tc.Address = conf.Consul.Address\n\tc.Scheme = conf.Consul.Scheme\n\tcli, err := consulAPI.NewClient(c)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tr := consul.New(cli, consul.WithHealthCheck(false))\n\treturn r\n}\n"
  },
  {
    "path": "service/order/internal/data/data_suite_test.go",
    "content": "package data_test\n\nimport (\n\t\"context\"\n\t\"github.com/pkg/errors\"\n\t\"gorm.io/gorm\"\n\t\"order/internal/conf\"\n\t\"order/internal/data\"\n\t\"testing\"\n\n\t. \"github.com/onsi/ginkgo\"\n\t. \"github.com/onsi/gomega\"\n)\n\n// 测试 data 方法\nfunc TestData(t *testing.T) {\n\t//  Ginkgo 测试通过调用 Fail(description string) 功能来表示失败\n\t// 使用 RegisterFailHandler 将此函数传递给 Gomega 。这是 Ginkgo 和 Gomega 之间的唯一连接点\n\tRegisterFailHandler(Fail)\n\t// 通知 Ginkgo 启动测试套件。如果您的任何 specs 失败，Ginkgo 将自动使 testing.T 失败。\n\tRunSpecs(t, \"biz data test s\")\n}\n\nvar cleaner func()      // 定义删除 mysql 容器的回调函数\nvar Db *data.Data       // 用于测试的 data\nvar ctx context.Context // 上下文\n\n// initialize  AutoMigrate gorm自动建表\nfunc initialize(db *gorm.DB) error {\n\terr := db.AutoMigrate(\n\t\t&data.Order{},\n\t)\n\treturn errors.WithStack(err)\n}\n\n// ginkgo 使用 BeforeEach 为您的 Specs 设置状态\nvar _ = BeforeSuite(func() {\n\t// 执行测试数据库操作之前，链接之前 docker 容器创建的 mysql\n\t//con, f := data.DockerMysql(\"mysql\", \"latest\")\n\tcon, f := data.DockerMysql(\"mariadb\", \"latest\")\n\tcleaner = f // 测试完成，关闭容器的回调方法\n\tconfig := &conf.Data{Database: &conf.Data_Database{Driver: \"mysql\", Source: con}}\n\tdb := data.NewDB(config)\n\tmySQLDb, _, err := data.NewData(config, nil, db, nil)\n\tif err != nil {\n\t\treturn\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\tDb = mySQLDb\n\terr = initialize(db)\n\tif err != nil {\n\t\treturn\n\t}\n\tExpect(err).NotTo(HaveOccurred())\n})\n\n// 测试结束后 通过回调函数，关闭并删除 docker 创建的容器\nvar _ = AfterSuite(func() {\n\tcleaner()\n})\n"
  },
  {
    "path": "service/order/internal/data/docker_mysql.go",
    "content": "package data\n\nimport (\n\t\"database/sql\"\n\t\"fmt\"\n\t\"github.com/ory/dockertest/v3\"\n\t\"log\"\n\t\"time\"\n)\n\nfunc DockerMysql(img, version string) (string, func()) {\n\treturn innerDockerMysql(img, version)\n}\n\nfunc innerDockerMysql(img, version string) (string, func()) {\n\t// uses a sensible default on windows (tcp/http) and linux/osx (socket)\n\tpool, err := dockertest.NewPool(\"\")\n\tpool.MaxWait = time.Minute * 2\n\tif err != nil {\n\t\tlog.Fatalf(\"Could not connect to docker: %s\", err)\n\t}\n\t//time.Sleep(time.Second * 20)\n\t// pulls an image, creates a container based on it and runs it\n\tresource, err := pool.Run(img, version, []string{\"MYSQL_ROOT_PASSWORD=secret\", \"MYSQL_ROOT_HOST=%\"})\n\tif err != nil {\n\t\tlog.Fatalf(\"Could not start resource: %s\", err)\n\t}\n\n\tconStr := fmt.Sprintf(\"root:secret@(localhost:%s)/mysql?parseTime=true\", resource.GetPort(\"3306/tcp\"))\n\t// exponential backoff-retry, because the application in the container might not be ready to accept connections yet\n\tif err := pool.Retry(func() error {\n\t\tvar err error\n\t\tdb, err := sql.Open(\"mysql\", conStr)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn db.Ping()\n\t}); err != nil {\n\t\tlog.Fatalf(\"Could not connect to docker: %s\", err)\n\t}\n\n\t// 关闭容器\n\treturn conStr, func() {\n\t\tif err = pool.Purge(resource); err != nil {\n\t\t\tlog.Fatalf(\"Could not purge resource: %s\", err)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "service/order/internal/data/order.go",
    "content": "package data\n\nimport (\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"golang.org/x/net/context\"\n\t\"gorm.io/gorm\"\n\t\"order/internal/biz\"\n\t\"order/internal/domain\"\n\t\"time\"\n)\n\ntype Order struct {\n\tID            int64     `gorm:\"primarykey\"`\n\tUser          int64     `gorm:\"type:int not null;default:0;index\"`\n\tOrderSn       string    `gorm:\"type:varchar(30) not null;default:'';index\"` // 订单号，我们平台自己生成的订单号\n\tOrderAmount   int64     `gorm:\"type:int not null;default:0; comment:订单金额\"`\n\tGoodsAmount   int64     `gorm:\"type:int not null;default:0; comment:商品总金额\"`\n\tOrderStatus   int       `gorm:\"type:tinyint(1) unsigned not null; default:0; comment:1待支付,2已支付,3已发货,4已签收,5已取消,6交易完成\"`\n\tExpressAmount int64     `gorm:\"type:int not null;default:0;comment:运费\"`\n\tDeliveryAt    time.Time `gorm:\"column:delivery_at; comment:发货时间\"`\n\tRefundTime    time.Time `gorm:\"type:datetime; comment:退款时间\"`\n\tPost          string    `gorm:\"type:varchar(200) not null;default:''; comment:订单备注信息\"`\n\n\t// 优惠信息、赠品、买反、优惠卷\n\tCreatedAt time.Time `gorm:\"column:created_at\"`\n\tUpdatedAt time.Time `gorm:\"column:updated_at\"`\n\tDeletedAt gorm.DeletedAt\n}\n\nfunc (Order) TableName() string {\n\treturn \"orders\"\n}\n\ntype orderRepo struct {\n\tdata *Data\n\tlog  *log.Helper\n}\n\n// NewOrderRepo .\nfunc NewOrderRepo(data *Data, logger log.Logger) biz.OrderRepo {\n\treturn &orderRepo{\n\t\tdata: data,\n\t\tlog:  log.NewHelper(logger),\n\t}\n}\n\nfunc (p *Order) ToDomain() *domain.Order {\n\treturn &domain.Order{\n\t\tID:           0,\n\t\tUser:         0,\n\t\tOrderSn:      \"\",\n\t\tPayType:      \"\",\n\t\tStatus:       \"\",\n\t\tTradeNo:      \"\",\n\t\tOrderMount:   0,\n\t\tPayTime:      time.Time{},\n\t\tAddress:      \"\",\n\t\tSignerName:   \"\",\n\t\tSingerMobile: \"\",\n\t\tPost:         \"\",\n\t\tCreatedAt:    time.Time{},\n\t\tUpdatedAt:    time.Time{},\n\t\tDeletedAt:    time.Time{},\n\t}\n}\n\nfunc (o *orderRepo) GetAddressByID(c context.Context, id, uid int64) (*domain.OrderAddress, error) {\n\treturn &domain.OrderAddress{}, nil\n}\n"
  },
  {
    "path": "service/order/internal/data/orderaddress.go",
    "content": "package data\n\nimport (\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"order/internal/biz\"\n\t\"order/internal/domain\"\n\t\"time\"\n)\n\ntype OrderAddress struct {\n\tID      int64  `gorm:\"primarykey\"`\n\tUser    int64  `gorm:\"type:int not null;default:0;index;comment:用户ID\"`\n\tOrderSn string `gorm:\"type:varchar(30) not null;default:'';index\"` // 订单号，我们平台自己生成的订单号\n\n\t// 用户收货信息\n\tRecipientName   string `gorm:\"type:varchar(20) not null;default:''; comment:收货姓名\"`\n\tRecipientMobile string `gorm:\"type:varchar(20) not null;default:'';  comment:收货电话\"`\n\tProvince        string `gorm:\"type:varchar(25) not null;default:''; comment:省\"`\n\tCity            string `gorm:\"type:varchar(25) not null;default:''; comment:市\"`\n\tDistricts       string `gorm:\"type:varchar(25) not null;default:''; comment:区/县\"`\n\tAddress         string `gorm:\"type:varchar(255) not null;default:''; comment:收货详细地址\"`\n\tPostCode        string `gorm:\"type:varchar(25) not null;default:''; comment:邮编\"`\n\n\tCreatedAt time.Time `gorm:\"column:created_at\"`\n\tUpdatedAt time.Time `gorm:\"column:updated_at\"`\n}\n\nfunc (OrderAddress) TableName() string {\n\treturn \"order_address\"\n}\n\ntype orderAddressRepo struct {\n\tdata *Data\n\tlog  *log.Helper\n}\n\n// NewOrderAddressRepo .\nfunc NewOrderAddressRepo(data *Data, logger log.Logger) biz.OrderRepo {\n\treturn &orderRepo{\n\t\tdata: data,\n\t\tlog:  log.NewHelper(logger),\n\t}\n}\n\nfunc (p *OrderAddress) ToDomain() *domain.Order {\n\treturn &domain.Order{\n\t\tID:           0,\n\t\tUser:         0,\n\t\tOrderSn:      \"\",\n\t\tPayType:      \"\",\n\t\tStatus:       \"\",\n\t\tTradeNo:      \"\",\n\t\tOrderMount:   0,\n\t\tPayTime:      time.Time{},\n\t\tAddress:      \"\",\n\t\tSignerName:   \"\",\n\t\tSingerMobile: \"\",\n\t\tPost:         \"\",\n\t\tCreatedAt:    time.Time{},\n\t\tUpdatedAt:    time.Time{},\n\t\tDeletedAt:    time.Time{},\n\t}\n}\n"
  },
  {
    "path": "service/order/internal/data/ordergoods.go",
    "content": "package data\n\nimport (\n\t\"time\"\n)\n\ntype OrderGoods struct {\n\tID         int64  `gorm:\"primarykey;type:int\" json:\"id\"`\n\tOrderSn    string `gorm:\"type:varchar(30) not null;default:'';index\"` // 订单号，我们平台自己生成的订单号\n\tUserId     int64  `gorm:\"type:int not null;default:0;index\"`\n\tSkuId      int64  `gorm:\"type:int not null;default:0;index\"`\n\tSkuName    string `gorm:\"type:varchar(100) not null;default:'';index\"`\n\tSkuPrice   int64  `gorm:\"type:int not null;default:0 comment '生成订单时的商品价格(单)'\"`\n\tNum        int32  `gorm:\"type:int(10) not null;default:0; comment:商品数量\"`\n\tTotalPrice int64  `gorm:\"type:int not null;default:0; comment:生成订单时的商品总价\"`\n\t// 商品快照信息根据需求后期添加\n\tCreatedAt time.Time `gorm:\"column:created_at\" json:\"created_at\"`\n\tUpdatedAt time.Time `gorm:\"column:updated_at\" json:\"updated_at\"`\n}\n\nfunc (OrderGoods) TableName() string {\n\treturn \"order_goods\"\n}\n"
  },
  {
    "path": "service/order/internal/data/orderpay.go",
    "content": "package data\n\nimport \"time\"\n\n// OrderPay 支付信息\ntype OrderPay struct {\n\tID        int64     `gorm:\"primarykey\"`\n\tUser      int64     `gorm:\"type:int not null;default:0;index;comment:用户ID\"`\n\tOrderSn   string    `gorm:\"type:varchar(30) not null;default:'';index\"`             // 订单号，我们平台自己生成的订单号\n\tTradeNo   string    `gorm:\"type:varchar(100) not null;default:''; comment:交易号、流水号\"` // 交易号就是支付宝的订单号 查账\n\tPayType   string    `gorm:\"type:tinyint(1) not null;default:0 comment '1alipay(支付宝)， 2wechat(微信)'\"`\n\tPayStatus int       `gorm:\"type:tinyint(1) not null;default:0 comment '1PAYING(待支付), 2TRADE_SUCCESS(成功)， 3TRADE_CLOSED(超时关闭), 4WAIT_BUYER_PAY(交易创建), 5TRADE_FINISHED(交易结束)'\"`\n\tPayTime   time.Time `gorm:\"type:datetime comment '支付时间'\"`\n\tCreatedAt time.Time `gorm:\"column:created_at\"`\n\tUpdatedAt time.Time `gorm:\"column:updated_at\"`\n}\n"
  },
  {
    "path": "service/order/internal/domain/order.go",
    "content": "package domain\n\nimport (\n\t\"time\"\n)\n\ntype Order struct {\n\tID           int64\n\tUser         int64\n\tOrderSn      string\n\tPayType      string\n\tStatus       string\n\tTradeNo      string\n\tOrderMount   int64\n\tPayTime      time.Time\n\tAddress      string\n\tSignerName   string\n\tSingerMobile string\n\tPost         string\n\tCreatedAt    time.Time\n\tUpdatedAt    time.Time\n\tDeletedAt    time.Time\n}\n\ntype CreateOrder struct {\n\tUserId    int64\n\tAddressId int64\n\tCartItem  CartItemList\n}\n\ntype CartItem struct {\n\tCartId   int64\n\tSkuId    int64\n\tSkuPrice int64\n\tSkuNum   int32\n}\n\ntype CartItemList []*CartItem\n\nfunc (p CartItemList) FindById(id int64) *CartItem {\n\tfor _, item := range p {\n\t\tif item.CartId == id {\n\t\t\treturn item\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (p CartItemList) GetSkuId() []int64 {\n\tvar l []int64\n\tfor _, item := range p {\n\t\tl = append(l, item.SkuId)\n\t}\n\treturn l\n}\n"
  },
  {
    "path": "service/order/internal/domain/orderaddress.go",
    "content": "package domain\n\ntype OrderAddress struct {\n\tID              int64\n\tUser            int64\n\tOrderSn         string\n\tRecipientName   string\n\tRecipientMobile string\n\tProvince        string\n\tCity            string\n\tDistricts       string\n\tAddress         string\n\tPostCode        string\n}\n"
  },
  {
    "path": "service/order/internal/mocks/mrepo/order.go",
    "content": "// Code generated by MockGen. DO NOT EDIT.\n// Source: order/internal/biz (interfaces: OrderRepo)\n\n// Package mrepo is a generated GoMock package.\npackage mrepo\n\nimport (\n\tgomock \"github.com/golang/mock/gomock\"\n)\n\n// MockOrderRepo is a mock of OrderRepo interface.\ntype MockOrderRepo struct {\n\tctrl     *gomock.Controller\n\trecorder *MockOrderRepoMockRecorder\n}\n\n// MockOrderRepoMockRecorder is the mock recorder for MockOrderRepo.\ntype MockOrderRepoMockRecorder struct {\n\tmock *MockOrderRepo\n}\n\n// NewMockOrderRepo creates a new mock instance.\nfunc NewMockOrderRepo(ctrl *gomock.Controller) *MockOrderRepo {\n\tmock := &MockOrderRepo{ctrl: ctrl}\n\tmock.recorder = &MockOrderRepoMockRecorder{mock}\n\treturn mock\n}\n\n// EXPECT returns an object that allows the caller to indicate expected use.\nfunc (m *MockOrderRepo) EXPECT() *MockOrderRepoMockRecorder {\n\treturn m.recorder\n}\n"
  },
  {
    "path": "service/order/internal/server/grpc.go",
    "content": "package server\n\nimport (\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"github.com/go-kratos/kratos/v2/middleware/logging\"\n\t\"github.com/go-kratos/kratos/v2/middleware/recovery\"\n\t\"github.com/go-kratos/kratos/v2/middleware/tracing\"\n\t\"github.com/go-kratos/kratos/v2/transport/grpc\"\n\tv1 \"order/api/order/v1\"\n\t\"order/internal/conf\"\n\t\"order/internal/service\"\n)\n\n// NewGRPCServer new a gRPC s.\nfunc NewGRPCServer(c *conf.Server, u *service.OrderService, logger log.Logger) *grpc.Server {\n\tvar opts = []grpc.ServerOption{\n\t\tgrpc.Middleware(\n\t\t\trecovery.Recovery(),\n\t\t\ttracing.Server(),\n\t\t\tlogging.Server(logger),\n\t\t),\n\t}\n\tif c.Grpc.Network != \"\" {\n\t\topts = append(opts, grpc.Network(c.Grpc.Network))\n\t}\n\tif c.Grpc.Addr != \"\" {\n\t\topts = append(opts, grpc.Address(c.Grpc.Addr))\n\t}\n\tif c.Grpc.Timeout != nil {\n\t\topts = append(opts, grpc.Timeout(c.Grpc.Timeout.AsDuration()))\n\t}\n\tsrv := grpc.NewServer(opts...)\n\tv1.RegisterOrderServer(srv, u)\n\treturn srv\n}\n"
  },
  {
    "path": "service/order/internal/server/server.go",
    "content": "package server\n\nimport (\n\t\"github.com/go-kratos/kratos/v2/registry\"\n\t\"github.com/google/wire\"\n\t\"order/internal/conf\"\n\n\tconsul \"github.com/go-kratos/kratos/contrib/registry/consul/v2\"\n\tconsulAPI \"github.com/hashicorp/consul/api\"\n)\n\n// ProviderSet is s providers.\nvar ProviderSet = wire.NewSet(NewGRPCServer, NewRegistrar)\n\n// NewRegistrar 引入 consul\nfunc NewRegistrar(conf *conf.Registry) registry.Registrar {\n\tc := consulAPI.DefaultConfig()\n\tc.Address = conf.Consul.Address\n\tc.Scheme = conf.Consul.Scheme\n\n\tcli, err := consulAPI.NewClient(c)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tr := consul.New(cli, consul.WithHealthCheck(false))\n\treturn r\n}\n"
  },
  {
    "path": "service/order/internal/service/README.md",
    "content": "# Service\n"
  },
  {
    "path": "service/order/internal/service/order.go",
    "content": "package service\n\nimport (\n\t\"context\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\tv1 \"order/api/order/v1\"\n\t\"order/internal/biz\"\n\t\"order/internal/domain\"\n)\n\ntype OrderService struct {\n\tv1.UnimplementedOrderServer\n\n\toc  *biz.OrderUsecase\n\tlog *log.Helper\n}\n\nfunc NewOrderService(o *biz.OrderUsecase, logger log.Logger) *OrderService {\n\treturn &OrderService{oc: o, log: log.NewHelper(logger)}\n}\n\nfunc (o *OrderService) CreateOrder(ctx context.Context, r *v1.OrderRequest) (*v1.OrderInfoResponse, error) {\n\tvar cartItem []*domain.CartItem\n\tfor _, cart := range r.CartItem {\n\t\tres := &domain.CartItem{\n\t\t\tCartId:   cart.CartId,\n\t\t\tSkuId:    cart.SkuId,\n\t\t\tSkuPrice: cart.SkuPrice,\n\t\t\tSkuNum:   cart.SkuNum,\n\t\t}\n\t\tcartItem = append(cartItem, res)\n\t}\n\n\to.oc.CreateOrder(ctx, &domain.CreateOrder{\n\t\tUserId:    r.UserId,\n\t\tAddressId: r.Address,\n\t\tCartItem:  cartItem,\n\t})\n\treturn &v1.OrderInfoResponse{}, nil\n}\n"
  },
  {
    "path": "service/order/internal/service/service.go",
    "content": "package service\n\nimport \"github.com/google/wire\"\n\n// ProviderSet is service providers.\nvar ProviderSet = wire.NewSet(NewOrderService)\n"
  },
  {
    "path": "service/order/openapi.yaml",
    "content": "# Generated with protoc-gen-openapi\n# https://github.com/google/gnostic/tree/master/apps/protoc-gen-openapi\n\nopenapi: 3.0.3\ninfo:\n    title: \"\"\n    version: 0.0.1\npaths: {}\ncomponents:\n    schemas: {}\n"
  },
  {
    "path": "service/order/third_party/README.md",
    "content": "# third_party\n"
  },
  {
    "path": "service/order/third_party/errors/errors.proto",
    "content": "syntax = \"proto3\";\n\npackage errors;\n\noption go_package = \"github.com/go-kratos/kratos/v2/errors;errors\";\noption java_multiple_files = true;\noption java_package = \"com.github.kratos.errors\";\noption objc_class_prefix = \"KratosErrors\";\n\nimport \"google/protobuf/descriptor.proto\";\n\nextend google.protobuf.EnumOptions {\n  int32 default_code = 1108;\n}\n\nextend google.protobuf.EnumValueOptions {\n  int32 code = 1109;\n}"
  },
  {
    "path": "service/order/third_party/google/api/annotations.proto",
    "content": "// Copyright (c) 2015, Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\npackage google.api;\n\nimport \"google/api/http.proto\";\nimport \"google/protobuf/descriptor.proto\";\n\noption go_package = \"google.golang.org/genproto/googleapis/api/annotations;annotations\";\noption java_multiple_files = true;\noption java_outer_classname = \"AnnotationsProto\";\noption java_package = \"com.google.api\";\noption objc_class_prefix = \"GAPI\";\n\nextend google.protobuf.MethodOptions {\n  // See `HttpRule`.\n  HttpRule http = 72295728;\n}\n"
  },
  {
    "path": "service/order/third_party/google/api/client.proto",
    "content": "// Copyright 2019 Google LLC.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\npackage google.api;\n\nimport \"google/protobuf/descriptor.proto\";\n\noption go_package = \"google.golang.org/genproto/googleapis/api/annotations;annotations\";\noption java_multiple_files = true;\noption java_outer_classname = \"ClientProto\";\noption java_package = \"com.google.api\";\noption objc_class_prefix = \"GAPI\";\n\n\nextend google.protobuf.ServiceOptions {\n  // The hostname for this service.\n  // This should be specified with no prefix or protocol.\n  //\n  // Example:\n  //\n  //   service Foo {\n  //     option (google.api.default_host) = \"foo.googleapi.com\";\n  //     ...\n  //   }\n  string default_host = 1049;\n\n  // OAuth scopes needed for the client.\n  //\n  // Example:\n  //\n  //   service Foo {\n  //     option (google.api.oauth_scopes) = \\\n  //       \"https://www.googleapis.com/auth/cloud-platform\";\n  //     ...\n  //   }\n  //\n  // If there is more than one scope, use a comma-separated string:\n  //\n  // Example:\n  //\n  //   service Foo {\n  //     option (google.api.oauth_scopes) = \\\n  //       \"https://www.googleapis.com/auth/cloud-platform,\"\n  //       \"https://www.googleapis.com/auth/monitoring\";\n  //     ...\n  //   }\n  string oauth_scopes = 1050;\n}\n\n\nextend google.protobuf.MethodOptions {\n  // A definition of a client library method signature.\n  //\n  // In client libraries, each proto RPC corresponds to one or more methods\n  // which the end user is able to call, and calls the underlying RPC.\n  // Normally, this method receives a single argument (a struct or instance\n  // corresponding to the RPC request object). Defining this field will\n  // add one or more overloads providing flattened or simpler method signatures\n  // in some languages.\n  //\n  // The fields on the method signature are provided as a comma-separated\n  // string.\n  //\n  // For example, the proto RPC and annotation:\n  //\n  //   rpc CreateSubscription(CreateSubscriptionRequest)\n  //       returns (Subscription) {\n  //     option (google.api.method_signature) = \"name,topic\";\n  //   }\n  //\n  // Would add the following Java overload (in addition to the method accepting\n  // the request object):\n  //\n  //   public final Subscription createSubscription(String name, String topic)\n  //\n  // The following backwards-compatibility guidelines apply:\n  //\n  //   * Adding this annotation to an unannotated method is backwards\n  //     compatible.\n  //   * Adding this annotation to a method which already has existing\n  //     method signature annotations is backwards compatible if and only if\n  //     the new method signature annotation is last in the sequence.\n  //   * Modifying or removing an existing method signature annotation is\n  //     a breaking change.\n  //   * Re-ordering existing method signature annotations is a breaking\n  //     change.\n  repeated string method_signature = 1051;\n}"
  },
  {
    "path": "service/order/third_party/google/api/field_behavior.proto",
    "content": "// Copyright 2019 Google LLC.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\npackage google.api;\n\nimport \"google/protobuf/descriptor.proto\";\n\noption go_package = \"google.golang.org/genproto/googleapis/api/annotations;annotations\";\noption java_multiple_files = true;\noption java_outer_classname = \"FieldBehaviorProto\";\noption java_package = \"com.google.api\";\noption objc_class_prefix = \"GAPI\";\n\n\n// An indicator of the behavior of a given field (for example, that a field\n// is required in requests, or given as output but ignored as input).\n// This **does not** change the behavior in protocol buffers itself; it only\n// denotes the behavior and may affect how API tooling handles the field.\n//\n// Note: This enum **may** receive new values in the future.\nenum FieldBehavior {\n  // Conventional default for enums. Do not use this.\n  FIELD_BEHAVIOR_UNSPECIFIED = 0;\n\n  // Specifically denotes a field as optional.\n  // While all fields in protocol buffers are optional, this may be specified\n  // for emphasis if appropriate.\n  OPTIONAL = 1;\n\n  // Denotes a field as required.\n  // This indicates that the field **must** be provided as part of the request,\n  // and failure to do so will cause an error (usually `INVALID_ARGUMENT`).\n  REQUIRED = 2;\n\n  // Denotes a field as output only.\n  // This indicates that the field is provided in responses, but including the\n  // field in a request does nothing (the server *must* ignore it and\n  // *must not* throw an error as a result of the field's presence).\n  OUTPUT_ONLY = 3;\n\n  // Denotes a field as input only.\n  // This indicates that the field is provided in requests, and the\n  // corresponding field is not included in output.\n  INPUT_ONLY = 4;\n\n  // Denotes a field as immutable.\n  // This indicates that the field may be set once in a request to create a\n  // resource, but may not be changed thereafter.\n  IMMUTABLE = 5;\n}\n\n\nextend google.protobuf.FieldOptions {\n  // A designation of a specific field behavior (required, output only, etc.)\n  // in protobuf messages.\n  //\n  // Examples:\n  //\n  //   string name = 1 [(google.api.field_behavior) = REQUIRED];\n  //   State state = 1 [(google.api.field_behavior) = OUTPUT_ONLY];\n  //   google.protobuf.Duration ttl = 1\n  //     [(google.api.field_behavior) = INPUT_ONLY];\n  //   google.protobuf.Timestamp expire_time = 1\n  //     [(google.api.field_behavior) = OUTPUT_ONLY,\n  //      (google.api.field_behavior) = IMMUTABLE];\n  repeated FieldBehavior field_behavior = 1052;\n}"
  },
  {
    "path": "service/order/third_party/google/api/http.proto",
    "content": "// Copyright 2020 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\npackage google.api;\n\noption cc_enable_arenas = true;\noption go_package = \"google.golang.org/genproto/googleapis/api/annotations;annotations\";\noption java_multiple_files = true;\noption java_outer_classname = \"HttpProto\";\noption java_package = \"com.google.api\";\noption objc_class_prefix = \"GAPI\";\n\n// Defines the HTTP configuration for an API service. It contains a list of\n// [HttpRule][google.api.HttpRule], each specifying the mapping of an RPC method\n// to one or more HTTP REST API methods.\nmessage Http {\n  // A list of HTTP configuration rules that apply to individual API methods.\n  //\n  // **NOTE:** All service configuration rules follow \"last one wins\" order.\n  repeated HttpRule rules = 1;\n\n  // When set to true, URL path parameters will be fully URI-decoded except in\n  // cases of single segment matches in reserved expansion, where \"%2F\" will be\n  // left encoded.\n  //\n  // The default behavior is to not decode RFC 6570 reserved characters in multi\n  // segment matches.\n  bool fully_decode_reserved_expansion = 2;\n}\n\n// # gRPC Transcoding\n//\n// gRPC Transcoding is a feature for mapping between a gRPC method and one or\n// more HTTP REST endpoints. It allows developers to build a single API service\n// that supports both gRPC APIs and REST APIs. Many systems, including [Google\n// APIs](https://github.com/googleapis/googleapis),\n// [Cloud Endpoints](https://cloud.google.com/endpoints), [gRPC\n// Gateway](https://github.com/grpc-ecosystem/grpc-gateway),\n// and [Envoy](https://github.com/envoyproxy/envoy) proxy support this feature\n// and use it for large scale production services.\n//\n// `HttpRule` defines the schema of the gRPC/REST mapping. The mapping specifies\n// how different portions of the gRPC request message are mapped to the URL\n// path, URL query parameters, and HTTP request body. It also controls how the\n// gRPC response message is mapped to the HTTP response body. `HttpRule` is\n// typically specified as an `google.api.http` annotation on the gRPC method.\n//\n// Each mapping specifies a URL path template and an HTTP method. The path\n// template may refer to one or more fields in the gRPC request message, as long\n// as each field is a non-repeated field with a primitive (non-message) type.\n// The path template controls how fields of the request message are mapped to\n// the URL path.\n//\n// Example:\n//\n//     service Messaging {\n//       rpc GetMessage(GetMessageRequest) returns (Message) {\n//         option (google.api.http) = {\n//             get: \"/v1/{name=messages/*}\"\n//         };\n//       }\n//     }\n//     message GetMessageRequest {\n//       string name = 1; // Mapped to URL path.\n//     }\n//     message Message {\n//       string text = 1; // The resource content.\n//     }\n//\n// This enables an HTTP REST to gRPC mapping as below:\n//\n// HTTP | gRPC\n// -----|-----\n// `GET /v1/messages/123456`  | `GetMessage(name: \"messages/123456\")`\n//\n// Any fields in the request message which are not bound by the path template\n// automatically become HTTP query parameters if there is no HTTP request body.\n// For example:\n//\n//     service Messaging {\n//       rpc GetMessage(GetMessageRequest) returns (Message) {\n//         option (google.api.http) = {\n//             get:\"/v1/messages/{message_id}\"\n//         };\n//       }\n//     }\n//     message GetMessageRequest {\n//       message SubMessage {\n//         string subfield = 1;\n//       }\n//       string message_id = 1; // Mapped to URL path.\n//       int64 revision = 2;    // Mapped to URL query parameter `revision`.\n//       SubMessage sub = 3;    // Mapped to URL query parameter `sub.subfield`.\n//     }\n//\n// This enables a HTTP JSON to RPC mapping as below:\n//\n// HTTP | gRPC\n// -----|-----\n// `GET /v1/messages/123456?revision=2&sub.subfield=foo` |\n// `GetMessage(message_id: \"123456\" revision: 2 sub: SubMessage(subfield:\n// \"foo\"))`\n//\n// Note that fields which are mapped to URL query parameters must have a\n// primitive type or a repeated primitive type or a non-repeated message type.\n// In the case of a repeated type, the parameter can be repeated in the URL\n// as `...?param=A&param=B`. In the case of a message type, each field of the\n// message is mapped to a separate parameter, such as\n// `...?foo.a=A&foo.b=B&foo.c=C`.\n//\n// For HTTP methods that allow a request body, the `body` field\n// specifies the mapping. Consider a REST update method on the\n// message resource collection:\n//\n//     service Messaging {\n//       rpc UpdateMessage(UpdateMessageRequest) returns (Message) {\n//         option (google.api.http) = {\n//           patch: \"/v1/messages/{message_id}\"\n//           body: \"message\"\n//         };\n//       }\n//     }\n//     message UpdateMessageRequest {\n//       string message_id = 1; // mapped to the URL\n//       Message message = 2;   // mapped to the body\n//     }\n//\n// The following HTTP JSON to RPC mapping is enabled, where the\n// representation of the JSON in the request body is determined by\n// protos JSON encoding:\n//\n// HTTP | gRPC\n// -----|-----\n// `PATCH /v1/messages/123456 { \"text\": \"Hi!\" }` | `UpdateMessage(message_id:\n// \"123456\" message { text: \"Hi!\" })`\n//\n// The special name `*` can be used in the body mapping to define that\n// every field not bound by the path template should be mapped to the\n// request body.  This enables the following alternative definition of\n// the update method:\n//\n//     service Messaging {\n//       rpc UpdateMessage(Message) returns (Message) {\n//         option (google.api.http) = {\n//           patch: \"/v1/messages/{message_id}\"\n//           body: \"*\"\n//         };\n//       }\n//     }\n//     message Message {\n//       string message_id = 1;\n//       string text = 2;\n//     }\n//\n//\n// The following HTTP JSON to RPC mapping is enabled:\n//\n// HTTP | gRPC\n// -----|-----\n// `PATCH /v1/messages/123456 { \"text\": \"Hi!\" }` | `UpdateMessage(message_id:\n// \"123456\" text: \"Hi!\")`\n//\n// Note that when using `*` in the body mapping, it is not possible to\n// have HTTP parameters, as all fields not bound by the path end in\n// the body. This makes this option more rarely used in practice when\n// defining REST APIs. The common usage of `*` is in custom methods\n// which don't use the URL at all for transferring data.\n//\n// It is possible to define multiple HTTP methods for one RPC by using\n// the `additional_bindings` option. Example:\n//\n//     service Messaging {\n//       rpc GetMessage(GetMessageRequest) returns (Message) {\n//         option (google.api.http) = {\n//           get: \"/v1/messages/{message_id}\"\n//           additional_bindings {\n//             get: \"/v1/users/{user_id}/messages/{message_id}\"\n//           }\n//         };\n//       }\n//     }\n//     message GetMessageRequest {\n//       string message_id = 1;\n//       string user_id = 2;\n//     }\n//\n// This enables the following two alternative HTTP JSON to RPC mappings:\n//\n// HTTP | gRPC\n// -----|-----\n// `GET /v1/messages/123456` | `GetMessage(message_id: \"123456\")`\n// `GET /v1/users/me/messages/123456` | `GetMessage(user_id: \"me\" message_id:\n// \"123456\")`\n//\n// ## Rules for HTTP mapping\n//\n// 1. Leaf request fields (recursive expansion nested messages in the request\n//    message) are classified into three categories:\n//    - Fields referred by the path template. They are passed via the URL path.\n//    - Fields referred by the [HttpRule.body][google.api.HttpRule.body]. They are passed via the HTTP\n//      request body.\n//    - All other fields are passed via the URL query parameters, and the\n//      parameter name is the field path in the request message. A repeated\n//      field can be represented as multiple query parameters under the same\n//      name.\n//  2. If [HttpRule.body][google.api.HttpRule.body] is \"*\", there is no URL query parameter, all fields\n//     are passed via URL path and HTTP request body.\n//  3. If [HttpRule.body][google.api.HttpRule.body] is omitted, there is no HTTP request body, all\n//     fields are passed via URL path and URL query parameters.\n//\n// ### Path template syntax\n//\n//     Template = \"/\" Segments [ Verb ] ;\n//     Segments = Segment { \"/\" Segment } ;\n//     Segment  = \"*\" | \"**\" | LITERAL | Variable ;\n//     Variable = \"{\" FieldPath [ \"=\" Segments ] \"}\" ;\n//     FieldPath = IDENT { \".\" IDENT } ;\n//     Verb     = \":\" LITERAL ;\n//\n// The syntax `*` matches a single URL path segment. The syntax `**` matches\n// zero or more URL path segments, which must be the last part of the URL path\n// except the `Verb`.\n//\n// The syntax `Variable` matches part of the URL path as specified by its\n// template. A variable template must not contain other variables. If a variable\n// matches a single path segment, its template may be omitted, e.g. `{var}`\n// is equivalent to `{var=*}`.\n//\n// The syntax `LITERAL` matches literal text in the URL path. If the `LITERAL`\n// contains any reserved character, such characters should be percent-encoded\n// before the matching.\n//\n// If a variable contains exactly one path segment, such as `\"{var}\"` or\n// `\"{var=*}\"`, when such a variable is expanded into a URL path on the client\n// side, all characters except `[-_.~0-9a-zA-Z]` are percent-encoded. The\n// server side does the reverse decoding. Such variables show up in the\n// [Discovery\n// Document](https://developers.google.com/discovery/v1/reference/apis) as\n// `{var}`.\n//\n// If a variable contains multiple path segments, such as `\"{var=foo/*}\"`\n// or `\"{var=**}\"`, when such a variable is expanded into a URL path on the\n// client side, all characters except `[-_.~/0-9a-zA-Z]` are percent-encoded.\n// The server side does the reverse decoding, except \"%2F\" and \"%2f\" are left\n// unchanged. Such variables show up in the\n// [Discovery\n// Document](https://developers.google.com/discovery/v1/reference/apis) as\n// `{+var}`.\n//\n// ## Using gRPC API Service Configuration\n//\n// gRPC API Service Configuration (service config) is a configuration language\n// for configuring a gRPC service to become a user-facing product. The\n// service config is simply the YAML representation of the `google.api.Service`\n// proto message.\n//\n// As an alternative to annotating your proto file, you can configure gRPC\n// transcoding in your service config YAML files. You do this by specifying a\n// `HttpRule` that maps the gRPC method to a REST endpoint, achieving the same\n// effect as the proto annotation. This can be particularly useful if you\n// have a proto that is reused in multiple services. Note that any transcoding\n// specified in the service config will override any matching transcoding\n// configuration in the proto.\n//\n// Example:\n//\n//     http:\n//       rules:\n//         # Selects a gRPC method and applies HttpRule to it.\n//         - selector: example.v1.Messaging.GetMessage\n//           get: /v1/messages/{message_id}/{sub.subfield}\n//\n// ## Special notes\n//\n// When gRPC Transcoding is used to map a gRPC to JSON REST endpoints, the\n// proto to JSON conversion must follow the [proto3\n// specification](https://developers.google.com/protocol-buffers/docs/proto3#json).\n//\n// While the single segment variable follows the semantics of\n// [RFC 6570](https://tools.ietf.org/html/rfc6570) Section 3.2.2 Simple String\n// Expansion, the multi segment variable **does not** follow RFC 6570 Section\n// 3.2.3 Reserved Expansion. The reason is that the Reserved Expansion\n// does not expand special characters like `?` and `#`, which would lead\n// to invalid URLs. As the result, gRPC Transcoding uses a custom encoding\n// for multi segment variables.\n//\n// The path variables **must not** refer to any repeated or mapped field,\n// because client libraries are not capable of handling such variable expansion.\n//\n// The path variables **must not** capture the leading \"/\" character. The reason\n// is that the most common use case \"{var}\" does not capture the leading \"/\"\n// character. For consistency, all path variables must share the same behavior.\n//\n// Repeated message fields must not be mapped to URL query parameters, because\n// no client library can support such complicated mapping.\n//\n// If an API needs to use a JSON array for request or response body, it can map\n// the request or response body to a repeated field. However, some gRPC\n// Transcoding implementations may not support this feature.\nmessage HttpRule {\n  // Selects a method to which this rule applies.\n  //\n  // Refer to [selector][google.api.DocumentationRule.selector] for syntax details.\n  string selector = 1;\n\n  // Determines the URL pattern is matched by this rules. This pattern can be\n  // used with any of the {get|put|post|delete|patch} methods. A custom method\n  // can be defined using the 'custom' field.\n  oneof pattern {\n    // Maps to HTTP GET. Used for listing and getting information about\n    // resources.\n    string get = 2;\n\n    // Maps to HTTP PUT. Used for replacing a resource.\n    string put = 3;\n\n    // Maps to HTTP POST. Used for creating a resource or performing an action.\n    string post = 4;\n\n    // Maps to HTTP DELETE. Used for deleting a resource.\n    string delete = 5;\n\n    // Maps to HTTP PATCH. Used for updating a resource.\n    string patch = 6;\n\n    // The custom pattern is used for specifying an HTTP method that is not\n    // included in the `pattern` field, such as HEAD, or \"*\" to leave the\n    // HTTP method unspecified for this rule. The wild-card rule is useful\n    // for services that provide content to Web (HTML) clients.\n    CustomHttpPattern custom = 8;\n  }\n\n  // The name of the request field whose value is mapped to the HTTP request\n  // body, or `*` for mapping all request fields not captured by the path\n  // pattern to the HTTP body, or omitted for not having any HTTP request body.\n  //\n  // NOTE: the referred field must be present at the top-level of the request\n  // message type.\n  string body = 7;\n\n  // Optional. The name of the response field whose value is mapped to the HTTP\n  // response body. When omitted, the entire response message will be used\n  // as the HTTP response body.\n  //\n  // NOTE: The referred field must be present at the top-level of the response\n  // message type.\n  string response_body = 12;\n\n  // Additional HTTP bindings for the selector. Nested bindings must\n  // not contain an `additional_bindings` field themselves (that is,\n  // the nesting may only be one level deep).\n  repeated HttpRule additional_bindings = 11;\n}\n\n// A custom pattern is used for defining custom HTTP verb.\nmessage CustomHttpPattern {\n  // The name of this custom HTTP verb.\n  string kind = 1;\n\n  // The path matched by this custom verb.\n  string path = 2;\n}\n"
  },
  {
    "path": "service/order/third_party/google/api/httpbody.proto",
    "content": "// Copyright 2020 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\npackage google.api;\n\nimport \"google/protobuf/any.proto\";\n\noption cc_enable_arenas = true;\noption go_package = \"google.golang.org/genproto/googleapis/api/httpbody;httpbody\";\noption java_multiple_files = true;\noption java_outer_classname = \"HttpBodyProto\";\noption java_package = \"com.google.api\";\noption objc_class_prefix = \"GAPI\";\n\n// Message that represents an arbitrary HTTP body. It should only be used for\n// payload formats that can't be represented as JSON, such as raw binary or\n// an HTML page.\n//\n//\n// This message can be used both in streaming and non-streaming API methods in\n// the request as well as the response.\n//\n// It can be used as a top-level request field, which is convenient if one\n// wants to extract parameters from either the URL or HTTP template into the\n// request fields and also want access to the raw HTTP body.\n//\n// Example:\n//\n//     message GetResourceRequest {\n//       // A unique request id.\n//       string request_id = 1;\n//\n//       // The raw HTTP body is bound to this field.\n//       google.api.HttpBody http_body = 2;\n//     }\n//\n//     service ResourceService {\n//       rpc GetResource(GetResourceRequest) returns (google.api.HttpBody);\n//       rpc UpdateResource(google.api.HttpBody) returns\n//       (google.protobuf.Empty);\n//     }\n//\n// Example with streaming methods:\n//\n//     service CaldavService {\n//       rpc GetCalendar(stream google.api.HttpBody)\n//         returns (stream google.api.HttpBody);\n//       rpc UpdateCalendar(stream google.api.HttpBody)\n//         returns (stream google.api.HttpBody);\n//     }\n//\n// Use of this type only changes how the request and response bodies are\n// handled, all other features will continue to work unchanged.\nmessage HttpBody {\n  // The HTTP Content-Type header value specifying the content type of the body.\n  string content_type = 1;\n\n  // The HTTP request/response body as raw binary.\n  bytes data = 2;\n\n  // Application specific response metadata. Must be set in the first response\n  // for streaming APIs.\n  repeated google.protobuf.Any extensions = 3;\n}\n"
  },
  {
    "path": "service/order/third_party/google/protobuf/any.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption go_package = \"google.golang.org/protobuf/types/known/anypb\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"AnyProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\n\n// `Any` contains an arbitrary serialized protocol buffer message along with a\n// URL that describes the type of the serialized message.\n//\n// Protobuf library provides support to pack/unpack Any values in the form\n// of utility functions or additional generated methods of the Any type.\n//\n// Example 1: Pack and unpack a message in C++.\n//\n//     Foo foo = ...;\n//     Any any;\n//     any.PackFrom(foo);\n//     ...\n//     if (any.UnpackTo(&foo)) {\n//       ...\n//     }\n//\n// Example 2: Pack and unpack a message in Java.\n//\n//     Foo foo = ...;\n//     Any any = Any.pack(foo);\n//     ...\n//     if (any.is(Foo.class)) {\n//       foo = any.unpack(Foo.class);\n//     }\n//\n// Example 3: Pack and unpack a message in Python.\n//\n//     foo = Foo(...)\n//     any = Any()\n//     any.Pack(foo)\n//     ...\n//     if any.Is(Foo.DESCRIPTOR):\n//       any.Unpack(foo)\n//       ...\n//\n// Example 4: Pack and unpack a message in Go\n//\n//      foo := &pb.Foo{...}\n//      any, err := anypb.New(foo)\n//      if err != nil {\n//        ...\n//      }\n//      ...\n//      foo := &pb.Foo{}\n//      if err := any.UnmarshalTo(foo); err != nil {\n//        ...\n//      }\n//\n// The pack methods provided by protobuf library will by default use\n// 'type.googleapis.com/full.type.name' as the type URL and the unpack\n// methods only use the fully qualified type name after the last '/'\n// in the type URL, for example \"foo.bar.com/x/y.z\" will yield type\n// name \"y.z\".\n//\n//\n// JSON\n//\n// The JSON representation of an `Any` value uses the regular\n// representation of the deserialized, embedded message, with an\n// additional field `@type` which contains the type URL. Example:\n//\n//     package google.profile;\n//     message Person {\n//       string first_name = 1;\n//       string last_name = 2;\n//     }\n//\n//     {\n//       \"@type\": \"type.googleapis.com/google.profile.Person\",\n//       \"firstName\": <string>,\n//       \"lastName\": <string>\n//     }\n//\n// If the embedded message type is well-known and has a custom JSON\n// representation, that representation will be embedded adding a field\n// `value` which holds the custom JSON in addition to the `@type`\n// field. Example (for message [google.protobuf.Duration][]):\n//\n//     {\n//       \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n//       \"value\": \"1.212s\"\n//     }\n//\nmessage Any {\n  // A URL/resource name that uniquely identifies the type of the serialized\n  // protocol buffer message. This string must contain at least\n  // one \"/\" character. The last segment of the URL's path must represent\n  // the fully qualified name of the type (as in\n  // `path/google.protobuf.Duration`). The name should be in a canonical form\n  // (e.g., leading \".\" is not accepted).\n  //\n  // In practice, teams usually precompile into the binary all types that they\n  // expect it to use in the context of Any. However, for URLs which use the\n  // scheme `http`, `https`, or no scheme, one can optionally set up a type\n  // server that maps type URLs to message definitions as follows:\n  //\n  // * If no scheme is provided, `https` is assumed.\n  // * An HTTP GET on the URL must yield a [google.protobuf.Type][]\n  //   value in binary format, or produce an error.\n  // * Applications are allowed to cache lookup results based on the\n  //   URL, or have them precompiled into a binary to avoid any\n  //   lookup. Therefore, binary compatibility needs to be preserved\n  //   on changes to types. (Use versioned type names to manage\n  //   breaking changes.)\n  //\n  // Note: this functionality is not currently available in the official\n  // protobuf release, and it is not used for type URLs beginning with\n  // type.googleapis.com.\n  //\n  // Schemes other than `http`, `https` (or the empty scheme) might be\n  // used with implementation specific semantics.\n  //\n  string type_url = 1;\n\n  // Must be a valid serialized protocol buffer of the above specified type.\n  bytes value = 2;\n}\n"
  },
  {
    "path": "service/order/third_party/google/protobuf/api.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\nimport \"google/protobuf/source_context.proto\";\nimport \"google/protobuf/type.proto\";\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"ApiProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\noption go_package = \"google.golang.org/protobuf/types/known/apipb\";\n\n// Api is a light-weight descriptor for an API Interface.\n//\n// Interfaces are also described as \"protocol buffer services\" in some contexts,\n// such as by the \"service\" keyword in a .proto file, but they are different\n// from API Services, which represent a concrete implementation of an interface\n// as opposed to simply a description of methods and bindings. They are also\n// sometimes simply referred to as \"APIs\" in other contexts, such as the name of\n// this message itself. See https://cloud.google.com/apis/design/glossary for\n// detailed terminology.\nmessage Api {\n  // The fully qualified name of this interface, including package name\n  // followed by the interface's simple name.\n  string name = 1;\n\n  // The methods of this interface, in unspecified order.\n  repeated Method methods = 2;\n\n  // Any metadata attached to the interface.\n  repeated Option options = 3;\n\n  // A version string for this interface. If specified, must have the form\n  // `major-version.minor-version`, as in `1.10`. If the minor version is\n  // omitted, it defaults to zero. If the entire version field is empty, the\n  // major version is derived from the package name, as outlined below. If the\n  // field is not empty, the version in the package name will be verified to be\n  // consistent with what is provided here.\n  //\n  // The versioning schema uses [semantic\n  // versioning](http://semver.org) where the major version number\n  // indicates a breaking change and the minor version an additive,\n  // non-breaking change. Both version numbers are signals to users\n  // what to expect from different versions, and should be carefully\n  // chosen based on the product plan.\n  //\n  // The major version is also reflected in the package name of the\n  // interface, which must end in `v<major-version>`, as in\n  // `google.feature.v1`. For major versions 0 and 1, the suffix can\n  // be omitted. Zero major versions must only be used for\n  // experimental, non-GA interfaces.\n  //\n  //\n  string version = 4;\n\n  // Source context for the protocol buffer service represented by this\n  // message.\n  SourceContext source_context = 5;\n\n  // Included interfaces. See [Mixin][].\n  repeated Mixin mixins = 6;\n\n  // The source syntax of the service.\n  Syntax syntax = 7;\n}\n\n// Method represents a method of an API interface.\nmessage Method {\n  // The simple name of this method.\n  string name = 1;\n\n  // A URL of the input message type.\n  string request_type_url = 2;\n\n  // If true, the request is streamed.\n  bool request_streaming = 3;\n\n  // The URL of the output message type.\n  string response_type_url = 4;\n\n  // If true, the response is streamed.\n  bool response_streaming = 5;\n\n  // Any metadata attached to the method.\n  repeated Option options = 6;\n\n  // The source syntax of this method.\n  Syntax syntax = 7;\n}\n\n// Declares an API Interface to be included in this interface. The including\n// interface must redeclare all the methods from the included interface, but\n// documentation and options are inherited as follows:\n//\n// - If after comment and whitespace stripping, the documentation\n//   string of the redeclared method is empty, it will be inherited\n//   from the original method.\n//\n// - Each annotation belonging to the service config (http,\n//   visibility) which is not set in the redeclared method will be\n//   inherited.\n//\n// - If an http annotation is inherited, the path pattern will be\n//   modified as follows. Any version prefix will be replaced by the\n//   version of the including interface plus the [root][] path if\n//   specified.\n//\n// Example of a simple mixin:\n//\n//     package google.acl.v1;\n//     service AccessControl {\n//       // Get the underlying ACL object.\n//       rpc GetAcl(GetAclRequest) returns (Acl) {\n//         option (google.api.http).get = \"/v1/{resource=**}:getAcl\";\n//       }\n//     }\n//\n//     package google.storage.v2;\n//     service Storage {\n//       rpc GetAcl(GetAclRequest) returns (Acl);\n//\n//       // Get a data record.\n//       rpc GetData(GetDataRequest) returns (Data) {\n//         option (google.api.http).get = \"/v2/{resource=**}\";\n//       }\n//     }\n//\n// Example of a mixin configuration:\n//\n//     apis:\n//     - name: google.storage.v2.Storage\n//       mixins:\n//       - name: google.acl.v1.AccessControl\n//\n// The mixin construct implies that all methods in `AccessControl` are\n// also declared with same name and request/response types in\n// `Storage`. A documentation generator or annotation processor will\n// see the effective `Storage.GetAcl` method after inheriting\n// documentation and annotations as follows:\n//\n//     service Storage {\n//       // Get the underlying ACL object.\n//       rpc GetAcl(GetAclRequest) returns (Acl) {\n//         option (google.api.http).get = \"/v2/{resource=**}:getAcl\";\n//       }\n//       ...\n//     }\n//\n// Note how the version in the path pattern changed from `v1` to `v2`.\n//\n// If the `root` field in the mixin is specified, it should be a\n// relative path under which inherited HTTP paths are placed. Example:\n//\n//     apis:\n//     - name: google.storage.v2.Storage\n//       mixins:\n//       - name: google.acl.v1.AccessControl\n//         root: acls\n//\n// This implies the following inherited HTTP annotation:\n//\n//     service Storage {\n//       // Get the underlying ACL object.\n//       rpc GetAcl(GetAclRequest) returns (Acl) {\n//         option (google.api.http).get = \"/v2/acls/{resource=**}:getAcl\";\n//       }\n//       ...\n//     }\nmessage Mixin {\n  // The fully qualified name of the interface which is included.\n  string name = 1;\n\n  // If non-empty specifies a path under which inherited HTTP paths\n  // are rooted.\n  string root = 2;\n}\n"
  },
  {
    "path": "service/order/third_party/google/protobuf/compiler/plugin.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//\n// WARNING:  The plugin interface is currently EXPERIMENTAL and is subject to\n//   change.\n//\n// protoc (aka the Protocol Compiler) can be extended via plugins.  A plugin is\n// just a program that reads a CodeGeneratorRequest from stdin and writes a\n// CodeGeneratorResponse to stdout.\n//\n// Plugins written using C++ can use google/protobuf/compiler/plugin.h instead\n// of dealing with the raw protocol defined here.\n//\n// A plugin executable needs only to be placed somewhere in the path.  The\n// plugin should be named \"protoc-gen-$NAME\", and will then be used when the\n// flag \"--${NAME}_out\" is passed to protoc.\n\nsyntax = \"proto2\";\n\npackage google.protobuf.compiler;\noption java_package = \"com.google.protobuf.compiler\";\noption java_outer_classname = \"PluginProtos\";\n\noption go_package = \"google.golang.org/protobuf/types/pluginpb\";\n\nimport \"google/protobuf/descriptor.proto\";\n\n// The version number of protocol compiler.\nmessage Version {\n  optional int32 major = 1;\n  optional int32 minor = 2;\n  optional int32 patch = 3;\n  // A suffix for alpha, beta or rc release, e.g., \"alpha-1\", \"rc2\". It should\n  // be empty for mainline stable releases.\n  optional string suffix = 4;\n}\n\n// An encoded CodeGeneratorRequest is written to the plugin's stdin.\nmessage CodeGeneratorRequest {\n  // The .proto files that were explicitly listed on the command-line.  The\n  // code generator should generate code only for these files.  Each file's\n  // descriptor will be included in proto_file, below.\n  repeated string file_to_generate = 1;\n\n  // The generator parameter passed on the command-line.\n  optional string parameter = 2;\n\n  // FileDescriptorProtos for all files in files_to_generate and everything\n  // they import.  The files will appear in topological order, so each file\n  // appears before any file that imports it.\n  //\n  // protoc guarantees that all proto_files will be written after\n  // the fields above, even though this is not technically guaranteed by the\n  // protobuf wire format.  This theoretically could allow a plugin to stream\n  // in the FileDescriptorProtos and handle them one by one rather than read\n  // the entire set into memory at once.  However, as of this writing, this\n  // is not similarly optimized on protoc's end -- it will store all fields in\n  // memory at once before sending them to the plugin.\n  //\n  // Type names of fields and extensions in the FileDescriptorProto are always\n  // fully qualified.\n  repeated FileDescriptorProto proto_file = 15;\n\n  // The version number of protocol compiler.\n  optional Version compiler_version = 3;\n\n}\n\n// The plugin writes an encoded CodeGeneratorResponse to stdout.\nmessage CodeGeneratorResponse {\n  // Error message.  If non-empty, code generation failed.  The plugin process\n  // should exit with status code zero even if it reports an error in this way.\n  //\n  // This should be used to indicate errors in .proto files which prevent the\n  // code generator from generating correct code.  Errors which indicate a\n  // problem in protoc itself -- such as the input CodeGeneratorRequest being\n  // unparseable -- should be reported by writing a message to stderr and\n  // exiting with a non-zero status code.\n  optional string error = 1;\n\n  // A bitmask of supported features that the code generator supports.\n  // This is a bitwise \"or\" of values from the Feature enum.\n  optional uint64 supported_features = 2;\n\n  // Sync with code_generator.h.\n  enum Feature {\n    FEATURE_NONE = 0;\n    FEATURE_PROTO3_OPTIONAL = 1;\n  }\n\n  // Represents a single generated file.\n  message File {\n    // The file name, relative to the output directory.  The name must not\n    // contain \".\" or \"..\" components and must be relative, not be absolute (so,\n    // the file cannot lie outside the output directory).  \"/\" must be used as\n    // the path separator, not \"\\\".\n    //\n    // If the name is omitted, the content will be appended to the previous\n    // file.  This allows the generator to break large files into small chunks,\n    // and allows the generated text to be streamed back to protoc so that large\n    // files need not reside completely in memory at one time.  Note that as of\n    // this writing protoc does not optimize for this -- it will read the entire\n    // CodeGeneratorResponse before writing files to disk.\n    optional string name = 1;\n\n    // If non-empty, indicates that the named file should already exist, and the\n    // content here is to be inserted into that file at a defined insertion\n    // point.  This feature allows a code generator to extend the output\n    // produced by another code generator.  The original generator may provide\n    // insertion points by placing special annotations in the file that look\n    // like:\n    //   @@protoc_insertion_point(NAME)\n    // The annotation can have arbitrary text before and after it on the line,\n    // which allows it to be placed in a comment.  NAME should be replaced with\n    // an identifier naming the point -- this is what other generators will use\n    // as the insertion_point.  Code inserted at this point will be placed\n    // immediately above the line containing the insertion point (thus multiple\n    // insertions to the same point will come out in the order they were added).\n    // The double-@ is intended to make it unlikely that the generated code\n    // could contain things that look like insertion points by accident.\n    //\n    // For example, the C++ code generator places the following line in the\n    // .pb.h files that it generates:\n    //   // @@protoc_insertion_point(namespace_scope)\n    // This line appears within the scope of the file's package namespace, but\n    // outside of any particular class.  Another plugin can then specify the\n    // insertion_point \"namespace_scope\" to generate additional classes or\n    // other declarations that should be placed in this scope.\n    //\n    // Note that if the line containing the insertion point begins with\n    // whitespace, the same whitespace will be added to every line of the\n    // inserted text.  This is useful for languages like Python, where\n    // indentation matters.  In these languages, the insertion point comment\n    // should be indented the same amount as any inserted code will need to be\n    // in order to work correctly in that context.\n    //\n    // The code generator that generates the initial file and the one which\n    // inserts into it must both run as part of a single invocation of protoc.\n    // Code generators are executed in the order in which they appear on the\n    // command line.\n    //\n    // If |insertion_point| is present, |name| must also be present.\n    optional string insertion_point = 2;\n\n    // The file contents.\n    optional string content = 15;\n\n    // Information describing the file content being inserted. If an insertion\n    // point is used, this information will be appropriately offset and inserted\n    // into the code generation metadata for the generated files.\n    optional GeneratedCodeInfo generated_code_info = 16;\n  }\n  repeated File file = 15;\n}\n"
  },
  {
    "path": "service/order/third_party/google/protobuf/descriptor.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// The messages in this file describe the definitions found in .proto files.\n// A valid .proto file can be translated directly to a FileDescriptorProto\n// without any other information (e.g. without reading its imports).\n\n\nsyntax = \"proto2\";\n\npackage google.protobuf;\n\noption go_package = \"google.golang.org/protobuf/types/descriptorpb\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"DescriptorProtos\";\noption csharp_namespace = \"Google.Protobuf.Reflection\";\noption objc_class_prefix = \"GPB\";\noption cc_enable_arenas = true;\n\n// descriptor.proto must be optimized for speed because reflection-based\n// algorithms don't work during bootstrapping.\noption optimize_for = SPEED;\n\n// The protocol compiler can output a FileDescriptorSet containing the .proto\n// files it parses.\nmessage FileDescriptorSet {\n  repeated FileDescriptorProto file = 1;\n}\n\n// Describes a complete .proto file.\nmessage FileDescriptorProto {\n  optional string name = 1;     // file name, relative to root of source tree\n  optional string package = 2;  // e.g. \"foo\", \"foo.bar\", etc.\n\n  // Names of files imported by this file.\n  repeated string dependency = 3;\n  // Indexes of the public imported files in the dependency list above.\n  repeated int32 public_dependency = 10;\n  // Indexes of the weak imported files in the dependency list.\n  // For Google-internal migration only. Do not use.\n  repeated int32 weak_dependency = 11;\n\n  // All top-level definitions in this file.\n  repeated DescriptorProto message_type = 4;\n  repeated EnumDescriptorProto enum_type = 5;\n  repeated ServiceDescriptorProto service = 6;\n  repeated FieldDescriptorProto extension = 7;\n\n  optional FileOptions options = 8;\n\n  // This field contains optional information about the original source code.\n  // You may safely remove this entire field without harming runtime\n  // functionality of the descriptors -- the information is needed only by\n  // development tools.\n  optional SourceCodeInfo source_code_info = 9;\n\n  // The syntax of the proto file.\n  // The supported values are \"proto2\" and \"proto3\".\n  optional string syntax = 12;\n}\n\n// Describes a message type.\nmessage DescriptorProto {\n  optional string name = 1;\n\n  repeated FieldDescriptorProto field = 2;\n  repeated FieldDescriptorProto extension = 6;\n\n  repeated DescriptorProto nested_type = 3;\n  repeated EnumDescriptorProto enum_type = 4;\n\n  message ExtensionRange {\n    optional int32 start = 1;  // Inclusive.\n    optional int32 end = 2;    // Exclusive.\n\n    optional ExtensionRangeOptions options = 3;\n  }\n  repeated ExtensionRange extension_range = 5;\n\n  repeated OneofDescriptorProto oneof_decl = 8;\n\n  optional MessageOptions options = 7;\n\n  // Range of reserved tag numbers. Reserved tag numbers may not be used by\n  // fields or extension ranges in the same message. Reserved ranges may\n  // not overlap.\n  message ReservedRange {\n    optional int32 start = 1;  // Inclusive.\n    optional int32 end = 2;    // Exclusive.\n  }\n  repeated ReservedRange reserved_range = 9;\n  // Reserved field names, which may not be used by fields in the same message.\n  // A given name may only be reserved once.\n  repeated string reserved_name = 10;\n}\n\nmessage ExtensionRangeOptions {\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\n// Describes a field within a message.\nmessage FieldDescriptorProto {\n  enum Type {\n    // 0 is reserved for errors.\n    // Order is weird for historical reasons.\n    TYPE_DOUBLE = 1;\n    TYPE_FLOAT = 2;\n    // Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT64 if\n    // negative values are likely.\n    TYPE_INT64 = 3;\n    TYPE_UINT64 = 4;\n    // Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT32 if\n    // negative values are likely.\n    TYPE_INT32 = 5;\n    TYPE_FIXED64 = 6;\n    TYPE_FIXED32 = 7;\n    TYPE_BOOL = 8;\n    TYPE_STRING = 9;\n    // Tag-delimited aggregate.\n    // Group type is deprecated and not supported in proto3. However, Proto3\n    // implementations should still be able to parse the group wire format and\n    // treat group fields as unknown fields.\n    TYPE_GROUP = 10;\n    TYPE_MESSAGE = 11;  // Length-delimited aggregate.\n\n    // New in version 2.\n    TYPE_BYTES = 12;\n    TYPE_UINT32 = 13;\n    TYPE_ENUM = 14;\n    TYPE_SFIXED32 = 15;\n    TYPE_SFIXED64 = 16;\n    TYPE_SINT32 = 17;  // Uses ZigZag encoding.\n    TYPE_SINT64 = 18;  // Uses ZigZag encoding.\n  }\n\n  enum Label {\n    // 0 is reserved for errors\n    LABEL_OPTIONAL = 1;\n    LABEL_REQUIRED = 2;\n    LABEL_REPEATED = 3;\n  }\n\n  optional string name = 1;\n  optional int32 number = 3;\n  optional Label label = 4;\n\n  // If type_name is set, this need not be set.  If both this and type_name\n  // are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP.\n  optional Type type = 5;\n\n  // For message and enum types, this is the name of the type.  If the name\n  // starts with a '.', it is fully-qualified.  Otherwise, C++-like scoping\n  // rules are used to find the type (i.e. first the nested types within this\n  // message are searched, then within the parent, on up to the root\n  // namespace).\n  optional string type_name = 6;\n\n  // For extensions, this is the name of the type being extended.  It is\n  // resolved in the same manner as type_name.\n  optional string extendee = 2;\n\n  // For numeric types, contains the original text representation of the value.\n  // For booleans, \"true\" or \"false\".\n  // For strings, contains the default text contents (not escaped in any way).\n  // For bytes, contains the C escaped value.  All bytes >= 128 are escaped.\n  optional string default_value = 7;\n\n  // If set, gives the index of a oneof in the containing type's oneof_decl\n  // list.  This field is a member of that oneof.\n  optional int32 oneof_index = 9;\n\n  // JSON name of this field. The value is set by protocol compiler. If the\n  // user has set a \"json_name\" option on this field, that option's value\n  // will be used. Otherwise, it's deduced from the field's name by converting\n  // it to camelCase.\n  optional string json_name = 10;\n\n  optional FieldOptions options = 8;\n\n  // If true, this is a proto3 \"optional\". When a proto3 field is optional, it\n  // tracks presence regardless of field type.\n  //\n  // When proto3_optional is true, this field must be belong to a oneof to\n  // signal to old proto3 clients that presence is tracked for this field. This\n  // oneof is known as a \"synthetic\" oneof, and this field must be its sole\n  // member (each proto3 optional field gets its own synthetic oneof). Synthetic\n  // oneofs exist in the descriptor only, and do not generate any API. Synthetic\n  // oneofs must be ordered after all \"real\" oneofs.\n  //\n  // For message fields, proto3_optional doesn't create any semantic change,\n  // since non-repeated message fields always track presence. However it still\n  // indicates the semantic detail of whether the user wrote \"optional\" or not.\n  // This can be useful for round-tripping the .proto file. For consistency we\n  // give message fields a synthetic oneof also, even though it is not required\n  // to track presence. This is especially important because the parser can't\n  // tell if a field is a message or an enum, so it must always create a\n  // synthetic oneof.\n  //\n  // Proto2 optional fields do not set this flag, because they already indicate\n  // optional with `LABEL_OPTIONAL`.\n  optional bool proto3_optional = 17;\n}\n\n// Describes a oneof.\nmessage OneofDescriptorProto {\n  optional string name = 1;\n  optional OneofOptions options = 2;\n}\n\n// Describes an enum type.\nmessage EnumDescriptorProto {\n  optional string name = 1;\n\n  repeated EnumValueDescriptorProto value = 2;\n\n  optional EnumOptions options = 3;\n\n  // Range of reserved numeric values. Reserved values may not be used by\n  // entries in the same enum. Reserved ranges may not overlap.\n  //\n  // Note that this is distinct from DescriptorProto.ReservedRange in that it\n  // is inclusive such that it can appropriately represent the entire int32\n  // domain.\n  message EnumReservedRange {\n    optional int32 start = 1;  // Inclusive.\n    optional int32 end = 2;    // Inclusive.\n  }\n\n  // Range of reserved numeric values. Reserved numeric values may not be used\n  // by enum values in the same enum declaration. Reserved ranges may not\n  // overlap.\n  repeated EnumReservedRange reserved_range = 4;\n\n  // Reserved enum value names, which may not be reused. A given name may only\n  // be reserved once.\n  repeated string reserved_name = 5;\n}\n\n// Describes a value within an enum.\nmessage EnumValueDescriptorProto {\n  optional string name = 1;\n  optional int32 number = 2;\n\n  optional EnumValueOptions options = 3;\n}\n\n// Describes a service.\nmessage ServiceDescriptorProto {\n  optional string name = 1;\n  repeated MethodDescriptorProto method = 2;\n\n  optional ServiceOptions options = 3;\n}\n\n// Describes a method of a service.\nmessage MethodDescriptorProto {\n  optional string name = 1;\n\n  // Input and output type names.  These are resolved in the same way as\n  // FieldDescriptorProto.type_name, but must refer to a message type.\n  optional string input_type = 2;\n  optional string output_type = 3;\n\n  optional MethodOptions options = 4;\n\n  // Identifies if client streams multiple client messages\n  optional bool client_streaming = 5 [default = false];\n  // Identifies if server streams multiple server messages\n  optional bool server_streaming = 6 [default = false];\n}\n\n\n// ===================================================================\n// Options\n\n// Each of the definitions above may have \"options\" attached.  These are\n// just annotations which may cause code to be generated slightly differently\n// or may contain hints for code that manipulates protocol messages.\n//\n// Clients may define custom options as extensions of the *Options messages.\n// These extensions may not yet be known at parsing time, so the parser cannot\n// store the values in them.  Instead it stores them in a field in the *Options\n// message called uninterpreted_option. This field must have the same name\n// across all *Options messages. We then use this field to populate the\n// extensions when we build a descriptor, at which point all protos have been\n// parsed and so all extensions are known.\n//\n// Extension numbers for custom options may be chosen as follows:\n// * For options which will only be used within a single application or\n//   organization, or for experimental options, use field numbers 50000\n//   through 99999.  It is up to you to ensure that you do not use the\n//   same number for multiple options.\n// * For options which will be published and used publicly by multiple\n//   independent entities, e-mail protobuf-global-extension-registry@google.com\n//   to reserve extension numbers. Simply provide your project name (e.g.\n//   Objective-C plugin) and your project website (if available) -- there's no\n//   need to explain how you intend to use them. Usually you only need one\n//   extension number. You can declare multiple options with only one extension\n//   number by putting them in a sub-message. See the Custom Options section of\n//   the docs for examples:\n//   https://developers.google.com/protocol-buffers/docs/proto#options\n//   If this turns out to be popular, a web service will be set up\n//   to automatically assign option numbers.\n\nmessage FileOptions {\n\n  // Sets the Java package where classes generated from this .proto will be\n  // placed.  By default, the proto package is used, but this is often\n  // inappropriate because proto packages do not normally start with backwards\n  // domain names.\n  optional string java_package = 1;\n\n\n  // Controls the name of the wrapper Java class generated for the .proto file.\n  // That class will always contain the .proto file's getDescriptor() method as\n  // well as any top-level extensions defined in the .proto file.\n  // If java_multiple_files is disabled, then all the other classes from the\n  // .proto file will be nested inside the single wrapper outer class.\n  optional string java_outer_classname = 8;\n\n  // If enabled, then the Java code generator will generate a separate .java\n  // file for each top-level message, enum, and service defined in the .proto\n  // file.  Thus, these types will *not* be nested inside the wrapper class\n  // named by java_outer_classname.  However, the wrapper class will still be\n  // generated to contain the file's getDescriptor() method as well as any\n  // top-level extensions defined in the file.\n  optional bool java_multiple_files = 10 [default = false];\n\n  // This option does nothing.\n  optional bool java_generate_equals_and_hash = 20 [deprecated=true];\n\n  // If set true, then the Java2 code generator will generate code that\n  // throws an exception whenever an attempt is made to assign a non-UTF-8\n  // byte sequence to a string field.\n  // Message reflection will do the same.\n  // However, an extension field still accepts non-UTF-8 byte sequences.\n  // This option has no effect on when used with the lite runtime.\n  optional bool java_string_check_utf8 = 27 [default = false];\n\n\n  // Generated classes can be optimized for speed or code size.\n  enum OptimizeMode {\n    SPEED = 1;         // Generate complete code for parsing, serialization,\n                       // etc.\n    CODE_SIZE = 2;     // Use ReflectionOps to implement these methods.\n    LITE_RUNTIME = 3;  // Generate code using MessageLite and the lite runtime.\n  }\n  optional OptimizeMode optimize_for = 9 [default = SPEED];\n\n  // Sets the Go package where structs generated from this .proto will be\n  // placed. If omitted, the Go package will be derived from the following:\n  //   - The basename of the package import path, if provided.\n  //   - Otherwise, the package statement in the .proto file, if present.\n  //   - Otherwise, the basename of the .proto file, without extension.\n  optional string go_package = 11;\n\n\n\n\n  // Should generic services be generated in each language?  \"Generic\" services\n  // are not specific to any particular RPC system.  They are generated by the\n  // main code generators in each language (without additional plugins).\n  // Generic services were the only kind of service generation supported by\n  // early versions of google.protobuf.\n  //\n  // Generic services are now considered deprecated in favor of using plugins\n  // that generate code specific to your particular RPC system.  Therefore,\n  // these default to false.  Old code which depends on generic services should\n  // explicitly set them to true.\n  optional bool cc_generic_services = 16 [default = false];\n  optional bool java_generic_services = 17 [default = false];\n  optional bool py_generic_services = 18 [default = false];\n  optional bool php_generic_services = 42 [default = false];\n\n  // Is this file deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for everything in the file, or it will be completely ignored; in the very\n  // least, this is a formalization for deprecating files.\n  optional bool deprecated = 23 [default = false];\n\n  // Enables the use of arenas for the proto messages in this file. This applies\n  // only to generated classes for C++.\n  optional bool cc_enable_arenas = 31 [default = true];\n\n\n  // Sets the objective c class prefix which is prepended to all objective c\n  // generated classes from this .proto. There is no default.\n  optional string objc_class_prefix = 36;\n\n  // Namespace for generated classes; defaults to the package.\n  optional string csharp_namespace = 37;\n\n  // By default Swift generators will take the proto package and CamelCase it\n  // replacing '.' with underscore and use that to prefix the types/symbols\n  // defined. When this options is provided, they will use this value instead\n  // to prefix the types/symbols defined.\n  optional string swift_prefix = 39;\n\n  // Sets the php class prefix which is prepended to all php generated classes\n  // from this .proto. Default is empty.\n  optional string php_class_prefix = 40;\n\n  // Use this option to change the namespace of php generated classes. Default\n  // is empty. When this option is empty, the package name will be used for\n  // determining the namespace.\n  optional string php_namespace = 41;\n\n  // Use this option to change the namespace of php generated metadata classes.\n  // Default is empty. When this option is empty, the proto file name will be\n  // used for determining the namespace.\n  optional string php_metadata_namespace = 44;\n\n  // Use this option to change the package of ruby generated classes. Default\n  // is empty. When this option is not set, the package name will be used for\n  // determining the ruby package.\n  optional string ruby_package = 45;\n\n\n  // The parser stores options it doesn't recognize here.\n  // See the documentation for the \"Options\" section above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message.\n  // See the documentation for the \"Options\" section above.\n  extensions 1000 to max;\n\n  reserved 38;\n}\n\nmessage MessageOptions {\n  // Set true to use the old proto1 MessageSet wire format for extensions.\n  // This is provided for backwards-compatibility with the MessageSet wire\n  // format.  You should not use this for any other reason:  It's less\n  // efficient, has fewer features, and is more complicated.\n  //\n  // The message must be defined exactly as follows:\n  //   message Foo {\n  //     option message_set_wire_format = true;\n  //     extensions 4 to max;\n  //   }\n  // Note that the message cannot have any defined fields; MessageSets only\n  // have extensions.\n  //\n  // All extensions of your type must be singular messages; e.g. they cannot\n  // be int32s, enums, or repeated messages.\n  //\n  // Because this is an option, the above two restrictions are not enforced by\n  // the protocol compiler.\n  optional bool message_set_wire_format = 1 [default = false];\n\n  // Disables the generation of the standard \"descriptor()\" accessor, which can\n  // conflict with a field of the same name.  This is meant to make migration\n  // from proto1 easier; new code should avoid fields named \"descriptor\".\n  optional bool no_standard_descriptor_accessor = 2 [default = false];\n\n  // Is this message deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for the message, or it will be completely ignored; in the very least,\n  // this is a formalization for deprecating messages.\n  optional bool deprecated = 3 [default = false];\n\n  reserved 4, 5, 6;\n\n  // Whether the message is an automatically generated map entry type for the\n  // maps field.\n  //\n  // For maps fields:\n  //     map<KeyType, ValueType> map_field = 1;\n  // The parsed descriptor looks like:\n  //     message MapFieldEntry {\n  //         option map_entry = true;\n  //         optional KeyType key = 1;\n  //         optional ValueType value = 2;\n  //     }\n  //     repeated MapFieldEntry map_field = 1;\n  //\n  // Implementations may choose not to generate the map_entry=true message, but\n  // use a native map in the target language to hold the keys and values.\n  // The reflection APIs in such implementations still need to work as\n  // if the field is a repeated message field.\n  //\n  // NOTE: Do not set the option in .proto files. Always use the maps syntax\n  // instead. The option should only be implicitly set by the proto compiler\n  // parser.\n  optional bool map_entry = 7;\n\n  reserved 8;  // javalite_serializable\n  reserved 9;  // javanano_as_lite\n\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\nmessage FieldOptions {\n  // The ctype option instructs the C++ code generator to use a different\n  // representation of the field than it normally would.  See the specific\n  // options below.  This option is not yet implemented in the open source\n  // release -- sorry, we'll try to include it in a future version!\n  optional CType ctype = 1 [default = STRING];\n  enum CType {\n    // Default mode.\n    STRING = 0;\n\n    CORD = 1;\n\n    STRING_PIECE = 2;\n  }\n  // The packed option can be enabled for repeated primitive fields to enable\n  // a more efficient representation on the wire. Rather than repeatedly\n  // writing the tag and type for each element, the entire array is encoded as\n  // a single length-delimited blob. In proto3, only explicit setting it to\n  // false will avoid using packed encoding.\n  optional bool packed = 2;\n\n  // The jstype option determines the JavaScript type used for values of the\n  // field.  The option is permitted only for 64 bit integral and fixed types\n  // (int64, uint64, sint64, fixed64, sfixed64).  A field with jstype JS_STRING\n  // is represented as JavaScript string, which avoids loss of precision that\n  // can happen when a large value is converted to a floating point JavaScript.\n  // Specifying JS_NUMBER for the jstype causes the generated JavaScript code to\n  // use the JavaScript \"number\" type.  The behavior of the default option\n  // JS_NORMAL is implementation dependent.\n  //\n  // This option is an enum to permit additional types to be added, e.g.\n  // goog.math.Integer.\n  optional JSType jstype = 6 [default = JS_NORMAL];\n  enum JSType {\n    // Use the default type.\n    JS_NORMAL = 0;\n\n    // Use JavaScript strings.\n    JS_STRING = 1;\n\n    // Use JavaScript numbers.\n    JS_NUMBER = 2;\n  }\n\n  // Should this field be parsed lazily?  Lazy applies only to message-type\n  // fields.  It means that when the outer message is initially parsed, the\n  // inner message's contents will not be parsed but instead stored in encoded\n  // form.  The inner message will actually be parsed when it is first accessed.\n  //\n  // This is only a hint.  Implementations are free to choose whether to use\n  // eager or lazy parsing regardless of the value of this option.  However,\n  // setting this option true suggests that the protocol author believes that\n  // using lazy parsing on this field is worth the additional bookkeeping\n  // overhead typically needed to implement it.\n  //\n  // This option does not affect the public interface of any generated code;\n  // all method signatures remain the same.  Furthermore, thread-safety of the\n  // interface is not affected by this option; const methods remain safe to\n  // call from multiple threads concurrently, while non-const methods continue\n  // to require exclusive access.\n  //\n  //\n  // Note that implementations may choose not to check required fields within\n  // a lazy sub-message.  That is, calling IsInitialized() on the outer message\n  // may return true even if the inner message has missing required fields.\n  // This is necessary because otherwise the inner message would have to be\n  // parsed in order to perform the check, defeating the purpose of lazy\n  // parsing.  An implementation which chooses not to check required fields\n  // must be consistent about it.  That is, for any particular sub-message, the\n  // implementation must either *always* check its required fields, or *never*\n  // check its required fields, regardless of whether or not the message has\n  // been parsed.\n  //\n  // As of 2021, lazy does no correctness checks on the byte stream during\n  // parsing.  This may lead to crashes if and when an invalid byte stream is\n  // finally parsed upon access.\n  //\n  // TODO(b/211906113):  Enable validation on lazy fields.\n  optional bool lazy = 5 [default = false];\n\n  // unverified_lazy does no correctness checks on the byte stream. This should\n  // only be used where lazy with verification is prohibitive for performance\n  // reasons.\n  optional bool unverified_lazy = 15 [default = false];\n\n  // Is this field deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for accessors, or it will be completely ignored; in the very least, this\n  // is a formalization for deprecating fields.\n  optional bool deprecated = 3 [default = false];\n\n  // For Google-internal migration only. Do not use.\n  optional bool weak = 10 [default = false];\n\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n\n  reserved 4;  // removed jtype\n}\n\nmessage OneofOptions {\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\nmessage EnumOptions {\n\n  // Set this option to true to allow mapping different tag names to the same\n  // value.\n  optional bool allow_alias = 2;\n\n  // Is this enum deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for the enum, or it will be completely ignored; in the very least, this\n  // is a formalization for deprecating enums.\n  optional bool deprecated = 3 [default = false];\n\n  reserved 5;  // javanano_as_lite\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\nmessage EnumValueOptions {\n  // Is this enum value deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for the enum value, or it will be completely ignored; in the very least,\n  // this is a formalization for deprecating enum values.\n  optional bool deprecated = 1 [default = false];\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\nmessage ServiceOptions {\n\n  // Note:  Field numbers 1 through 32 are reserved for Google's internal RPC\n  //   framework.  We apologize for hoarding these numbers to ourselves, but\n  //   we were already using them long before we decided to release Protocol\n  //   Buffers.\n\n  // Is this service deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for the service, or it will be completely ignored; in the very least,\n  // this is a formalization for deprecating services.\n  optional bool deprecated = 33 [default = false];\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\nmessage MethodOptions {\n\n  // Note:  Field numbers 1 through 32 are reserved for Google's internal RPC\n  //   framework.  We apologize for hoarding these numbers to ourselves, but\n  //   we were already using them long before we decided to release Protocol\n  //   Buffers.\n\n  // Is this method deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for the method, or it will be completely ignored; in the very least,\n  // this is a formalization for deprecating methods.\n  optional bool deprecated = 33 [default = false];\n\n  // Is this method side-effect-free (or safe in HTTP parlance), or idempotent,\n  // or neither? HTTP based RPC implementation may choose GET verb for safe\n  // methods, and PUT verb for idempotent methods instead of the default POST.\n  enum IdempotencyLevel {\n    IDEMPOTENCY_UNKNOWN = 0;\n    NO_SIDE_EFFECTS = 1;  // implies idempotent\n    IDEMPOTENT = 2;       // idempotent, but may have side effects\n  }\n  optional IdempotencyLevel idempotency_level = 34\n      [default = IDEMPOTENCY_UNKNOWN];\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\n\n// A message representing a option the parser does not recognize. This only\n// appears in options protos created by the compiler::Parser class.\n// DescriptorPool resolves these when building Descriptor objects. Therefore,\n// options protos in descriptor objects (e.g. returned by Descriptor::options(),\n// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions\n// in them.\nmessage UninterpretedOption {\n  // The name of the uninterpreted option.  Each string represents a segment in\n  // a dot-separated name.  is_extension is true iff a segment represents an\n  // extension (denoted with parentheses in options specs in .proto files).\n  // E.g.,{ [\"foo\", false], [\"bar.baz\", true], [\"qux\", false] } represents\n  // \"foo.(bar.baz).qux\".\n  message NamePart {\n    required string name_part = 1;\n    required bool is_extension = 2;\n  }\n  repeated NamePart name = 2;\n\n  // The value of the uninterpreted option, in whatever type the tokenizer\n  // identified it as during parsing. Exactly one of these should be set.\n  optional string identifier_value = 3;\n  optional uint64 positive_int_value = 4;\n  optional int64 negative_int_value = 5;\n  optional double double_value = 6;\n  optional bytes string_value = 7;\n  optional string aggregate_value = 8;\n}\n\n// ===================================================================\n// Optional source code info\n\n// Encapsulates information about the original source file from which a\n// FileDescriptorProto was generated.\nmessage SourceCodeInfo {\n  // A Location identifies a piece of source code in a .proto file which\n  // corresponds to a particular definition.  This information is intended\n  // to be useful to IDEs, code indexers, documentation generators, and similar\n  // tools.\n  //\n  // For example, say we have a file like:\n  //   message Foo {\n  //     optional string foo = 1;\n  //   }\n  // Let's look at just the field definition:\n  //   optional string foo = 1;\n  //   ^       ^^     ^^  ^  ^^^\n  //   a       bc     de  f  ghi\n  // We have the following locations:\n  //   span   path               represents\n  //   [a,i)  [ 4, 0, 2, 0 ]     The whole field definition.\n  //   [a,b)  [ 4, 0, 2, 0, 4 ]  The label (optional).\n  //   [c,d)  [ 4, 0, 2, 0, 5 ]  The type (string).\n  //   [e,f)  [ 4, 0, 2, 0, 1 ]  The name (foo).\n  //   [g,h)  [ 4, 0, 2, 0, 3 ]  The number (1).\n  //\n  // Notes:\n  // - A location may refer to a repeated field itself (i.e. not to any\n  //   particular index within it).  This is used whenever a set of elements are\n  //   logically enclosed in a single code segment.  For example, an entire\n  //   extend block (possibly containing multiple extension definitions) will\n  //   have an outer location whose path refers to the \"extensions\" repeated\n  //   field without an index.\n  // - Multiple locations may have the same path.  This happens when a single\n  //   logical declaration is spread out across multiple places.  The most\n  //   obvious example is the \"extend\" block again -- there may be multiple\n  //   extend blocks in the same scope, each of which will have the same path.\n  // - A location's span is not always a subset of its parent's span.  For\n  //   example, the \"extendee\" of an extension declaration appears at the\n  //   beginning of the \"extend\" block and is shared by all extensions within\n  //   the block.\n  // - Just because a location's span is a subset of some other location's span\n  //   does not mean that it is a descendant.  For example, a \"group\" defines\n  //   both a type and a field in a single declaration.  Thus, the locations\n  //   corresponding to the type and field and their components will overlap.\n  // - Code which tries to interpret locations should probably be designed to\n  //   ignore those that it doesn't understand, as more types of locations could\n  //   be recorded in the future.\n  repeated Location location = 1;\n  message Location {\n    // Identifies which part of the FileDescriptorProto was defined at this\n    // location.\n    //\n    // Each element is a field number or an index.  They form a path from\n    // the root FileDescriptorProto to the place where the definition occurs.\n    // For example, this path:\n    //   [ 4, 3, 2, 7, 1 ]\n    // refers to:\n    //   file.message_type(3)  // 4, 3\n    //       .field(7)         // 2, 7\n    //       .name()           // 1\n    // This is because FileDescriptorProto.message_type has field number 4:\n    //   repeated DescriptorProto message_type = 4;\n    // and DescriptorProto.field has field number 2:\n    //   repeated FieldDescriptorProto field = 2;\n    // and FieldDescriptorProto.name has field number 1:\n    //   optional string name = 1;\n    //\n    // Thus, the above path gives the location of a field name.  If we removed\n    // the last element:\n    //   [ 4, 3, 2, 7 ]\n    // this path refers to the whole field declaration (from the beginning\n    // of the label to the terminating semicolon).\n    repeated int32 path = 1 [packed = true];\n\n    // Always has exactly three or four elements: start line, start column,\n    // end line (optional, otherwise assumed same as start line), end column.\n    // These are packed into a single field for efficiency.  Note that line\n    // and column numbers are zero-based -- typically you will want to add\n    // 1 to each before displaying to a user.\n    repeated int32 span = 2 [packed = true];\n\n    // If this SourceCodeInfo represents a complete declaration, these are any\n    // comments appearing before and after the declaration which appear to be\n    // attached to the declaration.\n    //\n    // A series of line comments appearing on consecutive lines, with no other\n    // tokens appearing on those lines, will be treated as a single comment.\n    //\n    // leading_detached_comments will keep paragraphs of comments that appear\n    // before (but not connected to) the current element. Each paragraph,\n    // separated by empty lines, will be one comment element in the repeated\n    // field.\n    //\n    // Only the comment content is provided; comment markers (e.g. //) are\n    // stripped out.  For block comments, leading whitespace and an asterisk\n    // will be stripped from the beginning of each line other than the first.\n    // Newlines are included in the output.\n    //\n    // Examples:\n    //\n    //   optional int32 foo = 1;  // Comment attached to foo.\n    //   // Comment attached to bar.\n    //   optional int32 bar = 2;\n    //\n    //   optional string baz = 3;\n    //   // Comment attached to baz.\n    //   // Another line attached to baz.\n    //\n    //   // Comment attached to qux.\n    //   //\n    //   // Another line attached to qux.\n    //   optional double qux = 4;\n    //\n    //   // Detached comment for corge. This is not leading or trailing comments\n    //   // to qux or corge because there are blank lines separating it from\n    //   // both.\n    //\n    //   // Detached comment for corge paragraph 2.\n    //\n    //   optional string corge = 5;\n    //   /* Block comment attached\n    //    * to corge.  Leading asterisks\n    //    * will be removed. */\n    //   /* Block comment attached to\n    //    * grault. */\n    //   optional int32 grault = 6;\n    //\n    //   // ignored detached comments.\n    optional string leading_comments = 3;\n    optional string trailing_comments = 4;\n    repeated string leading_detached_comments = 6;\n  }\n}\n\n// Describes the relationship between generated code and its original source\n// file. A GeneratedCodeInfo message is associated with only one generated\n// source file, but may contain references to different source .proto files.\nmessage GeneratedCodeInfo {\n  // An Annotation connects some span of text in generated code to an element\n  // of its generating .proto file.\n  repeated Annotation annotation = 1;\n  message Annotation {\n    // Identifies the element in the original source .proto file. This field\n    // is formatted the same as SourceCodeInfo.Location.path.\n    repeated int32 path = 1 [packed = true];\n\n    // Identifies the filesystem path to the original source .proto.\n    optional string source_file = 2;\n\n    // Identifies the starting offset in bytes in the generated code\n    // that relates to the identified object.\n    optional int32 begin = 3;\n\n    // Identifies the ending offset in bytes in the generated code that\n    // relates to the identified offset. The end offset should be one past\n    // the last relevant byte (so the length of the text = end - begin).\n    optional int32 end = 4;\n  }\n}\n"
  },
  {
    "path": "service/order/third_party/google/protobuf/duration.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption cc_enable_arenas = true;\noption go_package = \"google.golang.org/protobuf/types/known/durationpb\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"DurationProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\n\n// A Duration represents a signed, fixed-length span of time represented\n// as a count of seconds and fractions of seconds at nanosecond\n// resolution. It is independent of any calendar and concepts like \"day\"\n// or \"month\". It is related to Timestamp in that the difference between\n// two Timestamp values is a Duration and it can be added or subtracted\n// from a Timestamp. Range is approximately +-10,000 years.\n//\n// # Examples\n//\n// Example 1: Compute Duration from two Timestamps in pseudo code.\n//\n//     Timestamp start = ...;\n//     Timestamp end = ...;\n//     Duration duration = ...;\n//\n//     duration.seconds = end.seconds - start.seconds;\n//     duration.nanos = end.nanos - start.nanos;\n//\n//     if (duration.seconds < 0 && duration.nanos > 0) {\n//       duration.seconds += 1;\n//       duration.nanos -= 1000000000;\n//     } else if (duration.seconds > 0 && duration.nanos < 0) {\n//       duration.seconds -= 1;\n//       duration.nanos += 1000000000;\n//     }\n//\n// Example 2: Compute Timestamp from Timestamp + Duration in pseudo code.\n//\n//     Timestamp start = ...;\n//     Duration duration = ...;\n//     Timestamp end = ...;\n//\n//     end.seconds = start.seconds + duration.seconds;\n//     end.nanos = start.nanos + duration.nanos;\n//\n//     if (end.nanos < 0) {\n//       end.seconds -= 1;\n//       end.nanos += 1000000000;\n//     } else if (end.nanos >= 1000000000) {\n//       end.seconds += 1;\n//       end.nanos -= 1000000000;\n//     }\n//\n// Example 3: Compute Duration from datetime.timedelta in Python.\n//\n//     td = datetime.timedelta(days=3, minutes=10)\n//     duration = Duration()\n//     duration.FromTimedelta(td)\n//\n// # JSON Mapping\n//\n// In JSON format, the Duration type is encoded as a string rather than an\n// object, where the string ends in the suffix \"s\" (indicating seconds) and\n// is preceded by the number of seconds, with nanoseconds expressed as\n// fractional seconds. For example, 3 seconds with 0 nanoseconds should be\n// encoded in JSON format as \"3s\", while 3 seconds and 1 nanosecond should\n// be expressed in JSON format as \"3.000000001s\", and 3 seconds and 1\n// microsecond should be expressed in JSON format as \"3.000001s\".\n//\n//\nmessage Duration {\n  // Signed seconds of the span of time. Must be from -315,576,000,000\n  // to +315,576,000,000 inclusive. Note: these bounds are computed from:\n  // 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years\n  int64 seconds = 1;\n\n  // Signed fractions of a second at nanosecond resolution of the span\n  // of time. Durations less than one second are represented with a 0\n  // `seconds` field and a positive or negative `nanos` field. For durations\n  // of one second or more, a non-zero value for the `nanos` field must be\n  // of the same sign as the `seconds` field. Must be from -999,999,999\n  // to +999,999,999 inclusive.\n  int32 nanos = 2;\n}\n"
  },
  {
    "path": "service/order/third_party/google/protobuf/empty.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption go_package = \"google.golang.org/protobuf/types/known/emptypb\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"EmptyProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\noption cc_enable_arenas = true;\n\n// A generic empty message that you can re-use to avoid defining duplicated\n// empty messages in your APIs. A typical example is to use it as the request\n// or the response type of an API method. For instance:\n//\n//     service Foo {\n//       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n//     }\n//\n// The JSON representation for `Empty` is empty JSON object `{}`.\nmessage Empty {}\n"
  },
  {
    "path": "service/order/third_party/google/protobuf/field_mask.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"FieldMaskProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\noption go_package = \"google.golang.org/protobuf/types/known/fieldmaskpb\";\noption cc_enable_arenas = true;\n\n// `FieldMask` represents a set of symbolic field paths, for example:\n//\n//     paths: \"f.a\"\n//     paths: \"f.b.d\"\n//\n// Here `f` represents a field in some root message, `a` and `b`\n// fields in the message found in `f`, and `d` a field found in the\n// message in `f.b`.\n//\n// Field masks are used to specify a subset of fields that should be\n// returned by a get operation or modified by an update operation.\n// Field masks also have a custom JSON encoding (see below).\n//\n// # Field Masks in Projections\n//\n// When used in the context of a projection, a response message or\n// sub-message is filtered by the API to only contain those fields as\n// specified in the mask. For example, if the mask in the previous\n// example is applied to a response message as follows:\n//\n//     f {\n//       a : 22\n//       b {\n//         d : 1\n//         x : 2\n//       }\n//       y : 13\n//     }\n//     z: 8\n//\n// The result will not contain specific values for fields x,y and z\n// (their value will be set to the default, and omitted in proto text\n// output):\n//\n//\n//     f {\n//       a : 22\n//       b {\n//         d : 1\n//       }\n//     }\n//\n// A repeated field is not allowed except at the last position of a\n// paths string.\n//\n// If a FieldMask object is not present in a get operation, the\n// operation applies to all fields (as if a FieldMask of all fields\n// had been specified).\n//\n// Note that a field mask does not necessarily apply to the\n// top-level response message. In case of a REST get operation, the\n// field mask applies directly to the response, but in case of a REST\n// list operation, the mask instead applies to each individual message\n// in the returned resource list. In case of a REST custom method,\n// other definitions may be used. Where the mask applies will be\n// clearly documented together with its declaration in the API.  In\n// any case, the effect on the returned resource/resources is required\n// behavior for APIs.\n//\n// # Field Masks in Update Operations\n//\n// A field mask in update operations specifies which fields of the\n// targeted resource are going to be updated. The API is required\n// to only change the values of the fields as specified in the mask\n// and leave the others untouched. If a resource is passed in to\n// describe the updated values, the API ignores the values of all\n// fields not covered by the mask.\n//\n// If a repeated field is specified for an update operation, new values will\n// be appended to the existing repeated field in the target resource. Note that\n// a repeated field is only allowed in the last position of a `paths` string.\n//\n// If a sub-message is specified in the last position of the field mask for an\n// update operation, then new value will be merged into the existing sub-message\n// in the target resource.\n//\n// For example, given the target message:\n//\n//     f {\n//       b {\n//         d: 1\n//         x: 2\n//       }\n//       c: [1]\n//     }\n//\n// And an update message:\n//\n//     f {\n//       b {\n//         d: 10\n//       }\n//       c: [2]\n//     }\n//\n// then if the field mask is:\n//\n//  paths: [\"f.b\", \"f.c\"]\n//\n// then the result will be:\n//\n//     f {\n//       b {\n//         d: 10\n//         x: 2\n//       }\n//       c: [1, 2]\n//     }\n//\n// An implementation may provide options to override this default behavior for\n// repeated and message fields.\n//\n// In order to reset a field's value to the default, the field must\n// be in the mask and set to the default value in the provided resource.\n// Hence, in order to reset all fields of a resource, provide a default\n// instance of the resource and set all fields in the mask, or do\n// not provide a mask as described below.\n//\n// If a field mask is not present on update, the operation applies to\n// all fields (as if a field mask of all fields has been specified).\n// Note that in the presence of schema evolution, this may mean that\n// fields the client does not know and has therefore not filled into\n// the request will be reset to their default. If this is unwanted\n// behavior, a specific service may require a client to always specify\n// a field mask, producing an error if not.\n//\n// As with get operations, the location of the resource which\n// describes the updated values in the request message depends on the\n// operation kind. In any case, the effect of the field mask is\n// required to be honored by the API.\n//\n// ## Considerations for HTTP REST\n//\n// The HTTP kind of an update operation which uses a field mask must\n// be set to PATCH instead of PUT in order to satisfy HTTP semantics\n// (PUT must only be used for full updates).\n//\n// # JSON Encoding of Field Masks\n//\n// In JSON, a field mask is encoded as a single string where paths are\n// separated by a comma. Fields name in each path are converted\n// to/from lower-camel naming conventions.\n//\n// As an example, consider the following message declarations:\n//\n//     message Profile {\n//       User user = 1;\n//       Photo photo = 2;\n//     }\n//     message User {\n//       string display_name = 1;\n//       string address = 2;\n//     }\n//\n// In proto a field mask for `Profile` may look as such:\n//\n//     mask {\n//       paths: \"user.display_name\"\n//       paths: \"photo\"\n//     }\n//\n// In JSON, the same mask is represented as below:\n//\n//     {\n//       mask: \"user.displayName,photo\"\n//     }\n//\n// # Field Masks and Oneof Fields\n//\n// Field masks treat fields in oneofs just as regular fields. Consider the\n// following message:\n//\n//     message SampleMessage {\n//       oneof test_oneof {\n//         string name = 4;\n//         SubMessage sub_message = 9;\n//       }\n//     }\n//\n// The field mask can be:\n//\n//     mask {\n//       paths: \"name\"\n//     }\n//\n// Or:\n//\n//     mask {\n//       paths: \"sub_message\"\n//     }\n//\n// Note that oneof type names (\"test_oneof\" in this case) cannot be used in\n// paths.\n//\n// ## Field Mask Verification\n//\n// The implementation of any API method which has a FieldMask type field in the\n// request should verify the included field paths, and return an\n// `INVALID_ARGUMENT` error if any path is unmappable.\nmessage FieldMask {\n  // The set of field mask paths.\n  repeated string paths = 1;\n}\n"
  },
  {
    "path": "service/order/third_party/google/protobuf/source_context.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"SourceContextProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\noption go_package = \"google.golang.org/protobuf/types/known/sourcecontextpb\";\n\n// `SourceContext` represents information about the source of a\n// protobuf element, like the file in which it is defined.\nmessage SourceContext {\n  // The path-qualified name of the .proto file that contained the associated\n  // protobuf element.  For example: `\"google/protobuf/source_context.proto\"`.\n  string file_name = 1;\n}\n"
  },
  {
    "path": "service/order/third_party/google/protobuf/struct.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption cc_enable_arenas = true;\noption go_package = \"google.golang.org/protobuf/types/known/structpb\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"StructProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\n\n// `Struct` represents a structured data value, consisting of fields\n// which map to dynamically typed values. In some languages, `Struct`\n// might be supported by a native representation. For example, in\n// scripting languages like JS a struct is represented as an\n// object. The details of that representation are described together\n// with the proto support for the language.\n//\n// The JSON representation for `Struct` is JSON object.\nmessage Struct {\n  // Unordered map of dynamically typed values.\n  map<string, Value> fields = 1;\n}\n\n// `Value` represents a dynamically typed value which can be either\n// null, a number, a string, a boolean, a recursive struct value, or a\n// list of values. A producer of value is expected to set one of these\n// variants. Absence of any variant indicates an error.\n//\n// The JSON representation for `Value` is JSON value.\nmessage Value {\n  // The kind of value.\n  oneof kind {\n    // Represents a null value.\n    NullValue null_value = 1;\n    // Represents a double value.\n    double number_value = 2;\n    // Represents a string value.\n    string string_value = 3;\n    // Represents a boolean value.\n    bool bool_value = 4;\n    // Represents a structured value.\n    Struct struct_value = 5;\n    // Represents a repeated `Value`.\n    ListValue list_value = 6;\n  }\n}\n\n// `NullValue` is a singleton enumeration to represent the null value for the\n// `Value` type union.\n//\n//  The JSON representation for `NullValue` is JSON `null`.\nenum NullValue {\n  // Null value.\n  NULL_VALUE = 0;\n}\n\n// `ListValue` is a wrapper around a repeated field of values.\n//\n// The JSON representation for `ListValue` is JSON array.\nmessage ListValue {\n  // Repeated field of dynamically typed values.\n  repeated Value values = 1;\n}\n"
  },
  {
    "path": "service/order/third_party/google/protobuf/timestamp.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption cc_enable_arenas = true;\noption go_package = \"google.golang.org/protobuf/types/known/timestamppb\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"TimestampProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\n\n// A Timestamp represents a point in time independent of any time zone or local\n// calendar, encoded as a count of seconds and fractions of seconds at\n// nanosecond resolution. The count is relative to an epoch at UTC midnight on\n// January 1, 1970, in the proleptic Gregorian calendar which extends the\n// Gregorian calendar backwards to year one.\n//\n// All minutes are 60 seconds long. Leap seconds are \"smeared\" so that no leap\n// second table is needed for interpretation, using a [24-hour linear\n// smear](https://developers.google.com/time/smear).\n//\n// The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By\n// restricting to that range, we ensure that we can convert to and from [RFC\n// 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.\n//\n// # Examples\n//\n// Example 1: Compute Timestamp from POSIX `time()`.\n//\n//     Timestamp timestamp;\n//     timestamp.set_seconds(time(NULL));\n//     timestamp.set_nanos(0);\n//\n// Example 2: Compute Timestamp from POSIX `gettimeofday()`.\n//\n//     struct timeval tv;\n//     gettimeofday(&tv, NULL);\n//\n//     Timestamp timestamp;\n//     timestamp.set_seconds(tv.tv_sec);\n//     timestamp.set_nanos(tv.tv_usec * 1000);\n//\n// Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`.\n//\n//     FILETIME ft;\n//     GetSystemTimeAsFileTime(&ft);\n//     UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime;\n//\n//     // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z\n//     // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.\n//     Timestamp timestamp;\n//     timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));\n//     timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));\n//\n// Example 4: Compute Timestamp from Java `System.currentTimeMillis()`.\n//\n//     long millis = System.currentTimeMillis();\n//\n//     Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)\n//         .setNanos((int) ((millis % 1000) * 1000000)).build();\n//\n//\n// Example 5: Compute Timestamp from Java `Instant.now()`.\n//\n//     Instant now = Instant.now();\n//\n//     Timestamp timestamp =\n//         Timestamp.newBuilder().setSeconds(now.getEpochSecond())\n//             .setNanos(now.getNano()).build();\n//\n//\n// Example 6: Compute Timestamp from current time in Python.\n//\n//     timestamp = Timestamp()\n//     timestamp.GetCurrentTime()\n//\n// # JSON Mapping\n//\n// In JSON format, the Timestamp type is encoded as a string in the\n// [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the\n// format is \"{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z\"\n// where {year} is always expressed using four digits while {month}, {day},\n// {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional\n// seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution),\n// are optional. The \"Z\" suffix indicates the timezone (\"UTC\"); the timezone\n// is required. A proto3 JSON serializer should always use UTC (as indicated by\n// \"Z\") when printing the Timestamp type and a proto3 JSON parser should be\n// able to accept both UTC and other timezones (as indicated by an offset).\n//\n// For example, \"2017-01-15T01:30:15.01Z\" encodes 15.01 seconds past\n// 01:30 UTC on January 15, 2017.\n//\n// In JavaScript, one can convert a Date object to this format using the\n// standard\n// [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString)\n// method. In Python, a standard `datetime.datetime` object can be converted\n// to this format using\n// [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with\n// the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use\n// the Joda Time's [`ISODateTimeFormat.dateTime()`](\n// http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime%2D%2D\n// ) to obtain a formatter capable of generating timestamps in this format.\n//\n//\nmessage Timestamp {\n  // Represents seconds of UTC time since Unix epoch\n  // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to\n  // 9999-12-31T23:59:59Z inclusive.\n  int64 seconds = 1;\n\n  // Non-negative fractions of a second at nanosecond resolution. Negative\n  // second values with fractions must still have non-negative nanos values\n  // that count forward in time. Must be from 0 to 999,999,999\n  // inclusive.\n  int32 nanos = 2;\n}\n"
  },
  {
    "path": "service/order/third_party/google/protobuf/type.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\nimport \"google/protobuf/any.proto\";\nimport \"google/protobuf/source_context.proto\";\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption cc_enable_arenas = true;\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"TypeProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\noption go_package = \"google.golang.org/protobuf/types/known/typepb\";\n\n// A protocol buffer message type.\nmessage Type {\n  // The fully qualified message name.\n  string name = 1;\n  // The list of fields.\n  repeated Field fields = 2;\n  // The list of types appearing in `oneof` definitions in this type.\n  repeated string oneofs = 3;\n  // The protocol buffer options.\n  repeated Option options = 4;\n  // The source context.\n  SourceContext source_context = 5;\n  // The source syntax.\n  Syntax syntax = 6;\n}\n\n// A single field of a message type.\nmessage Field {\n  // Basic field types.\n  enum Kind {\n    // Field type unknown.\n    TYPE_UNKNOWN = 0;\n    // Field type double.\n    TYPE_DOUBLE = 1;\n    // Field type float.\n    TYPE_FLOAT = 2;\n    // Field type int64.\n    TYPE_INT64 = 3;\n    // Field type uint64.\n    TYPE_UINT64 = 4;\n    // Field type int32.\n    TYPE_INT32 = 5;\n    // Field type fixed64.\n    TYPE_FIXED64 = 6;\n    // Field type fixed32.\n    TYPE_FIXED32 = 7;\n    // Field type bool.\n    TYPE_BOOL = 8;\n    // Field type string.\n    TYPE_STRING = 9;\n    // Field type group. Proto2 syntax only, and deprecated.\n    TYPE_GROUP = 10;\n    // Field type message.\n    TYPE_MESSAGE = 11;\n    // Field type bytes.\n    TYPE_BYTES = 12;\n    // Field type uint32.\n    TYPE_UINT32 = 13;\n    // Field type enum.\n    TYPE_ENUM = 14;\n    // Field type sfixed32.\n    TYPE_SFIXED32 = 15;\n    // Field type sfixed64.\n    TYPE_SFIXED64 = 16;\n    // Field type sint32.\n    TYPE_SINT32 = 17;\n    // Field type sint64.\n    TYPE_SINT64 = 18;\n  }\n\n  // Whether a field is optional, required, or repeated.\n  enum Cardinality {\n    // For fields with unknown cardinality.\n    CARDINALITY_UNKNOWN = 0;\n    // For optional fields.\n    CARDINALITY_OPTIONAL = 1;\n    // For required fields. Proto2 syntax only.\n    CARDINALITY_REQUIRED = 2;\n    // For repeated fields.\n    CARDINALITY_REPEATED = 3;\n  }\n\n  // The field type.\n  Kind kind = 1;\n  // The field cardinality.\n  Cardinality cardinality = 2;\n  // The field number.\n  int32 number = 3;\n  // The field name.\n  string name = 4;\n  // The field type URL, without the scheme, for message or enumeration\n  // types. Example: `\"type.googleapis.com/google.protobuf.Timestamp\"`.\n  string type_url = 6;\n  // The index of the field type in `Type.oneofs`, for message or enumeration\n  // types. The first type has index 1; zero means the type is not in the list.\n  int32 oneof_index = 7;\n  // Whether to use alternative packed wire representation.\n  bool packed = 8;\n  // The protocol buffer options.\n  repeated Option options = 9;\n  // The field JSON name.\n  string json_name = 10;\n  // The string value of the default value of this field. Proto2 syntax only.\n  string default_value = 11;\n}\n\n// Enum type definition.\nmessage Enum {\n  // Enum type name.\n  string name = 1;\n  // Enum value definitions.\n  repeated EnumValue enumvalue = 2;\n  // Protocol buffer options.\n  repeated Option options = 3;\n  // The source context.\n  SourceContext source_context = 4;\n  // The source syntax.\n  Syntax syntax = 5;\n}\n\n// Enum value definition.\nmessage EnumValue {\n  // Enum value name.\n  string name = 1;\n  // Enum value number.\n  int32 number = 2;\n  // Protocol buffer options.\n  repeated Option options = 3;\n}\n\n// A protocol buffer option, which can be attached to a message, field,\n// enumeration, etc.\nmessage Option {\n  // The option's name. For protobuf built-in options (options defined in\n  // descriptor.proto), this is the short name. For example, `\"map_entry\"`.\n  // For custom options, it should be the fully-qualified name. For example,\n  // `\"google.api.http\"`.\n  string name = 1;\n  // The option's value packed in an Any message. If the value is a primitive,\n  // the corresponding wrapper type defined in google/protobuf/wrappers.proto\n  // should be used. If the value is an enum, it should be stored as an int32\n  // value using the google.protobuf.Int32Value type.\n  Any value = 2;\n}\n\n// The syntax in which a protocol buffer element is defined.\nenum Syntax {\n  // Syntax `proto2`.\n  SYNTAX_PROTO2 = 0;\n  // Syntax `proto3`.\n  SYNTAX_PROTO3 = 1;\n}\n"
  },
  {
    "path": "service/order/third_party/google/protobuf/wrappers.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Wrappers for primitive (non-message) types. These types are useful\n// for embedding primitives in the `google.protobuf.Any` type and for places\n// where we need to distinguish between the absence of a primitive\n// typed field and its default value.\n//\n// These wrappers have no meaningful use within repeated fields as they lack\n// the ability to detect presence on individual elements.\n// These wrappers have no meaningful use within a map or a oneof since\n// individual entries of a map or fields of a oneof can already detect presence.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption cc_enable_arenas = true;\noption go_package = \"google.golang.org/protobuf/types/known/wrapperspb\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"WrappersProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\n\n// Wrapper message for `double`.\n//\n// The JSON representation for `DoubleValue` is JSON number.\nmessage DoubleValue {\n  // The double value.\n  double value = 1;\n}\n\n// Wrapper message for `float`.\n//\n// The JSON representation for `FloatValue` is JSON number.\nmessage FloatValue {\n  // The float value.\n  float value = 1;\n}\n\n// Wrapper message for `int64`.\n//\n// The JSON representation for `Int64Value` is JSON string.\nmessage Int64Value {\n  // The int64 value.\n  int64 value = 1;\n}\n\n// Wrapper message for `uint64`.\n//\n// The JSON representation for `UInt64Value` is JSON string.\nmessage UInt64Value {\n  // The uint64 value.\n  uint64 value = 1;\n}\n\n// Wrapper message for `int32`.\n//\n// The JSON representation for `Int32Value` is JSON number.\nmessage Int32Value {\n  // The int32 value.\n  int32 value = 1;\n}\n\n// Wrapper message for `uint32`.\n//\n// The JSON representation for `UInt32Value` is JSON number.\nmessage UInt32Value {\n  // The uint32 value.\n  uint32 value = 1;\n}\n\n// Wrapper message for `bool`.\n//\n// The JSON representation for `BoolValue` is JSON `true` and `false`.\nmessage BoolValue {\n  // The bool value.\n  bool value = 1;\n}\n\n// Wrapper message for `string`.\n//\n// The JSON representation for `StringValue` is JSON string.\nmessage StringValue {\n  // The string value.\n  string value = 1;\n}\n\n// Wrapper message for `bytes`.\n//\n// The JSON representation for `BytesValue` is JSON string.\nmessage BytesValue {\n  // The bytes value.\n  bytes value = 1;\n}\n"
  },
  {
    "path": "service/order/third_party/openapi/v3/annotations.proto",
    "content": "// Copyright 2022 Google LLC. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//    http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\npackage openapi.v3;\n\nimport \"openapiv3/OpenAPIv3.proto\";\nimport \"google/protobuf/descriptor.proto\";\n\n// This option lets the proto compiler generate Java code inside the package\n// name (see below) instead of inside an outer class. It creates a simpler\n// developer experience by reducing one-level of name nesting and be\n// consistent with most programming languages that don't support outer classes.\noption java_multiple_files = true;\n\n// The Java outer classname should be the filename in UpperCamelCase. This\n// class is only used to hold proto descriptor, so developers don't need to\n// work with it directly.\noption java_outer_classname = \"AnnotationsProto\";\n\n// The Java package name must be proto package name with proper prefix.\noption java_package = \"org.openapi_v3\";\n\n// A reasonable prefix for the Objective-C symbols generated from the package.\n// It should at a minimum be 3 characters long, all uppercase, and convention\n// is to use an abbreviation of the package name. Something short, but\n// hopefully unique enough to not conflict with things that may come along in\n// the future. 'GPB' is reserved for the protocol buffer implementation itself.\noption objc_class_prefix = \"OAS\";\n\n// The Go package name.\noption go_package = \"github.com/google/gnostic/openapiv3;openapi_v3\";\n\nextend google.protobuf.FileOptions {\n  Document document = 1143;\n}\n\nextend google.protobuf.MethodOptions {\n  Operation operation = 1143;\n}\n\nextend google.protobuf.MessageOptions {\n  Schema schema = 1143;\n}\n\nextend google.protobuf.FieldOptions {\n  Schema property = 1143;\n}"
  },
  {
    "path": "service/order/third_party/openapi/v3/openapi.proto",
    "content": "// Copyright 2020 Google LLC. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//    http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// THIS FILE IS AUTOMATICALLY GENERATED.\n\nsyntax = \"proto3\";\n\npackage openapi.v3;\n\nimport \"google/protobuf/any.proto\";\n\n// This option lets the proto compiler generate Java code inside the package\n// name (see below) instead of inside an outer class. It creates a simpler\n// developer experience by reducing one-level of name nesting and be\n// consistent with most programming languages that don't support outer classes.\noption java_multiple_files = true;\n\n// The Java outer classname should be the filename in UpperCamelCase. This\n// class is only used to hold proto descriptor, so developers don't need to\n// work with it directly.\noption java_outer_classname = \"OpenAPIProto\";\n\n// The Java package name must be proto package name with proper prefix.\noption java_package = \"org.openapi_v3\";\n\n// A reasonable prefix for the Objective-C symbols generated from the package.\n// It should at a minimum be 3 characters long, all uppercase, and convention\n// is to use an abbreviation of the package name. Something short, but\n// hopefully unique enough to not conflict with things that may come along in\n// the future. 'GPB' is reserved for the protocol buffer implementation itself.\noption objc_class_prefix = \"OAS\";\n\n// The Go package name.\noption go_package = \"github.com/google/gnostic/openapiv3;openapi_v3\";\n\nmessage AdditionalPropertiesItem {\n  oneof oneof {\n    SchemaOrReference schema_or_reference = 1;\n    bool boolean = 2;\n  }\n}\n\nmessage Any {\n  google.protobuf.Any value = 1;\n  string yaml = 2;\n}\n\nmessage AnyOrExpression {\n  oneof oneof {\n    Any any = 1;\n    Expression expression = 2;\n  }\n}\n\n// A map of possible out-of band callbacks related to the parent operation. Each value in the map is a Path Item Object that describes a set of requests that may be initiated by the API provider and the expected responses. The key value used to identify the callback object is an expression, evaluated at runtime, that identifies a URL to use for the callback operation.\nmessage Callback {\n  repeated NamedPathItem path = 1;\n  repeated NamedAny specification_extension = 2;\n}\n\nmessage CallbackOrReference {\n  oneof oneof {\n    Callback callback = 1;\n    Reference reference = 2;\n  }\n}\n\nmessage CallbacksOrReferences {\n  repeated NamedCallbackOrReference additional_properties = 1;\n}\n\n// Holds a set of reusable objects for different aspects of the OAS. All objects defined within the components object will have no effect on the API unless they are explicitly referenced from properties outside the components object.\nmessage Components {\n  SchemasOrReferences schemas = 1;\n  ResponsesOrReferences responses = 2;\n  ParametersOrReferences parameters = 3;\n  ExamplesOrReferences examples = 4;\n  RequestBodiesOrReferences request_bodies = 5;\n  HeadersOrReferences headers = 6;\n  SecuritySchemesOrReferences security_schemes = 7;\n  LinksOrReferences links = 8;\n  CallbacksOrReferences callbacks = 9;\n  repeated NamedAny specification_extension = 10;\n}\n\n// Contact information for the exposed API.\nmessage Contact {\n  string name = 1;\n  string url = 2;\n  string email = 3;\n  repeated NamedAny specification_extension = 4;\n}\n\nmessage DefaultType {\n  oneof oneof {\n    double number = 1;\n    bool boolean = 2;\n    string string = 3;\n  }\n}\n\n// When request bodies or response payloads may be one of a number of different schemas, a `discriminator` object can be used to aid in serialization, deserialization, and validation.  The discriminator is a specific object in a schema which is used to inform the consumer of the specification of an alternative schema based on the value associated with it.  When using the discriminator, _inline_ schemas will not be considered.\nmessage Discriminator {\n  string property_name = 1;\n  Strings mapping = 2;\n  repeated NamedAny specification_extension = 3;\n}\n\nmessage Document {\n  string openapi = 1;\n  Info info = 2;\n  repeated Server servers = 3;\n  Paths paths = 4;\n  Components components = 5;\n  repeated SecurityRequirement security = 6;\n  repeated Tag tags = 7;\n  ExternalDocs external_docs = 8;\n  repeated NamedAny specification_extension = 9;\n}\n\n// A single encoding definition applied to a single schema property.\nmessage Encoding {\n  string content_type = 1;\n  HeadersOrReferences headers = 2;\n  string style = 3;\n  bool explode = 4;\n  bool allow_reserved = 5;\n  repeated NamedAny specification_extension = 6;\n}\n\nmessage Encodings {\n  repeated NamedEncoding additional_properties = 1;\n}\n\nmessage Example {\n  string summary = 1;\n  string description = 2;\n  Any value = 3;\n  string external_value = 4;\n  repeated NamedAny specification_extension = 5;\n}\n\nmessage ExampleOrReference {\n  oneof oneof {\n    Example example = 1;\n    Reference reference = 2;\n  }\n}\n\nmessage ExamplesOrReferences {\n  repeated NamedExampleOrReference additional_properties = 1;\n}\n\nmessage Expression {\n  repeated NamedAny additional_properties = 1;\n}\n\n// Allows referencing an external resource for extended documentation.\nmessage ExternalDocs {\n  string description = 1;\n  string url = 2;\n  repeated NamedAny specification_extension = 3;\n}\n\n// The Header Object follows the structure of the Parameter Object with the following changes:  1. `name` MUST NOT be specified, it is given in the corresponding `headers` map. 1. `in` MUST NOT be specified, it is implicitly in `header`. 1. All traits that are affected by the location MUST be applicable to a location of `header` (for example, `style`).\nmessage Header {\n  string description = 1;\n  bool required = 2;\n  bool deprecated = 3;\n  bool allow_empty_value = 4;\n  string style = 5;\n  bool explode = 6;\n  bool allow_reserved = 7;\n  SchemaOrReference schema = 8;\n  Any example = 9;\n  ExamplesOrReferences examples = 10;\n  MediaTypes content = 11;\n  repeated NamedAny specification_extension = 12;\n}\n\nmessage HeaderOrReference {\n  oneof oneof {\n    Header header = 1;\n    Reference reference = 2;\n  }\n}\n\nmessage HeadersOrReferences {\n  repeated NamedHeaderOrReference additional_properties = 1;\n}\n\n// The object provides metadata about the API. The metadata MAY be used by the clients if needed, and MAY be presented in editing or documentation generation tools for convenience.\nmessage Info {\n  string title = 1;\n  string description = 2;\n  string terms_of_service = 3;\n  Contact contact = 4;\n  License license = 5;\n  string version = 6;\n  repeated NamedAny specification_extension = 7;\n  string summary = 8;\n}\n\nmessage ItemsItem {\n  repeated SchemaOrReference schema_or_reference = 1;\n}\n\n// License information for the exposed API.\nmessage License {\n  string name = 1;\n  string url = 2;\n  repeated NamedAny specification_extension = 3;\n}\n\n// The `Link object` represents a possible design-time link for a response. The presence of a link does not guarantee the caller's ability to successfully invoke it, rather it provides a known relationship and traversal mechanism between responses and other operations.  Unlike _dynamic_ links (i.e. links provided **in** the response payload), the OAS linking mechanism does not require link information in the runtime response.  For computing links, and providing instructions to execute them, a runtime expression is used for accessing values in an operation and using them as parameters while invoking the linked operation.\nmessage Link {\n  string operation_ref = 1;\n  string operation_id = 2;\n  AnyOrExpression parameters = 3;\n  AnyOrExpression request_body = 4;\n  string description = 5;\n  Server server = 6;\n  repeated NamedAny specification_extension = 7;\n}\n\nmessage LinkOrReference {\n  oneof oneof {\n    Link link = 1;\n    Reference reference = 2;\n  }\n}\n\nmessage LinksOrReferences {\n  repeated NamedLinkOrReference additional_properties = 1;\n}\n\n// Each Media Type Object provides schema and examples for the media type identified by its key.\nmessage MediaType {\n  SchemaOrReference schema = 1;\n  Any example = 2;\n  ExamplesOrReferences examples = 3;\n  Encodings encoding = 4;\n  repeated NamedAny specification_extension = 5;\n}\n\nmessage MediaTypes {\n  repeated NamedMediaType additional_properties = 1;\n}\n\n// Automatically-generated message used to represent maps of Any as ordered (name,value) pairs.\nmessage NamedAny {\n  // Map key\n  string name = 1;\n  // Mapped value\n  Any value = 2;\n}\n\n// Automatically-generated message used to represent maps of CallbackOrReference as ordered (name,value) pairs.\nmessage NamedCallbackOrReference {\n  // Map key\n  string name = 1;\n  // Mapped value\n  CallbackOrReference value = 2;\n}\n\n// Automatically-generated message used to represent maps of Encoding as ordered (name,value) pairs.\nmessage NamedEncoding {\n  // Map key\n  string name = 1;\n  // Mapped value\n  Encoding value = 2;\n}\n\n// Automatically-generated message used to represent maps of ExampleOrReference as ordered (name,value) pairs.\nmessage NamedExampleOrReference {\n  // Map key\n  string name = 1;\n  // Mapped value\n  ExampleOrReference value = 2;\n}\n\n// Automatically-generated message used to represent maps of HeaderOrReference as ordered (name,value) pairs.\nmessage NamedHeaderOrReference {\n  // Map key\n  string name = 1;\n  // Mapped value\n  HeaderOrReference value = 2;\n}\n\n// Automatically-generated message used to represent maps of LinkOrReference as ordered (name,value) pairs.\nmessage NamedLinkOrReference {\n  // Map key\n  string name = 1;\n  // Mapped value\n  LinkOrReference value = 2;\n}\n\n// Automatically-generated message used to represent maps of MediaType as ordered (name,value) pairs.\nmessage NamedMediaType {\n  // Map key\n  string name = 1;\n  // Mapped value\n  MediaType value = 2;\n}\n\n// Automatically-generated message used to represent maps of ParameterOrReference as ordered (name,value) pairs.\nmessage NamedParameterOrReference {\n  // Map key\n  string name = 1;\n  // Mapped value\n  ParameterOrReference value = 2;\n}\n\n// Automatically-generated message used to represent maps of PathItem as ordered (name,value) pairs.\nmessage NamedPathItem {\n  // Map key\n  string name = 1;\n  // Mapped value\n  PathItem value = 2;\n}\n\n// Automatically-generated message used to represent maps of RequestBodyOrReference as ordered (name,value) pairs.\nmessage NamedRequestBodyOrReference {\n  // Map key\n  string name = 1;\n  // Mapped value\n  RequestBodyOrReference value = 2;\n}\n\n// Automatically-generated message used to represent maps of ResponseOrReference as ordered (name,value) pairs.\nmessage NamedResponseOrReference {\n  // Map key\n  string name = 1;\n  // Mapped value\n  ResponseOrReference value = 2;\n}\n\n// Automatically-generated message used to represent maps of SchemaOrReference as ordered (name,value) pairs.\nmessage NamedSchemaOrReference {\n  // Map key\n  string name = 1;\n  // Mapped value\n  SchemaOrReference value = 2;\n}\n\n// Automatically-generated message used to represent maps of SecuritySchemeOrReference as ordered (name,value) pairs.\nmessage NamedSecuritySchemeOrReference {\n  // Map key\n  string name = 1;\n  // Mapped value\n  SecuritySchemeOrReference value = 2;\n}\n\n// Automatically-generated message used to represent maps of ServerVariable as ordered (name,value) pairs.\nmessage NamedServerVariable {\n  // Map key\n  string name = 1;\n  // Mapped value\n  ServerVariable value = 2;\n}\n\n// Automatically-generated message used to represent maps of string as ordered (name,value) pairs.\nmessage NamedString {\n  // Map key\n  string name = 1;\n  // Mapped value\n  string value = 2;\n}\n\n// Automatically-generated message used to represent maps of StringArray as ordered (name,value) pairs.\nmessage NamedStringArray {\n  // Map key\n  string name = 1;\n  // Mapped value\n  StringArray value = 2;\n}\n\n// Configuration details for a supported OAuth Flow\nmessage OauthFlow {\n  string authorization_url = 1;\n  string token_url = 2;\n  string refresh_url = 3;\n  Strings scopes = 4;\n  repeated NamedAny specification_extension = 5;\n}\n\n// Allows configuration of the supported OAuth Flows.\nmessage OauthFlows {\n  OauthFlow implicit = 1;\n  OauthFlow password = 2;\n  OauthFlow client_credentials = 3;\n  OauthFlow authorization_code = 4;\n  repeated NamedAny specification_extension = 5;\n}\n\nmessage Object {\n  repeated NamedAny additional_properties = 1;\n}\n\n// Describes a single API operation on a path.\nmessage Operation {\n  repeated string tags = 1;\n  string summary = 2;\n  string description = 3;\n  ExternalDocs external_docs = 4;\n  string operation_id = 5;\n  repeated ParameterOrReference parameters = 6;\n  RequestBodyOrReference request_body = 7;\n  Responses responses = 8;\n  CallbacksOrReferences callbacks = 9;\n  bool deprecated = 10;\n  repeated SecurityRequirement security = 11;\n  repeated Server servers = 12;\n  repeated NamedAny specification_extension = 13;\n}\n\n// Describes a single operation parameter.  A unique parameter is defined by a combination of a name and location.\nmessage Parameter {\n  string name = 1;\n  string in = 2;\n  string description = 3;\n  bool required = 4;\n  bool deprecated = 5;\n  bool allow_empty_value = 6;\n  string style = 7;\n  bool explode = 8;\n  bool allow_reserved = 9;\n  SchemaOrReference schema = 10;\n  Any example = 11;\n  ExamplesOrReferences examples = 12;\n  MediaTypes content = 13;\n  repeated NamedAny specification_extension = 14;\n}\n\nmessage ParameterOrReference {\n  oneof oneof {\n    Parameter parameter = 1;\n    Reference reference = 2;\n  }\n}\n\nmessage ParametersOrReferences {\n  repeated NamedParameterOrReference additional_properties = 1;\n}\n\n// Describes the operations available on a single path. A Path Item MAY be empty, due to ACL constraints. The path itself is still exposed to the documentation viewer but they will not know which operations and parameters are available.\nmessage PathItem {\n  string _ref = 1;\n  string summary = 2;\n  string description = 3;\n  Operation get = 4;\n  Operation put = 5;\n  Operation post = 6;\n  Operation delete = 7;\n  Operation options = 8;\n  Operation head = 9;\n  Operation patch = 10;\n  Operation trace = 11;\n  repeated Server servers = 12;\n  repeated ParameterOrReference parameters = 13;\n  repeated NamedAny specification_extension = 14;\n}\n\n// Holds the relative paths to the individual endpoints and their operations. The path is appended to the URL from the `Server Object` in order to construct the full URL.  The Paths MAY be empty, due to ACL constraints.\nmessage Paths {\n  repeated NamedPathItem path = 1;\n  repeated NamedAny specification_extension = 2;\n}\n\nmessage Properties {\n  repeated NamedSchemaOrReference additional_properties = 1;\n}\n\n// A simple object to allow referencing other components in the specification, internally and externally.  The Reference Object is defined by JSON Reference and follows the same structure, behavior and rules.   For this specification, reference resolution is accomplished as defined by the JSON Reference specification and not by the JSON Schema specification.\nmessage Reference {\n  string _ref = 1;\n  string summary = 2;\n  string description = 3;\n}\n\nmessage RequestBodiesOrReferences {\n  repeated NamedRequestBodyOrReference additional_properties = 1;\n}\n\n// Describes a single request body.\nmessage RequestBody {\n  string description = 1;\n  MediaTypes content = 2;\n  bool required = 3;\n  repeated NamedAny specification_extension = 4;\n}\n\nmessage RequestBodyOrReference {\n  oneof oneof {\n    RequestBody request_body = 1;\n    Reference reference = 2;\n  }\n}\n\n// Describes a single response from an API Operation, including design-time, static  `links` to operations based on the response.\nmessage Response {\n  string description = 1;\n  HeadersOrReferences headers = 2;\n  MediaTypes content = 3;\n  LinksOrReferences links = 4;\n  repeated NamedAny specification_extension = 5;\n}\n\nmessage ResponseOrReference {\n  oneof oneof {\n    Response response = 1;\n    Reference reference = 2;\n  }\n}\n\n// A container for the expected responses of an operation. The container maps a HTTP response code to the expected response.  The documentation is not necessarily expected to cover all possible HTTP response codes because they may not be known in advance. However, documentation is expected to cover a successful operation response and any known errors.  The `default` MAY be used as a default response object for all HTTP codes  that are not covered individually by the specification.  The `Responses Object` MUST contain at least one response code, and it  SHOULD be the response for a successful operation call.\nmessage Responses {\n  ResponseOrReference default = 1;\n  repeated NamedResponseOrReference response_or_reference = 2;\n  repeated NamedAny specification_extension = 3;\n}\n\nmessage ResponsesOrReferences {\n  repeated NamedResponseOrReference additional_properties = 1;\n}\n\n// The Schema Object allows the definition of input and output data types. These types can be objects, but also primitives and arrays. This object is an extended subset of the JSON Schema Specification Wright Draft 00.  For more information about the properties, see JSON Schema Core and JSON Schema Validation. Unless stated otherwise, the property definitions follow the JSON Schema.\nmessage Schema {\n  bool nullable = 1;\n  Discriminator discriminator = 2;\n  bool read_only = 3;\n  bool write_only = 4;\n  Xml xml = 5;\n  ExternalDocs external_docs = 6;\n  Any example = 7;\n  bool deprecated = 8;\n  string title = 9;\n  double multiple_of = 10;\n  double maximum = 11;\n  bool exclusive_maximum = 12;\n  double minimum = 13;\n  bool exclusive_minimum = 14;\n  int64 max_length = 15;\n  int64 min_length = 16;\n  string pattern = 17;\n  int64 max_items = 18;\n  int64 min_items = 19;\n  bool unique_items = 20;\n  int64 max_properties = 21;\n  int64 min_properties = 22;\n  repeated string required = 23;\n  repeated Any enum = 24;\n  string type = 25;\n  repeated SchemaOrReference all_of = 26;\n  repeated SchemaOrReference one_of = 27;\n  repeated SchemaOrReference any_of = 28;\n  Schema not = 29;\n  ItemsItem items = 30;\n  Properties properties = 31;\n  AdditionalPropertiesItem additional_properties = 32;\n  DefaultType default = 33;\n  string description = 34;\n  string format = 35;\n  repeated NamedAny specification_extension = 36;\n}\n\nmessage SchemaOrReference {\n  oneof oneof {\n    Schema schema = 1;\n    Reference reference = 2;\n  }\n}\n\nmessage SchemasOrReferences {\n  repeated NamedSchemaOrReference additional_properties = 1;\n}\n\n// Lists the required security schemes to execute this operation. The name used for each property MUST correspond to a security scheme declared in the Security Schemes under the Components Object.  Security Requirement Objects that contain multiple schemes require that all schemes MUST be satisfied for a request to be authorized. This enables support for scenarios where multiple query parameters or HTTP headers are required to convey security information.  When a list of Security Requirement Objects is defined on the OpenAPI Object or Operation Object, only one of the Security Requirement Objects in the list needs to be satisfied to authorize the request.\nmessage SecurityRequirement {\n  repeated NamedStringArray additional_properties = 1;\n}\n\n// Defines a security scheme that can be used by the operations. Supported schemes are HTTP authentication, an API key (either as a header, a cookie parameter or as a query parameter), mutual TLS (use of a client certificate), OAuth2's common flows (implicit, password, application and access code) as defined in RFC6749, and OpenID Connect.   Please note that currently (2019) the implicit flow is about to be deprecated OAuth 2.0 Security Best Current Practice. Recommended for most use case is Authorization Code Grant flow with PKCE.\nmessage SecurityScheme {\n  string type = 1;\n  string description = 2;\n  string name = 3;\n  string in = 4;\n  string scheme = 5;\n  string bearer_format = 6;\n  OauthFlows flows = 7;\n  string open_id_connect_url = 8;\n  repeated NamedAny specification_extension = 9;\n}\n\nmessage SecuritySchemeOrReference {\n  oneof oneof {\n    SecurityScheme security_scheme = 1;\n    Reference reference = 2;\n  }\n}\n\nmessage SecuritySchemesOrReferences {\n  repeated NamedSecuritySchemeOrReference additional_properties = 1;\n}\n\n// An object representing a Server.\nmessage Server {\n  string url = 1;\n  string description = 2;\n  ServerVariables variables = 3;\n  repeated NamedAny specification_extension = 4;\n}\n\n// An object representing a Server Variable for server URL template substitution.\nmessage ServerVariable {\n  repeated string enum = 1;\n  string default = 2;\n  string description = 3;\n  repeated NamedAny specification_extension = 4;\n}\n\nmessage ServerVariables {\n  repeated NamedServerVariable additional_properties = 1;\n}\n\n// Any property starting with x- is valid.\nmessage SpecificationExtension {\n  oneof oneof {\n    double number = 1;\n    bool boolean = 2;\n    string string = 3;\n  }\n}\n\nmessage StringArray {\n  repeated string value = 1;\n}\n\nmessage Strings {\n  repeated NamedString additional_properties = 1;\n}\n\n// Adds metadata to a single tag that is used by the Operation Object. It is not mandatory to have a Tag Object per tag defined in the Operation Object instances.\nmessage Tag {\n  string name = 1;\n  string description = 2;\n  ExternalDocs external_docs = 3;\n  repeated NamedAny specification_extension = 4;\n}\n\n// A metadata object that allows for more fine-tuned XML model definitions.  When using arrays, XML element names are *not* inferred (for singular/plural forms) and the `name` property SHOULD be used to add that information. See examples for expected behavior.\nmessage Xml {\n  string name = 1;\n  string namespace = 2;\n  string prefix = 3;\n  bool attribute = 4;\n  bool wrapped = 5;\n  repeated NamedAny specification_extension = 6;\n}\n\n"
  },
  {
    "path": "service/order/third_party/validate/README.md",
    "content": "# protoc-gen-validate (PGV)\n\n* https://github.com/envoyproxy/protoc-gen-validate\n"
  },
  {
    "path": "service/order/third_party/validate/validate.proto",
    "content": "syntax = \"proto2\";\npackage validate;\n\noption go_package = \"github.com/envoyproxy/protoc-gen-validate/validate\";\noption java_package = \"io.envoyproxy.pgv.validate\";\n\nimport \"google/protobuf/descriptor.proto\";\nimport \"google/protobuf/duration.proto\";\nimport \"google/protobuf/timestamp.proto\";\n\n// Validation rules applied at the message level\nextend google.protobuf.MessageOptions {\n    // Disabled nullifies any validation rules for this message, including any\n    // message fields associated with it that do support validation.\n    optional bool disabled = 1071;\n    // Ignore skips generation of validation methods for this message.\n    optional bool ignored = 1072;\n}\n\n// Validation rules applied at the oneof level\nextend google.protobuf.OneofOptions {\n    // Required ensures that exactly one the field options in a oneof is set;\n    // validation fails if no fields in the oneof are set.\n    optional bool required = 1071;\n}\n\n// Validation rules applied at the field level\nextend google.protobuf.FieldOptions {\n    // Rules specify the validations to be performed on this field. By default,\n    // no validation is performed against a field.\n    optional FieldRules rules = 1071;\n}\n\n// FieldRules encapsulates the rules for each type of field. Depending on the\n// field, the correct set should be used to ensure proper validations.\nmessage FieldRules {\n    optional MessageRules message = 17;\n    oneof type {\n        // Scalar Field Types\n        FloatRules    float    = 1;\n        DoubleRules   double   = 2;\n        Int32Rules    int32    = 3;\n        Int64Rules    int64    = 4;\n        UInt32Rules   uint32   = 5;\n        UInt64Rules   uint64   = 6;\n        SInt32Rules   sint32   = 7;\n        SInt64Rules   sint64   = 8;\n        Fixed32Rules  fixed32  = 9;\n        Fixed64Rules  fixed64  = 10;\n        SFixed32Rules sfixed32 = 11;\n        SFixed64Rules sfixed64 = 12;\n        BoolRules     bool     = 13;\n        StringRules   string   = 14;\n        BytesRules    bytes    = 15;\n\n        // Complex Field Types\n        EnumRules     enum     = 16;\n        RepeatedRules repeated = 18;\n        MapRules      map      = 19;\n\n        // Well-Known Field Types\n        AnyRules       any       = 20;\n        DurationRules  duration  = 21;\n        TimestampRules timestamp = 22;\n    }\n}\n\n// FloatRules describes the constraints applied to `float` values\nmessage FloatRules {\n    // Const specifies that this field must be exactly the specified value\n    optional float const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional float lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional float lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional float gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional float gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated float in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated float not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// DoubleRules describes the constraints applied to `double` values\nmessage DoubleRules {\n    // Const specifies that this field must be exactly the specified value\n    optional double const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional double lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional double lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional double gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional double gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated double in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated double not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// Int32Rules describes the constraints applied to `int32` values\nmessage Int32Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional int32 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional int32 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional int32 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional int32 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional int32 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated int32 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated int32 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// Int64Rules describes the constraints applied to `int64` values\nmessage Int64Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional int64 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional int64 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional int64 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional int64 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional int64 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated int64 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated int64 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// UInt32Rules describes the constraints applied to `uint32` values\nmessage UInt32Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional uint32 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional uint32 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional uint32 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional uint32 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional uint32 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated uint32 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated uint32 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// UInt64Rules describes the constraints applied to `uint64` values\nmessage UInt64Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional uint64 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional uint64 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional uint64 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional uint64 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional uint64 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated uint64 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated uint64 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// SInt32Rules describes the constraints applied to `sint32` values\nmessage SInt32Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional sint32 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional sint32 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional sint32 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional sint32 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional sint32 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated sint32 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated sint32 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// SInt64Rules describes the constraints applied to `sint64` values\nmessage SInt64Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional sint64 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional sint64 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional sint64 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional sint64 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional sint64 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated sint64 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated sint64 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// Fixed32Rules describes the constraints applied to `fixed32` values\nmessage Fixed32Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional fixed32 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional fixed32 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional fixed32 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional fixed32 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional fixed32 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated fixed32 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated fixed32 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// Fixed64Rules describes the constraints applied to `fixed64` values\nmessage Fixed64Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional fixed64 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional fixed64 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional fixed64 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional fixed64 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional fixed64 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated fixed64 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated fixed64 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// SFixed32Rules describes the constraints applied to `sfixed32` values\nmessage SFixed32Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional sfixed32 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional sfixed32 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional sfixed32 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional sfixed32 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional sfixed32 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated sfixed32 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated sfixed32 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// SFixed64Rules describes the constraints applied to `sfixed64` values\nmessage SFixed64Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional sfixed64 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional sfixed64 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional sfixed64 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional sfixed64 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional sfixed64 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated sfixed64 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated sfixed64 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// BoolRules describes the constraints applied to `bool` values\nmessage BoolRules {\n    // Const specifies that this field must be exactly the specified value\n    optional bool const = 1;\n}\n\n// StringRules describe the constraints applied to `string` values\nmessage StringRules {\n    // Const specifies that this field must be exactly the specified value\n    optional string const = 1;\n\n    // Len specifies that this field must be the specified number of\n    // characters (Unicode code points). Note that the number of\n    // characters may differ from the number of bytes in the string.\n    optional uint64 len = 19;\n\n    // MinLen specifies that this field must be the specified number of\n    // characters (Unicode code points) at a minimum. Note that the number of\n    // characters may differ from the number of bytes in the string.\n    optional uint64 min_len = 2;\n\n    // MaxLen specifies that this field must be the specified number of\n    // characters (Unicode code points) at a maximum. Note that the number of\n    // characters may differ from the number of bytes in the string.\n    optional uint64 max_len = 3;\n\n    // LenBytes specifies that this field must be the specified number of bytes\n    // at a minimum\n    optional uint64 len_bytes = 20;\n\n    // MinBytes specifies that this field must be the specified number of bytes\n    // at a minimum\n    optional uint64 min_bytes = 4;\n\n    // MaxBytes specifies that this field must be the specified number of bytes\n    // at a maximum\n    optional uint64 max_bytes = 5;\n\n    // Pattern specifes that this field must match against the specified\n    // regular expression (RE2 syntax). The included expression should elide\n    // any delimiters.\n    optional string pattern  = 6;\n\n    // Prefix specifies that this field must have the specified substring at\n    // the beginning of the string.\n    optional string prefix   = 7;\n\n    // Suffix specifies that this field must have the specified substring at\n    // the end of the string.\n    optional string suffix   = 8;\n\n    // Contains specifies that this field must have the specified substring\n    // anywhere in the string.\n    optional string contains = 9;\n\n    // NotContains specifies that this field cannot have the specified substring\n    // anywhere in the string.\n    optional string not_contains = 23;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated string in     = 10;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated string not_in = 11;\n\n    // WellKnown rules provide advanced constraints against common string\n    // patterns\n    oneof well_known {\n        // Email specifies that the field must be a valid email address as\n        // defined by RFC 5322\n        bool email    = 12;\n\n        // Hostname specifies that the field must be a valid hostname as\n        // defined by RFC 1034. This constraint does not support\n        // internationalized domain names (IDNs).\n        bool hostname = 13;\n\n        // Ip specifies that the field must be a valid IP (v4 or v6) address.\n        // Valid IPv6 addresses should not include surrounding square brackets.\n        bool ip       = 14;\n\n        // Ipv4 specifies that the field must be a valid IPv4 address.\n        bool ipv4     = 15;\n\n        // Ipv6 specifies that the field must be a valid IPv6 address. Valid\n        // IPv6 addresses should not include surrounding square brackets.\n        bool ipv6     = 16;\n\n        // Uri specifies that the field must be a valid, absolute URI as defined\n        // by RFC 3986\n        bool uri      = 17;\n\n        // UriRef specifies that the field must be a valid URI as defined by RFC\n        // 3986 and may be relative or absolute.\n        bool uri_ref  = 18;\n\n        // Address specifies that the field must be either a valid hostname as\n        // defined by RFC 1034 (which does not support internationalized domain\n        // names or IDNs), or it can be a valid IP (v4 or v6).\n        bool address  = 21;\n\n        // Uuid specifies that the field must be a valid UUID as defined by\n        // RFC 4122\n        bool uuid     = 22;\n\n        // WellKnownRegex specifies a common well known pattern defined as a regex.\n        KnownRegex well_known_regex = 24;\n    }\n\n  // This applies to regexes HTTP_HEADER_NAME and HTTP_HEADER_VALUE to enable\n  // strict header validation.\n  // By default, this is true, and HTTP header validations are RFC-compliant.\n  // Setting to false will enable a looser validations that only disallows\n  // \\r\\n\\0 characters, which can be used to bypass header matching rules.\n  optional bool strict = 25 [default = true];\n\n  // IgnoreEmpty specifies that the validation rules of this field should be\n  // evaluated only if the field is not empty\n  optional bool ignore_empty = 26;\n}\n\n// WellKnownRegex contain some well-known patterns.\nenum KnownRegex {\n  UNKNOWN = 0;\n\n  // HTTP header name as defined by RFC 7230.\n  HTTP_HEADER_NAME = 1;\n\n  // HTTP header value as defined by RFC 7230.\n  HTTP_HEADER_VALUE = 2;\n}\n\n// BytesRules describe the constraints applied to `bytes` values\nmessage BytesRules {\n    // Const specifies that this field must be exactly the specified value\n    optional bytes const = 1;\n\n    // Len specifies that this field must be the specified number of bytes\n    optional uint64 len = 13;\n\n    // MinLen specifies that this field must be the specified number of bytes\n    // at a minimum\n    optional uint64 min_len = 2;\n\n    // MaxLen specifies that this field must be the specified number of bytes\n    // at a maximum\n    optional uint64 max_len = 3;\n\n    // Pattern specifes that this field must match against the specified\n    // regular expression (RE2 syntax). The included expression should elide\n    // any delimiters.\n    optional string pattern  = 4;\n\n    // Prefix specifies that this field must have the specified bytes at the\n    // beginning of the string.\n    optional bytes  prefix   = 5;\n\n    // Suffix specifies that this field must have the specified bytes at the\n    // end of the string.\n    optional bytes  suffix   = 6;\n\n    // Contains specifies that this field must have the specified bytes\n    // anywhere in the string.\n    optional bytes  contains = 7;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated bytes in     = 8;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated bytes not_in = 9;\n\n    // WellKnown rules provide advanced constraints against common byte\n    // patterns\n    oneof well_known {\n        // Ip specifies that the field must be a valid IP (v4 or v6) address in\n        // byte format\n        bool ip   = 10;\n\n        // Ipv4 specifies that the field must be a valid IPv4 address in byte\n        // format\n        bool ipv4 = 11;\n\n        // Ipv6 specifies that the field must be a valid IPv6 address in byte\n        // format\n        bool ipv6 = 12;\n    }\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 14;\n}\n\n// EnumRules describe the constraints applied to enum values\nmessage EnumRules {\n    // Const specifies that this field must be exactly the specified value\n    optional int32 const        = 1;\n\n    // DefinedOnly specifies that this field must be only one of the defined\n    // values for this enum, failing on any undefined value.\n    optional bool  defined_only = 2;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated int32 in           = 3;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated int32 not_in       = 4;\n}\n\n// MessageRules describe the constraints applied to embedded message values.\n// For message-type fields, validation is performed recursively.\nmessage MessageRules {\n    // Skip specifies that the validation rules of this field should not be\n    // evaluated\n    optional bool skip     = 1;\n\n    // Required specifies that this field must be set\n    optional bool required = 2;\n}\n\n// RepeatedRules describe the constraints applied to `repeated` values\nmessage RepeatedRules {\n    // MinItems specifies that this field must have the specified number of\n    // items at a minimum\n    optional uint64 min_items = 1;\n\n    // MaxItems specifies that this field must have the specified number of\n    // items at a maximum\n    optional uint64 max_items = 2;\n\n    // Unique specifies that all elements in this field must be unique. This\n    // contraint is only applicable to scalar and enum types (messages are not\n    // supported).\n    optional bool   unique    = 3;\n\n    // Items specifies the contraints to be applied to each item in the field.\n    // Repeated message fields will still execute validation against each item\n    // unless skip is specified here.\n    optional FieldRules items = 4;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 5;\n}\n\n// MapRules describe the constraints applied to `map` values\nmessage MapRules {\n    // MinPairs specifies that this field must have the specified number of\n    // KVs at a minimum\n    optional uint64 min_pairs = 1;\n\n    // MaxPairs specifies that this field must have the specified number of\n    // KVs at a maximum\n    optional uint64 max_pairs = 2;\n\n    // NoSparse specifies values in this field cannot be unset. This only\n    // applies to map's with message value types.\n    optional bool no_sparse = 3;\n\n    // Keys specifies the constraints to be applied to each key in the field.\n    optional FieldRules keys   = 4;\n\n    // Values specifies the constraints to be applied to the value of each key\n    // in the field. Message values will still have their validations evaluated\n    // unless skip is specified here.\n    optional FieldRules values = 5;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 6;\n}\n\n// AnyRules describe constraints applied exclusively to the\n// `google.protobuf.Any` well-known type\nmessage AnyRules {\n    // Required specifies that this field must be set\n    optional bool required = 1;\n\n    // In specifies that this field's `type_url` must be equal to one of the\n    // specified values.\n    repeated string in     = 2;\n\n    // NotIn specifies that this field's `type_url` must not be equal to any of\n    // the specified values.\n    repeated string not_in = 3;\n}\n\n// DurationRules describe the constraints applied exclusively to the\n// `google.protobuf.Duration` well-known type\nmessage DurationRules {\n    // Required specifies that this field must be set\n    optional bool required = 1;\n\n    // Const specifies that this field must be exactly the specified value\n    optional google.protobuf.Duration const = 2;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional google.protobuf.Duration lt = 3;\n\n    // Lt specifies that this field must be less than the specified value,\n    // inclusive\n    optional google.protobuf.Duration lte = 4;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive\n    optional google.protobuf.Duration gt = 5;\n\n    // Gte specifies that this field must be greater than the specified value,\n    // inclusive\n    optional google.protobuf.Duration gte = 6;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated google.protobuf.Duration in = 7;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated google.protobuf.Duration not_in = 8;\n}\n\n// TimestampRules describe the constraints applied exclusively to the\n// `google.protobuf.Timestamp` well-known type\nmessage TimestampRules {\n    // Required specifies that this field must be set\n    optional bool required = 1;\n\n    // Const specifies that this field must be exactly the specified value\n    optional google.protobuf.Timestamp const = 2;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional google.protobuf.Timestamp lt = 3;\n\n    // Lte specifies that this field must be less than the specified value,\n    // inclusive\n    optional google.protobuf.Timestamp lte = 4;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive\n    optional google.protobuf.Timestamp gt = 5;\n\n    // Gte specifies that this field must be greater than the specified value,\n    // inclusive\n    optional google.protobuf.Timestamp gte = 6;\n\n    // LtNow specifies that this must be less than the current time. LtNow\n    // can only be used with the Within rule.\n    optional bool lt_now  = 7;\n\n    // GtNow specifies that this must be greater than the current time. GtNow\n    // can only be used with the Within rule.\n    optional bool gt_now  = 8;\n\n    // Within specifies that this field must be within this duration of the\n    // current time. This constraint can be used alone or with the LtNow and\n    // GtNow rules.\n    optional google.protobuf.Duration within = 9;\n}\n"
  },
  {
    "path": "service/user/.gitignore",
    "content": "# Reference https://github.com/github/gitignore/blob/master/Go.gitignore\n# Binaries for programs and plugins\n*.exe\n*.exe~\n*.dll\n*.so\n*.dylib\n\n# Test binary, built with `go test -c`\n*.test\n\n# Output of the go coverage tool, specifically when used with LiteIDE\n*.out\n\n# Dependency directories (remove the comment below to include it)\nvendor/\n\n# Compiled Object files, Static and Dynamic libs (Shared Objects)\n*.o\n*.a\n*.so\n\n# OS General\nThumbs.db\n.DS_Store\n\n# project\n*.cert\n*.key\n*.log\nbin/\n\n# Develop tools\n.vscode/\n.idea/\n*.swp\n"
  },
  {
    "path": "service/user/Dockerfile",
    "content": "FROM golang:1.16 AS builder\n\nCOPY . /src\nWORKDIR /src\n\nRUN GOPROXY=https://goproxy.cn make build\n\nFROM debian:stable-slim\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n\t\tca-certificates  \\\n        netbase \\\n        && rm -rf /var/lib/apt/lists/ \\\n        && apt-get autoremove -y && apt-get autoclean -y\n\nCOPY --from=builder /src/bin /app\n\nWORKDIR /app\n\nEXPOSE 8000\nEXPOSE 9000\nVOLUME /data/conf\n\nCMD [\"./server\", \"-conf\", \"/data/conf\"]\n"
  },
  {
    "path": "service/user/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2020 go-kratos\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "service/user/Makefile",
    "content": "GOPATH:=$(shell go env GOPATH)\nVERSION=$(shell git describe --tags --always)\nINTERNAL_PROTO_FILES=$(shell find internal -name *.proto)\nAPI_PROTO_FILES=$(shell find api -name *.proto)\n\n.PHONY: init\n# init env\ninit:\n\tgo install google.golang.org/protobuf/cmd/protoc-gen-go@latest\n\tgo install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest\n\tgo install github.com/go-kratos/kratos/cmd/kratos/v2@latest\n\tgo install github.com/go-kratos/kratos/cmd/protoc-gen-go-http/v2@latest\n\tgo install github.com/go-kratos/kratos/cmd/protoc-gen-go-errors/v2@latest\n\tgo install github.com/google/gnostic/cmd/protoc-gen-openapi@v0.6.1\n\n.PHONY: errors\n# generate errors code\nerrors:\n\tprotoc --proto_path=. \\\n               --proto_path=./third_party \\\n               --go_out=paths=source_relative:. \\\n               --go-errors_out=paths=source_relative:. \\\n               $(API_PROTO_FILES)\n\n.PHONY: config\n# generate internal proto\nconfig:\n\tprotoc --proto_path=. \\\n\t       --proto_path=./third_party \\\n \t       --go_out=paths=source_relative:. \\\n\t       $(INTERNAL_PROTO_FILES)\n\n.PHONY: api\n# generate api proto\napi:\n\tprotoc --proto_path=. \\\n\t       --proto_path=./third_party \\\n \t       --go_out=paths=source_relative:. \\\n \t       --go-http_out=paths=source_relative:. \\\n \t       --go-grpc_out=paths=source_relative:. \\\n \t       --openapi_out==paths=source_relative:. \\\n \t       --validate_out=paths=source_relative,lang=go:. \\\n\t       $(API_PROTO_FILES)\n\n.PHONY: build\n# build\nbuild:\n\tmkdir -p bin/ && go build -ldflags \"-X main.Version=$(VERSION)\" -o ./bin/ ./...\n\n.PHONY: generate\n# generate\ngenerate:\n\tgo generate ./...\n\n# wire\nwire:\n\tcd cmd/user/ && wire\n\n.PHONY: test # 快速测试，运行repo以外的所有测试\ntest:\n\tginkgo -r -cover -v .\n\n.PHONY: all\n# generate all\nall:\n\tmake api;\n\tmake errors;\n\tmake config;\n\tmake generate;\n\n\n# show help\nhelp:\n\t@echo ''\n\t@echo 'Usage:'\n\t@echo ' make [target]'\n\t@echo ''\n\t@echo 'Targets:'\n\t@awk '/^[a-zA-Z\\-\\_0-9]+:/ { \\\n\thelpMessage = match(lastLine, /^# (.*)/); \\\n\t\tif (helpMessage) { \\\n\t\t\thelpCommand = substr($$1, 0, index($$1, \":\")-1); \\\n\t\t\thelpMessage = substr(lastLine, RSTART + 2, RLENGTH); \\\n\t\t\tprintf \"\\033[36m%-22s\\033[0m %s\\n\", helpCommand,helpMessage; \\\n\t\t} \\\n\t} \\\n\t{ lastLine = $$0 }' $(MAKEFILE_LIST)\n\n.DEFAULT_GOAL := help\n"
  },
  {
    "path": "service/user/README.md",
    "content": "user service"
  },
  {
    "path": "service/user/api/user/v1/error_reason.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.0\n// \tprotoc        v3.19.4\n// source: api/user/v1/error_reason.proto\n\npackage v1\n\nimport (\n\t_ \"github.com/go-kratos/kratos/v2/errors\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype ErrorReason int32\n\nconst (\n\tErrorReason_USER_NOT_FOUND  ErrorReason = 0\n\tErrorReason_CONTENT_MISSING ErrorReason = 1\n)\n\n// Enum value maps for ErrorReason.\nvar (\n\tErrorReason_name = map[int32]string{\n\t\t0: \"USER_NOT_FOUND\",\n\t\t1: \"CONTENT_MISSING\",\n\t}\n\tErrorReason_value = map[string]int32{\n\t\t\"USER_NOT_FOUND\":  0,\n\t\t\"CONTENT_MISSING\": 1,\n\t}\n)\n\nfunc (x ErrorReason) Enum() *ErrorReason {\n\tp := new(ErrorReason)\n\t*p = x\n\treturn p\n}\n\nfunc (x ErrorReason) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (ErrorReason) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_api_user_v1_error_reason_proto_enumTypes[0].Descriptor()\n}\n\nfunc (ErrorReason) Type() protoreflect.EnumType {\n\treturn &file_api_user_v1_error_reason_proto_enumTypes[0]\n}\n\nfunc (x ErrorReason) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use ErrorReason.Descriptor instead.\nfunc (ErrorReason) EnumDescriptor() ([]byte, []int) {\n\treturn file_api_user_v1_error_reason_proto_rawDescGZIP(), []int{0}\n}\n\nvar File_api_user_v1_error_reason_proto protoreflect.FileDescriptor\n\nvar file_api_user_v1_error_reason_proto_rawDesc = []byte{\n\t0x0a, 0x1e, 0x61, 0x70, 0x69, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x72,\n\t0x72, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x12, 0x07, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x1a, 0x13, 0x65, 0x72, 0x72, 0x6f, 0x72,\n\t0x73, 0x2f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2a, 0x48,\n\t0x0a, 0x0b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x18, 0x0a,\n\t0x0e, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10,\n\t0x00, 0x1a, 0x04, 0xa8, 0x45, 0x94, 0x03, 0x12, 0x19, 0x0a, 0x0f, 0x43, 0x4f, 0x4e, 0x54, 0x45,\n\t0x4e, 0x54, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x1a, 0x04, 0xa8, 0x45,\n\t0x90, 0x03, 0x1a, 0x04, 0xa0, 0x45, 0xf4, 0x03, 0x42, 0x25, 0x5a, 0x13, 0x75, 0x73, 0x65, 0x72,\n\t0x2f, 0x61, 0x70, 0x69, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x3b, 0x76, 0x31, 0xa2,\n\t0x02, 0x0d, 0x41, 0x50, 0x49, 0x55, 0x73, 0x65, 0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x62,\n\t0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_api_user_v1_error_reason_proto_rawDescOnce sync.Once\n\tfile_api_user_v1_error_reason_proto_rawDescData = file_api_user_v1_error_reason_proto_rawDesc\n)\n\nfunc file_api_user_v1_error_reason_proto_rawDescGZIP() []byte {\n\tfile_api_user_v1_error_reason_proto_rawDescOnce.Do(func() {\n\t\tfile_api_user_v1_error_reason_proto_rawDescData = protoimpl.X.CompressGZIP(file_api_user_v1_error_reason_proto_rawDescData)\n\t})\n\treturn file_api_user_v1_error_reason_proto_rawDescData\n}\n\nvar file_api_user_v1_error_reason_proto_enumTypes = make([]protoimpl.EnumInfo, 1)\nvar file_api_user_v1_error_reason_proto_goTypes = []interface{}{\n\t(ErrorReason)(0), // 0: user.v1.ErrorReason\n}\nvar file_api_user_v1_error_reason_proto_depIdxs = []int32{\n\t0, // [0:0] is the sub-list for method output_type\n\t0, // [0:0] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_api_user_v1_error_reason_proto_init() }\nfunc file_api_user_v1_error_reason_proto_init() {\n\tif File_api_user_v1_error_reason_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_api_user_v1_error_reason_proto_rawDesc,\n\t\t\tNumEnums:      1,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_api_user_v1_error_reason_proto_goTypes,\n\t\tDependencyIndexes: file_api_user_v1_error_reason_proto_depIdxs,\n\t\tEnumInfos:         file_api_user_v1_error_reason_proto_enumTypes,\n\t}.Build()\n\tFile_api_user_v1_error_reason_proto = out.File\n\tfile_api_user_v1_error_reason_proto_rawDesc = nil\n\tfile_api_user_v1_error_reason_proto_goTypes = nil\n\tfile_api_user_v1_error_reason_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "service/user/api/user/v1/error_reason.pb.validate.go",
    "content": "// Code generated by protoc-gen-validate. DO NOT EDIT.\n// source: api/user/v1/error_reason.proto\n\npackage v1\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"net/mail\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"sort\"\n\t\"strings\"\n\t\"time\"\n\t\"unicode/utf8\"\n\n\t\"google.golang.org/protobuf/types/known/anypb\"\n)\n\n// ensure the imports are used\nvar (\n\t_ = bytes.MinRead\n\t_ = errors.New(\"\")\n\t_ = fmt.Print\n\t_ = utf8.UTFMax\n\t_ = (*regexp.Regexp)(nil)\n\t_ = (*strings.Reader)(nil)\n\t_ = net.IPv4len\n\t_ = time.Duration(0)\n\t_ = (*url.URL)(nil)\n\t_ = (*mail.Address)(nil)\n\t_ = anypb.Any{}\n\t_ = sort.Sort\n)\n"
  },
  {
    "path": "service/user/api/user/v1/error_reason.proto",
    "content": "syntax = \"proto3\";\n\npackage user.v1;\nimport \"errors/errors.proto\";\n\noption go_package = \"user/api/user/v1;v1\";\noption objc_class_prefix = \"APIUserErrors\";\n\nenum ErrorReason {\n  option (errors.default_code) = 500;\n\n  USER_NOT_FOUND = 0 [(errors.code) = 404];\n  CONTENT_MISSING = 1 [(errors.code) = 400];\n}\n"
  },
  {
    "path": "service/user/api/user/v1/error_reason_errors.pb.go",
    "content": "// Code generated by protoc-gen-go-errors. DO NOT EDIT.\n\npackage v1\n\nimport (\n\tfmt \"fmt\"\n\terrors \"github.com/go-kratos/kratos/v2/errors\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the kratos package it is being compiled against.\nconst _ = errors.SupportPackageIsVersion1\n\nfunc IsUserNotFound(err error) bool {\n\tif err == nil {\n\t\treturn false\n\t}\n\te := errors.FromError(err)\n\treturn e.Reason == ErrorReason_USER_NOT_FOUND.String() && e.Code == 404\n}\n\nfunc ErrorUserNotFound(format string, args ...interface{}) *errors.Error {\n\treturn errors.New(404, ErrorReason_USER_NOT_FOUND.String(), fmt.Sprintf(format, args...))\n}\n\nfunc IsContentMissing(err error) bool {\n\tif err == nil {\n\t\treturn false\n\t}\n\te := errors.FromError(err)\n\treturn e.Reason == ErrorReason_CONTENT_MISSING.String() && e.Code == 400\n}\n\nfunc ErrorContentMissing(format string, args ...interface{}) *errors.Error {\n\treturn errors.New(400, ErrorReason_CONTENT_MISSING.String(), fmt.Sprintf(format, args...))\n}\n"
  },
  {
    "path": "service/user/api/user/v1/user.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.0\n// \tprotoc        v3.19.4\n// source: api/user/v1/user.proto\n\npackage v1\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\temptypb \"google.golang.org/protobuf/types/known/emptypb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype ListAddressReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUid int64 `protobuf:\"varint,1,opt,name=uid,proto3\" json:\"uid,omitempty\"`\n}\n\nfunc (x *ListAddressReq) Reset() {\n\t*x = ListAddressReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_user_v1_user_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListAddressReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListAddressReq) ProtoMessage() {}\n\nfunc (x *ListAddressReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_user_v1_user_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListAddressReq.ProtoReflect.Descriptor instead.\nfunc (*ListAddressReq) Descriptor() ([]byte, []int) {\n\treturn file_api_user_v1_user_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *ListAddressReq) GetUid() int64 {\n\tif x != nil {\n\t\treturn x.Uid\n\t}\n\treturn 0\n}\n\ntype AddressInfo struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId        int64  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName      string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tMobile    string `protobuf:\"bytes,3,opt,name=mobile,proto3\" json:\"mobile,omitempty\"`\n\tProvince  string `protobuf:\"bytes,4,opt,name=Province,proto3\" json:\"Province,omitempty\"`\n\tCity      string `protobuf:\"bytes,5,opt,name=City,proto3\" json:\"City,omitempty\"`\n\tDistricts string `protobuf:\"bytes,6,opt,name=Districts,proto3\" json:\"Districts,omitempty\"`\n\tAddress   string `protobuf:\"bytes,7,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tPostCode  string `protobuf:\"bytes,8,opt,name=post_code,json=postCode,proto3\" json:\"post_code,omitempty\"`\n\tIsDefault int32  `protobuf:\"varint,9,opt,name=is_default,json=isDefault,proto3\" json:\"is_default,omitempty\"`\n}\n\nfunc (x *AddressInfo) Reset() {\n\t*x = AddressInfo{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_user_v1_user_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AddressInfo) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AddressInfo) ProtoMessage() {}\n\nfunc (x *AddressInfo) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_user_v1_user_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AddressInfo.ProtoReflect.Descriptor instead.\nfunc (*AddressInfo) Descriptor() ([]byte, []int) {\n\treturn file_api_user_v1_user_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *AddressInfo) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *AddressInfo) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetMobile() string {\n\tif x != nil {\n\t\treturn x.Mobile\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetProvince() string {\n\tif x != nil {\n\t\treturn x.Province\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetCity() string {\n\tif x != nil {\n\t\treturn x.City\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetDistricts() string {\n\tif x != nil {\n\t\treturn x.Districts\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetAddress() string {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetPostCode() string {\n\tif x != nil {\n\t\treturn x.PostCode\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetIsDefault() int32 {\n\tif x != nil {\n\t\treturn x.IsDefault\n\t}\n\treturn 0\n}\n\ntype ListAddressReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tResults []*AddressInfo `protobuf:\"bytes,1,rep,name=results,proto3\" json:\"results,omitempty\"`\n}\n\nfunc (x *ListAddressReply) Reset() {\n\t*x = ListAddressReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_user_v1_user_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListAddressReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListAddressReply) ProtoMessage() {}\n\nfunc (x *ListAddressReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_user_v1_user_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListAddressReply.ProtoReflect.Descriptor instead.\nfunc (*ListAddressReply) Descriptor() ([]byte, []int) {\n\treturn file_api_user_v1_user_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *ListAddressReply) GetResults() []*AddressInfo {\n\tif x != nil {\n\t\treturn x.Results\n\t}\n\treturn nil\n}\n\ntype CreateAddressReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUid       int64  `protobuf:\"varint,1,opt,name=uid,proto3\" json:\"uid,omitempty\"`\n\tName      string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tMobile    string `protobuf:\"bytes,3,opt,name=mobile,proto3\" json:\"mobile,omitempty\"`\n\tProvince  string `protobuf:\"bytes,4,opt,name=Province,proto3\" json:\"Province,omitempty\"`\n\tCity      string `protobuf:\"bytes,5,opt,name=City,proto3\" json:\"City,omitempty\"`\n\tDistricts string `protobuf:\"bytes,6,opt,name=Districts,proto3\" json:\"Districts,omitempty\"`\n\tAddress   string `protobuf:\"bytes,7,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tPostCode  string `protobuf:\"bytes,8,opt,name=post_code,json=postCode,proto3\" json:\"post_code,omitempty\"`\n\tIsDefault int32  `protobuf:\"varint,9,opt,name=is_default,json=isDefault,proto3\" json:\"is_default,omitempty\"`\n}\n\nfunc (x *CreateAddressReq) Reset() {\n\t*x = CreateAddressReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_user_v1_user_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CreateAddressReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreateAddressReq) ProtoMessage() {}\n\nfunc (x *CreateAddressReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_user_v1_user_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreateAddressReq.ProtoReflect.Descriptor instead.\nfunc (*CreateAddressReq) Descriptor() ([]byte, []int) {\n\treturn file_api_user_v1_user_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *CreateAddressReq) GetUid() int64 {\n\tif x != nil {\n\t\treturn x.Uid\n\t}\n\treturn 0\n}\n\nfunc (x *CreateAddressReq) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetMobile() string {\n\tif x != nil {\n\t\treturn x.Mobile\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetProvince() string {\n\tif x != nil {\n\t\treturn x.Province\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetCity() string {\n\tif x != nil {\n\t\treturn x.City\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetDistricts() string {\n\tif x != nil {\n\t\treturn x.Districts\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetAddress() string {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetPostCode() string {\n\tif x != nil {\n\t\treturn x.PostCode\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetIsDefault() int32 {\n\tif x != nil {\n\t\treturn x.IsDefault\n\t}\n\treturn 0\n}\n\ntype UpdateAddressReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUid       int64  `protobuf:\"varint,1,opt,name=uid,proto3\" json:\"uid,omitempty\"`\n\tName      string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tMobile    string `protobuf:\"bytes,3,opt,name=mobile,proto3\" json:\"mobile,omitempty\"`\n\tProvince  string `protobuf:\"bytes,4,opt,name=Province,proto3\" json:\"Province,omitempty\"`\n\tCity      string `protobuf:\"bytes,5,opt,name=City,proto3\" json:\"City,omitempty\"`\n\tDistricts string `protobuf:\"bytes,6,opt,name=Districts,proto3\" json:\"Districts,omitempty\"`\n\tAddress   string `protobuf:\"bytes,7,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tPostCode  string `protobuf:\"bytes,8,opt,name=post_code,json=postCode,proto3\" json:\"post_code,omitempty\"`\n\tIsDefault int32  `protobuf:\"varint,9,opt,name=is_default,json=isDefault,proto3\" json:\"is_default,omitempty\"`\n\tId        int64  `protobuf:\"varint,10,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *UpdateAddressReq) Reset() {\n\t*x = UpdateAddressReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_user_v1_user_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *UpdateAddressReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UpdateAddressReq) ProtoMessage() {}\n\nfunc (x *UpdateAddressReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_user_v1_user_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UpdateAddressReq.ProtoReflect.Descriptor instead.\nfunc (*UpdateAddressReq) Descriptor() ([]byte, []int) {\n\treturn file_api_user_v1_user_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *UpdateAddressReq) GetUid() int64 {\n\tif x != nil {\n\t\treturn x.Uid\n\t}\n\treturn 0\n}\n\nfunc (x *UpdateAddressReq) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetMobile() string {\n\tif x != nil {\n\t\treturn x.Mobile\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetProvince() string {\n\tif x != nil {\n\t\treturn x.Province\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetCity() string {\n\tif x != nil {\n\t\treturn x.City\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetDistricts() string {\n\tif x != nil {\n\t\treturn x.Districts\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetAddress() string {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetPostCode() string {\n\tif x != nil {\n\t\treturn x.PostCode\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetIsDefault() int32 {\n\tif x != nil {\n\t\treturn x.IsDefault\n\t}\n\treturn 0\n}\n\nfunc (x *UpdateAddressReq) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\ntype AddressReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId  int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tUid int64 `protobuf:\"varint,2,opt,name=uid,proto3\" json:\"uid,omitempty\"`\n}\n\nfunc (x *AddressReq) Reset() {\n\t*x = AddressReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_user_v1_user_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AddressReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AddressReq) ProtoMessage() {}\n\nfunc (x *AddressReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_user_v1_user_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AddressReq.ProtoReflect.Descriptor instead.\nfunc (*AddressReq) Descriptor() ([]byte, []int) {\n\treturn file_api_user_v1_user_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *AddressReq) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *AddressReq) GetUid() int64 {\n\tif x != nil {\n\t\treturn x.Uid\n\t}\n\treturn 0\n}\n\ntype CheckResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tSuccess bool `protobuf:\"varint,1,opt,name=success,proto3\" json:\"success,omitempty\"`\n}\n\nfunc (x *CheckResponse) Reset() {\n\t*x = CheckResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_user_v1_user_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CheckResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CheckResponse) ProtoMessage() {}\n\nfunc (x *CheckResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_user_v1_user_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CheckResponse.ProtoReflect.Descriptor instead.\nfunc (*CheckResponse) Descriptor() ([]byte, []int) {\n\treturn file_api_user_v1_user_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *CheckResponse) GetSuccess() bool {\n\tif x != nil {\n\t\treturn x.Success\n\t}\n\treturn false\n}\n\n// 分页\ntype PageInfo struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPn    uint32 `protobuf:\"varint,1,opt,name=pn,proto3\" json:\"pn,omitempty\"`\n\tPSize uint32 `protobuf:\"varint,2,opt,name=pSize,proto3\" json:\"pSize,omitempty\"`\n}\n\nfunc (x *PageInfo) Reset() {\n\t*x = PageInfo{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_user_v1_user_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *PageInfo) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*PageInfo) ProtoMessage() {}\n\nfunc (x *PageInfo) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_user_v1_user_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use PageInfo.ProtoReflect.Descriptor instead.\nfunc (*PageInfo) Descriptor() ([]byte, []int) {\n\treturn file_api_user_v1_user_proto_rawDescGZIP(), []int{7}\n}\n\nfunc (x *PageInfo) GetPn() uint32 {\n\tif x != nil {\n\t\treturn x.Pn\n\t}\n\treturn 0\n}\n\nfunc (x *PageInfo) GetPSize() uint32 {\n\tif x != nil {\n\t\treturn x.PSize\n\t}\n\treturn 0\n}\n\n// 用户信息\ntype UserInfoResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId       int64  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tPassword string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\"`\n\tMobile   string `protobuf:\"bytes,3,opt,name=mobile,proto3\" json:\"mobile,omitempty\"`\n\tNickName string `protobuf:\"bytes,4,opt,name=nickName,proto3\" json:\"nickName,omitempty\"`\n\tBirthday uint64 `protobuf:\"varint,5,opt,name=birthday,proto3\" json:\"birthday,omitempty\"`\n\tGender   string `protobuf:\"bytes,6,opt,name=gender,proto3\" json:\"gender,omitempty\"`\n\tRole     int32  `protobuf:\"varint,7,opt,name=role,proto3\" json:\"role,omitempty\"`\n}\n\nfunc (x *UserInfoResponse) Reset() {\n\t*x = UserInfoResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_user_v1_user_proto_msgTypes[8]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *UserInfoResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UserInfoResponse) ProtoMessage() {}\n\nfunc (x *UserInfoResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_user_v1_user_proto_msgTypes[8]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UserInfoResponse.ProtoReflect.Descriptor instead.\nfunc (*UserInfoResponse) Descriptor() ([]byte, []int) {\n\treturn file_api_user_v1_user_proto_rawDescGZIP(), []int{8}\n}\n\nfunc (x *UserInfoResponse) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *UserInfoResponse) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *UserInfoResponse) GetMobile() string {\n\tif x != nil {\n\t\treturn x.Mobile\n\t}\n\treturn \"\"\n}\n\nfunc (x *UserInfoResponse) GetNickName() string {\n\tif x != nil {\n\t\treturn x.NickName\n\t}\n\treturn \"\"\n}\n\nfunc (x *UserInfoResponse) GetBirthday() uint64 {\n\tif x != nil {\n\t\treturn x.Birthday\n\t}\n\treturn 0\n}\n\nfunc (x *UserInfoResponse) GetGender() string {\n\tif x != nil {\n\t\treturn x.Gender\n\t}\n\treturn \"\"\n}\n\nfunc (x *UserInfoResponse) GetRole() int32 {\n\tif x != nil {\n\t\treturn x.Role\n\t}\n\treturn 0\n}\n\n// 用户列表\ntype UserListResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tTotal int32               `protobuf:\"varint,1,opt,name=total,proto3\" json:\"total,omitempty\"`\n\tData  []*UserInfoResponse `protobuf:\"bytes,2,rep,name=data,proto3\" json:\"data,omitempty\"`\n}\n\nfunc (x *UserListResponse) Reset() {\n\t*x = UserListResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_user_v1_user_proto_msgTypes[9]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *UserListResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UserListResponse) ProtoMessage() {}\n\nfunc (x *UserListResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_user_v1_user_proto_msgTypes[9]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UserListResponse.ProtoReflect.Descriptor instead.\nfunc (*UserListResponse) Descriptor() ([]byte, []int) {\n\treturn file_api_user_v1_user_proto_rawDescGZIP(), []int{9}\n}\n\nfunc (x *UserListResponse) GetTotal() int32 {\n\tif x != nil {\n\t\treturn x.Total\n\t}\n\treturn 0\n}\n\nfunc (x *UserListResponse) GetData() []*UserInfoResponse {\n\tif x != nil {\n\t\treturn x.Data\n\t}\n\treturn nil\n}\n\ntype MobileRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMobile string `protobuf:\"bytes,1,opt,name=mobile,proto3\" json:\"mobile,omitempty\"`\n}\n\nfunc (x *MobileRequest) Reset() {\n\t*x = MobileRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_user_v1_user_proto_msgTypes[10]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MobileRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MobileRequest) ProtoMessage() {}\n\nfunc (x *MobileRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_user_v1_user_proto_msgTypes[10]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MobileRequest.ProtoReflect.Descriptor instead.\nfunc (*MobileRequest) Descriptor() ([]byte, []int) {\n\treturn file_api_user_v1_user_proto_rawDescGZIP(), []int{10}\n}\n\nfunc (x *MobileRequest) GetMobile() string {\n\tif x != nil {\n\t\treturn x.Mobile\n\t}\n\treturn \"\"\n}\n\ntype IdRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *IdRequest) Reset() {\n\t*x = IdRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_user_v1_user_proto_msgTypes[11]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *IdRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*IdRequest) ProtoMessage() {}\n\nfunc (x *IdRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_user_v1_user_proto_msgTypes[11]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use IdRequest.ProtoReflect.Descriptor instead.\nfunc (*IdRequest) Descriptor() ([]byte, []int) {\n\treturn file_api_user_v1_user_proto_rawDescGZIP(), []int{11}\n}\n\nfunc (x *IdRequest) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\n// 创建用户\ntype CreateUserInfo struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tNickName string `protobuf:\"bytes,1,opt,name=nickName,proto3\" json:\"nickName,omitempty\"`\n\tPassword string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\"`\n\tMobile   string `protobuf:\"bytes,3,opt,name=mobile,proto3\" json:\"mobile,omitempty\"`\n}\n\nfunc (x *CreateUserInfo) Reset() {\n\t*x = CreateUserInfo{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_user_v1_user_proto_msgTypes[12]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CreateUserInfo) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreateUserInfo) ProtoMessage() {}\n\nfunc (x *CreateUserInfo) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_user_v1_user_proto_msgTypes[12]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreateUserInfo.ProtoReflect.Descriptor instead.\nfunc (*CreateUserInfo) Descriptor() ([]byte, []int) {\n\treturn file_api_user_v1_user_proto_rawDescGZIP(), []int{12}\n}\n\nfunc (x *CreateUserInfo) GetNickName() string {\n\tif x != nil {\n\t\treturn x.NickName\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateUserInfo) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateUserInfo) GetMobile() string {\n\tif x != nil {\n\t\treturn x.Mobile\n\t}\n\treturn \"\"\n}\n\ntype UpdateUserInfo struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId       int64  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tNickName string `protobuf:\"bytes,2,opt,name=nickName,proto3\" json:\"nickName,omitempty\"`\n\tGender   string `protobuf:\"bytes,3,opt,name=gender,proto3\" json:\"gender,omitempty\"`\n\tBirthday uint64 `protobuf:\"varint,4,opt,name=birthday,proto3\" json:\"birthday,omitempty\"`\n}\n\nfunc (x *UpdateUserInfo) Reset() {\n\t*x = UpdateUserInfo{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_user_v1_user_proto_msgTypes[13]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *UpdateUserInfo) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UpdateUserInfo) ProtoMessage() {}\n\nfunc (x *UpdateUserInfo) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_user_v1_user_proto_msgTypes[13]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UpdateUserInfo.ProtoReflect.Descriptor instead.\nfunc (*UpdateUserInfo) Descriptor() ([]byte, []int) {\n\treturn file_api_user_v1_user_proto_rawDescGZIP(), []int{13}\n}\n\nfunc (x *UpdateUserInfo) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *UpdateUserInfo) GetNickName() string {\n\tif x != nil {\n\t\treturn x.NickName\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateUserInfo) GetGender() string {\n\tif x != nil {\n\t\treturn x.Gender\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateUserInfo) GetBirthday() uint64 {\n\tif x != nil {\n\t\treturn x.Birthday\n\t}\n\treturn 0\n}\n\ntype PasswordCheckInfo struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPassword          string `protobuf:\"bytes,1,opt,name=password,proto3\" json:\"password,omitempty\"`\n\tEncryptedPassword string `protobuf:\"bytes,2,opt,name=encryptedPassword,proto3\" json:\"encryptedPassword,omitempty\"`\n}\n\nfunc (x *PasswordCheckInfo) Reset() {\n\t*x = PasswordCheckInfo{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_user_v1_user_proto_msgTypes[14]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *PasswordCheckInfo) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*PasswordCheckInfo) ProtoMessage() {}\n\nfunc (x *PasswordCheckInfo) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_user_v1_user_proto_msgTypes[14]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use PasswordCheckInfo.ProtoReflect.Descriptor instead.\nfunc (*PasswordCheckInfo) Descriptor() ([]byte, []int) {\n\treturn file_api_user_v1_user_proto_rawDescGZIP(), []int{14}\n}\n\nfunc (x *PasswordCheckInfo) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *PasswordCheckInfo) GetEncryptedPassword() string {\n\tif x != nil {\n\t\treturn x.EncryptedPassword\n\t}\n\treturn \"\"\n}\n\nvar File_api_user_v1_user_proto protoreflect.FileDescriptor\n\nvar file_api_user_v1_user_proto_rawDesc = []byte{\n\t0x0a, 0x16, 0x61, 0x70, 0x69, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73,\n\t0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x07, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76,\n\t0x31, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,\n\t0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x22,\n\t0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71,\n\t0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x75,\n\t0x69, 0x64, 0x22, 0xed, 0x01, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e,\n\t0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02,\n\t0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x12, 0x1a,\n\t0x0a, 0x08, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x08, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x69,\n\t0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x43, 0x69, 0x74, 0x79, 0x12, 0x1c,\n\t0x0a, 0x09, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x09, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07,\n\t0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61,\n\t0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x73, 0x74, 0x5f, 0x63,\n\t0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x74, 0x43,\n\t0x6f, 0x64, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c,\n\t0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x69, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75,\n\t0x6c, 0x74, 0x22, 0x42, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73,\n\t0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74,\n\t0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76,\n\t0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x72,\n\t0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0xf4, 0x01, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74,\n\t0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x12, 0x10, 0x0a, 0x03, 0x75,\n\t0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f,\n\t0x76, 0x69, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f,\n\t0x76, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x04, 0x43, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x69, 0x73,\n\t0x74, 0x72, 0x69, 0x63, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x69,\n\t0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65,\n\t0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73,\n\t0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x08,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1d,\n\t0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x09, 0x20, 0x01,\n\t0x28, 0x05, 0x52, 0x09, 0x69, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x84, 0x02,\n\t0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52,\n\t0x65, 0x71, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52,\n\t0x03, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x6f, 0x62, 0x69,\n\t0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65,\n\t0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04,\n\t0x43, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x43, 0x69, 0x74, 0x79,\n\t0x12, 0x1c, 0x0a, 0x09, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x73, 0x18, 0x06, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x73, 0x12, 0x18,\n\t0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x73, 0x74,\n\t0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73,\n\t0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61,\n\t0x75, 0x6c, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x69, 0x73, 0x44, 0x65, 0x66,\n\t0x61, 0x75, 0x6c, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03,\n\t0x52, 0x02, 0x69, 0x64, 0x22, 0x2e, 0x0a, 0x0a, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52,\n\t0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02,\n\t0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52,\n\t0x03, 0x75, 0x69, 0x64, 0x22, 0x29, 0x0a, 0x0d, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73,\n\t0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22,\n\t0x30, 0x0a, 0x08, 0x50, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x70,\n\t0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x70, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x70,\n\t0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x70, 0x53, 0x69, 0x7a,\n\t0x65, 0x22, 0xba, 0x01, 0x0a, 0x10, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65,\n\t0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f,\n\t0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f,\n\t0x72, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x69,\n\t0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x69,\n\t0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x69, 0x72, 0x74, 0x68, 0x64,\n\t0x61, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x62, 0x69, 0x72, 0x74, 0x68, 0x64,\n\t0x61, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x67, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x06, 0x67, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f,\n\t0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x57,\n\t0x0a, 0x10, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,\n\t0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x2d, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61,\n\t0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31,\n\t0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,\n\t0x65, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x27, 0x0a, 0x0d, 0x4d, 0x6f, 0x62, 0x69, 0x6c,\n\t0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x6f, 0x62, 0x69,\n\t0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65,\n\t0x22, 0x1b, 0x0a, 0x09, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a,\n\t0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x22, 0x60, 0x0a,\n\t0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12,\n\t0x1a, 0x0a, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70,\n\t0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70,\n\t0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c,\n\t0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x22,\n\t0x70, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66,\n\t0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69,\n\t0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a,\n\t0x06, 0x67, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x67,\n\t0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x69, 0x72, 0x74, 0x68, 0x64, 0x61,\n\t0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x62, 0x69, 0x72, 0x74, 0x68, 0x64, 0x61,\n\t0x79, 0x22, 0x5d, 0x0a, 0x11, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x68, 0x65,\n\t0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f,\n\t0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f,\n\t0x72, 0x64, 0x12, 0x2c, 0x0a, 0x11, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x50,\n\t0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x65,\n\t0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64,\n\t0x32, 0xa4, 0x06, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x3d, 0x0a, 0x0b, 0x47, 0x65, 0x74,\n\t0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x11, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e,\n\t0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0x19, 0x2e, 0x75, 0x73,\n\t0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65,\n\t0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x55,\n\t0x73, 0x65, 0x72, 0x42, 0x79, 0x4d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x12, 0x16, 0x2e, 0x75, 0x73,\n\t0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75,\n\t0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73,\n\t0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00,\n\t0x12, 0x3e, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x42, 0x79, 0x49, 0x64, 0x12,\n\t0x12, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75,\n\t0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73,\n\t0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00,\n\t0x12, 0x42, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x17,\n\t0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55,\n\t0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0x19, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76,\n\t0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,\n\t0x73, 0x65, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73,\n\t0x65, 0x72, 0x12, 0x17, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64,\n\t0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0x16, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d,\n\t0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0d, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x61,\n\t0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1a, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31,\n\t0x2e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x6e,\n\t0x66, 0x6f, 0x1a, 0x16, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65,\n\t0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x43, 0x0a, 0x0b,\n\t0x4c, 0x69, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x17, 0x2e, 0x75, 0x73,\n\t0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73,\n\t0x73, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c,\n\t0x69, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22,\n\t0x00, 0x12, 0x42, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65,\n\t0x73, 0x73, 0x12, 0x19, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65,\n\t0x61, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e,\n\t0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49,\n\t0x6e, 0x66, 0x6f, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41,\n\t0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x19, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31,\n\t0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65,\n\t0x71, 0x1a, 0x16, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63,\n\t0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x0e, 0x44,\n\t0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x13, 0x2e,\n\t0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52,\n\t0x65, 0x71, 0x1a, 0x16, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65,\n\t0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x0d,\n\t0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x13, 0x2e,\n\t0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52,\n\t0x65, 0x71, 0x1a, 0x16, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65,\n\t0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x39, 0x0a, 0x0a,\n\t0x47, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x13, 0x2e, 0x75, 0x73, 0x65,\n\t0x72, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x1a,\n\t0x14, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73,\n\t0x73, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x00, 0x42, 0x15, 0x5a, 0x13, 0x75, 0x73, 0x65, 0x72, 0x2f,\n\t0x61, 0x70, 0x69, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x3b, 0x76, 0x31, 0x62, 0x06,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_api_user_v1_user_proto_rawDescOnce sync.Once\n\tfile_api_user_v1_user_proto_rawDescData = file_api_user_v1_user_proto_rawDesc\n)\n\nfunc file_api_user_v1_user_proto_rawDescGZIP() []byte {\n\tfile_api_user_v1_user_proto_rawDescOnce.Do(func() {\n\t\tfile_api_user_v1_user_proto_rawDescData = protoimpl.X.CompressGZIP(file_api_user_v1_user_proto_rawDescData)\n\t})\n\treturn file_api_user_v1_user_proto_rawDescData\n}\n\nvar file_api_user_v1_user_proto_msgTypes = make([]protoimpl.MessageInfo, 15)\nvar file_api_user_v1_user_proto_goTypes = []interface{}{\n\t(*ListAddressReq)(nil),    // 0: user.v1.ListAddressReq\n\t(*AddressInfo)(nil),       // 1: user.v1.AddressInfo\n\t(*ListAddressReply)(nil),  // 2: user.v1.ListAddressReply\n\t(*CreateAddressReq)(nil),  // 3: user.v1.CreateAddressReq\n\t(*UpdateAddressReq)(nil),  // 4: user.v1.UpdateAddressReq\n\t(*AddressReq)(nil),        // 5: user.v1.AddressReq\n\t(*CheckResponse)(nil),     // 6: user.v1.CheckResponse\n\t(*PageInfo)(nil),          // 7: user.v1.PageInfo\n\t(*UserInfoResponse)(nil),  // 8: user.v1.UserInfoResponse\n\t(*UserListResponse)(nil),  // 9: user.v1.UserListResponse\n\t(*MobileRequest)(nil),     // 10: user.v1.MobileRequest\n\t(*IdRequest)(nil),         // 11: user.v1.IdRequest\n\t(*CreateUserInfo)(nil),    // 12: user.v1.CreateUserInfo\n\t(*UpdateUserInfo)(nil),    // 13: user.v1.UpdateUserInfo\n\t(*PasswordCheckInfo)(nil), // 14: user.v1.PasswordCheckInfo\n\t(*emptypb.Empty)(nil),     // 15: google.protobuf.Empty\n}\nvar file_api_user_v1_user_proto_depIdxs = []int32{\n\t1,  // 0: user.v1.ListAddressReply.results:type_name -> user.v1.AddressInfo\n\t8,  // 1: user.v1.UserListResponse.data:type_name -> user.v1.UserInfoResponse\n\t7,  // 2: user.v1.User.GetUserList:input_type -> user.v1.PageInfo\n\t10, // 3: user.v1.User.GetUserByMobile:input_type -> user.v1.MobileRequest\n\t11, // 4: user.v1.User.GetUserById:input_type -> user.v1.IdRequest\n\t12, // 5: user.v1.User.CreateUser:input_type -> user.v1.CreateUserInfo\n\t13, // 6: user.v1.User.UpdateUser:input_type -> user.v1.UpdateUserInfo\n\t14, // 7: user.v1.User.CheckPassword:input_type -> user.v1.PasswordCheckInfo\n\t0,  // 8: user.v1.User.ListAddress:input_type -> user.v1.ListAddressReq\n\t3,  // 9: user.v1.User.CreateAddress:input_type -> user.v1.CreateAddressReq\n\t4,  // 10: user.v1.User.UpdateAddress:input_type -> user.v1.UpdateAddressReq\n\t5,  // 11: user.v1.User.DefaultAddress:input_type -> user.v1.AddressReq\n\t5,  // 12: user.v1.User.DeleteAddress:input_type -> user.v1.AddressReq\n\t5,  // 13: user.v1.User.GetAddress:input_type -> user.v1.AddressReq\n\t9,  // 14: user.v1.User.GetUserList:output_type -> user.v1.UserListResponse\n\t8,  // 15: user.v1.User.GetUserByMobile:output_type -> user.v1.UserInfoResponse\n\t8,  // 16: user.v1.User.GetUserById:output_type -> user.v1.UserInfoResponse\n\t8,  // 17: user.v1.User.CreateUser:output_type -> user.v1.UserInfoResponse\n\t15, // 18: user.v1.User.UpdateUser:output_type -> google.protobuf.Empty\n\t6,  // 19: user.v1.User.CheckPassword:output_type -> user.v1.CheckResponse\n\t2,  // 20: user.v1.User.ListAddress:output_type -> user.v1.ListAddressReply\n\t1,  // 21: user.v1.User.CreateAddress:output_type -> user.v1.AddressInfo\n\t6,  // 22: user.v1.User.UpdateAddress:output_type -> user.v1.CheckResponse\n\t6,  // 23: user.v1.User.DefaultAddress:output_type -> user.v1.CheckResponse\n\t6,  // 24: user.v1.User.DeleteAddress:output_type -> user.v1.CheckResponse\n\t1,  // 25: user.v1.User.GetAddress:output_type -> user.v1.AddressInfo\n\t14, // [14:26] is the sub-list for method output_type\n\t2,  // [2:14] is the sub-list for method input_type\n\t2,  // [2:2] is the sub-list for extension type_name\n\t2,  // [2:2] is the sub-list for extension extendee\n\t0,  // [0:2] is the sub-list for field type_name\n}\n\nfunc init() { file_api_user_v1_user_proto_init() }\nfunc file_api_user_v1_user_proto_init() {\n\tif File_api_user_v1_user_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_api_user_v1_user_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListAddressReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_user_v1_user_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AddressInfo); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_user_v1_user_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListAddressReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_user_v1_user_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CreateAddressReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_user_v1_user_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*UpdateAddressReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_user_v1_user_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AddressReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_user_v1_user_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CheckResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_user_v1_user_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*PageInfo); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_user_v1_user_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*UserInfoResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_user_v1_user_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*UserListResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_user_v1_user_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MobileRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_user_v1_user_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*IdRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_user_v1_user_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CreateUserInfo); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_user_v1_user_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*UpdateUserInfo); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_user_v1_user_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*PasswordCheckInfo); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_api_user_v1_user_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   15,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_api_user_v1_user_proto_goTypes,\n\t\tDependencyIndexes: file_api_user_v1_user_proto_depIdxs,\n\t\tMessageInfos:      file_api_user_v1_user_proto_msgTypes,\n\t}.Build()\n\tFile_api_user_v1_user_proto = out.File\n\tfile_api_user_v1_user_proto_rawDesc = nil\n\tfile_api_user_v1_user_proto_goTypes = nil\n\tfile_api_user_v1_user_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "service/user/api/user/v1/user.pb.validate.go",
    "content": "// Code generated by protoc-gen-validate. DO NOT EDIT.\n// source: api/user/v1/user.proto\n\npackage v1\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"net/mail\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"sort\"\n\t\"strings\"\n\t\"time\"\n\t\"unicode/utf8\"\n\n\t\"google.golang.org/protobuf/types/known/anypb\"\n)\n\n// ensure the imports are used\nvar (\n\t_ = bytes.MinRead\n\t_ = errors.New(\"\")\n\t_ = fmt.Print\n\t_ = utf8.UTFMax\n\t_ = (*regexp.Regexp)(nil)\n\t_ = (*strings.Reader)(nil)\n\t_ = net.IPv4len\n\t_ = time.Duration(0)\n\t_ = (*url.URL)(nil)\n\t_ = (*mail.Address)(nil)\n\t_ = anypb.Any{}\n\t_ = sort.Sort\n)\n\n// Validate checks the field values on ListAddressReq with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *ListAddressReq) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on ListAddressReq with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in ListAddressReqMultiError,\n// or nil if none found.\nfunc (m *ListAddressReq) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *ListAddressReq) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Uid\n\n\tif len(errors) > 0 {\n\t\treturn ListAddressReqMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// ListAddressReqMultiError is an error wrapping multiple validation errors\n// returned by ListAddressReq.ValidateAll() if the designated constraints\n// aren't met.\ntype ListAddressReqMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m ListAddressReqMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m ListAddressReqMultiError) AllErrors() []error { return m }\n\n// ListAddressReqValidationError is the validation error returned by\n// ListAddressReq.Validate if the designated constraints aren't met.\ntype ListAddressReqValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e ListAddressReqValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e ListAddressReqValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e ListAddressReqValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e ListAddressReqValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e ListAddressReqValidationError) ErrorName() string { return \"ListAddressReqValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e ListAddressReqValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sListAddressReq.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = ListAddressReqValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = ListAddressReqValidationError{}\n\n// Validate checks the field values on AddressInfo with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *AddressInfo) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on AddressInfo with the rules defined in\n// the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in AddressInfoMultiError, or\n// nil if none found.\nfunc (m *AddressInfo) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *AddressInfo) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for Name\n\n\t// no validation rules for Mobile\n\n\t// no validation rules for Province\n\n\t// no validation rules for City\n\n\t// no validation rules for Districts\n\n\t// no validation rules for Address\n\n\t// no validation rules for PostCode\n\n\t// no validation rules for IsDefault\n\n\tif len(errors) > 0 {\n\t\treturn AddressInfoMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// AddressInfoMultiError is an error wrapping multiple validation errors\n// returned by AddressInfo.ValidateAll() if the designated constraints aren't met.\ntype AddressInfoMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m AddressInfoMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m AddressInfoMultiError) AllErrors() []error { return m }\n\n// AddressInfoValidationError is the validation error returned by\n// AddressInfo.Validate if the designated constraints aren't met.\ntype AddressInfoValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e AddressInfoValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e AddressInfoValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e AddressInfoValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e AddressInfoValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e AddressInfoValidationError) ErrorName() string { return \"AddressInfoValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e AddressInfoValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sAddressInfo.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = AddressInfoValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = AddressInfoValidationError{}\n\n// Validate checks the field values on ListAddressReply with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *ListAddressReply) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on ListAddressReply with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// ListAddressReplyMultiError, or nil if none found.\nfunc (m *ListAddressReply) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *ListAddressReply) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\tfor idx, item := range m.GetResults() {\n\t\t_, _ = idx, item\n\n\t\tif all {\n\t\t\tswitch v := interface{}(item).(type) {\n\t\t\tcase interface{ ValidateAll() error }:\n\t\t\t\tif err := v.ValidateAll(); err != nil {\n\t\t\t\t\terrors = append(errors, ListAddressReplyValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"Results[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\tcase interface{ Validate() error }:\n\t\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\t\terrors = append(errors, ListAddressReplyValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"Results[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t} else if v, ok := interface{}(item).(interface{ Validate() error }); ok {\n\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\treturn ListAddressReplyValidationError{\n\t\t\t\t\tfield:  fmt.Sprintf(\"Results[%v]\", idx),\n\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\tcause:  err,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn ListAddressReplyMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// ListAddressReplyMultiError is an error wrapping multiple validation errors\n// returned by ListAddressReply.ValidateAll() if the designated constraints\n// aren't met.\ntype ListAddressReplyMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m ListAddressReplyMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m ListAddressReplyMultiError) AllErrors() []error { return m }\n\n// ListAddressReplyValidationError is the validation error returned by\n// ListAddressReply.Validate if the designated constraints aren't met.\ntype ListAddressReplyValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e ListAddressReplyValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e ListAddressReplyValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e ListAddressReplyValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e ListAddressReplyValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e ListAddressReplyValidationError) ErrorName() string { return \"ListAddressReplyValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e ListAddressReplyValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sListAddressReply.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = ListAddressReplyValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = ListAddressReplyValidationError{}\n\n// Validate checks the field values on CreateAddressReq with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *CreateAddressReq) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CreateAddressReq with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// CreateAddressReqMultiError, or nil if none found.\nfunc (m *CreateAddressReq) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CreateAddressReq) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Uid\n\n\t// no validation rules for Name\n\n\t// no validation rules for Mobile\n\n\t// no validation rules for Province\n\n\t// no validation rules for City\n\n\t// no validation rules for Districts\n\n\t// no validation rules for Address\n\n\t// no validation rules for PostCode\n\n\t// no validation rules for IsDefault\n\n\tif len(errors) > 0 {\n\t\treturn CreateAddressReqMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CreateAddressReqMultiError is an error wrapping multiple validation errors\n// returned by CreateAddressReq.ValidateAll() if the designated constraints\n// aren't met.\ntype CreateAddressReqMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CreateAddressReqMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CreateAddressReqMultiError) AllErrors() []error { return m }\n\n// CreateAddressReqValidationError is the validation error returned by\n// CreateAddressReq.Validate if the designated constraints aren't met.\ntype CreateAddressReqValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CreateAddressReqValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CreateAddressReqValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CreateAddressReqValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CreateAddressReqValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CreateAddressReqValidationError) ErrorName() string { return \"CreateAddressReqValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e CreateAddressReqValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCreateAddressReq.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CreateAddressReqValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CreateAddressReqValidationError{}\n\n// Validate checks the field values on UpdateAddressReq with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *UpdateAddressReq) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on UpdateAddressReq with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// UpdateAddressReqMultiError, or nil if none found.\nfunc (m *UpdateAddressReq) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *UpdateAddressReq) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Uid\n\n\t// no validation rules for Name\n\n\t// no validation rules for Mobile\n\n\t// no validation rules for Province\n\n\t// no validation rules for City\n\n\t// no validation rules for Districts\n\n\t// no validation rules for Address\n\n\t// no validation rules for PostCode\n\n\t// no validation rules for IsDefault\n\n\t// no validation rules for Id\n\n\tif len(errors) > 0 {\n\t\treturn UpdateAddressReqMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// UpdateAddressReqMultiError is an error wrapping multiple validation errors\n// returned by UpdateAddressReq.ValidateAll() if the designated constraints\n// aren't met.\ntype UpdateAddressReqMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m UpdateAddressReqMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m UpdateAddressReqMultiError) AllErrors() []error { return m }\n\n// UpdateAddressReqValidationError is the validation error returned by\n// UpdateAddressReq.Validate if the designated constraints aren't met.\ntype UpdateAddressReqValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e UpdateAddressReqValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e UpdateAddressReqValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e UpdateAddressReqValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e UpdateAddressReqValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e UpdateAddressReqValidationError) ErrorName() string { return \"UpdateAddressReqValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e UpdateAddressReqValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sUpdateAddressReq.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = UpdateAddressReqValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = UpdateAddressReqValidationError{}\n\n// Validate checks the field values on AddressReq with the rules defined in the\n// proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *AddressReq) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on AddressReq with the rules defined in\n// the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in AddressReqMultiError, or\n// nil if none found.\nfunc (m *AddressReq) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *AddressReq) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for Uid\n\n\tif len(errors) > 0 {\n\t\treturn AddressReqMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// AddressReqMultiError is an error wrapping multiple validation errors\n// returned by AddressReq.ValidateAll() if the designated constraints aren't met.\ntype AddressReqMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m AddressReqMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m AddressReqMultiError) AllErrors() []error { return m }\n\n// AddressReqValidationError is the validation error returned by\n// AddressReq.Validate if the designated constraints aren't met.\ntype AddressReqValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e AddressReqValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e AddressReqValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e AddressReqValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e AddressReqValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e AddressReqValidationError) ErrorName() string { return \"AddressReqValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e AddressReqValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sAddressReq.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = AddressReqValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = AddressReqValidationError{}\n\n// Validate checks the field values on CheckResponse with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *CheckResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CheckResponse with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in CheckResponseMultiError, or\n// nil if none found.\nfunc (m *CheckResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CheckResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Success\n\n\tif len(errors) > 0 {\n\t\treturn CheckResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CheckResponseMultiError is an error wrapping multiple validation errors\n// returned by CheckResponse.ValidateAll() if the designated constraints\n// aren't met.\ntype CheckResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CheckResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CheckResponseMultiError) AllErrors() []error { return m }\n\n// CheckResponseValidationError is the validation error returned by\n// CheckResponse.Validate if the designated constraints aren't met.\ntype CheckResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CheckResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CheckResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CheckResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CheckResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CheckResponseValidationError) ErrorName() string { return \"CheckResponseValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e CheckResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCheckResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CheckResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CheckResponseValidationError{}\n\n// Validate checks the field values on PageInfo with the rules defined in the\n// proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *PageInfo) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on PageInfo with the rules defined in\n// the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in PageInfoMultiError, or nil\n// if none found.\nfunc (m *PageInfo) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *PageInfo) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Pn\n\n\t// no validation rules for PSize\n\n\tif len(errors) > 0 {\n\t\treturn PageInfoMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// PageInfoMultiError is an error wrapping multiple validation errors returned\n// by PageInfo.ValidateAll() if the designated constraints aren't met.\ntype PageInfoMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m PageInfoMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m PageInfoMultiError) AllErrors() []error { return m }\n\n// PageInfoValidationError is the validation error returned by\n// PageInfo.Validate if the designated constraints aren't met.\ntype PageInfoValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e PageInfoValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e PageInfoValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e PageInfoValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e PageInfoValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e PageInfoValidationError) ErrorName() string { return \"PageInfoValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e PageInfoValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sPageInfo.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = PageInfoValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = PageInfoValidationError{}\n\n// Validate checks the field values on UserInfoResponse with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *UserInfoResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on UserInfoResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// UserInfoResponseMultiError, or nil if none found.\nfunc (m *UserInfoResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *UserInfoResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for Password\n\n\t// no validation rules for Mobile\n\n\t// no validation rules for NickName\n\n\t// no validation rules for Birthday\n\n\t// no validation rules for Gender\n\n\t// no validation rules for Role\n\n\tif len(errors) > 0 {\n\t\treturn UserInfoResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// UserInfoResponseMultiError is an error wrapping multiple validation errors\n// returned by UserInfoResponse.ValidateAll() if the designated constraints\n// aren't met.\ntype UserInfoResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m UserInfoResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m UserInfoResponseMultiError) AllErrors() []error { return m }\n\n// UserInfoResponseValidationError is the validation error returned by\n// UserInfoResponse.Validate if the designated constraints aren't met.\ntype UserInfoResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e UserInfoResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e UserInfoResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e UserInfoResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e UserInfoResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e UserInfoResponseValidationError) ErrorName() string { return \"UserInfoResponseValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e UserInfoResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sUserInfoResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = UserInfoResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = UserInfoResponseValidationError{}\n\n// Validate checks the field values on UserListResponse with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *UserListResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on UserListResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// UserListResponseMultiError, or nil if none found.\nfunc (m *UserListResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *UserListResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Total\n\n\tfor idx, item := range m.GetData() {\n\t\t_, _ = idx, item\n\n\t\tif all {\n\t\t\tswitch v := interface{}(item).(type) {\n\t\t\tcase interface{ ValidateAll() error }:\n\t\t\t\tif err := v.ValidateAll(); err != nil {\n\t\t\t\t\terrors = append(errors, UserListResponseValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"Data[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\tcase interface{ Validate() error }:\n\t\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\t\terrors = append(errors, UserListResponseValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"Data[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t} else if v, ok := interface{}(item).(interface{ Validate() error }); ok {\n\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\treturn UserListResponseValidationError{\n\t\t\t\t\tfield:  fmt.Sprintf(\"Data[%v]\", idx),\n\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\tcause:  err,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn UserListResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// UserListResponseMultiError is an error wrapping multiple validation errors\n// returned by UserListResponse.ValidateAll() if the designated constraints\n// aren't met.\ntype UserListResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m UserListResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m UserListResponseMultiError) AllErrors() []error { return m }\n\n// UserListResponseValidationError is the validation error returned by\n// UserListResponse.Validate if the designated constraints aren't met.\ntype UserListResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e UserListResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e UserListResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e UserListResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e UserListResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e UserListResponseValidationError) ErrorName() string { return \"UserListResponseValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e UserListResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sUserListResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = UserListResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = UserListResponseValidationError{}\n\n// Validate checks the field values on MobileRequest with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *MobileRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on MobileRequest with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in MobileRequestMultiError, or\n// nil if none found.\nfunc (m *MobileRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *MobileRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Mobile\n\n\tif len(errors) > 0 {\n\t\treturn MobileRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// MobileRequestMultiError is an error wrapping multiple validation errors\n// returned by MobileRequest.ValidateAll() if the designated constraints\n// aren't met.\ntype MobileRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m MobileRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m MobileRequestMultiError) AllErrors() []error { return m }\n\n// MobileRequestValidationError is the validation error returned by\n// MobileRequest.Validate if the designated constraints aren't met.\ntype MobileRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e MobileRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e MobileRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e MobileRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e MobileRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e MobileRequestValidationError) ErrorName() string { return \"MobileRequestValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e MobileRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sMobileRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = MobileRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = MobileRequestValidationError{}\n\n// Validate checks the field values on IdRequest with the rules defined in the\n// proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *IdRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on IdRequest with the rules defined in\n// the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in IdRequestMultiError, or nil\n// if none found.\nfunc (m *IdRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *IdRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\tif len(errors) > 0 {\n\t\treturn IdRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// IdRequestMultiError is an error wrapping multiple validation errors returned\n// by IdRequest.ValidateAll() if the designated constraints aren't met.\ntype IdRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m IdRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m IdRequestMultiError) AllErrors() []error { return m }\n\n// IdRequestValidationError is the validation error returned by\n// IdRequest.Validate if the designated constraints aren't met.\ntype IdRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e IdRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e IdRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e IdRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e IdRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e IdRequestValidationError) ErrorName() string { return \"IdRequestValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e IdRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sIdRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = IdRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = IdRequestValidationError{}\n\n// Validate checks the field values on CreateUserInfo with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *CreateUserInfo) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CreateUserInfo with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in CreateUserInfoMultiError,\n// or nil if none found.\nfunc (m *CreateUserInfo) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CreateUserInfo) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for NickName\n\n\t// no validation rules for Password\n\n\t// no validation rules for Mobile\n\n\tif len(errors) > 0 {\n\t\treturn CreateUserInfoMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CreateUserInfoMultiError is an error wrapping multiple validation errors\n// returned by CreateUserInfo.ValidateAll() if the designated constraints\n// aren't met.\ntype CreateUserInfoMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CreateUserInfoMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CreateUserInfoMultiError) AllErrors() []error { return m }\n\n// CreateUserInfoValidationError is the validation error returned by\n// CreateUserInfo.Validate if the designated constraints aren't met.\ntype CreateUserInfoValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CreateUserInfoValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CreateUserInfoValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CreateUserInfoValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CreateUserInfoValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CreateUserInfoValidationError) ErrorName() string { return \"CreateUserInfoValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e CreateUserInfoValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCreateUserInfo.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CreateUserInfoValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CreateUserInfoValidationError{}\n\n// Validate checks the field values on UpdateUserInfo with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *UpdateUserInfo) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on UpdateUserInfo with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in UpdateUserInfoMultiError,\n// or nil if none found.\nfunc (m *UpdateUserInfo) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *UpdateUserInfo) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for NickName\n\n\t// no validation rules for Gender\n\n\t// no validation rules for Birthday\n\n\tif len(errors) > 0 {\n\t\treturn UpdateUserInfoMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// UpdateUserInfoMultiError is an error wrapping multiple validation errors\n// returned by UpdateUserInfo.ValidateAll() if the designated constraints\n// aren't met.\ntype UpdateUserInfoMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m UpdateUserInfoMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m UpdateUserInfoMultiError) AllErrors() []error { return m }\n\n// UpdateUserInfoValidationError is the validation error returned by\n// UpdateUserInfo.Validate if the designated constraints aren't met.\ntype UpdateUserInfoValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e UpdateUserInfoValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e UpdateUserInfoValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e UpdateUserInfoValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e UpdateUserInfoValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e UpdateUserInfoValidationError) ErrorName() string { return \"UpdateUserInfoValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e UpdateUserInfoValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sUpdateUserInfo.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = UpdateUserInfoValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = UpdateUserInfoValidationError{}\n\n// Validate checks the field values on PasswordCheckInfo with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *PasswordCheckInfo) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on PasswordCheckInfo with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// PasswordCheckInfoMultiError, or nil if none found.\nfunc (m *PasswordCheckInfo) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *PasswordCheckInfo) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Password\n\n\t// no validation rules for EncryptedPassword\n\n\tif len(errors) > 0 {\n\t\treturn PasswordCheckInfoMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// PasswordCheckInfoMultiError is an error wrapping multiple validation errors\n// returned by PasswordCheckInfo.ValidateAll() if the designated constraints\n// aren't met.\ntype PasswordCheckInfoMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m PasswordCheckInfoMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m PasswordCheckInfoMultiError) AllErrors() []error { return m }\n\n// PasswordCheckInfoValidationError is the validation error returned by\n// PasswordCheckInfo.Validate if the designated constraints aren't met.\ntype PasswordCheckInfoValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e PasswordCheckInfoValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e PasswordCheckInfoValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e PasswordCheckInfoValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e PasswordCheckInfoValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e PasswordCheckInfoValidationError) ErrorName() string {\n\treturn \"PasswordCheckInfoValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e PasswordCheckInfoValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sPasswordCheckInfo.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = PasswordCheckInfoValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = PasswordCheckInfoValidationError{}\n"
  },
  {
    "path": "service/user/api/user/v1/user.proto",
    "content": "syntax = \"proto3\";\n\npackage user.v1;\n\nimport \"google/protobuf/empty.proto\";\n\noption go_package = \"user/api/user/v1;v1\";\n\nservice User{\n  rpc GetUserList(PageInfo) returns (UserListResponse){}; // 用户列表\n  rpc GetUserByMobile(MobileRequest) returns (UserInfoResponse){}; // 通过 mobile 查询用户\n  rpc GetUserById(IdRequest) returns (UserInfoResponse){}; // 通过 Id 查询用户\n  rpc CreateUser(CreateUserInfo) returns (UserInfoResponse){}; // 创建用户\n  rpc UpdateUser(UpdateUserInfo) returns (google.protobuf.Empty){}; // 更新用户\n  rpc CheckPassword(PasswordCheckInfo) returns (CheckResponse){}; // 检查用户密码\n\n  // 收货地址\n  rpc ListAddress(ListAddressReq) returns (ListAddressReply) {} // 所有收货地址列表\n  rpc CreateAddress(CreateAddressReq) returns (AddressInfo) {} // 新增收货地址\n  rpc UpdateAddress(UpdateAddressReq) returns (CheckResponse) {} // 修改收货地址\n  rpc DefaultAddress(AddressReq) returns (CheckResponse) {} // 设置默认地址\n  rpc DeleteAddress(AddressReq) returns (CheckResponse) {} // 删除收货地址\n  rpc GetAddress(AddressReq) returns (AddressInfo) {} // 查询收货地址\n}\n\nmessage ListAddressReq {\n  int64 uid = 1;\n}\n\nmessage AddressInfo {\n  int64 id = 1;\n  string name = 2;\n  string mobile = 3;\n  string Province = 4;\n  string City = 5;\n  string Districts = 6;\n  string address = 7;\n  string post_code = 8;\n  int32 is_default = 9;\n}\nmessage ListAddressReply {\n  repeated AddressInfo results = 1;\n}\n\nmessage CreateAddressReq {\n  int64 uid = 1;\n  string name = 2;\n  string mobile = 3;\n  string Province = 4;\n  string City = 5;\n  string Districts = 6;\n  string address = 7;\n  string post_code = 8;\n  int32 is_default = 9;\n}\n\nmessage UpdateAddressReq {\n  int64 uid = 1;\n  string name = 2;\n  string mobile = 3;\n  string Province = 4;\n  string City = 5;\n  string Districts = 6;\n  string address = 7;\n  string post_code = 8;\n  int32 is_default = 9;\n  int64 id = 10;\n}\n\nmessage AddressReq {\n  int64 id = 1;\n  int64 uid = 2;\n}\n\nmessage CheckResponse{\n  bool success = 1;\n}\n\n// 分页\nmessage PageInfo{\n  uint32 pn = 1;\n  uint32 pSize = 2;\n}\n\n// 用户信息\nmessage UserInfoResponse{\n  int64 id = 1;\n  string password = 2;\n  string mobile = 3;\n  string nickName = 4;\n  uint64 birthday = 5;\n  string gender = 6;\n  int32 role = 7;\n}\n\n// 用户列表\nmessage UserListResponse{\n  int32 total = 1;\n  repeated UserInfoResponse data = 2;\n}\n\nmessage MobileRequest{\n  string mobile = 1;\n}\n\nmessage IdRequest{\n  int64 id = 1;\n}\n\n// 创建用户\nmessage  CreateUserInfo{\n  string nickName = 1;\n  string password = 2;\n  string mobile = 3;\n}\n\nmessage  UpdateUserInfo{\n  int64 id = 1;\n  string nickName = 2;\n  string gender = 3;\n  uint64 birthday = 4;\n}\n\nmessage PasswordCheckInfo{\n  string password = 1;\n  string encryptedPassword = 2;\n}"
  },
  {
    "path": "service/user/api/user/v1/user_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.2.0\n// - protoc             v3.19.4\n// source: api/user/v1/user.proto\n\npackage v1\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n\temptypb \"google.golang.org/protobuf/types/known/emptypb\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\n// UserClient is the client API for User service.\n//\n// 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.\ntype UserClient interface {\n\tGetUserList(ctx context.Context, in *PageInfo, opts ...grpc.CallOption) (*UserListResponse, error)\n\tGetUserByMobile(ctx context.Context, in *MobileRequest, opts ...grpc.CallOption) (*UserInfoResponse, error)\n\tGetUserById(ctx context.Context, in *IdRequest, opts ...grpc.CallOption) (*UserInfoResponse, error)\n\tCreateUser(ctx context.Context, in *CreateUserInfo, opts ...grpc.CallOption) (*UserInfoResponse, error)\n\tUpdateUser(ctx context.Context, in *UpdateUserInfo, opts ...grpc.CallOption) (*emptypb.Empty, error)\n\tCheckPassword(ctx context.Context, in *PasswordCheckInfo, opts ...grpc.CallOption) (*CheckResponse, error)\n\t// 收货地址\n\tListAddress(ctx context.Context, in *ListAddressReq, opts ...grpc.CallOption) (*ListAddressReply, error)\n\tCreateAddress(ctx context.Context, in *CreateAddressReq, opts ...grpc.CallOption) (*AddressInfo, error)\n\tUpdateAddress(ctx context.Context, in *UpdateAddressReq, opts ...grpc.CallOption) (*CheckResponse, error)\n\tDefaultAddress(ctx context.Context, in *AddressReq, opts ...grpc.CallOption) (*CheckResponse, error)\n\tDeleteAddress(ctx context.Context, in *AddressReq, opts ...grpc.CallOption) (*CheckResponse, error)\n\tGetAddress(ctx context.Context, in *AddressReq, opts ...grpc.CallOption) (*AddressInfo, error)\n}\n\ntype userClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewUserClient(cc grpc.ClientConnInterface) UserClient {\n\treturn &userClient{cc}\n}\n\nfunc (c *userClient) GetUserList(ctx context.Context, in *PageInfo, opts ...grpc.CallOption) (*UserListResponse, error) {\n\tout := new(UserListResponse)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/GetUserList\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) GetUserByMobile(ctx context.Context, in *MobileRequest, opts ...grpc.CallOption) (*UserInfoResponse, error) {\n\tout := new(UserInfoResponse)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/GetUserByMobile\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) GetUserById(ctx context.Context, in *IdRequest, opts ...grpc.CallOption) (*UserInfoResponse, error) {\n\tout := new(UserInfoResponse)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/GetUserById\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) CreateUser(ctx context.Context, in *CreateUserInfo, opts ...grpc.CallOption) (*UserInfoResponse, error) {\n\tout := new(UserInfoResponse)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/CreateUser\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) UpdateUser(ctx context.Context, in *UpdateUserInfo, opts ...grpc.CallOption) (*emptypb.Empty, error) {\n\tout := new(emptypb.Empty)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/UpdateUser\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) CheckPassword(ctx context.Context, in *PasswordCheckInfo, opts ...grpc.CallOption) (*CheckResponse, error) {\n\tout := new(CheckResponse)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/CheckPassword\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) ListAddress(ctx context.Context, in *ListAddressReq, opts ...grpc.CallOption) (*ListAddressReply, error) {\n\tout := new(ListAddressReply)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/ListAddress\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) CreateAddress(ctx context.Context, in *CreateAddressReq, opts ...grpc.CallOption) (*AddressInfo, error) {\n\tout := new(AddressInfo)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/CreateAddress\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) UpdateAddress(ctx context.Context, in *UpdateAddressReq, opts ...grpc.CallOption) (*CheckResponse, error) {\n\tout := new(CheckResponse)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/UpdateAddress\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) DefaultAddress(ctx context.Context, in *AddressReq, opts ...grpc.CallOption) (*CheckResponse, error) {\n\tout := new(CheckResponse)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/DefaultAddress\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) DeleteAddress(ctx context.Context, in *AddressReq, opts ...grpc.CallOption) (*CheckResponse, error) {\n\tout := new(CheckResponse)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/DeleteAddress\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) GetAddress(ctx context.Context, in *AddressReq, opts ...grpc.CallOption) (*AddressInfo, error) {\n\tout := new(AddressInfo)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/GetAddress\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// UserServer is the server API for User service.\n// All implementations must embed UnimplementedUserServer\n// for forward compatibility\ntype UserServer interface {\n\tGetUserList(context.Context, *PageInfo) (*UserListResponse, error)\n\tGetUserByMobile(context.Context, *MobileRequest) (*UserInfoResponse, error)\n\tGetUserById(context.Context, *IdRequest) (*UserInfoResponse, error)\n\tCreateUser(context.Context, *CreateUserInfo) (*UserInfoResponse, error)\n\tUpdateUser(context.Context, *UpdateUserInfo) (*emptypb.Empty, error)\n\tCheckPassword(context.Context, *PasswordCheckInfo) (*CheckResponse, error)\n\t// 收货地址\n\tListAddress(context.Context, *ListAddressReq) (*ListAddressReply, error)\n\tCreateAddress(context.Context, *CreateAddressReq) (*AddressInfo, error)\n\tUpdateAddress(context.Context, *UpdateAddressReq) (*CheckResponse, error)\n\tDefaultAddress(context.Context, *AddressReq) (*CheckResponse, error)\n\tDeleteAddress(context.Context, *AddressReq) (*CheckResponse, error)\n\tGetAddress(context.Context, *AddressReq) (*AddressInfo, error)\n\tmustEmbedUnimplementedUserServer()\n}\n\n// UnimplementedUserServer must be embedded to have forward compatible implementations.\ntype UnimplementedUserServer struct {\n}\n\nfunc (UnimplementedUserServer) GetUserList(context.Context, *PageInfo) (*UserListResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetUserList not implemented\")\n}\nfunc (UnimplementedUserServer) GetUserByMobile(context.Context, *MobileRequest) (*UserInfoResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetUserByMobile not implemented\")\n}\nfunc (UnimplementedUserServer) GetUserById(context.Context, *IdRequest) (*UserInfoResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetUserById not implemented\")\n}\nfunc (UnimplementedUserServer) CreateUser(context.Context, *CreateUserInfo) (*UserInfoResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method CreateUser not implemented\")\n}\nfunc (UnimplementedUserServer) UpdateUser(context.Context, *UpdateUserInfo) (*emptypb.Empty, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method UpdateUser not implemented\")\n}\nfunc (UnimplementedUserServer) CheckPassword(context.Context, *PasswordCheckInfo) (*CheckResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method CheckPassword not implemented\")\n}\nfunc (UnimplementedUserServer) ListAddress(context.Context, *ListAddressReq) (*ListAddressReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method ListAddress not implemented\")\n}\nfunc (UnimplementedUserServer) CreateAddress(context.Context, *CreateAddressReq) (*AddressInfo, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method CreateAddress not implemented\")\n}\nfunc (UnimplementedUserServer) UpdateAddress(context.Context, *UpdateAddressReq) (*CheckResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method UpdateAddress not implemented\")\n}\nfunc (UnimplementedUserServer) DefaultAddress(context.Context, *AddressReq) (*CheckResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method DefaultAddress not implemented\")\n}\nfunc (UnimplementedUserServer) DeleteAddress(context.Context, *AddressReq) (*CheckResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method DeleteAddress not implemented\")\n}\nfunc (UnimplementedUserServer) GetAddress(context.Context, *AddressReq) (*AddressInfo, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetAddress not implemented\")\n}\nfunc (UnimplementedUserServer) mustEmbedUnimplementedUserServer() {}\n\n// UnsafeUserServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to UserServer will\n// result in compilation errors.\ntype UnsafeUserServer interface {\n\tmustEmbedUnimplementedUserServer()\n}\n\nfunc RegisterUserServer(s grpc.ServiceRegistrar, srv UserServer) {\n\ts.RegisterService(&User_ServiceDesc, srv)\n}\n\nfunc _User_GetUserList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(PageInfo)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).GetUserList(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/GetUserList\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).GetUserList(ctx, req.(*PageInfo))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_GetUserByMobile_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(MobileRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).GetUserByMobile(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/GetUserByMobile\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).GetUserByMobile(ctx, req.(*MobileRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_GetUserById_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(IdRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).GetUserById(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/GetUserById\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).GetUserById(ctx, req.(*IdRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_CreateUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(CreateUserInfo)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).CreateUser(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/CreateUser\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).CreateUser(ctx, req.(*CreateUserInfo))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_UpdateUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(UpdateUserInfo)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).UpdateUser(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/UpdateUser\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).UpdateUser(ctx, req.(*UpdateUserInfo))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_CheckPassword_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(PasswordCheckInfo)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).CheckPassword(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/CheckPassword\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).CheckPassword(ctx, req.(*PasswordCheckInfo))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_ListAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(ListAddressReq)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).ListAddress(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/ListAddress\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).ListAddress(ctx, req.(*ListAddressReq))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_CreateAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(CreateAddressReq)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).CreateAddress(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/CreateAddress\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).CreateAddress(ctx, req.(*CreateAddressReq))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_UpdateAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(UpdateAddressReq)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).UpdateAddress(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/UpdateAddress\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).UpdateAddress(ctx, req.(*UpdateAddressReq))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_DefaultAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(AddressReq)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).DefaultAddress(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/DefaultAddress\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).DefaultAddress(ctx, req.(*AddressReq))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_DeleteAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(AddressReq)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).DeleteAddress(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/DeleteAddress\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).DeleteAddress(ctx, req.(*AddressReq))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_GetAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(AddressReq)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).GetAddress(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/GetAddress\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).GetAddress(ctx, req.(*AddressReq))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// User_ServiceDesc is the grpc.ServiceDesc for User service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar User_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"user.v1.User\",\n\tHandlerType: (*UserServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetUserList\",\n\t\t\tHandler:    _User_GetUserList_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetUserByMobile\",\n\t\t\tHandler:    _User_GetUserByMobile_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetUserById\",\n\t\t\tHandler:    _User_GetUserById_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"CreateUser\",\n\t\t\tHandler:    _User_CreateUser_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"UpdateUser\",\n\t\t\tHandler:    _User_UpdateUser_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"CheckPassword\",\n\t\t\tHandler:    _User_CheckPassword_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"ListAddress\",\n\t\t\tHandler:    _User_ListAddress_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"CreateAddress\",\n\t\t\tHandler:    _User_CreateAddress_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"UpdateAddress\",\n\t\t\tHandler:    _User_UpdateAddress_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"DefaultAddress\",\n\t\t\tHandler:    _User_DefaultAddress_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"DeleteAddress\",\n\t\t\tHandler:    _User_DeleteAddress_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetAddress\",\n\t\t\tHandler:    _User_GetAddress_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"api/user/v1/user.proto\",\n}\n"
  },
  {
    "path": "service/user/cmd/user/main.go",
    "content": "package main\n\nimport (\n\t\"flag\"\n\t\"github.com/go-kratos/kratos/v2/registry\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"os\"\n\n\t\"github.com/go-kratos/kratos/v2\"\n\t\"github.com/go-kratos/kratos/v2/config\"\n\t\"github.com/go-kratos/kratos/v2/config/file\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"github.com/go-kratos/kratos/v2/middleware/tracing\"\n\t\"github.com/go-kratos/kratos/v2/transport/grpc\"\n\t\"go.opentelemetry.io/otel/exporters/jaeger\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\ttracesdk \"go.opentelemetry.io/otel/sdk/trace\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.4.0\"\n\t\"user/internal/conf\"\n)\n\n// go build -ldflags \"-X main.Version=x.y.z\"\nvar (\n\t// Name is the name of the compiled software.\n\tName = \"shop.user.service\"\n\t// Version is the version of the compiled software.\n\tVersion string\n\t// flagconf is the config flag.\n\tflagconf string\n\n\tid, _ = os.Hostname()\n)\n\nfunc init() {\n\tflag.StringVar(&flagconf, \"conf\", \"../../configs\", \"config path, eg: -conf config.yaml\")\n}\n\nfunc newApp(logger log.Logger, gs *grpc.Server, rr registry.Registrar) *kratos.App {\n\treturn kratos.New(\n\t\tkratos.ID(id+\"user service\"),\n\t\tkratos.Name(Name),\n\t\tkratos.Version(Version),\n\t\tkratos.Metadata(map[string]string{}),\n\t\tkratos.Logger(logger),\n\t\tkratos.Server(\n\t\t\tgs,\n\t\t),\n\t\tkratos.Registrar(rr),\n\t)\n}\n\n// Set global trace provider\nfunc setTracerProvider(url string) error {\n\t// Create the Jaeger exporter\n\texp, err := jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(url)))\n\tif err != nil {\n\t\treturn err\n\t}\n\ttp := tracesdk.NewTracerProvider(\n\t\t// Set the sampling rate based on the parent span to 100%\n\t\ttracesdk.WithSampler(tracesdk.ParentBased(tracesdk.TraceIDRatioBased(1.0))),\n\t\t// Always be sure to batch in production.\n\t\ttracesdk.WithBatcher(exp),\n\t\t// Record information about this application in an Resource.\n\t\ttracesdk.WithResource(resource.NewSchemaless(\n\t\t\tsemconv.ServiceNameKey.String(Name),\n\t\t\tattribute.String(\"env\", \"dev\"),\n\t\t)),\n\t)\n\totel.SetTracerProvider(tp)\n\treturn nil\n}\n\nfunc main() {\n\tflag.Parse()\n\tlogger := log.With(log.NewStdLogger(os.Stdout),\n\t\t\"ts\", log.DefaultTimestamp,\n\t\t\"caller\", log.DefaultCaller,\n\t\t\"service.id\", id,\n\t\t\"service.name\", Name,\n\t\t\"service.version\", Version,\n\t\t\"trace_id\", tracing.TraceID(),\n\t\t\"span_id\", tracing.SpanID(),\n\t)\n\tc := config.New(\n\t\tconfig.WithSource(\n\t\t\tfile.NewSource(flagconf),\n\t\t),\n\t)\n\tdefer c.Close()\n\n\tif err := c.Load(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tvar bc conf.Bootstrap\n\tif err := c.Scan(&bc); err != nil {\n\t\tpanic(err)\n\t}\n\n\tif err := setTracerProvider(bc.Trace.Endpoint); err != nil {\n\t\tpanic(err)\n\t}\n\n\tvar rc conf.Registry\n\tif err := c.Scan(&rc); err != nil {\n\t\tpanic(err)\n\t}\n\n\tapp, cleanup, err := initApp(bc.Server, &rc, bc.Data, logger)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdefer cleanup()\n\n\t// start and wait for stop signal\n\tif err := app.Run(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "service/user/cmd/user/wire.go",
    "content": "//go:build wireinject\n// +build wireinject\n\n// The build tag makes sure the stub is not built in the final build.\n\npackage main\n\nimport (\n\t\"github.com/go-kratos/kratos/v2\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"github.com/google/wire\"\n\t\"user/internal/biz\"\n\t\"user/internal/conf\"\n\t\"user/internal/data\"\n\t\"user/internal/server\"\n\t\"user/internal/service\"\n)\n\n// initApp init kratos application.\nfunc initApp(*conf.Server, *conf.Registry, *conf.Data, log.Logger) (*kratos.App, func(), error) {\n\tpanic(wire.Build(server.ProviderSet, data.ProviderSet, biz.ProviderSet, service.ProviderSet, newApp))\n}\n"
  },
  {
    "path": "service/user/cmd/user/wire_gen.go",
    "content": "// Code generated by Wire. DO NOT EDIT.\n\n//go:generate go run github.com/google/wire/cmd/wire\n//go:build !wireinject\n// +build !wireinject\n\npackage main\n\nimport (\n\t\"github.com/go-kratos/kratos/v2\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"user/internal/biz\"\n\t\"user/internal/conf\"\n\t\"user/internal/data\"\n\t\"user/internal/server\"\n\t\"user/internal/service\"\n)\n\n// Injectors from wire.go:\n\n// initApp init kratos application.\nfunc initApp(confServer *conf.Server, registry *conf.Registry, confData *conf.Data, logger log.Logger) (*kratos.App, func(), error) {\n\tdb := data.NewDB(confData)\n\tclient := data.NewRedis(confData)\n\tdataData, cleanup, err := data.NewData(confData, logger, db, client)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\tuserRepo := data.NewUserRepo(dataData, logger)\n\tuserUsecase := biz.NewUserUsecase(userRepo, logger)\n\taddressRepo := data.NewAddressRepo(dataData, logger)\n\taddressUsecase := biz.NewAddressUsecase(addressRepo, logger)\n\tuserService := service.NewUserService(userUsecase, addressUsecase, logger)\n\tgrpcServer := server.NewGRPCServer(confServer, userService, logger)\n\tregistrar := server.NewRegistrar(registry)\n\tapp := newApp(logger, grpcServer, registrar)\n\treturn app, func() {\n\t\tcleanup()\n\t}, nil\n}\n"
  },
  {
    "path": "service/user/configs/config.yaml",
    "content": "server:\n  http:\n    addr: 0.0.0.0:8000\n    timeout: 1s\n  grpc:\n    addr: 0.0.0.0:50051\n    timeout: 1s\ndata:\n  database:\n    driver: mysql\n    source: root:root@tcp(127.0.0.1:3306)/shop_user?charset=utf8mb4&parseTime=True&loc=Local\n  redis:\n    addr: 127.0.0.1:6379\n    dial_timeout: 1s\n    read_timeout: 0.2s\n    write_timeout: 0.2s\ntrace:\n  endpoint: http://127.0.0.1:14268/api/traces\n"
  },
  {
    "path": "service/user/configs/registry.yaml",
    "content": "consul:\n    address: 127.0.0.1:8500\n    scheme: http"
  },
  {
    "path": "service/user/generate.go",
    "content": "package generate\n\n//go:generate kratos proto client api\n"
  },
  {
    "path": "service/user/go.mod",
    "content": "module user\n\ngo 1.16\n\nrequire (\n\tgithub.com/anaskhan96/go-password-encoder v0.0.0-20201010210601-c765b799fd72\n\tgithub.com/armon/go-metrics v0.3.10 // indirect\n\tgithub.com/fatih/color v1.13.0 // indirect\n\tgithub.com/go-kratos/kratos/contrib/registry/consul/v2 v2.0.0-20220131005031-86b8b6c366b9\n\tgithub.com/go-kratos/kratos/v2 v2.1.5\n\tgithub.com/go-redis/redis/extra/redisotel v0.3.0\n\tgithub.com/go-redis/redis/v8 v8.11.4\n\tgithub.com/golang/mock v1.6.0\n\tgithub.com/golang/protobuf v1.5.2\n\tgithub.com/google/btree v1.0.0 // indirect\n\tgithub.com/google/go-cmp v0.5.7 // indirect\n\tgithub.com/google/wire v0.5.0\n\tgithub.com/hashicorp/consul/api v1.12.0\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.0.0 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-uuid v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v0.5.4 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/lib/pq v1.0.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.11 // indirect\n\tgithub.com/mitchellh/mapstructure v1.4.2 // indirect\n\tgithub.com/onsi/ginkgo v1.16.5\n\tgithub.com/onsi/ginkgo/v2 v2.1.3 // indirect\n\tgithub.com/onsi/gomega v1.18.1\n\tgithub.com/ory/dockertest/v3 v3.8.1\n\tgithub.com/pkg/errors v0.9.1\n\tgithub.com/stretchr/objx v0.2.0 // indirect\n\tgo.opentelemetry.io/otel v1.3.0\n\tgo.opentelemetry.io/otel/exporters/jaeger v1.3.0\n\tgo.opentelemetry.io/otel/sdk v1.3.0\n\tgolang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e // indirect\n\tgolang.org/x/net v0.0.0-20210805182204-aaa1db679c0d // indirect\n\tgoogle.golang.org/genproto v0.0.0-20220118154757-00ab72f36ad5 // indirect\n\tgoogle.golang.org/grpc v1.43.0\n\tgoogle.golang.org/protobuf v1.27.1\n\tgopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect\n\tgorm.io/driver/mysql v1.2.3\n\tgorm.io/gorm v1.22.5\n)\n"
  },
  {
    "path": "service/user/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ngithub.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8=\ngithub.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/Microsoft/go-winio v0.5.1 h1:aPJp2QD7OOrhO5tQXqQoGSJc+DjDtWTGLOmNyAm6FgY=\ngithub.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=\ngithub.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw=\ngithub.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk=\ngithub.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=\ngithub.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/anaskhan96/go-password-encoder v0.0.0-20201010210601-c765b799fd72 h1:a93gW7OBt55SksMQVibqPWdu4Ly73KM4d3zoIUUX3cs=\ngithub.com/anaskhan96/go-password-encoder v0.0.0-20201010210601-c765b799fd72/go.mod h1:PsJICrlruG9QcJDYuZ0dO/2KtMDALzRbony8NkxZ2nE=\ngithub.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.3.10 h1:FR+drcQStOe+32sYyJYyZ7FIdgoGGBnwLl+flodp8Uo=\ngithub.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA=\ngithub.com/cenkalti/backoff/v4 v4.1.2 h1:6Yo7N8UP2K6LWZnW94DLVSSrbobcWdVzAYOisuDPIFo=\ngithub.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=\ngithub.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=\ngithub.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ=\ngithub.com/containerd/continuity v0.0.0-20190827140505-75bee3e2ccb6 h1:NmTXa/uVnDyp0TY5MKi197+3HWcnYWfnHGyaFthlnGw=\ngithub.com/containerd/continuity v0.0.0-20190827140505-75bee3e2ccb6/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=\ngithub.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=\ngithub.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw=\ngithub.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/docker/cli v20.10.11+incompatible h1:tXU1ezXcruZQRrMP8RN2z9N91h+6egZTS1gsPsKantc=\ngithub.com/docker/cli v20.10.11+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=\ngithub.com/docker/docker v20.10.7+incompatible h1:Z6O9Nhsjv+ayUEeI1IojKbYcsGdgYSNqxe1s2MYzUhQ=\ngithub.com/docker/docker v20.10.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=\ngithub.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=\ngithub.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=\ngithub.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw=\ngithub.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=\ngithub.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=\ngithub.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=\ngithub.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=\ngithub.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=\ngithub.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kratos/aegis v0.1.1/go.mod h1:jYeSQ3Gesba478zEnujOiG5QdsyF3Xk/8owFUeKcHxw=\ngithub.com/go-kratos/kratos/contrib/registry/consul/v2 v2.0.0-20220131005031-86b8b6c366b9 h1:Fyt7/DhfAD8rXCjG2Osp7ifTf/2Bm7gWBEi5EA1oRCM=\ngithub.com/go-kratos/kratos/contrib/registry/consul/v2 v2.0.0-20220131005031-86b8b6c366b9/go.mod h1:gCxmEdB6yLypq2c14QMH6JgvbNxsF4eqxqHQTMogVKA=\ngithub.com/go-kratos/kratos/v2 v2.1.5 h1:q8kTXyY1KkNJS3tmhvGUJfysipM5AIuoJaXBEvDBnFI=\ngithub.com/go-kratos/kratos/v2 v2.1.5/go.mod h1:zMonCKAf8+He4b9NQ/QHr20tMznd4NO5XrNds36w/5k=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.2.1 h1:DX7uPQ4WgAWfoh+NGGlbJQswnYIVvz0SRlLS3rPZQDA=\ngithub.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/stdr v1.2.0 h1:j4LrlVXgrbIWO83mmQUnK0Hi+YnbD+vzrE1z/EphbFE=\ngithub.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI=\ngithub.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=\ngithub.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=\ngithub.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=\ngithub.com/go-playground/form/v4 v4.2.0 h1:N1wh+Goz61e6w66vo8vJkQt+uwZSoLz50kZPJWR8eic=\ngithub.com/go-playground/form/v4 v4.2.0/go.mod h1:q1a2BY+AQUUzhl6xA/6hBetay6dEIhMHjgvJiGo6K7U=\ngithub.com/go-redis/redis/extra/rediscmd v0.2.0 h1:A3bhCsCKsedClEH9/jYlcKqOuBoeeV+H0yDie5t+a6w=\ngithub.com/go-redis/redis/extra/rediscmd v0.2.0/go.mod h1:Z5bP1EHl9PvWhx/DupfCdZwB0JgOO3aVxWc/PFux+BE=\ngithub.com/go-redis/redis/extra/redisotel v0.3.0 h1:8rrizwFAUUeMgmelyiQi9KeFwmpQhay9E+/rE6qHsBM=\ngithub.com/go-redis/redis/extra/redisotel v0.3.0/go.mod h1:sGV3dQnPMBUuqzowEP2nZPhLXCMeh83nY64yaju249c=\ngithub.com/go-redis/redis/v8 v8.3.2/go.mod h1:jszGxBCez8QA1HWSmQxJO9Y82kNibbUmeYhKWrBejTU=\ngithub.com/go-redis/redis/v8 v8.5.0/go.mod h1:YmEcgBDttjnkbMzDAhDtQxY9yVA7jMN6PCR5HeMvqFE=\ngithub.com/go-redis/redis/v8 v8.11.4 h1:kHoYkfZP6+pe04aFTnhDH6GDROa5yJdHJVNxV3F46Tg=\ngithub.com/go-redis/redis/v8 v8.11.4/go.mod h1:2Z2wHZXdQpCDXEGzqMockDpNyYvi2l4Pxt6RJr792+w=\ngithub.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=\ngithub.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=\ngithub.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=\ngithub.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=\ngithub.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=\ngithub.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/wire v0.5.0 h1:I7ELFeVBr3yfPIcc8+MWvrjk+3VjbcSzoXm3JVa+jD8=\ngithub.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU=\ngithub.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=\ngithub.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=\ngithub.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=\ngithub.com/hashicorp/consul/api v1.9.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M=\ngithub.com/hashicorp/consul/api v1.12.0 h1:k3y1FYv6nuKyNTqj6w9gXOx5r5CfLj/k/euUeBXj1OY=\ngithub.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0=\ngithub.com/hashicorp/consul/sdk v0.8.0 h1:OJtKBtEjboEZvG6AOUdh4Z1Zbyu0WcxQ0qatRrZHTVU=\ngithub.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms=\ngithub.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.0.0 h1:bkKf0BeBXcSYa7f5Fyi9gMuQ8gNsxeiNpZjR6VxNZeo=\ngithub.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=\ngithub.com/hashicorp/memberlist v0.3.0 h1:8+567mCcFDnS5ADl7lrpxPMWiFCElyUEeW0gtj34fMA=\ngithub.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=\ngithub.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk=\ngithub.com/hashicorp/serf v0.9.6 h1:uuEX1kLR6aoda1TBttmJQKDLZE1Ob7KN0NPdE7EtCDc=\ngithub.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4=\ngithub.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=\ngithub.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=\ngithub.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.3/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/jinzhu/now v1.1.4 h1:tHnRBy1i5F2Dh8BAFxqFzxKqqvezXrL2OW1TnX+Mlas=\ngithub.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/lib/pq v0.0.0-20180327071824-d34b9ff171c2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=\ngithub.com/lib/pq v1.0.0 h1:X5PMW56eZitiTeO7tKzZxFCSpbFZJtkMMooicw2us9A=\ngithub.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.11 h1:nQ+aFkoE2TMGc0b68U2OKSexC+eq46+XwZzWXHRmPYs=\ngithub.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0=\ngithub.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.4.2 h1:6h7AQ0yhTcIsmFmnAwQls75jp2Gzs4iB8W7pjMO+rqo=\ngithub.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A=\ngithub.com/moby/term v0.0.0-20201216013528-df9cb8a40635 h1:rzf0wL0CHVc8CEsgyygG0Mn9CNCCPZqOPaz8RiiHYQk=\ngithub.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=\ngithub.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=\ngithub.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=\ngithub.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=\ngithub.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=\ngithub.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=\ngithub.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg=\ngithub.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=\ngithub.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=\ngithub.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=\ngithub.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=\ngithub.com/onsi/ginkgo/v2 v2.1.3 h1:e/3Cwtogj0HA+25nMP1jCMDIf8RtRYbGwGGuBIFztkc=\ngithub.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=\ngithub.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=\ngithub.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=\ngithub.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=\ngithub.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48=\ngithub.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=\ngithub.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=\ngithub.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE=\ngithub.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs=\ngithub.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ=\ngithub.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=\ngithub.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM=\ngithub.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=\ngithub.com/opencontainers/runc v1.0.2 h1:opHZMaswlyxz1OuGpBE53Dwe4/xF7EZTY0A2L/FpCOg=\ngithub.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0=\ngithub.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=\ngithub.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8=\ngithub.com/ory/dockertest/v3 v3.8.1 h1:vU/8d1We4qIad2YM0kOwRVtnyue7ExvacPiw1yDm17g=\ngithub.com/ory/dockertest/v3 v3.8.1/go.mod h1:wSRQ3wmkz+uSARYMk7kVJFDBGm8x5gSxIhI7NDc+BAQ=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=\ngithub.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo=\ngithub.com/shirou/gopsutil/v3 v3.21.8/go.mod h1:YWp/H8Qs5fVmf17v7JNZzA0mPJ+mS2e9JdiUF9LlKzQ=\ngithub.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=\ngithub.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=\ngithub.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=\ngithub.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=\ngithub.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48=\ngithub.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=\ngithub.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs=\ngithub.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=\ngithub.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE=\ngithub.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU=\ngithub.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c=\ngithub.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=\ngithub.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=\ngithub.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=\ngithub.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=\ngithub.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngo.opentelemetry.io/otel v0.13.0/go.mod h1:dlSNewoRYikTkotEnxdmuBHgzT+k/idJSfDv/FxEnOY=\ngo.opentelemetry.io/otel v0.16.0/go.mod h1:e4GKElweB8W2gWUqbghw0B8t5MCTccc9212eNHnOHwA=\ngo.opentelemetry.io/otel v0.17.0/go.mod h1:Oqtdxmf7UtEvL037ohlgnaYa1h7GtMh0NcSd9eqkC9s=\ngo.opentelemetry.io/otel v1.3.0 h1:APxLf0eiBwLl+SOXiJJCVYzA1OOJNyAoV8C5RNRyy7Y=\ngo.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs=\ngo.opentelemetry.io/otel/exporters/jaeger v1.3.0 h1:HfydzioALdtcB26H5WHc4K47iTETJCdloL7VN579/L0=\ngo.opentelemetry.io/otel/exporters/jaeger v1.3.0/go.mod h1:KoYHi1BtkUPncGSRtCe/eh1ijsnePhSkxwzz07vU0Fc=\ngo.opentelemetry.io/otel/metric v0.17.0/go.mod h1:hUz9lH1rNXyEwWAhIWCMFWKhYtpASgSnObJFnU26dJ0=\ngo.opentelemetry.io/otel/oteltest v0.17.0/go.mod h1:JT/LGFxPwpN+nlsTiinSYjdIx3hZIGqHCpChcIZmdoE=\ngo.opentelemetry.io/otel/sdk v1.3.0 h1:3278edCoH89MEJ0Ky8WQXVmDQv3FX4ZJ3Pp+9fJreAI=\ngo.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs=\ngo.opentelemetry.io/otel/trace v0.17.0/go.mod h1:bIujpqg6ZL6xUTubIUgziI1jSaUPthmabA/ygf/6Cfg=\ngo.opentelemetry.io/otel/trace v1.3.0 h1:doy8Hzb1RJ+I3yFhtDmwNc7tIyw1tNMOIsyPzp1NOGY=\ngo.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk=\ngo.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e h1:gsTQYXdTw2Gq7RBsWvlQ91b+aEQ6bXFUngBGuR8sPpI=\ngolang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=\ngolang.org/x/net v0.0.0-20210805182204-aaa1db679c0d h1:20cMwl2fHAzkJMEA+8J4JgqBQcQGzbisXo31MIeenXI=\ngolang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190422233926-fe54fb35175b/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=\ngoogle.golang.org/genproto v0.0.0-20220118154757-00ab72f36ad5 h1:zzNejm+EgrbLfDZ6lu9Uud2IVvHySPl8vQzf04laR5Q=\ngoogle.golang.org/genproto v0.0.0-20220118154757-00ab72f36ad5/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=\ngoogle.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=\ngoogle.golang.org/grpc v1.43.0 h1:Eeu7bZtDZ2DpRCsLhUlcrLnvYaMK1Gz86a+hMVvELmM=\ngoogle.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=\ngopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=\ngopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.2.3 h1:cZqzlOfg5Kf1VIdLC1D9hT6Cy9BgxhExLj/2tIgUe7Y=\ngorm.io/driver/mysql v1.2.3/go.mod h1:qsiz+XcAyMrS6QY+X3M9R6b/lKM1imKmcuK9kac5LTo=\ngorm.io/gorm v1.22.4/go.mod h1:1aeVC+pe9ZmvKZban/gW4QPra7PRoTEssyc922qCAkk=\ngorm.io/gorm v1.22.5 h1:lYREBgc02Be/5lSCTuysZZDb6ffL2qrat6fg9CFbvXU=\ngorm.io/gorm v1.22.5/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=\ngotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk=\ngotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0=\ngotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\n"
  },
  {
    "path": "service/user/internal/biz/README.md",
    "content": "# Biz\n"
  },
  {
    "path": "service/user/internal/biz/address.go",
    "content": "package biz\n\nimport (\n\t\"context\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"user/internal/domain\"\n)\n\n//go:generate mockgen -destination=../mocks/mrepo/address.go -package=mrepo . AddressRepo\ntype AddressRepo interface {\n\tCreateAddress(ctx context.Context, a *domain.Address) (*domain.Address, error)\n\tAddressListByUid(ctx context.Context, uid int64) ([]*domain.Address, error)\n\tUpdateAddress(ctx context.Context, a *domain.Address) error\n\tDefaultAddress(ctx context.Context, a *domain.Address) error\n\tDeleteAddress(ctx context.Context, a *domain.Address) error\n\tGetAddress(ctx context.Context, a *domain.Address) (*domain.Address, error)\n}\n\ntype AddressUsecase struct {\n\trepo AddressRepo\n\tlog  *log.Helper\n}\n\nfunc NewAddressUsecase(repo AddressRepo, logger log.Logger) *AddressUsecase {\n\treturn &AddressUsecase{repo: repo, log: log.NewHelper(logger)}\n}\n\nfunc (uc *AddressUsecase) AddAddress(ctx context.Context, a *domain.Address) (*domain.Address, error) {\n\treturn uc.repo.CreateAddress(ctx, a)\n}\n\nfunc (uc *AddressUsecase) AddressListByUid(ctx context.Context, uid int64) ([]*domain.Address, error) {\n\treturn uc.repo.AddressListByUid(ctx, uid)\n}\n\nfunc (uc *AddressUsecase) UpdateAddress(ctx context.Context, a *domain.Address) error {\n\treturn uc.repo.UpdateAddress(ctx, a)\n}\n\nfunc (uc *AddressUsecase) DefaultAddress(ctx context.Context, a *domain.Address) error {\n\treturn uc.repo.DefaultAddress(ctx, a)\n}\n\nfunc (uc *AddressUsecase) DeleteAddress(ctx context.Context, a *domain.Address) error {\n\treturn uc.repo.DeleteAddress(ctx, a)\n}\n\nfunc (uc *AddressUsecase) GetAddress(ctx context.Context, a *domain.Address) (*domain.Address, error) {\n\treturn uc.repo.GetAddress(ctx, a)\n}\n"
  },
  {
    "path": "service/user/internal/biz/address_test.go",
    "content": "package biz_test\n\nimport (\n\t\"github.com/golang/mock/gomock\"\n\t. \"github.com/onsi/ginkgo\"\n\t. \"github.com/onsi/gomega\"\n\t\"user/internal/biz\"\n\t\"user/internal/mocks/mrepo\"\n\t\"user/internal/testdata\"\n)\n\nvar _ = Describe(\"AddressUsecase\", func() {\n\tvar addressCase *biz.AddressUsecase\n\tvar mAddressRepo *mrepo.MockAddressRepo\n\n\tBeforeEach(func() {\n\t\tmAddressRepo = mrepo.NewMockAddressRepo(ctl)\n\t\taddressCase = biz.NewAddressUsecase(mAddressRepo, nil)\n\t})\n\n\tIt(\"Create\", func() {\n\t\tinfo := testdata.Address()\n\t\tmAddressRepo.EXPECT().CreateAddress(ctx, gomock.Any()).Return(info, nil)\n\t\tl, err := addressCase.AddAddress(ctx, info)\n\t\tΩ(err).ShouldNot(HaveOccurred())\n\t\tΩ(err).ToNot(HaveOccurred())\n\t\tΩ(l.Mobile).To(Equal(\"13509876789\"))\n\t})\n\n\tIt(\"List\", func() {\n\t\tmAddressRepo.EXPECT().AddressListByUid(ctx, gomock.Any()).Return(nil, nil)\n\t\t_, err := addressCase.AddressListByUid(ctx, 1)\n\t\tΩ(err).ShouldNot(HaveOccurred())\n\t\tΩ(err).ToNot(HaveOccurred())\n\t})\n\n\tIt(\"Update\", func() {\n\t\tmAddressRepo.EXPECT().UpdateAddress(ctx, gomock.Any()).Return(nil)\n\t\terr := addressCase.UpdateAddress(ctx, nil)\n\t\tΩ(err).ShouldNot(HaveOccurred())\n\t\tΩ(err).ToNot(HaveOccurred())\n\t})\n})\n"
  },
  {
    "path": "service/user/internal/biz/biz.go",
    "content": "package biz\n\nimport (\n\t\"context\"\n\n\t\"github.com/google/wire\"\n)\n\n// ProviderSet is biz providers.\nvar ProviderSet = wire.NewSet(NewUserUsecase, NewAddressUsecase)\n\n//go:generate mockgen -destination=../mocks/usecase/biz.go -package=usecase . Transaction\ntype Transaction interface {\n\tExecTx(context.Context, func(ctx context.Context) error) error\n}\n"
  },
  {
    "path": "service/user/internal/biz/biz_suite_test.go",
    "content": "package biz_test\n\nimport (\n\t\"context\"\n\t\"github.com/golang/mock/gomock\"\n\t. \"github.com/onsi/ginkgo\"\n\t. \"github.com/onsi/gomega\"\n\t\"testing\"\n)\n\nfunc TestBiz(t *testing.T) {\n\tRegisterFailHandler(Fail)\n\tRunSpecs(t, \"biz user test\")\n}\n\nvar ctl *gomock.Controller\nvar cleaner func()\nvar ctx context.Context\n\nvar _ = BeforeEach(func() {\n\tctl = gomock.NewController(GinkgoT())\n\tcleaner = ctl.Finish\n\tctx = context.Background()\n})\nvar _ = AfterEach(func() {\n\t// remove any mocks\n\tcleaner()\n})\n"
  },
  {
    "path": "service/user/internal/biz/user.go",
    "content": "package biz\n\nimport (\n\t\"context\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"gorm.io/gorm\"\n\t\"time\"\n)\n\ntype User struct {\n\tID          int64\n\tMobile      string\n\tPassword    string\n\tNickName    string\n\tBirthday    *time.Time\n\tGender      string\n\tRole        int\n\tCreatedAt   time.Time\n\tUpdatedAt   time.Time\n\tDeletedAt   gorm.DeletedAt\n\tIsDeletedAt bool\n}\n\n//go:generate mockgen -destination=../mocks/mrepo/user.go -package=mrepo . UserRepo\ntype UserRepo interface {\n\tCreateUser(context.Context, *User) (*User, error)\n\tListUser(ctx context.Context, pageNum, pageSize int) ([]*User, int, error)\n\tUserByMobile(ctx context.Context, mobile string) (*User, error)\n\tGetUserById(ctx context.Context, id int64) (*User, error)\n\tUpdateUser(context.Context, *User) (bool, error)\n\tCheckPassword(ctx context.Context, password, encryptedPassword string) (bool, error)\n}\n\ntype UserUsecase struct {\n\trepo UserRepo\n\tlog  *log.Helper\n}\n\nfunc NewUserUsecase(repo UserRepo, logger log.Logger) *UserUsecase {\n\treturn &UserUsecase{repo: repo, log: log.NewHelper(logger)}\n}\n\nfunc (uc *UserUsecase) Create(ctx context.Context, u *User) (*User, error) {\n\treturn uc.repo.CreateUser(ctx, u)\n}\n\nfunc (uc *UserUsecase) List(ctx context.Context, pageNum, pageSize int) ([]*User, int, error) {\n\treturn uc.repo.ListUser(ctx, pageNum, pageSize)\n}\n\nfunc (uc *UserUsecase) UserByMobile(ctx context.Context, mobile string) (*User, error) {\n\treturn uc.repo.UserByMobile(ctx, mobile)\n}\n\nfunc (uc *UserUsecase) UpdateUser(ctx context.Context, user *User) (bool, error) {\n\treturn uc.repo.UpdateUser(ctx, user)\n}\n\nfunc (uc *UserUsecase) CheckPassword(ctx context.Context, password, encryptedPassword string) (bool, error) {\n\treturn uc.repo.CheckPassword(ctx, password, encryptedPassword)\n}\n\nfunc (uc *UserUsecase) UserById(ctx context.Context, id int64) (*User, error) {\n\treturn uc.repo.GetUserById(ctx, id)\n}\n"
  },
  {
    "path": "service/user/internal/biz/user_test.go",
    "content": "package biz_test\n\nimport (\n\t\"github.com/golang/mock/gomock\"\n\t. \"github.com/onsi/ginkgo\"\n\t. \"github.com/onsi/gomega\"\n\t\"user/internal/biz\"\n\t\"user/internal/mocks/mrepo\"\n\t\"user/internal/testdata\"\n)\n\nvar _ = Describe(\"UserUsecase\", func() {\n\tvar userCase *biz.UserUsecase\n\tvar mUserRepo *mrepo.MockUserRepo\n\n\tBeforeEach(func() {\n\t\tmUserRepo = mrepo.NewMockUserRepo(ctl)\n\t\tuserCase = biz.NewUserUsecase(mUserRepo, nil)\n\t})\n\n\tFIt(\"Create\", func() {\n\t\tinfo := testdata.User()\n\t\tmUserRepo.EXPECT().CreateUser(ctx, gomock.Any()).Return(info, nil)\n\t\tl, err := userCase.Create(ctx, info)\n\t\tΩ(err).ShouldNot(HaveOccurred())\n\t\tΩ(err).ToNot(HaveOccurred())\n\t\tΩ(l.ID).To(Equal(int64(1)))\n\t\tΩ(l.Mobile).To(Equal(\"13509876789\"))\n\t})\n\n\tIt(\"List\", func() {\n\t\tinfo := testdata.User()\n\t\tinfo1 := testdata.User()\n\t\tinfo1.ID = 2\n\t\tinfo1.Mobile = \"2323232323\"\n\t\tu := []*biz.User{\n\t\t\tinfo,\n\t\t\tinfo1,\n\t\t}\n\t\tmUserRepo.EXPECT().ListUser(ctx, 1, 1).Return(u, 2, nil)\n\t\tlist, total, err := userCase.List(ctx, 1, 1)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tΩ(err).ToNot(HaveOccurred())\n\t\tΩ(total).Should(Equal(2))\n\t\tΩ(list).ShouldNot(BeEmpty())\n\t\tΩ(list[0].ID).To(Equal(int64(1)))\n\t\tΩ(list[1].ID).To(Equal(int64(2)))\n\t\tΩ(list[0].Mobile).To(Equal(\"13509876789\"))\n\t\tΩ(list[1].Mobile).To(Equal(\"2323232323\"))\n\t})\n})\n"
  },
  {
    "path": "service/user/internal/conf/conf.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.27.1\n// \tprotoc        v3.15.8\n// source: internal/conf/conf.proto\n\npackage conf\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tdurationpb \"google.golang.org/protobuf/types/known/durationpb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Bootstrap struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tServer *Server `protobuf:\"bytes,1,opt,name=s,proto3\" json:\"s,omitempty\"`\n\tData   *Data   `protobuf:\"bytes,2,opt,name=data,proto3\" json:\"data,omitempty\"`\n\tTrace  *Trace  `protobuf:\"bytes,3,opt,name=trace,proto3\" json:\"trace,omitempty\"`\n}\n\nfunc (x *Bootstrap) Reset() {\n\t*x = Bootstrap{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Bootstrap) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Bootstrap) ProtoMessage() {}\n\nfunc (x *Bootstrap) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Bootstrap.ProtoReflect.Descriptor instead.\nfunc (*Bootstrap) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Bootstrap) GetServer() *Server {\n\tif x != nil {\n\t\treturn x.Server\n\t}\n\treturn nil\n}\n\nfunc (x *Bootstrap) GetData() *Data {\n\tif x != nil {\n\t\treturn x.Data\n\t}\n\treturn nil\n}\n\nfunc (x *Bootstrap) GetTrace() *Trace {\n\tif x != nil {\n\t\treturn x.Trace\n\t}\n\treturn nil\n}\n\ntype Server struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tHttp *Server_HTTP `protobuf:\"bytes,1,opt,name=http,proto3\" json:\"http,omitempty\"`\n\tGrpc *Server_GRPC `protobuf:\"bytes,2,opt,name=grpc,proto3\" json:\"grpc,omitempty\"`\n}\n\nfunc (x *Server) Reset() {\n\t*x = Server{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Server) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Server) ProtoMessage() {}\n\nfunc (x *Server) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Server.ProtoReflect.Descriptor instead.\nfunc (*Server) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Server) GetHttp() *Server_HTTP {\n\tif x != nil {\n\t\treturn x.Http\n\t}\n\treturn nil\n}\n\nfunc (x *Server) GetGrpc() *Server_GRPC {\n\tif x != nil {\n\t\treturn x.Grpc\n\t}\n\treturn nil\n}\n\ntype Data struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tDatabase *Data_Database `protobuf:\"bytes,1,opt,name=database,proto3\" json:\"database,omitempty\"`\n\tRedis    *Data_Redis    `protobuf:\"bytes,2,opt,name=redis,proto3\" json:\"redis,omitempty\"`\n}\n\nfunc (x *Data) Reset() {\n\t*x = Data{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Data) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Data) ProtoMessage() {}\n\nfunc (x *Data) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Data.ProtoReflect.Descriptor instead.\nfunc (*Data) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *Data) GetDatabase() *Data_Database {\n\tif x != nil {\n\t\treturn x.Database\n\t}\n\treturn nil\n}\n\nfunc (x *Data) GetRedis() *Data_Redis {\n\tif x != nil {\n\t\treturn x.Redis\n\t}\n\treturn nil\n}\n\ntype Registry struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tConsul *Registry_Consul `protobuf:\"bytes,1,opt,name=consul,proto3\" json:\"consul,omitempty\"`\n}\n\nfunc (x *Registry) Reset() {\n\t*x = Registry{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Registry) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Registry) ProtoMessage() {}\n\nfunc (x *Registry) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Registry.ProtoReflect.Descriptor instead.\nfunc (*Registry) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *Registry) GetConsul() *Registry_Consul {\n\tif x != nil {\n\t\treturn x.Consul\n\t}\n\treturn nil\n}\n\ntype Trace struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEndpoint string `protobuf:\"bytes,1,opt,name=endpoint,proto3\" json:\"endpoint,omitempty\"`\n}\n\nfunc (x *Trace) Reset() {\n\t*x = Trace{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Trace) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Trace) ProtoMessage() {}\n\nfunc (x *Trace) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Trace.ProtoReflect.Descriptor instead.\nfunc (*Trace) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *Trace) GetEndpoint() string {\n\tif x != nil {\n\t\treturn x.Endpoint\n\t}\n\treturn \"\"\n}\n\ntype Server_HTTP struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tNetwork string               `protobuf:\"bytes,1,opt,name=network,proto3\" json:\"network,omitempty\"`\n\tAddr    string               `protobuf:\"bytes,2,opt,name=addr,proto3\" json:\"addr,omitempty\"`\n\tTimeout *durationpb.Duration `protobuf:\"bytes,3,opt,name=timeout,proto3\" json:\"timeout,omitempty\"`\n}\n\nfunc (x *Server_HTTP) Reset() {\n\t*x = Server_HTTP{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Server_HTTP) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Server_HTTP) ProtoMessage() {}\n\nfunc (x *Server_HTTP) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Server_HTTP.ProtoReflect.Descriptor instead.\nfunc (*Server_HTTP) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{1, 0}\n}\n\nfunc (x *Server_HTTP) GetNetwork() string {\n\tif x != nil {\n\t\treturn x.Network\n\t}\n\treturn \"\"\n}\n\nfunc (x *Server_HTTP) GetAddr() string {\n\tif x != nil {\n\t\treturn x.Addr\n\t}\n\treturn \"\"\n}\n\nfunc (x *Server_HTTP) GetTimeout() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.Timeout\n\t}\n\treturn nil\n}\n\ntype Server_GRPC struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tNetwork string               `protobuf:\"bytes,1,opt,name=network,proto3\" json:\"network,omitempty\"`\n\tAddr    string               `protobuf:\"bytes,2,opt,name=addr,proto3\" json:\"addr,omitempty\"`\n\tTimeout *durationpb.Duration `protobuf:\"bytes,3,opt,name=timeout,proto3\" json:\"timeout,omitempty\"`\n}\n\nfunc (x *Server_GRPC) Reset() {\n\t*x = Server_GRPC{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Server_GRPC) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Server_GRPC) ProtoMessage() {}\n\nfunc (x *Server_GRPC) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Server_GRPC.ProtoReflect.Descriptor instead.\nfunc (*Server_GRPC) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{1, 1}\n}\n\nfunc (x *Server_GRPC) GetNetwork() string {\n\tif x != nil {\n\t\treturn x.Network\n\t}\n\treturn \"\"\n}\n\nfunc (x *Server_GRPC) GetAddr() string {\n\tif x != nil {\n\t\treturn x.Addr\n\t}\n\treturn \"\"\n}\n\nfunc (x *Server_GRPC) GetTimeout() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.Timeout\n\t}\n\treturn nil\n}\n\ntype Data_Database struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tDriver string `protobuf:\"bytes,1,opt,name=driver,proto3\" json:\"driver,omitempty\"`\n\tSource string `protobuf:\"bytes,2,opt,name=source,proto3\" json:\"source,omitempty\"`\n}\n\nfunc (x *Data_Database) Reset() {\n\t*x = Data_Database{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Data_Database) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Data_Database) ProtoMessage() {}\n\nfunc (x *Data_Database) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Data_Database.ProtoReflect.Descriptor instead.\nfunc (*Data_Database) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{2, 0}\n}\n\nfunc (x *Data_Database) GetDriver() string {\n\tif x != nil {\n\t\treturn x.Driver\n\t}\n\treturn \"\"\n}\n\nfunc (x *Data_Database) GetSource() string {\n\tif x != nil {\n\t\treturn x.Source\n\t}\n\treturn \"\"\n}\n\ntype Data_Redis struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tNetwork      string               `protobuf:\"bytes,1,opt,name=network,proto3\" json:\"network,omitempty\"`\n\tAddr         string               `protobuf:\"bytes,2,opt,name=addr,proto3\" json:\"addr,omitempty\"`\n\tPassword     string               `protobuf:\"bytes,3,opt,name=password,proto3\" json:\"password,omitempty\"`\n\tDb           int32                `protobuf:\"varint,4,opt,name=db,proto3\" json:\"db,omitempty\"`\n\tDialTimeout  *durationpb.Duration `protobuf:\"bytes,5,opt,name=dial_timeout,json=dialTimeout,proto3\" json:\"dial_timeout,omitempty\"`\n\tReadTimeout  *durationpb.Duration `protobuf:\"bytes,6,opt,name=read_timeout,json=readTimeout,proto3\" json:\"read_timeout,omitempty\"`\n\tWriteTimeout *durationpb.Duration `protobuf:\"bytes,7,opt,name=write_timeout,json=writeTimeout,proto3\" json:\"write_timeout,omitempty\"`\n}\n\nfunc (x *Data_Redis) Reset() {\n\t*x = Data_Redis{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[8]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Data_Redis) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Data_Redis) ProtoMessage() {}\n\nfunc (x *Data_Redis) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[8]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Data_Redis.ProtoReflect.Descriptor instead.\nfunc (*Data_Redis) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{2, 1}\n}\n\nfunc (x *Data_Redis) GetNetwork() string {\n\tif x != nil {\n\t\treturn x.Network\n\t}\n\treturn \"\"\n}\n\nfunc (x *Data_Redis) GetAddr() string {\n\tif x != nil {\n\t\treturn x.Addr\n\t}\n\treturn \"\"\n}\n\nfunc (x *Data_Redis) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *Data_Redis) GetDb() int32 {\n\tif x != nil {\n\t\treturn x.Db\n\t}\n\treturn 0\n}\n\nfunc (x *Data_Redis) GetDialTimeout() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.DialTimeout\n\t}\n\treturn nil\n}\n\nfunc (x *Data_Redis) GetReadTimeout() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.ReadTimeout\n\t}\n\treturn nil\n}\n\nfunc (x *Data_Redis) GetWriteTimeout() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.WriteTimeout\n\t}\n\treturn nil\n}\n\ntype Registry_Consul struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tAddress string `protobuf:\"bytes,1,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tScheme  string `protobuf:\"bytes,2,opt,name=scheme,proto3\" json:\"scheme,omitempty\"`\n}\n\nfunc (x *Registry_Consul) Reset() {\n\t*x = Registry_Consul{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[9]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Registry_Consul) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Registry_Consul) ProtoMessage() {}\n\nfunc (x *Registry_Consul) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[9]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Registry_Consul.ProtoReflect.Descriptor instead.\nfunc (*Registry_Consul) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{3, 0}\n}\n\nfunc (x *Registry_Consul) GetAddress() string {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn \"\"\n}\n\nfunc (x *Registry_Consul) GetScheme() string {\n\tif x != nil {\n\t\treturn x.Scheme\n\t}\n\treturn \"\"\n}\n\nvar File_internal_conf_conf_proto protoreflect.FileDescriptor\n\nvar file_internal_conf_conf_proto_rawDesc = []byte{\n\t0x0a, 0x18, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x2f,\n\t0x63, 0x6f, 0x6e, 0x66, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x6b, 0x72, 0x61, 0x74,\n\t0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x86, 0x01, 0x0a, 0x09, 0x42, 0x6f, 0x6f, 0x74, 0x73,\n\t0x74, 0x72, 0x61, 0x70, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6b, 0x72, 0x61, 0x74, 0x6f, 0x73, 0x2e, 0x61, 0x70,\n\t0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72,\n\t0x12, 0x24, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10,\n\t0x2e, 0x6b, 0x72, 0x61, 0x74, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x61, 0x74, 0x61,\n\t0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x27, 0x0a, 0x05, 0x74, 0x72, 0x61, 0x63, 0x65, 0x18,\n\t0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6b, 0x72, 0x61, 0x74, 0x6f, 0x73, 0x2e, 0x61,\n\t0x70, 0x69, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x52, 0x05, 0x74, 0x72, 0x61, 0x63, 0x65, 0x22,\n\t0xb8, 0x02, 0x0a, 0x06, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x2b, 0x0a, 0x04, 0x68, 0x74,\n\t0x74, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6b, 0x72, 0x61, 0x74, 0x6f,\n\t0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x54, 0x54,\n\t0x50, 0x52, 0x04, 0x68, 0x74, 0x74, 0x70, 0x12, 0x2b, 0x0a, 0x04, 0x67, 0x72, 0x70, 0x63, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6b, 0x72, 0x61, 0x74, 0x6f, 0x73, 0x2e, 0x61,\n\t0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x52, 0x04,\n\t0x67, 0x72, 0x70, 0x63, 0x1a, 0x69, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x12, 0x18, 0x0a, 0x07,\n\t0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e,\n\t0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69,\n\t0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x1a,\n\t0x69, 0x0a, 0x04, 0x47, 0x52, 0x50, 0x43, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f,\n\t0x72, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72,\n\t0x6b, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0xc7, 0x03, 0x0a, 0x04, 0x44,\n\t0x61, 0x74, 0x61, 0x12, 0x35, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6b, 0x72, 0x61, 0x74, 0x6f, 0x73, 0x2e, 0x61,\n\t0x70, 0x69, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65,\n\t0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x05, 0x72, 0x65,\n\t0x64, 0x69, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6b, 0x72, 0x61, 0x74,\n\t0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x64, 0x69,\n\t0x73, 0x52, 0x05, 0x72, 0x65, 0x64, 0x69, 0x73, 0x1a, 0x3a, 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61,\n\t0x62, 0x61, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06,\n\t0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f,\n\t0x75, 0x72, 0x63, 0x65, 0x1a, 0x9d, 0x02, 0x0a, 0x05, 0x52, 0x65, 0x64, 0x69, 0x73, 0x12, 0x18,\n\t0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x1a, 0x0a, 0x08,\n\t0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,\n\t0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x64, 0x62, 0x18, 0x04,\n\t0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x64, 0x62, 0x12, 0x3c, 0x0a, 0x0c, 0x64, 0x69, 0x61, 0x6c,\n\t0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,\n\t0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x6c, 0x54,\n\t0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x74,\n\t0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44,\n\t0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x72, 0x65, 0x61, 0x64, 0x54, 0x69, 0x6d,\n\t0x65, 0x6f, 0x75, 0x74, 0x12, 0x3e, 0x0a, 0x0d, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x74, 0x69,\n\t0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x69, 0x6d,\n\t0x65, 0x6f, 0x75, 0x74, 0x22, 0x7b, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79,\n\t0x12, 0x33, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x1b, 0x2e, 0x6b, 0x72, 0x61, 0x74, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65,\n\t0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x52, 0x06, 0x63,\n\t0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x1a, 0x3a, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x12,\n\t0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68,\n\t0x65, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d,\n\t0x65, 0x22, 0x23, 0x0a, 0x05, 0x54, 0x72, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e,\n\t0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e,\n\t0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x42, 0x19, 0x5a, 0x17, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x69,\n\t0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x3b, 0x63, 0x6f, 0x6e,\n\t0x66, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_internal_conf_conf_proto_rawDescOnce sync.Once\n\tfile_internal_conf_conf_proto_rawDescData = file_internal_conf_conf_proto_rawDesc\n)\n\nfunc file_internal_conf_conf_proto_rawDescGZIP() []byte {\n\tfile_internal_conf_conf_proto_rawDescOnce.Do(func() {\n\t\tfile_internal_conf_conf_proto_rawDescData = protoimpl.X.CompressGZIP(file_internal_conf_conf_proto_rawDescData)\n\t})\n\treturn file_internal_conf_conf_proto_rawDescData\n}\n\nvar file_internal_conf_conf_proto_msgTypes = make([]protoimpl.MessageInfo, 10)\nvar file_internal_conf_conf_proto_goTypes = []interface{}{\n\t(*Bootstrap)(nil),           // 0: kratos.api.Bootstrap\n\t(*Server)(nil),              // 1: kratos.api.Server\n\t(*Data)(nil),                // 2: kratos.api.Data\n\t(*Registry)(nil),            // 3: kratos.api.Registry\n\t(*Trace)(nil),               // 4: kratos.api.Trace\n\t(*Server_HTTP)(nil),         // 5: kratos.api.Server.HTTP\n\t(*Server_GRPC)(nil),         // 6: kratos.api.Server.GRPC\n\t(*Data_Database)(nil),       // 7: kratos.api.Data.Database\n\t(*Data_Redis)(nil),          // 8: kratos.api.Data.Redis\n\t(*Registry_Consul)(nil),     // 9: kratos.api.Registry.Consul\n\t(*durationpb.Duration)(nil), // 10: google.protobuf.Duration\n}\nvar file_internal_conf_conf_proto_depIdxs = []int32{\n\t1,  // 0: kratos.api.Bootstrap.s:type_name -> kratos.api.Server\n\t2,  // 1: kratos.api.Bootstrap.data:type_name -> kratos.api.Data\n\t4,  // 2: kratos.api.Bootstrap.trace:type_name -> kratos.api.Trace\n\t5,  // 3: kratos.api.Server.http:type_name -> kratos.api.Server.HTTP\n\t6,  // 4: kratos.api.Server.grpc:type_name -> kratos.api.Server.GRPC\n\t7,  // 5: kratos.api.Data.database:type_name -> kratos.api.Data.Database\n\t8,  // 6: kratos.api.Data.redis:type_name -> kratos.api.Data.Redis\n\t9,  // 7: kratos.api.Registry.consul:type_name -> kratos.api.Registry.Consul\n\t10, // 8: kratos.api.Server.HTTP.timeout:type_name -> google.protobuf.Duration\n\t10, // 9: kratos.api.Server.GRPC.timeout:type_name -> google.protobuf.Duration\n\t10, // 10: kratos.api.Data.Redis.dial_timeout:type_name -> google.protobuf.Duration\n\t10, // 11: kratos.api.Data.Redis.read_timeout:type_name -> google.protobuf.Duration\n\t10, // 12: kratos.api.Data.Redis.write_timeout:type_name -> google.protobuf.Duration\n\t13, // [13:13] is the sub-list for method output_type\n\t13, // [13:13] is the sub-list for method input_type\n\t13, // [13:13] is the sub-list for extension type_name\n\t13, // [13:13] is the sub-list for extension extendee\n\t0,  // [0:13] is the sub-list for field type_name\n}\n\nfunc init() { file_internal_conf_conf_proto_init() }\nfunc file_internal_conf_conf_proto_init() {\n\tif File_internal_conf_conf_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_internal_conf_conf_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Bootstrap); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Server); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Data); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Registry); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Trace); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Server_HTTP); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Server_GRPC); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Data_Database); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Data_Redis); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Registry_Consul); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_internal_conf_conf_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   10,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_internal_conf_conf_proto_goTypes,\n\t\tDependencyIndexes: file_internal_conf_conf_proto_depIdxs,\n\t\tMessageInfos:      file_internal_conf_conf_proto_msgTypes,\n\t}.Build()\n\tFile_internal_conf_conf_proto = out.File\n\tfile_internal_conf_conf_proto_rawDesc = nil\n\tfile_internal_conf_conf_proto_goTypes = nil\n\tfile_internal_conf_conf_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "service/user/internal/conf/conf.proto",
    "content": "syntax = \"proto3\";\npackage kratos.api;\n\noption go_package = \"user/internal/conf;conf\";\n\nimport \"google/protobuf/duration.proto\";\n\nmessage Bootstrap {\n  Server server = 1;\n  Data data = 2;\n  Trace trace = 3;\n}\n\nmessage Server {\n  message HTTP {\n    string network = 1;\n    string addr = 2;\n    google.protobuf.Duration timeout = 3;\n  }\n  message GRPC {\n    string network = 1;\n    string addr = 2;\n    google.protobuf.Duration timeout = 3;\n  }\n  HTTP http = 1;\n  GRPC grpc = 2;\n}\n\nmessage Data {\n  message Database {\n    string driver = 1;\n    string source = 2;\n  }\n  message Redis {\n    string network = 1;\n    string addr = 2;\n    string password = 3;\n    int32 db = 4;\n    google.protobuf.Duration dial_timeout = 5;\n    google.protobuf.Duration read_timeout = 6;\n    google.protobuf.Duration write_timeout = 7;\n  }\n  Database database = 1;\n  Redis redis = 2;\n}\n\nmessage Registry {\n  message Consul {\n    string address = 1;\n    string scheme = 2;\n  }\n  Consul consul = 1;\n}\n\nmessage Trace {\n  string endpoint = 1;\n}"
  },
  {
    "path": "service/user/internal/data/README.md",
    "content": "# Data\n"
  },
  {
    "path": "service/user/internal/data/address.go",
    "content": "package data\n\nimport (\n\t\"context\"\n\t\"github.com/go-kratos/kratos/v2/errors\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"gorm.io/gorm\"\n\t\"time\"\n\t\"user/internal/biz\"\n\t\"user/internal/domain\"\n)\n\ntype Address struct {\n\tID        int64     `gorm:\"primarykey\"`\n\tUserID    int64     `gorm:\"index:idx_user_id;column:user_id;default:1;type:bigint comment '关联用户ID'\"`\n\tIsDefault int       `gorm:\"column:is_default;default:0;type:tinyint comment '是否是默认'\"`\n\tMobile    string    `gorm:\"index:idx_mobile;type:varchar(11) comment '手机号码';not null\"`\n\tName      string    `gorm:\"type:varchar(25) comment '收货用户名称'\"`\n\tProvince  string    `gorm:\"type:varchar(25) comment '省'\"`\n\tCity      string    `gorm:\"type:varchar(25) comment '市'\"`\n\tDistricts string    `gorm:\"type:varchar(25) comment '区县'\"`\n\tAddress   string    `gorm:\"type:varchar(255) comment '收货详细地址'\"`\n\tPostCode  string    `gorm:\"type:varchar(25) comment '邮编'\"`\n\tCreatedAt time.Time `gorm:\"column:add_time\"`\n\tUpdatedAt time.Time `gorm:\"column:update_time\"`\n\tDeletedAt gorm.DeletedAt\n}\n\nfunc (Address) TableName() string {\n\treturn \"user_addresses\"\n}\n\ntype adderessRepo struct {\n\tdata *Data\n\tlog  *log.Helper\n}\n\n// NewAddressRepo .\nfunc NewAddressRepo(data *Data, logger log.Logger) biz.AddressRepo {\n\treturn &adderessRepo{\n\t\tdata: data,\n\t\tlog:  log.NewHelper(logger),\n\t}\n}\n\nfunc (p *Address) ToDomain() *domain.Address {\n\treturn &domain.Address{\n\t\tID:        p.ID,\n\t\tUserID:    p.UserID,\n\t\tIsDefault: p.IsDefault,\n\t\tMobile:    p.Mobile,\n\t\tName:      p.Name,\n\t\tProvince:  p.Province,\n\t\tCity:      p.City,\n\t\tDistricts: p.Districts,\n\t\tAddress:   p.Address,\n\t\tPostCode:  p.PostCode,\n\t}\n}\n\nfunc (a *adderessRepo) DeleteAddress(ctx context.Context, r *domain.Address) error {\n\tvar address Address\n\tresult := a.data.db.Where(&Address{ID: r.ID}).First(&address)\n\tif errors.Is(result.Error, gorm.ErrRecordNotFound) {\n\t\treturn errors.NotFound(\"ADDRESS_NOT_FOUND\", \"address not found\")\n\t}\n\n\tif result.Error != nil {\n\t\treturn result.Error\n\t}\n\n\tif address.UserID != r.UserID {\n\t\treturn errors.NotFound(\"NOT_USER_ADDRESS_FOR_FOUND\", \"Is not the address of this user\")\n\t}\n\n\tif err := a.data.db.Delete(&address).Error; err != nil {\n\t\treturn errors.New(500, \"DELETE_USER_ADDRESS_ERROR\", \"用户地址删除失败\")\n\t}\n\treturn nil\n}\n\nfunc (a *adderessRepo) DefaultAddress(ctx context.Context, r *domain.Address) error {\n\tvar address, addressOld Address\n\tresCurrDefAdr := a.data.db.Where(&Address{UserID: r.UserID, IsDefault: 1}).First(&addressOld)\n\tif errors.Is(resCurrDefAdr.Error, gorm.ErrRecordNotFound) {\n\t\treturn errors.NotFound(\"USER_ADDRESS_NOT_FOUND\", \"user address not found\")\n\t}\n\n\tif resCurrDefAdr.Error == nil {\n\t\taddressOld.IsDefault = 0\n\t\taddressOld.UpdatedAt = time.Now()\n\t\tif err := a.data.db.Save(&addressOld).Error; err != nil {\n\t\t\treturn errors.NotFound(\"SET_ADDRESS_ERROR\", \"用户地址修改失败\")\n\t\t}\n\t}\n\n\tresult := a.data.db.Where(&Address{ID: r.ID, UserID: r.UserID}).First(&address)\n\tif errors.Is(result.Error, gorm.ErrRecordNotFound) {\n\t\treturn errors.NotFound(\"USER_ADDRESS_NOT_FOUND\", \"user address not found\")\n\t}\n\n\taddress.IsDefault = 1\n\taddress.UpdatedAt = time.Now()\n\tif err := a.data.db.Save(&address).Error; err != nil {\n\t\treturn errors.NotFound(\"SET_ADDRESS_ERROR\", \"用户地址修改失败\")\n\t}\n\treturn nil\n}\n\nfunc (a *adderessRepo) UpdateAddress(ctx context.Context, r *domain.Address) error {\n\tvar address Address\n\t//fmt.Println(r)\n\tresult := a.data.db.Where(&Address{ID: r.ID}).Find(&address)\n\tif errors.Is(result.Error, gorm.ErrRecordNotFound) {\n\t\treturn errors.NotFound(\"USER_ADDRESS_NOT_FOUND\", \"user address not found\")\n\t}\n\n\tif result.Error != nil {\n\t\treturn errors.New(500, \"UPDATE_USER_ADDRESS_ERROR\", \"用户地址更新失败\")\n\t}\n\n\tif address.UserID != r.UserID {\n\t\treturn errors.New(500, \"UPDATE_USER_ADDRESS_ERROR\", \"用户 ID 参数有误\")\n\t}\n\n\taddress.Address = r.Address\n\taddress.City = r.City\n\taddress.Mobile = r.Mobile\n\taddress.Name = r.Name\n\taddress.IsDefault = r.IsDefault\n\taddress.PostCode = r.PostCode\n\taddress.Districts = r.Districts\n\taddress.Province = r.Province\n\taddress.UpdatedAt = time.Now()\n\n\tif err := a.data.db.Save(&address).Error; err != nil {\n\t\treturn errors.New(500, \"UPDATE_USER_ADDRESS_ERROR\", \"用户地址更新失败\")\n\t}\n\treturn nil\n}\n\nfunc (a *adderessRepo) AddressListByUid(ctx context.Context, uid int64) ([]*domain.Address, error) {\n\tvar address []Address\n\tresult := a.data.db.Where(&Address{UserID: uid}).Find(&address)\n\tif errors.Is(result.Error, gorm.ErrRecordNotFound) {\n\t\treturn nil, errors.NotFound(\"USER_ADDRESS_NOT_FOUND\", \"user address not found\")\n\t}\n\n\tif result.Error != nil {\n\t\treturn nil, errors.New(500, \"USER_ADDRESS_LIST_ERROR\", \"查询用户地址列表失败\")\n\t}\n\n\tif result.RowsAffected == 0 {\n\t\treturn nil, errors.NotFound(\"USER_ADDRESS_NOT_FOUND\", \"user address not found\")\n\t}\n\tvar addressList []*domain.Address\n\tfor _, v := range address {\n\t\taddressTmp := modelToBizResponse(v)\n\t\taddressList = append(addressList, addressTmp)\n\t}\n\treturn addressList, nil\n}\n\nfunc (a *adderessRepo) CreateAddress(c context.Context, r *domain.Address) (*domain.Address, error) {\n\taddInfo := Address{\n\t\tUserID:    r.UserID,\n\t\tIsDefault: r.IsDefault,\n\t\tMobile:    r.Mobile,\n\t\tName:      r.Name,\n\t\tProvince:  r.Province,\n\t\tCity:      r.City,\n\t\tDistricts: r.Districts,\n\t\tAddress:   r.Address,\n\t\tPostCode:  r.PostCode,\n\t}\n\n\tresult := a.data.db.Save(&addInfo)\n\n\tif result.Error != nil {\n\t\treturn nil, errors.NotFound(\"CREATE_ADDRESS_NOT_FOUND\", \"创建用户地址失败\")\n\t}\n\n\treturn modelToBizResponse(addInfo), nil\n}\n\nfunc modelToBizResponse(addInfo Address) *domain.Address {\n\treturn &domain.Address{\n\t\tID:        addInfo.ID,\n\t\tUserID:    addInfo.UserID,\n\t\tIsDefault: addInfo.IsDefault,\n\t\tMobile:    addInfo.Mobile,\n\t\tName:      addInfo.Name,\n\t\tProvince:  addInfo.Province,\n\t\tCity:      addInfo.City,\n\t\tDistricts: addInfo.Districts,\n\t\tAddress:   addInfo.Address,\n\t\tPostCode:  addInfo.PostCode,\n\t}\n}\n\nfunc (a *adderessRepo) GetAddress(ctx context.Context, r *domain.Address) (*domain.Address, error) {\n\tvar address Address\n\tresult := a.data.db.Where(&Address{ID: r.ID, UserID: r.UserID}).First(&address)\n\tif errors.Is(result.Error, gorm.ErrRecordNotFound) {\n\t\treturn nil, errors.NotFound(\"USER_ADDRESS_NOT_FOUND\", \"user address not found\")\n\t}\n\treturn address.ToDomain(), nil\n}\n"
  },
  {
    "path": "service/user/internal/data/address_test.go",
    "content": "package data_test\n\nimport (\n\t. \"github.com/onsi/ginkgo\"\n\t. \"github.com/onsi/gomega\"\n\t\"user/internal/biz\"\n\t\"user/internal/data\"\n\t\"user/internal/domain\"\n\t\"user/internal/testdata\"\n)\n\nvar _ = Describe(\"UserAddresses\", func() {\n\t//var ro biz.UserRepo\n\t//var uD *biz.User\n\tvar ao biz.AddressRepo\n\tvar aD *domain.Address\n\n\tBeforeEach(func() {\n\t\tao = data.NewAddressRepo(Db, nil)\n\t\taD = testdata.Address()\n\t})\n\n\tIt(\"CreateAddress\", func() {\n\t\ta, err := ao.CreateAddress(ctx, aD)\n\t\tΩ(err).ShouldNot(HaveOccurred())\n\t\t// 组装的数据 mobile 为 13509876789\n\t\tΩ(a.Mobile).Should(Equal(\"13509876789\")) // 手机号应该为创建的时候写入的手机号\n\t})\n\n})\n"
  },
  {
    "path": "service/user/internal/data/data.go",
    "content": "package data\n\nimport (\n\t\"context\"\n\tslog \"log\"\n\t\"os\"\n\t\"time\"\n\t\"user/internal/biz\"\n\t\"user/internal/conf\"\n\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"github.com/go-redis/redis/extra/redisotel\"\n\t\"github.com/go-redis/redis/v8\"\n\t\"github.com/google/wire\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n\t\"gorm.io/gorm/logger\"\n\t\"gorm.io/gorm/schema\"\n)\n\n// ProviderSet is data providers.\nvar ProviderSet = wire.NewSet(NewData, NewDB, NewTransaction, NewRedis, NewUserRepo, NewAddressRepo)\n\ntype Data struct {\n\tdb  *gorm.DB\n\trdb *redis.Client\n}\ntype contextTxKey struct{}\n\n// NewData .\nfunc NewData(c *conf.Data, logger log.Logger, db *gorm.DB, rdb *redis.Client) (*Data, func(), error) {\n\tcleanup := func() {\n\t\tlog.NewHelper(logger).Info(\"closing the data resources\")\n\t}\n\treturn &Data{db: db, rdb: rdb}, cleanup, nil\n}\n\nfunc NewTransaction(d *Data) biz.Transaction {\n\treturn d\n}\n\nfunc (d *Data) DB(ctx context.Context) *gorm.DB {\n\ttx, ok := ctx.Value(contextTxKey{}).(*gorm.DB)\n\tif ok {\n\t\treturn tx\n\t}\n\treturn d.db\n}\n\nfunc (d *Data) ExecTx(ctx context.Context, fn func(ctx context.Context) error) error {\n\treturn d.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error {\n\t\tctx = context.WithValue(ctx, contextTxKey{}, tx)\n\t\treturn fn(ctx)\n\t})\n}\n\n// NewDB .\nfunc NewDB(c *conf.Data) *gorm.DB {\n\t// 终端打印输入 sql 执行记录\n\tnewLogger := logger.New(\n\t\tslog.New(os.Stdout, \"\\r\\n\", slog.LstdFlags), // io writer\n\t\tlogger.Config{\n\t\t\tSlowThreshold: time.Second, // 慢查询 SQL 阈值\n\t\t\tColorful:      true,        // 禁用彩色打印\n\t\t\t//IgnoreRecordNotFoundError: false,\n\t\t\tLogLevel: logger.Info, // Log lever\n\t\t},\n\t)\n\tlog.Info(\"failed opening connection to \")\n\tdb, err := gorm.Open(mysql.Open(c.Database.Source), &gorm.Config{\n\t\tLogger:                                   newLogger,\n\t\tDisableForeignKeyConstraintWhenMigrating: true,\n\t\tNamingStrategy:                           schema.NamingStrategy{\n\t\t\t//SingularTable: true, // 表名是否加 s\n\t\t},\n\t})\n\n\tif err != nil {\n\t\tlog.Errorf(\"failed opening connection to sqlite: %v\", err)\n\t\tpanic(\"failed to connect database\")\n\t}\n\n\treturn db\n}\n\nfunc NewRedis(c *conf.Data) *redis.Client {\n\trdb := redis.NewClient(&redis.Options{\n\t\tAddr:         c.Redis.Addr,\n\t\tPassword:     c.Redis.Password,\n\t\tDB:           int(c.Redis.Db),\n\t\tDialTimeout:  c.Redis.DialTimeout.AsDuration(),\n\t\tWriteTimeout: c.Redis.WriteTimeout.AsDuration(),\n\t\tReadTimeout:  c.Redis.ReadTimeout.AsDuration(),\n\t})\n\trdb.AddHook(redisotel.TracingHook{})\n\tif err := rdb.Close(); err != nil {\n\t\tlog.Error(err)\n\t}\n\treturn rdb\n}\n"
  },
  {
    "path": "service/user/internal/data/data_suite_test.go",
    "content": "package data_test\n\nimport (\n\t\"context\"\n\t\"github.com/pkg/errors\"\n\t\"gorm.io/gorm\"\n\t\"testing\"\n\t\"user/internal/conf\"\n\t\"user/internal/data\"\n\n\t. \"github.com/onsi/ginkgo\"\n\t. \"github.com/onsi/gomega\"\n)\n\n// 测试 data 方法\nfunc TestData(t *testing.T) {\n\t//  Ginkgo 测试通过调用 Fail(description string) 功能来表示失败\n\t// 使用 RegisterFailHandler 将此函数传递给 Gomega 。这是 Ginkgo 和 Gomega 之间的唯一连接点\n\tRegisterFailHandler(Fail)\n\t// 通知 Ginkgo 启动测试套件。如果您的任何 specs 失败，Ginkgo 将自动使 testing.T 失败。\n\tRunSpecs(t, \"biz data test user\")\n}\n\nvar cleaner func()      // 定义删除 mysql 容器的回调函数\nvar Db *data.Data       // 用于测试的 data\nvar ctx context.Context // 上下文\n\n// initialize  AutoMigrate gorm自动建表\nfunc initialize(db *gorm.DB) error {\n\terr := db.AutoMigrate(\n\t\t&data.User{},\n\t\t&data.Address{},\n\t)\n\treturn errors.WithStack(err)\n}\n\n// ginkgo 使用 BeforeEach 为您的 Specs 设置状态\nvar _ = BeforeSuite(func() {\n\t// 执行测试数据库操作之前，链接之前 docker 容器创建的 mysql\n\t//con, f := data.DockerMysql(\"mysql\", \"latest\")\n\tcon, f := data.DockerMysql(\"mariadb\", \"latest\")\n\tcleaner = f // 测试完成，关闭容器的回调方法\n\tconfig := &conf.Data{Database: &conf.Data_Database{Driver: \"mysql\", Source: con}}\n\tdb := data.NewDB(config)\n\tmySQLDb, _, err := data.NewData(config, nil, db, nil)\n\tif err != nil {\n\t\treturn\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\tDb = mySQLDb\n\terr = initialize(db)\n\tif err != nil {\n\t\treturn\n\t}\n\tExpect(err).NotTo(HaveOccurred())\n})\n\n// 测试结束后 通过回调函数，关闭并删除 docker 创建的容器\nvar _ = AfterSuite(func() {\n\tcleaner()\n})\n"
  },
  {
    "path": "service/user/internal/data/docker_mysql.go",
    "content": "package data\n\nimport (\n\t\"database/sql\"\n\t\"fmt\"\n\t\"github.com/ory/dockertest/v3\"\n\t\"log\"\n\t\"time\"\n)\n\nfunc DockerMysql(img, version string) (string, func()) {\n\treturn innerDockerMysql(img, version)\n}\n\nfunc innerDockerMysql(img, version string) (string, func()) {\n\t// uses a sensible default on windows (tcp/http) and linux/osx (socket)\n\tpool, err := dockertest.NewPool(\"\")\n\tpool.MaxWait = time.Minute * 2\n\tif err != nil {\n\t\tlog.Fatalf(\"Could not connect to docker: %s\", err)\n\t}\n\t//time.Sleep(time.Second * 20)\n\t// pulls an image, creates a container based on it and runs it\n\tresource, err := pool.Run(img, version, []string{\"MYSQL_ROOT_PASSWORD=secret\", \"MYSQL_ROOT_HOST=%\"})\n\tif err != nil {\n\t\tlog.Fatalf(\"Could not start resource: %s\", err)\n\t}\n\n\tconStr := fmt.Sprintf(\"root:secret@(localhost:%s)/mysql?parseTime=true\", resource.GetPort(\"3306/tcp\"))\n\t// exponential backoff-retry, because the application in the container might not be ready to accept connections yet\n\tif err := pool.Retry(func() error {\n\t\tvar err error\n\t\tdb, err := sql.Open(\"mysql\", conStr)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn db.Ping()\n\t}); err != nil {\n\t\tlog.Fatalf(\"Could not connect to docker: %s\", err)\n\t}\n\n\t// 关闭容器\n\treturn conStr, func() {\n\t\tif err = pool.Purge(resource); err != nil {\n\t\t\tlog.Fatalf(\"Could not purge resource: %s\", err)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "service/user/internal/data/entity/user.go",
    "content": "package main\n\nimport (\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n\t\"gorm.io/gorm/logger\"\n\t\"gorm.io/gorm/schema\"\n\t\"log\"\n\t\"os\"\n\t\"time\"\n\t\"user/internal/data\"\n)\n\n// 链接数据库\nfunc main() {\n\tdsn := \"root:root@tcp(127.0.0.1:3306)/shop_user?charset=utf8mb4&parseTime=True&loc=Local\"\n\tnewLogger := logger.New(\n\t\tlog.New(os.Stdout, \"\\r\\n\", log.LstdFlags), // io writer\n\t\tlogger.Config{\n\t\t\tSlowThreshold: time.Second, // 慢 SQL 阈值\n\t\t\tLogLevel:      logger.Info, // Log level\n\t\t\tColorful:      true,        // 禁用彩色打印\n\t\t},\n\t)\n\n\t// 全局模式\n\tdb, err := gorm.Open(mysql.Open(dsn), &gorm.Config{\n\t\tNamingStrategy: schema.NamingStrategy{\n\t\t\t//SingularTable: true,\n\t\t},\n\t\tLogger: newLogger,\n\t})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\t_ = db.AutoMigrate(&data.User{})\n\t_ = db.AutoMigrate(&data.Address{})\n}\n"
  },
  {
    "path": "service/user/internal/data/user.go",
    "content": "package data\n\nimport (\n\t\"context\"\n\t\"crypto/sha512\"\n\t\"fmt\"\n\t\"github.com/anaskhan96/go-password-encoder\"\n\t\"github.com/go-kratos/kratos/v2/errors\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"gorm.io/gorm\"\n\t\"strings\"\n\t\"time\"\n\t\"user/internal/biz\"\n)\n\ntype User struct {\n\tID          int64      `gorm:\"primarykey\"`\n\tMobile      string     `gorm:\"index:idx_mobile;unique;type:varchar(11) comment '手机号码，用户唯一标识';not null\"`\n\tPassword    string     `gorm:\"type:varchar(100);not null \"` // 用户密码的保存需要注意是否加密\n\tNickName    string     `gorm:\"type:varchar(25) comment '用户昵称'\"`\n\tBirthday    *time.Time `gorm:\"type:datetime comment '出生日日期'\"`\n\tGender      string     `gorm:\"column:gender;default:male;type:varchar(16) comment 'female:女,male:男'\"`\n\tRole        int        `gorm:\"column:role;default:1;type:int comment '1:普通用户，2:管理员'\"`\n\tCreatedAt   time.Time  `gorm:\"column:add_time\"`\n\tUpdatedAt   time.Time  `gorm:\"column:update_time\"`\n\tDeletedAt   gorm.DeletedAt\n\tIsDeletedAt bool\n}\n\nfunc (User) TableName() string {\n\treturn \"users\"\n}\n\ntype userRepo struct {\n\tdata *Data\n\tlog  *log.Helper\n}\n\n// NewUserRepo .\nfunc NewUserRepo(data *Data, logger log.Logger) biz.UserRepo {\n\treturn &userRepo{\n\t\tdata: data,\n\t\tlog:  log.NewHelper(logger),\n\t}\n}\n\n// CreateUser .\nfunc (r *userRepo) CreateUser(ctx context.Context, u *biz.User) (*biz.User, error) {\n\t// 验证是否已经创建\n\tvar user User\n\tresult := r.data.db.Where(&User{Mobile: u.Mobile}).First(&user)\n\tif result.RowsAffected == 1 {\n\t\treturn nil, errors.New(500, \"USER_EXIST\", \"用户已存在\"+u.Mobile)\n\t}\n\n\tuser.Mobile = u.Mobile\n\tuser.NickName = u.NickName\n\tuser.Password = encrypt(u.Password) // 密码加密\n\tres := r.data.db.Create(&user)\n\tif res.Error != nil {\n\t\treturn nil, errors.New(500, \"CREAT_USER_ERROR\", \"用户创建失败\")\n\t}\n\tuserInfoRes := modelToResponse(user)\n\treturn &userInfoRes, nil\n}\n\n// Password encryption\nfunc encrypt(psd string) string {\n\toptions := &password.Options{SaltLen: 16, Iterations: 10000, KeyLen: 32, HashFunction: sha512.New}\n\tsalt, encodedPwd := password.Encode(psd, options)\n\treturn fmt.Sprintf(\"$pbkdf2-sha512$%s$%s\", salt, encodedPwd)\n}\n\n// ModelToResponse 转换 user 表中所有字段的值\nfunc modelToResponse(user User) biz.User {\n\tuserInfoRsp := biz.User{\n\t\tID:        user.ID,\n\t\tMobile:    user.Mobile,\n\t\tPassword:  user.Password,\n\t\tNickName:  user.NickName,\n\t\tGender:    user.Gender,\n\t\tRole:      user.Role,\n\t\tBirthday:  user.Birthday,\n\t\tCreatedAt: user.CreatedAt,\n\t}\n\treturn userInfoRsp\n}\n\n// ListUser .\nfunc (r *userRepo) ListUser(ctx context.Context, pageNum, pageSize int) ([]*biz.User, int, error) {\n\tvar users []User\n\tresult := r.data.db.Find(&users)\n\tif errors.Is(result.Error, gorm.ErrRecordNotFound) {\n\t\treturn nil, 0, errors.NotFound(\"USER_NOT_FOUND\", \"user not found\")\n\t}\n\tif result.Error != nil {\n\t\treturn nil, 0, errors.New(500, \"FIND_USER_ERROR\", \"find user error\")\n\t}\n\ttotal := int(result.RowsAffected)\n\tr.data.db.Scopes(paginate(pageNum, pageSize)).Find(&users)\n\trv := make([]*biz.User, 0)\n\tfor _, u := range users {\n\t\trv = append(rv, &biz.User{\n\t\t\tID:       u.ID,\n\t\t\tMobile:   u.Mobile,\n\t\t\tPassword: u.Password,\n\t\t\tNickName: u.NickName,\n\t\t\tGender:   u.Gender,\n\t\t\tRole:     u.Role,\n\t\t\tBirthday: u.Birthday,\n\t\t})\n\t}\n\treturn rv, total, nil\n}\n\n// paginate 分页\nfunc paginate(page, pageSize int) func(db *gorm.DB) *gorm.DB {\n\treturn func(db *gorm.DB) *gorm.DB {\n\t\tif page == 0 {\n\t\t\tpage = 1\n\t\t}\n\n\t\tswitch {\n\t\tcase pageSize > 100:\n\t\t\tpageSize = 100\n\t\tcase pageSize <= 0:\n\t\t\tpageSize = 10\n\t\t}\n\n\t\toffset := (page - 1) * pageSize\n\t\treturn db.Offset(offset).Limit(pageSize)\n\t}\n}\n\n// UserByMobile .\nfunc (r *userRepo) UserByMobile(ctx context.Context, mobile string) (*biz.User, error) {\n\tvar user User\n\tresult := r.data.db.Where(&User{Mobile: mobile}).First(&user)\n\tif errors.Is(result.Error, gorm.ErrRecordNotFound) {\n\t\treturn nil, errors.NotFound(\"USER_NOT_FOUND\", \"user not found\")\n\t}\n\tif result.Error != nil {\n\t\treturn nil, errors.New(500, \"FIND_USER_ERROR\", \"find user error\")\n\t}\n\n\tif result.RowsAffected == 0 {\n\t\treturn nil, errors.NotFound(\"USER_NOT_FOUND\", \"user not found\")\n\t}\n\tre := modelToResponse(user)\n\treturn &re, nil\n}\n\n// UpdateUser .\nfunc (r *userRepo) UpdateUser(ctx context.Context, user *biz.User) (bool, error) {\n\tvar userInfo User\n\tresult := r.data.db.Where(&User{ID: user.ID}).First(&userInfo)\n\tif errors.Is(result.Error, gorm.ErrRecordNotFound) {\n\t\treturn false, errors.NotFound(\"USER_NOT_FOUND\", \"user not found\")\n\t}\n\n\tif result.RowsAffected == 0 {\n\t\treturn false, errors.NotFound(\"USER_NOT_FOUND\", \"用户不存在\")\n\t}\n\n\tuserInfo.NickName = user.NickName\n\tuserInfo.Birthday = user.Birthday\n\tuserInfo.Gender = user.Gender\n\n\tif err := r.data.db.Save(&userInfo).Error; err != nil {\n\t\treturn false, errors.New(500, \"USER_NOT_FOUND\", err.Error())\n\t}\n\n\treturn true, nil\n}\n\n// GetUserById .\nfunc (r *userRepo) GetUserById(ctx context.Context, Id int64) (*biz.User, error) {\n\tvar user User\n\tif err := r.data.db.Where(&User{ID: Id}).First(&user).Error; err != nil {\n\t\tif errors.Is(err, gorm.ErrRecordNotFound) {\n\t\t\treturn nil, errors.NotFound(\"USER_NOT_FOUND\", \"user not found\")\n\t\t}\n\n\t\treturn nil, errors.New(500, \"USER_NOT_FOUND\", err.Error())\n\t}\n\n\tre := modelToResponse(user)\n\treturn &re, nil\n}\n\n// CheckPassword .\nfunc (r *userRepo) CheckPassword(ctx context.Context, psd, encryptedPassword string) (bool, error) {\n\toptions := &password.Options{SaltLen: 16, Iterations: 10000, KeyLen: 32, HashFunction: sha512.New}\n\tpasswordInfo := strings.Split(encryptedPassword, \"$\")\n\tcheck := password.Verify(psd, passwordInfo[2], passwordInfo[3], options)\n\treturn check, nil\n}\n"
  },
  {
    "path": "service/user/internal/data/user_test.go",
    "content": "package data_test\n\nimport (\n\t. \"github.com/onsi/ginkgo\"\n\t. \"github.com/onsi/gomega\"\n\t\"time\"\n\t\"user/internal/biz\"\n\t\"user/internal/data\"\n\t\"user/internal/testdata\"\n)\n\nvar _ = Describe(\"User\", func() {\n\tvar ro biz.UserRepo\n\tvar uD *biz.User\n\tBeforeEach(func() {\n\t\tro = data.NewUserRepo(Db, nil)\n\t\t// 这里你可以不引入外部组装好的数据，可以在这里直接写\n\t\tuD = testdata.User()\n\t})\n\t// 设置 It 块来添加单个规格\n\tIt(\"CreateUser\", func() {\n\t\tu, err := ro.CreateUser(ctx, uD)\n\t\tΩ(err).ShouldNot(HaveOccurred())\n\t\t// 组装的数据 mobile 为 13509876789\n\t\tΩ(u.Mobile).Should(Equal(\"13509876789\")) // 手机号应该为创建的时候写入的手机号\n\t})\n\t// 设置 It 块来添加单个规格\n\tIt(\"ListUser\", func() {\n\t\tuser, total, err := ro.ListUser(ctx, 1, 10)\n\t\tΩ(err).ShouldNot(HaveOccurred()) // 获取列表不应该出现错误\n\t\tΩ(user).ShouldNot(BeEmpty())     // 结果不应该为空\n\t\tΩ(total).Should(Equal(1))        // 总数应该为 1，因为上面只创建了一条\n\t\tΩ(len(user)).Should(Equal(1))\n\t\tΩ(user[0].Mobile).Should(Equal(\"13509876789\"))\n\t})\n\n\t// 设置 It 块来添加单个规格\n\tIt(\"UpdateUser\", func() {\n\t\tbirthDay := time.Unix(int64(693646426), 0)\n\t\tuD.NickName = \"gyl\"\n\t\tuD.Birthday = &birthDay\n\t\tuD.Gender = \"female\"\n\t\tuser, err := ro.UpdateUser(ctx, uD)\n\t\tΩ(err).ShouldNot(HaveOccurred()) // 更新不应该出现错误\n\t\tΩ(user).Should(BeTrue())         // 结果应该为 true\n\t})\n\n\tIt(\"CheckPassword\", func() {\n\t\tp1 := \"admin\"\n\t\tencryptedPassword := \"$pbkdf2-sha512$5p7doUNIS9I5mvhA$b18171ff58b04c02ed70ea4f39bda036029c107294bce83301a02fb53a1bcae0\"\n\t\tpassword, err := ro.CheckPassword(ctx, p1, encryptedPassword)\n\t\tΩ(err).ShouldNot(HaveOccurred()) // 密码验证通过\n\t\tΩ(password).Should(BeTrue())     // 结果应该为true\n\n\t\tencryptedPassword1 := \"$pbkdf2-sha512$5p7doUNIS9I5mvhA$b18171ff58b04c02ed70ea4f39\"\n\t\tpassword1, err := ro.CheckPassword(ctx, p1, encryptedPassword1)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tΩ(err).ShouldNot(HaveOccurred())\n\t\tΩ(password1).Should(BeFalse()) // 密码验证不通过\n\t})\n})\n"
  },
  {
    "path": "service/user/internal/domain/address.go",
    "content": "package domain\n\ntype Address struct {\n\tID        int64\n\tUserID    int64\n\tIsDefault int\n\tMobile    string\n\tName      string\n\tProvince  string\n\tCity      string\n\tDistricts string\n\tAddress   string\n\tPostCode  string\n}\n"
  },
  {
    "path": "service/user/internal/mocks/mrepo/address.go",
    "content": "// Code generated by MockGen. DO NOT EDIT.\n// Source: user/internal/biz (interfaces: AddressRepo)\n\n// Package mrepo is a generated GoMock package.\npackage mrepo\n\nimport (\n\tcontext \"context\"\n\treflect \"reflect\"\n\t\"user/internal/domain\"\n\n\tgomock \"github.com/golang/mock/gomock\"\n)\n\n// MockAddressRepo is a mock of AddressRepo interface.\ntype MockAddressRepo struct {\n\tctrl     *gomock.Controller\n\trecorder *MockAddressRepoMockRecorder\n}\n\n// MockAddressRepoMockRecorder is the mock recorder for MockAddressRepo.\ntype MockAddressRepoMockRecorder struct {\n\tmock *MockAddressRepo\n}\n\n// NewMockAddressRepo creates a new mock instance.\nfunc NewMockAddressRepo(ctrl *gomock.Controller) *MockAddressRepo {\n\tmock := &MockAddressRepo{ctrl: ctrl}\n\tmock.recorder = &MockAddressRepoMockRecorder{mock}\n\treturn mock\n}\n\n// EXPECT returns an object that allows the caller to indicate expected use.\nfunc (m *MockAddressRepo) EXPECT() *MockAddressRepoMockRecorder {\n\treturn m.recorder\n}\n\n// AddressListByUid mocks base method.\nfunc (m *MockAddressRepo) AddressListByUid(arg0 context.Context, arg1 int64) ([]*domain.Address, error) {\n\tm.ctrl.T.Helper()\n\tret := m.ctrl.Call(m, \"AddressListByUid\", arg0, arg1)\n\tret0, _ := ret[0].([]*domain.Address)\n\tret1, _ := ret[1].(error)\n\treturn ret0, ret1\n}\n\n// AddressListByUid indicates an expected call of AddressListByUid.\nfunc (mr *MockAddressRepoMockRecorder) AddressListByUid(arg0, arg1 interface{}) *gomock.Call {\n\tmr.mock.ctrl.T.Helper()\n\treturn mr.mock.ctrl.RecordCallWithMethodType(mr.mock, \"AddressListByUid\", reflect.TypeOf((*MockAddressRepo)(nil).AddressListByUid), arg0, arg1)\n}\n\n// CreateAddress mocks base method.\nfunc (m *MockAddressRepo) CreateAddress(arg0 context.Context, arg1 *domain.Address) (*domain.Address, error) {\n\tm.ctrl.T.Helper()\n\tret := m.ctrl.Call(m, \"CreateAddress\", arg0, arg1)\n\tret0, _ := ret[0].(*domain.Address)\n\tret1, _ := ret[1].(error)\n\treturn ret0, ret1\n}\n\n// CreateAddress indicates an expected call of CreateAddress.\nfunc (mr *MockAddressRepoMockRecorder) CreateAddress(arg0, arg1 interface{}) *gomock.Call {\n\tmr.mock.ctrl.T.Helper()\n\treturn mr.mock.ctrl.RecordCallWithMethodType(mr.mock, \"CreateAddress\", reflect.TypeOf((*MockAddressRepo)(nil).CreateAddress), arg0, arg1)\n}\n\n// DefaultAddress mocks base method.\nfunc (m *MockAddressRepo) DefaultAddress(arg0 context.Context, arg1 *domain.Address) error {\n\tm.ctrl.T.Helper()\n\tret := m.ctrl.Call(m, \"DefaultAddress\", arg0, arg1)\n\tret0, _ := ret[0].(error)\n\treturn ret0\n}\n\n// DefaultAddress indicates an expected call of DefaultAddress.\nfunc (mr *MockAddressRepoMockRecorder) DefaultAddress(arg0, arg1 interface{}) *gomock.Call {\n\tmr.mock.ctrl.T.Helper()\n\treturn mr.mock.ctrl.RecordCallWithMethodType(mr.mock, \"DefaultAddress\", reflect.TypeOf((*MockAddressRepo)(nil).DefaultAddress), arg0, arg1)\n}\n\n// DeleteAddress mocks base method.\nfunc (m *MockAddressRepo) DeleteAddress(arg0 context.Context, arg1 *domain.Address) error {\n\tm.ctrl.T.Helper()\n\tret := m.ctrl.Call(m, \"DeleteAddress\", arg0, arg1)\n\tret0, _ := ret[0].(error)\n\treturn ret0\n}\n\n// DeleteAddress indicates an expected call of DeleteAddress.\nfunc (mr *MockAddressRepoMockRecorder) DeleteAddress(arg0, arg1 interface{}) *gomock.Call {\n\tmr.mock.ctrl.T.Helper()\n\treturn mr.mock.ctrl.RecordCallWithMethodType(mr.mock, \"DeleteAddress\", reflect.TypeOf((*MockAddressRepo)(nil).DeleteAddress), arg0, arg1)\n}\n\n// UpdateAddress mocks base method.\nfunc (m *MockAddressRepo) UpdateAddress(arg0 context.Context, arg1 *domain.Address) error {\n\tm.ctrl.T.Helper()\n\tret := m.ctrl.Call(m, \"UpdateAddress\", arg0, arg1)\n\tret0, _ := ret[0].(error)\n\treturn ret0\n}\n\n// UpdateAddress indicates an expected call of UpdateAddress.\nfunc (mr *MockAddressRepoMockRecorder) UpdateAddress(arg0, arg1 interface{}) *gomock.Call {\n\tmr.mock.ctrl.T.Helper()\n\treturn mr.mock.ctrl.RecordCallWithMethodType(mr.mock, \"UpdateAddress\", reflect.TypeOf((*MockAddressRepo)(nil).UpdateAddress), arg0, arg1)\n}\n"
  },
  {
    "path": "service/user/internal/mocks/mrepo/user.go",
    "content": "// Code generated by MockGen. DO NOT EDIT.\n// Source: user/internal/biz (interfaces: UserRepo)\n\n// Package mrepo is a generated GoMock package.\npackage mrepo\n\nimport (\n\tcontext \"context\"\n\treflect \"reflect\"\n\tbiz \"user/internal/biz\"\n\n\tgomock \"github.com/golang/mock/gomock\"\n)\n\n// MockUserRepo is a mock of UserRepo interface.\ntype MockUserRepo struct {\n\tctrl     *gomock.Controller\n\trecorder *MockUserRepoMockRecorder\n}\n\n// MockUserRepoMockRecorder is the mock recorder for MockUserRepo.\ntype MockUserRepoMockRecorder struct {\n\tmock *MockUserRepo\n}\n\n// NewMockUserRepo creates a new mock instance.\nfunc NewMockUserRepo(ctrl *gomock.Controller) *MockUserRepo {\n\tmock := &MockUserRepo{ctrl: ctrl}\n\tmock.recorder = &MockUserRepoMockRecorder{mock}\n\treturn mock\n}\n\n// EXPECT returns an object that allows the caller to indicate expected use.\nfunc (m *MockUserRepo) EXPECT() *MockUserRepoMockRecorder {\n\treturn m.recorder\n}\n\n// CheckPassword mocks base method.\nfunc (m *MockUserRepo) CheckPassword(arg0 context.Context, arg1, arg2 string) (bool, error) {\n\tm.ctrl.T.Helper()\n\tret := m.ctrl.Call(m, \"CheckPassword\", arg0, arg1, arg2)\n\tret0, _ := ret[0].(bool)\n\tret1, _ := ret[1].(error)\n\treturn ret0, ret1\n}\n\n// CheckPassword indicates an expected call of CheckPassword.\nfunc (mr *MockUserRepoMockRecorder) CheckPassword(arg0, arg1, arg2 interface{}) *gomock.Call {\n\tmr.mock.ctrl.T.Helper()\n\treturn mr.mock.ctrl.RecordCallWithMethodType(mr.mock, \"CheckPassword\", reflect.TypeOf((*MockUserRepo)(nil).CheckPassword), arg0, arg1, arg2)\n}\n\n// CreateUser mocks base method.\nfunc (m *MockUserRepo) CreateUser(arg0 context.Context, arg1 *biz.User) (*biz.User, error) {\n\tm.ctrl.T.Helper()\n\tret := m.ctrl.Call(m, \"CreateUser\", arg0, arg1)\n\tret0, _ := ret[0].(*biz.User)\n\tret1, _ := ret[1].(error)\n\treturn ret0, ret1\n}\n\n// CreateUser indicates an expected call of CreateUser.\nfunc (mr *MockUserRepoMockRecorder) CreateUser(arg0, arg1 interface{}) *gomock.Call {\n\tmr.mock.ctrl.T.Helper()\n\treturn mr.mock.ctrl.RecordCallWithMethodType(mr.mock, \"CreateUser\", reflect.TypeOf((*MockUserRepo)(nil).CreateUser), arg0, arg1)\n}\n\n// GetUserById mocks base method.\nfunc (m *MockUserRepo) GetUserById(arg0 context.Context, arg1 int64) (*biz.User, error) {\n\tm.ctrl.T.Helper()\n\tret := m.ctrl.Call(m, \"GetUserById\", arg0, arg1)\n\tret0, _ := ret[0].(*biz.User)\n\tret1, _ := ret[1].(error)\n\treturn ret0, ret1\n}\n\n// GetUserById indicates an expected call of GetUserById.\nfunc (mr *MockUserRepoMockRecorder) GetUserById(arg0, arg1 interface{}) *gomock.Call {\n\tmr.mock.ctrl.T.Helper()\n\treturn mr.mock.ctrl.RecordCallWithMethodType(mr.mock, \"GetUserById\", reflect.TypeOf((*MockUserRepo)(nil).GetUserById), arg0, arg1)\n}\n\n// ListUser mocks base method.\nfunc (m *MockUserRepo) ListUser(arg0 context.Context, arg1, arg2 int) ([]*biz.User, int, error) {\n\tm.ctrl.T.Helper()\n\tret := m.ctrl.Call(m, \"ListUser\", arg0, arg1, arg2)\n\tret0, _ := ret[0].([]*biz.User)\n\tret1, _ := ret[1].(int)\n\tret2, _ := ret[2].(error)\n\treturn ret0, ret1, ret2\n}\n\n// ListUser indicates an expected call of ListUser.\nfunc (mr *MockUserRepoMockRecorder) ListUser(arg0, arg1, arg2 interface{}) *gomock.Call {\n\tmr.mock.ctrl.T.Helper()\n\treturn mr.mock.ctrl.RecordCallWithMethodType(mr.mock, \"ListUser\", reflect.TypeOf((*MockUserRepo)(nil).ListUser), arg0, arg1, arg2)\n}\n\n// UpdateUser mocks base method.\nfunc (m *MockUserRepo) UpdateUser(arg0 context.Context, arg1 *biz.User) (bool, error) {\n\tm.ctrl.T.Helper()\n\tret := m.ctrl.Call(m, \"UpdateUser\", arg0, arg1)\n\tret0, _ := ret[0].(bool)\n\tret1, _ := ret[1].(error)\n\treturn ret0, ret1\n}\n\n// UpdateUser indicates an expected call of UpdateUser.\nfunc (mr *MockUserRepoMockRecorder) UpdateUser(arg0, arg1 interface{}) *gomock.Call {\n\tmr.mock.ctrl.T.Helper()\n\treturn mr.mock.ctrl.RecordCallWithMethodType(mr.mock, \"UpdateUser\", reflect.TypeOf((*MockUserRepo)(nil).UpdateUser), arg0, arg1)\n}\n\n// UserByMobile mocks base method.\nfunc (m *MockUserRepo) UserByMobile(arg0 context.Context, arg1 string) (*biz.User, error) {\n\tm.ctrl.T.Helper()\n\tret := m.ctrl.Call(m, \"UserByMobile\", arg0, arg1)\n\tret0, _ := ret[0].(*biz.User)\n\tret1, _ := ret[1].(error)\n\treturn ret0, ret1\n}\n\n// UserByMobile indicates an expected call of UserByMobile.\nfunc (mr *MockUserRepoMockRecorder) UserByMobile(arg0, arg1 interface{}) *gomock.Call {\n\tmr.mock.ctrl.T.Helper()\n\treturn mr.mock.ctrl.RecordCallWithMethodType(mr.mock, \"UserByMobile\", reflect.TypeOf((*MockUserRepo)(nil).UserByMobile), arg0, arg1)\n}\n"
  },
  {
    "path": "service/user/internal/mocks/usecase/biz.go",
    "content": "// Code generated by MockGen. DO NOT EDIT.\n// Source: user/internal/biz (interfaces: Transaction)\n\n// Package usecase is a generated GoMock package.\npackage usecase\n\nimport (\n\tcontext \"context\"\n\treflect \"reflect\"\n\n\tgomock \"github.com/golang/mock/gomock\"\n)\n\n// MockTransaction is a mock of Transaction interface.\ntype MockTransaction struct {\n\tctrl     *gomock.Controller\n\trecorder *MockTransactionMockRecorder\n}\n\n// MockTransactionMockRecorder is the mock recorder for MockTransaction.\ntype MockTransactionMockRecorder struct {\n\tmock *MockTransaction\n}\n\n// NewMockTransaction creates a new mock instance.\nfunc NewMockTransaction(ctrl *gomock.Controller) *MockTransaction {\n\tmock := &MockTransaction{ctrl: ctrl}\n\tmock.recorder = &MockTransactionMockRecorder{mock}\n\treturn mock\n}\n\n// EXPECT returns an object that allows the caller to indicate expected use.\nfunc (m *MockTransaction) EXPECT() *MockTransactionMockRecorder {\n\treturn m.recorder\n}\n\n// ExecTx mocks base method.\nfunc (m *MockTransaction) ExecTx(arg0 context.Context, arg1 func(context.Context) error) error {\n\tm.ctrl.T.Helper()\n\tret := m.ctrl.Call(m, \"ExecTx\", arg0, arg1)\n\tret0, _ := ret[0].(error)\n\treturn ret0\n}\n\n// ExecTx indicates an expected call of ExecTx.\nfunc (mr *MockTransactionMockRecorder) ExecTx(arg0, arg1 interface{}) *gomock.Call {\n\tmr.mock.ctrl.T.Helper()\n\treturn mr.mock.ctrl.RecordCallWithMethodType(mr.mock, \"ExecTx\", reflect.TypeOf((*MockTransaction)(nil).ExecTx), arg0, arg1)\n}\n"
  },
  {
    "path": "service/user/internal/server/grpc.go",
    "content": "package server\n\nimport (\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"github.com/go-kratos/kratos/v2/middleware/logging\"\n\t\"github.com/go-kratos/kratos/v2/middleware/recovery\"\n\t\"github.com/go-kratos/kratos/v2/middleware/tracing\"\n\t\"github.com/go-kratos/kratos/v2/transport/grpc\"\n\tv1 \"user/api/user/v1\"\n\t\"user/internal/conf\"\n\t\"user/internal/service\"\n)\n\n// NewGRPCServer new a gRPC s.\nfunc NewGRPCServer(c *conf.Server, u *service.UserService, logger log.Logger) *grpc.Server {\n\tvar opts = []grpc.ServerOption{\n\t\tgrpc.Middleware(\n\t\t\trecovery.Recovery(),\n\t\t\ttracing.Server(),\n\t\t\tlogging.Server(logger),\n\t\t),\n\t}\n\tif c.Grpc.Network != \"\" {\n\t\topts = append(opts, grpc.Network(c.Grpc.Network))\n\t}\n\tif c.Grpc.Addr != \"\" {\n\t\topts = append(opts, grpc.Address(c.Grpc.Addr))\n\t}\n\tif c.Grpc.Timeout != nil {\n\t\topts = append(opts, grpc.Timeout(c.Grpc.Timeout.AsDuration()))\n\t}\n\tsrv := grpc.NewServer(opts...)\n\tv1.RegisterUserServer(srv, u)\n\treturn srv\n}\n"
  },
  {
    "path": "service/user/internal/server/server.go",
    "content": "package server\n\nimport (\n\t\"github.com/go-kratos/kratos/v2/registry\"\n\t\"github.com/google/wire\"\n\t\"user/internal/conf\"\n\n\t\"github.com/go-kratos/kratos/contrib/registry/consul/v2\"\n\tconsulAPI \"github.com/hashicorp/consul/api\"\n)\n\n// ProviderSet is s providers.\nvar ProviderSet = wire.NewSet(NewGRPCServer, NewRegistrar)\n\n// NewRegistrar 引入 consul\nfunc NewRegistrar(conf *conf.Registry) registry.Registrar {\n\tc := consulAPI.DefaultConfig()\n\tc.Address = conf.Consul.Address\n\tc.Scheme = conf.Consul.Scheme\n\n\tcli, err := consulAPI.NewClient(c)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tr := consul.New(cli, consul.WithHealthCheck(false))\n\treturn r\n}\n"
  },
  {
    "path": "service/user/internal/service/README.md",
    "content": "# Service\n"
  },
  {
    "path": "service/user/internal/service/address.go",
    "content": "package service\n\nimport (\n\t\"context\"\n\tv1 \"user/api/user/v1\"\n\t\"user/internal/domain\"\n)\n\nfunc (ua *UserService) DeleteAddress(ctx context.Context, req *v1.AddressReq) (*v1.CheckResponse, error) {\n\terr := ua.ac.DeleteAddress(ctx, &domain.Address{\n\t\tID:     req.Id,\n\t\tUserID: req.Uid,\n\t})\n\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &v1.CheckResponse{Success: true}, nil\n}\n\nfunc (ua *UserService) DefaultAddress(ctx context.Context, req *v1.AddressReq) (*v1.CheckResponse, error) {\n\terr := ua.ac.DefaultAddress(ctx, &domain.Address{\n\t\tID:     req.Id,\n\t\tUserID: req.Uid,\n\t})\n\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &v1.CheckResponse{Success: true}, nil\n}\n\nfunc (ua *UserService) UpdateAddress(ctx context.Context, req *v1.UpdateAddressReq) (*v1.CheckResponse, error) {\n\n\terr := ua.ac.UpdateAddress(ctx, &domain.Address{\n\t\tID:        req.Id,\n\t\tUserID:    req.Uid,\n\t\tIsDefault: int(req.IsDefault),\n\t\tMobile:    req.Mobile,\n\t\tName:      req.Name,\n\t\tProvince:  req.Province,\n\t\tCity:      req.City,\n\t\tDistricts: req.Districts,\n\t\tAddress:   req.Address,\n\t\tPostCode:  req.PostCode,\n\t})\n\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &v1.CheckResponse{Success: true}, nil\n}\n\nfunc (ua *UserService) ListAddress(ctx context.Context, req *v1.ListAddressReq) (*v1.ListAddressReply, error) {\n\trv, err := ua.ac.AddressListByUid(ctx, req.Uid)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tres := &v1.ListAddressReply{}\n\tfor _, v := range rv {\n\t\taddress := v1.AddressInfo{\n\t\t\tId:        v.ID,\n\t\t\tName:      v.Name,\n\t\t\tMobile:    v.Mobile,\n\t\t\tProvince:  v.Province,\n\t\t\tCity:      v.City,\n\t\t\tDistricts: v.Districts,\n\t\t\tAddress:   v.Address,\n\t\t\tPostCode:  v.PostCode,\n\t\t\tIsDefault: int32(v.IsDefault),\n\t\t}\n\t\tres.Results = append(res.Results, &address)\n\t}\n\treturn res, nil\n}\nfunc (ua *UserService) CreateAddress(ctx context.Context, req *v1.CreateAddressReq) (*v1.AddressInfo, error) {\n\t// user is existing\n\n\t_, err := ua.uc.UserById(ctx, req.Uid)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\trv, err := ua.ac.AddAddress(ctx, &domain.Address{\n\t\tUserID:    req.Uid,\n\t\tIsDefault: int(req.IsDefault),\n\t\tMobile:    req.Mobile,\n\t\tName:      req.Name,\n\t\tProvince:  req.Province,\n\t\tCity:      req.City,\n\t\tDistricts: req.Districts,\n\t\tAddress:   req.Address,\n\t\tPostCode:  req.PostCode,\n\t})\n\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &v1.AddressInfo{\n\t\tId:        rv.ID,\n\t\tName:      rv.Name,\n\t\tMobile:    rv.Mobile,\n\t\tProvince:  rv.Province,\n\t\tCity:      rv.City,\n\t\tDistricts: rv.Districts,\n\t\tAddress:   rv.Address,\n\t\tPostCode:  rv.PostCode,\n\t\tIsDefault: int32(rv.IsDefault),\n\t}, nil\n}\n\nfunc (ua *UserService) GetAddress(ctx context.Context, req *v1.AddressReq) (*v1.AddressInfo, error) {\n\taddress, err := ua.ac.GetAddress(ctx, &domain.Address{\n\t\tID:     req.Id,\n\t\tUserID: req.Uid,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &v1.AddressInfo{\n\t\tId:        address.ID,\n\t\tName:      address.Name,\n\t\tMobile:    address.Mobile,\n\t\tProvince:  address.Province,\n\t\tCity:      address.City,\n\t\tDistricts: address.Districts,\n\t\tAddress:   address.Address,\n\t\tPostCode:  address.PostCode,\n\t\tIsDefault: int32(address.IsDefault),\n\t}, nil\n}\n"
  },
  {
    "path": "service/user/internal/service/service.go",
    "content": "package service\n\nimport \"github.com/google/wire\"\n\n// ProviderSet is service providers.\nvar ProviderSet = wire.NewSet(NewUserService)\n"
  },
  {
    "path": "service/user/internal/service/user.go",
    "content": "package service\n\nimport (\n\t\"context\"\n\t\"time\"\n\tv1 \"user/api/user/v1\"\n\t\"user/internal/biz\"\n\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"github.com/golang/protobuf/ptypes/empty\"\n\t\"go.opentelemetry.io/otel\"\n\t\"google.golang.org/protobuf/types/known/emptypb\"\n)\n\ntype UserService struct {\n\tv1.UnimplementedUserServer\n\n\tuc  *biz.UserUsecase\n\tac  *biz.AddressUsecase\n\tlog *log.Helper\n}\n\n// NewUserService new a greeter service.\nfunc NewUserService(uc *biz.UserUsecase, ac *biz.AddressUsecase, logger log.Logger) *UserService {\n\treturn &UserService{uc: uc, ac: ac, log: log.NewHelper(logger)}\n}\n\n// CreateUser create a user\nfunc (u *UserService) CreateUser(ctx context.Context, req *v1.CreateUserInfo) (*v1.UserInfoResponse, error) {\n\tuser, err := u.uc.Create(ctx, &biz.User{\n\t\tMobile:   req.Mobile,\n\t\tPassword: req.Password,\n\t\tNickName: req.NickName,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tuserInfoRsp := UserResponse(user)\n\treturn &userInfoRsp, nil\n}\n\n// GetUserList .\nfunc (u *UserService) GetUserList(ctx context.Context, req *v1.PageInfo) (*v1.UserListResponse, error) {\n\ttr := otel.Tracer(\"service\")\n\tctx, span := tr.Start(ctx, \"get user list\")\n\tdefer span.End()\n\n\tlist, total, err := u.uc.List(ctx, int(req.Pn), int(req.PSize))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\trsp := &v1.UserListResponse{}\n\trsp.Total = int32(total)\n\n\tfor _, user := range list {\n\t\tuserInfoRsp := UserResponse(user)\n\t\trsp.Data = append(rsp.Data, &userInfoRsp)\n\t}\n\n\treturn rsp, nil\n}\n\nfunc UserResponse(user *biz.User) v1.UserInfoResponse {\n\tuserInfoRsp := v1.UserInfoResponse{\n\t\tId:       user.ID,\n\t\tMobile:   user.Mobile,\n\t\tPassword: user.Password,\n\t\tNickName: user.NickName,\n\t\tGender:   user.Gender,\n\t\tRole:     int32(user.Role),\n\t}\n\tif user.Birthday != nil {\n\t\tuserInfoRsp.Birthday = uint64(user.Birthday.Unix())\n\t}\n\treturn userInfoRsp\n}\n\n// GetUserByMobile .\nfunc (u *UserService) GetUserByMobile(ctx context.Context, req *v1.MobileRequest) (*v1.UserInfoResponse, error) {\n\ttr := otel.Tracer(\"service\")\n\tctx, span := tr.Start(ctx, \"get user list\")\n\tdefer span.End()\n\tuser, err := u.uc.UserByMobile(ctx, req.Mobile)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\trsp := UserResponse(user)\n\treturn &rsp, nil\n}\n\n// UpdateUser .\nfunc (u *UserService) UpdateUser(ctx context.Context, req *v1.UpdateUserInfo) (*emptypb.Empty, error) {\n\tbirthDay := time.Unix(int64(req.Birthday), 0)\n\tuser, err := u.uc.UpdateUser(ctx, &biz.User{\n\t\tID:       req.Id,\n\t\tGender:   req.Gender,\n\t\tBirthday: &birthDay,\n\t\tNickName: req.NickName,\n\t})\n\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif user == false {\n\t\treturn nil, err\n\t}\n\n\treturn &empty.Empty{}, nil\n}\n\n// CheckPassword .\nfunc (u *UserService) CheckPassword(ctx context.Context, req *v1.PasswordCheckInfo) (*v1.CheckResponse, error) {\n\ttr := otel.Tracer(\"service\")\n\tctx, span := tr.Start(ctx, \"check user  password\")\n\tdefer span.End()\n\tcheck, err := u.uc.CheckPassword(ctx, req.Password, req.EncryptedPassword)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &v1.CheckResponse{Success: check}, nil\n}\n\n// GetUserById .\nfunc (u *UserService) GetUserById(ctx context.Context, req *v1.IdRequest) (*v1.UserInfoResponse, error) {\n\ttr := otel.Tracer(\"service\")\n\tctx, span := tr.Start(ctx, \"get user info by Id\")\n\tdefer span.End()\n\tuser, err := u.uc.UserById(ctx, req.Id)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\trsp := UserResponse(user)\n\treturn &rsp, nil\n}\n"
  },
  {
    "path": "service/user/internal/testdata/user.go",
    "content": "package testdata\n\nimport (\n\t\"gorm.io/gorm\"\n\t\"time\"\n\t\"user/internal/biz\"\n\t\"user/internal/domain\"\n)\n\nfunc User(id ...int64) *biz.User {\n\tuser := &biz.User{\n\t\tID:          1,\n\t\tMobile:      \"13509876789\",\n\t\tPassword:    \"admin\",\n\t\tNickName:    \"aliliin\",\n\t\tBirthday:    nil,\n\t\tRole:        0,\n\t\tCreatedAt:   time.Time{},\n\t\tUpdatedAt:   time.Time{},\n\t\tDeletedAt:   gorm.DeletedAt{},\n\t\tIsDeletedAt: false,\n\t}\n\tif len(id) > 0 {\n\t\tuser.ID = id[1]\n\t}\n\treturn user\n}\n\nfunc Address(id ...int64) *domain.Address {\n\taddressInfo := &domain.Address{\n\t\tID:        0,\n\t\tUserID:    0,\n\t\tIsDefault: 0,\n\t\tMobile:    \"13509876789\",\n\t\tName:      \"gyl\",\n\t\tProvince:  \"北京市\",\n\t\tCity:      \"朝阳区\",\n\t\tDistricts: \"\",\n\t\tAddress:   \"朝阳群众\",\n\t\tPostCode:  \"10000\",\n\t}\n\tif len(id) > 0 {\n\t\taddressInfo.ID = id[1]\n\t}\n\treturn addressInfo\n}\n"
  },
  {
    "path": "service/user/openapi.yaml",
    "content": "# Generated with protoc-gen-openapi\n# https://github.com/google/gnostic/tree/master/apps/protoc-gen-openapi\n\nopenapi: 3.0.3\ninfo:\n    title: \"\"\n    version: 0.0.1\npaths: {}\ncomponents:\n    schemas: {}\n"
  },
  {
    "path": "service/user/test/user.go",
    "content": "package main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"google.golang.org/grpc\"\n\tv1 \"user/api/user/v1\"\n)\n\nvar userClient v1.UserClient\nvar conn *grpc.ClientConn\n\nfunc main() {\n\tInit()\n\t//TestDeleteAddress() // 删除用户地址\n\t//TestDefaultAddress() // 设置用户默认地址\n\t//TestUpdateAddress() // 修改用户地址列表\n\tTestGetUserAddressList() // 获取用户地址列表\n\t//TestCreateAddress() // 创建用户地址\n\t//TestGetUserList() // 获取用户列表\n\t//TestCreateUser() // 创建用户\n\t//TestUpdateUser()      // 更新用户\n\t//TestGetUserByMobile() // 根据手机获取用户\n\t//TestGetUserById() // 根据ID 获取用户\n\tconn.Close()\n}\nfunc TestDeleteAddress() {\n\trsp, err := userClient.DeleteAddress(context.Background(), &v1.AddressReq{\n\t\tId:  4,\n\t\tUid: 2,\n\t})\n\tif err != nil {\n\t\tpanic(\"grpc 删除用户地址失败\" + err.Error())\n\t}\n\tfmt.Println(rsp)\n}\nfunc TestDefaultAddress() {\n\trsp, err := userClient.DefaultAddress(context.Background(), &v1.AddressReq{\n\t\tId:  2,\n\t\tUid: 1,\n\t})\n\tif err != nil {\n\t\tpanic(\"grpc 设置默认地址失败\" + err.Error())\n\t}\n\tfmt.Println(rsp)\n}\nfunc TestUpdateAddress() {\n\trsp, err := userClient.UpdateAddress(context.Background(), &v1.UpdateAddressReq{\n\t\tId:        1,\n\t\tUid:       2,\n\t\tName:      \"test1111\",\n\t\tMobile:    \"13161006666\",\n\t\tProvince:  \"北京市\",\n\t\tCity:      \"北京\",\n\t\tDistricts: \"朝阳\",\n\t\tAddress:   \"十八里\",\n\t\tPostCode:  \"00001\",\n\t\tIsDefault: 0,\n\t})\n\tif err != nil {\n\t\tpanic(\"grpc 修改地址失败\" + err.Error())\n\t}\n\tfmt.Println(rsp)\n}\nfunc TestCreateAddress() {\n\trsp, err := userClient.CreateAddress(context.Background(), &v1.CreateAddressReq{\n\t\tUid:       2,\n\t\tName:      \"test666\",\n\t\tMobile:    \"13161006666\",\n\t\tProvince:  \"北京市\",\n\t\tCity:      \"北京\",\n\t\tDistricts: \"朝阳\",\n\t\tAddress:   \"十八里\",\n\t\tPostCode:  \"00001\",\n\t\tIsDefault: 0,\n\t})\n\tif err != nil {\n\t\tpanic(\"grpc 创建地址失败\" + err.Error())\n\t}\n\tfmt.Println(rsp.Id)\n}\n\nfunc TestGetUserAddressList() {\n\trsp, err := userClient.ListAddress(context.Background(), &v1.ListAddressReq{\n\t\tUid: 11,\n\t})\n\tif err != nil {\n\t\tpanic(\"grpc get user by ID err\" + err.Error())\n\t}\n\tfmt.Println(rsp)\n}\n\n// Init 初始化 grpc 链接\nfunc Init() {\n\tvar err error\n\tconn, err = grpc.Dial(\"127.0.0.1:50051\", grpc.WithInsecure())\n\tif err != nil {\n\t\tpanic(\"grpc link err\" + err.Error())\n\t}\n\tuserClient = v1.NewUserClient(conn)\n}\n\nfunc TestGetUserById() {\n\trsp, err := userClient.GetUserById(context.Background(), &v1.IdRequest{\n\t\tId: 3,\n\t})\n\tif err != nil {\n\t\tpanic(\"grpc get user by ID err\" + err.Error())\n\t}\n\tfmt.Println(rsp)\n}\n\nfunc TestGetUserByMobile() {\n\trsp, err := userClient.GetUserByMobile(context.Background(), &v1.MobileRequest{\n\t\tMobile: \"13501167232\",\n\t})\n\tif err != nil {\n\t\tpanic(\"grpc get user by mobile err\" + err.Error())\n\t}\n\tfmt.Println(rsp)\n}\n\nfunc TestUpdateUser() {\n\trsp, err := userClient.UpdateUser(context.Background(), &v1.UpdateUserInfo{\n\t\tId:       9,\n\t\tGender:   \"female\",\n\t\tNickName: fmt.Sprintf(\"YWW%d\", 233),\n\t})\n\tif err != nil {\n\t\tpanic(\"grpc update user err\" + err.Error())\n\t}\n\tfmt.Println(rsp)\n}\n\n// TestCreateUser 测试创建 10 个用户数据\nfunc TestCreateUser() {\n\tfor i := 0; i < 10; i++ {\n\t\trsp, err := userClient.CreateUser(context.Background(), &v1.CreateUserInfo{\n\t\t\tMobile:   fmt.Sprintf(\"1350116723%d\", i),\n\t\t\tPassword: \"Gaofei123456\",\n\t\t\tNickName: fmt.Sprintf(\"YW%d\", i),\n\t\t})\n\t\tif err != nil {\n\t\t\tpanic(\"grpc 创建用户失败\" + err.Error())\n\t\t}\n\t\tfmt.Println(rsp.Id)\n\t}\n}\n\nfunc TestGetUserList() {\n\tr, err := userClient.GetUserList(context.Background(), &v1.PageInfo{\n\t\tPn:    1,\n\t\tPSize: 60,\n\t})\n\n\tif err != nil {\n\t\tpanic(\"grpc get err\" + err.Error())\n\t}\n\n\tfor _, user := range r.Data {\n\t\tfmt.Println(user.Mobile, user.NickName, user.Password)\n\n\t\tif user.Mobile == \"13501167242\" {\n\t\t\tcheckRsp, err := userClient.CheckPassword(context.Background(), &v1.PasswordCheckInfo{\n\t\t\t\tPassword:          \"1234567890\",\n\t\t\t\tEncryptedPassword: user.Password,\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tpanic(\" get check user  psw err\" + err.Error())\n\t\t\t}\n\t\t\tfmt.Println(checkRsp.Success)\n\t\t} else {\n\t\t\tcheckRsp, err := userClient.CheckPassword(context.Background(), &v1.PasswordCheckInfo{\n\t\t\t\tPassword:          \"admin\",\n\t\t\t\tEncryptedPassword: user.Password,\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tpanic(\" get check user  psw err\" + err.Error())\n\t\t\t}\n\t\t\tfmt.Println(checkRsp.Success)\n\t\t}\n\n\t}\n\tfmt.Println(r.Total)\n}\n"
  },
  {
    "path": "service/user/third_party/README.md",
    "content": "# third_party\n"
  },
  {
    "path": "service/user/third_party/errors/errors.proto",
    "content": "syntax = \"proto3\";\n\npackage errors;\n\noption go_package = \"github.com/go-kratos/kratos/v2/errors;errors\";\noption java_multiple_files = true;\noption java_package = \"com.github.kratos.errors\";\noption objc_class_prefix = \"KratosErrors\";\n\nimport \"google/protobuf/descriptor.proto\";\n\nextend google.protobuf.EnumOptions {\n  int32 default_code = 1108;\n}\n\nextend google.protobuf.EnumValueOptions {\n  int32 code = 1109;\n}"
  },
  {
    "path": "service/user/third_party/google/api/annotations.proto",
    "content": "// Copyright (c) 2015, Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\npackage google.api;\n\nimport \"google/api/http.proto\";\nimport \"google/protobuf/descriptor.proto\";\n\noption go_package = \"google.golang.org/genproto/googleapis/api/annotations;annotations\";\noption java_multiple_files = true;\noption java_outer_classname = \"AnnotationsProto\";\noption java_package = \"com.google.api\";\noption objc_class_prefix = \"GAPI\";\n\nextend google.protobuf.MethodOptions {\n  // See `HttpRule`.\n  HttpRule http = 72295728;\n}\n"
  },
  {
    "path": "service/user/third_party/google/api/client.proto",
    "content": "// Copyright 2019 Google LLC.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\npackage google.api;\n\nimport \"google/protobuf/descriptor.proto\";\n\noption go_package = \"google.golang.org/genproto/googleapis/api/annotations;annotations\";\noption java_multiple_files = true;\noption java_outer_classname = \"ClientProto\";\noption java_package = \"com.google.api\";\noption objc_class_prefix = \"GAPI\";\n\n\nextend google.protobuf.ServiceOptions {\n  // The hostname for this service.\n  // This should be specified with no prefix or protocol.\n  //\n  // Example:\n  //\n  //   service Foo {\n  //     option (google.api.default_host) = \"foo.googleapi.com\";\n  //     ...\n  //   }\n  string default_host = 1049;\n\n  // OAuth scopes needed for the client.\n  //\n  // Example:\n  //\n  //   service Foo {\n  //     option (google.api.oauth_scopes) = \\\n  //       \"https://www.googleapis.com/auth/cloud-platform\";\n  //     ...\n  //   }\n  //\n  // If there is more than one scope, use a comma-separated string:\n  //\n  // Example:\n  //\n  //   service Foo {\n  //     option (google.api.oauth_scopes) = \\\n  //       \"https://www.googleapis.com/auth/cloud-platform,\"\n  //       \"https://www.googleapis.com/auth/monitoring\";\n  //     ...\n  //   }\n  string oauth_scopes = 1050;\n}\n\n\nextend google.protobuf.MethodOptions {\n  // A definition of a client library method signature.\n  //\n  // In client libraries, each proto RPC corresponds to one or more methods\n  // which the end user is able to call, and calls the underlying RPC.\n  // Normally, this method receives a single argument (a struct or instance\n  // corresponding to the RPC request object). Defining this field will\n  // add one or more overloads providing flattened or simpler method signatures\n  // in some languages.\n  //\n  // The fields on the method signature are provided as a comma-separated\n  // string.\n  //\n  // For example, the proto RPC and annotation:\n  //\n  //   rpc CreateSubscription(CreateSubscriptionRequest)\n  //       returns (Subscription) {\n  //     option (google.api.method_signature) = \"name,topic\";\n  //   }\n  //\n  // Would add the following Java overload (in addition to the method accepting\n  // the request object):\n  //\n  //   public final Subscription createSubscription(String name, String topic)\n  //\n  // The following backwards-compatibility guidelines apply:\n  //\n  //   * Adding this annotation to an unannotated method is backwards\n  //     compatible.\n  //   * Adding this annotation to a method which already has existing\n  //     method signature annotations is backwards compatible if and only if\n  //     the new method signature annotation is last in the sequence.\n  //   * Modifying or removing an existing method signature annotation is\n  //     a breaking change.\n  //   * Re-ordering existing method signature annotations is a breaking\n  //     change.\n  repeated string method_signature = 1051;\n}"
  },
  {
    "path": "service/user/third_party/google/api/field_behavior.proto",
    "content": "// Copyright 2019 Google LLC.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\npackage google.api;\n\nimport \"google/protobuf/descriptor.proto\";\n\noption go_package = \"google.golang.org/genproto/googleapis/api/annotations;annotations\";\noption java_multiple_files = true;\noption java_outer_classname = \"FieldBehaviorProto\";\noption java_package = \"com.google.api\";\noption objc_class_prefix = \"GAPI\";\n\n\n// An indicator of the behavior of a given field (for example, that a field\n// is required in requests, or given as output but ignored as input).\n// This **does not** change the behavior in protocol buffers itself; it only\n// denotes the behavior and may affect how API tooling handles the field.\n//\n// Note: This enum **may** receive new values in the future.\nenum FieldBehavior {\n  // Conventional default for enums. Do not use this.\n  FIELD_BEHAVIOR_UNSPECIFIED = 0;\n\n  // Specifically denotes a field as optional.\n  // While all fields in protocol buffers are optional, this may be specified\n  // for emphasis if appropriate.\n  OPTIONAL = 1;\n\n  // Denotes a field as required.\n  // This indicates that the field **must** be provided as part of the request,\n  // and failure to do so will cause an error (usually `INVALID_ARGUMENT`).\n  REQUIRED = 2;\n\n  // Denotes a field as output only.\n  // This indicates that the field is provided in responses, but including the\n  // field in a request does nothing (the server *must* ignore it and\n  // *must not* throw an error as a result of the field's presence).\n  OUTPUT_ONLY = 3;\n\n  // Denotes a field as input only.\n  // This indicates that the field is provided in requests, and the\n  // corresponding field is not included in output.\n  INPUT_ONLY = 4;\n\n  // Denotes a field as immutable.\n  // This indicates that the field may be set once in a request to create a\n  // resource, but may not be changed thereafter.\n  IMMUTABLE = 5;\n}\n\n\nextend google.protobuf.FieldOptions {\n  // A designation of a specific field behavior (required, output only, etc.)\n  // in protobuf messages.\n  //\n  // Examples:\n  //\n  //   string name = 1 [(google.api.field_behavior) = REQUIRED];\n  //   State state = 1 [(google.api.field_behavior) = OUTPUT_ONLY];\n  //   google.protobuf.Duration ttl = 1\n  //     [(google.api.field_behavior) = INPUT_ONLY];\n  //   google.protobuf.Timestamp expire_time = 1\n  //     [(google.api.field_behavior) = OUTPUT_ONLY,\n  //      (google.api.field_behavior) = IMMUTABLE];\n  repeated FieldBehavior field_behavior = 1052;\n}"
  },
  {
    "path": "service/user/third_party/google/api/http.proto",
    "content": "// Copyright 2020 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\npackage google.api;\n\noption cc_enable_arenas = true;\noption go_package = \"google.golang.org/genproto/googleapis/api/annotations;annotations\";\noption java_multiple_files = true;\noption java_outer_classname = \"HttpProto\";\noption java_package = \"com.google.api\";\noption objc_class_prefix = \"GAPI\";\n\n// Defines the HTTP configuration for an API service. It contains a list of\n// [HttpRule][google.api.HttpRule], each specifying the mapping of an RPC method\n// to one or more HTTP REST API methods.\nmessage Http {\n  // A list of HTTP configuration rules that apply to individual API methods.\n  //\n  // **NOTE:** All service configuration rules follow \"last one wins\" order.\n  repeated HttpRule rules = 1;\n\n  // When set to true, URL path parameters will be fully URI-decoded except in\n  // cases of single segment matches in reserved expansion, where \"%2F\" will be\n  // left encoded.\n  //\n  // The default behavior is to not decode RFC 6570 reserved characters in multi\n  // segment matches.\n  bool fully_decode_reserved_expansion = 2;\n}\n\n// # gRPC Transcoding\n//\n// gRPC Transcoding is a feature for mapping between a gRPC method and one or\n// more HTTP REST endpoints. It allows developers to build a single API service\n// that supports both gRPC APIs and REST APIs. Many systems, including [Google\n// APIs](https://github.com/googleapis/googleapis),\n// [Cloud Endpoints](https://cloud.google.com/endpoints), [gRPC\n// Gateway](https://github.com/grpc-ecosystem/grpc-gateway),\n// and [Envoy](https://github.com/envoyproxy/envoy) proxy support this feature\n// and use it for large scale production services.\n//\n// `HttpRule` defines the schema of the gRPC/REST mapping. The mapping specifies\n// how different portions of the gRPC request message are mapped to the URL\n// path, URL query parameters, and HTTP request body. It also controls how the\n// gRPC response message is mapped to the HTTP response body. `HttpRule` is\n// typically specified as an `google.api.http` annotation on the gRPC method.\n//\n// Each mapping specifies a URL path template and an HTTP method. The path\n// template may refer to one or more fields in the gRPC request message, as long\n// as each field is a non-repeated field with a primitive (non-message) type.\n// The path template controls how fields of the request message are mapped to\n// the URL path.\n//\n// Example:\n//\n//     service Messaging {\n//       rpc GetMessage(GetMessageRequest) returns (Message) {\n//         option (google.api.http) = {\n//             get: \"/v1/{name=messages/*}\"\n//         };\n//       }\n//     }\n//     message GetMessageRequest {\n//       string name = 1; // Mapped to URL path.\n//     }\n//     message Message {\n//       string text = 1; // The resource content.\n//     }\n//\n// This enables an HTTP REST to gRPC mapping as below:\n//\n// HTTP | gRPC\n// -----|-----\n// `GET /v1/messages/123456`  | `GetMessage(name: \"messages/123456\")`\n//\n// Any fields in the request message which are not bound by the path template\n// automatically become HTTP query parameters if there is no HTTP request body.\n// For example:\n//\n//     service Messaging {\n//       rpc GetMessage(GetMessageRequest) returns (Message) {\n//         option (google.api.http) = {\n//             get:\"/v1/messages/{message_id}\"\n//         };\n//       }\n//     }\n//     message GetMessageRequest {\n//       message SubMessage {\n//         string subfield = 1;\n//       }\n//       string message_id = 1; // Mapped to URL path.\n//       int64 revision = 2;    // Mapped to URL query parameter `revision`.\n//       SubMessage sub = 3;    // Mapped to URL query parameter `sub.subfield`.\n//     }\n//\n// This enables a HTTP JSON to RPC mapping as below:\n//\n// HTTP | gRPC\n// -----|-----\n// `GET /v1/messages/123456?revision=2&sub.subfield=foo` |\n// `GetMessage(message_id: \"123456\" revision: 2 sub: SubMessage(subfield:\n// \"foo\"))`\n//\n// Note that fields which are mapped to URL query parameters must have a\n// primitive type or a repeated primitive type or a non-repeated message type.\n// In the case of a repeated type, the parameter can be repeated in the URL\n// as `...?param=A&param=B`. In the case of a message type, each field of the\n// message is mapped to a separate parameter, such as\n// `...?foo.a=A&foo.b=B&foo.c=C`.\n//\n// For HTTP methods that allow a request body, the `body` field\n// specifies the mapping. Consider a REST update method on the\n// message resource collection:\n//\n//     service Messaging {\n//       rpc UpdateMessage(UpdateMessageRequest) returns (Message) {\n//         option (google.api.http) = {\n//           patch: \"/v1/messages/{message_id}\"\n//           body: \"message\"\n//         };\n//       }\n//     }\n//     message UpdateMessageRequest {\n//       string message_id = 1; // mapped to the URL\n//       Message message = 2;   // mapped to the body\n//     }\n//\n// The following HTTP JSON to RPC mapping is enabled, where the\n// representation of the JSON in the request body is determined by\n// protos JSON encoding:\n//\n// HTTP | gRPC\n// -----|-----\n// `PATCH /v1/messages/123456 { \"text\": \"Hi!\" }` | `UpdateMessage(message_id:\n// \"123456\" message { text: \"Hi!\" })`\n//\n// The special name `*` can be used in the body mapping to define that\n// every field not bound by the path template should be mapped to the\n// request body.  This enables the following alternative definition of\n// the update method:\n//\n//     service Messaging {\n//       rpc UpdateMessage(Message) returns (Message) {\n//         option (google.api.http) = {\n//           patch: \"/v1/messages/{message_id}\"\n//           body: \"*\"\n//         };\n//       }\n//     }\n//     message Message {\n//       string message_id = 1;\n//       string text = 2;\n//     }\n//\n//\n// The following HTTP JSON to RPC mapping is enabled:\n//\n// HTTP | gRPC\n// -----|-----\n// `PATCH /v1/messages/123456 { \"text\": \"Hi!\" }` | `UpdateMessage(message_id:\n// \"123456\" text: \"Hi!\")`\n//\n// Note that when using `*` in the body mapping, it is not possible to\n// have HTTP parameters, as all fields not bound by the path end in\n// the body. This makes this option more rarely used in practice when\n// defining REST APIs. The common usage of `*` is in custom methods\n// which don't use the URL at all for transferring data.\n//\n// It is possible to define multiple HTTP methods for one RPC by using\n// the `additional_bindings` option. Example:\n//\n//     service Messaging {\n//       rpc GetMessage(GetMessageRequest) returns (Message) {\n//         option (google.api.http) = {\n//           get: \"/v1/messages/{message_id}\"\n//           additional_bindings {\n//             get: \"/v1/users/{user_id}/messages/{message_id}\"\n//           }\n//         };\n//       }\n//     }\n//     message GetMessageRequest {\n//       string message_id = 1;\n//       string user_id = 2;\n//     }\n//\n// This enables the following two alternative HTTP JSON to RPC mappings:\n//\n// HTTP | gRPC\n// -----|-----\n// `GET /v1/messages/123456` | `GetMessage(message_id: \"123456\")`\n// `GET /v1/users/me/messages/123456` | `GetMessage(user_id: \"me\" message_id:\n// \"123456\")`\n//\n// ## Rules for HTTP mapping\n//\n// 1. Leaf request fields (recursive expansion nested messages in the request\n//    message) are classified into three categories:\n//    - Fields referred by the path template. They are passed via the URL path.\n//    - Fields referred by the [HttpRule.body][google.api.HttpRule.body]. They are passed via the HTTP\n//      request body.\n//    - All other fields are passed via the URL query parameters, and the\n//      parameter name is the field path in the request message. A repeated\n//      field can be represented as multiple query parameters under the same\n//      name.\n//  2. If [HttpRule.body][google.api.HttpRule.body] is \"*\", there is no URL query parameter, all fields\n//     are passed via URL path and HTTP request body.\n//  3. If [HttpRule.body][google.api.HttpRule.body] is omitted, there is no HTTP request body, all\n//     fields are passed via URL path and URL query parameters.\n//\n// ### Path template syntax\n//\n//     Template = \"/\" Segments [ Verb ] ;\n//     Segments = Segment { \"/\" Segment } ;\n//     Segment  = \"*\" | \"**\" | LITERAL | Variable ;\n//     Variable = \"{\" FieldPath [ \"=\" Segments ] \"}\" ;\n//     FieldPath = IDENT { \".\" IDENT } ;\n//     Verb     = \":\" LITERAL ;\n//\n// The syntax `*` matches a single URL path segment. The syntax `**` matches\n// zero or more URL path segments, which must be the last part of the URL path\n// except the `Verb`.\n//\n// The syntax `Variable` matches part of the URL path as specified by its\n// template. A variable template must not contain other variables. If a variable\n// matches a single path segment, its template may be omitted, e.g. `{var}`\n// is equivalent to `{var=*}`.\n//\n// The syntax `LITERAL` matches literal text in the URL path. If the `LITERAL`\n// contains any reserved character, such characters should be percent-encoded\n// before the matching.\n//\n// If a variable contains exactly one path segment, such as `\"{var}\"` or\n// `\"{var=*}\"`, when such a variable is expanded into a URL path on the client\n// side, all characters except `[-_.~0-9a-zA-Z]` are percent-encoded. The\n// server side does the reverse decoding. Such variables show up in the\n// [Discovery\n// Document](https://developers.google.com/discovery/v1/reference/apis) as\n// `{var}`.\n//\n// If a variable contains multiple path segments, such as `\"{var=foo/*}\"`\n// or `\"{var=**}\"`, when such a variable is expanded into a URL path on the\n// client side, all characters except `[-_.~/0-9a-zA-Z]` are percent-encoded.\n// The server side does the reverse decoding, except \"%2F\" and \"%2f\" are left\n// unchanged. Such variables show up in the\n// [Discovery\n// Document](https://developers.google.com/discovery/v1/reference/apis) as\n// `{+var}`.\n//\n// ## Using gRPC API Service Configuration\n//\n// gRPC API Service Configuration (service config) is a configuration language\n// for configuring a gRPC service to become a user-facing product. The\n// service config is simply the YAML representation of the `google.api.Service`\n// proto message.\n//\n// As an alternative to annotating your proto file, you can configure gRPC\n// transcoding in your service config YAML files. You do this by specifying a\n// `HttpRule` that maps the gRPC method to a REST endpoint, achieving the same\n// effect as the proto annotation. This can be particularly useful if you\n// have a proto that is reused in multiple services. Note that any transcoding\n// specified in the service config will override any matching transcoding\n// configuration in the proto.\n//\n// Example:\n//\n//     http:\n//       rules:\n//         # Selects a gRPC method and applies HttpRule to it.\n//         - selector: example.v1.Messaging.GetMessage\n//           get: /v1/messages/{message_id}/{sub.subfield}\n//\n// ## Special notes\n//\n// When gRPC Transcoding is used to map a gRPC to JSON REST endpoints, the\n// proto to JSON conversion must follow the [proto3\n// specification](https://developers.google.com/protocol-buffers/docs/proto3#json).\n//\n// While the single segment variable follows the semantics of\n// [RFC 6570](https://tools.ietf.org/html/rfc6570) Section 3.2.2 Simple String\n// Expansion, the multi segment variable **does not** follow RFC 6570 Section\n// 3.2.3 Reserved Expansion. The reason is that the Reserved Expansion\n// does not expand special characters like `?` and `#`, which would lead\n// to invalid URLs. As the result, gRPC Transcoding uses a custom encoding\n// for multi segment variables.\n//\n// The path variables **must not** refer to any repeated or mapped field,\n// because client libraries are not capable of handling such variable expansion.\n//\n// The path variables **must not** capture the leading \"/\" character. The reason\n// is that the most common use case \"{var}\" does not capture the leading \"/\"\n// character. For consistency, all path variables must share the same behavior.\n//\n// Repeated message fields must not be mapped to URL query parameters, because\n// no client library can support such complicated mapping.\n//\n// If an API needs to use a JSON array for request or response body, it can map\n// the request or response body to a repeated field. However, some gRPC\n// Transcoding implementations may not support this feature.\nmessage HttpRule {\n  // Selects a method to which this rule applies.\n  //\n  // Refer to [selector][google.api.DocumentationRule.selector] for syntax details.\n  string selector = 1;\n\n  // Determines the URL pattern is matched by this rules. This pattern can be\n  // used with any of the {get|put|post|delete|patch} methods. A custom method\n  // can be defined using the 'custom' field.\n  oneof pattern {\n    // Maps to HTTP GET. Used for listing and getting information about\n    // resources.\n    string get = 2;\n\n    // Maps to HTTP PUT. Used for replacing a resource.\n    string put = 3;\n\n    // Maps to HTTP POST. Used for creating a resource or performing an action.\n    string post = 4;\n\n    // Maps to HTTP DELETE. Used for deleting a resource.\n    string delete = 5;\n\n    // Maps to HTTP PATCH. Used for updating a resource.\n    string patch = 6;\n\n    // The custom pattern is used for specifying an HTTP method that is not\n    // included in the `pattern` field, such as HEAD, or \"*\" to leave the\n    // HTTP method unspecified for this rule. The wild-card rule is useful\n    // for services that provide content to Web (HTML) clients.\n    CustomHttpPattern custom = 8;\n  }\n\n  // The name of the request field whose value is mapped to the HTTP request\n  // body, or `*` for mapping all request fields not captured by the path\n  // pattern to the HTTP body, or omitted for not having any HTTP request body.\n  //\n  // NOTE: the referred field must be present at the top-level of the request\n  // message type.\n  string body = 7;\n\n  // Optional. The name of the response field whose value is mapped to the HTTP\n  // response body. When omitted, the entire response message will be used\n  // as the HTTP response body.\n  //\n  // NOTE: The referred field must be present at the top-level of the response\n  // message type.\n  string response_body = 12;\n\n  // Additional HTTP bindings for the selector. Nested bindings must\n  // not contain an `additional_bindings` field themselves (that is,\n  // the nesting may only be one level deep).\n  repeated HttpRule additional_bindings = 11;\n}\n\n// A custom pattern is used for defining custom HTTP verb.\nmessage CustomHttpPattern {\n  // The name of this custom HTTP verb.\n  string kind = 1;\n\n  // The path matched by this custom verb.\n  string path = 2;\n}\n"
  },
  {
    "path": "service/user/third_party/google/api/httpbody.proto",
    "content": "// Copyright 2020 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\npackage google.api;\n\nimport \"google/protobuf/any.proto\";\n\noption cc_enable_arenas = true;\noption go_package = \"google.golang.org/genproto/googleapis/api/httpbody;httpbody\";\noption java_multiple_files = true;\noption java_outer_classname = \"HttpBodyProto\";\noption java_package = \"com.google.api\";\noption objc_class_prefix = \"GAPI\";\n\n// Message that represents an arbitrary HTTP body. It should only be used for\n// payload formats that can't be represented as JSON, such as raw binary or\n// an HTML page.\n//\n//\n// This message can be used both in streaming and non-streaming API methods in\n// the request as well as the response.\n//\n// It can be used as a top-level request field, which is convenient if one\n// wants to extract parameters from either the URL or HTTP template into the\n// request fields and also want access to the raw HTTP body.\n//\n// Example:\n//\n//     message GetResourceRequest {\n//       // A unique request id.\n//       string request_id = 1;\n//\n//       // The raw HTTP body is bound to this field.\n//       google.api.HttpBody http_body = 2;\n//     }\n//\n//     service ResourceService {\n//       rpc GetResource(GetResourceRequest) returns (google.api.HttpBody);\n//       rpc UpdateResource(google.api.HttpBody) returns\n//       (google.protobuf.Empty);\n//     }\n//\n// Example with streaming methods:\n//\n//     service CaldavService {\n//       rpc GetCalendar(stream google.api.HttpBody)\n//         returns (stream google.api.HttpBody);\n//       rpc UpdateCalendar(stream google.api.HttpBody)\n//         returns (stream google.api.HttpBody);\n//     }\n//\n// Use of this type only changes how the request and response bodies are\n// handled, all other features will continue to work unchanged.\nmessage HttpBody {\n  // The HTTP Content-Type header value specifying the content type of the body.\n  string content_type = 1;\n\n  // The HTTP request/response body as raw binary.\n  bytes data = 2;\n\n  // Application specific response metadata. Must be set in the first response\n  // for streaming APIs.\n  repeated google.protobuf.Any extensions = 3;\n}\n"
  },
  {
    "path": "service/user/third_party/google/protobuf/any.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption go_package = \"google.golang.org/protobuf/types/known/anypb\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"AnyProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\n\n// `Any` contains an arbitrary serialized protocol buffer message along with a\n// URL that describes the type of the serialized message.\n//\n// Protobuf library provides support to pack/unpack Any values in the form\n// of utility functions or additional generated methods of the Any type.\n//\n// Example 1: Pack and unpack a message in C++.\n//\n//     Foo foo = ...;\n//     Any any;\n//     any.PackFrom(foo);\n//     ...\n//     if (any.UnpackTo(&foo)) {\n//       ...\n//     }\n//\n// Example 2: Pack and unpack a message in Java.\n//\n//     Foo foo = ...;\n//     Any any = Any.pack(foo);\n//     ...\n//     if (any.is(Foo.class)) {\n//       foo = any.unpack(Foo.class);\n//     }\n//\n// Example 3: Pack and unpack a message in Python.\n//\n//     foo = Foo(...)\n//     any = Any()\n//     any.Pack(foo)\n//     ...\n//     if any.Is(Foo.DESCRIPTOR):\n//       any.Unpack(foo)\n//       ...\n//\n// Example 4: Pack and unpack a message in Go\n//\n//      foo := &pb.Foo{...}\n//      any, err := anypb.New(foo)\n//      if err != nil {\n//        ...\n//      }\n//      ...\n//      foo := &pb.Foo{}\n//      if err := any.UnmarshalTo(foo); err != nil {\n//        ...\n//      }\n//\n// The pack methods provided by protobuf library will by default use\n// 'type.googleapis.com/full.type.name' as the type URL and the unpack\n// methods only use the fully qualified type name after the last '/'\n// in the type URL, for example \"foo.bar.com/x/y.z\" will yield type\n// name \"y.z\".\n//\n//\n// JSON\n//\n// The JSON representation of an `Any` value uses the regular\n// representation of the deserialized, embedded message, with an\n// additional field `@type` which contains the type URL. Example:\n//\n//     package google.profile;\n//     message Person {\n//       string first_name = 1;\n//       string last_name = 2;\n//     }\n//\n//     {\n//       \"@type\": \"type.googleapis.com/google.profile.Person\",\n//       \"firstName\": <string>,\n//       \"lastName\": <string>\n//     }\n//\n// If the embedded message type is well-known and has a custom JSON\n// representation, that representation will be embedded adding a field\n// `value` which holds the custom JSON in addition to the `@type`\n// field. Example (for message [google.protobuf.Duration][]):\n//\n//     {\n//       \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n//       \"value\": \"1.212s\"\n//     }\n//\nmessage Any {\n  // A URL/resource name that uniquely identifies the type of the serialized\n  // protocol buffer message. This string must contain at least\n  // one \"/\" character. The last segment of the URL's path must represent\n  // the fully qualified name of the type (as in\n  // `path/google.protobuf.Duration`). The name should be in a canonical form\n  // (e.g., leading \".\" is not accepted).\n  //\n  // In practice, teams usually precompile into the binary all types that they\n  // expect it to use in the context of Any. However, for URLs which use the\n  // scheme `http`, `https`, or no scheme, one can optionally set up a type\n  // server that maps type URLs to message definitions as follows:\n  //\n  // * If no scheme is provided, `https` is assumed.\n  // * An HTTP GET on the URL must yield a [google.protobuf.Type][]\n  //   value in binary format, or produce an error.\n  // * Applications are allowed to cache lookup results based on the\n  //   URL, or have them precompiled into a binary to avoid any\n  //   lookup. Therefore, binary compatibility needs to be preserved\n  //   on changes to types. (Use versioned type names to manage\n  //   breaking changes.)\n  //\n  // Note: this functionality is not currently available in the official\n  // protobuf release, and it is not used for type URLs beginning with\n  // type.googleapis.com.\n  //\n  // Schemes other than `http`, `https` (or the empty scheme) might be\n  // used with implementation specific semantics.\n  //\n  string type_url = 1;\n\n  // Must be a valid serialized protocol buffer of the above specified type.\n  bytes value = 2;\n}\n"
  },
  {
    "path": "service/user/third_party/google/protobuf/api.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\nimport \"google/protobuf/source_context.proto\";\nimport \"google/protobuf/type.proto\";\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"ApiProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\noption go_package = \"google.golang.org/protobuf/types/known/apipb\";\n\n// Api is a light-weight descriptor for an API Interface.\n//\n// Interfaces are also described as \"protocol buffer services\" in some contexts,\n// such as by the \"service\" keyword in a .proto file, but they are different\n// from API Services, which represent a concrete implementation of an interface\n// as opposed to simply a description of methods and bindings. They are also\n// sometimes simply referred to as \"APIs\" in other contexts, such as the name of\n// this message itself. See https://cloud.google.com/apis/design/glossary for\n// detailed terminology.\nmessage Api {\n  // The fully qualified name of this interface, including package name\n  // followed by the interface's simple name.\n  string name = 1;\n\n  // The methods of this interface, in unspecified order.\n  repeated Method methods = 2;\n\n  // Any metadata attached to the interface.\n  repeated Option options = 3;\n\n  // A version string for this interface. If specified, must have the form\n  // `major-version.minor-version`, as in `1.10`. If the minor version is\n  // omitted, it defaults to zero. If the entire version field is empty, the\n  // major version is derived from the package name, as outlined below. If the\n  // field is not empty, the version in the package name will be verified to be\n  // consistent with what is provided here.\n  //\n  // The versioning schema uses [semantic\n  // versioning](http://semver.org) where the major version number\n  // indicates a breaking change and the minor version an additive,\n  // non-breaking change. Both version numbers are signals to users\n  // what to expect from different versions, and should be carefully\n  // chosen based on the product plan.\n  //\n  // The major version is also reflected in the package name of the\n  // interface, which must end in `v<major-version>`, as in\n  // `google.feature.v1`. For major versions 0 and 1, the suffix can\n  // be omitted. Zero major versions must only be used for\n  // experimental, non-GA interfaces.\n  //\n  //\n  string version = 4;\n\n  // Source context for the protocol buffer service represented by this\n  // message.\n  SourceContext source_context = 5;\n\n  // Included interfaces. See [Mixin][].\n  repeated Mixin mixins = 6;\n\n  // The source syntax of the service.\n  Syntax syntax = 7;\n}\n\n// Method represents a method of an API interface.\nmessage Method {\n  // The simple name of this method.\n  string name = 1;\n\n  // A URL of the input message type.\n  string request_type_url = 2;\n\n  // If true, the request is streamed.\n  bool request_streaming = 3;\n\n  // The URL of the output message type.\n  string response_type_url = 4;\n\n  // If true, the response is streamed.\n  bool response_streaming = 5;\n\n  // Any metadata attached to the method.\n  repeated Option options = 6;\n\n  // The source syntax of this method.\n  Syntax syntax = 7;\n}\n\n// Declares an API Interface to be included in this interface. The including\n// interface must redeclare all the methods from the included interface, but\n// documentation and options are inherited as follows:\n//\n// - If after comment and whitespace stripping, the documentation\n//   string of the redeclared method is empty, it will be inherited\n//   from the original method.\n//\n// - Each annotation belonging to the service config (http,\n//   visibility) which is not set in the redeclared method will be\n//   inherited.\n//\n// - If an http annotation is inherited, the path pattern will be\n//   modified as follows. Any version prefix will be replaced by the\n//   version of the including interface plus the [root][] path if\n//   specified.\n//\n// Example of a simple mixin:\n//\n//     package google.acl.v1;\n//     service AccessControl {\n//       // Get the underlying ACL object.\n//       rpc GetAcl(GetAclRequest) returns (Acl) {\n//         option (google.api.http).get = \"/v1/{resource=**}:getAcl\";\n//       }\n//     }\n//\n//     package google.storage.v2;\n//     service Storage {\n//       rpc GetAcl(GetAclRequest) returns (Acl);\n//\n//       // Get a data record.\n//       rpc GetData(GetDataRequest) returns (Data) {\n//         option (google.api.http).get = \"/v2/{resource=**}\";\n//       }\n//     }\n//\n// Example of a mixin configuration:\n//\n//     apis:\n//     - name: google.storage.v2.Storage\n//       mixins:\n//       - name: google.acl.v1.AccessControl\n//\n// The mixin construct implies that all methods in `AccessControl` are\n// also declared with same name and request/response types in\n// `Storage`. A documentation generator or annotation processor will\n// see the effective `Storage.GetAcl` method after inheriting\n// documentation and annotations as follows:\n//\n//     service Storage {\n//       // Get the underlying ACL object.\n//       rpc GetAcl(GetAclRequest) returns (Acl) {\n//         option (google.api.http).get = \"/v2/{resource=**}:getAcl\";\n//       }\n//       ...\n//     }\n//\n// Note how the version in the path pattern changed from `v1` to `v2`.\n//\n// If the `root` field in the mixin is specified, it should be a\n// relative path under which inherited HTTP paths are placed. Example:\n//\n//     apis:\n//     - name: google.storage.v2.Storage\n//       mixins:\n//       - name: google.acl.v1.AccessControl\n//         root: acls\n//\n// This implies the following inherited HTTP annotation:\n//\n//     service Storage {\n//       // Get the underlying ACL object.\n//       rpc GetAcl(GetAclRequest) returns (Acl) {\n//         option (google.api.http).get = \"/v2/acls/{resource=**}:getAcl\";\n//       }\n//       ...\n//     }\nmessage Mixin {\n  // The fully qualified name of the interface which is included.\n  string name = 1;\n\n  // If non-empty specifies a path under which inherited HTTP paths\n  // are rooted.\n  string root = 2;\n}\n"
  },
  {
    "path": "service/user/third_party/google/protobuf/compiler/plugin.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//\n// WARNING:  The plugin interface is currently EXPERIMENTAL and is subject to\n//   change.\n//\n// protoc (aka the Protocol Compiler) can be extended via plugins.  A plugin is\n// just a program that reads a CodeGeneratorRequest from stdin and writes a\n// CodeGeneratorResponse to stdout.\n//\n// Plugins written using C++ can use google/protobuf/compiler/plugin.h instead\n// of dealing with the raw protocol defined here.\n//\n// A plugin executable needs only to be placed somewhere in the path.  The\n// plugin should be named \"protoc-gen-$NAME\", and will then be used when the\n// flag \"--${NAME}_out\" is passed to protoc.\n\nsyntax = \"proto2\";\n\npackage google.protobuf.compiler;\noption java_package = \"com.google.protobuf.compiler\";\noption java_outer_classname = \"PluginProtos\";\n\noption go_package = \"google.golang.org/protobuf/types/pluginpb\";\n\nimport \"google/protobuf/descriptor.proto\";\n\n// The version number of protocol compiler.\nmessage Version {\n  optional int32 major = 1;\n  optional int32 minor = 2;\n  optional int32 patch = 3;\n  // A suffix for alpha, beta or rc release, e.g., \"alpha-1\", \"rc2\". It should\n  // be empty for mainline stable releases.\n  optional string suffix = 4;\n}\n\n// An encoded CodeGeneratorRequest is written to the plugin's stdin.\nmessage CodeGeneratorRequest {\n  // The .proto files that were explicitly listed on the command-line.  The\n  // code generator should generate code only for these files.  Each file's\n  // descriptor will be included in proto_file, below.\n  repeated string file_to_generate = 1;\n\n  // The generator parameter passed on the command-line.\n  optional string parameter = 2;\n\n  // FileDescriptorProtos for all files in files_to_generate and everything\n  // they import.  The files will appear in topological order, so each file\n  // appears before any file that imports it.\n  //\n  // protoc guarantees that all proto_files will be written after\n  // the fields above, even though this is not technically guaranteed by the\n  // protobuf wire format.  This theoretically could allow a plugin to stream\n  // in the FileDescriptorProtos and handle them one by one rather than read\n  // the entire set into memory at once.  However, as of this writing, this\n  // is not similarly optimized on protoc's end -- it will store all fields in\n  // memory at once before sending them to the plugin.\n  //\n  // Type names of fields and extensions in the FileDescriptorProto are always\n  // fully qualified.\n  repeated FileDescriptorProto proto_file = 15;\n\n  // The version number of protocol compiler.\n  optional Version compiler_version = 3;\n\n}\n\n// The plugin writes an encoded CodeGeneratorResponse to stdout.\nmessage CodeGeneratorResponse {\n  // Error message.  If non-empty, code generation failed.  The plugin process\n  // should exit with status code zero even if it reports an error in this way.\n  //\n  // This should be used to indicate errors in .proto files which prevent the\n  // code generator from generating correct code.  Errors which indicate a\n  // problem in protoc itself -- such as the input CodeGeneratorRequest being\n  // unparseable -- should be reported by writing a message to stderr and\n  // exiting with a non-zero status code.\n  optional string error = 1;\n\n  // A bitmask of supported features that the code generator supports.\n  // This is a bitwise \"or\" of values from the Feature enum.\n  optional uint64 supported_features = 2;\n\n  // Sync with code_generator.h.\n  enum Feature {\n    FEATURE_NONE = 0;\n    FEATURE_PROTO3_OPTIONAL = 1;\n  }\n\n  // Represents a single generated file.\n  message File {\n    // The file name, relative to the output directory.  The name must not\n    // contain \".\" or \"..\" components and must be relative, not be absolute (so,\n    // the file cannot lie outside the output directory).  \"/\" must be used as\n    // the path separator, not \"\\\".\n    //\n    // If the name is omitted, the content will be appended to the previous\n    // file.  This allows the generator to break large files into small chunks,\n    // and allows the generated text to be streamed back to protoc so that large\n    // files need not reside completely in memory at one time.  Note that as of\n    // this writing protoc does not optimize for this -- it will read the entire\n    // CodeGeneratorResponse before writing files to disk.\n    optional string name = 1;\n\n    // If non-empty, indicates that the named file should already exist, and the\n    // content here is to be inserted into that file at a defined insertion\n    // point.  This feature allows a code generator to extend the output\n    // produced by another code generator.  The original generator may provide\n    // insertion points by placing special annotations in the file that look\n    // like:\n    //   @@protoc_insertion_point(NAME)\n    // The annotation can have arbitrary text before and after it on the line,\n    // which allows it to be placed in a comment.  NAME should be replaced with\n    // an identifier naming the point -- this is what other generators will use\n    // as the insertion_point.  Code inserted at this point will be placed\n    // immediately above the line containing the insertion point (thus multiple\n    // insertions to the same point will come out in the order they were added).\n    // The double-@ is intended to make it unlikely that the generated code\n    // could contain things that look like insertion points by accident.\n    //\n    // For example, the C++ code generator places the following line in the\n    // .pb.h files that it generates:\n    //   // @@protoc_insertion_point(namespace_scope)\n    // This line appears within the scope of the file's package namespace, but\n    // outside of any particular class.  Another plugin can then specify the\n    // insertion_point \"namespace_scope\" to generate additional classes or\n    // other declarations that should be placed in this scope.\n    //\n    // Note that if the line containing the insertion point begins with\n    // whitespace, the same whitespace will be added to every line of the\n    // inserted text.  This is useful for languages like Python, where\n    // indentation matters.  In these languages, the insertion point comment\n    // should be indented the same amount as any inserted code will need to be\n    // in order to work correctly in that context.\n    //\n    // The code generator that generates the initial file and the one which\n    // inserts into it must both run as part of a single invocation of protoc.\n    // Code generators are executed in the order in which they appear on the\n    // command line.\n    //\n    // If |insertion_point| is present, |name| must also be present.\n    optional string insertion_point = 2;\n\n    // The file contents.\n    optional string content = 15;\n\n    // Information describing the file content being inserted. If an insertion\n    // point is used, this information will be appropriately offset and inserted\n    // into the code generation metadata for the generated files.\n    optional GeneratedCodeInfo generated_code_info = 16;\n  }\n  repeated File file = 15;\n}\n"
  },
  {
    "path": "service/user/third_party/google/protobuf/descriptor.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// The messages in this file describe the definitions found in .proto files.\n// A valid .proto file can be translated directly to a FileDescriptorProto\n// without any other information (e.g. without reading its imports).\n\n\nsyntax = \"proto2\";\n\npackage google.protobuf;\n\noption go_package = \"google.golang.org/protobuf/types/descriptorpb\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"DescriptorProtos\";\noption csharp_namespace = \"Google.Protobuf.Reflection\";\noption objc_class_prefix = \"GPB\";\noption cc_enable_arenas = true;\n\n// descriptor.proto must be optimized for speed because reflection-based\n// algorithms don't work during bootstrapping.\noption optimize_for = SPEED;\n\n// The protocol compiler can output a FileDescriptorSet containing the .proto\n// files it parses.\nmessage FileDescriptorSet {\n  repeated FileDescriptorProto file = 1;\n}\n\n// Describes a complete .proto file.\nmessage FileDescriptorProto {\n  optional string name = 1;     // file name, relative to root of source tree\n  optional string package = 2;  // e.g. \"foo\", \"foo.bar\", etc.\n\n  // Names of files imported by this file.\n  repeated string dependency = 3;\n  // Indexes of the public imported files in the dependency list above.\n  repeated int32 public_dependency = 10;\n  // Indexes of the weak imported files in the dependency list.\n  // For Google-internal migration only. Do not use.\n  repeated int32 weak_dependency = 11;\n\n  // All top-level definitions in this file.\n  repeated DescriptorProto message_type = 4;\n  repeated EnumDescriptorProto enum_type = 5;\n  repeated ServiceDescriptorProto service = 6;\n  repeated FieldDescriptorProto extension = 7;\n\n  optional FileOptions options = 8;\n\n  // This field contains optional information about the original source code.\n  // You may safely remove this entire field without harming runtime\n  // functionality of the descriptors -- the information is needed only by\n  // development tools.\n  optional SourceCodeInfo source_code_info = 9;\n\n  // The syntax of the proto file.\n  // The supported values are \"proto2\" and \"proto3\".\n  optional string syntax = 12;\n}\n\n// Describes a message type.\nmessage DescriptorProto {\n  optional string name = 1;\n\n  repeated FieldDescriptorProto field = 2;\n  repeated FieldDescriptorProto extension = 6;\n\n  repeated DescriptorProto nested_type = 3;\n  repeated EnumDescriptorProto enum_type = 4;\n\n  message ExtensionRange {\n    optional int32 start = 1;  // Inclusive.\n    optional int32 end = 2;    // Exclusive.\n\n    optional ExtensionRangeOptions options = 3;\n  }\n  repeated ExtensionRange extension_range = 5;\n\n  repeated OneofDescriptorProto oneof_decl = 8;\n\n  optional MessageOptions options = 7;\n\n  // Range of reserved tag numbers. Reserved tag numbers may not be used by\n  // fields or extension ranges in the same message. Reserved ranges may\n  // not overlap.\n  message ReservedRange {\n    optional int32 start = 1;  // Inclusive.\n    optional int32 end = 2;    // Exclusive.\n  }\n  repeated ReservedRange reserved_range = 9;\n  // Reserved field names, which may not be used by fields in the same message.\n  // A given name may only be reserved once.\n  repeated string reserved_name = 10;\n}\n\nmessage ExtensionRangeOptions {\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\n// Describes a field within a message.\nmessage FieldDescriptorProto {\n  enum Type {\n    // 0 is reserved for errors.\n    // Order is weird for historical reasons.\n    TYPE_DOUBLE = 1;\n    TYPE_FLOAT = 2;\n    // Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT64 if\n    // negative values are likely.\n    TYPE_INT64 = 3;\n    TYPE_UINT64 = 4;\n    // Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT32 if\n    // negative values are likely.\n    TYPE_INT32 = 5;\n    TYPE_FIXED64 = 6;\n    TYPE_FIXED32 = 7;\n    TYPE_BOOL = 8;\n    TYPE_STRING = 9;\n    // Tag-delimited aggregate.\n    // Group type is deprecated and not supported in proto3. However, Proto3\n    // implementations should still be able to parse the group wire format and\n    // treat group fields as unknown fields.\n    TYPE_GROUP = 10;\n    TYPE_MESSAGE = 11;  // Length-delimited aggregate.\n\n    // New in version 2.\n    TYPE_BYTES = 12;\n    TYPE_UINT32 = 13;\n    TYPE_ENUM = 14;\n    TYPE_SFIXED32 = 15;\n    TYPE_SFIXED64 = 16;\n    TYPE_SINT32 = 17;  // Uses ZigZag encoding.\n    TYPE_SINT64 = 18;  // Uses ZigZag encoding.\n  }\n\n  enum Label {\n    // 0 is reserved for errors\n    LABEL_OPTIONAL = 1;\n    LABEL_REQUIRED = 2;\n    LABEL_REPEATED = 3;\n  }\n\n  optional string name = 1;\n  optional int32 number = 3;\n  optional Label label = 4;\n\n  // If type_name is set, this need not be set.  If both this and type_name\n  // are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP.\n  optional Type type = 5;\n\n  // For message and enum types, this is the name of the type.  If the name\n  // starts with a '.', it is fully-qualified.  Otherwise, C++-like scoping\n  // rules are used to find the type (i.e. first the nested types within this\n  // message are searched, then within the parent, on up to the root\n  // namespace).\n  optional string type_name = 6;\n\n  // For extensions, this is the name of the type being extended.  It is\n  // resolved in the same manner as type_name.\n  optional string extendee = 2;\n\n  // For numeric types, contains the original text representation of the value.\n  // For booleans, \"true\" or \"false\".\n  // For strings, contains the default text contents (not escaped in any way).\n  // For bytes, contains the C escaped value.  All bytes >= 128 are escaped.\n  optional string default_value = 7;\n\n  // If set, gives the index of a oneof in the containing type's oneof_decl\n  // list.  This field is a member of that oneof.\n  optional int32 oneof_index = 9;\n\n  // JSON name of this field. The value is set by protocol compiler. If the\n  // user has set a \"json_name\" option on this field, that option's value\n  // will be used. Otherwise, it's deduced from the field's name by converting\n  // it to camelCase.\n  optional string json_name = 10;\n\n  optional FieldOptions options = 8;\n\n  // If true, this is a proto3 \"optional\". When a proto3 field is optional, it\n  // tracks presence regardless of field type.\n  //\n  // When proto3_optional is true, this field must be belong to a oneof to\n  // signal to old proto3 clients that presence is tracked for this field. This\n  // oneof is known as a \"synthetic\" oneof, and this field must be its sole\n  // member (each proto3 optional field gets its own synthetic oneof). Synthetic\n  // oneofs exist in the descriptor only, and do not generate any API. Synthetic\n  // oneofs must be ordered after all \"real\" oneofs.\n  //\n  // For message fields, proto3_optional doesn't create any semantic change,\n  // since non-repeated message fields always track presence. However it still\n  // indicates the semantic detail of whether the user wrote \"optional\" or not.\n  // This can be useful for round-tripping the .proto file. For consistency we\n  // give message fields a synthetic oneof also, even though it is not required\n  // to track presence. This is especially important because the parser can't\n  // tell if a field is a message or an enum, so it must always create a\n  // synthetic oneof.\n  //\n  // Proto2 optional fields do not set this flag, because they already indicate\n  // optional with `LABEL_OPTIONAL`.\n  optional bool proto3_optional = 17;\n}\n\n// Describes a oneof.\nmessage OneofDescriptorProto {\n  optional string name = 1;\n  optional OneofOptions options = 2;\n}\n\n// Describes an enum type.\nmessage EnumDescriptorProto {\n  optional string name = 1;\n\n  repeated EnumValueDescriptorProto value = 2;\n\n  optional EnumOptions options = 3;\n\n  // Range of reserved numeric values. Reserved values may not be used by\n  // entries in the same enum. Reserved ranges may not overlap.\n  //\n  // Note that this is distinct from DescriptorProto.ReservedRange in that it\n  // is inclusive such that it can appropriately represent the entire int32\n  // domain.\n  message EnumReservedRange {\n    optional int32 start = 1;  // Inclusive.\n    optional int32 end = 2;    // Inclusive.\n  }\n\n  // Range of reserved numeric values. Reserved numeric values may not be used\n  // by enum values in the same enum declaration. Reserved ranges may not\n  // overlap.\n  repeated EnumReservedRange reserved_range = 4;\n\n  // Reserved enum value names, which may not be reused. A given name may only\n  // be reserved once.\n  repeated string reserved_name = 5;\n}\n\n// Describes a value within an enum.\nmessage EnumValueDescriptorProto {\n  optional string name = 1;\n  optional int32 number = 2;\n\n  optional EnumValueOptions options = 3;\n}\n\n// Describes a service.\nmessage ServiceDescriptorProto {\n  optional string name = 1;\n  repeated MethodDescriptorProto method = 2;\n\n  optional ServiceOptions options = 3;\n}\n\n// Describes a method of a service.\nmessage MethodDescriptorProto {\n  optional string name = 1;\n\n  // Input and output type names.  These are resolved in the same way as\n  // FieldDescriptorProto.type_name, but must refer to a message type.\n  optional string input_type = 2;\n  optional string output_type = 3;\n\n  optional MethodOptions options = 4;\n\n  // Identifies if client streams multiple client messages\n  optional bool client_streaming = 5 [default = false];\n  // Identifies if server streams multiple server messages\n  optional bool server_streaming = 6 [default = false];\n}\n\n\n// ===================================================================\n// Options\n\n// Each of the definitions above may have \"options\" attached.  These are\n// just annotations which may cause code to be generated slightly differently\n// or may contain hints for code that manipulates protocol messages.\n//\n// Clients may define custom options as extensions of the *Options messages.\n// These extensions may not yet be known at parsing time, so the parser cannot\n// store the values in them.  Instead it stores them in a field in the *Options\n// message called uninterpreted_option. This field must have the same name\n// across all *Options messages. We then use this field to populate the\n// extensions when we build a descriptor, at which point all protos have been\n// parsed and so all extensions are known.\n//\n// Extension numbers for custom options may be chosen as follows:\n// * For options which will only be used within a single application or\n//   organization, or for experimental options, use field numbers 50000\n//   through 99999.  It is up to you to ensure that you do not use the\n//   same number for multiple options.\n// * For options which will be published and used publicly by multiple\n//   independent entities, e-mail protobuf-global-extension-registry@google.com\n//   to reserve extension numbers. Simply provide your project name (e.g.\n//   Objective-C plugin) and your project website (if available) -- there's no\n//   need to explain how you intend to use them. Usually you only need one\n//   extension number. You can declare multiple options with only one extension\n//   number by putting them in a sub-message. See the Custom Options section of\n//   the docs for examples:\n//   https://developers.google.com/protocol-buffers/docs/proto#options\n//   If this turns out to be popular, a web service will be set up\n//   to automatically assign option numbers.\n\nmessage FileOptions {\n\n  // Sets the Java package where classes generated from this .proto will be\n  // placed.  By default, the proto package is used, but this is often\n  // inappropriate because proto packages do not normally start with backwards\n  // domain names.\n  optional string java_package = 1;\n\n\n  // Controls the name of the wrapper Java class generated for the .proto file.\n  // That class will always contain the .proto file's getDescriptor() method as\n  // well as any top-level extensions defined in the .proto file.\n  // If java_multiple_files is disabled, then all the other classes from the\n  // .proto file will be nested inside the single wrapper outer class.\n  optional string java_outer_classname = 8;\n\n  // If enabled, then the Java code generator will generate a separate .java\n  // file for each top-level message, enum, and service defined in the .proto\n  // file.  Thus, these types will *not* be nested inside the wrapper class\n  // named by java_outer_classname.  However, the wrapper class will still be\n  // generated to contain the file's getDescriptor() method as well as any\n  // top-level extensions defined in the file.\n  optional bool java_multiple_files = 10 [default = false];\n\n  // This option does nothing.\n  optional bool java_generate_equals_and_hash = 20 [deprecated=true];\n\n  // If set true, then the Java2 code generator will generate code that\n  // throws an exception whenever an attempt is made to assign a non-UTF-8\n  // byte sequence to a string field.\n  // Message reflection will do the same.\n  // However, an extension field still accepts non-UTF-8 byte sequences.\n  // This option has no effect on when used with the lite runtime.\n  optional bool java_string_check_utf8 = 27 [default = false];\n\n\n  // Generated classes can be optimized for speed or code size.\n  enum OptimizeMode {\n    SPEED = 1;         // Generate complete code for parsing, serialization,\n                       // etc.\n    CODE_SIZE = 2;     // Use ReflectionOps to implement these methods.\n    LITE_RUNTIME = 3;  // Generate code using MessageLite and the lite runtime.\n  }\n  optional OptimizeMode optimize_for = 9 [default = SPEED];\n\n  // Sets the Go package where structs generated from this .proto will be\n  // placed. If omitted, the Go package will be derived from the following:\n  //   - The basename of the package import path, if provided.\n  //   - Otherwise, the package statement in the .proto file, if present.\n  //   - Otherwise, the basename of the .proto file, without extension.\n  optional string go_package = 11;\n\n\n\n\n  // Should generic services be generated in each language?  \"Generic\" services\n  // are not specific to any particular RPC system.  They are generated by the\n  // main code generators in each language (without additional plugins).\n  // Generic services were the only kind of service generation supported by\n  // early versions of google.protobuf.\n  //\n  // Generic services are now considered deprecated in favor of using plugins\n  // that generate code specific to your particular RPC system.  Therefore,\n  // these default to false.  Old code which depends on generic services should\n  // explicitly set them to true.\n  optional bool cc_generic_services = 16 [default = false];\n  optional bool java_generic_services = 17 [default = false];\n  optional bool py_generic_services = 18 [default = false];\n  optional bool php_generic_services = 42 [default = false];\n\n  // Is this file deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for everything in the file, or it will be completely ignored; in the very\n  // least, this is a formalization for deprecating files.\n  optional bool deprecated = 23 [default = false];\n\n  // Enables the use of arenas for the proto messages in this file. This applies\n  // only to generated classes for C++.\n  optional bool cc_enable_arenas = 31 [default = true];\n\n\n  // Sets the objective c class prefix which is prepended to all objective c\n  // generated classes from this .proto. There is no default.\n  optional string objc_class_prefix = 36;\n\n  // Namespace for generated classes; defaults to the package.\n  optional string csharp_namespace = 37;\n\n  // By default Swift generators will take the proto package and CamelCase it\n  // replacing '.' with underscore and use that to prefix the types/symbols\n  // defined. When this options is provided, they will use this value instead\n  // to prefix the types/symbols defined.\n  optional string swift_prefix = 39;\n\n  // Sets the php class prefix which is prepended to all php generated classes\n  // from this .proto. Default is empty.\n  optional string php_class_prefix = 40;\n\n  // Use this option to change the namespace of php generated classes. Default\n  // is empty. When this option is empty, the package name will be used for\n  // determining the namespace.\n  optional string php_namespace = 41;\n\n  // Use this option to change the namespace of php generated metadata classes.\n  // Default is empty. When this option is empty, the proto file name will be\n  // used for determining the namespace.\n  optional string php_metadata_namespace = 44;\n\n  // Use this option to change the package of ruby generated classes. Default\n  // is empty. When this option is not set, the package name will be used for\n  // determining the ruby package.\n  optional string ruby_package = 45;\n\n\n  // The parser stores options it doesn't recognize here.\n  // See the documentation for the \"Options\" section above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message.\n  // See the documentation for the \"Options\" section above.\n  extensions 1000 to max;\n\n  reserved 38;\n}\n\nmessage MessageOptions {\n  // Set true to use the old proto1 MessageSet wire format for extensions.\n  // This is provided for backwards-compatibility with the MessageSet wire\n  // format.  You should not use this for any other reason:  It's less\n  // efficient, has fewer features, and is more complicated.\n  //\n  // The message must be defined exactly as follows:\n  //   message Foo {\n  //     option message_set_wire_format = true;\n  //     extensions 4 to max;\n  //   }\n  // Note that the message cannot have any defined fields; MessageSets only\n  // have extensions.\n  //\n  // All extensions of your type must be singular messages; e.g. they cannot\n  // be int32s, enums, or repeated messages.\n  //\n  // Because this is an option, the above two restrictions are not enforced by\n  // the protocol compiler.\n  optional bool message_set_wire_format = 1 [default = false];\n\n  // Disables the generation of the standard \"descriptor()\" accessor, which can\n  // conflict with a field of the same name.  This is meant to make migration\n  // from proto1 easier; new code should avoid fields named \"descriptor\".\n  optional bool no_standard_descriptor_accessor = 2 [default = false];\n\n  // Is this message deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for the message, or it will be completely ignored; in the very least,\n  // this is a formalization for deprecating messages.\n  optional bool deprecated = 3 [default = false];\n\n  reserved 4, 5, 6;\n\n  // Whether the message is an automatically generated map entry type for the\n  // maps field.\n  //\n  // For maps fields:\n  //     map<KeyType, ValueType> map_field = 1;\n  // The parsed descriptor looks like:\n  //     message MapFieldEntry {\n  //         option map_entry = true;\n  //         optional KeyType key = 1;\n  //         optional ValueType value = 2;\n  //     }\n  //     repeated MapFieldEntry map_field = 1;\n  //\n  // Implementations may choose not to generate the map_entry=true message, but\n  // use a native map in the target language to hold the keys and values.\n  // The reflection APIs in such implementations still need to work as\n  // if the field is a repeated message field.\n  //\n  // NOTE: Do not set the option in .proto files. Always use the maps syntax\n  // instead. The option should only be implicitly set by the proto compiler\n  // parser.\n  optional bool map_entry = 7;\n\n  reserved 8;  // javalite_serializable\n  reserved 9;  // javanano_as_lite\n\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\nmessage FieldOptions {\n  // The ctype option instructs the C++ code generator to use a different\n  // representation of the field than it normally would.  See the specific\n  // options below.  This option is not yet implemented in the open source\n  // release -- sorry, we'll try to include it in a future version!\n  optional CType ctype = 1 [default = STRING];\n  enum CType {\n    // Default mode.\n    STRING = 0;\n\n    CORD = 1;\n\n    STRING_PIECE = 2;\n  }\n  // The packed option can be enabled for repeated primitive fields to enable\n  // a more efficient representation on the wire. Rather than repeatedly\n  // writing the tag and type for each element, the entire array is encoded as\n  // a single length-delimited blob. In proto3, only explicit setting it to\n  // false will avoid using packed encoding.\n  optional bool packed = 2;\n\n  // The jstype option determines the JavaScript type used for values of the\n  // field.  The option is permitted only for 64 bit integral and fixed types\n  // (int64, uint64, sint64, fixed64, sfixed64).  A field with jstype JS_STRING\n  // is represented as JavaScript string, which avoids loss of precision that\n  // can happen when a large value is converted to a floating point JavaScript.\n  // Specifying JS_NUMBER for the jstype causes the generated JavaScript code to\n  // use the JavaScript \"number\" type.  The behavior of the default option\n  // JS_NORMAL is implementation dependent.\n  //\n  // This option is an enum to permit additional types to be added, e.g.\n  // goog.math.Integer.\n  optional JSType jstype = 6 [default = JS_NORMAL];\n  enum JSType {\n    // Use the default type.\n    JS_NORMAL = 0;\n\n    // Use JavaScript strings.\n    JS_STRING = 1;\n\n    // Use JavaScript numbers.\n    JS_NUMBER = 2;\n  }\n\n  // Should this field be parsed lazily?  Lazy applies only to message-type\n  // fields.  It means that when the outer message is initially parsed, the\n  // inner message's contents will not be parsed but instead stored in encoded\n  // form.  The inner message will actually be parsed when it is first accessed.\n  //\n  // This is only a hint.  Implementations are free to choose whether to use\n  // eager or lazy parsing regardless of the value of this option.  However,\n  // setting this option true suggests that the protocol author believes that\n  // using lazy parsing on this field is worth the additional bookkeeping\n  // overhead typically needed to implement it.\n  //\n  // This option does not affect the public interface of any generated code;\n  // all method signatures remain the same.  Furthermore, thread-safety of the\n  // interface is not affected by this option; const methods remain safe to\n  // call from multiple threads concurrently, while non-const methods continue\n  // to require exclusive access.\n  //\n  //\n  // Note that implementations may choose not to check required fields within\n  // a lazy sub-message.  That is, calling IsInitialized() on the outer message\n  // may return true even if the inner message has missing required fields.\n  // This is necessary because otherwise the inner message would have to be\n  // parsed in order to perform the check, defeating the purpose of lazy\n  // parsing.  An implementation which chooses not to check required fields\n  // must be consistent about it.  That is, for any particular sub-message, the\n  // implementation must either *always* check its required fields, or *never*\n  // check its required fields, regardless of whether or not the message has\n  // been parsed.\n  //\n  // As of 2021, lazy does no correctness checks on the byte stream during\n  // parsing.  This may lead to crashes if and when an invalid byte stream is\n  // finally parsed upon access.\n  //\n  // TODO(b/211906113):  Enable validation on lazy fields.\n  optional bool lazy = 5 [default = false];\n\n  // unverified_lazy does no correctness checks on the byte stream. This should\n  // only be used where lazy with verification is prohibitive for performance\n  // reasons.\n  optional bool unverified_lazy = 15 [default = false];\n\n  // Is this field deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for accessors, or it will be completely ignored; in the very least, this\n  // is a formalization for deprecating fields.\n  optional bool deprecated = 3 [default = false];\n\n  // For Google-internal migration only. Do not use.\n  optional bool weak = 10 [default = false];\n\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n\n  reserved 4;  // removed jtype\n}\n\nmessage OneofOptions {\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\nmessage EnumOptions {\n\n  // Set this option to true to allow mapping different tag names to the same\n  // value.\n  optional bool allow_alias = 2;\n\n  // Is this enum deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for the enum, or it will be completely ignored; in the very least, this\n  // is a formalization for deprecating enums.\n  optional bool deprecated = 3 [default = false];\n\n  reserved 5;  // javanano_as_lite\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\nmessage EnumValueOptions {\n  // Is this enum value deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for the enum value, or it will be completely ignored; in the very least,\n  // this is a formalization for deprecating enum values.\n  optional bool deprecated = 1 [default = false];\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\nmessage ServiceOptions {\n\n  // Note:  Field numbers 1 through 32 are reserved for Google's internal RPC\n  //   framework.  We apologize for hoarding these numbers to ourselves, but\n  //   we were already using them long before we decided to release Protocol\n  //   Buffers.\n\n  // Is this service deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for the service, or it will be completely ignored; in the very least,\n  // this is a formalization for deprecating services.\n  optional bool deprecated = 33 [default = false];\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\nmessage MethodOptions {\n\n  // Note:  Field numbers 1 through 32 are reserved for Google's internal RPC\n  //   framework.  We apologize for hoarding these numbers to ourselves, but\n  //   we were already using them long before we decided to release Protocol\n  //   Buffers.\n\n  // Is this method deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for the method, or it will be completely ignored; in the very least,\n  // this is a formalization for deprecating methods.\n  optional bool deprecated = 33 [default = false];\n\n  // Is this method side-effect-free (or safe in HTTP parlance), or idempotent,\n  // or neither? HTTP based RPC implementation may choose GET verb for safe\n  // methods, and PUT verb for idempotent methods instead of the default POST.\n  enum IdempotencyLevel {\n    IDEMPOTENCY_UNKNOWN = 0;\n    NO_SIDE_EFFECTS = 1;  // implies idempotent\n    IDEMPOTENT = 2;       // idempotent, but may have side effects\n  }\n  optional IdempotencyLevel idempotency_level = 34\n      [default = IDEMPOTENCY_UNKNOWN];\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\n\n// A message representing a option the parser does not recognize. This only\n// appears in options protos created by the compiler::Parser class.\n// DescriptorPool resolves these when building Descriptor objects. Therefore,\n// options protos in descriptor objects (e.g. returned by Descriptor::options(),\n// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions\n// in them.\nmessage UninterpretedOption {\n  // The name of the uninterpreted option.  Each string represents a segment in\n  // a dot-separated name.  is_extension is true iff a segment represents an\n  // extension (denoted with parentheses in options specs in .proto files).\n  // E.g.,{ [\"foo\", false], [\"bar.baz\", true], [\"qux\", false] } represents\n  // \"foo.(bar.baz).qux\".\n  message NamePart {\n    required string name_part = 1;\n    required bool is_extension = 2;\n  }\n  repeated NamePart name = 2;\n\n  // The value of the uninterpreted option, in whatever type the tokenizer\n  // identified it as during parsing. Exactly one of these should be set.\n  optional string identifier_value = 3;\n  optional uint64 positive_int_value = 4;\n  optional int64 negative_int_value = 5;\n  optional double double_value = 6;\n  optional bytes string_value = 7;\n  optional string aggregate_value = 8;\n}\n\n// ===================================================================\n// Optional source code info\n\n// Encapsulates information about the original source file from which a\n// FileDescriptorProto was generated.\nmessage SourceCodeInfo {\n  // A Location identifies a piece of source code in a .proto file which\n  // corresponds to a particular definition.  This information is intended\n  // to be useful to IDEs, code indexers, documentation generators, and similar\n  // tools.\n  //\n  // For example, say we have a file like:\n  //   message Foo {\n  //     optional string foo = 1;\n  //   }\n  // Let's look at just the field definition:\n  //   optional string foo = 1;\n  //   ^       ^^     ^^  ^  ^^^\n  //   a       bc     de  f  ghi\n  // We have the following locations:\n  //   span   path               represents\n  //   [a,i)  [ 4, 0, 2, 0 ]     The whole field definition.\n  //   [a,b)  [ 4, 0, 2, 0, 4 ]  The label (optional).\n  //   [c,d)  [ 4, 0, 2, 0, 5 ]  The type (string).\n  //   [e,f)  [ 4, 0, 2, 0, 1 ]  The name (foo).\n  //   [g,h)  [ 4, 0, 2, 0, 3 ]  The number (1).\n  //\n  // Notes:\n  // - A location may refer to a repeated field itself (i.e. not to any\n  //   particular index within it).  This is used whenever a set of elements are\n  //   logically enclosed in a single code segment.  For example, an entire\n  //   extend block (possibly containing multiple extension definitions) will\n  //   have an outer location whose path refers to the \"extensions\" repeated\n  //   field without an index.\n  // - Multiple locations may have the same path.  This happens when a single\n  //   logical declaration is spread out across multiple places.  The most\n  //   obvious example is the \"extend\" block again -- there may be multiple\n  //   extend blocks in the same scope, each of which will have the same path.\n  // - A location's span is not always a subset of its parent's span.  For\n  //   example, the \"extendee\" of an extension declaration appears at the\n  //   beginning of the \"extend\" block and is shared by all extensions within\n  //   the block.\n  // - Just because a location's span is a subset of some other location's span\n  //   does not mean that it is a descendant.  For example, a \"group\" defines\n  //   both a type and a field in a single declaration.  Thus, the locations\n  //   corresponding to the type and field and their components will overlap.\n  // - Code which tries to interpret locations should probably be designed to\n  //   ignore those that it doesn't understand, as more types of locations could\n  //   be recorded in the future.\n  repeated Location location = 1;\n  message Location {\n    // Identifies which part of the FileDescriptorProto was defined at this\n    // location.\n    //\n    // Each element is a field number or an index.  They form a path from\n    // the root FileDescriptorProto to the place where the definition occurs.\n    // For example, this path:\n    //   [ 4, 3, 2, 7, 1 ]\n    // refers to:\n    //   file.message_type(3)  // 4, 3\n    //       .field(7)         // 2, 7\n    //       .name()           // 1\n    // This is because FileDescriptorProto.message_type has field number 4:\n    //   repeated DescriptorProto message_type = 4;\n    // and DescriptorProto.field has field number 2:\n    //   repeated FieldDescriptorProto field = 2;\n    // and FieldDescriptorProto.name has field number 1:\n    //   optional string name = 1;\n    //\n    // Thus, the above path gives the location of a field name.  If we removed\n    // the last element:\n    //   [ 4, 3, 2, 7 ]\n    // this path refers to the whole field declaration (from the beginning\n    // of the label to the terminating semicolon).\n    repeated int32 path = 1 [packed = true];\n\n    // Always has exactly three or four elements: start line, start column,\n    // end line (optional, otherwise assumed same as start line), end column.\n    // These are packed into a single field for efficiency.  Note that line\n    // and column numbers are zero-based -- typically you will want to add\n    // 1 to each before displaying to a user.\n    repeated int32 span = 2 [packed = true];\n\n    // If this SourceCodeInfo represents a complete declaration, these are any\n    // comments appearing before and after the declaration which appear to be\n    // attached to the declaration.\n    //\n    // A series of line comments appearing on consecutive lines, with no other\n    // tokens appearing on those lines, will be treated as a single comment.\n    //\n    // leading_detached_comments will keep paragraphs of comments that appear\n    // before (but not connected to) the current element. Each paragraph,\n    // separated by empty lines, will be one comment element in the repeated\n    // field.\n    //\n    // Only the comment content is provided; comment markers (e.g. //) are\n    // stripped out.  For block comments, leading whitespace and an asterisk\n    // will be stripped from the beginning of each line other than the first.\n    // Newlines are included in the output.\n    //\n    // Examples:\n    //\n    //   optional int32 foo = 1;  // Comment attached to foo.\n    //   // Comment attached to bar.\n    //   optional int32 bar = 2;\n    //\n    //   optional string baz = 3;\n    //   // Comment attached to baz.\n    //   // Another line attached to baz.\n    //\n    //   // Comment attached to qux.\n    //   //\n    //   // Another line attached to qux.\n    //   optional double qux = 4;\n    //\n    //   // Detached comment for corge. This is not leading or trailing comments\n    //   // to qux or corge because there are blank lines separating it from\n    //   // both.\n    //\n    //   // Detached comment for corge paragraph 2.\n    //\n    //   optional string corge = 5;\n    //   /* Block comment attached\n    //    * to corge.  Leading asterisks\n    //    * will be removed. */\n    //   /* Block comment attached to\n    //    * grault. */\n    //   optional int32 grault = 6;\n    //\n    //   // ignored detached comments.\n    optional string leading_comments = 3;\n    optional string trailing_comments = 4;\n    repeated string leading_detached_comments = 6;\n  }\n}\n\n// Describes the relationship between generated code and its original source\n// file. A GeneratedCodeInfo message is associated with only one generated\n// source file, but may contain references to different source .proto files.\nmessage GeneratedCodeInfo {\n  // An Annotation connects some span of text in generated code to an element\n  // of its generating .proto file.\n  repeated Annotation annotation = 1;\n  message Annotation {\n    // Identifies the element in the original source .proto file. This field\n    // is formatted the same as SourceCodeInfo.Location.path.\n    repeated int32 path = 1 [packed = true];\n\n    // Identifies the filesystem path to the original source .proto.\n    optional string source_file = 2;\n\n    // Identifies the starting offset in bytes in the generated code\n    // that relates to the identified object.\n    optional int32 begin = 3;\n\n    // Identifies the ending offset in bytes in the generated code that\n    // relates to the identified offset. The end offset should be one past\n    // the last relevant byte (so the length of the text = end - begin).\n    optional int32 end = 4;\n  }\n}\n"
  },
  {
    "path": "service/user/third_party/google/protobuf/duration.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption cc_enable_arenas = true;\noption go_package = \"google.golang.org/protobuf/types/known/durationpb\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"DurationProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\n\n// A Duration represents a signed, fixed-length span of time represented\n// as a count of seconds and fractions of seconds at nanosecond\n// resolution. It is independent of any calendar and concepts like \"day\"\n// or \"month\". It is related to Timestamp in that the difference between\n// two Timestamp values is a Duration and it can be added or subtracted\n// from a Timestamp. Range is approximately +-10,000 years.\n//\n// # Examples\n//\n// Example 1: Compute Duration from two Timestamps in pseudo code.\n//\n//     Timestamp start = ...;\n//     Timestamp end = ...;\n//     Duration duration = ...;\n//\n//     duration.seconds = end.seconds - start.seconds;\n//     duration.nanos = end.nanos - start.nanos;\n//\n//     if (duration.seconds < 0 && duration.nanos > 0) {\n//       duration.seconds += 1;\n//       duration.nanos -= 1000000000;\n//     } else if (duration.seconds > 0 && duration.nanos < 0) {\n//       duration.seconds -= 1;\n//       duration.nanos += 1000000000;\n//     }\n//\n// Example 2: Compute Timestamp from Timestamp + Duration in pseudo code.\n//\n//     Timestamp start = ...;\n//     Duration duration = ...;\n//     Timestamp end = ...;\n//\n//     end.seconds = start.seconds + duration.seconds;\n//     end.nanos = start.nanos + duration.nanos;\n//\n//     if (end.nanos < 0) {\n//       end.seconds -= 1;\n//       end.nanos += 1000000000;\n//     } else if (end.nanos >= 1000000000) {\n//       end.seconds += 1;\n//       end.nanos -= 1000000000;\n//     }\n//\n// Example 3: Compute Duration from datetime.timedelta in Python.\n//\n//     td = datetime.timedelta(days=3, minutes=10)\n//     duration = Duration()\n//     duration.FromTimedelta(td)\n//\n// # JSON Mapping\n//\n// In JSON format, the Duration type is encoded as a string rather than an\n// object, where the string ends in the suffix \"s\" (indicating seconds) and\n// is preceded by the number of seconds, with nanoseconds expressed as\n// fractional seconds. For example, 3 seconds with 0 nanoseconds should be\n// encoded in JSON format as \"3s\", while 3 seconds and 1 nanosecond should\n// be expressed in JSON format as \"3.000000001s\", and 3 seconds and 1\n// microsecond should be expressed in JSON format as \"3.000001s\".\n//\n//\nmessage Duration {\n  // Signed seconds of the span of time. Must be from -315,576,000,000\n  // to +315,576,000,000 inclusive. Note: these bounds are computed from:\n  // 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years\n  int64 seconds = 1;\n\n  // Signed fractions of a second at nanosecond resolution of the span\n  // of time. Durations less than one second are represented with a 0\n  // `seconds` field and a positive or negative `nanos` field. For durations\n  // of one second or more, a non-zero value for the `nanos` field must be\n  // of the same sign as the `seconds` field. Must be from -999,999,999\n  // to +999,999,999 inclusive.\n  int32 nanos = 2;\n}\n"
  },
  {
    "path": "service/user/third_party/google/protobuf/empty.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption go_package = \"google.golang.org/protobuf/types/known/emptypb\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"EmptyProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\noption cc_enable_arenas = true;\n\n// A generic empty message that you can re-use to avoid defining duplicated\n// empty messages in your APIs. A typical example is to use it as the request\n// or the response type of an API method. For instance:\n//\n//     service Foo {\n//       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n//     }\n//\n// The JSON representation for `Empty` is empty JSON object `{}`.\nmessage Empty {}\n"
  },
  {
    "path": "service/user/third_party/google/protobuf/field_mask.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"FieldMaskProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\noption go_package = \"google.golang.org/protobuf/types/known/fieldmaskpb\";\noption cc_enable_arenas = true;\n\n// `FieldMask` represents a set of symbolic field paths, for example:\n//\n//     paths: \"f.a\"\n//     paths: \"f.b.d\"\n//\n// Here `f` represents a field in some root message, `a` and `b`\n// fields in the message found in `f`, and `d` a field found in the\n// message in `f.b`.\n//\n// Field masks are used to specify a subset of fields that should be\n// returned by a get operation or modified by an update operation.\n// Field masks also have a custom JSON encoding (see below).\n//\n// # Field Masks in Projections\n//\n// When used in the context of a projection, a response message or\n// sub-message is filtered by the API to only contain those fields as\n// specified in the mask. For example, if the mask in the previous\n// example is applied to a response message as follows:\n//\n//     f {\n//       a : 22\n//       b {\n//         d : 1\n//         x : 2\n//       }\n//       y : 13\n//     }\n//     z: 8\n//\n// The result will not contain specific values for fields x,y and z\n// (their value will be set to the default, and omitted in proto text\n// output):\n//\n//\n//     f {\n//       a : 22\n//       b {\n//         d : 1\n//       }\n//     }\n//\n// A repeated field is not allowed except at the last position of a\n// paths string.\n//\n// If a FieldMask object is not present in a get operation, the\n// operation applies to all fields (as if a FieldMask of all fields\n// had been specified).\n//\n// Note that a field mask does not necessarily apply to the\n// top-level response message. In case of a REST get operation, the\n// field mask applies directly to the response, but in case of a REST\n// list operation, the mask instead applies to each individual message\n// in the returned resource list. In case of a REST custom method,\n// other definitions may be used. Where the mask applies will be\n// clearly documented together with its declaration in the API.  In\n// any case, the effect on the returned resource/resources is required\n// behavior for APIs.\n//\n// # Field Masks in Update Operations\n//\n// A field mask in update operations specifies which fields of the\n// targeted resource are going to be updated. The API is required\n// to only change the values of the fields as specified in the mask\n// and leave the others untouched. If a resource is passed in to\n// describe the updated values, the API ignores the values of all\n// fields not covered by the mask.\n//\n// If a repeated field is specified for an update operation, new values will\n// be appended to the existing repeated field in the target resource. Note that\n// a repeated field is only allowed in the last position of a `paths` string.\n//\n// If a sub-message is specified in the last position of the field mask for an\n// update operation, then new value will be merged into the existing sub-message\n// in the target resource.\n//\n// For example, given the target message:\n//\n//     f {\n//       b {\n//         d: 1\n//         x: 2\n//       }\n//       c: [1]\n//     }\n//\n// And an update message:\n//\n//     f {\n//       b {\n//         d: 10\n//       }\n//       c: [2]\n//     }\n//\n// then if the field mask is:\n//\n//  paths: [\"f.b\", \"f.c\"]\n//\n// then the result will be:\n//\n//     f {\n//       b {\n//         d: 10\n//         x: 2\n//       }\n//       c: [1, 2]\n//     }\n//\n// An implementation may provide options to override this default behavior for\n// repeated and message fields.\n//\n// In order to reset a field's value to the default, the field must\n// be in the mask and set to the default value in the provided resource.\n// Hence, in order to reset all fields of a resource, provide a default\n// instance of the resource and set all fields in the mask, or do\n// not provide a mask as described below.\n//\n// If a field mask is not present on update, the operation applies to\n// all fields (as if a field mask of all fields has been specified).\n// Note that in the presence of schema evolution, this may mean that\n// fields the client does not know and has therefore not filled into\n// the request will be reset to their default. If this is unwanted\n// behavior, a specific service may require a client to always specify\n// a field mask, producing an error if not.\n//\n// As with get operations, the location of the resource which\n// describes the updated values in the request message depends on the\n// operation kind. In any case, the effect of the field mask is\n// required to be honored by the API.\n//\n// ## Considerations for HTTP REST\n//\n// The HTTP kind of an update operation which uses a field mask must\n// be set to PATCH instead of PUT in order to satisfy HTTP semantics\n// (PUT must only be used for full updates).\n//\n// # JSON Encoding of Field Masks\n//\n// In JSON, a field mask is encoded as a single string where paths are\n// separated by a comma. Fields name in each path are converted\n// to/from lower-camel naming conventions.\n//\n// As an example, consider the following message declarations:\n//\n//     message Profile {\n//       User user = 1;\n//       Photo photo = 2;\n//     }\n//     message User {\n//       string display_name = 1;\n//       string address = 2;\n//     }\n//\n// In proto a field mask for `Profile` may look as such:\n//\n//     mask {\n//       paths: \"user.display_name\"\n//       paths: \"photo\"\n//     }\n//\n// In JSON, the same mask is represented as below:\n//\n//     {\n//       mask: \"user.displayName,photo\"\n//     }\n//\n// # Field Masks and Oneof Fields\n//\n// Field masks treat fields in oneofs just as regular fields. Consider the\n// following message:\n//\n//     message SampleMessage {\n//       oneof test_oneof {\n//         string name = 4;\n//         SubMessage sub_message = 9;\n//       }\n//     }\n//\n// The field mask can be:\n//\n//     mask {\n//       paths: \"name\"\n//     }\n//\n// Or:\n//\n//     mask {\n//       paths: \"sub_message\"\n//     }\n//\n// Note that oneof type names (\"test_oneof\" in this case) cannot be used in\n// paths.\n//\n// ## Field Mask Verification\n//\n// The implementation of any API method which has a FieldMask type field in the\n// request should verify the included field paths, and return an\n// `INVALID_ARGUMENT` error if any path is unmappable.\nmessage FieldMask {\n  // The set of field mask paths.\n  repeated string paths = 1;\n}\n"
  },
  {
    "path": "service/user/third_party/google/protobuf/source_context.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"SourceContextProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\noption go_package = \"google.golang.org/protobuf/types/known/sourcecontextpb\";\n\n// `SourceContext` represents information about the source of a\n// protobuf element, like the file in which it is defined.\nmessage SourceContext {\n  // The path-qualified name of the .proto file that contained the associated\n  // protobuf element.  For example: `\"google/protobuf/source_context.proto\"`.\n  string file_name = 1;\n}\n"
  },
  {
    "path": "service/user/third_party/google/protobuf/struct.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption cc_enable_arenas = true;\noption go_package = \"google.golang.org/protobuf/types/known/structpb\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"StructProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\n\n// `Struct` represents a structured data value, consisting of fields\n// which map to dynamically typed values. In some languages, `Struct`\n// might be supported by a native representation. For example, in\n// scripting languages like JS a struct is represented as an\n// object. The details of that representation are described together\n// with the proto support for the language.\n//\n// The JSON representation for `Struct` is JSON object.\nmessage Struct {\n  // Unordered map of dynamically typed values.\n  map<string, Value> fields = 1;\n}\n\n// `Value` represents a dynamically typed value which can be either\n// null, a number, a string, a boolean, a recursive struct value, or a\n// list of values. A producer of value is expected to set one of these\n// variants. Absence of any variant indicates an error.\n//\n// The JSON representation for `Value` is JSON value.\nmessage Value {\n  // The kind of value.\n  oneof kind {\n    // Represents a null value.\n    NullValue null_value = 1;\n    // Represents a double value.\n    double number_value = 2;\n    // Represents a string value.\n    string string_value = 3;\n    // Represents a boolean value.\n    bool bool_value = 4;\n    // Represents a structured value.\n    Struct struct_value = 5;\n    // Represents a repeated `Value`.\n    ListValue list_value = 6;\n  }\n}\n\n// `NullValue` is a singleton enumeration to represent the null value for the\n// `Value` type union.\n//\n//  The JSON representation for `NullValue` is JSON `null`.\nenum NullValue {\n  // Null value.\n  NULL_VALUE = 0;\n}\n\n// `ListValue` is a wrapper around a repeated field of values.\n//\n// The JSON representation for `ListValue` is JSON array.\nmessage ListValue {\n  // Repeated field of dynamically typed values.\n  repeated Value values = 1;\n}\n"
  },
  {
    "path": "service/user/third_party/google/protobuf/timestamp.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption cc_enable_arenas = true;\noption go_package = \"google.golang.org/protobuf/types/known/timestamppb\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"TimestampProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\n\n// A Timestamp represents a point in time independent of any time zone or local\n// calendar, encoded as a count of seconds and fractions of seconds at\n// nanosecond resolution. The count is relative to an epoch at UTC midnight on\n// January 1, 1970, in the proleptic Gregorian calendar which extends the\n// Gregorian calendar backwards to year one.\n//\n// All minutes are 60 seconds long. Leap seconds are \"smeared\" so that no leap\n// second table is needed for interpretation, using a [24-hour linear\n// smear](https://developers.google.com/time/smear).\n//\n// The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By\n// restricting to that range, we ensure that we can convert to and from [RFC\n// 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.\n//\n// # Examples\n//\n// Example 1: Compute Timestamp from POSIX `time()`.\n//\n//     Timestamp timestamp;\n//     timestamp.set_seconds(time(NULL));\n//     timestamp.set_nanos(0);\n//\n// Example 2: Compute Timestamp from POSIX `gettimeofday()`.\n//\n//     struct timeval tv;\n//     gettimeofday(&tv, NULL);\n//\n//     Timestamp timestamp;\n//     timestamp.set_seconds(tv.tv_sec);\n//     timestamp.set_nanos(tv.tv_usec * 1000);\n//\n// Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`.\n//\n//     FILETIME ft;\n//     GetSystemTimeAsFileTime(&ft);\n//     UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime;\n//\n//     // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z\n//     // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.\n//     Timestamp timestamp;\n//     timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));\n//     timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));\n//\n// Example 4: Compute Timestamp from Java `System.currentTimeMillis()`.\n//\n//     long millis = System.currentTimeMillis();\n//\n//     Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)\n//         .setNanos((int) ((millis % 1000) * 1000000)).build();\n//\n//\n// Example 5: Compute Timestamp from Java `Instant.now()`.\n//\n//     Instant now = Instant.now();\n//\n//     Timestamp timestamp =\n//         Timestamp.newBuilder().setSeconds(now.getEpochSecond())\n//             .setNanos(now.getNano()).build();\n//\n//\n// Example 6: Compute Timestamp from current time in Python.\n//\n//     timestamp = Timestamp()\n//     timestamp.GetCurrentTime()\n//\n// # JSON Mapping\n//\n// In JSON format, the Timestamp type is encoded as a string in the\n// [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the\n// format is \"{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z\"\n// where {year} is always expressed using four digits while {month}, {day},\n// {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional\n// seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution),\n// are optional. The \"Z\" suffix indicates the timezone (\"UTC\"); the timezone\n// is required. A proto3 JSON serializer should always use UTC (as indicated by\n// \"Z\") when printing the Timestamp type and a proto3 JSON parser should be\n// able to accept both UTC and other timezones (as indicated by an offset).\n//\n// For example, \"2017-01-15T01:30:15.01Z\" encodes 15.01 seconds past\n// 01:30 UTC on January 15, 2017.\n//\n// In JavaScript, one can convert a Date object to this format using the\n// standard\n// [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString)\n// method. In Python, a standard `datetime.datetime` object can be converted\n// to this format using\n// [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with\n// the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use\n// the Joda Time's [`ISODateTimeFormat.dateTime()`](\n// http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime%2D%2D\n// ) to obtain a formatter capable of generating timestamps in this format.\n//\n//\nmessage Timestamp {\n  // Represents seconds of UTC time since Unix epoch\n  // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to\n  // 9999-12-31T23:59:59Z inclusive.\n  int64 seconds = 1;\n\n  // Non-negative fractions of a second at nanosecond resolution. Negative\n  // second values with fractions must still have non-negative nanos values\n  // that count forward in time. Must be from 0 to 999,999,999\n  // inclusive.\n  int32 nanos = 2;\n}\n"
  },
  {
    "path": "service/user/third_party/google/protobuf/type.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\nimport \"google/protobuf/any.proto\";\nimport \"google/protobuf/source_context.proto\";\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption cc_enable_arenas = true;\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"TypeProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\noption go_package = \"google.golang.org/protobuf/types/known/typepb\";\n\n// A protocol buffer message type.\nmessage Type {\n  // The fully qualified message name.\n  string name = 1;\n  // The list of fields.\n  repeated Field fields = 2;\n  // The list of types appearing in `oneof` definitions in this type.\n  repeated string oneofs = 3;\n  // The protocol buffer options.\n  repeated Option options = 4;\n  // The source context.\n  SourceContext source_context = 5;\n  // The source syntax.\n  Syntax syntax = 6;\n}\n\n// A single field of a message type.\nmessage Field {\n  // Basic field types.\n  enum Kind {\n    // Field type unknown.\n    TYPE_UNKNOWN = 0;\n    // Field type double.\n    TYPE_DOUBLE = 1;\n    // Field type float.\n    TYPE_FLOAT = 2;\n    // Field type int64.\n    TYPE_INT64 = 3;\n    // Field type uint64.\n    TYPE_UINT64 = 4;\n    // Field type int32.\n    TYPE_INT32 = 5;\n    // Field type fixed64.\n    TYPE_FIXED64 = 6;\n    // Field type fixed32.\n    TYPE_FIXED32 = 7;\n    // Field type bool.\n    TYPE_BOOL = 8;\n    // Field type string.\n    TYPE_STRING = 9;\n    // Field type group. Proto2 syntax only, and deprecated.\n    TYPE_GROUP = 10;\n    // Field type message.\n    TYPE_MESSAGE = 11;\n    // Field type bytes.\n    TYPE_BYTES = 12;\n    // Field type uint32.\n    TYPE_UINT32 = 13;\n    // Field type enum.\n    TYPE_ENUM = 14;\n    // Field type sfixed32.\n    TYPE_SFIXED32 = 15;\n    // Field type sfixed64.\n    TYPE_SFIXED64 = 16;\n    // Field type sint32.\n    TYPE_SINT32 = 17;\n    // Field type sint64.\n    TYPE_SINT64 = 18;\n  }\n\n  // Whether a field is optional, required, or repeated.\n  enum Cardinality {\n    // For fields with unknown cardinality.\n    CARDINALITY_UNKNOWN = 0;\n    // For optional fields.\n    CARDINALITY_OPTIONAL = 1;\n    // For required fields. Proto2 syntax only.\n    CARDINALITY_REQUIRED = 2;\n    // For repeated fields.\n    CARDINALITY_REPEATED = 3;\n  }\n\n  // The field type.\n  Kind kind = 1;\n  // The field cardinality.\n  Cardinality cardinality = 2;\n  // The field number.\n  int32 number = 3;\n  // The field name.\n  string name = 4;\n  // The field type URL, without the scheme, for message or enumeration\n  // types. Example: `\"type.googleapis.com/google.protobuf.Timestamp\"`.\n  string type_url = 6;\n  // The index of the field type in `Type.oneofs`, for message or enumeration\n  // types. The first type has index 1; zero means the type is not in the list.\n  int32 oneof_index = 7;\n  // Whether to use alternative packed wire representation.\n  bool packed = 8;\n  // The protocol buffer options.\n  repeated Option options = 9;\n  // The field JSON name.\n  string json_name = 10;\n  // The string value of the default value of this field. Proto2 syntax only.\n  string default_value = 11;\n}\n\n// Enum type definition.\nmessage Enum {\n  // Enum type name.\n  string name = 1;\n  // Enum value definitions.\n  repeated EnumValue enumvalue = 2;\n  // Protocol buffer options.\n  repeated Option options = 3;\n  // The source context.\n  SourceContext source_context = 4;\n  // The source syntax.\n  Syntax syntax = 5;\n}\n\n// Enum value definition.\nmessage EnumValue {\n  // Enum value name.\n  string name = 1;\n  // Enum value number.\n  int32 number = 2;\n  // Protocol buffer options.\n  repeated Option options = 3;\n}\n\n// A protocol buffer option, which can be attached to a message, field,\n// enumeration, etc.\nmessage Option {\n  // The option's name. For protobuf built-in options (options defined in\n  // descriptor.proto), this is the short name. For example, `\"map_entry\"`.\n  // For custom options, it should be the fully-qualified name. For example,\n  // `\"google.api.http\"`.\n  string name = 1;\n  // The option's value packed in an Any message. If the value is a primitive,\n  // the corresponding wrapper type defined in google/protobuf/wrappers.proto\n  // should be used. If the value is an enum, it should be stored as an int32\n  // value using the google.protobuf.Int32Value type.\n  Any value = 2;\n}\n\n// The syntax in which a protocol buffer element is defined.\nenum Syntax {\n  // Syntax `proto2`.\n  SYNTAX_PROTO2 = 0;\n  // Syntax `proto3`.\n  SYNTAX_PROTO3 = 1;\n}\n"
  },
  {
    "path": "service/user/third_party/google/protobuf/wrappers.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Wrappers for primitive (non-message) types. These types are useful\n// for embedding primitives in the `google.protobuf.Any` type and for places\n// where we need to distinguish between the absence of a primitive\n// typed field and its default value.\n//\n// These wrappers have no meaningful use within repeated fields as they lack\n// the ability to detect presence on individual elements.\n// These wrappers have no meaningful use within a map or a oneof since\n// individual entries of a map or fields of a oneof can already detect presence.\n\nsyntax = \"proto3\";\n\npackage google.protobuf;\n\noption csharp_namespace = \"Google.Protobuf.WellKnownTypes\";\noption cc_enable_arenas = true;\noption go_package = \"google.golang.org/protobuf/types/known/wrapperspb\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"WrappersProto\";\noption java_multiple_files = true;\noption objc_class_prefix = \"GPB\";\n\n// Wrapper message for `double`.\n//\n// The JSON representation for `DoubleValue` is JSON number.\nmessage DoubleValue {\n  // The double value.\n  double value = 1;\n}\n\n// Wrapper message for `float`.\n//\n// The JSON representation for `FloatValue` is JSON number.\nmessage FloatValue {\n  // The float value.\n  float value = 1;\n}\n\n// Wrapper message for `int64`.\n//\n// The JSON representation for `Int64Value` is JSON string.\nmessage Int64Value {\n  // The int64 value.\n  int64 value = 1;\n}\n\n// Wrapper message for `uint64`.\n//\n// The JSON representation for `UInt64Value` is JSON string.\nmessage UInt64Value {\n  // The uint64 value.\n  uint64 value = 1;\n}\n\n// Wrapper message for `int32`.\n//\n// The JSON representation for `Int32Value` is JSON number.\nmessage Int32Value {\n  // The int32 value.\n  int32 value = 1;\n}\n\n// Wrapper message for `uint32`.\n//\n// The JSON representation for `UInt32Value` is JSON number.\nmessage UInt32Value {\n  // The uint32 value.\n  uint32 value = 1;\n}\n\n// Wrapper message for `bool`.\n//\n// The JSON representation for `BoolValue` is JSON `true` and `false`.\nmessage BoolValue {\n  // The bool value.\n  bool value = 1;\n}\n\n// Wrapper message for `string`.\n//\n// The JSON representation for `StringValue` is JSON string.\nmessage StringValue {\n  // The string value.\n  string value = 1;\n}\n\n// Wrapper message for `bytes`.\n//\n// The JSON representation for `BytesValue` is JSON string.\nmessage BytesValue {\n  // The bytes value.\n  bytes value = 1;\n}\n"
  },
  {
    "path": "service/user/third_party/openapi/v3/annotations.proto",
    "content": "// Copyright 2022 Google LLC. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//    http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\npackage openapi.v3;\n\nimport \"openapiv3/OpenAPIv3.proto\";\nimport \"google/protobuf/descriptor.proto\";\n\n// This option lets the proto compiler generate Java code inside the package\n// name (see below) instead of inside an outer class. It creates a simpler\n// developer experience by reducing one-level of name nesting and be\n// consistent with most programming languages that don't support outer classes.\noption java_multiple_files = true;\n\n// The Java outer classname should be the filename in UpperCamelCase. This\n// class is only used to hold proto descriptor, so developers don't need to\n// work with it directly.\noption java_outer_classname = \"AnnotationsProto\";\n\n// The Java package name must be proto package name with proper prefix.\noption java_package = \"org.openapi_v3\";\n\n// A reasonable prefix for the Objective-C symbols generated from the package.\n// It should at a minimum be 3 characters long, all uppercase, and convention\n// is to use an abbreviation of the package name. Something short, but\n// hopefully unique enough to not conflict with things that may come along in\n// the future. 'GPB' is reserved for the protocol buffer implementation itself.\noption objc_class_prefix = \"OAS\";\n\n// The Go package name.\noption go_package = \"github.com/google/gnostic/openapiv3;openapi_v3\";\n\nextend google.protobuf.FileOptions {\n  Document document = 1143;\n}\n\nextend google.protobuf.MethodOptions {\n  Operation operation = 1143;\n}\n\nextend google.protobuf.MessageOptions {\n  Schema schema = 1143;\n}\n\nextend google.protobuf.FieldOptions {\n  Schema property = 1143;\n}"
  },
  {
    "path": "service/user/third_party/openapi/v3/openapi.proto",
    "content": "// Copyright 2020 Google LLC. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//    http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// THIS FILE IS AUTOMATICALLY GENERATED.\n\nsyntax = \"proto3\";\n\npackage openapi.v3;\n\nimport \"google/protobuf/any.proto\";\n\n// This option lets the proto compiler generate Java code inside the package\n// name (see below) instead of inside an outer class. It creates a simpler\n// developer experience by reducing one-level of name nesting and be\n// consistent with most programming languages that don't support outer classes.\noption java_multiple_files = true;\n\n// The Java outer classname should be the filename in UpperCamelCase. This\n// class is only used to hold proto descriptor, so developers don't need to\n// work with it directly.\noption java_outer_classname = \"OpenAPIProto\";\n\n// The Java package name must be proto package name with proper prefix.\noption java_package = \"org.openapi_v3\";\n\n// A reasonable prefix for the Objective-C symbols generated from the package.\n// It should at a minimum be 3 characters long, all uppercase, and convention\n// is to use an abbreviation of the package name. Something short, but\n// hopefully unique enough to not conflict with things that may come along in\n// the future. 'GPB' is reserved for the protocol buffer implementation itself.\noption objc_class_prefix = \"OAS\";\n\n// The Go package name.\noption go_package = \"github.com/google/gnostic/openapiv3;openapi_v3\";\n\nmessage AdditionalPropertiesItem {\n  oneof oneof {\n    SchemaOrReference schema_or_reference = 1;\n    bool boolean = 2;\n  }\n}\n\nmessage Any {\n  google.protobuf.Any value = 1;\n  string yaml = 2;\n}\n\nmessage AnyOrExpression {\n  oneof oneof {\n    Any any = 1;\n    Expression expression = 2;\n  }\n}\n\n// A map of possible out-of band callbacks related to the parent operation. Each value in the map is a Path Item Object that describes a set of requests that may be initiated by the API provider and the expected responses. The key value used to identify the callback object is an expression, evaluated at runtime, that identifies a URL to use for the callback operation.\nmessage Callback {\n  repeated NamedPathItem path = 1;\n  repeated NamedAny specification_extension = 2;\n}\n\nmessage CallbackOrReference {\n  oneof oneof {\n    Callback callback = 1;\n    Reference reference = 2;\n  }\n}\n\nmessage CallbacksOrReferences {\n  repeated NamedCallbackOrReference additional_properties = 1;\n}\n\n// Holds a set of reusable objects for different aspects of the OAS. All objects defined within the components object will have no effect on the API unless they are explicitly referenced from properties outside the components object.\nmessage Components {\n  SchemasOrReferences schemas = 1;\n  ResponsesOrReferences responses = 2;\n  ParametersOrReferences parameters = 3;\n  ExamplesOrReferences examples = 4;\n  RequestBodiesOrReferences request_bodies = 5;\n  HeadersOrReferences headers = 6;\n  SecuritySchemesOrReferences security_schemes = 7;\n  LinksOrReferences links = 8;\n  CallbacksOrReferences callbacks = 9;\n  repeated NamedAny specification_extension = 10;\n}\n\n// Contact information for the exposed API.\nmessage Contact {\n  string name = 1;\n  string url = 2;\n  string email = 3;\n  repeated NamedAny specification_extension = 4;\n}\n\nmessage DefaultType {\n  oneof oneof {\n    double number = 1;\n    bool boolean = 2;\n    string string = 3;\n  }\n}\n\n// When request bodies or response payloads may be one of a number of different schemas, a `discriminator` object can be used to aid in serialization, deserialization, and validation.  The discriminator is a specific object in a schema which is used to inform the consumer of the specification of an alternative schema based on the value associated with it.  When using the discriminator, _inline_ schemas will not be considered.\nmessage Discriminator {\n  string property_name = 1;\n  Strings mapping = 2;\n  repeated NamedAny specification_extension = 3;\n}\n\nmessage Document {\n  string openapi = 1;\n  Info info = 2;\n  repeated Server servers = 3;\n  Paths paths = 4;\n  Components components = 5;\n  repeated SecurityRequirement security = 6;\n  repeated Tag tags = 7;\n  ExternalDocs external_docs = 8;\n  repeated NamedAny specification_extension = 9;\n}\n\n// A single encoding definition applied to a single schema property.\nmessage Encoding {\n  string content_type = 1;\n  HeadersOrReferences headers = 2;\n  string style = 3;\n  bool explode = 4;\n  bool allow_reserved = 5;\n  repeated NamedAny specification_extension = 6;\n}\n\nmessage Encodings {\n  repeated NamedEncoding additional_properties = 1;\n}\n\nmessage Example {\n  string summary = 1;\n  string description = 2;\n  Any value = 3;\n  string external_value = 4;\n  repeated NamedAny specification_extension = 5;\n}\n\nmessage ExampleOrReference {\n  oneof oneof {\n    Example example = 1;\n    Reference reference = 2;\n  }\n}\n\nmessage ExamplesOrReferences {\n  repeated NamedExampleOrReference additional_properties = 1;\n}\n\nmessage Expression {\n  repeated NamedAny additional_properties = 1;\n}\n\n// Allows referencing an external resource for extended documentation.\nmessage ExternalDocs {\n  string description = 1;\n  string url = 2;\n  repeated NamedAny specification_extension = 3;\n}\n\n// The Header Object follows the structure of the Parameter Object with the following changes:  1. `name` MUST NOT be specified, it is given in the corresponding `headers` map. 1. `in` MUST NOT be specified, it is implicitly in `header`. 1. All traits that are affected by the location MUST be applicable to a location of `header` (for example, `style`).\nmessage Header {\n  string description = 1;\n  bool required = 2;\n  bool deprecated = 3;\n  bool allow_empty_value = 4;\n  string style = 5;\n  bool explode = 6;\n  bool allow_reserved = 7;\n  SchemaOrReference schema = 8;\n  Any example = 9;\n  ExamplesOrReferences examples = 10;\n  MediaTypes content = 11;\n  repeated NamedAny specification_extension = 12;\n}\n\nmessage HeaderOrReference {\n  oneof oneof {\n    Header header = 1;\n    Reference reference = 2;\n  }\n}\n\nmessage HeadersOrReferences {\n  repeated NamedHeaderOrReference additional_properties = 1;\n}\n\n// The object provides metadata about the API. The metadata MAY be used by the clients if needed, and MAY be presented in editing or documentation generation tools for convenience.\nmessage Info {\n  string title = 1;\n  string description = 2;\n  string terms_of_service = 3;\n  Contact contact = 4;\n  License license = 5;\n  string version = 6;\n  repeated NamedAny specification_extension = 7;\n  string summary = 8;\n}\n\nmessage ItemsItem {\n  repeated SchemaOrReference schema_or_reference = 1;\n}\n\n// License information for the exposed API.\nmessage License {\n  string name = 1;\n  string url = 2;\n  repeated NamedAny specification_extension = 3;\n}\n\n// The `Link object` represents a possible design-time link for a response. The presence of a link does not guarantee the caller's ability to successfully invoke it, rather it provides a known relationship and traversal mechanism between responses and other operations.  Unlike _dynamic_ links (i.e. links provided **in** the response payload), the OAS linking mechanism does not require link information in the runtime response.  For computing links, and providing instructions to execute them, a runtime expression is used for accessing values in an operation and using them as parameters while invoking the linked operation.\nmessage Link {\n  string operation_ref = 1;\n  string operation_id = 2;\n  AnyOrExpression parameters = 3;\n  AnyOrExpression request_body = 4;\n  string description = 5;\n  Server server = 6;\n  repeated NamedAny specification_extension = 7;\n}\n\nmessage LinkOrReference {\n  oneof oneof {\n    Link link = 1;\n    Reference reference = 2;\n  }\n}\n\nmessage LinksOrReferences {\n  repeated NamedLinkOrReference additional_properties = 1;\n}\n\n// Each Media Type Object provides schema and examples for the media type identified by its key.\nmessage MediaType {\n  SchemaOrReference schema = 1;\n  Any example = 2;\n  ExamplesOrReferences examples = 3;\n  Encodings encoding = 4;\n  repeated NamedAny specification_extension = 5;\n}\n\nmessage MediaTypes {\n  repeated NamedMediaType additional_properties = 1;\n}\n\n// Automatically-generated message used to represent maps of Any as ordered (name,value) pairs.\nmessage NamedAny {\n  // Map key\n  string name = 1;\n  // Mapped value\n  Any value = 2;\n}\n\n// Automatically-generated message used to represent maps of CallbackOrReference as ordered (name,value) pairs.\nmessage NamedCallbackOrReference {\n  // Map key\n  string name = 1;\n  // Mapped value\n  CallbackOrReference value = 2;\n}\n\n// Automatically-generated message used to represent maps of Encoding as ordered (name,value) pairs.\nmessage NamedEncoding {\n  // Map key\n  string name = 1;\n  // Mapped value\n  Encoding value = 2;\n}\n\n// Automatically-generated message used to represent maps of ExampleOrReference as ordered (name,value) pairs.\nmessage NamedExampleOrReference {\n  // Map key\n  string name = 1;\n  // Mapped value\n  ExampleOrReference value = 2;\n}\n\n// Automatically-generated message used to represent maps of HeaderOrReference as ordered (name,value) pairs.\nmessage NamedHeaderOrReference {\n  // Map key\n  string name = 1;\n  // Mapped value\n  HeaderOrReference value = 2;\n}\n\n// Automatically-generated message used to represent maps of LinkOrReference as ordered (name,value) pairs.\nmessage NamedLinkOrReference {\n  // Map key\n  string name = 1;\n  // Mapped value\n  LinkOrReference value = 2;\n}\n\n// Automatically-generated message used to represent maps of MediaType as ordered (name,value) pairs.\nmessage NamedMediaType {\n  // Map key\n  string name = 1;\n  // Mapped value\n  MediaType value = 2;\n}\n\n// Automatically-generated message used to represent maps of ParameterOrReference as ordered (name,value) pairs.\nmessage NamedParameterOrReference {\n  // Map key\n  string name = 1;\n  // Mapped value\n  ParameterOrReference value = 2;\n}\n\n// Automatically-generated message used to represent maps of PathItem as ordered (name,value) pairs.\nmessage NamedPathItem {\n  // Map key\n  string name = 1;\n  // Mapped value\n  PathItem value = 2;\n}\n\n// Automatically-generated message used to represent maps of RequestBodyOrReference as ordered (name,value) pairs.\nmessage NamedRequestBodyOrReference {\n  // Map key\n  string name = 1;\n  // Mapped value\n  RequestBodyOrReference value = 2;\n}\n\n// Automatically-generated message used to represent maps of ResponseOrReference as ordered (name,value) pairs.\nmessage NamedResponseOrReference {\n  // Map key\n  string name = 1;\n  // Mapped value\n  ResponseOrReference value = 2;\n}\n\n// Automatically-generated message used to represent maps of SchemaOrReference as ordered (name,value) pairs.\nmessage NamedSchemaOrReference {\n  // Map key\n  string name = 1;\n  // Mapped value\n  SchemaOrReference value = 2;\n}\n\n// Automatically-generated message used to represent maps of SecuritySchemeOrReference as ordered (name,value) pairs.\nmessage NamedSecuritySchemeOrReference {\n  // Map key\n  string name = 1;\n  // Mapped value\n  SecuritySchemeOrReference value = 2;\n}\n\n// Automatically-generated message used to represent maps of ServerVariable as ordered (name,value) pairs.\nmessage NamedServerVariable {\n  // Map key\n  string name = 1;\n  // Mapped value\n  ServerVariable value = 2;\n}\n\n// Automatically-generated message used to represent maps of string as ordered (name,value) pairs.\nmessage NamedString {\n  // Map key\n  string name = 1;\n  // Mapped value\n  string value = 2;\n}\n\n// Automatically-generated message used to represent maps of StringArray as ordered (name,value) pairs.\nmessage NamedStringArray {\n  // Map key\n  string name = 1;\n  // Mapped value\n  StringArray value = 2;\n}\n\n// Configuration details for a supported OAuth Flow\nmessage OauthFlow {\n  string authorization_url = 1;\n  string token_url = 2;\n  string refresh_url = 3;\n  Strings scopes = 4;\n  repeated NamedAny specification_extension = 5;\n}\n\n// Allows configuration of the supported OAuth Flows.\nmessage OauthFlows {\n  OauthFlow implicit = 1;\n  OauthFlow password = 2;\n  OauthFlow client_credentials = 3;\n  OauthFlow authorization_code = 4;\n  repeated NamedAny specification_extension = 5;\n}\n\nmessage Object {\n  repeated NamedAny additional_properties = 1;\n}\n\n// Describes a single API operation on a path.\nmessage Operation {\n  repeated string tags = 1;\n  string summary = 2;\n  string description = 3;\n  ExternalDocs external_docs = 4;\n  string operation_id = 5;\n  repeated ParameterOrReference parameters = 6;\n  RequestBodyOrReference request_body = 7;\n  Responses responses = 8;\n  CallbacksOrReferences callbacks = 9;\n  bool deprecated = 10;\n  repeated SecurityRequirement security = 11;\n  repeated Server servers = 12;\n  repeated NamedAny specification_extension = 13;\n}\n\n// Describes a single operation parameter.  A unique parameter is defined by a combination of a name and location.\nmessage Parameter {\n  string name = 1;\n  string in = 2;\n  string description = 3;\n  bool required = 4;\n  bool deprecated = 5;\n  bool allow_empty_value = 6;\n  string style = 7;\n  bool explode = 8;\n  bool allow_reserved = 9;\n  SchemaOrReference schema = 10;\n  Any example = 11;\n  ExamplesOrReferences examples = 12;\n  MediaTypes content = 13;\n  repeated NamedAny specification_extension = 14;\n}\n\nmessage ParameterOrReference {\n  oneof oneof {\n    Parameter parameter = 1;\n    Reference reference = 2;\n  }\n}\n\nmessage ParametersOrReferences {\n  repeated NamedParameterOrReference additional_properties = 1;\n}\n\n// Describes the operations available on a single path. A Path Item MAY be empty, due to ACL constraints. The path itself is still exposed to the documentation viewer but they will not know which operations and parameters are available.\nmessage PathItem {\n  string _ref = 1;\n  string summary = 2;\n  string description = 3;\n  Operation get = 4;\n  Operation put = 5;\n  Operation post = 6;\n  Operation delete = 7;\n  Operation options = 8;\n  Operation head = 9;\n  Operation patch = 10;\n  Operation trace = 11;\n  repeated Server servers = 12;\n  repeated ParameterOrReference parameters = 13;\n  repeated NamedAny specification_extension = 14;\n}\n\n// Holds the relative paths to the individual endpoints and their operations. The path is appended to the URL from the `Server Object` in order to construct the full URL.  The Paths MAY be empty, due to ACL constraints.\nmessage Paths {\n  repeated NamedPathItem path = 1;\n  repeated NamedAny specification_extension = 2;\n}\n\nmessage Properties {\n  repeated NamedSchemaOrReference additional_properties = 1;\n}\n\n// A simple object to allow referencing other components in the specification, internally and externally.  The Reference Object is defined by JSON Reference and follows the same structure, behavior and rules.   For this specification, reference resolution is accomplished as defined by the JSON Reference specification and not by the JSON Schema specification.\nmessage Reference {\n  string _ref = 1;\n  string summary = 2;\n  string description = 3;\n}\n\nmessage RequestBodiesOrReferences {\n  repeated NamedRequestBodyOrReference additional_properties = 1;\n}\n\n// Describes a single request body.\nmessage RequestBody {\n  string description = 1;\n  MediaTypes content = 2;\n  bool required = 3;\n  repeated NamedAny specification_extension = 4;\n}\n\nmessage RequestBodyOrReference {\n  oneof oneof {\n    RequestBody request_body = 1;\n    Reference reference = 2;\n  }\n}\n\n// Describes a single response from an API Operation, including design-time, static  `links` to operations based on the response.\nmessage Response {\n  string description = 1;\n  HeadersOrReferences headers = 2;\n  MediaTypes content = 3;\n  LinksOrReferences links = 4;\n  repeated NamedAny specification_extension = 5;\n}\n\nmessage ResponseOrReference {\n  oneof oneof {\n    Response response = 1;\n    Reference reference = 2;\n  }\n}\n\n// A container for the expected responses of an operation. The container maps a HTTP response code to the expected response.  The documentation is not necessarily expected to cover all possible HTTP response codes because they may not be known in advance. However, documentation is expected to cover a successful operation response and any known errors.  The `default` MAY be used as a default response object for all HTTP codes  that are not covered individually by the specification.  The `Responses Object` MUST contain at least one response code, and it  SHOULD be the response for a successful operation call.\nmessage Responses {\n  ResponseOrReference default = 1;\n  repeated NamedResponseOrReference response_or_reference = 2;\n  repeated NamedAny specification_extension = 3;\n}\n\nmessage ResponsesOrReferences {\n  repeated NamedResponseOrReference additional_properties = 1;\n}\n\n// The Schema Object allows the definition of input and output data types. These types can be objects, but also primitives and arrays. This object is an extended subset of the JSON Schema Specification Wright Draft 00.  For more information about the properties, see JSON Schema Core and JSON Schema Validation. Unless stated otherwise, the property definitions follow the JSON Schema.\nmessage Schema {\n  bool nullable = 1;\n  Discriminator discriminator = 2;\n  bool read_only = 3;\n  bool write_only = 4;\n  Xml xml = 5;\n  ExternalDocs external_docs = 6;\n  Any example = 7;\n  bool deprecated = 8;\n  string title = 9;\n  double multiple_of = 10;\n  double maximum = 11;\n  bool exclusive_maximum = 12;\n  double minimum = 13;\n  bool exclusive_minimum = 14;\n  int64 max_length = 15;\n  int64 min_length = 16;\n  string pattern = 17;\n  int64 max_items = 18;\n  int64 min_items = 19;\n  bool unique_items = 20;\n  int64 max_properties = 21;\n  int64 min_properties = 22;\n  repeated string required = 23;\n  repeated Any enum = 24;\n  string type = 25;\n  repeated SchemaOrReference all_of = 26;\n  repeated SchemaOrReference one_of = 27;\n  repeated SchemaOrReference any_of = 28;\n  Schema not = 29;\n  ItemsItem items = 30;\n  Properties properties = 31;\n  AdditionalPropertiesItem additional_properties = 32;\n  DefaultType default = 33;\n  string description = 34;\n  string format = 35;\n  repeated NamedAny specification_extension = 36;\n}\n\nmessage SchemaOrReference {\n  oneof oneof {\n    Schema schema = 1;\n    Reference reference = 2;\n  }\n}\n\nmessage SchemasOrReferences {\n  repeated NamedSchemaOrReference additional_properties = 1;\n}\n\n// Lists the required security schemes to execute this operation. The name used for each property MUST correspond to a security scheme declared in the Security Schemes under the Components Object.  Security Requirement Objects that contain multiple schemes require that all schemes MUST be satisfied for a request to be authorized. This enables support for scenarios where multiple query parameters or HTTP headers are required to convey security information.  When a list of Security Requirement Objects is defined on the OpenAPI Object or Operation Object, only one of the Security Requirement Objects in the list needs to be satisfied to authorize the request.\nmessage SecurityRequirement {\n  repeated NamedStringArray additional_properties = 1;\n}\n\n// Defines a security scheme that can be used by the operations. Supported schemes are HTTP authentication, an API key (either as a header, a cookie parameter or as a query parameter), mutual TLS (use of a client certificate), OAuth2's common flows (implicit, password, application and access code) as defined in RFC6749, and OpenID Connect.   Please note that currently (2019) the implicit flow is about to be deprecated OAuth 2.0 Security Best Current Practice. Recommended for most use case is Authorization Code Grant flow with PKCE.\nmessage SecurityScheme {\n  string type = 1;\n  string description = 2;\n  string name = 3;\n  string in = 4;\n  string scheme = 5;\n  string bearer_format = 6;\n  OauthFlows flows = 7;\n  string open_id_connect_url = 8;\n  repeated NamedAny specification_extension = 9;\n}\n\nmessage SecuritySchemeOrReference {\n  oneof oneof {\n    SecurityScheme security_scheme = 1;\n    Reference reference = 2;\n  }\n}\n\nmessage SecuritySchemesOrReferences {\n  repeated NamedSecuritySchemeOrReference additional_properties = 1;\n}\n\n// An object representing a Server.\nmessage Server {\n  string url = 1;\n  string description = 2;\n  ServerVariables variables = 3;\n  repeated NamedAny specification_extension = 4;\n}\n\n// An object representing a Server Variable for server URL template substitution.\nmessage ServerVariable {\n  repeated string enum = 1;\n  string default = 2;\n  string description = 3;\n  repeated NamedAny specification_extension = 4;\n}\n\nmessage ServerVariables {\n  repeated NamedServerVariable additional_properties = 1;\n}\n\n// Any property starting with x- is valid.\nmessage SpecificationExtension {\n  oneof oneof {\n    double number = 1;\n    bool boolean = 2;\n    string string = 3;\n  }\n}\n\nmessage StringArray {\n  repeated string value = 1;\n}\n\nmessage Strings {\n  repeated NamedString additional_properties = 1;\n}\n\n// Adds metadata to a single tag that is used by the Operation Object. It is not mandatory to have a Tag Object per tag defined in the Operation Object instances.\nmessage Tag {\n  string name = 1;\n  string description = 2;\n  ExternalDocs external_docs = 3;\n  repeated NamedAny specification_extension = 4;\n}\n\n// A metadata object that allows for more fine-tuned XML model definitions.  When using arrays, XML element names are *not* inferred (for singular/plural forms) and the `name` property SHOULD be used to add that information. See examples for expected behavior.\nmessage Xml {\n  string name = 1;\n  string namespace = 2;\n  string prefix = 3;\n  bool attribute = 4;\n  bool wrapped = 5;\n  repeated NamedAny specification_extension = 6;\n}\n\n"
  },
  {
    "path": "service/user/third_party/validate/README.md",
    "content": "# protoc-gen-validate (PGV)\n\n* https://github.com/envoyproxy/protoc-gen-validate\n"
  },
  {
    "path": "service/user/third_party/validate/validate.proto",
    "content": "syntax = \"proto2\";\npackage validate;\n\noption go_package = \"github.com/envoyproxy/protoc-gen-validate/validate\";\noption java_package = \"io.envoyproxy.pgv.validate\";\n\nimport \"google/protobuf/descriptor.proto\";\nimport \"google/protobuf/duration.proto\";\nimport \"google/protobuf/timestamp.proto\";\n\n// Validation rules applied at the message level\nextend google.protobuf.MessageOptions {\n    // Disabled nullifies any validation rules for this message, including any\n    // message fields associated with it that do support validation.\n    optional bool disabled = 1071;\n    // Ignore skips generation of validation methods for this message.\n    optional bool ignored = 1072;\n}\n\n// Validation rules applied at the oneof level\nextend google.protobuf.OneofOptions {\n    // Required ensures that exactly one the field options in a oneof is set;\n    // validation fails if no fields in the oneof are set.\n    optional bool required = 1071;\n}\n\n// Validation rules applied at the field level\nextend google.protobuf.FieldOptions {\n    // Rules specify the validations to be performed on this field. By default,\n    // no validation is performed against a field.\n    optional FieldRules rules = 1071;\n}\n\n// FieldRules encapsulates the rules for each type of field. Depending on the\n// field, the correct set should be used to ensure proper validations.\nmessage FieldRules {\n    optional MessageRules message = 17;\n    oneof type {\n        // Scalar Field Types\n        FloatRules    float    = 1;\n        DoubleRules   double   = 2;\n        Int32Rules    int32    = 3;\n        Int64Rules    int64    = 4;\n        UInt32Rules   uint32   = 5;\n        UInt64Rules   uint64   = 6;\n        SInt32Rules   sint32   = 7;\n        SInt64Rules   sint64   = 8;\n        Fixed32Rules  fixed32  = 9;\n        Fixed64Rules  fixed64  = 10;\n        SFixed32Rules sfixed32 = 11;\n        SFixed64Rules sfixed64 = 12;\n        BoolRules     bool     = 13;\n        StringRules   string   = 14;\n        BytesRules    bytes    = 15;\n\n        // Complex Field Types\n        EnumRules     enum     = 16;\n        RepeatedRules repeated = 18;\n        MapRules      map      = 19;\n\n        // Well-Known Field Types\n        AnyRules       any       = 20;\n        DurationRules  duration  = 21;\n        TimestampRules timestamp = 22;\n    }\n}\n\n// FloatRules describes the constraints applied to `float` values\nmessage FloatRules {\n    // Const specifies that this field must be exactly the specified value\n    optional float const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional float lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional float lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional float gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional float gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated float in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated float not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// DoubleRules describes the constraints applied to `double` values\nmessage DoubleRules {\n    // Const specifies that this field must be exactly the specified value\n    optional double const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional double lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional double lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional double gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional double gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated double in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated double not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// Int32Rules describes the constraints applied to `int32` values\nmessage Int32Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional int32 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional int32 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional int32 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional int32 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional int32 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated int32 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated int32 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// Int64Rules describes the constraints applied to `int64` values\nmessage Int64Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional int64 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional int64 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional int64 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional int64 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional int64 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated int64 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated int64 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// UInt32Rules describes the constraints applied to `uint32` values\nmessage UInt32Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional uint32 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional uint32 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional uint32 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional uint32 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional uint32 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated uint32 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated uint32 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// UInt64Rules describes the constraints applied to `uint64` values\nmessage UInt64Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional uint64 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional uint64 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional uint64 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional uint64 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional uint64 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated uint64 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated uint64 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// SInt32Rules describes the constraints applied to `sint32` values\nmessage SInt32Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional sint32 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional sint32 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional sint32 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional sint32 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional sint32 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated sint32 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated sint32 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// SInt64Rules describes the constraints applied to `sint64` values\nmessage SInt64Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional sint64 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional sint64 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional sint64 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional sint64 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional sint64 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated sint64 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated sint64 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// Fixed32Rules describes the constraints applied to `fixed32` values\nmessage Fixed32Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional fixed32 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional fixed32 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional fixed32 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional fixed32 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional fixed32 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated fixed32 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated fixed32 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// Fixed64Rules describes the constraints applied to `fixed64` values\nmessage Fixed64Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional fixed64 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional fixed64 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional fixed64 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional fixed64 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional fixed64 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated fixed64 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated fixed64 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// SFixed32Rules describes the constraints applied to `sfixed32` values\nmessage SFixed32Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional sfixed32 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional sfixed32 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional sfixed32 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional sfixed32 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional sfixed32 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated sfixed32 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated sfixed32 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// SFixed64Rules describes the constraints applied to `sfixed64` values\nmessage SFixed64Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional sfixed64 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional sfixed64 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional sfixed64 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional sfixed64 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional sfixed64 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated sfixed64 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated sfixed64 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// BoolRules describes the constraints applied to `bool` values\nmessage BoolRules {\n    // Const specifies that this field must be exactly the specified value\n    optional bool const = 1;\n}\n\n// StringRules describe the constraints applied to `string` values\nmessage StringRules {\n    // Const specifies that this field must be exactly the specified value\n    optional string const = 1;\n\n    // Len specifies that this field must be the specified number of\n    // characters (Unicode code points). Note that the number of\n    // characters may differ from the number of bytes in the string.\n    optional uint64 len = 19;\n\n    // MinLen specifies that this field must be the specified number of\n    // characters (Unicode code points) at a minimum. Note that the number of\n    // characters may differ from the number of bytes in the string.\n    optional uint64 min_len = 2;\n\n    // MaxLen specifies that this field must be the specified number of\n    // characters (Unicode code points) at a maximum. Note that the number of\n    // characters may differ from the number of bytes in the string.\n    optional uint64 max_len = 3;\n\n    // LenBytes specifies that this field must be the specified number of bytes\n    // at a minimum\n    optional uint64 len_bytes = 20;\n\n    // MinBytes specifies that this field must be the specified number of bytes\n    // at a minimum\n    optional uint64 min_bytes = 4;\n\n    // MaxBytes specifies that this field must be the specified number of bytes\n    // at a maximum\n    optional uint64 max_bytes = 5;\n\n    // Pattern specifes that this field must match against the specified\n    // regular expression (RE2 syntax). The included expression should elide\n    // any delimiters.\n    optional string pattern  = 6;\n\n    // Prefix specifies that this field must have the specified substring at\n    // the beginning of the string.\n    optional string prefix   = 7;\n\n    // Suffix specifies that this field must have the specified substring at\n    // the end of the string.\n    optional string suffix   = 8;\n\n    // Contains specifies that this field must have the specified substring\n    // anywhere in the string.\n    optional string contains = 9;\n\n    // NotContains specifies that this field cannot have the specified substring\n    // anywhere in the string.\n    optional string not_contains = 23;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated string in     = 10;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated string not_in = 11;\n\n    // WellKnown rules provide advanced constraints against common string\n    // patterns\n    oneof well_known {\n        // Email specifies that the field must be a valid email address as\n        // defined by RFC 5322\n        bool email    = 12;\n\n        // Hostname specifies that the field must be a valid hostname as\n        // defined by RFC 1034. This constraint does not support\n        // internationalized domain names (IDNs).\n        bool hostname = 13;\n\n        // Ip specifies that the field must be a valid IP (v4 or v6) address.\n        // Valid IPv6 addresses should not include surrounding square brackets.\n        bool ip       = 14;\n\n        // Ipv4 specifies that the field must be a valid IPv4 address.\n        bool ipv4     = 15;\n\n        // Ipv6 specifies that the field must be a valid IPv6 address. Valid\n        // IPv6 addresses should not include surrounding square brackets.\n        bool ipv6     = 16;\n\n        // Uri specifies that the field must be a valid, absolute URI as defined\n        // by RFC 3986\n        bool uri      = 17;\n\n        // UriRef specifies that the field must be a valid URI as defined by RFC\n        // 3986 and may be relative or absolute.\n        bool uri_ref  = 18;\n\n        // Address specifies that the field must be either a valid hostname as\n        // defined by RFC 1034 (which does not support internationalized domain\n        // names or IDNs), or it can be a valid IP (v4 or v6).\n        bool address  = 21;\n\n        // Uuid specifies that the field must be a valid UUID as defined by\n        // RFC 4122\n        bool uuid     = 22;\n\n        // WellKnownRegex specifies a common well known pattern defined as a regex.\n        KnownRegex well_known_regex = 24;\n    }\n\n  // This applies to regexes HTTP_HEADER_NAME and HTTP_HEADER_VALUE to enable\n  // strict header validation.\n  // By default, this is true, and HTTP header validations are RFC-compliant.\n  // Setting to false will enable a looser validations that only disallows\n  // \\r\\n\\0 characters, which can be used to bypass header matching rules.\n  optional bool strict = 25 [default = true];\n\n  // IgnoreEmpty specifies that the validation rules of this field should be\n  // evaluated only if the field is not empty\n  optional bool ignore_empty = 26;\n}\n\n// WellKnownRegex contain some well-known patterns.\nenum KnownRegex {\n  UNKNOWN = 0;\n\n  // HTTP header name as defined by RFC 7230.\n  HTTP_HEADER_NAME = 1;\n\n  // HTTP header value as defined by RFC 7230.\n  HTTP_HEADER_VALUE = 2;\n}\n\n// BytesRules describe the constraints applied to `bytes` values\nmessage BytesRules {\n    // Const specifies that this field must be exactly the specified value\n    optional bytes const = 1;\n\n    // Len specifies that this field must be the specified number of bytes\n    optional uint64 len = 13;\n\n    // MinLen specifies that this field must be the specified number of bytes\n    // at a minimum\n    optional uint64 min_len = 2;\n\n    // MaxLen specifies that this field must be the specified number of bytes\n    // at a maximum\n    optional uint64 max_len = 3;\n\n    // Pattern specifes that this field must match against the specified\n    // regular expression (RE2 syntax). The included expression should elide\n    // any delimiters.\n    optional string pattern  = 4;\n\n    // Prefix specifies that this field must have the specified bytes at the\n    // beginning of the string.\n    optional bytes  prefix   = 5;\n\n    // Suffix specifies that this field must have the specified bytes at the\n    // end of the string.\n    optional bytes  suffix   = 6;\n\n    // Contains specifies that this field must have the specified bytes\n    // anywhere in the string.\n    optional bytes  contains = 7;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated bytes in     = 8;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated bytes not_in = 9;\n\n    // WellKnown rules provide advanced constraints against common byte\n    // patterns\n    oneof well_known {\n        // Ip specifies that the field must be a valid IP (v4 or v6) address in\n        // byte format\n        bool ip   = 10;\n\n        // Ipv4 specifies that the field must be a valid IPv4 address in byte\n        // format\n        bool ipv4 = 11;\n\n        // Ipv6 specifies that the field must be a valid IPv6 address in byte\n        // format\n        bool ipv6 = 12;\n    }\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 14;\n}\n\n// EnumRules describe the constraints applied to enum values\nmessage EnumRules {\n    // Const specifies that this field must be exactly the specified value\n    optional int32 const        = 1;\n\n    // DefinedOnly specifies that this field must be only one of the defined\n    // values for this enum, failing on any undefined value.\n    optional bool  defined_only = 2;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated int32 in           = 3;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated int32 not_in       = 4;\n}\n\n// MessageRules describe the constraints applied to embedded message values.\n// For message-type fields, validation is performed recursively.\nmessage MessageRules {\n    // Skip specifies that the validation rules of this field should not be\n    // evaluated\n    optional bool skip     = 1;\n\n    // Required specifies that this field must be set\n    optional bool required = 2;\n}\n\n// RepeatedRules describe the constraints applied to `repeated` values\nmessage RepeatedRules {\n    // MinItems specifies that this field must have the specified number of\n    // items at a minimum\n    optional uint64 min_items = 1;\n\n    // MaxItems specifies that this field must have the specified number of\n    // items at a maximum\n    optional uint64 max_items = 2;\n\n    // Unique specifies that all elements in this field must be unique. This\n    // contraint is only applicable to scalar and enum types (messages are not\n    // supported).\n    optional bool   unique    = 3;\n\n    // Items specifies the contraints to be applied to each item in the field.\n    // Repeated message fields will still execute validation against each item\n    // unless skip is specified here.\n    optional FieldRules items = 4;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 5;\n}\n\n// MapRules describe the constraints applied to `map` values\nmessage MapRules {\n    // MinPairs specifies that this field must have the specified number of\n    // KVs at a minimum\n    optional uint64 min_pairs = 1;\n\n    // MaxPairs specifies that this field must have the specified number of\n    // KVs at a maximum\n    optional uint64 max_pairs = 2;\n\n    // NoSparse specifies values in this field cannot be unset. This only\n    // applies to map's with message value types.\n    optional bool no_sparse = 3;\n\n    // Keys specifies the constraints to be applied to each key in the field.\n    optional FieldRules keys   = 4;\n\n    // Values specifies the constraints to be applied to the value of each key\n    // in the field. Message values will still have their validations evaluated\n    // unless skip is specified here.\n    optional FieldRules values = 5;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 6;\n}\n\n// AnyRules describe constraints applied exclusively to the\n// `google.protobuf.Any` well-known type\nmessage AnyRules {\n    // Required specifies that this field must be set\n    optional bool required = 1;\n\n    // In specifies that this field's `type_url` must be equal to one of the\n    // specified values.\n    repeated string in     = 2;\n\n    // NotIn specifies that this field's `type_url` must not be equal to any of\n    // the specified values.\n    repeated string not_in = 3;\n}\n\n// DurationRules describe the constraints applied exclusively to the\n// `google.protobuf.Duration` well-known type\nmessage DurationRules {\n    // Required specifies that this field must be set\n    optional bool required = 1;\n\n    // Const specifies that this field must be exactly the specified value\n    optional google.protobuf.Duration const = 2;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional google.protobuf.Duration lt = 3;\n\n    // Lt specifies that this field must be less than the specified value,\n    // inclusive\n    optional google.protobuf.Duration lte = 4;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive\n    optional google.protobuf.Duration gt = 5;\n\n    // Gte specifies that this field must be greater than the specified value,\n    // inclusive\n    optional google.protobuf.Duration gte = 6;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated google.protobuf.Duration in = 7;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated google.protobuf.Duration not_in = 8;\n}\n\n// TimestampRules describe the constraints applied exclusively to the\n// `google.protobuf.Timestamp` well-known type\nmessage TimestampRules {\n    // Required specifies that this field must be set\n    optional bool required = 1;\n\n    // Const specifies that this field must be exactly the specified value\n    optional google.protobuf.Timestamp const = 2;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional google.protobuf.Timestamp lt = 3;\n\n    // Lte specifies that this field must be less than the specified value,\n    // inclusive\n    optional google.protobuf.Timestamp lte = 4;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive\n    optional google.protobuf.Timestamp gt = 5;\n\n    // Gte specifies that this field must be greater than the specified value,\n    // inclusive\n    optional google.protobuf.Timestamp gte = 6;\n\n    // LtNow specifies that this must be less than the current time. LtNow\n    // can only be used with the Within rule.\n    optional bool lt_now  = 7;\n\n    // GtNow specifies that this must be greater than the current time. GtNow\n    // can only be used with the Within rule.\n    optional bool gt_now  = 8;\n\n    // Within specifies that this field must be within this duration of the\n    // current time. This constraint can be used alone or with the LtNow and\n    // GtNow rules.\n    optional google.protobuf.Duration within = 9;\n}\n"
  },
  {
    "path": "shop/.gitignore",
    "content": "# Reference https://github.com/github/gitignore/blob/master/Go.gitignore\n# Binaries for programs and plugins\n*.exe\n*.exe~\n*.dll\n*.so\n*.dylib\n\n# Test binary, built with `go test -c`\n*.test\n\n# Output of the go coverage tool, specifically when used with LiteIDE\n*.out\n\n# Dependency directories (remove the comment below to include it)\nvendor/\n\n# Compiled Object files, Static and Dynamic libs (Shared Objects)\n*.o\n*.a\n*.so\n\n# OS General\nThumbs.db\n.DS_Store\n\n# project\n*.cert\n*.key\n*.log\nbin/\n\n# Develop tools\n.vscode/\n.idea/\n*.swp\n"
  },
  {
    "path": "shop/Dockerfile",
    "content": "FROM golang:1.16 AS builder\n\nCOPY . /src\nWORKDIR /src\n\nRUN GOPROXY=https://goproxy.cn make build\n\nFROM debian:stable-slim\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n\t\tca-certificates  \\\n        netbase \\\n        && rm -rf /var/lib/apt/lists/ \\\n        && apt-get autoremove -y && apt-get autoclean -y\n\nCOPY --from=builder /src/bin /app\n\nWORKDIR /app\n\nEXPOSE 8000\nEXPOSE 9000\nVOLUME /data/conf\n\nCMD [\"./server\", \"-conf\", \"/data/conf\"]\n"
  },
  {
    "path": "shop/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2020 go-kratos\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "shop/Makefile",
    "content": "GOPATH:=$(shell go env GOPATH)\nVERSION=$(shell git describe --tags --always)\nINTERNAL_PROTO_FILES=$(shell find internal -name *.proto)\nAPI_PROTO_FILES=$(shell find api -name *.proto)\n\n.PHONY: init\n# init env\ninit:\n\tgo install google.golang.org/protobuf/cmd/protoc-gen-go@latest\n\tgo install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest\n\tgo install github.com/go-kratos/kratos/cmd/kratos/v2@latest\n\tgo install github.com/go-kratos/kratos/cmd/protoc-gen-go-http/v2@latest\n\tgo install github.com/go-kratos/kratos/cmd/protoc-gen-go-errors/v2@latest\n\tgo install github.com/google/gnostic/cmd/protoc-gen-openapi@v0.6.1\n\n.PHONY: errors\n# generate errors code\nerrors:\n\tprotoc --proto_path=. \\\n               --proto_path=./third_party \\\n               --go_out=paths=source_relative:. \\\n               --go-errors_out=paths=source_relative:. \\\n               $(API_PROTO_FILES)\n\n.PHONY: config\n# generate internal proto\nconfig:\n\tprotoc --proto_path=. \\\n\t       --proto_path=./third_party \\\n \t       --go_out=paths=source_relative:. \\\n\t       $(INTERNAL_PROTO_FILES)\n\n.PHONY: api\n# generate api proto\napi:\n\tprotoc --proto_path=. \\\n\t       --proto_path=./third_party \\\n \t       --go_out=paths=source_relative:. \\\n \t       --go-http_out=paths=source_relative:. \\\n \t       --go-grpc_out=paths=source_relative:. \\\n \t       --openapi_out==paths=source_relative:. \\\n \t       --validate_out=paths=source_relative,lang=go:. \\\n\t       $(API_PROTO_FILES)\n\n.PHONY: build\n# build\nbuild:\n\tmkdir -p bin/ && go build -ldflags \"-X main.Version=$(VERSION)\" -o ./bin/ ./...\n\n.PHONY: generate\n# generate\ngenerate:\n\tgo generate ./...\n\n# wire\nwire:\n\tcd cmd/shop/ && wire\n\n.PHONY: test # 快速测试，运行repo以外的所有测试\ntest:\n\tginkgo -r -cover -v .\n\n.PHONY: all\n# generate all\nall:\n\tmake api;\n\tmake errors;\n\tmake config;\n\tmake generate;\n\n# show help\nhelp:\n\t@echo ''\n\t@echo 'Usage:'\n\t@echo ' make [target]'\n\t@echo ''\n\t@echo 'Targets:'\n\t@awk '/^[a-zA-Z\\-\\_0-9]+:/ { \\\n\thelpMessage = match(lastLine, /^# (.*)/); \\\n\t\tif (helpMessage) { \\\n\t\t\thelpCommand = substr($$1, 0, index($$1, \":\")-1); \\\n\t\t\thelpMessage = substr(lastLine, RSTART + 2, RLENGTH); \\\n\t\t\tprintf \"\\033[36m%-22s\\033[0m %s\\n\", helpCommand,helpMessage; \\\n\t\t} \\\n\t} \\\n\t{ lastLine = $$0 }' $(MAKEFILE_LIST)\n\n.DEFAULT_GOAL := help\n"
  },
  {
    "path": "shop/README.md",
    "content": "# Kratos Project Template\n\n## Install Kratos\n```\ngo install github.com/go-kratos/kratos/cmd/kratos/v2@latest\n```\n## Create a service\n```\n# Create a template project\nkratos new server\n\ncd server\n# Add a proto template\nkratos proto add api/server/server.proto\n# Generate the proto code\nkratos proto client api/server/server.proto\n# Generate the source code of service by proto file\nkratos proto server api/server/server.proto -t internal/service\n\ngo generate ./...\ngo build -o ./bin/ ./...\n./bin/server -conf ./configs\n```\n## Generate other auxiliary files by Makefile\n```\n# Download and update dependencies\nmake init\n# Generate API files (include: pb.go, http, grpc, validate, swagger) by proto file\nmake api\n# Generate all files\nmake all\n```\n## Automated Initialization (wire)\n```\n# install wire\ngo get github.com/google/wire/cmd/wire\n\n# generate wire\ncd cmd/server\nwire\n```\n\n## Docker\n```bash\n# build\ndocker build -t <your-docker-image-name> .\n\n# run\ndocker run --rm -p 8000:8000 -p 9000:9000 -v </path/to/your/configs>:/data/conf <your-docker-image-name>\n```\n\n"
  },
  {
    "path": "shop/api/service/user/v1/user.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.0\n// \tprotoc        v3.17.3\n// source: api/service/user/v1/user.proto\n\npackage v1\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\temptypb \"google.golang.org/protobuf/types/known/emptypb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype ListAddressReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUid int64 `protobuf:\"varint,1,opt,name=uid,proto3\" json:\"uid,omitempty\"`\n}\n\nfunc (x *ListAddressReq) Reset() {\n\t*x = ListAddressReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_service_user_v1_user_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListAddressReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListAddressReq) ProtoMessage() {}\n\nfunc (x *ListAddressReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_service_user_v1_user_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListAddressReq.ProtoReflect.Descriptor instead.\nfunc (*ListAddressReq) Descriptor() ([]byte, []int) {\n\treturn file_api_service_user_v1_user_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *ListAddressReq) GetUid() int64 {\n\tif x != nil {\n\t\treturn x.Uid\n\t}\n\treturn 0\n}\n\ntype AddressInfo struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId        int64  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName      string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tMobile    string `protobuf:\"bytes,3,opt,name=mobile,proto3\" json:\"mobile,omitempty\"`\n\tProvince  string `protobuf:\"bytes,4,opt,name=Province,proto3\" json:\"Province,omitempty\"`\n\tCity      string `protobuf:\"bytes,5,opt,name=City,proto3\" json:\"City,omitempty\"`\n\tDistricts string `protobuf:\"bytes,6,opt,name=Districts,proto3\" json:\"Districts,omitempty\"`\n\tAddress   string `protobuf:\"bytes,7,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tPostCode  string `protobuf:\"bytes,8,opt,name=post_code,json=postCode,proto3\" json:\"post_code,omitempty\"`\n\tIsDefault int32  `protobuf:\"varint,9,opt,name=is_default,json=isDefault,proto3\" json:\"is_default,omitempty\"`\n}\n\nfunc (x *AddressInfo) Reset() {\n\t*x = AddressInfo{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_service_user_v1_user_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AddressInfo) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AddressInfo) ProtoMessage() {}\n\nfunc (x *AddressInfo) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_service_user_v1_user_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AddressInfo.ProtoReflect.Descriptor instead.\nfunc (*AddressInfo) Descriptor() ([]byte, []int) {\n\treturn file_api_service_user_v1_user_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *AddressInfo) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *AddressInfo) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetMobile() string {\n\tif x != nil {\n\t\treturn x.Mobile\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetProvince() string {\n\tif x != nil {\n\t\treturn x.Province\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetCity() string {\n\tif x != nil {\n\t\treturn x.City\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetDistricts() string {\n\tif x != nil {\n\t\treturn x.Districts\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetAddress() string {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetPostCode() string {\n\tif x != nil {\n\t\treturn x.PostCode\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetIsDefault() int32 {\n\tif x != nil {\n\t\treturn x.IsDefault\n\t}\n\treturn 0\n}\n\ntype ListAddressReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tResults []*AddressInfo `protobuf:\"bytes,1,rep,name=results,proto3\" json:\"results,omitempty\"`\n}\n\nfunc (x *ListAddressReply) Reset() {\n\t*x = ListAddressReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_service_user_v1_user_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListAddressReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListAddressReply) ProtoMessage() {}\n\nfunc (x *ListAddressReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_service_user_v1_user_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListAddressReply.ProtoReflect.Descriptor instead.\nfunc (*ListAddressReply) Descriptor() ([]byte, []int) {\n\treturn file_api_service_user_v1_user_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *ListAddressReply) GetResults() []*AddressInfo {\n\tif x != nil {\n\t\treturn x.Results\n\t}\n\treturn nil\n}\n\ntype CreateAddressReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUid       int64  `protobuf:\"varint,1,opt,name=uid,proto3\" json:\"uid,omitempty\"`\n\tName      string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tMobile    string `protobuf:\"bytes,3,opt,name=mobile,proto3\" json:\"mobile,omitempty\"`\n\tProvince  string `protobuf:\"bytes,4,opt,name=Province,proto3\" json:\"Province,omitempty\"`\n\tCity      string `protobuf:\"bytes,5,opt,name=City,proto3\" json:\"City,omitempty\"`\n\tDistricts string `protobuf:\"bytes,6,opt,name=Districts,proto3\" json:\"Districts,omitempty\"`\n\tAddress   string `protobuf:\"bytes,7,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tPostCode  string `protobuf:\"bytes,8,opt,name=post_code,json=postCode,proto3\" json:\"post_code,omitempty\"`\n\tIsDefault int32  `protobuf:\"varint,9,opt,name=is_default,json=isDefault,proto3\" json:\"is_default,omitempty\"`\n}\n\nfunc (x *CreateAddressReq) Reset() {\n\t*x = CreateAddressReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_service_user_v1_user_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CreateAddressReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreateAddressReq) ProtoMessage() {}\n\nfunc (x *CreateAddressReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_service_user_v1_user_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreateAddressReq.ProtoReflect.Descriptor instead.\nfunc (*CreateAddressReq) Descriptor() ([]byte, []int) {\n\treturn file_api_service_user_v1_user_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *CreateAddressReq) GetUid() int64 {\n\tif x != nil {\n\t\treturn x.Uid\n\t}\n\treturn 0\n}\n\nfunc (x *CreateAddressReq) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetMobile() string {\n\tif x != nil {\n\t\treturn x.Mobile\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetProvince() string {\n\tif x != nil {\n\t\treturn x.Province\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetCity() string {\n\tif x != nil {\n\t\treturn x.City\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetDistricts() string {\n\tif x != nil {\n\t\treturn x.Districts\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetAddress() string {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetPostCode() string {\n\tif x != nil {\n\t\treturn x.PostCode\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetIsDefault() int32 {\n\tif x != nil {\n\t\treturn x.IsDefault\n\t}\n\treturn 0\n}\n\ntype UpdateAddressReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUid       int64  `protobuf:\"varint,1,opt,name=uid,proto3\" json:\"uid,omitempty\"`\n\tName      string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tMobile    string `protobuf:\"bytes,3,opt,name=mobile,proto3\" json:\"mobile,omitempty\"`\n\tProvince  string `protobuf:\"bytes,4,opt,name=Province,proto3\" json:\"Province,omitempty\"`\n\tCity      string `protobuf:\"bytes,5,opt,name=City,proto3\" json:\"City,omitempty\"`\n\tDistricts string `protobuf:\"bytes,6,opt,name=Districts,proto3\" json:\"Districts,omitempty\"`\n\tAddress   string `protobuf:\"bytes,7,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tPostCode  string `protobuf:\"bytes,8,opt,name=post_code,json=postCode,proto3\" json:\"post_code,omitempty\"`\n\tIsDefault int32  `protobuf:\"varint,9,opt,name=is_default,json=isDefault,proto3\" json:\"is_default,omitempty\"`\n\tId        int64  `protobuf:\"varint,10,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *UpdateAddressReq) Reset() {\n\t*x = UpdateAddressReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_service_user_v1_user_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *UpdateAddressReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UpdateAddressReq) ProtoMessage() {}\n\nfunc (x *UpdateAddressReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_service_user_v1_user_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UpdateAddressReq.ProtoReflect.Descriptor instead.\nfunc (*UpdateAddressReq) Descriptor() ([]byte, []int) {\n\treturn file_api_service_user_v1_user_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *UpdateAddressReq) GetUid() int64 {\n\tif x != nil {\n\t\treturn x.Uid\n\t}\n\treturn 0\n}\n\nfunc (x *UpdateAddressReq) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetMobile() string {\n\tif x != nil {\n\t\treturn x.Mobile\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetProvince() string {\n\tif x != nil {\n\t\treturn x.Province\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetCity() string {\n\tif x != nil {\n\t\treturn x.City\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetDistricts() string {\n\tif x != nil {\n\t\treturn x.Districts\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetAddress() string {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetPostCode() string {\n\tif x != nil {\n\t\treturn x.PostCode\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetIsDefault() int32 {\n\tif x != nil {\n\t\treturn x.IsDefault\n\t}\n\treturn 0\n}\n\nfunc (x *UpdateAddressReq) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\ntype AddressReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId  int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tUid int64 `protobuf:\"varint,2,opt,name=uid,proto3\" json:\"uid,omitempty\"`\n}\n\nfunc (x *AddressReq) Reset() {\n\t*x = AddressReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_service_user_v1_user_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AddressReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AddressReq) ProtoMessage() {}\n\nfunc (x *AddressReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_service_user_v1_user_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AddressReq.ProtoReflect.Descriptor instead.\nfunc (*AddressReq) Descriptor() ([]byte, []int) {\n\treturn file_api_service_user_v1_user_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *AddressReq) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *AddressReq) GetUid() int64 {\n\tif x != nil {\n\t\treturn x.Uid\n\t}\n\treturn 0\n}\n\ntype CheckResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tSuccess bool `protobuf:\"varint,1,opt,name=success,proto3\" json:\"success,omitempty\"`\n}\n\nfunc (x *CheckResponse) Reset() {\n\t*x = CheckResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_service_user_v1_user_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CheckResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CheckResponse) ProtoMessage() {}\n\nfunc (x *CheckResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_service_user_v1_user_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CheckResponse.ProtoReflect.Descriptor instead.\nfunc (*CheckResponse) Descriptor() ([]byte, []int) {\n\treturn file_api_service_user_v1_user_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *CheckResponse) GetSuccess() bool {\n\tif x != nil {\n\t\treturn x.Success\n\t}\n\treturn false\n}\n\n// 分页\ntype PageInfo struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPn    uint32 `protobuf:\"varint,1,opt,name=pn,proto3\" json:\"pn,omitempty\"`\n\tPSize uint32 `protobuf:\"varint,2,opt,name=pSize,proto3\" json:\"pSize,omitempty\"`\n}\n\nfunc (x *PageInfo) Reset() {\n\t*x = PageInfo{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_service_user_v1_user_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *PageInfo) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*PageInfo) ProtoMessage() {}\n\nfunc (x *PageInfo) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_service_user_v1_user_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use PageInfo.ProtoReflect.Descriptor instead.\nfunc (*PageInfo) Descriptor() ([]byte, []int) {\n\treturn file_api_service_user_v1_user_proto_rawDescGZIP(), []int{7}\n}\n\nfunc (x *PageInfo) GetPn() uint32 {\n\tif x != nil {\n\t\treturn x.Pn\n\t}\n\treturn 0\n}\n\nfunc (x *PageInfo) GetPSize() uint32 {\n\tif x != nil {\n\t\treturn x.PSize\n\t}\n\treturn 0\n}\n\n// 用户信息\ntype UserInfoResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId       int64  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tPassword string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\"`\n\tMobile   string `protobuf:\"bytes,3,opt,name=mobile,proto3\" json:\"mobile,omitempty\"`\n\tNickName string `protobuf:\"bytes,4,opt,name=nickName,proto3\" json:\"nickName,omitempty\"`\n\tBirthday uint64 `protobuf:\"varint,5,opt,name=birthday,proto3\" json:\"birthday,omitempty\"`\n\tGender   string `protobuf:\"bytes,6,opt,name=gender,proto3\" json:\"gender,omitempty\"`\n\tRole     int32  `protobuf:\"varint,7,opt,name=role,proto3\" json:\"role,omitempty\"`\n}\n\nfunc (x *UserInfoResponse) Reset() {\n\t*x = UserInfoResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_service_user_v1_user_proto_msgTypes[8]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *UserInfoResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UserInfoResponse) ProtoMessage() {}\n\nfunc (x *UserInfoResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_service_user_v1_user_proto_msgTypes[8]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UserInfoResponse.ProtoReflect.Descriptor instead.\nfunc (*UserInfoResponse) Descriptor() ([]byte, []int) {\n\treturn file_api_service_user_v1_user_proto_rawDescGZIP(), []int{8}\n}\n\nfunc (x *UserInfoResponse) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *UserInfoResponse) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *UserInfoResponse) GetMobile() string {\n\tif x != nil {\n\t\treturn x.Mobile\n\t}\n\treturn \"\"\n}\n\nfunc (x *UserInfoResponse) GetNickName() string {\n\tif x != nil {\n\t\treturn x.NickName\n\t}\n\treturn \"\"\n}\n\nfunc (x *UserInfoResponse) GetBirthday() uint64 {\n\tif x != nil {\n\t\treturn x.Birthday\n\t}\n\treturn 0\n}\n\nfunc (x *UserInfoResponse) GetGender() string {\n\tif x != nil {\n\t\treturn x.Gender\n\t}\n\treturn \"\"\n}\n\nfunc (x *UserInfoResponse) GetRole() int32 {\n\tif x != nil {\n\t\treturn x.Role\n\t}\n\treturn 0\n}\n\n// 用户列表\ntype UserListResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tTotal int32               `protobuf:\"varint,1,opt,name=total,proto3\" json:\"total,omitempty\"`\n\tData  []*UserInfoResponse `protobuf:\"bytes,2,rep,name=data,proto3\" json:\"data,omitempty\"`\n}\n\nfunc (x *UserListResponse) Reset() {\n\t*x = UserListResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_service_user_v1_user_proto_msgTypes[9]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *UserListResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UserListResponse) ProtoMessage() {}\n\nfunc (x *UserListResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_service_user_v1_user_proto_msgTypes[9]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UserListResponse.ProtoReflect.Descriptor instead.\nfunc (*UserListResponse) Descriptor() ([]byte, []int) {\n\treturn file_api_service_user_v1_user_proto_rawDescGZIP(), []int{9}\n}\n\nfunc (x *UserListResponse) GetTotal() int32 {\n\tif x != nil {\n\t\treturn x.Total\n\t}\n\treturn 0\n}\n\nfunc (x *UserListResponse) GetData() []*UserInfoResponse {\n\tif x != nil {\n\t\treturn x.Data\n\t}\n\treturn nil\n}\n\ntype MobileRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMobile string `protobuf:\"bytes,1,opt,name=mobile,proto3\" json:\"mobile,omitempty\"`\n}\n\nfunc (x *MobileRequest) Reset() {\n\t*x = MobileRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_service_user_v1_user_proto_msgTypes[10]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MobileRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MobileRequest) ProtoMessage() {}\n\nfunc (x *MobileRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_service_user_v1_user_proto_msgTypes[10]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MobileRequest.ProtoReflect.Descriptor instead.\nfunc (*MobileRequest) Descriptor() ([]byte, []int) {\n\treturn file_api_service_user_v1_user_proto_rawDescGZIP(), []int{10}\n}\n\nfunc (x *MobileRequest) GetMobile() string {\n\tif x != nil {\n\t\treturn x.Mobile\n\t}\n\treturn \"\"\n}\n\ntype IdRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *IdRequest) Reset() {\n\t*x = IdRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_service_user_v1_user_proto_msgTypes[11]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *IdRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*IdRequest) ProtoMessage() {}\n\nfunc (x *IdRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_service_user_v1_user_proto_msgTypes[11]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use IdRequest.ProtoReflect.Descriptor instead.\nfunc (*IdRequest) Descriptor() ([]byte, []int) {\n\treturn file_api_service_user_v1_user_proto_rawDescGZIP(), []int{11}\n}\n\nfunc (x *IdRequest) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\n// 创建用户\ntype CreateUserInfo struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tNickName string `protobuf:\"bytes,1,opt,name=nickName,proto3\" json:\"nickName,omitempty\"`\n\tPassword string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\"`\n\tMobile   string `protobuf:\"bytes,3,opt,name=mobile,proto3\" json:\"mobile,omitempty\"`\n}\n\nfunc (x *CreateUserInfo) Reset() {\n\t*x = CreateUserInfo{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_service_user_v1_user_proto_msgTypes[12]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CreateUserInfo) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreateUserInfo) ProtoMessage() {}\n\nfunc (x *CreateUserInfo) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_service_user_v1_user_proto_msgTypes[12]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreateUserInfo.ProtoReflect.Descriptor instead.\nfunc (*CreateUserInfo) Descriptor() ([]byte, []int) {\n\treturn file_api_service_user_v1_user_proto_rawDescGZIP(), []int{12}\n}\n\nfunc (x *CreateUserInfo) GetNickName() string {\n\tif x != nil {\n\t\treturn x.NickName\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateUserInfo) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateUserInfo) GetMobile() string {\n\tif x != nil {\n\t\treturn x.Mobile\n\t}\n\treturn \"\"\n}\n\ntype UpdateUserInfo struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId       int64  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tNickName string `protobuf:\"bytes,2,opt,name=nickName,proto3\" json:\"nickName,omitempty\"`\n\tGender   string `protobuf:\"bytes,3,opt,name=gender,proto3\" json:\"gender,omitempty\"`\n\tBirthday uint64 `protobuf:\"varint,4,opt,name=birthday,proto3\" json:\"birthday,omitempty\"`\n}\n\nfunc (x *UpdateUserInfo) Reset() {\n\t*x = UpdateUserInfo{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_service_user_v1_user_proto_msgTypes[13]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *UpdateUserInfo) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UpdateUserInfo) ProtoMessage() {}\n\nfunc (x *UpdateUserInfo) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_service_user_v1_user_proto_msgTypes[13]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UpdateUserInfo.ProtoReflect.Descriptor instead.\nfunc (*UpdateUserInfo) Descriptor() ([]byte, []int) {\n\treturn file_api_service_user_v1_user_proto_rawDescGZIP(), []int{13}\n}\n\nfunc (x *UpdateUserInfo) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *UpdateUserInfo) GetNickName() string {\n\tif x != nil {\n\t\treturn x.NickName\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateUserInfo) GetGender() string {\n\tif x != nil {\n\t\treturn x.Gender\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateUserInfo) GetBirthday() uint64 {\n\tif x != nil {\n\t\treturn x.Birthday\n\t}\n\treturn 0\n}\n\ntype PasswordCheckInfo struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPassword          string `protobuf:\"bytes,1,opt,name=password,proto3\" json:\"password,omitempty\"`\n\tEncryptedPassword string `protobuf:\"bytes,2,opt,name=encryptedPassword,proto3\" json:\"encryptedPassword,omitempty\"`\n}\n\nfunc (x *PasswordCheckInfo) Reset() {\n\t*x = PasswordCheckInfo{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_service_user_v1_user_proto_msgTypes[14]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *PasswordCheckInfo) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*PasswordCheckInfo) ProtoMessage() {}\n\nfunc (x *PasswordCheckInfo) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_service_user_v1_user_proto_msgTypes[14]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use PasswordCheckInfo.ProtoReflect.Descriptor instead.\nfunc (*PasswordCheckInfo) Descriptor() ([]byte, []int) {\n\treturn file_api_service_user_v1_user_proto_rawDescGZIP(), []int{14}\n}\n\nfunc (x *PasswordCheckInfo) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *PasswordCheckInfo) GetEncryptedPassword() string {\n\tif x != nil {\n\t\treturn x.EncryptedPassword\n\t}\n\treturn \"\"\n}\n\nvar File_api_service_user_v1_user_proto protoreflect.FileDescriptor\n\nvar file_api_service_user_v1_user_proto_rawDesc = []byte{\n\t0x0a, 0x1e, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x75, 0x73,\n\t0x65, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x12, 0x07, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x22, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x64,\n\t0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0xed, 0x01, 0x0a, 0x0b, 0x41,\n\t0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16,\n\t0x0a, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,\n\t0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e,\n\t0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e,\n\t0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x04, 0x43, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69,\n\t0x63, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x69, 0x73, 0x74, 0x72,\n\t0x69, 0x63, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18,\n\t0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1b,\n\t0x0a, 0x09, 0x70, 0x6f, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x69,\n\t0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52,\n\t0x09, 0x69, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x42, 0x0a, 0x10, 0x4c, 0x69,\n\t0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e,\n\t0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x14, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73,\n\t0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0xf4,\n\t0x01, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,\n\t0x52, 0x65, 0x71, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03,\n\t0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x6f, 0x62,\n\t0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c,\n\t0x65, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a,\n\t0x04, 0x43, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x43, 0x69, 0x74,\n\t0x79, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x73, 0x18, 0x06,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x73, 0x12,\n\t0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x73,\n\t0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f,\n\t0x73, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x64, 0x65, 0x66,\n\t0x61, 0x75, 0x6c, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x69, 0x73, 0x44, 0x65,\n\t0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x84, 0x02, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,\n\t0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69,\n\t0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65,\n\t0x12, 0x16, 0x0a, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x76,\n\t0x69, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x76,\n\t0x69, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x04, 0x43, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x69, 0x73, 0x74,\n\t0x72, 0x69, 0x63, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x69, 0x73,\n\t0x74, 0x72, 0x69, 0x63, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73,\n\t0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,\n\t0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1d, 0x0a,\n\t0x0a, 0x69, 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28,\n\t0x05, 0x52, 0x09, 0x69, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x0e, 0x0a, 0x02,\n\t0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x22, 0x2e, 0x0a, 0x0a,\n\t0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69,\n\t0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0x29, 0x0a, 0x0d,\n\t0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a,\n\t0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07,\n\t0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x30, 0x0a, 0x08, 0x50, 0x61, 0x67, 0x65, 0x49,\n\t0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x70, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52,\n\t0x02, 0x70, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x0d, 0x52, 0x05, 0x70, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xba, 0x01, 0x0a, 0x10, 0x55, 0x73,\n\t0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e,\n\t0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a,\n\t0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x6f,\n\t0x62, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x6f, 0x62, 0x69,\n\t0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a,\n\t0x0a, 0x08, 0x62, 0x69, 0x72, 0x74, 0x68, 0x64, 0x61, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04,\n\t0x52, 0x08, 0x62, 0x69, 0x72, 0x74, 0x68, 0x64, 0x61, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x67, 0x65,\n\t0x6e, 0x64, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x67, 0x65, 0x6e, 0x64,\n\t0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05,\n\t0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x57, 0x0a, 0x10, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69,\n\t0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f,\n\t0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c,\n\t0x12, 0x2d, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19,\n\t0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66,\n\t0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22,\n\t0x27, 0x0a, 0x0d, 0x4d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x12, 0x16, 0x0a, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x22, 0x1b, 0x0a, 0x09, 0x49, 0x64, 0x52, 0x65,\n\t0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x03, 0x52, 0x02, 0x69, 0x64, 0x22, 0x60, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55,\n\t0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x4e,\n\t0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x4e,\n\t0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12,\n\t0x16, 0x0a, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x22, 0x70, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74,\n\t0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x69, 0x63,\n\t0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x69, 0x63,\n\t0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x67, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18,\n\t0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x67, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x1a, 0x0a,\n\t0x08, 0x62, 0x69, 0x72, 0x74, 0x68, 0x64, 0x61, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52,\n\t0x08, 0x62, 0x69, 0x72, 0x74, 0x68, 0x64, 0x61, 0x79, 0x22, 0x5d, 0x0a, 0x11, 0x50, 0x61, 0x73,\n\t0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a,\n\t0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x2c, 0x0a, 0x11, 0x65, 0x6e,\n\t0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64,\n\t0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x32, 0xe9, 0x05, 0x0a, 0x04, 0x55, 0x73, 0x65,\n\t0x72, 0x12, 0x3d, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74,\n\t0x12, 0x11, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x49,\n\t0x6e, 0x66, 0x6f, 0x1a, 0x19, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73,\n\t0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00,\n\t0x12, 0x46, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x42, 0x79, 0x4d, 0x6f, 0x62,\n\t0x69, 0x6c, 0x65, 0x12, 0x16, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f,\n\t0x62, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x75, 0x73,\n\t0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65,\n\t0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x55,\n\t0x73, 0x65, 0x72, 0x42, 0x79, 0x49, 0x64, 0x12, 0x12, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76,\n\t0x31, 0x2e, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x75, 0x73,\n\t0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65,\n\t0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61,\n\t0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x17, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31,\n\t0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x1a,\n\t0x19, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e,\n\t0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x0a,\n\t0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x17, 0x2e, 0x75, 0x73, 0x65,\n\t0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49,\n\t0x6e, 0x66, 0x6f, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a,\n\t0x0d, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1a,\n\t0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72,\n\t0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0x16, 0x2e, 0x75, 0x73, 0x65,\n\t0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,\n\t0x73, 0x65, 0x22, 0x00, 0x12, 0x43, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72,\n\t0x65, 0x73, 0x73, 0x12, 0x17, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69,\n\t0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x75,\n\t0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65,\n\t0x73, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0d, 0x43, 0x72, 0x65,\n\t0x61, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x19, 0x2e, 0x75, 0x73, 0x65,\n\t0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65,\n\t0x73, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e,\n\t0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x00, 0x12, 0x44, 0x0a,\n\t0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x19,\n\t0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41,\n\t0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x75, 0x73, 0x65, 0x72,\n\t0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,\n\t0x65, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x0e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x41, 0x64,\n\t0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x13, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e,\n\t0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x75, 0x73, 0x65,\n\t0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,\n\t0x73, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x64,\n\t0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x13, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e,\n\t0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x75, 0x73, 0x65,\n\t0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,\n\t0x73, 0x65, 0x22, 0x00, 0x42, 0x15, 0x5a, 0x13, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x61, 0x70, 0x69,\n\t0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x3b, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_api_service_user_v1_user_proto_rawDescOnce sync.Once\n\tfile_api_service_user_v1_user_proto_rawDescData = file_api_service_user_v1_user_proto_rawDesc\n)\n\nfunc file_api_service_user_v1_user_proto_rawDescGZIP() []byte {\n\tfile_api_service_user_v1_user_proto_rawDescOnce.Do(func() {\n\t\tfile_api_service_user_v1_user_proto_rawDescData = protoimpl.X.CompressGZIP(file_api_service_user_v1_user_proto_rawDescData)\n\t})\n\treturn file_api_service_user_v1_user_proto_rawDescData\n}\n\nvar file_api_service_user_v1_user_proto_msgTypes = make([]protoimpl.MessageInfo, 15)\nvar file_api_service_user_v1_user_proto_goTypes = []interface{}{\n\t(*ListAddressReq)(nil),    // 0: user.v1.ListAddressReq\n\t(*AddressInfo)(nil),       // 1: user.v1.AddressInfo\n\t(*ListAddressReply)(nil),  // 2: user.v1.ListAddressReply\n\t(*CreateAddressReq)(nil),  // 3: user.v1.CreateAddressReq\n\t(*UpdateAddressReq)(nil),  // 4: user.v1.UpdateAddressReq\n\t(*AddressReq)(nil),        // 5: user.v1.AddressReq\n\t(*CheckResponse)(nil),     // 6: user.v1.CheckResponse\n\t(*PageInfo)(nil),          // 7: user.v1.PageInfo\n\t(*UserInfoResponse)(nil),  // 8: user.v1.UserInfoResponse\n\t(*UserListResponse)(nil),  // 9: user.v1.UserListResponse\n\t(*MobileRequest)(nil),     // 10: user.v1.MobileRequest\n\t(*IdRequest)(nil),         // 11: user.v1.IdRequest\n\t(*CreateUserInfo)(nil),    // 12: user.v1.CreateUserInfo\n\t(*UpdateUserInfo)(nil),    // 13: user.v1.UpdateUserInfo\n\t(*PasswordCheckInfo)(nil), // 14: user.v1.PasswordCheckInfo\n\t(*emptypb.Empty)(nil),     // 15: google.protobuf.Empty\n}\nvar file_api_service_user_v1_user_proto_depIdxs = []int32{\n\t1,  // 0: user.v1.ListAddressReply.results:type_name -> user.v1.AddressInfo\n\t8,  // 1: user.v1.UserListResponse.data:type_name -> user.v1.UserInfoResponse\n\t7,  // 2: user.v1.User.GetUserList:input_type -> user.v1.PageInfo\n\t10, // 3: user.v1.User.GetUserByMobile:input_type -> user.v1.MobileRequest\n\t11, // 4: user.v1.User.GetUserById:input_type -> user.v1.IdRequest\n\t12, // 5: user.v1.User.CreateUser:input_type -> user.v1.CreateUserInfo\n\t13, // 6: user.v1.User.UpdateUser:input_type -> user.v1.UpdateUserInfo\n\t14, // 7: user.v1.User.CheckPassword:input_type -> user.v1.PasswordCheckInfo\n\t0,  // 8: user.v1.User.ListAddress:input_type -> user.v1.ListAddressReq\n\t3,  // 9: user.v1.User.CreateAddress:input_type -> user.v1.CreateAddressReq\n\t4,  // 10: user.v1.User.UpdateAddress:input_type -> user.v1.UpdateAddressReq\n\t5,  // 11: user.v1.User.DefaultAddress:input_type -> user.v1.AddressReq\n\t5,  // 12: user.v1.User.DeleteAddress:input_type -> user.v1.AddressReq\n\t9,  // 13: user.v1.User.GetUserList:output_type -> user.v1.UserListResponse\n\t8,  // 14: user.v1.User.GetUserByMobile:output_type -> user.v1.UserInfoResponse\n\t8,  // 15: user.v1.User.GetUserById:output_type -> user.v1.UserInfoResponse\n\t8,  // 16: user.v1.User.CreateUser:output_type -> user.v1.UserInfoResponse\n\t15, // 17: user.v1.User.UpdateUser:output_type -> google.protobuf.Empty\n\t6,  // 18: user.v1.User.CheckPassword:output_type -> user.v1.CheckResponse\n\t2,  // 19: user.v1.User.ListAddress:output_type -> user.v1.ListAddressReply\n\t1,  // 20: user.v1.User.CreateAddress:output_type -> user.v1.AddressInfo\n\t6,  // 21: user.v1.User.UpdateAddress:output_type -> user.v1.CheckResponse\n\t6,  // 22: user.v1.User.DefaultAddress:output_type -> user.v1.CheckResponse\n\t6,  // 23: user.v1.User.DeleteAddress:output_type -> user.v1.CheckResponse\n\t13, // [13:24] is the sub-list for method output_type\n\t2,  // [2:13] is the sub-list for method input_type\n\t2,  // [2:2] is the sub-list for extension type_name\n\t2,  // [2:2] is the sub-list for extension extendee\n\t0,  // [0:2] is the sub-list for field type_name\n}\n\nfunc init() { file_api_service_user_v1_user_proto_init() }\nfunc file_api_service_user_v1_user_proto_init() {\n\tif File_api_service_user_v1_user_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_api_service_user_v1_user_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListAddressReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_service_user_v1_user_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AddressInfo); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_service_user_v1_user_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListAddressReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_service_user_v1_user_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CreateAddressReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_service_user_v1_user_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*UpdateAddressReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_service_user_v1_user_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AddressReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_service_user_v1_user_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CheckResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_service_user_v1_user_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*PageInfo); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_service_user_v1_user_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*UserInfoResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_service_user_v1_user_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*UserListResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_service_user_v1_user_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MobileRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_service_user_v1_user_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*IdRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_service_user_v1_user_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CreateUserInfo); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_service_user_v1_user_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*UpdateUserInfo); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_service_user_v1_user_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*PasswordCheckInfo); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_api_service_user_v1_user_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   15,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_api_service_user_v1_user_proto_goTypes,\n\t\tDependencyIndexes: file_api_service_user_v1_user_proto_depIdxs,\n\t\tMessageInfos:      file_api_service_user_v1_user_proto_msgTypes,\n\t}.Build()\n\tFile_api_service_user_v1_user_proto = out.File\n\tfile_api_service_user_v1_user_proto_rawDesc = nil\n\tfile_api_service_user_v1_user_proto_goTypes = nil\n\tfile_api_service_user_v1_user_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "shop/api/service/user/v1/user.pb.validate.go",
    "content": "// Code generated by protoc-gen-validate. DO NOT EDIT.\n// source: api/service/user/v1/user.proto\n\npackage v1\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"net/mail\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"sort\"\n\t\"strings\"\n\t\"time\"\n\t\"unicode/utf8\"\n\n\t\"google.golang.org/protobuf/types/known/anypb\"\n)\n\n// ensure the imports are used\nvar (\n\t_ = bytes.MinRead\n\t_ = errors.New(\"\")\n\t_ = fmt.Print\n\t_ = utf8.UTFMax\n\t_ = (*regexp.Regexp)(nil)\n\t_ = (*strings.Reader)(nil)\n\t_ = net.IPv4len\n\t_ = time.Duration(0)\n\t_ = (*url.URL)(nil)\n\t_ = (*mail.Address)(nil)\n\t_ = anypb.Any{}\n\t_ = sort.Sort\n)\n\n// Validate checks the field values on ListAddressReq with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *ListAddressReq) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on ListAddressReq with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in ListAddressReqMultiError,\n// or nil if none found.\nfunc (m *ListAddressReq) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *ListAddressReq) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Uid\n\n\tif len(errors) > 0 {\n\t\treturn ListAddressReqMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// ListAddressReqMultiError is an error wrapping multiple validation errors\n// returned by ListAddressReq.ValidateAll() if the designated constraints\n// aren't met.\ntype ListAddressReqMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m ListAddressReqMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m ListAddressReqMultiError) AllErrors() []error { return m }\n\n// ListAddressReqValidationError is the validation error returned by\n// ListAddressReq.Validate if the designated constraints aren't met.\ntype ListAddressReqValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e ListAddressReqValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e ListAddressReqValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e ListAddressReqValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e ListAddressReqValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e ListAddressReqValidationError) ErrorName() string { return \"ListAddressReqValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e ListAddressReqValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sListAddressReq.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = ListAddressReqValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = ListAddressReqValidationError{}\n\n// Validate checks the field values on AddressInfo with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *AddressInfo) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on AddressInfo with the rules defined in\n// the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in AddressInfoMultiError, or\n// nil if none found.\nfunc (m *AddressInfo) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *AddressInfo) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for Name\n\n\t// no validation rules for Mobile\n\n\t// no validation rules for Province\n\n\t// no validation rules for City\n\n\t// no validation rules for Districts\n\n\t// no validation rules for Address\n\n\t// no validation rules for PostCode\n\n\t// no validation rules for IsDefault\n\n\tif len(errors) > 0 {\n\t\treturn AddressInfoMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// AddressInfoMultiError is an error wrapping multiple validation errors\n// returned by AddressInfo.ValidateAll() if the designated constraints aren't met.\ntype AddressInfoMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m AddressInfoMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m AddressInfoMultiError) AllErrors() []error { return m }\n\n// AddressInfoValidationError is the validation error returned by\n// AddressInfo.Validate if the designated constraints aren't met.\ntype AddressInfoValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e AddressInfoValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e AddressInfoValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e AddressInfoValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e AddressInfoValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e AddressInfoValidationError) ErrorName() string { return \"AddressInfoValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e AddressInfoValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sAddressInfo.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = AddressInfoValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = AddressInfoValidationError{}\n\n// Validate checks the field values on ListAddressReply with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *ListAddressReply) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on ListAddressReply with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// ListAddressReplyMultiError, or nil if none found.\nfunc (m *ListAddressReply) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *ListAddressReply) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\tfor idx, item := range m.GetResults() {\n\t\t_, _ = idx, item\n\n\t\tif all {\n\t\t\tswitch v := interface{}(item).(type) {\n\t\t\tcase interface{ ValidateAll() error }:\n\t\t\t\tif err := v.ValidateAll(); err != nil {\n\t\t\t\t\terrors = append(errors, ListAddressReplyValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"Results[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\tcase interface{ Validate() error }:\n\t\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\t\terrors = append(errors, ListAddressReplyValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"Results[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t} else if v, ok := interface{}(item).(interface{ Validate() error }); ok {\n\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\treturn ListAddressReplyValidationError{\n\t\t\t\t\tfield:  fmt.Sprintf(\"Results[%v]\", idx),\n\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\tcause:  err,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn ListAddressReplyMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// ListAddressReplyMultiError is an error wrapping multiple validation errors\n// returned by ListAddressReply.ValidateAll() if the designated constraints\n// aren't met.\ntype ListAddressReplyMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m ListAddressReplyMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m ListAddressReplyMultiError) AllErrors() []error { return m }\n\n// ListAddressReplyValidationError is the validation error returned by\n// ListAddressReply.Validate if the designated constraints aren't met.\ntype ListAddressReplyValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e ListAddressReplyValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e ListAddressReplyValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e ListAddressReplyValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e ListAddressReplyValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e ListAddressReplyValidationError) ErrorName() string { return \"ListAddressReplyValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e ListAddressReplyValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sListAddressReply.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = ListAddressReplyValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = ListAddressReplyValidationError{}\n\n// Validate checks the field values on CreateAddressReq with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *CreateAddressReq) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CreateAddressReq with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// CreateAddressReqMultiError, or nil if none found.\nfunc (m *CreateAddressReq) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CreateAddressReq) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Uid\n\n\t// no validation rules for Name\n\n\t// no validation rules for Mobile\n\n\t// no validation rules for Province\n\n\t// no validation rules for City\n\n\t// no validation rules for Districts\n\n\t// no validation rules for Address\n\n\t// no validation rules for PostCode\n\n\t// no validation rules for IsDefault\n\n\tif len(errors) > 0 {\n\t\treturn CreateAddressReqMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CreateAddressReqMultiError is an error wrapping multiple validation errors\n// returned by CreateAddressReq.ValidateAll() if the designated constraints\n// aren't met.\ntype CreateAddressReqMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CreateAddressReqMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CreateAddressReqMultiError) AllErrors() []error { return m }\n\n// CreateAddressReqValidationError is the validation error returned by\n// CreateAddressReq.Validate if the designated constraints aren't met.\ntype CreateAddressReqValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CreateAddressReqValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CreateAddressReqValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CreateAddressReqValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CreateAddressReqValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CreateAddressReqValidationError) ErrorName() string { return \"CreateAddressReqValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e CreateAddressReqValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCreateAddressReq.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CreateAddressReqValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CreateAddressReqValidationError{}\n\n// Validate checks the field values on UpdateAddressReq with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *UpdateAddressReq) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on UpdateAddressReq with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// UpdateAddressReqMultiError, or nil if none found.\nfunc (m *UpdateAddressReq) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *UpdateAddressReq) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Uid\n\n\t// no validation rules for Name\n\n\t// no validation rules for Mobile\n\n\t// no validation rules for Province\n\n\t// no validation rules for City\n\n\t// no validation rules for Districts\n\n\t// no validation rules for Address\n\n\t// no validation rules for PostCode\n\n\t// no validation rules for IsDefault\n\n\t// no validation rules for Id\n\n\tif len(errors) > 0 {\n\t\treturn UpdateAddressReqMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// UpdateAddressReqMultiError is an error wrapping multiple validation errors\n// returned by UpdateAddressReq.ValidateAll() if the designated constraints\n// aren't met.\ntype UpdateAddressReqMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m UpdateAddressReqMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m UpdateAddressReqMultiError) AllErrors() []error { return m }\n\n// UpdateAddressReqValidationError is the validation error returned by\n// UpdateAddressReq.Validate if the designated constraints aren't met.\ntype UpdateAddressReqValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e UpdateAddressReqValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e UpdateAddressReqValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e UpdateAddressReqValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e UpdateAddressReqValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e UpdateAddressReqValidationError) ErrorName() string { return \"UpdateAddressReqValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e UpdateAddressReqValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sUpdateAddressReq.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = UpdateAddressReqValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = UpdateAddressReqValidationError{}\n\n// Validate checks the field values on AddressReq with the rules defined in the\n// proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *AddressReq) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on AddressReq with the rules defined in\n// the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in AddressReqMultiError, or\n// nil if none found.\nfunc (m *AddressReq) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *AddressReq) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for Uid\n\n\tif len(errors) > 0 {\n\t\treturn AddressReqMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// AddressReqMultiError is an error wrapping multiple validation errors\n// returned by AddressReq.ValidateAll() if the designated constraints aren't met.\ntype AddressReqMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m AddressReqMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m AddressReqMultiError) AllErrors() []error { return m }\n\n// AddressReqValidationError is the validation error returned by\n// AddressReq.Validate if the designated constraints aren't met.\ntype AddressReqValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e AddressReqValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e AddressReqValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e AddressReqValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e AddressReqValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e AddressReqValidationError) ErrorName() string { return \"AddressReqValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e AddressReqValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sAddressReq.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = AddressReqValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = AddressReqValidationError{}\n\n// Validate checks the field values on CheckResponse with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *CheckResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CheckResponse with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in CheckResponseMultiError, or\n// nil if none found.\nfunc (m *CheckResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CheckResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Success\n\n\tif len(errors) > 0 {\n\t\treturn CheckResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CheckResponseMultiError is an error wrapping multiple validation errors\n// returned by CheckResponse.ValidateAll() if the designated constraints\n// aren't met.\ntype CheckResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CheckResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CheckResponseMultiError) AllErrors() []error { return m }\n\n// CheckResponseValidationError is the validation error returned by\n// CheckResponse.Validate if the designated constraints aren't met.\ntype CheckResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CheckResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CheckResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CheckResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CheckResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CheckResponseValidationError) ErrorName() string { return \"CheckResponseValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e CheckResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCheckResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CheckResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CheckResponseValidationError{}\n\n// Validate checks the field values on PageInfo with the rules defined in the\n// proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *PageInfo) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on PageInfo with the rules defined in\n// the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in PageInfoMultiError, or nil\n// if none found.\nfunc (m *PageInfo) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *PageInfo) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Pn\n\n\t// no validation rules for PSize\n\n\tif len(errors) > 0 {\n\t\treturn PageInfoMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// PageInfoMultiError is an error wrapping multiple validation errors returned\n// by PageInfo.ValidateAll() if the designated constraints aren't met.\ntype PageInfoMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m PageInfoMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m PageInfoMultiError) AllErrors() []error { return m }\n\n// PageInfoValidationError is the validation error returned by\n// PageInfo.Validate if the designated constraints aren't met.\ntype PageInfoValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e PageInfoValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e PageInfoValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e PageInfoValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e PageInfoValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e PageInfoValidationError) ErrorName() string { return \"PageInfoValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e PageInfoValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sPageInfo.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = PageInfoValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = PageInfoValidationError{}\n\n// Validate checks the field values on UserInfoResponse with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *UserInfoResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on UserInfoResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// UserInfoResponseMultiError, or nil if none found.\nfunc (m *UserInfoResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *UserInfoResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for Password\n\n\t// no validation rules for Mobile\n\n\t// no validation rules for NickName\n\n\t// no validation rules for Birthday\n\n\t// no validation rules for Gender\n\n\t// no validation rules for Role\n\n\tif len(errors) > 0 {\n\t\treturn UserInfoResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// UserInfoResponseMultiError is an error wrapping multiple validation errors\n// returned by UserInfoResponse.ValidateAll() if the designated constraints\n// aren't met.\ntype UserInfoResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m UserInfoResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m UserInfoResponseMultiError) AllErrors() []error { return m }\n\n// UserInfoResponseValidationError is the validation error returned by\n// UserInfoResponse.Validate if the designated constraints aren't met.\ntype UserInfoResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e UserInfoResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e UserInfoResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e UserInfoResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e UserInfoResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e UserInfoResponseValidationError) ErrorName() string { return \"UserInfoResponseValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e UserInfoResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sUserInfoResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = UserInfoResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = UserInfoResponseValidationError{}\n\n// Validate checks the field values on UserListResponse with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *UserListResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on UserListResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// UserListResponseMultiError, or nil if none found.\nfunc (m *UserListResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *UserListResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Total\n\n\tfor idx, item := range m.GetData() {\n\t\t_, _ = idx, item\n\n\t\tif all {\n\t\t\tswitch v := interface{}(item).(type) {\n\t\t\tcase interface{ ValidateAll() error }:\n\t\t\t\tif err := v.ValidateAll(); err != nil {\n\t\t\t\t\terrors = append(errors, UserListResponseValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"Data[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\tcase interface{ Validate() error }:\n\t\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\t\terrors = append(errors, UserListResponseValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"Data[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t} else if v, ok := interface{}(item).(interface{ Validate() error }); ok {\n\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\treturn UserListResponseValidationError{\n\t\t\t\t\tfield:  fmt.Sprintf(\"Data[%v]\", idx),\n\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\tcause:  err,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn UserListResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// UserListResponseMultiError is an error wrapping multiple validation errors\n// returned by UserListResponse.ValidateAll() if the designated constraints\n// aren't met.\ntype UserListResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m UserListResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m UserListResponseMultiError) AllErrors() []error { return m }\n\n// UserListResponseValidationError is the validation error returned by\n// UserListResponse.Validate if the designated constraints aren't met.\ntype UserListResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e UserListResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e UserListResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e UserListResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e UserListResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e UserListResponseValidationError) ErrorName() string { return \"UserListResponseValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e UserListResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sUserListResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = UserListResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = UserListResponseValidationError{}\n\n// Validate checks the field values on MobileRequest with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *MobileRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on MobileRequest with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in MobileRequestMultiError, or\n// nil if none found.\nfunc (m *MobileRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *MobileRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Mobile\n\n\tif len(errors) > 0 {\n\t\treturn MobileRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// MobileRequestMultiError is an error wrapping multiple validation errors\n// returned by MobileRequest.ValidateAll() if the designated constraints\n// aren't met.\ntype MobileRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m MobileRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m MobileRequestMultiError) AllErrors() []error { return m }\n\n// MobileRequestValidationError is the validation error returned by\n// MobileRequest.Validate if the designated constraints aren't met.\ntype MobileRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e MobileRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e MobileRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e MobileRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e MobileRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e MobileRequestValidationError) ErrorName() string { return \"MobileRequestValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e MobileRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sMobileRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = MobileRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = MobileRequestValidationError{}\n\n// Validate checks the field values on IdRequest with the rules defined in the\n// proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *IdRequest) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on IdRequest with the rules defined in\n// the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in IdRequestMultiError, or nil\n// if none found.\nfunc (m *IdRequest) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *IdRequest) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\tif len(errors) > 0 {\n\t\treturn IdRequestMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// IdRequestMultiError is an error wrapping multiple validation errors returned\n// by IdRequest.ValidateAll() if the designated constraints aren't met.\ntype IdRequestMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m IdRequestMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m IdRequestMultiError) AllErrors() []error { return m }\n\n// IdRequestValidationError is the validation error returned by\n// IdRequest.Validate if the designated constraints aren't met.\ntype IdRequestValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e IdRequestValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e IdRequestValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e IdRequestValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e IdRequestValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e IdRequestValidationError) ErrorName() string { return \"IdRequestValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e IdRequestValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sIdRequest.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = IdRequestValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = IdRequestValidationError{}\n\n// Validate checks the field values on CreateUserInfo with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *CreateUserInfo) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CreateUserInfo with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in CreateUserInfoMultiError,\n// or nil if none found.\nfunc (m *CreateUserInfo) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CreateUserInfo) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for NickName\n\n\t// no validation rules for Password\n\n\t// no validation rules for Mobile\n\n\tif len(errors) > 0 {\n\t\treturn CreateUserInfoMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CreateUserInfoMultiError is an error wrapping multiple validation errors\n// returned by CreateUserInfo.ValidateAll() if the designated constraints\n// aren't met.\ntype CreateUserInfoMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CreateUserInfoMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CreateUserInfoMultiError) AllErrors() []error { return m }\n\n// CreateUserInfoValidationError is the validation error returned by\n// CreateUserInfo.Validate if the designated constraints aren't met.\ntype CreateUserInfoValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CreateUserInfoValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CreateUserInfoValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CreateUserInfoValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CreateUserInfoValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CreateUserInfoValidationError) ErrorName() string { return \"CreateUserInfoValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e CreateUserInfoValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCreateUserInfo.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CreateUserInfoValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CreateUserInfoValidationError{}\n\n// Validate checks the field values on UpdateUserInfo with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *UpdateUserInfo) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on UpdateUserInfo with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in UpdateUserInfoMultiError,\n// or nil if none found.\nfunc (m *UpdateUserInfo) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *UpdateUserInfo) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for NickName\n\n\t// no validation rules for Gender\n\n\t// no validation rules for Birthday\n\n\tif len(errors) > 0 {\n\t\treturn UpdateUserInfoMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// UpdateUserInfoMultiError is an error wrapping multiple validation errors\n// returned by UpdateUserInfo.ValidateAll() if the designated constraints\n// aren't met.\ntype UpdateUserInfoMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m UpdateUserInfoMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m UpdateUserInfoMultiError) AllErrors() []error { return m }\n\n// UpdateUserInfoValidationError is the validation error returned by\n// UpdateUserInfo.Validate if the designated constraints aren't met.\ntype UpdateUserInfoValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e UpdateUserInfoValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e UpdateUserInfoValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e UpdateUserInfoValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e UpdateUserInfoValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e UpdateUserInfoValidationError) ErrorName() string { return \"UpdateUserInfoValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e UpdateUserInfoValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sUpdateUserInfo.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = UpdateUserInfoValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = UpdateUserInfoValidationError{}\n\n// Validate checks the field values on PasswordCheckInfo with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *PasswordCheckInfo) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on PasswordCheckInfo with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// PasswordCheckInfoMultiError, or nil if none found.\nfunc (m *PasswordCheckInfo) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *PasswordCheckInfo) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Password\n\n\t// no validation rules for EncryptedPassword\n\n\tif len(errors) > 0 {\n\t\treturn PasswordCheckInfoMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// PasswordCheckInfoMultiError is an error wrapping multiple validation errors\n// returned by PasswordCheckInfo.ValidateAll() if the designated constraints\n// aren't met.\ntype PasswordCheckInfoMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m PasswordCheckInfoMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m PasswordCheckInfoMultiError) AllErrors() []error { return m }\n\n// PasswordCheckInfoValidationError is the validation error returned by\n// PasswordCheckInfo.Validate if the designated constraints aren't met.\ntype PasswordCheckInfoValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e PasswordCheckInfoValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e PasswordCheckInfoValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e PasswordCheckInfoValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e PasswordCheckInfoValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e PasswordCheckInfoValidationError) ErrorName() string {\n\treturn \"PasswordCheckInfoValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e PasswordCheckInfoValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sPasswordCheckInfo.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = PasswordCheckInfoValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = PasswordCheckInfoValidationError{}\n"
  },
  {
    "path": "shop/api/service/user/v1/user.proto",
    "content": "syntax = \"proto3\";\n\npackage user.v1;\n\nimport \"google/protobuf/empty.proto\";\n\noption go_package = \"user/api/user/v1;v1\";\n\nservice User{\n  rpc GetUserList(PageInfo) returns (UserListResponse){}; // 用户列表\n  rpc GetUserByMobile(MobileRequest) returns (UserInfoResponse){}; // 通过 mobile 查询用户\n  rpc GetUserById(IdRequest) returns (UserInfoResponse){}; // 通过 Id 查询用户\n  rpc CreateUser(CreateUserInfo) returns (UserInfoResponse){}; // 创建用户\n  rpc UpdateUser(UpdateUserInfo) returns (google.protobuf.Empty){}; // 更新用户\n  rpc CheckPassword(PasswordCheckInfo) returns (CheckResponse){}; // 检查用户密码\n\n  // 收货地址\n  rpc ListAddress(ListAddressReq) returns (ListAddressReply) {} // 所有收货地址列表\n  rpc CreateAddress(CreateAddressReq) returns (AddressInfo) {} // 新增收货地址\n  rpc UpdateAddress(UpdateAddressReq) returns (CheckResponse) {} // 修改收货地址\n  rpc DefaultAddress(AddressReq) returns (CheckResponse) {} // 设置默认地址\n  rpc DeleteAddress(AddressReq) returns (CheckResponse) {} // 删除收货地址\n\n}\n\nmessage ListAddressReq {\n  int64 uid = 1;\n}\n\nmessage AddressInfo {\n  int64 id = 1;\n  string name = 2;\n  string mobile = 3;\n  string Province = 4;\n  string City = 5;\n  string Districts = 6;\n  string address = 7;\n  string post_code = 8;\n  int32 is_default = 9;\n}\nmessage ListAddressReply {\n  repeated AddressInfo results = 1;\n}\n\nmessage CreateAddressReq {\n  int64 uid = 1;\n  string name = 2;\n  string mobile = 3;\n  string Province = 4;\n  string City = 5;\n  string Districts = 6;\n  string address = 7;\n  string post_code = 8;\n  int32 is_default = 9;\n}\n\nmessage UpdateAddressReq {\n  int64 uid = 1;\n  string name = 2;\n  string mobile = 3;\n  string Province = 4;\n  string City = 5;\n  string Districts = 6;\n  string address = 7;\n  string post_code = 8;\n  int32 is_default = 9;\n  int64 id = 10;\n}\n\nmessage AddressReq {\n  int64 id = 1;\n  int64 uid = 2;\n}\n\nmessage CheckResponse{\n  bool success = 1;\n}\n\n// 分页\nmessage PageInfo{\n  uint32 pn = 1;\n  uint32 pSize = 2;\n}\n\n// 用户信息\nmessage UserInfoResponse{\n  int64 id = 1;\n  string password = 2;\n  string mobile = 3;\n  string nickName = 4;\n  uint64 birthday = 5;\n  string gender = 6;\n  int32 role = 7;\n}\n\n// 用户列表\nmessage UserListResponse{\n  int32 total = 1;\n  repeated UserInfoResponse data = 2;\n}\n\nmessage MobileRequest{\n  string mobile = 1;\n}\n\nmessage IdRequest{\n  int64 id = 1;\n}\n\n// 创建用户\nmessage  CreateUserInfo{\n  string nickName = 1;\n  string password = 2;\n  string mobile = 3;\n}\n\nmessage  UpdateUserInfo{\n  int64 id = 1;\n  string nickName = 2;\n  string gender = 3;\n  uint64 birthday = 4;\n}\n\nmessage PasswordCheckInfo{\n  string password = 1;\n  string encryptedPassword = 2;\n}"
  },
  {
    "path": "shop/api/service/user/v1/user_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.2.0\n// - protoc             v3.17.3\n// source: api/service/user/v1/user.proto\n\npackage v1\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n\temptypb \"google.golang.org/protobuf/types/known/emptypb\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\n// UserClient is the client API for User service.\n//\n// 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.\ntype UserClient interface {\n\tGetUserList(ctx context.Context, in *PageInfo, opts ...grpc.CallOption) (*UserListResponse, error)\n\tGetUserByMobile(ctx context.Context, in *MobileRequest, opts ...grpc.CallOption) (*UserInfoResponse, error)\n\tGetUserById(ctx context.Context, in *IdRequest, opts ...grpc.CallOption) (*UserInfoResponse, error)\n\tCreateUser(ctx context.Context, in *CreateUserInfo, opts ...grpc.CallOption) (*UserInfoResponse, error)\n\tUpdateUser(ctx context.Context, in *UpdateUserInfo, opts ...grpc.CallOption) (*emptypb.Empty, error)\n\tCheckPassword(ctx context.Context, in *PasswordCheckInfo, opts ...grpc.CallOption) (*CheckResponse, error)\n\t// 收货地址\n\tListAddress(ctx context.Context, in *ListAddressReq, opts ...grpc.CallOption) (*ListAddressReply, error)\n\tCreateAddress(ctx context.Context, in *CreateAddressReq, opts ...grpc.CallOption) (*AddressInfo, error)\n\tUpdateAddress(ctx context.Context, in *UpdateAddressReq, opts ...grpc.CallOption) (*CheckResponse, error)\n\tDefaultAddress(ctx context.Context, in *AddressReq, opts ...grpc.CallOption) (*CheckResponse, error)\n\tDeleteAddress(ctx context.Context, in *AddressReq, opts ...grpc.CallOption) (*CheckResponse, error)\n}\n\ntype userClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewUserClient(cc grpc.ClientConnInterface) UserClient {\n\treturn &userClient{cc}\n}\n\nfunc (c *userClient) GetUserList(ctx context.Context, in *PageInfo, opts ...grpc.CallOption) (*UserListResponse, error) {\n\tout := new(UserListResponse)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/GetUserList\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) GetUserByMobile(ctx context.Context, in *MobileRequest, opts ...grpc.CallOption) (*UserInfoResponse, error) {\n\tout := new(UserInfoResponse)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/GetUserByMobile\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) GetUserById(ctx context.Context, in *IdRequest, opts ...grpc.CallOption) (*UserInfoResponse, error) {\n\tout := new(UserInfoResponse)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/GetUserById\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) CreateUser(ctx context.Context, in *CreateUserInfo, opts ...grpc.CallOption) (*UserInfoResponse, error) {\n\tout := new(UserInfoResponse)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/CreateUser\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) UpdateUser(ctx context.Context, in *UpdateUserInfo, opts ...grpc.CallOption) (*emptypb.Empty, error) {\n\tout := new(emptypb.Empty)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/UpdateUser\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) CheckPassword(ctx context.Context, in *PasswordCheckInfo, opts ...grpc.CallOption) (*CheckResponse, error) {\n\tout := new(CheckResponse)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/CheckPassword\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) ListAddress(ctx context.Context, in *ListAddressReq, opts ...grpc.CallOption) (*ListAddressReply, error) {\n\tout := new(ListAddressReply)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/ListAddress\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) CreateAddress(ctx context.Context, in *CreateAddressReq, opts ...grpc.CallOption) (*AddressInfo, error) {\n\tout := new(AddressInfo)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/CreateAddress\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) UpdateAddress(ctx context.Context, in *UpdateAddressReq, opts ...grpc.CallOption) (*CheckResponse, error) {\n\tout := new(CheckResponse)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/UpdateAddress\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) DefaultAddress(ctx context.Context, in *AddressReq, opts ...grpc.CallOption) (*CheckResponse, error) {\n\tout := new(CheckResponse)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/DefaultAddress\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userClient) DeleteAddress(ctx context.Context, in *AddressReq, opts ...grpc.CallOption) (*CheckResponse, error) {\n\tout := new(CheckResponse)\n\terr := c.cc.Invoke(ctx, \"/user.v1.User/DeleteAddress\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// UserServer is the server API for User service.\n// All implementations must embed UnimplementedUserServer\n// for forward compatibility\ntype UserServer interface {\n\tGetUserList(context.Context, *PageInfo) (*UserListResponse, error)\n\tGetUserByMobile(context.Context, *MobileRequest) (*UserInfoResponse, error)\n\tGetUserById(context.Context, *IdRequest) (*UserInfoResponse, error)\n\tCreateUser(context.Context, *CreateUserInfo) (*UserInfoResponse, error)\n\tUpdateUser(context.Context, *UpdateUserInfo) (*emptypb.Empty, error)\n\tCheckPassword(context.Context, *PasswordCheckInfo) (*CheckResponse, error)\n\t// 收货地址\n\tListAddress(context.Context, *ListAddressReq) (*ListAddressReply, error)\n\tCreateAddress(context.Context, *CreateAddressReq) (*AddressInfo, error)\n\tUpdateAddress(context.Context, *UpdateAddressReq) (*CheckResponse, error)\n\tDefaultAddress(context.Context, *AddressReq) (*CheckResponse, error)\n\tDeleteAddress(context.Context, *AddressReq) (*CheckResponse, error)\n\tmustEmbedUnimplementedUserServer()\n}\n\n// UnimplementedUserServer must be embedded to have forward compatible implementations.\ntype UnimplementedUserServer struct {\n}\n\nfunc (UnimplementedUserServer) GetUserList(context.Context, *PageInfo) (*UserListResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetUserList not implemented\")\n}\nfunc (UnimplementedUserServer) GetUserByMobile(context.Context, *MobileRequest) (*UserInfoResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetUserByMobile not implemented\")\n}\nfunc (UnimplementedUserServer) GetUserById(context.Context, *IdRequest) (*UserInfoResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetUserById not implemented\")\n}\nfunc (UnimplementedUserServer) CreateUser(context.Context, *CreateUserInfo) (*UserInfoResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method CreateUser not implemented\")\n}\nfunc (UnimplementedUserServer) UpdateUser(context.Context, *UpdateUserInfo) (*emptypb.Empty, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method UpdateUser not implemented\")\n}\nfunc (UnimplementedUserServer) CheckPassword(context.Context, *PasswordCheckInfo) (*CheckResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method CheckPassword not implemented\")\n}\nfunc (UnimplementedUserServer) ListAddress(context.Context, *ListAddressReq) (*ListAddressReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method ListAddress not implemented\")\n}\nfunc (UnimplementedUserServer) CreateAddress(context.Context, *CreateAddressReq) (*AddressInfo, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method CreateAddress not implemented\")\n}\nfunc (UnimplementedUserServer) UpdateAddress(context.Context, *UpdateAddressReq) (*CheckResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method UpdateAddress not implemented\")\n}\nfunc (UnimplementedUserServer) DefaultAddress(context.Context, *AddressReq) (*CheckResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method DefaultAddress not implemented\")\n}\nfunc (UnimplementedUserServer) DeleteAddress(context.Context, *AddressReq) (*CheckResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method DeleteAddress not implemented\")\n}\nfunc (UnimplementedUserServer) mustEmbedUnimplementedUserServer() {}\n\n// UnsafeUserServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to UserServer will\n// result in compilation errors.\ntype UnsafeUserServer interface {\n\tmustEmbedUnimplementedUserServer()\n}\n\nfunc RegisterUserServer(s grpc.ServiceRegistrar, srv UserServer) {\n\ts.RegisterService(&User_ServiceDesc, srv)\n}\n\nfunc _User_GetUserList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(PageInfo)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).GetUserList(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/GetUserList\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).GetUserList(ctx, req.(*PageInfo))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_GetUserByMobile_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(MobileRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).GetUserByMobile(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/GetUserByMobile\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).GetUserByMobile(ctx, req.(*MobileRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_GetUserById_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(IdRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).GetUserById(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/GetUserById\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).GetUserById(ctx, req.(*IdRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_CreateUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(CreateUserInfo)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).CreateUser(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/CreateUser\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).CreateUser(ctx, req.(*CreateUserInfo))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_UpdateUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(UpdateUserInfo)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).UpdateUser(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/UpdateUser\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).UpdateUser(ctx, req.(*UpdateUserInfo))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_CheckPassword_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(PasswordCheckInfo)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).CheckPassword(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/CheckPassword\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).CheckPassword(ctx, req.(*PasswordCheckInfo))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_ListAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(ListAddressReq)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).ListAddress(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/ListAddress\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).ListAddress(ctx, req.(*ListAddressReq))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_CreateAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(CreateAddressReq)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).CreateAddress(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/CreateAddress\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).CreateAddress(ctx, req.(*CreateAddressReq))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_UpdateAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(UpdateAddressReq)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).UpdateAddress(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/UpdateAddress\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).UpdateAddress(ctx, req.(*UpdateAddressReq))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_DefaultAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(AddressReq)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).DefaultAddress(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/DefaultAddress\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).DefaultAddress(ctx, req.(*AddressReq))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _User_DeleteAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(AddressReq)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServer).DeleteAddress(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/user.v1.User/DeleteAddress\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServer).DeleteAddress(ctx, req.(*AddressReq))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// User_ServiceDesc is the grpc.ServiceDesc for User service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar User_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"user.v1.User\",\n\tHandlerType: (*UserServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetUserList\",\n\t\t\tHandler:    _User_GetUserList_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetUserByMobile\",\n\t\t\tHandler:    _User_GetUserByMobile_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetUserById\",\n\t\t\tHandler:    _User_GetUserById_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"CreateUser\",\n\t\t\tHandler:    _User_CreateUser_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"UpdateUser\",\n\t\t\tHandler:    _User_UpdateUser_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"CheckPassword\",\n\t\t\tHandler:    _User_CheckPassword_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"ListAddress\",\n\t\t\tHandler:    _User_ListAddress_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"CreateAddress\",\n\t\t\tHandler:    _User_CreateAddress_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"UpdateAddress\",\n\t\t\tHandler:    _User_UpdateAddress_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"DefaultAddress\",\n\t\t\tHandler:    _User_DefaultAddress_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"DeleteAddress\",\n\t\t\tHandler:    _User_DeleteAddress_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"api/service/user/v1/user.proto\",\n}\n"
  },
  {
    "path": "shop/api/shop/v1/error_reason.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.0\n// \tprotoc        v3.17.3\n// source: api/shop/v1/error_reason.proto\n\npackage v1\n\nimport (\n\t_ \"github.com/go-kratos/kratos/v2/errors\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype ErrorReason int32\n\nconst (\n\tErrorReason_USER_NOT_FOUND  ErrorReason = 0\n\tErrorReason_CONTENT_MISSING ErrorReason = 1\n)\n\n// Enum value maps for ErrorReason.\nvar (\n\tErrorReason_name = map[int32]string{\n\t\t0: \"USER_NOT_FOUND\",\n\t\t1: \"CONTENT_MISSING\",\n\t}\n\tErrorReason_value = map[string]int32{\n\t\t\"USER_NOT_FOUND\":  0,\n\t\t\"CONTENT_MISSING\": 1,\n\t}\n)\n\nfunc (x ErrorReason) Enum() *ErrorReason {\n\tp := new(ErrorReason)\n\t*p = x\n\treturn p\n}\n\nfunc (x ErrorReason) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (ErrorReason) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_api_shop_v1_error_reason_proto_enumTypes[0].Descriptor()\n}\n\nfunc (ErrorReason) Type() protoreflect.EnumType {\n\treturn &file_api_shop_v1_error_reason_proto_enumTypes[0]\n}\n\nfunc (x ErrorReason) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use ErrorReason.Descriptor instead.\nfunc (ErrorReason) EnumDescriptor() ([]byte, []int) {\n\treturn file_api_shop_v1_error_reason_proto_rawDescGZIP(), []int{0}\n}\n\nvar File_api_shop_v1_error_reason_proto protoreflect.FileDescriptor\n\nvar file_api_shop_v1_error_reason_proto_rawDesc = []byte{\n\t0x0a, 0x1e, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x68, 0x6f, 0x70, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x72,\n\t0x72, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x12, 0x0d, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x2e, 0x76, 0x31, 0x1a,\n\t0x13, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x2a, 0x48, 0x0a, 0x0b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x61,\n\t0x73, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x0e, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x4e, 0x4f, 0x54, 0x5f,\n\t0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x00, 0x1a, 0x04, 0xa8, 0x45, 0x94, 0x03, 0x12, 0x19, 0x0a,\n\t0x0f, 0x43, 0x4f, 0x4e, 0x54, 0x45, 0x4e, 0x54, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47,\n\t0x10, 0x01, 0x1a, 0x04, 0xa8, 0x45, 0x90, 0x03, 0x1a, 0x04, 0xa0, 0x45, 0xf4, 0x03, 0x42, 0x3d,\n\t0x0a, 0x0e, 0x73, 0x68, 0x6f, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73,\n\t0x50, 0x01, 0x5a, 0x13, 0x73, 0x68, 0x6f, 0x70, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x68, 0x6f,\n\t0x70, 0x2f, 0x76, 0x31, 0x3b, 0x76, 0x31, 0xa2, 0x02, 0x13, 0x41, 0x50, 0x49, 0x48, 0x65, 0x6c,\n\t0x6c, 0x6f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x62, 0x06, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_api_shop_v1_error_reason_proto_rawDescOnce sync.Once\n\tfile_api_shop_v1_error_reason_proto_rawDescData = file_api_shop_v1_error_reason_proto_rawDesc\n)\n\nfunc file_api_shop_v1_error_reason_proto_rawDescGZIP() []byte {\n\tfile_api_shop_v1_error_reason_proto_rawDescOnce.Do(func() {\n\t\tfile_api_shop_v1_error_reason_proto_rawDescData = protoimpl.X.CompressGZIP(file_api_shop_v1_error_reason_proto_rawDescData)\n\t})\n\treturn file_api_shop_v1_error_reason_proto_rawDescData\n}\n\nvar file_api_shop_v1_error_reason_proto_enumTypes = make([]protoimpl.EnumInfo, 1)\nvar file_api_shop_v1_error_reason_proto_goTypes = []interface{}{\n\t(ErrorReason)(0), // 0: helloworld.v1.ErrorReason\n}\nvar file_api_shop_v1_error_reason_proto_depIdxs = []int32{\n\t0, // [0:0] is the sub-list for method output_type\n\t0, // [0:0] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_api_shop_v1_error_reason_proto_init() }\nfunc file_api_shop_v1_error_reason_proto_init() {\n\tif File_api_shop_v1_error_reason_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_api_shop_v1_error_reason_proto_rawDesc,\n\t\t\tNumEnums:      1,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_api_shop_v1_error_reason_proto_goTypes,\n\t\tDependencyIndexes: file_api_shop_v1_error_reason_proto_depIdxs,\n\t\tEnumInfos:         file_api_shop_v1_error_reason_proto_enumTypes,\n\t}.Build()\n\tFile_api_shop_v1_error_reason_proto = out.File\n\tfile_api_shop_v1_error_reason_proto_rawDesc = nil\n\tfile_api_shop_v1_error_reason_proto_goTypes = nil\n\tfile_api_shop_v1_error_reason_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "shop/api/shop/v1/error_reason.pb.validate.go",
    "content": "// Code generated by protoc-gen-validate. DO NOT EDIT.\n// source: api/shop/v1/error_reason.proto\n\npackage v1\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"net/mail\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"sort\"\n\t\"strings\"\n\t\"time\"\n\t\"unicode/utf8\"\n\n\t\"google.golang.org/protobuf/types/known/anypb\"\n)\n\n// ensure the imports are used\nvar (\n\t_ = bytes.MinRead\n\t_ = errors.New(\"\")\n\t_ = fmt.Print\n\t_ = utf8.UTFMax\n\t_ = (*regexp.Regexp)(nil)\n\t_ = (*strings.Reader)(nil)\n\t_ = net.IPv4len\n\t_ = time.Duration(0)\n\t_ = (*url.URL)(nil)\n\t_ = (*mail.Address)(nil)\n\t_ = anypb.Any{}\n\t_ = sort.Sort\n)\n"
  },
  {
    "path": "shop/api/shop/v1/error_reason.proto",
    "content": "syntax = \"proto3\";\n\npackage helloworld.v1;\nimport \"errors/errors.proto\";\n\noption go_package = \"shop/api/shop/v1;v1\";\noption java_multiple_files = true;\noption java_package = \"shop.v1.errors\";\noption objc_class_prefix = \"APIHelloworldErrors\";\n\nenum ErrorReason {\n  option (errors.default_code) = 500;\n\n  USER_NOT_FOUND = 0 [(errors.code) = 404];\n  CONTENT_MISSING = 1 [(errors.code) = 400];\n}\n"
  },
  {
    "path": "shop/api/shop/v1/error_reason_errors.pb.go",
    "content": "// Code generated by protoc-gen-go-errors. DO NOT EDIT.\n\npackage v1\n\nimport (\n\tfmt \"fmt\"\n\terrors \"github.com/go-kratos/kratos/v2/errors\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the kratos package it is being compiled against.\nconst _ = errors.SupportPackageIsVersion1\n\nfunc IsUserNotFound(err error) bool {\n\te := errors.FromError(err)\n\treturn e.Reason == ErrorReason_USER_NOT_FOUND.String() && e.Code == 404\n}\n\nfunc ErrorUserNotFound(format string, args ...interface{}) *errors.Error {\n\treturn errors.New(404, ErrorReason_USER_NOT_FOUND.String(), fmt.Sprintf(format, args...))\n}\n\nfunc IsContentMissing(err error) bool {\n\te := errors.FromError(err)\n\treturn e.Reason == ErrorReason_CONTENT_MISSING.String() && e.Code == 400\n}\n\nfunc ErrorContentMissing(format string, args ...interface{}) *errors.Error {\n\treturn errors.New(400, ErrorReason_CONTENT_MISSING.String(), fmt.Sprintf(format, args...))\n}\n"
  },
  {
    "path": "shop/api/shop/v1/shop.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.0\n// \tprotoc        v3.17.3\n// source: api/shop/v1/shop.proto\n\npackage v1\n\nimport (\n\t_ \"github.com/envoyproxy/protoc-gen-validate/validate\"\n\t_ \"google.golang.org/genproto/googleapis/api/annotations\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\temptypb \"google.golang.org/protobuf/types/known/emptypb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CreateAddressReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUid       int64  `protobuf:\"varint,1,opt,name=uid,proto3\" json:\"uid,omitempty\"`\n\tName      string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tMobile    string `protobuf:\"bytes,3,opt,name=mobile,proto3\" json:\"mobile,omitempty\"`\n\tProvince  string `protobuf:\"bytes,4,opt,name=Province,proto3\" json:\"Province,omitempty\"`\n\tCity      string `protobuf:\"bytes,5,opt,name=City,proto3\" json:\"City,omitempty\"`\n\tDistricts string `protobuf:\"bytes,6,opt,name=Districts,proto3\" json:\"Districts,omitempty\"`\n\tAddress   string `protobuf:\"bytes,7,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tPostCode  string `protobuf:\"bytes,8,opt,name=post_code,json=postCode,proto3\" json:\"post_code,omitempty\"`\n\tIsDefault int32  `protobuf:\"varint,9,opt,name=is_default,json=isDefault,proto3\" json:\"is_default,omitempty\"`\n}\n\nfunc (x *CreateAddressReq) Reset() {\n\t*x = CreateAddressReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_shop_v1_shop_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CreateAddressReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreateAddressReq) ProtoMessage() {}\n\nfunc (x *CreateAddressReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_shop_v1_shop_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreateAddressReq.ProtoReflect.Descriptor instead.\nfunc (*CreateAddressReq) Descriptor() ([]byte, []int) {\n\treturn file_api_shop_v1_shop_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CreateAddressReq) GetUid() int64 {\n\tif x != nil {\n\t\treturn x.Uid\n\t}\n\treturn 0\n}\n\nfunc (x *CreateAddressReq) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetMobile() string {\n\tif x != nil {\n\t\treturn x.Mobile\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetProvince() string {\n\tif x != nil {\n\t\treturn x.Province\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetCity() string {\n\tif x != nil {\n\t\treturn x.City\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetDistricts() string {\n\tif x != nil {\n\t\treturn x.Districts\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetAddress() string {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetPostCode() string {\n\tif x != nil {\n\t\treturn x.PostCode\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAddressReq) GetIsDefault() int32 {\n\tif x != nil {\n\t\treturn x.IsDefault\n\t}\n\treturn 0\n}\n\ntype UpdateAddressReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUid       int64  `protobuf:\"varint,1,opt,name=uid,proto3\" json:\"uid,omitempty\"`\n\tName      string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tMobile    string `protobuf:\"bytes,3,opt,name=mobile,proto3\" json:\"mobile,omitempty\"`\n\tProvince  string `protobuf:\"bytes,4,opt,name=Province,proto3\" json:\"Province,omitempty\"`\n\tCity      string `protobuf:\"bytes,5,opt,name=City,proto3\" json:\"City,omitempty\"`\n\tDistricts string `protobuf:\"bytes,6,opt,name=Districts,proto3\" json:\"Districts,omitempty\"`\n\tAddress   string `protobuf:\"bytes,7,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tPostCode  string `protobuf:\"bytes,8,opt,name=post_code,json=postCode,proto3\" json:\"post_code,omitempty\"`\n\tIsDefault int32  `protobuf:\"varint,9,opt,name=is_default,json=isDefault,proto3\" json:\"is_default,omitempty\"`\n\tId        int64  `protobuf:\"varint,10,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *UpdateAddressReq) Reset() {\n\t*x = UpdateAddressReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_shop_v1_shop_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *UpdateAddressReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UpdateAddressReq) ProtoMessage() {}\n\nfunc (x *UpdateAddressReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_shop_v1_shop_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UpdateAddressReq.ProtoReflect.Descriptor instead.\nfunc (*UpdateAddressReq) Descriptor() ([]byte, []int) {\n\treturn file_api_shop_v1_shop_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *UpdateAddressReq) GetUid() int64 {\n\tif x != nil {\n\t\treturn x.Uid\n\t}\n\treturn 0\n}\n\nfunc (x *UpdateAddressReq) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetMobile() string {\n\tif x != nil {\n\t\treturn x.Mobile\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetProvince() string {\n\tif x != nil {\n\t\treturn x.Province\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetCity() string {\n\tif x != nil {\n\t\treturn x.City\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetDistricts() string {\n\tif x != nil {\n\t\treturn x.Districts\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetAddress() string {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetPostCode() string {\n\tif x != nil {\n\t\treturn x.PostCode\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateAddressReq) GetIsDefault() int32 {\n\tif x != nil {\n\t\treturn x.IsDefault\n\t}\n\treturn 0\n}\n\nfunc (x *UpdateAddressReq) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\ntype AddressInfo struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId        int64  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName      string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tMobile    string `protobuf:\"bytes,3,opt,name=mobile,proto3\" json:\"mobile,omitempty\"`\n\tProvince  string `protobuf:\"bytes,4,opt,name=Province,proto3\" json:\"Province,omitempty\"`\n\tCity      string `protobuf:\"bytes,5,opt,name=City,proto3\" json:\"City,omitempty\"`\n\tDistricts string `protobuf:\"bytes,6,opt,name=Districts,proto3\" json:\"Districts,omitempty\"`\n\tAddress   string `protobuf:\"bytes,7,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tPostCode  string `protobuf:\"bytes,8,opt,name=post_code,json=postCode,proto3\" json:\"post_code,omitempty\"`\n\tIsDefault int32  `protobuf:\"varint,9,opt,name=is_default,json=isDefault,proto3\" json:\"is_default,omitempty\"`\n}\n\nfunc (x *AddressInfo) Reset() {\n\t*x = AddressInfo{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_shop_v1_shop_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AddressInfo) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AddressInfo) ProtoMessage() {}\n\nfunc (x *AddressInfo) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_shop_v1_shop_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AddressInfo.ProtoReflect.Descriptor instead.\nfunc (*AddressInfo) Descriptor() ([]byte, []int) {\n\treturn file_api_shop_v1_shop_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *AddressInfo) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *AddressInfo) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetMobile() string {\n\tif x != nil {\n\t\treturn x.Mobile\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetProvince() string {\n\tif x != nil {\n\t\treturn x.Province\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetCity() string {\n\tif x != nil {\n\t\treturn x.City\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetDistricts() string {\n\tif x != nil {\n\t\treturn x.Districts\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetAddress() string {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetPostCode() string {\n\tif x != nil {\n\t\treturn x.PostCode\n\t}\n\treturn \"\"\n}\n\nfunc (x *AddressInfo) GetIsDefault() int32 {\n\tif x != nil {\n\t\treturn x.IsDefault\n\t}\n\treturn 0\n}\n\ntype ListAddressReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUid int64 `protobuf:\"varint,1,opt,name=uid,proto3\" json:\"uid,omitempty\"`\n}\n\nfunc (x *ListAddressReq) Reset() {\n\t*x = ListAddressReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_shop_v1_shop_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListAddressReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListAddressReq) ProtoMessage() {}\n\nfunc (x *ListAddressReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_shop_v1_shop_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListAddressReq.ProtoReflect.Descriptor instead.\nfunc (*ListAddressReq) Descriptor() ([]byte, []int) {\n\treturn file_api_shop_v1_shop_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *ListAddressReq) GetUid() int64 {\n\tif x != nil {\n\t\treturn x.Uid\n\t}\n\treturn 0\n}\n\ntype ListAddressReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tResults []*AddressInfo `protobuf:\"bytes,1,rep,name=results,proto3\" json:\"results,omitempty\"`\n}\n\nfunc (x *ListAddressReply) Reset() {\n\t*x = ListAddressReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_shop_v1_shop_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListAddressReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListAddressReply) ProtoMessage() {}\n\nfunc (x *ListAddressReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_shop_v1_shop_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListAddressReply.ProtoReflect.Descriptor instead.\nfunc (*ListAddressReply) Descriptor() ([]byte, []int) {\n\treturn file_api_shop_v1_shop_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *ListAddressReply) GetResults() []*AddressInfo {\n\tif x != nil {\n\t\treturn x.Results\n\t}\n\treturn nil\n}\n\ntype AddressReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId  int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tUid int64 `protobuf:\"varint,2,opt,name=uid,proto3\" json:\"uid,omitempty\"`\n}\n\nfunc (x *AddressReq) Reset() {\n\t*x = AddressReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_shop_v1_shop_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AddressReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AddressReq) ProtoMessage() {}\n\nfunc (x *AddressReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_shop_v1_shop_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AddressReq.ProtoReflect.Descriptor instead.\nfunc (*AddressReq) Descriptor() ([]byte, []int) {\n\treturn file_api_shop_v1_shop_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *AddressReq) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *AddressReq) GetUid() int64 {\n\tif x != nil {\n\t\treturn x.Uid\n\t}\n\treturn 0\n}\n\ntype CheckResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tSuccess bool `protobuf:\"varint,1,opt,name=success,proto3\" json:\"success,omitempty\"`\n}\n\nfunc (x *CheckResponse) Reset() {\n\t*x = CheckResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_shop_v1_shop_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CheckResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CheckResponse) ProtoMessage() {}\n\nfunc (x *CheckResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_shop_v1_shop_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CheckResponse.ProtoReflect.Descriptor instead.\nfunc (*CheckResponse) Descriptor() ([]byte, []int) {\n\treturn file_api_shop_v1_shop_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *CheckResponse) GetSuccess() bool {\n\tif x != nil {\n\t\treturn x.Success\n\t}\n\treturn false\n}\n\n// Data returned by registration and login\ntype RegisterReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId        int64  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tMobile    string `protobuf:\"bytes,3,opt,name=mobile,proto3\" json:\"mobile,omitempty\"`\n\tUsername  string `protobuf:\"bytes,4,opt,name=username,proto3\" json:\"username,omitempty\"`\n\tToken     string `protobuf:\"bytes,5,opt,name=token,proto3\" json:\"token,omitempty\"`\n\tExpiredAt int64  `protobuf:\"varint,6,opt,name=expiredAt,proto3\" json:\"expiredAt,omitempty\"`\n}\n\nfunc (x *RegisterReply) Reset() {\n\t*x = RegisterReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_shop_v1_shop_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RegisterReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RegisterReply) ProtoMessage() {}\n\nfunc (x *RegisterReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_shop_v1_shop_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RegisterReply.ProtoReflect.Descriptor instead.\nfunc (*RegisterReply) Descriptor() ([]byte, []int) {\n\treturn file_api_shop_v1_shop_proto_rawDescGZIP(), []int{7}\n}\n\nfunc (x *RegisterReply) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *RegisterReply) GetMobile() string {\n\tif x != nil {\n\t\treturn x.Mobile\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReply) GetUsername() string {\n\tif x != nil {\n\t\treturn x.Username\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReply) GetToken() string {\n\tif x != nil {\n\t\treturn x.Token\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReply) GetExpiredAt() int64 {\n\tif x != nil {\n\t\treturn x.ExpiredAt\n\t}\n\treturn 0\n}\n\ntype RegisterReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMobile   string `protobuf:\"bytes,1,opt,name=mobile,proto3\" json:\"mobile,omitempty\"`\n\tUsername string `protobuf:\"bytes,2,opt,name=username,proto3\" json:\"username,omitempty\"`\n\tPassword string `protobuf:\"bytes,3,opt,name=password,proto3\" json:\"password,omitempty\"`\n}\n\nfunc (x *RegisterReq) Reset() {\n\t*x = RegisterReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_shop_v1_shop_proto_msgTypes[8]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RegisterReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RegisterReq) ProtoMessage() {}\n\nfunc (x *RegisterReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_shop_v1_shop_proto_msgTypes[8]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RegisterReq.ProtoReflect.Descriptor instead.\nfunc (*RegisterReq) Descriptor() ([]byte, []int) {\n\treturn file_api_shop_v1_shop_proto_rawDescGZIP(), []int{8}\n}\n\nfunc (x *RegisterReq) GetMobile() string {\n\tif x != nil {\n\t\treturn x.Mobile\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetUsername() string {\n\tif x != nil {\n\t\treturn x.Username\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\ntype LoginReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMobile    string `protobuf:\"bytes,1,opt,name=mobile,proto3\" json:\"mobile,omitempty\"`\n\tPassword  string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\"`\n\tCaptcha   string `protobuf:\"bytes,3,opt,name=captcha,proto3\" json:\"captcha,omitempty\"`\n\tCaptchaId string `protobuf:\"bytes,4,opt,name=captchaId,proto3\" json:\"captchaId,omitempty\"`\n}\n\nfunc (x *LoginReq) Reset() {\n\t*x = LoginReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_shop_v1_shop_proto_msgTypes[9]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *LoginReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*LoginReq) ProtoMessage() {}\n\nfunc (x *LoginReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_shop_v1_shop_proto_msgTypes[9]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use LoginReq.ProtoReflect.Descriptor instead.\nfunc (*LoginReq) Descriptor() ([]byte, []int) {\n\treturn file_api_shop_v1_shop_proto_rawDescGZIP(), []int{9}\n}\n\nfunc (x *LoginReq) GetMobile() string {\n\tif x != nil {\n\t\treturn x.Mobile\n\t}\n\treturn \"\"\n}\n\nfunc (x *LoginReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *LoginReq) GetCaptcha() string {\n\tif x != nil {\n\t\treturn x.Captcha\n\t}\n\treturn \"\"\n}\n\nfunc (x *LoginReq) GetCaptchaId() string {\n\tif x != nil {\n\t\treturn x.CaptchaId\n\t}\n\treturn \"\"\n}\n\n// user Detail returned\ntype UserDetailResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId       int64  `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tMobile   string `protobuf:\"bytes,2,opt,name=mobile,proto3\" json:\"mobile,omitempty\"`\n\tNickName string `protobuf:\"bytes,3,opt,name=nickName,proto3\" json:\"nickName,omitempty\"`\n\tBirthday int64  `protobuf:\"varint,4,opt,name=birthday,proto3\" json:\"birthday,omitempty\"`\n\tGender   string `protobuf:\"bytes,5,opt,name=gender,proto3\" json:\"gender,omitempty\"`\n\tRole     int32  `protobuf:\"varint,6,opt,name=role,proto3\" json:\"role,omitempty\"`\n}\n\nfunc (x *UserDetailResponse) Reset() {\n\t*x = UserDetailResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_shop_v1_shop_proto_msgTypes[10]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *UserDetailResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UserDetailResponse) ProtoMessage() {}\n\nfunc (x *UserDetailResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_shop_v1_shop_proto_msgTypes[10]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UserDetailResponse.ProtoReflect.Descriptor instead.\nfunc (*UserDetailResponse) Descriptor() ([]byte, []int) {\n\treturn file_api_shop_v1_shop_proto_rawDescGZIP(), []int{10}\n}\n\nfunc (x *UserDetailResponse) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *UserDetailResponse) GetMobile() string {\n\tif x != nil {\n\t\treturn x.Mobile\n\t}\n\treturn \"\"\n}\n\nfunc (x *UserDetailResponse) GetNickName() string {\n\tif x != nil {\n\t\treturn x.NickName\n\t}\n\treturn \"\"\n}\n\nfunc (x *UserDetailResponse) GetBirthday() int64 {\n\tif x != nil {\n\t\treturn x.Birthday\n\t}\n\treturn 0\n}\n\nfunc (x *UserDetailResponse) GetGender() string {\n\tif x != nil {\n\t\treturn x.Gender\n\t}\n\treturn \"\"\n}\n\nfunc (x *UserDetailResponse) GetRole() int32 {\n\tif x != nil {\n\t\treturn x.Role\n\t}\n\treturn 0\n}\n\ntype CaptchaReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tCaptchaId string `protobuf:\"bytes,1,opt,name=captchaId,proto3\" json:\"captchaId,omitempty\"`\n\tPicPath   string `protobuf:\"bytes,2,opt,name=picPath,proto3\" json:\"picPath,omitempty\"`\n}\n\nfunc (x *CaptchaReply) Reset() {\n\t*x = CaptchaReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_api_shop_v1_shop_proto_msgTypes[11]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CaptchaReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CaptchaReply) ProtoMessage() {}\n\nfunc (x *CaptchaReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_api_shop_v1_shop_proto_msgTypes[11]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CaptchaReply.ProtoReflect.Descriptor instead.\nfunc (*CaptchaReply) Descriptor() ([]byte, []int) {\n\treturn file_api_shop_v1_shop_proto_rawDescGZIP(), []int{11}\n}\n\nfunc (x *CaptchaReply) GetCaptchaId() string {\n\tif x != nil {\n\t\treturn x.CaptchaId\n\t}\n\treturn \"\"\n}\n\nfunc (x *CaptchaReply) GetPicPath() string {\n\tif x != nil {\n\t\treturn x.PicPath\n\t}\n\treturn \"\"\n}\n\nvar File_api_shop_v1_shop_proto protoreflect.FileDescriptor\n\nvar file_api_shop_v1_shop_proto_rawDesc = []byte{\n\t0x0a, 0x16, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x68, 0x6f, 0x70, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x68,\n\t0x6f, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x73, 0x68, 0x6f, 0x70, 0x2e, 0x73,\n\t0x68, 0x6f, 0x70, 0x2e, 0x76, 0x31, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61,\n\t0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69,\n\t0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xab, 0x02, 0x0a, 0x10, 0x43,\n\t0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x12,\n\t0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x75, 0x69,\n\t0x64, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42,\n\t0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20,\n\t0x0a, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08,\n\t0xfa, 0x42, 0x05, 0x72, 0x03, 0x98, 0x01, 0x0b, 0x52, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65,\n\t0x12, 0x23, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01,\n\t0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x50, 0x72, 0x6f,\n\t0x76, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x04, 0x43, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20,\n\t0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x43, 0x69,\n\t0x74, 0x79, 0x12, 0x25, 0x0a, 0x09, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x73, 0x18,\n\t0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09,\n\t0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x73, 0x12, 0x21, 0x0a, 0x07, 0x61, 0x64, 0x64,\n\t0x72, 0x65, 0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72,\n\t0x02, 0x10, 0x01, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1b, 0x0a, 0x09,\n\t0x70, 0x6f, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x08, 0x70, 0x6f, 0x73, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f,\n\t0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x69,\n\t0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0xbb, 0x02, 0x0a, 0x10, 0x55, 0x70, 0x64,\n\t0x61, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x12, 0x10, 0x0a,\n\t0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12,\n\t0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x98, 0x01, 0x0b, 0x52, 0x06, 0x6d,\n\t0x6f, 0x62, 0x69, 0x6c, 0x65, 0x12, 0x23, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63,\n\t0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01,\n\t0x52, 0x08, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x04, 0x43, 0x69,\n\t0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10,\n\t0x01, 0x52, 0x04, 0x43, 0x69, 0x74, 0x79, 0x12, 0x25, 0x0a, 0x09, 0x44, 0x69, 0x73, 0x74, 0x72,\n\t0x69, 0x63, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72,\n\t0x02, 0x10, 0x01, 0x52, 0x09, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x73, 0x12, 0x21,\n\t0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42,\n\t0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73,\n\t0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x08,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1d,\n\t0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x09, 0x20, 0x01,\n\t0x28, 0x05, 0x52, 0x09, 0x69, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x17, 0x0a,\n\t0x02, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02,\n\t0x28, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0x80, 0x02, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x72, 0x65,\n\t0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x98, 0x01, 0x0b, 0x52, 0x06, 0x6d,\n\t0x6f, 0x62, 0x69, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63,\n\t0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63,\n\t0x65, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x04, 0x43, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x63,\n\t0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69,\n\t0x63, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x07,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1b, 0x0a,\n\t0x09, 0x70, 0x6f, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x08, 0x70, 0x6f, 0x73, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73,\n\t0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09,\n\t0x69, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x22, 0x0a, 0x0e, 0x4c, 0x69, 0x73,\n\t0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x12, 0x10, 0x0a, 0x03, 0x75,\n\t0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0x47, 0x0a,\n\t0x10, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x70, 0x6c,\n\t0x79, 0x12, 0x33, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03,\n\t0x28, 0x0b, 0x32, 0x19, 0x2e, 0x73, 0x68, 0x6f, 0x70, 0x2e, 0x73, 0x68, 0x6f, 0x70, 0x2e, 0x76,\n\t0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x72,\n\t0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x37, 0x0a, 0x0a, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73,\n\t0x73, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03,\n\t0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x28, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a,\n\t0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22,\n\t0x29, 0x0a, 0x0d, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x87, 0x01, 0x0a, 0x0d, 0x52,\n\t0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02,\n\t0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06,\n\t0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x6f,\n\t0x62, 0x69, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65,\n\t0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65,\n\t0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65,\n\t0x64, 0x41, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72,\n\t0x65, 0x64, 0x41, 0x74, 0x22, 0x7b, 0x0a, 0x0b, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72,\n\t0x52, 0x65, 0x71, 0x12, 0x20, 0x0a, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x98, 0x01, 0x0b, 0x52, 0x06, 0x6d,\n\t0x6f, 0x62, 0x69, 0x6c, 0x65, 0x12, 0x25, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d,\n\t0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xfa, 0x42, 0x06, 0x72, 0x04, 0x10, 0x03,\n\t0x18, 0x0f, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x08,\n\t0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07,\n\t0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x08, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72,\n\t0x64, 0x22, 0x9d, 0x01, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x20,\n\t0x0a, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08,\n\t0xfa, 0x42, 0x05, 0x72, 0x03, 0x98, 0x01, 0x0b, 0x52, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65,\n\t0x12, 0x23, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x08, 0x52, 0x08, 0x70, 0x61, 0x73,\n\t0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x23, 0x0a, 0x07, 0x63, 0x61, 0x70, 0x74, 0x63, 0x68, 0x61,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xfa, 0x42, 0x06, 0x72, 0x04, 0x10, 0x05, 0x18,\n\t0x05, 0x52, 0x07, 0x63, 0x61, 0x70, 0x74, 0x63, 0x68, 0x61, 0x12, 0x25, 0x0a, 0x09, 0x63, 0x61,\n\t0x70, 0x74, 0x63, 0x68, 0x61, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa,\n\t0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x63, 0x61, 0x70, 0x74, 0x63, 0x68, 0x61, 0x49,\n\t0x64, 0x22, 0xa0, 0x01, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c,\n\t0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x6f, 0x62, 0x69,\n\t0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65,\n\t0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08,\n\t0x62, 0x69, 0x72, 0x74, 0x68, 0x64, 0x61, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08,\n\t0x62, 0x69, 0x72, 0x74, 0x68, 0x64, 0x61, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x67, 0x65, 0x6e, 0x64,\n\t0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x67, 0x65, 0x6e, 0x64, 0x65, 0x72,\n\t0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04,\n\t0x72, 0x6f, 0x6c, 0x65, 0x22, 0x46, 0x0a, 0x0c, 0x43, 0x61, 0x70, 0x74, 0x63, 0x68, 0x61, 0x52,\n\t0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x61, 0x70, 0x74, 0x63, 0x68, 0x61, 0x49,\n\t0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x61, 0x70, 0x74, 0x63, 0x68, 0x61,\n\t0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x69, 0x63, 0x50, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x69, 0x63, 0x50, 0x61, 0x74, 0x68, 0x32, 0x93, 0x07, 0x0a,\n\t0x04, 0x53, 0x68, 0x6f, 0x70, 0x12, 0x62, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65,\n\t0x72, 0x12, 0x19, 0x2e, 0x73, 0x68, 0x6f, 0x70, 0x2e, 0x73, 0x68, 0x6f, 0x70, 0x2e, 0x76, 0x31,\n\t0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73,\n\t0x68, 0x6f, 0x70, 0x2e, 0x73, 0x68, 0x6f, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x69,\n\t0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02,\n\t0x18, 0x22, 0x13, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x72, 0x65,\n\t0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x59, 0x0a, 0x05, 0x4c, 0x6f, 0x67,\n\t0x69, 0x6e, 0x12, 0x16, 0x2e, 0x73, 0x68, 0x6f, 0x70, 0x2e, 0x73, 0x68, 0x6f, 0x70, 0x2e, 0x76,\n\t0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x68, 0x6f,\n\t0x70, 0x2e, 0x73, 0x68, 0x6f, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74,\n\t0x65, 0x72, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22,\n\t0x10, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x6c, 0x6f, 0x67, 0x69,\n\t0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x59, 0x0a, 0x07, 0x43, 0x61, 0x70, 0x74, 0x63, 0x68, 0x61, 0x12,\n\t0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x73, 0x68, 0x6f, 0x70, 0x2e, 0x73,\n\t0x68, 0x6f, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x70, 0x74, 0x63, 0x68, 0x61, 0x52, 0x65,\n\t0x70, 0x6c, 0x79, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x61, 0x70,\n\t0x69, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x63, 0x61, 0x70, 0x74, 0x63, 0x68, 0x61, 0x12,\n\t0x5d, 0x0a, 0x06, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74,\n\t0x79, 0x1a, 0x20, 0x2e, 0x73, 0x68, 0x6f, 0x70, 0x2e, 0x73, 0x68, 0x6f, 0x70, 0x2e, 0x76, 0x31,\n\t0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f,\n\t0x6e, 0x73, 0x65, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x12, 0x11, 0x2f, 0x61, 0x70,\n\t0x69, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x6a,\n\t0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12,\n\t0x1e, 0x2e, 0x73, 0x68, 0x6f, 0x70, 0x2e, 0x73, 0x68, 0x6f, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x43,\n\t0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x1a,\n\t0x19, 0x2e, 0x73, 0x68, 0x6f, 0x70, 0x2e, 0x73, 0x68, 0x6f, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x41,\n\t0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93,\n\t0x02, 0x18, 0x22, 0x13, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,\n\t0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x69, 0x0a, 0x10, 0x41, 0x64,\n\t0x64, 0x72, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x79, 0x55, 0x69, 0x64, 0x12, 0x16,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,\n\t0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1e, 0x2e, 0x73, 0x68, 0x6f, 0x70, 0x2e, 0x73, 0x68,\n\t0x6f, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73,\n\t0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15,\n\t0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2f, 0x6c, 0x69, 0x73,\n\t0x74, 0x2f, 0x75, 0x69, 0x64, 0x12, 0x6c, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41,\n\t0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1e, 0x2e, 0x73, 0x68, 0x6f, 0x70, 0x2e, 0x73, 0x68,\n\t0x6f, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72,\n\t0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x68, 0x6f, 0x70, 0x2e, 0x73, 0x68,\n\t0x6f, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f,\n\t0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x61, 0x70,\n\t0x69, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65,\n\t0x3a, 0x01, 0x2a, 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x41, 0x64,\n\t0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x18, 0x2e, 0x73, 0x68, 0x6f, 0x70, 0x2e, 0x73, 0x68, 0x6f,\n\t0x70, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x1a,\n\t0x1b, 0x2e, 0x73, 0x68, 0x6f, 0x70, 0x2e, 0x73, 0x68, 0x6f, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x43,\n\t0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3,\n\t0xe4, 0x93, 0x02, 0x19, 0x1a, 0x14, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65,\n\t0x73, 0x73, 0x2f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x63, 0x0a,\n\t0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x18,\n\t0x2e, 0x73, 0x68, 0x6f, 0x70, 0x2e, 0x73, 0x68, 0x6f, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64,\n\t0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x68, 0x6f, 0x70, 0x2e,\n\t0x73, 0x68, 0x6f, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73,\n\t0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f,\n\t0x61, 0x70, 0x69, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65,\n\t0x74, 0x65, 0x42, 0x15, 0x5a, 0x13, 0x73, 0x68, 0x6f, 0x70, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73,\n\t0x68, 0x6f, 0x70, 0x2f, 0x76, 0x31, 0x3b, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x33,\n}\n\nvar (\n\tfile_api_shop_v1_shop_proto_rawDescOnce sync.Once\n\tfile_api_shop_v1_shop_proto_rawDescData = file_api_shop_v1_shop_proto_rawDesc\n)\n\nfunc file_api_shop_v1_shop_proto_rawDescGZIP() []byte {\n\tfile_api_shop_v1_shop_proto_rawDescOnce.Do(func() {\n\t\tfile_api_shop_v1_shop_proto_rawDescData = protoimpl.X.CompressGZIP(file_api_shop_v1_shop_proto_rawDescData)\n\t})\n\treturn file_api_shop_v1_shop_proto_rawDescData\n}\n\nvar file_api_shop_v1_shop_proto_msgTypes = make([]protoimpl.MessageInfo, 12)\nvar file_api_shop_v1_shop_proto_goTypes = []interface{}{\n\t(*CreateAddressReq)(nil),   // 0: shop.shop.v1.CreateAddressReq\n\t(*UpdateAddressReq)(nil),   // 1: shop.shop.v1.UpdateAddressReq\n\t(*AddressInfo)(nil),        // 2: shop.shop.v1.AddressInfo\n\t(*ListAddressReq)(nil),     // 3: shop.shop.v1.ListAddressReq\n\t(*ListAddressReply)(nil),   // 4: shop.shop.v1.ListAddressReply\n\t(*AddressReq)(nil),         // 5: shop.shop.v1.AddressReq\n\t(*CheckResponse)(nil),      // 6: shop.shop.v1.CheckResponse\n\t(*RegisterReply)(nil),      // 7: shop.shop.v1.RegisterReply\n\t(*RegisterReq)(nil),        // 8: shop.shop.v1.RegisterReq\n\t(*LoginReq)(nil),           // 9: shop.shop.v1.LoginReq\n\t(*UserDetailResponse)(nil), // 10: shop.shop.v1.UserDetailResponse\n\t(*CaptchaReply)(nil),       // 11: shop.shop.v1.CaptchaReply\n\t(*emptypb.Empty)(nil),      // 12: google.protobuf.Empty\n}\nvar file_api_shop_v1_shop_proto_depIdxs = []int32{\n\t2,  // 0: shop.shop.v1.ListAddressReply.results:type_name -> shop.shop.v1.AddressInfo\n\t8,  // 1: shop.shop.v1.Shop.Register:input_type -> shop.shop.v1.RegisterReq\n\t9,  // 2: shop.shop.v1.Shop.Login:input_type -> shop.shop.v1.LoginReq\n\t12, // 3: shop.shop.v1.Shop.Captcha:input_type -> google.protobuf.Empty\n\t12, // 4: shop.shop.v1.Shop.Detail:input_type -> google.protobuf.Empty\n\t0,  // 5: shop.shop.v1.Shop.CreateAddress:input_type -> shop.shop.v1.CreateAddressReq\n\t12, // 6: shop.shop.v1.Shop.AddressListByUid:input_type -> google.protobuf.Empty\n\t1,  // 7: shop.shop.v1.Shop.UpdateAddress:input_type -> shop.shop.v1.UpdateAddressReq\n\t5,  // 8: shop.shop.v1.Shop.DefaultAddress:input_type -> shop.shop.v1.AddressReq\n\t5,  // 9: shop.shop.v1.Shop.DeleteAddress:input_type -> shop.shop.v1.AddressReq\n\t7,  // 10: shop.shop.v1.Shop.Register:output_type -> shop.shop.v1.RegisterReply\n\t7,  // 11: shop.shop.v1.Shop.Login:output_type -> shop.shop.v1.RegisterReply\n\t11, // 12: shop.shop.v1.Shop.Captcha:output_type -> shop.shop.v1.CaptchaReply\n\t10, // 13: shop.shop.v1.Shop.Detail:output_type -> shop.shop.v1.UserDetailResponse\n\t2,  // 14: shop.shop.v1.Shop.CreateAddress:output_type -> shop.shop.v1.AddressInfo\n\t4,  // 15: shop.shop.v1.Shop.AddressListByUid:output_type -> shop.shop.v1.ListAddressReply\n\t6,  // 16: shop.shop.v1.Shop.UpdateAddress:output_type -> shop.shop.v1.CheckResponse\n\t6,  // 17: shop.shop.v1.Shop.DefaultAddress:output_type -> shop.shop.v1.CheckResponse\n\t6,  // 18: shop.shop.v1.Shop.DeleteAddress:output_type -> shop.shop.v1.CheckResponse\n\t10, // [10:19] is the sub-list for method output_type\n\t1,  // [1:10] is the sub-list for method input_type\n\t1,  // [1:1] is the sub-list for extension type_name\n\t1,  // [1:1] is the sub-list for extension extendee\n\t0,  // [0:1] is the sub-list for field type_name\n}\n\nfunc init() { file_api_shop_v1_shop_proto_init() }\nfunc file_api_shop_v1_shop_proto_init() {\n\tif File_api_shop_v1_shop_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_api_shop_v1_shop_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CreateAddressReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_shop_v1_shop_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*UpdateAddressReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_shop_v1_shop_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AddressInfo); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_shop_v1_shop_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListAddressReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_shop_v1_shop_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListAddressReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_shop_v1_shop_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AddressReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_shop_v1_shop_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CheckResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_shop_v1_shop_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RegisterReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_shop_v1_shop_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RegisterReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_shop_v1_shop_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*LoginReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_shop_v1_shop_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*UserDetailResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_api_shop_v1_shop_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CaptchaReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_api_shop_v1_shop_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   12,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_api_shop_v1_shop_proto_goTypes,\n\t\tDependencyIndexes: file_api_shop_v1_shop_proto_depIdxs,\n\t\tMessageInfos:      file_api_shop_v1_shop_proto_msgTypes,\n\t}.Build()\n\tFile_api_shop_v1_shop_proto = out.File\n\tfile_api_shop_v1_shop_proto_rawDesc = nil\n\tfile_api_shop_v1_shop_proto_goTypes = nil\n\tfile_api_shop_v1_shop_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "shop/api/shop/v1/shop.pb.validate.go",
    "content": "// Code generated by protoc-gen-validate. DO NOT EDIT.\n// source: api/shop/v1/shop.proto\n\npackage v1\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"net/mail\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"sort\"\n\t\"strings\"\n\t\"time\"\n\t\"unicode/utf8\"\n\n\t\"google.golang.org/protobuf/types/known/anypb\"\n)\n\n// ensure the imports are used\nvar (\n\t_ = bytes.MinRead\n\t_ = errors.New(\"\")\n\t_ = fmt.Print\n\t_ = utf8.UTFMax\n\t_ = (*regexp.Regexp)(nil)\n\t_ = (*strings.Reader)(nil)\n\t_ = net.IPv4len\n\t_ = time.Duration(0)\n\t_ = (*url.URL)(nil)\n\t_ = (*mail.Address)(nil)\n\t_ = anypb.Any{}\n\t_ = sort.Sort\n)\n\n// Validate checks the field values on CreateAddressReq with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *CreateAddressReq) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CreateAddressReq with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// CreateAddressReqMultiError, or nil if none found.\nfunc (m *CreateAddressReq) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CreateAddressReq) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Uid\n\n\tif utf8.RuneCountInString(m.GetName()) < 1 {\n\t\terr := CreateAddressReqValidationError{\n\t\t\tfield:  \"Name\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetMobile()) != 11 {\n\t\terr := CreateAddressReqValidationError{\n\t\t\tfield:  \"Mobile\",\n\t\t\treason: \"value length must be 11 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\n\t}\n\n\tif utf8.RuneCountInString(m.GetProvince()) < 1 {\n\t\terr := CreateAddressReqValidationError{\n\t\t\tfield:  \"Province\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetCity()) < 1 {\n\t\terr := CreateAddressReqValidationError{\n\t\t\tfield:  \"City\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetDistricts()) < 1 {\n\t\terr := CreateAddressReqValidationError{\n\t\t\tfield:  \"Districts\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetAddress()) < 1 {\n\t\terr := CreateAddressReqValidationError{\n\t\t\tfield:  \"Address\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\t// no validation rules for PostCode\n\n\t// no validation rules for IsDefault\n\n\tif len(errors) > 0 {\n\t\treturn CreateAddressReqMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CreateAddressReqMultiError is an error wrapping multiple validation errors\n// returned by CreateAddressReq.ValidateAll() if the designated constraints\n// aren't met.\ntype CreateAddressReqMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CreateAddressReqMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CreateAddressReqMultiError) AllErrors() []error { return m }\n\n// CreateAddressReqValidationError is the validation error returned by\n// CreateAddressReq.Validate if the designated constraints aren't met.\ntype CreateAddressReqValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CreateAddressReqValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CreateAddressReqValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CreateAddressReqValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CreateAddressReqValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CreateAddressReqValidationError) ErrorName() string { return \"CreateAddressReqValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e CreateAddressReqValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCreateAddressReq.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CreateAddressReqValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CreateAddressReqValidationError{}\n\n// Validate checks the field values on UpdateAddressReq with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *UpdateAddressReq) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on UpdateAddressReq with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// UpdateAddressReqMultiError, or nil if none found.\nfunc (m *UpdateAddressReq) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *UpdateAddressReq) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Uid\n\n\t// no validation rules for Name\n\n\tif utf8.RuneCountInString(m.GetMobile()) != 11 {\n\t\terr := UpdateAddressReqValidationError{\n\t\t\tfield:  \"Mobile\",\n\t\t\treason: \"value length must be 11 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\n\t}\n\n\tif utf8.RuneCountInString(m.GetProvince()) < 1 {\n\t\terr := UpdateAddressReqValidationError{\n\t\t\tfield:  \"Province\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetCity()) < 1 {\n\t\terr := UpdateAddressReqValidationError{\n\t\t\tfield:  \"City\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetDistricts()) < 1 {\n\t\terr := UpdateAddressReqValidationError{\n\t\t\tfield:  \"Districts\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetAddress()) < 1 {\n\t\terr := UpdateAddressReqValidationError{\n\t\t\tfield:  \"Address\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\t// no validation rules for PostCode\n\n\t// no validation rules for IsDefault\n\n\tif m.GetId() < 1 {\n\t\terr := UpdateAddressReqValidationError{\n\t\t\tfield:  \"Id\",\n\t\t\treason: \"value must be greater than or equal to 1\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn UpdateAddressReqMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// UpdateAddressReqMultiError is an error wrapping multiple validation errors\n// returned by UpdateAddressReq.ValidateAll() if the designated constraints\n// aren't met.\ntype UpdateAddressReqMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m UpdateAddressReqMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m UpdateAddressReqMultiError) AllErrors() []error { return m }\n\n// UpdateAddressReqValidationError is the validation error returned by\n// UpdateAddressReq.Validate if the designated constraints aren't met.\ntype UpdateAddressReqValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e UpdateAddressReqValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e UpdateAddressReqValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e UpdateAddressReqValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e UpdateAddressReqValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e UpdateAddressReqValidationError) ErrorName() string { return \"UpdateAddressReqValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e UpdateAddressReqValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sUpdateAddressReq.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = UpdateAddressReqValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = UpdateAddressReqValidationError{}\n\n// Validate checks the field values on AddressInfo with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *AddressInfo) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on AddressInfo with the rules defined in\n// the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in AddressInfoMultiError, or\n// nil if none found.\nfunc (m *AddressInfo) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *AddressInfo) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\tif utf8.RuneCountInString(m.GetName()) < 1 {\n\t\terr := AddressInfoValidationError{\n\t\t\tfield:  \"Name\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetMobile()) != 11 {\n\t\terr := AddressInfoValidationError{\n\t\t\tfield:  \"Mobile\",\n\t\t\treason: \"value length must be 11 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\n\t}\n\n\t// no validation rules for Province\n\n\t// no validation rules for City\n\n\t// no validation rules for Districts\n\n\t// no validation rules for Address\n\n\t// no validation rules for PostCode\n\n\t// no validation rules for IsDefault\n\n\tif len(errors) > 0 {\n\t\treturn AddressInfoMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// AddressInfoMultiError is an error wrapping multiple validation errors\n// returned by AddressInfo.ValidateAll() if the designated constraints aren't met.\ntype AddressInfoMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m AddressInfoMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m AddressInfoMultiError) AllErrors() []error { return m }\n\n// AddressInfoValidationError is the validation error returned by\n// AddressInfo.Validate if the designated constraints aren't met.\ntype AddressInfoValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e AddressInfoValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e AddressInfoValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e AddressInfoValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e AddressInfoValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e AddressInfoValidationError) ErrorName() string { return \"AddressInfoValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e AddressInfoValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sAddressInfo.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = AddressInfoValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = AddressInfoValidationError{}\n\n// Validate checks the field values on ListAddressReq with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *ListAddressReq) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on ListAddressReq with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in ListAddressReqMultiError,\n// or nil if none found.\nfunc (m *ListAddressReq) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *ListAddressReq) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Uid\n\n\tif len(errors) > 0 {\n\t\treturn ListAddressReqMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// ListAddressReqMultiError is an error wrapping multiple validation errors\n// returned by ListAddressReq.ValidateAll() if the designated constraints\n// aren't met.\ntype ListAddressReqMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m ListAddressReqMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m ListAddressReqMultiError) AllErrors() []error { return m }\n\n// ListAddressReqValidationError is the validation error returned by\n// ListAddressReq.Validate if the designated constraints aren't met.\ntype ListAddressReqValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e ListAddressReqValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e ListAddressReqValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e ListAddressReqValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e ListAddressReqValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e ListAddressReqValidationError) ErrorName() string { return \"ListAddressReqValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e ListAddressReqValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sListAddressReq.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = ListAddressReqValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = ListAddressReqValidationError{}\n\n// Validate checks the field values on ListAddressReply with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// first error encountered is returned, or nil if there are no violations.\nfunc (m *ListAddressReply) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on ListAddressReply with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// ListAddressReplyMultiError, or nil if none found.\nfunc (m *ListAddressReply) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *ListAddressReply) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\tfor idx, item := range m.GetResults() {\n\t\t_, _ = idx, item\n\n\t\tif all {\n\t\t\tswitch v := interface{}(item).(type) {\n\t\t\tcase interface{ ValidateAll() error }:\n\t\t\t\tif err := v.ValidateAll(); err != nil {\n\t\t\t\t\terrors = append(errors, ListAddressReplyValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"Results[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\tcase interface{ Validate() error }:\n\t\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\t\terrors = append(errors, ListAddressReplyValidationError{\n\t\t\t\t\t\tfield:  fmt.Sprintf(\"Results[%v]\", idx),\n\t\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\t\tcause:  err,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t} else if v, ok := interface{}(item).(interface{ Validate() error }); ok {\n\t\t\tif err := v.Validate(); err != nil {\n\t\t\t\treturn ListAddressReplyValidationError{\n\t\t\t\t\tfield:  fmt.Sprintf(\"Results[%v]\", idx),\n\t\t\t\t\treason: \"embedded message failed validation\",\n\t\t\t\t\tcause:  err,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn ListAddressReplyMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// ListAddressReplyMultiError is an error wrapping multiple validation errors\n// returned by ListAddressReply.ValidateAll() if the designated constraints\n// aren't met.\ntype ListAddressReplyMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m ListAddressReplyMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m ListAddressReplyMultiError) AllErrors() []error { return m }\n\n// ListAddressReplyValidationError is the validation error returned by\n// ListAddressReply.Validate if the designated constraints aren't met.\ntype ListAddressReplyValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e ListAddressReplyValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e ListAddressReplyValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e ListAddressReplyValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e ListAddressReplyValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e ListAddressReplyValidationError) ErrorName() string { return \"ListAddressReplyValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e ListAddressReplyValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sListAddressReply.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = ListAddressReplyValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = ListAddressReplyValidationError{}\n\n// Validate checks the field values on AddressReq with the rules defined in the\n// proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *AddressReq) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on AddressReq with the rules defined in\n// the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in AddressReqMultiError, or\n// nil if none found.\nfunc (m *AddressReq) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *AddressReq) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\tif m.GetId() < 1 {\n\t\terr := AddressReqValidationError{\n\t\t\tfield:  \"Id\",\n\t\t\treason: \"value must be greater than or equal to 1\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\t// no validation rules for Uid\n\n\tif len(errors) > 0 {\n\t\treturn AddressReqMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// AddressReqMultiError is an error wrapping multiple validation errors\n// returned by AddressReq.ValidateAll() if the designated constraints aren't met.\ntype AddressReqMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m AddressReqMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m AddressReqMultiError) AllErrors() []error { return m }\n\n// AddressReqValidationError is the validation error returned by\n// AddressReq.Validate if the designated constraints aren't met.\ntype AddressReqValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e AddressReqValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e AddressReqValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e AddressReqValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e AddressReqValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e AddressReqValidationError) ErrorName() string { return \"AddressReqValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e AddressReqValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sAddressReq.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = AddressReqValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = AddressReqValidationError{}\n\n// Validate checks the field values on CheckResponse with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *CheckResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CheckResponse with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in CheckResponseMultiError, or\n// nil if none found.\nfunc (m *CheckResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CheckResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Success\n\n\tif len(errors) > 0 {\n\t\treturn CheckResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CheckResponseMultiError is an error wrapping multiple validation errors\n// returned by CheckResponse.ValidateAll() if the designated constraints\n// aren't met.\ntype CheckResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CheckResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CheckResponseMultiError) AllErrors() []error { return m }\n\n// CheckResponseValidationError is the validation error returned by\n// CheckResponse.Validate if the designated constraints aren't met.\ntype CheckResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CheckResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CheckResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CheckResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CheckResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CheckResponseValidationError) ErrorName() string { return \"CheckResponseValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e CheckResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCheckResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CheckResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CheckResponseValidationError{}\n\n// Validate checks the field values on RegisterReply with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *RegisterReply) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on RegisterReply with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in RegisterReplyMultiError, or\n// nil if none found.\nfunc (m *RegisterReply) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *RegisterReply) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for Mobile\n\n\t// no validation rules for Username\n\n\t// no validation rules for Token\n\n\t// no validation rules for ExpiredAt\n\n\tif len(errors) > 0 {\n\t\treturn RegisterReplyMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// RegisterReplyMultiError is an error wrapping multiple validation errors\n// returned by RegisterReply.ValidateAll() if the designated constraints\n// aren't met.\ntype RegisterReplyMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m RegisterReplyMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m RegisterReplyMultiError) AllErrors() []error { return m }\n\n// RegisterReplyValidationError is the validation error returned by\n// RegisterReply.Validate if the designated constraints aren't met.\ntype RegisterReplyValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e RegisterReplyValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e RegisterReplyValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e RegisterReplyValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e RegisterReplyValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e RegisterReplyValidationError) ErrorName() string { return \"RegisterReplyValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e RegisterReplyValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sRegisterReply.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = RegisterReplyValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = RegisterReplyValidationError{}\n\n// Validate checks the field values on RegisterReq with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *RegisterReq) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on RegisterReq with the rules defined in\n// the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in RegisterReqMultiError, or\n// nil if none found.\nfunc (m *RegisterReq) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *RegisterReq) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\tif utf8.RuneCountInString(m.GetMobile()) != 11 {\n\t\terr := RegisterReqValidationError{\n\t\t\tfield:  \"Mobile\",\n\t\t\treason: \"value length must be 11 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\n\t}\n\n\tif l := utf8.RuneCountInString(m.GetUsername()); l < 3 || l > 15 {\n\t\terr := RegisterReqValidationError{\n\t\t\tfield:  \"Username\",\n\t\t\treason: \"value length must be between 3 and 15 runes, inclusive\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetPassword()) < 8 {\n\t\terr := RegisterReqValidationError{\n\t\t\tfield:  \"Password\",\n\t\t\treason: \"value length must be at least 8 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn RegisterReqMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// RegisterReqMultiError is an error wrapping multiple validation errors\n// returned by RegisterReq.ValidateAll() if the designated constraints aren't met.\ntype RegisterReqMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m RegisterReqMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m RegisterReqMultiError) AllErrors() []error { return m }\n\n// RegisterReqValidationError is the validation error returned by\n// RegisterReq.Validate if the designated constraints aren't met.\ntype RegisterReqValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e RegisterReqValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e RegisterReqValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e RegisterReqValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e RegisterReqValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e RegisterReqValidationError) ErrorName() string { return \"RegisterReqValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e RegisterReqValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sRegisterReq.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = RegisterReqValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = RegisterReqValidationError{}\n\n// Validate checks the field values on LoginReq with the rules defined in the\n// proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *LoginReq) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on LoginReq with the rules defined in\n// the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in LoginReqMultiError, or nil\n// if none found.\nfunc (m *LoginReq) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *LoginReq) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\tif utf8.RuneCountInString(m.GetMobile()) != 11 {\n\t\terr := LoginReqValidationError{\n\t\t\tfield:  \"Mobile\",\n\t\t\treason: \"value length must be 11 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\n\t}\n\n\tif utf8.RuneCountInString(m.GetPassword()) < 8 {\n\t\terr := LoginReqValidationError{\n\t\t\tfield:  \"Password\",\n\t\t\treason: \"value length must be at least 8 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif utf8.RuneCountInString(m.GetCaptcha()) != 5 {\n\t\terr := LoginReqValidationError{\n\t\t\tfield:  \"Captcha\",\n\t\t\treason: \"value length must be 5 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\n\t}\n\n\tif utf8.RuneCountInString(m.GetCaptchaId()) < 1 {\n\t\terr := LoginReqValidationError{\n\t\t\tfield:  \"CaptchaId\",\n\t\t\treason: \"value length must be at least 1 runes\",\n\t\t}\n\t\tif !all {\n\t\t\treturn err\n\t\t}\n\t\terrors = append(errors, err)\n\t}\n\n\tif len(errors) > 0 {\n\t\treturn LoginReqMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// LoginReqMultiError is an error wrapping multiple validation errors returned\n// by LoginReq.ValidateAll() if the designated constraints aren't met.\ntype LoginReqMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m LoginReqMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m LoginReqMultiError) AllErrors() []error { return m }\n\n// LoginReqValidationError is the validation error returned by\n// LoginReq.Validate if the designated constraints aren't met.\ntype LoginReqValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e LoginReqValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e LoginReqValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e LoginReqValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e LoginReqValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e LoginReqValidationError) ErrorName() string { return \"LoginReqValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e LoginReqValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sLoginReq.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = LoginReqValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = LoginReqValidationError{}\n\n// Validate checks the field values on UserDetailResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the first error encountered is returned, or nil if there are no violations.\nfunc (m *UserDetailResponse) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on UserDetailResponse with the rules\n// defined in the proto definition for this message. If any rules are\n// violated, the result is a list of violation errors wrapped in\n// UserDetailResponseMultiError, or nil if none found.\nfunc (m *UserDetailResponse) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *UserDetailResponse) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for Id\n\n\t// no validation rules for Mobile\n\n\t// no validation rules for NickName\n\n\t// no validation rules for Birthday\n\n\t// no validation rules for Gender\n\n\t// no validation rules for Role\n\n\tif len(errors) > 0 {\n\t\treturn UserDetailResponseMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// UserDetailResponseMultiError is an error wrapping multiple validation errors\n// returned by UserDetailResponse.ValidateAll() if the designated constraints\n// aren't met.\ntype UserDetailResponseMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m UserDetailResponseMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m UserDetailResponseMultiError) AllErrors() []error { return m }\n\n// UserDetailResponseValidationError is the validation error returned by\n// UserDetailResponse.Validate if the designated constraints aren't met.\ntype UserDetailResponseValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e UserDetailResponseValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e UserDetailResponseValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e UserDetailResponseValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e UserDetailResponseValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e UserDetailResponseValidationError) ErrorName() string {\n\treturn \"UserDetailResponseValidationError\"\n}\n\n// Error satisfies the builtin error interface\nfunc (e UserDetailResponseValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sUserDetailResponse.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = UserDetailResponseValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = UserDetailResponseValidationError{}\n\n// Validate checks the field values on CaptchaReply with the rules defined in\n// the proto definition for this message. If any rules are violated, the first\n// error encountered is returned, or nil if there are no violations.\nfunc (m *CaptchaReply) Validate() error {\n\treturn m.validate(false)\n}\n\n// ValidateAll checks the field values on CaptchaReply with the rules defined\n// in the proto definition for this message. If any rules are violated, the\n// result is a list of violation errors wrapped in CaptchaReplyMultiError, or\n// nil if none found.\nfunc (m *CaptchaReply) ValidateAll() error {\n\treturn m.validate(true)\n}\n\nfunc (m *CaptchaReply) validate(all bool) error {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar errors []error\n\n\t// no validation rules for CaptchaId\n\n\t// no validation rules for PicPath\n\n\tif len(errors) > 0 {\n\t\treturn CaptchaReplyMultiError(errors)\n\t}\n\n\treturn nil\n}\n\n// CaptchaReplyMultiError is an error wrapping multiple validation errors\n// returned by CaptchaReply.ValidateAll() if the designated constraints aren't met.\ntype CaptchaReplyMultiError []error\n\n// Error returns a concatenation of all the error messages it wraps.\nfunc (m CaptchaReplyMultiError) Error() string {\n\tvar msgs []string\n\tfor _, err := range m {\n\t\tmsgs = append(msgs, err.Error())\n\t}\n\treturn strings.Join(msgs, \"; \")\n}\n\n// AllErrors returns a list of validation violation errors.\nfunc (m CaptchaReplyMultiError) AllErrors() []error { return m }\n\n// CaptchaReplyValidationError is the validation error returned by\n// CaptchaReply.Validate if the designated constraints aren't met.\ntype CaptchaReplyValidationError struct {\n\tfield  string\n\treason string\n\tcause  error\n\tkey    bool\n}\n\n// Field function returns field value.\nfunc (e CaptchaReplyValidationError) Field() string { return e.field }\n\n// Reason function returns reason value.\nfunc (e CaptchaReplyValidationError) Reason() string { return e.reason }\n\n// Cause function returns cause value.\nfunc (e CaptchaReplyValidationError) Cause() error { return e.cause }\n\n// Key function returns key value.\nfunc (e CaptchaReplyValidationError) Key() bool { return e.key }\n\n// ErrorName returns error name.\nfunc (e CaptchaReplyValidationError) ErrorName() string { return \"CaptchaReplyValidationError\" }\n\n// Error satisfies the builtin error interface\nfunc (e CaptchaReplyValidationError) Error() string {\n\tcause := \"\"\n\tif e.cause != nil {\n\t\tcause = fmt.Sprintf(\" | caused by: %v\", e.cause)\n\t}\n\n\tkey := \"\"\n\tif e.key {\n\t\tkey = \"key for \"\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"invalid %sCaptchaReply.%s: %s%s\",\n\t\tkey,\n\t\te.field,\n\t\te.reason,\n\t\tcause)\n}\n\nvar _ error = CaptchaReplyValidationError{}\n\nvar _ interface {\n\tField() string\n\tReason() string\n\tKey() bool\n\tCause() error\n\tErrorName() string\n} = CaptchaReplyValidationError{}\n"
  },
  {
    "path": "shop/api/shop/v1/shop.proto",
    "content": "syntax = \"proto3\";\n\npackage shop.shop.v1;\n// 这里可以把 proto 文件下载下来，放到项目的 third_party 目录下\nimport \"google/api/annotations.proto\";\nimport \"google/protobuf/empty.proto\";\nimport \"validate/validate.proto\";\n\noption go_package = \"shop/api/shop/v1;v1\";\n// The Shop service definition.\nservice Shop {\n  rpc Register (RegisterReq) returns (RegisterReply) {\n    option (google.api.http) = {\n      post: \"/api/users/register\",\n      body: \"*\",\n    };\n  }\n  rpc Login (LoginReq) returns (RegisterReply) {\n    option (google.api.http) = {\n      post: \"/api/users/login\",\n      body: \"*\",\n    };\n  }\n  rpc Captcha (google.protobuf.Empty) returns (CaptchaReply) {\n    option (google.api.http) = {\n      get: \"/api/users/captcha\",\n    };\n  }\n  rpc Detail (google.protobuf.Empty) returns (UserDetailResponse) {\n    option (google.api.http) = {\n      get: \"/api/users/detail\",\n    };\n  }\n  rpc CreateAddress (CreateAddressReq) returns (AddressInfo) {\n    option (google.api.http) = {\n      post: \"/api/address/create\",\n      body: \"*\",\n    };\n  }\n  rpc AddressListByUid (google.protobuf.Empty) returns (ListAddressReply) {\n    option (google.api.http) = {\n      get: \"/api/address/list/uid\",\n    };\n  }\n  rpc UpdateAddress (UpdateAddressReq) returns (CheckResponse) {\n    option (google.api.http) = {\n      put: \"/api/address/update\",\n      body: \"*\",\n    };\n  }\n  rpc DefaultAddress (AddressReq) returns (CheckResponse) {\n    option (google.api.http) = {\n      put: \"/api/address/default\",\n      body: \"*\",\n    };\n  }\n  rpc DeleteAddress (AddressReq) returns (CheckResponse) {\n    option (google.api.http) = {\n      delete: \"/api/address/delete\",\n    };\n  }\n}\n\nmessage CreateAddressReq {\n  int64 uid = 1;\n  string name = 2 [(validate.rules).string ={min_len: 1}];\n  string mobile = 3 [(validate.rules).string.len = 11];\n  string Province = 4 [(validate.rules).string ={min_len: 1}];\n  string City = 5 [(validate.rules).string ={min_len: 1}];\n  string Districts = 6 [(validate.rules).string ={min_len: 1}];\n  string address = 7 [(validate.rules).string ={min_len: 1}];\n  string post_code = 8;\n  int32 is_default = 9;\n}\n\nmessage UpdateAddressReq {\n  int64 uid = 1;\n  string name = 2;\n  string mobile = 3 [(validate.rules).string.len = 11];\n  string Province = 4 [(validate.rules).string ={min_len: 1}];\n  string City = 5 [(validate.rules).string ={min_len: 1}];\n  string Districts = 6 [(validate.rules).string ={min_len: 1}];\n  string address = 7 [(validate.rules).string ={min_len: 1}];\n  string post_code = 8;\n  int32 is_default = 9;\n  int64 id = 10 [(validate.rules).int64.gte = 1];\n}\n\nmessage AddressInfo {\n  int64 id = 1;\n  string name = 2 [(validate.rules).string ={min_len: 1}];\n  string mobile = 3 [(validate.rules).string.len = 11];\n  string Province = 4;\n  string City = 5;\n  string Districts = 6;\n  string address = 7;\n  string post_code = 8;\n  int32 is_default = 9;\n}\n\nmessage ListAddressReq {\n  int64 uid = 1;\n}\n\nmessage ListAddressReply {\n  repeated AddressInfo results = 1;\n}\n\nmessage AddressReq {\n  int64 id = 1 [(validate.rules).int64.gte = 1];\n  int64 uid = 2;\n}\n\nmessage CheckResponse{\n  bool success = 1;\n}\n\n// Data returned by registration and login\nmessage RegisterReply {\n  int64 id = 1;\n  string mobile = 3;\n  string username = 4;\n  string token = 5;\n  int64 expiredAt = 6;\n}\n\nmessage RegisterReq {\n  string mobile = 1 [(validate.rules).string.len = 11];\n  string username = 2 [(validate.rules).string = {min_len: 3, max_len: 15}];\n  string password = 3 [(validate.rules).string = {min_len: 8}];\n}\n\nmessage LoginReq {\n  string mobile = 1 [(validate.rules).string.len = 11];\n  string password = 2 [(validate.rules).string = {min_len: 8}];\n  string captcha = 3 [(validate.rules).string = {min_len: 5,max_len:5}];\n  string captchaId = 4  [(validate.rules).string ={min_len: 1}];\n}\n\n// user Detail returned\nmessage UserDetailResponse{\n  int64 id = 1;\n  string mobile = 2;\n  string nickName = 3;\n  int64 birthday = 4;\n  string gender = 5;\n  int32 role = 6;\n}\n\nmessage CaptchaReply{\n  string captchaId = 1;\n  string picPath = 2;\n}"
  },
  {
    "path": "shop/api/shop/v1/shop_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.2.0\n// - protoc             v3.17.3\n// source: api/shop/v1/shop.proto\n\npackage v1\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n\temptypb \"google.golang.org/protobuf/types/known/emptypb\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\n// ShopClient is the client API for Shop service.\n//\n// 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.\ntype ShopClient interface {\n\tRegister(ctx context.Context, in *RegisterReq, opts ...grpc.CallOption) (*RegisterReply, error)\n\tLogin(ctx context.Context, in *LoginReq, opts ...grpc.CallOption) (*RegisterReply, error)\n\tCaptcha(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*CaptchaReply, error)\n\tDetail(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*UserDetailResponse, error)\n\tCreateAddress(ctx context.Context, in *CreateAddressReq, opts ...grpc.CallOption) (*AddressInfo, error)\n\tAddressListByUid(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ListAddressReply, error)\n\tUpdateAddress(ctx context.Context, in *UpdateAddressReq, opts ...grpc.CallOption) (*CheckResponse, error)\n\tDefaultAddress(ctx context.Context, in *AddressReq, opts ...grpc.CallOption) (*CheckResponse, error)\n\tDeleteAddress(ctx context.Context, in *AddressReq, opts ...grpc.CallOption) (*CheckResponse, error)\n}\n\ntype shopClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewShopClient(cc grpc.ClientConnInterface) ShopClient {\n\treturn &shopClient{cc}\n}\n\nfunc (c *shopClient) Register(ctx context.Context, in *RegisterReq, opts ...grpc.CallOption) (*RegisterReply, error) {\n\tout := new(RegisterReply)\n\terr := c.cc.Invoke(ctx, \"/shop.shop.v1.Shop/Register\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *shopClient) Login(ctx context.Context, in *LoginReq, opts ...grpc.CallOption) (*RegisterReply, error) {\n\tout := new(RegisterReply)\n\terr := c.cc.Invoke(ctx, \"/shop.shop.v1.Shop/Login\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *shopClient) Captcha(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*CaptchaReply, error) {\n\tout := new(CaptchaReply)\n\terr := c.cc.Invoke(ctx, \"/shop.shop.v1.Shop/Captcha\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *shopClient) Detail(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*UserDetailResponse, error) {\n\tout := new(UserDetailResponse)\n\terr := c.cc.Invoke(ctx, \"/shop.shop.v1.Shop/Detail\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *shopClient) CreateAddress(ctx context.Context, in *CreateAddressReq, opts ...grpc.CallOption) (*AddressInfo, error) {\n\tout := new(AddressInfo)\n\terr := c.cc.Invoke(ctx, \"/shop.shop.v1.Shop/CreateAddress\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *shopClient) AddressListByUid(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ListAddressReply, error) {\n\tout := new(ListAddressReply)\n\terr := c.cc.Invoke(ctx, \"/shop.shop.v1.Shop/AddressListByUid\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *shopClient) UpdateAddress(ctx context.Context, in *UpdateAddressReq, opts ...grpc.CallOption) (*CheckResponse, error) {\n\tout := new(CheckResponse)\n\terr := c.cc.Invoke(ctx, \"/shop.shop.v1.Shop/UpdateAddress\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *shopClient) DefaultAddress(ctx context.Context, in *AddressReq, opts ...grpc.CallOption) (*CheckResponse, error) {\n\tout := new(CheckResponse)\n\terr := c.cc.Invoke(ctx, \"/shop.shop.v1.Shop/DefaultAddress\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *shopClient) DeleteAddress(ctx context.Context, in *AddressReq, opts ...grpc.CallOption) (*CheckResponse, error) {\n\tout := new(CheckResponse)\n\terr := c.cc.Invoke(ctx, \"/shop.shop.v1.Shop/DeleteAddress\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// ShopServer is the server API for Shop service.\n// All implementations must embed UnimplementedShopServer\n// for forward compatibility\ntype ShopServer interface {\n\tRegister(context.Context, *RegisterReq) (*RegisterReply, error)\n\tLogin(context.Context, *LoginReq) (*RegisterReply, error)\n\tCaptcha(context.Context, *emptypb.Empty) (*CaptchaReply, error)\n\tDetail(context.Context, *emptypb.Empty) (*UserDetailResponse, error)\n\tCreateAddress(context.Context, *CreateAddressReq) (*AddressInfo, error)\n\tAddressListByUid(context.Context, *emptypb.Empty) (*ListAddressReply, error)\n\tUpdateAddress(context.Context, *UpdateAddressReq) (*CheckResponse, error)\n\tDefaultAddress(context.Context, *AddressReq) (*CheckResponse, error)\n\tDeleteAddress(context.Context, *AddressReq) (*CheckResponse, error)\n\tmustEmbedUnimplementedShopServer()\n}\n\n// UnimplementedShopServer must be embedded to have forward compatible implementations.\ntype UnimplementedShopServer struct {\n}\n\nfunc (UnimplementedShopServer) Register(context.Context, *RegisterReq) (*RegisterReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method Register not implemented\")\n}\nfunc (UnimplementedShopServer) Login(context.Context, *LoginReq) (*RegisterReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method Login not implemented\")\n}\nfunc (UnimplementedShopServer) Captcha(context.Context, *emptypb.Empty) (*CaptchaReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method Captcha not implemented\")\n}\nfunc (UnimplementedShopServer) Detail(context.Context, *emptypb.Empty) (*UserDetailResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method Detail not implemented\")\n}\nfunc (UnimplementedShopServer) CreateAddress(context.Context, *CreateAddressReq) (*AddressInfo, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method CreateAddress not implemented\")\n}\nfunc (UnimplementedShopServer) AddressListByUid(context.Context, *emptypb.Empty) (*ListAddressReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method AddressListByUid not implemented\")\n}\nfunc (UnimplementedShopServer) UpdateAddress(context.Context, *UpdateAddressReq) (*CheckResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method UpdateAddress not implemented\")\n}\nfunc (UnimplementedShopServer) DefaultAddress(context.Context, *AddressReq) (*CheckResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method DefaultAddress not implemented\")\n}\nfunc (UnimplementedShopServer) DeleteAddress(context.Context, *AddressReq) (*CheckResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method DeleteAddress not implemented\")\n}\nfunc (UnimplementedShopServer) mustEmbedUnimplementedShopServer() {}\n\n// UnsafeShopServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to ShopServer will\n// result in compilation errors.\ntype UnsafeShopServer interface {\n\tmustEmbedUnimplementedShopServer()\n}\n\nfunc RegisterShopServer(s grpc.ServiceRegistrar, srv ShopServer) {\n\ts.RegisterService(&Shop_ServiceDesc, srv)\n}\n\nfunc _Shop_Register_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(RegisterReq)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(ShopServer).Register(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/shop.shop.v1.Shop/Register\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(ShopServer).Register(ctx, req.(*RegisterReq))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Shop_Login_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(LoginReq)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(ShopServer).Login(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/shop.shop.v1.Shop/Login\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(ShopServer).Login(ctx, req.(*LoginReq))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Shop_Captcha_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(emptypb.Empty)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(ShopServer).Captcha(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/shop.shop.v1.Shop/Captcha\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(ShopServer).Captcha(ctx, req.(*emptypb.Empty))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Shop_Detail_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(emptypb.Empty)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(ShopServer).Detail(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/shop.shop.v1.Shop/Detail\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(ShopServer).Detail(ctx, req.(*emptypb.Empty))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Shop_CreateAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(CreateAddressReq)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(ShopServer).CreateAddress(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/shop.shop.v1.Shop/CreateAddress\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(ShopServer).CreateAddress(ctx, req.(*CreateAddressReq))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Shop_AddressListByUid_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(emptypb.Empty)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(ShopServer).AddressListByUid(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/shop.shop.v1.Shop/AddressListByUid\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(ShopServer).AddressListByUid(ctx, req.(*emptypb.Empty))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Shop_UpdateAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(UpdateAddressReq)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(ShopServer).UpdateAddress(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/shop.shop.v1.Shop/UpdateAddress\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(ShopServer).UpdateAddress(ctx, req.(*UpdateAddressReq))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Shop_DefaultAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(AddressReq)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(ShopServer).DefaultAddress(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/shop.shop.v1.Shop/DefaultAddress\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(ShopServer).DefaultAddress(ctx, req.(*AddressReq))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Shop_DeleteAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(AddressReq)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(ShopServer).DeleteAddress(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/shop.shop.v1.Shop/DeleteAddress\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(ShopServer).DeleteAddress(ctx, req.(*AddressReq))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// Shop_ServiceDesc is the grpc.ServiceDesc for Shop service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar Shop_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"shop.shop.v1.Shop\",\n\tHandlerType: (*ShopServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"Register\",\n\t\t\tHandler:    _Shop_Register_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"Login\",\n\t\t\tHandler:    _Shop_Login_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"Captcha\",\n\t\t\tHandler:    _Shop_Captcha_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"Detail\",\n\t\t\tHandler:    _Shop_Detail_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"CreateAddress\",\n\t\t\tHandler:    _Shop_CreateAddress_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"AddressListByUid\",\n\t\t\tHandler:    _Shop_AddressListByUid_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"UpdateAddress\",\n\t\t\tHandler:    _Shop_UpdateAddress_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"DefaultAddress\",\n\t\t\tHandler:    _Shop_DefaultAddress_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"DeleteAddress\",\n\t\t\tHandler:    _Shop_DeleteAddress_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"api/shop/v1/shop.proto\",\n}\n"
  },
  {
    "path": "shop/api/shop/v1/shop_http.pb.go",
    "content": "// Code generated by protoc-gen-go-http. DO NOT EDIT.\n// versions:\n// protoc-gen-go-http v2.2.1\n\npackage v1\n\nimport (\n\tcontext \"context\"\n\thttp \"github.com/go-kratos/kratos/v2/transport/http\"\n\tbinding \"github.com/go-kratos/kratos/v2/transport/http/binding\"\n\temptypb \"google.golang.org/protobuf/types/known/emptypb\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the kratos package it is being compiled against.\nvar _ = new(context.Context)\nvar _ = binding.EncodeURL\n\nconst _ = http.SupportPackageIsVersion1\n\ntype ShopHTTPServer interface {\n\tAddressListByUid(context.Context, *emptypb.Empty) (*ListAddressReply, error)\n\tCaptcha(context.Context, *emptypb.Empty) (*CaptchaReply, error)\n\tCreateAddress(context.Context, *CreateAddressReq) (*AddressInfo, error)\n\tDefaultAddress(context.Context, *AddressReq) (*CheckResponse, error)\n\tDeleteAddress(context.Context, *AddressReq) (*CheckResponse, error)\n\tDetail(context.Context, *emptypb.Empty) (*UserDetailResponse, error)\n\tLogin(context.Context, *LoginReq) (*RegisterReply, error)\n\tRegister(context.Context, *RegisterReq) (*RegisterReply, error)\n\tUpdateAddress(context.Context, *UpdateAddressReq) (*CheckResponse, error)\n}\n\nfunc RegisterShopHTTPServer(s *http.Server, srv ShopHTTPServer) {\n\tr := s.Route(\"/\")\n\tr.POST(\"/api/users/register\", _Shop_Register0_HTTP_Handler(srv))\n\tr.POST(\"/api/users/login\", _Shop_Login0_HTTP_Handler(srv))\n\tr.GET(\"/api/users/captcha\", _Shop_Captcha0_HTTP_Handler(srv))\n\tr.GET(\"/api/users/detail\", _Shop_Detail0_HTTP_Handler(srv))\n\tr.POST(\"/api/address/create\", _Shop_CreateAddress0_HTTP_Handler(srv))\n\tr.GET(\"/api/address/list/uid\", _Shop_AddressListByUid0_HTTP_Handler(srv))\n\tr.PUT(\"/api/address/update\", _Shop_UpdateAddress0_HTTP_Handler(srv))\n\tr.PUT(\"/api/address/default\", _Shop_DefaultAddress0_HTTP_Handler(srv))\n\tr.DELETE(\"/api/address/delete\", _Shop_DeleteAddress0_HTTP_Handler(srv))\n}\n\nfunc _Shop_Register0_HTTP_Handler(srv ShopHTTPServer) func(ctx http.Context) error {\n\treturn func(ctx http.Context) error {\n\t\tvar in RegisterReq\n\t\tif err := ctx.Bind(&in); err != nil {\n\t\t\treturn err\n\t\t}\n\t\thttp.SetOperation(ctx, \"/shop.shop.v1.Shop/Register\")\n\t\th := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\t\treturn srv.Register(ctx, req.(*RegisterReq))\n\t\t})\n\t\tout, err := h(ctx, &in)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treply := out.(*RegisterReply)\n\t\treturn ctx.Result(200, reply)\n\t}\n}\n\nfunc _Shop_Login0_HTTP_Handler(srv ShopHTTPServer) func(ctx http.Context) error {\n\treturn func(ctx http.Context) error {\n\t\tvar in LoginReq\n\t\tif err := ctx.Bind(&in); err != nil {\n\t\t\treturn err\n\t\t}\n\t\thttp.SetOperation(ctx, \"/shop.shop.v1.Shop/Login\")\n\t\th := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\t\treturn srv.Login(ctx, req.(*LoginReq))\n\t\t})\n\t\tout, err := h(ctx, &in)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treply := out.(*RegisterReply)\n\t\treturn ctx.Result(200, reply)\n\t}\n}\n\nfunc _Shop_Captcha0_HTTP_Handler(srv ShopHTTPServer) func(ctx http.Context) error {\n\treturn func(ctx http.Context) error {\n\t\tvar in emptypb.Empty\n\t\tif err := ctx.BindQuery(&in); err != nil {\n\t\t\treturn err\n\t\t}\n\t\thttp.SetOperation(ctx, \"/shop.shop.v1.Shop/Captcha\")\n\t\th := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\t\treturn srv.Captcha(ctx, req.(*emptypb.Empty))\n\t\t})\n\t\tout, err := h(ctx, &in)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treply := out.(*CaptchaReply)\n\t\treturn ctx.Result(200, reply)\n\t}\n}\n\nfunc _Shop_Detail0_HTTP_Handler(srv ShopHTTPServer) func(ctx http.Context) error {\n\treturn func(ctx http.Context) error {\n\t\tvar in emptypb.Empty\n\t\tif err := ctx.BindQuery(&in); err != nil {\n\t\t\treturn err\n\t\t}\n\t\thttp.SetOperation(ctx, \"/shop.shop.v1.Shop/Detail\")\n\t\th := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\t\treturn srv.Detail(ctx, req.(*emptypb.Empty))\n\t\t})\n\t\tout, err := h(ctx, &in)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treply := out.(*UserDetailResponse)\n\t\treturn ctx.Result(200, reply)\n\t}\n}\n\nfunc _Shop_CreateAddress0_HTTP_Handler(srv ShopHTTPServer) func(ctx http.Context) error {\n\treturn func(ctx http.Context) error {\n\t\tvar in CreateAddressReq\n\t\tif err := ctx.Bind(&in); err != nil {\n\t\t\treturn err\n\t\t}\n\t\thttp.SetOperation(ctx, \"/shop.shop.v1.Shop/CreateAddress\")\n\t\th := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\t\treturn srv.CreateAddress(ctx, req.(*CreateAddressReq))\n\t\t})\n\t\tout, err := h(ctx, &in)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treply := out.(*AddressInfo)\n\t\treturn ctx.Result(200, reply)\n\t}\n}\n\nfunc _Shop_AddressListByUid0_HTTP_Handler(srv ShopHTTPServer) func(ctx http.Context) error {\n\treturn func(ctx http.Context) error {\n\t\tvar in emptypb.Empty\n\t\tif err := ctx.BindQuery(&in); err != nil {\n\t\t\treturn err\n\t\t}\n\t\thttp.SetOperation(ctx, \"/shop.shop.v1.Shop/AddressListByUid\")\n\t\th := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\t\treturn srv.AddressListByUid(ctx, req.(*emptypb.Empty))\n\t\t})\n\t\tout, err := h(ctx, &in)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treply := out.(*ListAddressReply)\n\t\treturn ctx.Result(200, reply)\n\t}\n}\n\nfunc _Shop_UpdateAddress0_HTTP_Handler(srv ShopHTTPServer) func(ctx http.Context) error {\n\treturn func(ctx http.Context) error {\n\t\tvar in UpdateAddressReq\n\t\tif err := ctx.Bind(&in); err != nil {\n\t\t\treturn err\n\t\t}\n\t\thttp.SetOperation(ctx, \"/shop.shop.v1.Shop/UpdateAddress\")\n\t\th := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\t\treturn srv.UpdateAddress(ctx, req.(*UpdateAddressReq))\n\t\t})\n\t\tout, err := h(ctx, &in)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treply := out.(*CheckResponse)\n\t\treturn ctx.Result(200, reply)\n\t}\n}\n\nfunc _Shop_DefaultAddress0_HTTP_Handler(srv ShopHTTPServer) func(ctx http.Context) error {\n\treturn func(ctx http.Context) error {\n\t\tvar in AddressReq\n\t\tif err := ctx.Bind(&in); err != nil {\n\t\t\treturn err\n\t\t}\n\t\thttp.SetOperation(ctx, \"/shop.shop.v1.Shop/DefaultAddress\")\n\t\th := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\t\treturn srv.DefaultAddress(ctx, req.(*AddressReq))\n\t\t})\n\t\tout, err := h(ctx, &in)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treply := out.(*CheckResponse)\n\t\treturn ctx.Result(200, reply)\n\t}\n}\n\nfunc _Shop_DeleteAddress0_HTTP_Handler(srv ShopHTTPServer) func(ctx http.Context) error {\n\treturn func(ctx http.Context) error {\n\t\tvar in AddressReq\n\t\tif err := ctx.BindQuery(&in); err != nil {\n\t\t\treturn err\n\t\t}\n\t\thttp.SetOperation(ctx, \"/shop.shop.v1.Shop/DeleteAddress\")\n\t\th := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\t\treturn srv.DeleteAddress(ctx, req.(*AddressReq))\n\t\t})\n\t\tout, err := h(ctx, &in)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treply := out.(*CheckResponse)\n\t\treturn ctx.Result(200, reply)\n\t}\n}\n\ntype ShopHTTPClient interface {\n\tAddressListByUid(ctx context.Context, req *emptypb.Empty, opts ...http.CallOption) (rsp *ListAddressReply, err error)\n\tCaptcha(ctx context.Context, req *emptypb.Empty, opts ...http.CallOption) (rsp *CaptchaReply, err error)\n\tCreateAddress(ctx context.Context, req *CreateAddressReq, opts ...http.CallOption) (rsp *AddressInfo, err error)\n\tDefaultAddress(ctx context.Context, req *AddressReq, opts ...http.CallOption) (rsp *CheckResponse, err error)\n\tDeleteAddress(ctx context.Context, req *AddressReq, opts ...http.CallOption) (rsp *CheckResponse, err error)\n\tDetail(ctx context.Context, req *emptypb.Empty, opts ...http.CallOption) (rsp *UserDetailResponse, err error)\n\tLogin(ctx context.Context, req *LoginReq, opts ...http.CallOption) (rsp *RegisterReply, err error)\n\tRegister(ctx context.Context, req *RegisterReq, opts ...http.CallOption) (rsp *RegisterReply, err error)\n\tUpdateAddress(ctx context.Context, req *UpdateAddressReq, opts ...http.CallOption) (rsp *CheckResponse, err error)\n}\n\ntype ShopHTTPClientImpl struct {\n\tcc *http.Client\n}\n\nfunc NewShopHTTPClient(client *http.Client) ShopHTTPClient {\n\treturn &ShopHTTPClientImpl{client}\n}\n\nfunc (c *ShopHTTPClientImpl) AddressListByUid(ctx context.Context, in *emptypb.Empty, opts ...http.CallOption) (*ListAddressReply, error) {\n\tvar out ListAddressReply\n\tpattern := \"/api/address/list/uid\"\n\tpath := binding.EncodeURL(pattern, in, true)\n\topts = append(opts, http.Operation(\"/shop.shop.v1.Shop/AddressListByUid\"))\n\topts = append(opts, http.PathTemplate(pattern))\n\terr := c.cc.Invoke(ctx, \"GET\", path, nil, &out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &out, err\n}\n\nfunc (c *ShopHTTPClientImpl) Captcha(ctx context.Context, in *emptypb.Empty, opts ...http.CallOption) (*CaptchaReply, error) {\n\tvar out CaptchaReply\n\tpattern := \"/api/users/captcha\"\n\tpath := binding.EncodeURL(pattern, in, true)\n\topts = append(opts, http.Operation(\"/shop.shop.v1.Shop/Captcha\"))\n\topts = append(opts, http.PathTemplate(pattern))\n\terr := c.cc.Invoke(ctx, \"GET\", path, nil, &out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &out, err\n}\n\nfunc (c *ShopHTTPClientImpl) CreateAddress(ctx context.Context, in *CreateAddressReq, opts ...http.CallOption) (*AddressInfo, error) {\n\tvar out AddressInfo\n\tpattern := \"/api/address/create\"\n\tpath := binding.EncodeURL(pattern, in, false)\n\topts = append(opts, http.Operation(\"/shop.shop.v1.Shop/CreateAddress\"))\n\topts = append(opts, http.PathTemplate(pattern))\n\terr := c.cc.Invoke(ctx, \"POST\", path, in, &out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &out, err\n}\n\nfunc (c *ShopHTTPClientImpl) DefaultAddress(ctx context.Context, in *AddressReq, opts ...http.CallOption) (*CheckResponse, error) {\n\tvar out CheckResponse\n\tpattern := \"/api/address/default\"\n\tpath := binding.EncodeURL(pattern, in, false)\n\topts = append(opts, http.Operation(\"/shop.shop.v1.Shop/DefaultAddress\"))\n\topts = append(opts, http.PathTemplate(pattern))\n\terr := c.cc.Invoke(ctx, \"PUT\", path, in, &out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &out, err\n}\n\nfunc (c *ShopHTTPClientImpl) DeleteAddress(ctx context.Context, in *AddressReq, opts ...http.CallOption) (*CheckResponse, error) {\n\tvar out CheckResponse\n\tpattern := \"/api/address/delete\"\n\tpath := binding.EncodeURL(pattern, in, true)\n\topts = append(opts, http.Operation(\"/shop.shop.v1.Shop/DeleteAddress\"))\n\topts = append(opts, http.PathTemplate(pattern))\n\terr := c.cc.Invoke(ctx, \"DELETE\", path, nil, &out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &out, err\n}\n\nfunc (c *ShopHTTPClientImpl) Detail(ctx context.Context, in *emptypb.Empty, opts ...http.CallOption) (*UserDetailResponse, error) {\n\tvar out UserDetailResponse\n\tpattern := \"/api/users/detail\"\n\tpath := binding.EncodeURL(pattern, in, true)\n\topts = append(opts, http.Operation(\"/shop.shop.v1.Shop/Detail\"))\n\topts = append(opts, http.PathTemplate(pattern))\n\terr := c.cc.Invoke(ctx, \"GET\", path, nil, &out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &out, err\n}\n\nfunc (c *ShopHTTPClientImpl) Login(ctx context.Context, in *LoginReq, opts ...http.CallOption) (*RegisterReply, error) {\n\tvar out RegisterReply\n\tpattern := \"/api/users/login\"\n\tpath := binding.EncodeURL(pattern, in, false)\n\topts = append(opts, http.Operation(\"/shop.shop.v1.Shop/Login\"))\n\topts = append(opts, http.PathTemplate(pattern))\n\terr := c.cc.Invoke(ctx, \"POST\", path, in, &out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &out, err\n}\n\nfunc (c *ShopHTTPClientImpl) Register(ctx context.Context, in *RegisterReq, opts ...http.CallOption) (*RegisterReply, error) {\n\tvar out RegisterReply\n\tpattern := \"/api/users/register\"\n\tpath := binding.EncodeURL(pattern, in, false)\n\topts = append(opts, http.Operation(\"/shop.shop.v1.Shop/Register\"))\n\topts = append(opts, http.PathTemplate(pattern))\n\terr := c.cc.Invoke(ctx, \"POST\", path, in, &out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &out, err\n}\n\nfunc (c *ShopHTTPClientImpl) UpdateAddress(ctx context.Context, in *UpdateAddressReq, opts ...http.CallOption) (*CheckResponse, error) {\n\tvar out CheckResponse\n\tpattern := \"/api/address/update\"\n\tpath := binding.EncodeURL(pattern, in, false)\n\topts = append(opts, http.Operation(\"/shop.shop.v1.Shop/UpdateAddress\"))\n\topts = append(opts, http.PathTemplate(pattern))\n\terr := c.cc.Invoke(ctx, \"PUT\", path, in, &out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &out, err\n}\n"
  },
  {
    "path": "shop/cmd/shop/main.go",
    "content": "package main\n\nimport (\n\t\"flag\"\n\t\"os\"\n\n\t\"github.com/go-kratos/kratos/v2\"\n\t\"github.com/go-kratos/kratos/v2/config\"\n\t\"github.com/go-kratos/kratos/v2/config/file\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"github.com/go-kratos/kratos/v2/middleware/tracing\"\n\t\"github.com/go-kratos/kratos/v2/registry\"\n\t\"github.com/go-kratos/kratos/v2/transport/grpc\"\n\t\"github.com/go-kratos/kratos/v2/transport/http\"\n\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/exporters/jaeger\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\ttracesdk \"go.opentelemetry.io/otel/sdk/trace\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.7.0\"\n\n\t\"shop/internal/conf\"\n)\n\n// go build -ldflags \"-X main.Version=x.y.z\"\nvar (\n\t// Name is the name of the compiled software.\n\tName = \"shop.api\"\n\t// Version is the version of the compiled software.\n\tVersion = \"shop.api.v1\"\n\t// flagconf is the config flag.\n\tflagconf string\n\n\tid, _ = os.Hostname()\n)\n\nfunc init() {\n\tflag.StringVar(&flagconf, \"conf\", \"../../configs\", \"config path, eg: -conf config.yaml\")\n}\n\nfunc newApp(logger log.Logger, hs *http.Server, gs *grpc.Server, rr registry.Registrar) *kratos.App {\n\treturn kratos.New(\n\t\tkratos.ID(id+\"shop.api\"),\n\t\tkratos.Name(Name),\n\t\tkratos.Version(Version),\n\t\tkratos.Metadata(map[string]string{}),\n\t\tkratos.Logger(logger),\n\t\tkratos.Server(\n\t\t\ths,\n\t\t\t//gs,\n\t\t),\n\t\tkratos.Registrar(rr),\n\t)\n}\n\nfunc main() {\n\tflag.Parse()\n\tlogger := log.With(log.NewStdLogger(os.Stdout),\n\t\t\"ts\", log.DefaultTimestamp,\n\t\t\"caller\", log.DefaultCaller,\n\t\t\"service.id\", id,\n\t\t\"service.name\", Name,\n\t\t\"service.version\", Version,\n\t\t\"trace_id\", tracing.TraceID(),\n\t\t\"span_id\", tracing.SpanID(),\n\t)\n\tc := config.New(\n\t\tconfig.WithSource(\n\t\t\tfile.NewSource(flagconf),\n\t\t),\n\t)\n\tdefer c.Close()\n\n\tif err := c.Load(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tvar bc conf.Bootstrap\n\tif err := c.Scan(&bc); err != nil {\n\t\tpanic(err)\n\t}\n\n\tvar rc conf.Registry\n\tif err := c.Scan(&rc); err != nil {\n\t\tpanic(err)\n\t}\n\n\terr := setTracerProvider(bc.Trace.Endpoint)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tapp, cleanup, err := initApp(bc.Server, bc.Data, bc.Auth, bc.Service, &rc, logger)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdefer cleanup()\n\n\t// start and wait for stop signal\n\tif err := app.Run(); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc setTracerProvider(url string) error {\n\t// Create the Jaeger exporter\n\texp, err := jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(url)))\n\tif err != nil {\n\t\treturn err\n\t}\n\ttp := tracesdk.NewTracerProvider(\n\t\t// Set the sampling rate based on the parent span to 100%\n\t\ttracesdk.WithSampler(tracesdk.ParentBased(tracesdk.TraceIDRatioBased(1.0))),\n\t\t// Always be sure to batch in production.\n\t\ttracesdk.WithBatcher(exp),\n\t\t// Record information about this application in an Resource.\n\t\ttracesdk.WithResource(resource.NewSchemaless(\n\t\t\tsemconv.ServiceNameKey.String(Name),\n\t\t\tattribute.String(\"env\", \"dev\"),\n\t\t)),\n\t)\n\totel.SetTracerProvider(tp)\n\treturn nil\n}\n"
  },
  {
    "path": "shop/cmd/shop/wire.go",
    "content": "//go:build wireinject\n// +build wireinject\n\n// The build tag makes sure the stub is not built in the final build.\n\npackage main\n\nimport (\n\t\"github.com/go-kratos/kratos/v2\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"github.com/google/wire\"\n\t\"shop/internal/biz\"\n\t\"shop/internal/conf\"\n\t\"shop/internal/data\"\n\t\"shop/internal/server\"\n\t\"shop/internal/service\"\n)\n\n// initApp init shop application.\nfunc initApp(*conf.Server, *conf.Data, *conf.Auth, *conf.Service, *conf.Registry, log.Logger) (*kratos.App, func(), error) {\n\tpanic(wire.Build(server.ProviderSet, data.ProviderSet, biz.ProviderSet, service.ProviderSet, newApp))\n}\n"
  },
  {
    "path": "shop/cmd/shop/wire_gen.go",
    "content": "// Code generated by Wire. DO NOT EDIT.\n\n//go:generate go run github.com/google/wire/cmd/wire\n//go:build !wireinject\n// +build !wireinject\n\npackage main\n\nimport (\n\t\"github.com/go-kratos/kratos/v2\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"shop/internal/biz\"\n\t\"shop/internal/conf\"\n\t\"shop/internal/data\"\n\t\"shop/internal/server\"\n\t\"shop/internal/service\"\n)\n\n// Injectors from wire.go:\n\n// initApp init shop application.\nfunc initApp(confServer *conf.Server, confData *conf.Data, auth *conf.Auth, confService *conf.Service, registry *conf.Registry, logger log.Logger) (*kratos.App, func(), error) {\n\tdiscovery := data.NewDiscovery(registry)\n\tuserClient := data.NewUserServiceClient(auth, confService, discovery)\n\tdataData, err := data.NewData(confData, userClient, logger)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\tuserRepo := data.NewUserRepo(dataData, logger)\n\tuserUsecase := biz.NewUserUsecase(userRepo, logger, auth)\n\taddressRepo := data.NewAddressRepo(dataData, logger)\n\taddressUsecase := biz.NewAddressUsecase(userRepo, addressRepo, logger, auth)\n\tshopService := service.NewShopService(userUsecase, addressUsecase, logger)\n\thttpServer := server.NewHTTPServer(confServer, auth, shopService, logger)\n\tgrpcServer := server.NewGRPCServer(confServer, shopService, logger)\n\tregistrar := data.NewRegistrar(registry)\n\tapp := newApp(logger, httpServer, grpcServer, registrar)\n\treturn app, func() {\n\t}, nil\n}\n"
  },
  {
    "path": "shop/configs/config.yaml",
    "content": "name: shop.api\nserver:\n  http:\n    addr: 0.0.0.0:8097\n    timeout: 1s\n  grpc:\n    addr: 0.0.0.0:9001\n    timeout: 1s\ndata:\n  database:\n    driver: mysql\n    source: root:root@tcp(127.0.0.1:3306)/test\n  redis:\n    addr: 127.0.0.1:6379\n    read_timeout: 0.2s\n    write_timeout: 0.2s\ntrace:\n  endpoint: http://127.0.0.1:14268/api/traces\nauth:\n  jwt_key: hqFr%3ddt32DGlSTOI5cO6@TH#fFwYnP$S\nservice:\n  user:\n    endpoint: discovery:///shop.user.service\n  goods:\n    endpoint: discovery:///shop.goods.service"
  },
  {
    "path": "shop/configs/registry.yaml",
    "content": "consul:\n  address: 127.0.0.1:8500\n  scheme: http"
  },
  {
    "path": "shop/generate.go",
    "content": "package generate\n\n//go:generate kratos proto client api\n"
  },
  {
    "path": "shop/go.mod",
    "content": "module shop\n\ngo 1.16\n\nrequire (\n\tgithub.com/envoyproxy/protoc-gen-validate v0.6.3\n\tgithub.com/go-kratos/kratos/contrib/registry/consul/v2 v2.0.0-20220209030627-9662ef3c213d\n\tgithub.com/go-kratos/kratos/v2 v2.1.5\n\tgithub.com/golang-jwt/jwt/v4 v4.0.0\n\tgithub.com/google/wire v0.5.0\n\tgithub.com/gorilla/handlers v1.5.1\n\tgithub.com/hashicorp/consul/api v1.12.0\n\tgithub.com/mojocn/base64Captcha v1.3.5\n\tgo.opentelemetry.io/otel v1.4.0\n\tgo.opentelemetry.io/otel/exporters/jaeger v1.4.0\n\tgo.opentelemetry.io/otel/sdk v1.4.0\n\tgoogle.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb\n\tgoogle.golang.org/grpc v1.43.0\n\tgoogle.golang.org/protobuf v1.27.1\n\tgopkg.in/yaml.v2 v2.4.0 // indirect\n)\n"
  },
  {
    "path": "shop/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=\ngithub.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8=\ngithub.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=\ngithub.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=\ngithub.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/envoyproxy/protoc-gen-validate v0.6.3 h1:HkntewfZJ9RofA/FX38zBCeIAqlLDFLbAI6eTpZqFJw=\ngithub.com/envoyproxy/protoc-gen-validate v0.6.3/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ=\ngithub.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=\ngithub.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=\ngithub.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=\ngithub.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=\ngithub.com/go-kratos/aegis v0.1.1/go.mod h1:jYeSQ3Gesba478zEnujOiG5QdsyF3Xk/8owFUeKcHxw=\ngithub.com/go-kratos/kratos/contrib/registry/consul/v2 v2.0.0-20220209030627-9662ef3c213d h1:UHNb0QKaftYtQhvcD3o7xlZbMIQs5SPB9NPKZsoqUtU=\ngithub.com/go-kratos/kratos/contrib/registry/consul/v2 v2.0.0-20220209030627-9662ef3c213d/go.mod h1:gCxmEdB6yLypq2c14QMH6JgvbNxsF4eqxqHQTMogVKA=\ngithub.com/go-kratos/kratos/v2 v2.1.5 h1:q8kTXyY1KkNJS3tmhvGUJfysipM5AIuoJaXBEvDBnFI=\ngithub.com/go-kratos/kratos/v2 v2.1.5/go.mod h1:zMonCKAf8+He4b9NQ/QHr20tMznd4NO5XrNds36w/5k=\ngithub.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.2.2 h1:ahHml/yUpnlb96Rp8HCvtYVPY8ZYpxq3g7UYchIYwbs=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=\ngithub.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=\ngithub.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=\ngithub.com/go-playground/form/v4 v4.2.0 h1:N1wh+Goz61e6w66vo8vJkQt+uwZSoLz50kZPJWR8eic=\ngithub.com/go-playground/form/v4 v4.2.0/go.mod h1:q1a2BY+AQUUzhl6xA/6hBetay6dEIhMHjgvJiGo6K7U=\ngithub.com/golang-jwt/jwt/v4 v4.0.0 h1:RAqyYixv1p7uEnocuy8P1nru5wprCh/MH2BIlW5z5/o=\ngithub.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=\ngithub.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/wire v0.5.0 h1:I7ELFeVBr3yfPIcc8+MWvrjk+3VjbcSzoXm3JVa+jD8=\ngithub.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU=\ngithub.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4=\ngithub.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q=\ngithub.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=\ngithub.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=\ngithub.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=\ngithub.com/hashicorp/consul/api v1.9.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M=\ngithub.com/hashicorp/consul/api v1.12.0 h1:k3y1FYv6nuKyNTqj6w9gXOx5r5CfLj/k/euUeBXj1OY=\ngithub.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0=\ngithub.com/hashicorp/consul/sdk v0.8.0 h1:OJtKBtEjboEZvG6AOUdh4Z1Zbyu0WcxQ0qatRrZHTVU=\ngithub.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms=\ngithub.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-hclog v0.12.0 h1:d4QkX8FRTYaKaCZBoXYY8zJX2BXjWxurN/GA2tkrmZM=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/golang-lru v0.5.0 h1:CL2msUPvZTLb5O648aiLNJw3hnBxN2+1Jq8rCOH9wdo=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=\ngithub.com/hashicorp/memberlist v0.3.0 h1:8+567mCcFDnS5ADl7lrpxPMWiFCElyUEeW0gtj34fMA=\ngithub.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=\ngithub.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk=\ngithub.com/hashicorp/serf v0.9.6 h1:uuEX1kLR6aoda1TBttmJQKDLZE1Ob7KN0NPdE7EtCDc=\ngithub.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=\ngithub.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=\ngithub.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=\ngithub.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0=\ngithub.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=\ngithub.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mojocn/base64Captcha v1.3.5 h1:Qeilr7Ta6eDtG4S+tQuZ5+hO+QHbiGAJdi4PfoagaA0=\ngithub.com/mojocn/base64Captcha v1.3.5/go.mod h1:/tTTXn4WTpX9CfrmipqRytCpJ27Uw3G6I7NcP2WwcmY=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/shirou/gopsutil/v3 v3.21.8/go.mod h1:YWp/H8Qs5fVmf17v7JNZzA0mPJ+mS2e9JdiUF9LlKzQ=\ngithub.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=\ngithub.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4=\ngithub.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=\ngithub.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs=\ngithub.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngo.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs=\ngo.opentelemetry.io/otel v1.4.0 h1:7ESuKPq6zpjRaY5nvVDGiuwK7VAJ8MwkKnmNJ9whNZ4=\ngo.opentelemetry.io/otel v1.4.0/go.mod h1:jeAqMFKy2uLIxCtKxoFj0FAL5zAPKQagc3+GtBWakzk=\ngo.opentelemetry.io/otel/exporters/jaeger v1.4.0 h1:EX/spHhVkHbobTeSozT1zpbuc3oO70CISkw+dspgR9M=\ngo.opentelemetry.io/otel/exporters/jaeger v1.4.0/go.mod h1:C4UfuVfyi7qAk/PAz6QodaEkES7RnLNHeAAj6QOu2gI=\ngo.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs=\ngo.opentelemetry.io/otel/sdk v1.4.0 h1:LJE4SW3jd4lQTESnlpQZcBhQ3oci0U2MLR5uhicfTHQ=\ngo.opentelemetry.io/otel/sdk v1.4.0/go.mod h1:71GJPNJh4Qju6zJuYl1CrYtXbrgfau/M9UAggqiy1UE=\ngo.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk=\ngo.opentelemetry.io/otel/trace v1.4.0 h1:4OOUrPZdVFQkbzl/JSdvGCWIdw5ONXXxzHlaLlWppmo=\ngo.opentelemetry.io/otel/trace v1.4.0/go.mod h1:uc3eRsqDfWs9R7b92xbQbU42/eTNz4N+gLP8qJCi4aE=\ngo.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=\ngolang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/image v0.0.0-20190501045829-6d32002ffd75 h1:TbGuee8sSq15Iguxu4deQ7+Bqq/d2rsQejGcEtADAMQ=\ngolang.org/x/image v0.0.0-20190501045829-6d32002ffd75/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210813160813-60bc85c4be6d h1:LO7XpTYMwTqxjLcGWPijK3vRXg1aWdlNOVOHRq45d7c=\ngolang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210816183151-1e6c022a8912 h1:uCLL3g5wH2xjxVREVuAbP9JM5PPKjRbXKRa6IBjkzmU=\ngolang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190422233926-fe54fb35175b/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb h1:ZrsicilzPCS/Xr8qtBZZLpy4P9TYXAfl49ctG1/5tgw=\ngoogle.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=\ngoogle.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=\ngoogle.golang.org/grpc v1.43.0 h1:Eeu7bZtDZ2DpRCsLhUlcrLnvYaMK1Gz86a+hMVvELmM=\ngoogle.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\n"
  },
  {
    "path": "shop/internal/biz/README.md",
    "content": "# Biz\n"
  },
  {
    "path": "shop/internal/biz/address.go",
    "content": "package biz\n\nimport (\n\t\"context\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"github.com/go-kratos/kratos/v2/middleware/auth/jwt\"\n\tjwt2 \"github.com/golang-jwt/jwt/v4\"\n\tv1 \"shop/api/shop/v1\"\n\t\"shop/internal/conf\"\n)\n\ntype Address struct {\n\tID        int64\n\tUserID    int64\n\tIsDefault int32\n\tMobile    string\n\tName      string\n\tProvince  string\n\tCity      string\n\tDistricts string\n\tAddress   string\n\tPostCode  string\n}\n\ntype AddressRepo interface {\n\tCreateAddress(ctx context.Context, a *Address) (*Address, error)\n\tAddressListByUid(ctx context.Context, uid int64) ([]*Address, error)\n\tUpdateAddress(ctx context.Context, a *Address) error\n\tDefaultAddress(ctx context.Context, a *Address) error\n\tDeleteAddress(ctx context.Context, a *Address) error\n}\n\ntype AddressUsecase struct {\n\tuRepo      UserRepo\n\taRepo      AddressRepo\n\tlog        *log.Helper\n\tsigningKey string\n}\n\nfunc NewAddressUsecase(repo UserRepo, arepo AddressRepo, logger log.Logger, conf *conf.Auth) *AddressUsecase {\n\thelper := log.NewHelper(log.With(logger, \"module\", \"usecase/shop\"))\n\treturn &AddressUsecase{\n\t\tuRepo:      repo,\n\t\taRepo:      arepo,\n\t\tlog:        helper,\n\t\tsigningKey: conf.JwtKey}\n}\n\nfunc (ua *AddressUsecase) CreateAddress(ctx context.Context, r *v1.CreateAddressReq) (*v1.AddressInfo, error) {\n\t// 在上下文 context 中取出 claims 对象\n\tuId, err := getUid(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treq := Address{\n\t\tUserID:    uId,\n\t\tIsDefault: 0,\n\t\tMobile:    r.Mobile,\n\t\tName:      r.Name,\n\t\tProvince:  r.Province,\n\t\tCity:      r.City,\n\t\tDistricts: r.Districts,\n\t\tAddress:   r.Address,\n\t\tPostCode:  r.PostCode,\n\t}\n\tres, err := ua.aRepo.CreateAddress(ctx, &req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tresult := &v1.AddressInfo{\n\t\tId:        res.ID,\n\t\tName:      res.Name,\n\t\tMobile:    res.Mobile,\n\t\tProvince:  res.Province,\n\t\tCity:      res.City,\n\t\tDistricts: res.Districts,\n\t\tAddress:   res.Address,\n\t\tPostCode:  res.PostCode,\n\t\tIsDefault: int32(res.IsDefault),\n\t}\n\treturn result, nil\n}\n\nfunc (ua *AddressUsecase) AddressListByUid(ctx context.Context) (*v1.ListAddressReply, error) {\n\t// 在上下文 context 中取出 claims 对象\n\tuId, err := getUid(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\taddressList, err := ua.aRepo.AddressListByUid(ctx, uId)\n\tvar res v1.ListAddressReply\n\tfor _, v := range addressList {\n\t\taddressInfoTmp := &v1.AddressInfo{\n\t\t\tId:        v.ID,\n\t\t\tName:      v.Name,\n\t\t\tMobile:    v.Mobile,\n\t\t\tProvince:  v.Province,\n\t\t\tCity:      v.City,\n\t\t\tDistricts: v.Districts,\n\t\t\tAddress:   v.Address,\n\t\t\tPostCode:  v.PostCode,\n\t\t\tIsDefault: v.IsDefault,\n\t\t}\n\t\tres.Results = append(res.Results, addressInfoTmp)\n\t}\n\treturn &res, err\n}\n\nfunc (ua *AddressUsecase) UpdateAddress(ctx context.Context, a *Address) (bool, error) {\n\tuId, err := getUid(ctx)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\ta.UserID = uId\n\tif err := ua.aRepo.UpdateAddress(ctx, a); err != nil {\n\t\treturn false, err\n\t}\n\treturn true, nil\n}\n\nfunc getUid(ctx context.Context) (int64, error) {\n\t// 在上下文 context 中取出 claims 对象\n\tvar uId int64\n\tif claims, ok := jwt.FromContext(ctx); ok {\n\t\tc := claims.(jwt2.MapClaims)\n\t\tv, ok := c[\"ID\"]\n\n\t\tif !ok {\n\t\t\treturn 0, ErrAuthFailed\n\t\t}\n\t\tuId = int64(v.(float64))\n\t}\n\treturn uId, nil\n}\n\nfunc (ua *AddressUsecase) DefaultAddress(ctx context.Context, a *Address) (bool, error) {\n\tuId, err := getUid(ctx)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\ta.UserID = uId\n\tif err := ua.aRepo.DefaultAddress(ctx, a); err != nil {\n\t\treturn false, err\n\t}\n\treturn true, nil\n}\n\nfunc (ua *AddressUsecase) DeleteAddress(ctx context.Context, a *Address) (bool, error) {\n\tuId, err := getUid(ctx)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\ta.UserID = uId\n\tif err := ua.aRepo.DeleteAddress(ctx, a); err != nil {\n\t\treturn false, err\n\t}\n\treturn true, nil\n}\n"
  },
  {
    "path": "shop/internal/biz/biz.go",
    "content": "package biz\n\nimport \"github.com/google/wire\"\n\n// ProviderSet is biz providers.\nvar ProviderSet = wire.NewSet(NewUserUsecase, NewAddressUsecase)\n"
  },
  {
    "path": "shop/internal/biz/user.go",
    "content": "package biz\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"github.com/go-kratos/kratos/v2/middleware/auth/jwt\"\n\tjwt2 \"github.com/golang-jwt/jwt/v4\"\n\tv1 \"shop/api/shop/v1\"\n\t\"shop/internal/conf\"\n\t\"shop/internal/pkg/captcha\"\n\t\"shop/internal/pkg/middleware/auth\"\n\t\"time\"\n)\n\nvar (\n\tErrPasswordInvalid     = errors.New(\"password invalid\")\n\tErrUsernameInvalid     = errors.New(\"username invalid\")\n\tErrCaptchaInvalid      = errors.New(\"verification code error\")\n\tErrMobileInvalid       = errors.New(\"mobile invalid\")\n\tErrUserNotFound        = errors.New(\"user not found\")\n\tErrLoginFailed         = errors.New(\"login failed\")\n\tErrGenerateTokenFailed = errors.New(\"generate token failed\")\n\tErrAuthFailed          = errors.New(\"authentication failed\")\n)\n\ntype User struct {\n\tID        int64\n\tMobile    string\n\tPassword  string\n\tNickName  string\n\tBirthday  int64\n\tGender    string\n\tRole      int\n\tCreatedAt time.Time\n}\n\ntype UserRepo interface {\n\tCreateUser(c context.Context, u *User) (*User, error)\n\tUserByMobile(ctx context.Context, mobile string) (*User, error)\n\tUserById(ctx context.Context, Id int64) (*User, error)\n\tCheckPassword(ctx context.Context, password, encryptedPassword string) (bool, error)\n\t//ListUser(ctx context.Context, pageNum, pageSize int) ([]*User, int, error)\n\t//UpdateUser(context.Context, *User) (bool, error)\n}\n\ntype UserUsecase struct {\n\tuRepo      UserRepo\n\tlog        *log.Helper\n\tsigningKey string\n}\n\nfunc NewUserUsecase(repo UserRepo, logger log.Logger, conf *conf.Auth) *UserUsecase {\n\thelper := log.NewHelper(log.With(logger, \"module\", \"usecase/shop\"))\n\treturn &UserUsecase{uRepo: repo, log: helper, signingKey: conf.JwtKey}\n}\n\n// GetCaptcha 验证码\nfunc (uc *UserUsecase) GetCaptcha(ctx context.Context) (*v1.CaptchaReply, error) {\n\tcaptchaInfo, err := captcha.GetCaptcha(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &v1.CaptchaReply{\n\t\tCaptchaId: captchaInfo.CaptchaId,\n\t\tPicPath:   captchaInfo.PicPath,\n\t}, nil\n}\n\nfunc (uc *UserUsecase) UserDetailByID(ctx context.Context) (*v1.UserDetailResponse, error) {\n\t// 在上下文 context 中取出 claims 对象\n\tvar uId int64\n\tif claims, ok := jwt.FromContext(ctx); ok {\n\t\tc := claims.(jwt2.MapClaims)\n\t\ti, ok := c[\"ID\"].(float64)\n\t\tif !ok {\n\t\t\treturn nil, ErrAuthFailed\n\t\t}\n\t\tuId = int64(i)\n\t}\n\n\tuser, err := uc.uRepo.UserById(ctx, uId)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &v1.UserDetailResponse{\n\t\tId:       user.ID,\n\t\tNickName: user.NickName,\n\t\tMobile:   user.Mobile,\n\t}, nil\n}\n\nfunc (uc *UserUsecase) PassWordLogin(ctx context.Context, req *v1.LoginReq) (*v1.RegisterReply, error) {\n\t// 表单验证\n\tif len(req.Mobile) <= 0 {\n\t\treturn nil, ErrMobileInvalid\n\t}\n\tif len(req.Password) <= 0 {\n\t\treturn nil, ErrUsernameInvalid\n\t}\n\t// 验证验证码是否正确\n\tif !captcha.Store.Verify(req.CaptchaId, req.Captcha, true) {\n\t\treturn nil, ErrCaptchaInvalid\n\t}\n\n\tif user, err := uc.uRepo.UserByMobile(ctx, req.Mobile); err != nil {\n\t\treturn nil, ErrUserNotFound\n\t} else {\n\t\t// 用户存在检查密码\n\t\tif passRsp, pasErr := uc.uRepo.CheckPassword(ctx, req.Password, user.Password); pasErr != nil {\n\t\t\treturn nil, ErrPasswordInvalid\n\t\t} else {\n\t\t\tif passRsp {\n\t\t\t\tclaims := auth.CustomClaims{\n\t\t\t\t\tID:          user.ID,\n\t\t\t\t\tNickName:    user.NickName,\n\t\t\t\t\tAuthorityId: user.Role,\n\t\t\t\t\tStandardClaims: jwt2.StandardClaims{\n\t\t\t\t\t\tNotBefore: time.Now().Unix(),               // 签名的生效时间\n\t\t\t\t\t\tExpiresAt: time.Now().Unix() + 60*60*24*30, // 30天过期\n\t\t\t\t\t\tIssuer:    \"Gyl\",\n\t\t\t\t\t},\n\t\t\t\t}\n\n\t\t\t\ttoken, err := auth.CreateToken(claims, uc.signingKey)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, ErrGenerateTokenFailed\n\t\t\t\t}\n\t\t\t\treturn &v1.RegisterReply{\n\t\t\t\t\tId:        user.ID,\n\t\t\t\t\tMobile:    user.Mobile,\n\t\t\t\t\tUsername:  user.NickName,\n\t\t\t\t\tToken:     token,\n\t\t\t\t\tExpiredAt: time.Now().Unix() + 60*60*24*30,\n\t\t\t\t}, nil\n\t\t\t} else {\n\t\t\t\treturn nil, ErrLoginFailed\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (uc *UserUsecase) CreateUser(ctx context.Context, req *v1.RegisterReq) (*v1.RegisterReply, error) {\n\tnewUser, err := NewUser(req.Mobile, req.Username, req.Password)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcreateUser, err := uc.uRepo.CreateUser(ctx, &newUser)\n\tclaims := auth.CustomClaims{\n\t\tID:          createUser.ID,\n\t\tNickName:    createUser.NickName,\n\t\tAuthorityId: createUser.Role,\n\t\tStandardClaims: jwt2.StandardClaims{\n\t\t\tNotBefore: time.Now().Unix(),               // 签名的生效时间\n\t\t\tExpiresAt: time.Now().Unix() + 60*60*24*30, // 30天过期\n\t\t\tIssuer:    \"Gyl\",\n\t\t},\n\t}\n\ttoken, err := auth.CreateToken(claims, uc.signingKey)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &v1.RegisterReply{\n\t\tId:        createUser.ID,\n\t\tMobile:    createUser.Mobile,\n\t\tUsername:  createUser.NickName,\n\t\tToken:     token,\n\t\tExpiredAt: time.Now().Unix() + 60*60*24*30,\n\t}, nil\n}\n\nfunc NewUser(mobile, username, password string) (User, error) {\n\t// check mobile\n\tif len(mobile) <= 0 {\n\t\treturn User{}, ErrMobileInvalid\n\t}\n\t// check username\n\tif len(username) <= 0 {\n\t\treturn User{}, ErrUsernameInvalid\n\t}\n\t// check password\n\tif len(password) <= 0 {\n\t\treturn User{}, ErrPasswordInvalid\n\t}\n\treturn User{\n\t\tMobile:   mobile,\n\t\tNickName: username,\n\t\tPassword: password,\n\t}, nil\n}\n"
  },
  {
    "path": "shop/internal/conf/conf.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.27.1\n// \tprotoc        v3.17.3\n// source: internal/conf/conf.proto\n\npackage conf\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tdurationpb \"google.golang.org/protobuf/types/known/durationpb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Bootstrap struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tServer  *Server  `protobuf:\"bytes,1,opt,name=s,proto3\" json:\"s,omitempty\"`\n\tData    *Data    `protobuf:\"bytes,2,opt,name=data,proto3\" json:\"data,omitempty\"`\n\tTrace   *Trace   `protobuf:\"bytes,3,opt,name=trace,proto3\" json:\"trace,omitempty\"`\n\tAuth    *Auth    `protobuf:\"bytes,4,opt,name=auth,proto3\" json:\"auth,omitempty\"`\n\tService *Service `protobuf:\"bytes,5,opt,name=service,proto3\" json:\"service,omitempty\"`\n}\n\nfunc (x *Bootstrap) Reset() {\n\t*x = Bootstrap{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Bootstrap) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Bootstrap) ProtoMessage() {}\n\nfunc (x *Bootstrap) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Bootstrap.ProtoReflect.Descriptor instead.\nfunc (*Bootstrap) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Bootstrap) GetServer() *Server {\n\tif x != nil {\n\t\treturn x.Server\n\t}\n\treturn nil\n}\n\nfunc (x *Bootstrap) GetData() *Data {\n\tif x != nil {\n\t\treturn x.Data\n\t}\n\treturn nil\n}\n\nfunc (x *Bootstrap) GetTrace() *Trace {\n\tif x != nil {\n\t\treturn x.Trace\n\t}\n\treturn nil\n}\n\nfunc (x *Bootstrap) GetAuth() *Auth {\n\tif x != nil {\n\t\treturn x.Auth\n\t}\n\treturn nil\n}\n\nfunc (x *Bootstrap) GetService() *Service {\n\tif x != nil {\n\t\treturn x.Service\n\t}\n\treturn nil\n}\n\ntype Server struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tHttp *Server_HTTP `protobuf:\"bytes,1,opt,name=http,proto3\" json:\"http,omitempty\"`\n\tGrpc *Server_GRPC `protobuf:\"bytes,2,opt,name=grpc,proto3\" json:\"grpc,omitempty\"`\n}\n\nfunc (x *Server) Reset() {\n\t*x = Server{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Server) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Server) ProtoMessage() {}\n\nfunc (x *Server) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Server.ProtoReflect.Descriptor instead.\nfunc (*Server) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Server) GetHttp() *Server_HTTP {\n\tif x != nil {\n\t\treturn x.Http\n\t}\n\treturn nil\n}\n\nfunc (x *Server) GetGrpc() *Server_GRPC {\n\tif x != nil {\n\t\treturn x.Grpc\n\t}\n\treturn nil\n}\n\ntype Data struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tDatabase *Data_Database `protobuf:\"bytes,1,opt,name=database,proto3\" json:\"database,omitempty\"`\n\tRedis    *Data_Redis    `protobuf:\"bytes,2,opt,name=redis,proto3\" json:\"redis,omitempty\"`\n}\n\nfunc (x *Data) Reset() {\n\t*x = Data{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Data) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Data) ProtoMessage() {}\n\nfunc (x *Data) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Data.ProtoReflect.Descriptor instead.\nfunc (*Data) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *Data) GetDatabase() *Data_Database {\n\tif x != nil {\n\t\treturn x.Database\n\t}\n\treturn nil\n}\n\nfunc (x *Data) GetRedis() *Data_Redis {\n\tif x != nil {\n\t\treturn x.Redis\n\t}\n\treturn nil\n}\n\ntype Service struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUser  *Service_User  `protobuf:\"bytes,1,opt,name=user,proto3\" json:\"user,omitempty\"`\n\tGoods *Service_Goods `protobuf:\"bytes,2,opt,name=goods,proto3\" json:\"goods,omitempty\"`\n}\n\nfunc (x *Service) Reset() {\n\t*x = Service{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Service) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Service) ProtoMessage() {}\n\nfunc (x *Service) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Service.ProtoReflect.Descriptor instead.\nfunc (*Service) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *Service) GetUser() *Service_User {\n\tif x != nil {\n\t\treturn x.User\n\t}\n\treturn nil\n}\n\nfunc (x *Service) GetGoods() *Service_Goods {\n\tif x != nil {\n\t\treturn x.Goods\n\t}\n\treturn nil\n}\n\ntype Trace struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEndpoint string `protobuf:\"bytes,1,opt,name=endpoint,proto3\" json:\"endpoint,omitempty\"`\n}\n\nfunc (x *Trace) Reset() {\n\t*x = Trace{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Trace) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Trace) ProtoMessage() {}\n\nfunc (x *Trace) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Trace.ProtoReflect.Descriptor instead.\nfunc (*Trace) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *Trace) GetEndpoint() string {\n\tif x != nil {\n\t\treturn x.Endpoint\n\t}\n\treturn \"\"\n}\n\ntype Registry struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tConsul *Registry_Consul `protobuf:\"bytes,1,opt,name=consul,proto3\" json:\"consul,omitempty\"`\n}\n\nfunc (x *Registry) Reset() {\n\t*x = Registry{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Registry) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Registry) ProtoMessage() {}\n\nfunc (x *Registry) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Registry.ProtoReflect.Descriptor instead.\nfunc (*Registry) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *Registry) GetConsul() *Registry_Consul {\n\tif x != nil {\n\t\treturn x.Consul\n\t}\n\treturn nil\n}\n\ntype Auth struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tJwtKey string `protobuf:\"bytes,1,opt,name=jwt_key,json=jwtKey,proto3\" json:\"jwt_key,omitempty\"`\n}\n\nfunc (x *Auth) Reset() {\n\t*x = Auth{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Auth) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Auth) ProtoMessage() {}\n\nfunc (x *Auth) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Auth.ProtoReflect.Descriptor instead.\nfunc (*Auth) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *Auth) GetJwtKey() string {\n\tif x != nil {\n\t\treturn x.JwtKey\n\t}\n\treturn \"\"\n}\n\ntype Server_HTTP struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tNetwork string               `protobuf:\"bytes,1,opt,name=network,proto3\" json:\"network,omitempty\"`\n\tAddr    string               `protobuf:\"bytes,2,opt,name=addr,proto3\" json:\"addr,omitempty\"`\n\tTimeout *durationpb.Duration `protobuf:\"bytes,3,opt,name=timeout,proto3\" json:\"timeout,omitempty\"`\n}\n\nfunc (x *Server_HTTP) Reset() {\n\t*x = Server_HTTP{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Server_HTTP) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Server_HTTP) ProtoMessage() {}\n\nfunc (x *Server_HTTP) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Server_HTTP.ProtoReflect.Descriptor instead.\nfunc (*Server_HTTP) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{1, 0}\n}\n\nfunc (x *Server_HTTP) GetNetwork() string {\n\tif x != nil {\n\t\treturn x.Network\n\t}\n\treturn \"\"\n}\n\nfunc (x *Server_HTTP) GetAddr() string {\n\tif x != nil {\n\t\treturn x.Addr\n\t}\n\treturn \"\"\n}\n\nfunc (x *Server_HTTP) GetTimeout() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.Timeout\n\t}\n\treturn nil\n}\n\ntype Server_GRPC struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tNetwork string               `protobuf:\"bytes,1,opt,name=network,proto3\" json:\"network,omitempty\"`\n\tAddr    string               `protobuf:\"bytes,2,opt,name=addr,proto3\" json:\"addr,omitempty\"`\n\tTimeout *durationpb.Duration `protobuf:\"bytes,3,opt,name=timeout,proto3\" json:\"timeout,omitempty\"`\n}\n\nfunc (x *Server_GRPC) Reset() {\n\t*x = Server_GRPC{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[8]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Server_GRPC) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Server_GRPC) ProtoMessage() {}\n\nfunc (x *Server_GRPC) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[8]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Server_GRPC.ProtoReflect.Descriptor instead.\nfunc (*Server_GRPC) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{1, 1}\n}\n\nfunc (x *Server_GRPC) GetNetwork() string {\n\tif x != nil {\n\t\treturn x.Network\n\t}\n\treturn \"\"\n}\n\nfunc (x *Server_GRPC) GetAddr() string {\n\tif x != nil {\n\t\treturn x.Addr\n\t}\n\treturn \"\"\n}\n\nfunc (x *Server_GRPC) GetTimeout() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.Timeout\n\t}\n\treturn nil\n}\n\ntype Data_Database struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tDriver string `protobuf:\"bytes,1,opt,name=driver,proto3\" json:\"driver,omitempty\"`\n\tSource string `protobuf:\"bytes,2,opt,name=source,proto3\" json:\"source,omitempty\"`\n}\n\nfunc (x *Data_Database) Reset() {\n\t*x = Data_Database{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[9]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Data_Database) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Data_Database) ProtoMessage() {}\n\nfunc (x *Data_Database) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[9]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Data_Database.ProtoReflect.Descriptor instead.\nfunc (*Data_Database) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{2, 0}\n}\n\nfunc (x *Data_Database) GetDriver() string {\n\tif x != nil {\n\t\treturn x.Driver\n\t}\n\treturn \"\"\n}\n\nfunc (x *Data_Database) GetSource() string {\n\tif x != nil {\n\t\treturn x.Source\n\t}\n\treturn \"\"\n}\n\ntype Data_Redis struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tNetwork      string               `protobuf:\"bytes,1,opt,name=network,proto3\" json:\"network,omitempty\"`\n\tAddr         string               `protobuf:\"bytes,2,opt,name=addr,proto3\" json:\"addr,omitempty\"`\n\tReadTimeout  *durationpb.Duration `protobuf:\"bytes,3,opt,name=read_timeout,json=readTimeout,proto3\" json:\"read_timeout,omitempty\"`\n\tWriteTimeout *durationpb.Duration `protobuf:\"bytes,4,opt,name=write_timeout,json=writeTimeout,proto3\" json:\"write_timeout,omitempty\"`\n}\n\nfunc (x *Data_Redis) Reset() {\n\t*x = Data_Redis{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[10]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Data_Redis) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Data_Redis) ProtoMessage() {}\n\nfunc (x *Data_Redis) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[10]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Data_Redis.ProtoReflect.Descriptor instead.\nfunc (*Data_Redis) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{2, 1}\n}\n\nfunc (x *Data_Redis) GetNetwork() string {\n\tif x != nil {\n\t\treturn x.Network\n\t}\n\treturn \"\"\n}\n\nfunc (x *Data_Redis) GetAddr() string {\n\tif x != nil {\n\t\treturn x.Addr\n\t}\n\treturn \"\"\n}\n\nfunc (x *Data_Redis) GetReadTimeout() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.ReadTimeout\n\t}\n\treturn nil\n}\n\nfunc (x *Data_Redis) GetWriteTimeout() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.WriteTimeout\n\t}\n\treturn nil\n}\n\ntype Service_User struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEndpoint string `protobuf:\"bytes,1,opt,name=endpoint,proto3\" json:\"endpoint,omitempty\"`\n}\n\nfunc (x *Service_User) Reset() {\n\t*x = Service_User{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[11]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Service_User) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Service_User) ProtoMessage() {}\n\nfunc (x *Service_User) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[11]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Service_User.ProtoReflect.Descriptor instead.\nfunc (*Service_User) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{3, 0}\n}\n\nfunc (x *Service_User) GetEndpoint() string {\n\tif x != nil {\n\t\treturn x.Endpoint\n\t}\n\treturn \"\"\n}\n\ntype Service_Goods struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEndpoint string `protobuf:\"bytes,1,opt,name=endpoint,proto3\" json:\"endpoint,omitempty\"`\n}\n\nfunc (x *Service_Goods) Reset() {\n\t*x = Service_Goods{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[12]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Service_Goods) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Service_Goods) ProtoMessage() {}\n\nfunc (x *Service_Goods) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[12]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Service_Goods.ProtoReflect.Descriptor instead.\nfunc (*Service_Goods) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{3, 1}\n}\n\nfunc (x *Service_Goods) GetEndpoint() string {\n\tif x != nil {\n\t\treturn x.Endpoint\n\t}\n\treturn \"\"\n}\n\ntype Registry_Consul struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tAddress string `protobuf:\"bytes,1,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tScheme  string `protobuf:\"bytes,2,opt,name=scheme,proto3\" json:\"scheme,omitempty\"`\n}\n\nfunc (x *Registry_Consul) Reset() {\n\t*x = Registry_Consul{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_internal_conf_conf_proto_msgTypes[13]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Registry_Consul) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Registry_Consul) ProtoMessage() {}\n\nfunc (x *Registry_Consul) ProtoReflect() protoreflect.Message {\n\tmi := &file_internal_conf_conf_proto_msgTypes[13]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Registry_Consul.ProtoReflect.Descriptor instead.\nfunc (*Registry_Consul) Descriptor() ([]byte, []int) {\n\treturn file_internal_conf_conf_proto_rawDescGZIP(), []int{5, 0}\n}\n\nfunc (x *Registry_Consul) GetAddress() string {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn \"\"\n}\n\nfunc (x *Registry_Consul) GetScheme() string {\n\tif x != nil {\n\t\treturn x.Scheme\n\t}\n\treturn \"\"\n}\n\nvar File_internal_conf_conf_proto protoreflect.FileDescriptor\n\nvar file_internal_conf_conf_proto_rawDesc = []byte{\n\t0x0a, 0x18, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x2f,\n\t0x63, 0x6f, 0x6e, 0x66, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x73, 0x68, 0x6f, 0x70,\n\t0x2e, 0x61, 0x70, 0x69, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd1, 0x01, 0x0a, 0x09, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72,\n\t0x61, 0x70, 0x12, 0x28, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x10, 0x2e, 0x73, 0x68, 0x6f, 0x70, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65,\n\t0x72, 0x76, 0x65, 0x72, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x04,\n\t0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x73, 0x68, 0x6f,\n\t0x70, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61,\n\t0x12, 0x25, 0x0a, 0x05, 0x74, 0x72, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x0f, 0x2e, 0x73, 0x68, 0x6f, 0x70, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65,\n\t0x52, 0x05, 0x74, 0x72, 0x61, 0x63, 0x65, 0x12, 0x22, 0x0a, 0x04, 0x61, 0x75, 0x74, 0x68, 0x18,\n\t0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x73, 0x68, 0x6f, 0x70, 0x2e, 0x61, 0x70, 0x69,\n\t0x2e, 0x41, 0x75, 0x74, 0x68, 0x52, 0x04, 0x61, 0x75, 0x74, 0x68, 0x12, 0x2b, 0x0a, 0x07, 0x73,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x73,\n\t0x68, 0x6f, 0x70, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52,\n\t0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0xb4, 0x02, 0x0a, 0x06, 0x53, 0x65, 0x72,\n\t0x76, 0x65, 0x72, 0x12, 0x29, 0x0a, 0x04, 0x68, 0x74, 0x74, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x15, 0x2e, 0x73, 0x68, 0x6f, 0x70, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72,\n\t0x76, 0x65, 0x72, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x52, 0x04, 0x68, 0x74, 0x74, 0x70, 0x12, 0x29,\n\t0x0a, 0x04, 0x67, 0x72, 0x70, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x73,\n\t0x68, 0x6f, 0x70, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x47,\n\t0x52, 0x50, 0x43, 0x52, 0x04, 0x67, 0x72, 0x70, 0x63, 0x1a, 0x69, 0x0a, 0x04, 0x48, 0x54, 0x54,\n\t0x50, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x61,\n\t0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12,\n\t0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,\n\t0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d,\n\t0x65, 0x6f, 0x75, 0x74, 0x1a, 0x69, 0x0a, 0x04, 0x47, 0x52, 0x50, 0x43, 0x12, 0x18, 0x0a, 0x07,\n\t0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e,\n\t0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69,\n\t0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22,\n\t0xd9, 0x02, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61,\n\t0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x73, 0x68, 0x6f,\n\t0x70, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62,\n\t0x61, 0x73, 0x65, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x2a, 0x0a,\n\t0x05, 0x72, 0x65, 0x64, 0x69, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x73,\n\t0x68, 0x6f, 0x70, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x64,\n\t0x69, 0x73, 0x52, 0x05, 0x72, 0x65, 0x64, 0x69, 0x73, 0x1a, 0x3a, 0x0a, 0x08, 0x44, 0x61, 0x74,\n\t0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x12, 0x16, 0x0a,\n\t0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73,\n\t0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0xb3, 0x01, 0x0a, 0x05, 0x52, 0x65, 0x64, 0x69, 0x73, 0x12,\n\t0x18, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x64, 0x64,\n\t0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x3c, 0x0a,\n\t0x0c, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b,\n\t0x72, 0x65, 0x61, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x3e, 0x0a, 0x0d, 0x77,\n\t0x72, 0x69, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x04, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x77,\n\t0x72, 0x69, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0xad, 0x01, 0x0a, 0x07,\n\t0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x2a, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x73, 0x68, 0x6f, 0x70, 0x2e, 0x61, 0x70, 0x69,\n\t0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75,\n\t0x73, 0x65, 0x72, 0x12, 0x2d, 0x0a, 0x05, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x17, 0x2e, 0x73, 0x68, 0x6f, 0x70, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65,\n\t0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x47, 0x6f, 0x6f, 0x64, 0x73, 0x52, 0x05, 0x67, 0x6f, 0x6f,\n\t0x64, 0x73, 0x1a, 0x22, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e,\n\t0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e,\n\t0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x1a, 0x23, 0x0a, 0x05, 0x47, 0x6f, 0x6f, 0x64, 0x73, 0x12,\n\t0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0x23, 0x0a, 0x05, 0x54,\n\t0x72, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74,\n\t0x22, 0x79, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x12, 0x31, 0x0a, 0x06,\n\t0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x73,\n\t0x68, 0x6f, 0x70, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79,\n\t0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x1a,\n\t0x3a, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64,\n\t0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72,\n\t0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x22, 0x1f, 0x0a, 0x04, 0x41,\n\t0x75, 0x74, 0x68, 0x12, 0x17, 0x0a, 0x07, 0x6a, 0x77, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6a, 0x77, 0x74, 0x4b, 0x65, 0x79, 0x42, 0x19, 0x5a, 0x17,\n\t0x73, 0x68, 0x6f, 0x70, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x63, 0x6f,\n\t0x6e, 0x66, 0x3b, 0x63, 0x6f, 0x6e, 0x66, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_internal_conf_conf_proto_rawDescOnce sync.Once\n\tfile_internal_conf_conf_proto_rawDescData = file_internal_conf_conf_proto_rawDesc\n)\n\nfunc file_internal_conf_conf_proto_rawDescGZIP() []byte {\n\tfile_internal_conf_conf_proto_rawDescOnce.Do(func() {\n\t\tfile_internal_conf_conf_proto_rawDescData = protoimpl.X.CompressGZIP(file_internal_conf_conf_proto_rawDescData)\n\t})\n\treturn file_internal_conf_conf_proto_rawDescData\n}\n\nvar file_internal_conf_conf_proto_msgTypes = make([]protoimpl.MessageInfo, 14)\nvar file_internal_conf_conf_proto_goTypes = []interface{}{\n\t(*Bootstrap)(nil),           // 0: shop.api.Bootstrap\n\t(*Server)(nil),              // 1: shop.api.Server\n\t(*Data)(nil),                // 2: shop.api.Data\n\t(*Service)(nil),             // 3: shop.api.Service\n\t(*Trace)(nil),               // 4: shop.api.Trace\n\t(*Registry)(nil),            // 5: shop.api.Registry\n\t(*Auth)(nil),                // 6: shop.api.Auth\n\t(*Server_HTTP)(nil),         // 7: shop.api.Server.HTTP\n\t(*Server_GRPC)(nil),         // 8: shop.api.Server.GRPC\n\t(*Data_Database)(nil),       // 9: shop.api.Data.Database\n\t(*Data_Redis)(nil),          // 10: shop.api.Data.Redis\n\t(*Service_User)(nil),        // 11: shop.api.Service.User\n\t(*Service_Goods)(nil),       // 12: shop.api.Service.Goods\n\t(*Registry_Consul)(nil),     // 13: shop.api.Registry.Consul\n\t(*durationpb.Duration)(nil), // 14: google.protobuf.Duration\n}\nvar file_internal_conf_conf_proto_depIdxs = []int32{\n\t1,  // 0: shop.api.Bootstrap.s:type_name -> shop.api.Server\n\t2,  // 1: shop.api.Bootstrap.data:type_name -> shop.api.Data\n\t4,  // 2: shop.api.Bootstrap.trace:type_name -> shop.api.Trace\n\t6,  // 3: shop.api.Bootstrap.auth:type_name -> shop.api.Auth\n\t3,  // 4: shop.api.Bootstrap.service:type_name -> shop.api.Service\n\t7,  // 5: shop.api.Server.http:type_name -> shop.api.Server.HTTP\n\t8,  // 6: shop.api.Server.grpc:type_name -> shop.api.Server.GRPC\n\t9,  // 7: shop.api.Data.database:type_name -> shop.api.Data.Database\n\t10, // 8: shop.api.Data.redis:type_name -> shop.api.Data.Redis\n\t11, // 9: shop.api.Service.user:type_name -> shop.api.Service.User\n\t12, // 10: shop.api.Service.goods:type_name -> shop.api.Service.Goods\n\t13, // 11: shop.api.Registry.consul:type_name -> shop.api.Registry.Consul\n\t14, // 12: shop.api.Server.HTTP.timeout:type_name -> google.protobuf.Duration\n\t14, // 13: shop.api.Server.GRPC.timeout:type_name -> google.protobuf.Duration\n\t14, // 14: shop.api.Data.Redis.read_timeout:type_name -> google.protobuf.Duration\n\t14, // 15: shop.api.Data.Redis.write_timeout:type_name -> google.protobuf.Duration\n\t16, // [16:16] is the sub-list for method output_type\n\t16, // [16:16] is the sub-list for method input_type\n\t16, // [16:16] is the sub-list for extension type_name\n\t16, // [16:16] is the sub-list for extension extendee\n\t0,  // [0:16] is the sub-list for field type_name\n}\n\nfunc init() { file_internal_conf_conf_proto_init() }\nfunc file_internal_conf_conf_proto_init() {\n\tif File_internal_conf_conf_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_internal_conf_conf_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Bootstrap); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Server); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Data); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Service); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Trace); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Registry); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Auth); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Server_HTTP); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Server_GRPC); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Data_Database); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Data_Redis); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Service_User); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Service_Goods); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_internal_conf_conf_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Registry_Consul); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_internal_conf_conf_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   14,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_internal_conf_conf_proto_goTypes,\n\t\tDependencyIndexes: file_internal_conf_conf_proto_depIdxs,\n\t\tMessageInfos:      file_internal_conf_conf_proto_msgTypes,\n\t}.Build()\n\tFile_internal_conf_conf_proto = out.File\n\tfile_internal_conf_conf_proto_rawDesc = nil\n\tfile_internal_conf_conf_proto_goTypes = nil\n\tfile_internal_conf_conf_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "shop/internal/conf/conf.proto",
    "content": "syntax = \"proto3\";\npackage shop.api;\n\noption go_package = \"shop/internal/conf;conf\";\n\nimport \"google/protobuf/duration.proto\";\n\nmessage Bootstrap {\n  Server server = 1;\n  Data data = 2;\n  Trace trace = 3;\n  Auth auth = 4;\n  Service service = 5;\n}\n\nmessage Server {\n  message HTTP {\n    string network = 1;\n    string addr = 2;\n    google.protobuf.Duration timeout = 3;\n  }\n  message GRPC {\n    string network = 1;\n    string addr = 2;\n    google.protobuf.Duration timeout = 3;\n  }\n  HTTP http = 1;\n  GRPC grpc = 2;\n}\n\nmessage Data {\n  message Database {\n    string driver = 1;\n    string source = 2;\n  }\n  message Redis {\n    string network = 1;\n    string addr = 2;\n    google.protobuf.Duration read_timeout = 3;\n    google.protobuf.Duration write_timeout = 4;\n  }\n  Database database = 1;\n  Redis redis = 2;\n}\n\nmessage Service {\n  message User {\n    string endpoint = 1;\n  }\n  message Goods {\n    string endpoint = 1;\n  }\n  User user = 1;\n  Goods goods = 2;\n}\n\nmessage Trace {\n  string endpoint = 1;\n}\n\n\nmessage Registry {\n  message Consul {\n    string address = 1;\n    string scheme = 2;\n  }\n  Consul consul = 1;\n}\n\nmessage Auth {\n  string jwt_key = 1;\n}\n"
  },
  {
    "path": "shop/internal/data/README.md",
    "content": "# Data\n"
  },
  {
    "path": "shop/internal/data/address.go",
    "content": "package data\n\nimport (\n\t\"context\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\taddressService \"shop/api/service/user/v1\"\n\t\"shop/internal/biz\"\n)\n\ntype addressRepo struct {\n\tdata *Data\n\tlog  *log.Helper\n}\n\nfunc NewAddressRepo(data *Data, logger log.Logger) biz.AddressRepo {\n\treturn &addressRepo{\n\t\tdata: data,\n\t\tlog:  log.NewHelper(log.With(logger, \"module\", \"repo/address\")),\n\t}\n}\n\nfunc (a *addressRepo) CreateAddress(c context.Context, address *biz.Address) (*biz.Address, error) {\n\tcreateAddress, err := a.data.uc.CreateAddress(c, &addressService.CreateAddressReq{\n\t\tUid:       address.UserID,\n\t\tName:      address.Name,\n\t\tMobile:    address.Mobile,\n\t\tProvince:  address.Province,\n\t\tCity:      address.City,\n\t\tDistricts: address.Districts,\n\t\tAddress:   address.Address,\n\t\tPostCode:  address.PostCode,\n\t\tIsDefault: int32(address.IsDefault),\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tres := &biz.Address{\n\t\tID:        createAddress.Id,\n\t\tIsDefault: createAddress.IsDefault,\n\t\tMobile:    createAddress.Mobile,\n\t\tName:      createAddress.Name,\n\t\tProvince:  createAddress.Province,\n\t\tCity:      createAddress.City,\n\t\tDistricts: createAddress.Districts,\n\t\tAddress:   createAddress.Address,\n\t\tPostCode:  createAddress.PostCode,\n\t}\n\treturn res, nil\n}\n\nfunc (a *addressRepo) DeleteAddress(ctx context.Context, address *biz.Address) error {\n\t_, err := a.data.uc.DeleteAddress(ctx, &addressService.AddressReq{\n\t\tId:  address.ID,\n\t\tUid: address.UserID,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (a *addressRepo) DefaultAddress(ctx context.Context, address *biz.Address) error {\n\t_, err := a.data.uc.DefaultAddress(ctx, &addressService.AddressReq{\n\t\tId:  address.ID,\n\t\tUid: address.UserID,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (a *addressRepo) UpdateAddress(c context.Context, address *biz.Address) error {\n\t_, err := a.data.uc.UpdateAddress(c, &addressService.UpdateAddressReq{\n\t\tId:        address.ID,\n\t\tUid:       address.UserID,\n\t\tName:      address.Name,\n\t\tMobile:    address.Mobile,\n\t\tProvince:  address.Province,\n\t\tCity:      address.City,\n\t\tDistricts: address.Districts,\n\t\tAddress:   address.Address,\n\t\tPostCode:  address.PostCode,\n\t\tIsDefault: int32(address.IsDefault),\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (a *addressRepo) AddressListByUid(ctx context.Context, uid int64) ([]*biz.Address, error) {\n\taddressList, err := a.data.uc.ListAddress(ctx, &addressService.ListAddressReq{\n\t\tUid: uid,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvar res []*biz.Address\n\tfor _, v := range addressList.Results {\n\t\taddressTmp := &biz.Address{\n\t\t\tID:        v.Id,\n\t\t\tUserID:    uid,\n\t\t\tIsDefault: v.IsDefault,\n\t\t\tMobile:    v.Mobile,\n\t\t\tName:      v.Name,\n\t\t\tProvince:  v.Province,\n\t\t\tCity:      v.City,\n\t\t\tDistricts: v.Districts,\n\t\t\tAddress:   v.Address,\n\t\t\tPostCode:  v.PostCode,\n\t\t}\n\t\tres = append(res, addressTmp)\n\t}\n\treturn res, nil\n}\n"
  },
  {
    "path": "shop/internal/data/data.go",
    "content": "package data\n\nimport (\n\t\"context\"\n\tconsul \"github.com/go-kratos/kratos/contrib/registry/consul/v2\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"github.com/go-kratos/kratos/v2/middleware/recovery\"\n\t\"github.com/go-kratos/kratos/v2/middleware/tracing\"\n\t\"github.com/go-kratos/kratos/v2/registry\"\n\t\"github.com/go-kratos/kratos/v2/transport/grpc\"\n\t\"github.com/google/wire\"\n\tconsulAPI \"github.com/hashicorp/consul/api\"\n\tgrpcx \"google.golang.org/grpc\"\n\tuserV1 \"shop/api/service/user/v1\"\n\t\"shop/internal/conf\"\n\t\"time\"\n)\n\n// ProviderSet is data providers.\nvar ProviderSet = wire.NewSet(NewData, NewUserRepo, NewAddressRepo, NewUserServiceClient, NewRegistrar, NewDiscovery)\n\n// Data .\ntype Data struct {\n\tlog *log.Helper\n\tuc  userV1.UserClient\n}\n\n// NewData .\nfunc NewData(c *conf.Data, uc userV1.UserClient, logger log.Logger) (*Data, error) {\n\tl := log.NewHelper(log.With(logger, \"module\", \"data\"))\n\treturn &Data{log: l, uc: uc}, nil\n}\n\n// NewUserServiceClient 链接用户服务 grpc\nfunc NewUserServiceClient(ac *conf.Auth, sr *conf.Service, rr registry.Discovery) userV1.UserClient {\n\tconn, err := grpc.DialInsecure(\n\t\tcontext.Background(),\n\t\tgrpc.WithEndpoint(sr.User.Endpoint),\n\t\tgrpc.WithDiscovery(rr),\n\t\tgrpc.WithMiddleware(\n\t\t\ttracing.Client(),\n\t\t\trecovery.Recovery(),\n\t\t),\n\t\tgrpc.WithTimeout(2*time.Second),\n\t\tgrpc.WithOptions(grpcx.WithStatsHandler(&tracing.ClientHandler{})),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tc := userV1.NewUserClient(conn)\n\treturn c\n}\n\n// NewRegistrar add consul\nfunc NewRegistrar(conf *conf.Registry) registry.Registrar {\n\tc := consulAPI.DefaultConfig()\n\tc.Address = conf.Consul.Address\n\tc.Scheme = conf.Consul.Scheme\n\tcli, err := consulAPI.NewClient(c)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tr := consul.New(cli, consul.WithHealthCheck(false))\n\treturn r\n}\n\nfunc NewDiscovery(conf *conf.Registry) registry.Discovery {\n\tc := consulAPI.DefaultConfig()\n\tc.Address = conf.Consul.Address\n\tc.Scheme = conf.Consul.Scheme\n\tcli, err := consulAPI.NewClient(c)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tr := consul.New(cli, consul.WithHealthCheck(false))\n\treturn r\n}\n"
  },
  {
    "path": "shop/internal/data/user.go",
    "content": "package data\n\nimport (\n\t\"context\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\tuserService \"shop/api/service/user/v1\"\n\t\"shop/internal/biz\"\n)\n\ntype userRepo struct {\n\tdata *Data\n\tlog  *log.Helper\n}\n\n// NewUserRepo .\nfunc NewUserRepo(data *Data, logger log.Logger) biz.UserRepo {\n\treturn &userRepo{\n\t\tdata: data,\n\t\tlog:  log.NewHelper(log.With(logger, \"module\", \"repo/user\")),\n\t}\n}\n\nfunc (u *userRepo) CreateUser(c context.Context, user *biz.User) (*biz.User, error) {\n\tcreateUser, err := u.data.uc.CreateUser(c, &userService.CreateUserInfo{\n\t\tNickName: user.NickName,\n\t\tPassword: user.Password,\n\t\tMobile:   user.Mobile,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &biz.User{\n\t\tID:       createUser.Id,\n\t\tMobile:   createUser.Mobile,\n\t\tNickName: createUser.NickName,\n\t}, nil\n}\n\nfunc (u *userRepo) UserByMobile(c context.Context, mobile string) (*biz.User, error) {\n\tbyMobile, err := u.data.uc.GetUserByMobile(c, &userService.MobileRequest{Mobile: mobile})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &biz.User{\n\t\tMobile:   byMobile.Mobile,\n\t\tID:       byMobile.Id,\n\t\tPassword: byMobile.Password,\n\t\tNickName: byMobile.NickName,\n\t}, nil\n}\n\nfunc (u *userRepo) CheckPassword(c context.Context, password, encryptedPassword string) (bool, error) {\n\tif byMobile, err := u.data.uc.CheckPassword(c, &userService.PasswordCheckInfo{Password: password, EncryptedPassword: encryptedPassword}); err != nil {\n\t\treturn false, err\n\t} else {\n\t\treturn byMobile.Success, nil\n\t}\n}\n\nfunc (u *userRepo) UserById(c context.Context, id int64) (*biz.User, error) {\n\tuser, err := u.data.uc.GetUserById(c, &userService.IdRequest{Id: id})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &biz.User{\n\t\tID:       user.Id,\n\t\tMobile:   user.Mobile,\n\t\tNickName: user.NickName,\n\t\tGender:   user.Gender,\n\t\tRole:     int(user.Role),\n\t\tBirthday: int64(user.Birthday),\n\t}, nil\n}\n"
  },
  {
    "path": "shop/internal/pkg/captcha/captcha.go",
    "content": "package captcha\n\nimport (\n\t\"context\"\n\t\"github.com/mojocn/base64Captcha\"\n)\n\nvar Store = base64Captcha.DefaultMemStore\n\ntype CaptchaInfo struct {\n\tCaptchaId string\n\tPicPath   string\n}\n\n// GetCaptcha 生成验证码\nfunc GetCaptcha(ctx context.Context) (*CaptchaInfo, error) {\n\tdriver := base64Captcha.NewDriverDigit(80, 250, 5, 0.7, 80)\n\tcp := base64Captcha.NewCaptcha(driver, Store)\n\tid, b64s, err := cp.Generate()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &CaptchaInfo{\n\t\tCaptchaId: id,\n\t\tPicPath:   b64s,\n\t}, nil\n}\n"
  },
  {
    "path": "shop/internal/pkg/middleware/auth/auth.go",
    "content": "package auth\n\nimport (\n\t\"errors\"\n\t\"github.com/golang-jwt/jwt/v4\"\n)\n\ntype CustomClaims struct {\n\tID          int64\n\tNickName    string\n\tAuthorityId int\n\tjwt.StandardClaims\n}\n\n// CreateToken generate token\nfunc CreateToken(c CustomClaims, key string) (string, error) {\n\tclaims := jwt.NewWithClaims(jwt.SigningMethodHS256, c)\n\tsignedString, err := claims.SignedString([]byte(key))\n\tif err != nil {\n\t\treturn \"\", errors.New(\"generate token failed\" + err.Error())\n\t}\n\treturn signedString, nil\n}\n"
  },
  {
    "path": "shop/internal/server/grpc.go",
    "content": "package server\n\nimport (\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"github.com/go-kratos/kratos/v2/middleware/recovery\"\n\t\"github.com/go-kratos/kratos/v2/transport/grpc\"\n\tv1 \"shop/api/shop/v1\"\n\t\"shop/internal/conf\"\n\t\"shop/internal/service\"\n)\n\n// NewGRPCServer new a gRPC s.\nfunc NewGRPCServer(c *conf.Server, s *service.ShopService, logger log.Logger) *grpc.Server {\n\tvar opts = []grpc.ServerOption{\n\t\tgrpc.Middleware(\n\t\t\trecovery.Recovery(),\n\t\t),\n\t}\n\tif c.Grpc.Network != \"\" {\n\t\topts = append(opts, grpc.Network(c.Grpc.Network))\n\t}\n\tif c.Grpc.Addr != \"\" {\n\t\topts = append(opts, grpc.Address(c.Grpc.Addr))\n\t}\n\tif c.Grpc.Timeout != nil {\n\t\topts = append(opts, grpc.Timeout(c.Grpc.Timeout.AsDuration()))\n\t}\n\tsrv := grpc.NewServer(opts...)\n\tv1.RegisterShopServer(srv, s)\n\treturn srv\n}\n"
  },
  {
    "path": "shop/internal/server/http.go",
    "content": "package server\n\nimport (\n\t\"context\"\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"github.com/go-kratos/kratos/v2/middleware/auth/jwt\"\n\t\"github.com/go-kratos/kratos/v2/middleware/logging\"\n\t\"github.com/go-kratos/kratos/v2/middleware/recovery\"\n\t\"github.com/go-kratos/kratos/v2/middleware/selector\"\n\t\"github.com/go-kratos/kratos/v2/middleware/tracing\"\n\t\"github.com/go-kratos/kratos/v2/middleware/validate\"\n\t\"github.com/go-kratos/kratos/v2/transport/http\"\n\tjwt2 \"github.com/golang-jwt/jwt/v4\"\n\t\"github.com/gorilla/handlers\"\n\tv1 \"shop/api/shop/v1\"\n\t\"shop/internal/conf\"\n\t\"shop/internal/service\"\n)\n\n// NewHTTPServer new an HTTP s.\nfunc NewHTTPServer(c *conf.Server, ac *conf.Auth, s *service.ShopService, logger log.Logger) *http.Server {\n\tvar opts = []http.ServerOption{\n\t\thttp.Middleware(\n\t\t\trecovery.Recovery(),\n\t\t\tvalidate.Validator(),\n\t\t\ttracing.Server(),\n\t\t\tselector.Server(\n\t\t\t\tjwt.Server(func(token *jwt2.Token) (interface{}, error) {\n\t\t\t\t\treturn []byte(ac.JwtKey), nil\n\t\t\t\t}, jwt.WithSigningMethod(jwt2.SigningMethodHS256)),\n\t\t\t).Match(NewWhiteListMatcher()).Build(),\n\t\t\tlogging.Server(logger),\n\t\t),\n\t\thttp.Filter(handlers.CORS(\n\t\t\thandlers.AllowedHeaders([]string{\"X-Requested-With\", \"Content-Type\", \"Authorization\"}),\n\t\t\thandlers.AllowedMethods([]string{\"GET\", \"POST\", \"PUT\", \"HEAD\", \"OPTIONS\"}),\n\t\t\thandlers.AllowedOrigins([]string{\"*\"}),\n\t\t)),\n\t}\n\tif c.Http.Network != \"\" {\n\t\topts = append(opts, http.Network(c.Http.Network))\n\t}\n\tif c.Http.Addr != \"\" {\n\t\topts = append(opts, http.Address(c.Http.Addr))\n\t}\n\tif c.Http.Timeout != nil {\n\t\topts = append(opts, http.Timeout(c.Http.Timeout.AsDuration()))\n\t}\n\tsrv := http.NewServer(opts...)\n\tv1.RegisterShopHTTPServer(srv, s)\n\treturn srv\n}\n\n// NewWhiteListMatcher 白名单不需要token验证的接口\nfunc NewWhiteListMatcher() selector.MatchFunc {\n\twhiteList := make(map[string]struct{})\n\twhiteList[\"/shop.shop.v1.Shop/Captcha\"] = struct{}{}\n\twhiteList[\"/shop.shop.v1.Shop/Login\"] = struct{}{}\n\twhiteList[\"/shop.shop.v1.Shop/Register\"] = struct{}{}\n\treturn func(ctx context.Context, operation string) bool {\n\t\tif _, ok := whiteList[operation]; ok {\n\t\t\treturn false\n\t\t}\n\t\treturn true\n\t}\n}\n"
  },
  {
    "path": "shop/internal/server/server.go",
    "content": "package server\n\nimport (\n\t\"github.com/google/wire\"\n)\n\n// ProviderSet is s providers.\nvar ProviderSet = wire.NewSet(NewHTTPServer, NewGRPCServer)\n"
  },
  {
    "path": "shop/internal/service/README.md",
    "content": "# Service\n"
  },
  {
    "path": "shop/internal/service/service.go",
    "content": "package service\n\nimport (\n\t\"github.com/go-kratos/kratos/v2/log\"\n\t\"github.com/google/wire\"\n\tv1 \"shop/api/shop/v1\"\n\t\"shop/internal/biz\"\n)\n\n// ProviderSet is service providers.\nvar ProviderSet = wire.NewSet(NewShopService)\n\n// ShopService is a shop service.\ntype ShopService struct {\n\tv1.UnimplementedShopServer\n\n\tuc  *biz.UserUsecase\n\tua  *biz.AddressUsecase\n\tlog *log.Helper\n}\n\n// NewShopService new a shop service.\nfunc NewShopService(uc *biz.UserUsecase, ua *biz.AddressUsecase, logger log.Logger) *ShopService {\n\treturn &ShopService{\n\t\tuc:  uc,\n\t\tua:  ua,\n\t\tlog: log.NewHelper(log.With(logger, \"module\", \"service/shop\")),\n\t}\n}\n"
  },
  {
    "path": "shop/internal/service/user.go",
    "content": "package service\n\nimport (\n\t\"context\"\n\t\"go.opentelemetry.io/otel\"\n\t\"google.golang.org/protobuf/types/known/emptypb\"\n\t\"shop/internal/biz\"\n\n\tv1 \"shop/api/shop/v1\"\n)\n\nfunc (s *ShopService) Register(ctx context.Context, req *v1.RegisterReq) (*v1.RegisterReply, error) {\n\t//  add trace\n\ttr := otel.Tracer(\"service\")\n\tctx, span := tr.Start(ctx, \"get user info by mobile\")\n\tspan.SpanContext()\n\tdefer span.End()\n\n\treturn s.uc.CreateUser(ctx, req)\n}\n\nfunc (s *ShopService) Login(ctx context.Context, req *v1.LoginReq) (*v1.RegisterReply, error) {\n\treturn s.uc.PassWordLogin(ctx, req)\n}\n\nfunc (s *ShopService) Captcha(ctx context.Context, r *emptypb.Empty) (*v1.CaptchaReply, error) {\n\treturn s.uc.GetCaptcha(ctx)\n}\n\nfunc (s *ShopService) Detail(ctx context.Context, r *emptypb.Empty) (*v1.UserDetailResponse, error) {\n\treturn s.uc.UserDetailByID(ctx)\n}\n\nfunc (s *ShopService) CreateAddress(ctx context.Context, r *v1.CreateAddressReq) (*v1.AddressInfo, error) {\n\treturn s.ua.CreateAddress(ctx, r)\n}\n\nfunc (s *ShopService) AddressListByUid(ctx context.Context, empty *emptypb.Empty) (*v1.ListAddressReply, error) {\n\treturn s.ua.AddressListByUid(ctx)\n}\n\nfunc (s *ShopService) UpdateAddress(ctx context.Context, r *v1.UpdateAddressReq) (*v1.CheckResponse, error) {\n\treq := toBizAddress(r)\n\taddress, err := s.ua.UpdateAddress(ctx, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &v1.CheckResponse{Success: address}, nil\n}\n\nfunc toBizAddress(r *v1.UpdateAddressReq) *biz.Address {\n\treturn &biz.Address{\n\t\tID:        r.Id,\n\t\tIsDefault: r.IsDefault,\n\t\tMobile:    r.Mobile,\n\t\tName:      r.Name,\n\t\tProvince:  r.Province,\n\t\tCity:      r.City,\n\t\tDistricts: r.Districts,\n\t\tAddress:   r.Address,\n\t\tPostCode:  r.PostCode,\n\t}\n}\n\nfunc (s *ShopService) DefaultAddress(ctx context.Context, r *v1.AddressReq) (*v1.CheckResponse, error) {\n\n\taddress, err := s.ua.DefaultAddress(ctx, &biz.Address{\n\t\tID: r.Id,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &v1.CheckResponse{Success: address}, nil\n}\n\nfunc (s *ShopService) DeleteAddress(ctx context.Context, r *v1.AddressReq) (*v1.CheckResponse, error) {\n\taddress, err := s.ua.DeleteAddress(ctx, &biz.Address{\n\t\tID: r.Id,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &v1.CheckResponse{Success: address}, nil\n}\n"
  },
  {
    "path": "shop/openapi.yaml",
    "content": "# Generated with protoc-gen-openapi\n# https://github.com/google/gnostic/tree/master/cmd/protoc-gen-openapi\n\nopenapi: 3.0.3\ninfo:\n    title: Shop API\n    description: The Shop service definition.\n    version: 0.0.1\npaths:\n    /api/address/create:\n        post:\n            tags:\n                - Shop\n            operationId: Shop_CreateAddress\n            requestBody:\n                content:\n                    application/json:\n                        schema:\n                            $ref: '#/components/schemas/CreateAddressReq'\n                required: true\n            responses:\n                \"200\":\n                    description: OK\n                    content:\n                        application/json:\n                            schema:\n                                $ref: '#/components/schemas/AddressInfo'\n                default:\n                    description: Default error response\n                    content:\n                        application/json:\n                            schema:\n                                $ref: '#/components/schemas/Status'\n    /api/address/default:\n        put:\n            tags:\n                - Shop\n            operationId: Shop_DefaultAddress\n            requestBody:\n                content:\n                    application/json:\n                        schema:\n                            $ref: '#/components/schemas/AddressReq'\n                required: true\n            responses:\n                \"200\":\n                    description: OK\n                    content:\n                        application/json:\n                            schema:\n                                $ref: '#/components/schemas/CheckResponse'\n                default:\n                    description: Default error response\n                    content:\n                        application/json:\n                            schema:\n                                $ref: '#/components/schemas/Status'\n    /api/address/delete:\n        delete:\n            tags:\n                - Shop\n            operationId: Shop_DeleteAddress\n            parameters:\n                - name: id\n                  in: query\n                  schema:\n                    type: integer\n                    format: int64\n                - name: uid\n                  in: query\n                  schema:\n                    type: integer\n                    format: int64\n            responses:\n                \"200\":\n                    description: OK\n                    content:\n                        application/json:\n                            schema:\n                                $ref: '#/components/schemas/CheckResponse'\n                default:\n                    description: Default error response\n                    content:\n                        application/json:\n                            schema:\n                                $ref: '#/components/schemas/Status'\n    /api/address/list/uid:\n        get:\n            tags:\n                - Shop\n            operationId: Shop_AddressListByUid\n            responses:\n                \"200\":\n                    description: OK\n                    content:\n                        application/json:\n                            schema:\n                                $ref: '#/components/schemas/ListAddressReply'\n                default:\n                    description: Default error response\n                    content:\n                        application/json:\n                            schema:\n                                $ref: '#/components/schemas/Status'\n    /api/address/update:\n        put:\n            tags:\n                - Shop\n            operationId: Shop_UpdateAddress\n            requestBody:\n                content:\n                    application/json:\n                        schema:\n                            $ref: '#/components/schemas/UpdateAddressReq'\n                required: true\n            responses:\n                \"200\":\n                    description: OK\n                    content:\n                        application/json:\n                            schema:\n                                $ref: '#/components/schemas/CheckResponse'\n                default:\n                    description: Default error response\n                    content:\n                        application/json:\n                            schema:\n                                $ref: '#/components/schemas/Status'\n    /api/users/captcha:\n        get:\n            tags:\n                - Shop\n            operationId: Shop_Captcha\n            responses:\n                \"200\":\n                    description: OK\n                    content:\n                        application/json:\n                            schema:\n                                $ref: '#/components/schemas/CaptchaReply'\n                default:\n                    description: Default error response\n                    content:\n                        application/json:\n                            schema:\n                                $ref: '#/components/schemas/Status'\n    /api/users/detail:\n        get:\n            tags:\n                - Shop\n            operationId: Shop_Detail\n            responses:\n                \"200\":\n                    description: OK\n                    content:\n                        application/json:\n                            schema:\n                                $ref: '#/components/schemas/UserDetailResponse'\n                default:\n                    description: Default error response\n                    content:\n                        application/json:\n                            schema:\n                                $ref: '#/components/schemas/Status'\n    /api/users/login:\n        post:\n            tags:\n                - Shop\n            operationId: Shop_Login\n            requestBody:\n                content:\n                    application/json:\n                        schema:\n                            $ref: '#/components/schemas/LoginReq'\n                required: true\n            responses:\n                \"200\":\n                    description: OK\n                    content:\n                        application/json:\n                            schema:\n                                $ref: '#/components/schemas/RegisterReply'\n                default:\n                    description: Default error response\n                    content:\n                        application/json:\n                            schema:\n                                $ref: '#/components/schemas/Status'\n    /api/users/register:\n        post:\n            tags:\n                - Shop\n            operationId: Shop_Register\n            requestBody:\n                content:\n                    application/json:\n                        schema:\n                            $ref: '#/components/schemas/RegisterReq'\n                required: true\n            responses:\n                \"200\":\n                    description: OK\n                    content:\n                        application/json:\n                            schema:\n                                $ref: '#/components/schemas/RegisterReply'\n                default:\n                    description: Default error response\n                    content:\n                        application/json:\n                            schema:\n                                $ref: '#/components/schemas/Status'\ncomponents:\n    schemas:\n        AddressInfo:\n            type: object\n            properties:\n                id:\n                    type: integer\n                    format: int64\n                name:\n                    type: string\n                mobile:\n                    type: string\n                Province:\n                    type: string\n                City:\n                    type: string\n                Districts:\n                    type: string\n                address:\n                    type: string\n                postCode:\n                    type: string\n                isDefault:\n                    type: integer\n                    format: int32\n        AddressReq:\n            type: object\n            properties:\n                id:\n                    type: integer\n                    format: int64\n                uid:\n                    type: integer\n                    format: int64\n        CaptchaReply:\n            type: object\n            properties:\n                captchaId:\n                    type: string\n                picPath:\n                    type: string\n        CheckResponse:\n            type: object\n            properties:\n                success:\n                    type: boolean\n        CreateAddressReq:\n            type: object\n            properties:\n                uid:\n                    type: integer\n                    format: int64\n                name:\n                    type: string\n                mobile:\n                    type: string\n                Province:\n                    type: string\n                City:\n                    type: string\n                Districts:\n                    type: string\n                address:\n                    type: string\n                postCode:\n                    type: string\n                isDefault:\n                    type: integer\n                    format: int32\n        GoogleProtobufAny:\n            type: object\n            properties:\n                '@type':\n                    type: string\n                    description: The type of the serialized message.\n            additionalProperties: true\n            description: Contains an arbitrary serialized message along with a @type that describes the type of the serialized message.\n        ListAddressReply:\n            type: object\n            properties:\n                results:\n                    type: array\n                    items:\n                        $ref: '#/components/schemas/AddressInfo'\n        LoginReq:\n            type: object\n            properties:\n                mobile:\n                    type: string\n                password:\n                    type: string\n                captcha:\n                    type: string\n                captchaId:\n                    type: string\n        RegisterReply:\n            type: object\n            properties:\n                id:\n                    type: integer\n                    format: int64\n                mobile:\n                    type: string\n                username:\n                    type: string\n                token:\n                    type: string\n                expiredAt:\n                    type: integer\n                    format: int64\n            description: Data returned by registration and login\n        RegisterReq:\n            type: object\n            properties:\n                mobile:\n                    type: string\n                username:\n                    type: string\n                password:\n                    type: string\n        Status:\n            type: object\n            properties:\n                code:\n                    type: integer\n                    description: The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code].\n                    format: int32\n                message:\n                    type: string\n                    description: A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client.\n                details:\n                    type: array\n                    items:\n                        $ref: '#/components/schemas/GoogleProtobufAny'\n                    description: A list of messages that carry the error details.  There is a common set of message types for APIs to use.\n            description: 'The `Status` type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by [gRPC](https://github.com/grpc). Each `Status` message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the [API Design Guide](https://cloud.google.com/apis/design/errors).'\n        UpdateAddressReq:\n            type: object\n            properties:\n                uid:\n                    type: integer\n                    format: int64\n                name:\n                    type: string\n                mobile:\n                    type: string\n                Province:\n                    type: string\n                City:\n                    type: string\n                Districts:\n                    type: string\n                address:\n                    type: string\n                postCode:\n                    type: string\n                isDefault:\n                    type: integer\n                    format: int32\n                id:\n                    type: integer\n                    format: int64\n        UserDetailResponse:\n            type: object\n            properties:\n                id:\n                    type: integer\n                    format: int64\n                mobile:\n                    type: string\n                nickName:\n                    type: string\n                birthday:\n                    type: integer\n                    format: int64\n                gender:\n                    type: string\n                role:\n                    type: integer\n                    format: int32\n            description: user Detail returned\ntags:\n    - name: Shop\n"
  },
  {
    "path": "shop/third_party/README.md",
    "content": "# third_party\n"
  },
  {
    "path": "shop/third_party/errors/errors.proto",
    "content": "syntax = \"proto3\";\n\npackage errors;\n\noption go_package = \"github.com/go-kratos/kratos/v2/errors;errors\";\noption java_multiple_files = true;\noption java_package = \"com.github.kratos.errors\";\noption objc_class_prefix = \"KratosErrors\";\n\nimport \"google/protobuf/descriptor.proto\";\n\nextend google.protobuf.EnumOptions {\n  int32 default_code = 1108;\n}\n\nextend google.protobuf.EnumValueOptions {\n  int32 code = 1109;\n}"
  },
  {
    "path": "shop/third_party/google/api/annotations.proto",
    "content": "// Copyright (c) 2015, Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\npackage google.api;\n\nimport \"google/api/http.proto\";\nimport \"google/protobuf/descriptor.proto\";\n\noption go_package = \"google.golang.org/genproto/googleapis/api/annotations;annotations\";\noption java_multiple_files = true;\noption java_outer_classname = \"AnnotationsProto\";\noption java_package = \"com.google.api\";\noption objc_class_prefix = \"GAPI\";\n\nextend google.protobuf.MethodOptions {\n  // See `HttpRule`.\n  HttpRule http = 72295728;\n}\n"
  },
  {
    "path": "shop/third_party/google/api/client.proto",
    "content": "// Copyright 2019 Google LLC.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\npackage google.api;\n\nimport \"google/protobuf/descriptor.proto\";\n\noption go_package = \"google.golang.org/genproto/googleapis/api/annotations;annotations\";\noption java_multiple_files = true;\noption java_outer_classname = \"ClientProto\";\noption java_package = \"com.google.api\";\noption objc_class_prefix = \"GAPI\";\n\n\nextend google.protobuf.ServiceOptions {\n  // The hostname for this service.\n  // This should be specified with no prefix or protocol.\n  //\n  // Example:\n  //\n  //   service Foo {\n  //     option (google.api.default_host) = \"foo.googleapi.com\";\n  //     ...\n  //   }\n  string default_host = 1049;\n\n  // OAuth scopes needed for the client.\n  //\n  // Example:\n  //\n  //   service Foo {\n  //     option (google.api.oauth_scopes) = \\\n  //       \"https://www.googleapis.com/auth/cloud-platform\";\n  //     ...\n  //   }\n  //\n  // If there is more than one scope, use a comma-separated string:\n  //\n  // Example:\n  //\n  //   service Foo {\n  //     option (google.api.oauth_scopes) = \\\n  //       \"https://www.googleapis.com/auth/cloud-platform,\"\n  //       \"https://www.googleapis.com/auth/monitoring\";\n  //     ...\n  //   }\n  string oauth_scopes = 1050;\n}\n\n\nextend google.protobuf.MethodOptions {\n  // A definition of a client library method signature.\n  //\n  // In client libraries, each proto RPC corresponds to one or more methods\n  // which the end user is able to call, and calls the underlying RPC.\n  // Normally, this method receives a single argument (a struct or instance\n  // corresponding to the RPC request object). Defining this field will\n  // add one or more overloads providing flattened or simpler method signatures\n  // in some languages.\n  //\n  // The fields on the method signature are provided as a comma-separated\n  // string.\n  //\n  // For example, the proto RPC and annotation:\n  //\n  //   rpc CreateSubscription(CreateSubscriptionRequest)\n  //       returns (Subscription) {\n  //     option (google.api.method_signature) = \"name,topic\";\n  //   }\n  //\n  // Would add the following Java overload (in addition to the method accepting\n  // the request object):\n  //\n  //   public final Subscription createSubscription(String name, String topic)\n  //\n  // The following backwards-compatibility guidelines apply:\n  //\n  //   * Adding this annotation to an unannotated method is backwards\n  //     compatible.\n  //   * Adding this annotation to a method which already has existing\n  //     method signature annotations is backwards compatible if and only if\n  //     the new method signature annotation is last in the sequence.\n  //   * Modifying or removing an existing method signature annotation is\n  //     a breaking change.\n  //   * Re-ordering existing method signature annotations is a breaking\n  //     change.\n  repeated string method_signature = 1051;\n}"
  },
  {
    "path": "shop/third_party/google/api/field_behavior.proto",
    "content": "// Copyright 2019 Google LLC.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\npackage google.api;\n\nimport \"google/protobuf/descriptor.proto\";\n\noption go_package = \"google.golang.org/genproto/googleapis/api/annotations;annotations\";\noption java_multiple_files = true;\noption java_outer_classname = \"FieldBehaviorProto\";\noption java_package = \"com.google.api\";\noption objc_class_prefix = \"GAPI\";\n\n\n// An indicator of the behavior of a given field (for example, that a field\n// is required in requests, or given as output but ignored as input).\n// This **does not** change the behavior in protocol buffers itself; it only\n// denotes the behavior and may affect how API tooling handles the field.\n//\n// Note: This enum **may** receive new values in the future.\nenum FieldBehavior {\n  // Conventional default for enums. Do not use this.\n  FIELD_BEHAVIOR_UNSPECIFIED = 0;\n\n  // Specifically denotes a field as optional.\n  // While all fields in protocol buffers are optional, this may be specified\n  // for emphasis if appropriate.\n  OPTIONAL = 1;\n\n  // Denotes a field as required.\n  // This indicates that the field **must** be provided as part of the request,\n  // and failure to do so will cause an error (usually `INVALID_ARGUMENT`).\n  REQUIRED = 2;\n\n  // Denotes a field as output only.\n  // This indicates that the field is provided in responses, but including the\n  // field in a request does nothing (the server *must* ignore it and\n  // *must not* throw an error as a result of the field's presence).\n  OUTPUT_ONLY = 3;\n\n  // Denotes a field as input only.\n  // This indicates that the field is provided in requests, and the\n  // corresponding field is not included in output.\n  INPUT_ONLY = 4;\n\n  // Denotes a field as immutable.\n  // This indicates that the field may be set once in a request to create a\n  // resource, but may not be changed thereafter.\n  IMMUTABLE = 5;\n}\n\n\nextend google.protobuf.FieldOptions {\n  // A designation of a specific field behavior (required, output only, etc.)\n  // in protobuf messages.\n  //\n  // Examples:\n  //\n  //   string name = 1 [(google.api.field_behavior) = REQUIRED];\n  //   State state = 1 [(google.api.field_behavior) = OUTPUT_ONLY];\n  //   google.protobuf.Duration ttl = 1\n  //     [(google.api.field_behavior) = INPUT_ONLY];\n  //   google.protobuf.Timestamp expire_time = 1\n  //     [(google.api.field_behavior) = OUTPUT_ONLY,\n  //      (google.api.field_behavior) = IMMUTABLE];\n  repeated FieldBehavior field_behavior = 1052;\n}"
  },
  {
    "path": "shop/third_party/google/api/http.proto",
    "content": "// Copyright 2020 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\npackage google.api;\n\noption cc_enable_arenas = true;\noption go_package = \"google.golang.org/genproto/googleapis/api/annotations;annotations\";\noption java_multiple_files = true;\noption java_outer_classname = \"HttpProto\";\noption java_package = \"com.google.api\";\noption objc_class_prefix = \"GAPI\";\n\n// Defines the HTTP configuration for an API service. It contains a list of\n// [HttpRule][google.api.HttpRule], each specifying the mapping of an RPC method\n// to one or more HTTP REST API methods.\nmessage Http {\n  // A list of HTTP configuration rules that apply to individual API methods.\n  //\n  // **NOTE:** All service configuration rules follow \"last one wins\" order.\n  repeated HttpRule rules = 1;\n\n  // When set to true, URL path parameters will be fully URI-decoded except in\n  // cases of single segment matches in reserved expansion, where \"%2F\" will be\n  // left encoded.\n  //\n  // The default behavior is to not decode RFC 6570 reserved characters in multi\n  // segment matches.\n  bool fully_decode_reserved_expansion = 2;\n}\n\n// # gRPC Transcoding\n//\n// gRPC Transcoding is a feature for mapping between a gRPC method and one or\n// more HTTP REST endpoints. It allows developers to build a single API service\n// that supports both gRPC APIs and REST APIs. Many systems, including [Google\n// APIs](https://github.com/googleapis/googleapis),\n// [Cloud Endpoints](https://cloud.google.com/endpoints), [gRPC\n// Gateway](https://github.com/grpc-ecosystem/grpc-gateway),\n// and [Envoy](https://github.com/envoyproxy/envoy) proxy support this feature\n// and use it for large scale production services.\n//\n// `HttpRule` defines the schema of the gRPC/REST mapping. The mapping specifies\n// how different portions of the gRPC request message are mapped to the URL\n// path, URL query parameters, and HTTP request body. It also controls how the\n// gRPC response message is mapped to the HTTP response body. `HttpRule` is\n// typically specified as an `google.api.http` annotation on the gRPC method.\n//\n// Each mapping specifies a URL path template and an HTTP method. The path\n// template may refer to one or more fields in the gRPC request message, as long\n// as each field is a non-repeated field with a primitive (non-message) type.\n// The path template controls how fields of the request message are mapped to\n// the URL path.\n//\n// Example:\n//\n//     service Messaging {\n//       rpc GetMessage(GetMessageRequest) returns (Message) {\n//         option (google.api.http) = {\n//             get: \"/v1/{name=messages/*}\"\n//         };\n//       }\n//     }\n//     message GetMessageRequest {\n//       string name = 1; // Mapped to URL path.\n//     }\n//     message Message {\n//       string text = 1; // The resource content.\n//     }\n//\n// This enables an HTTP REST to gRPC mapping as below:\n//\n// HTTP | gRPC\n// -----|-----\n// `GET /v1/messages/123456`  | `GetMessage(name: \"messages/123456\")`\n//\n// Any fields in the request message which are not bound by the path template\n// automatically become HTTP query parameters if there is no HTTP request body.\n// For example:\n//\n//     service Messaging {\n//       rpc GetMessage(GetMessageRequest) returns (Message) {\n//         option (google.api.http) = {\n//             get:\"/v1/messages/{message_id}\"\n//         };\n//       }\n//     }\n//     message GetMessageRequest {\n//       message SubMessage {\n//         string subfield = 1;\n//       }\n//       string message_id = 1; // Mapped to URL path.\n//       int64 revision = 2;    // Mapped to URL query parameter `revision`.\n//       SubMessage sub = 3;    // Mapped to URL query parameter `sub.subfield`.\n//     }\n//\n// This enables a HTTP JSON to RPC mapping as below:\n//\n// HTTP | gRPC\n// -----|-----\n// `GET /v1/messages/123456?revision=2&sub.subfield=foo` |\n// `GetMessage(message_id: \"123456\" revision: 2 sub: SubMessage(subfield:\n// \"foo\"))`\n//\n// Note that fields which are mapped to URL query parameters must have a\n// primitive type or a repeated primitive type or a non-repeated message type.\n// In the case of a repeated type, the parameter can be repeated in the URL\n// as `...?param=A&param=B`. In the case of a message type, each field of the\n// message is mapped to a separate parameter, such as\n// `...?foo.a=A&foo.b=B&foo.c=C`.\n//\n// For HTTP methods that allow a request body, the `body` field\n// specifies the mapping. Consider a REST update method on the\n// message resource collection:\n//\n//     service Messaging {\n//       rpc UpdateMessage(UpdateMessageRequest) returns (Message) {\n//         option (google.api.http) = {\n//           patch: \"/v1/messages/{message_id}\"\n//           body: \"message\"\n//         };\n//       }\n//     }\n//     message UpdateMessageRequest {\n//       string message_id = 1; // mapped to the URL\n//       Message message = 2;   // mapped to the body\n//     }\n//\n// The following HTTP JSON to RPC mapping is enabled, where the\n// representation of the JSON in the request body is determined by\n// protos JSON encoding:\n//\n// HTTP | gRPC\n// -----|-----\n// `PATCH /v1/messages/123456 { \"text\": \"Hi!\" }` | `UpdateMessage(message_id:\n// \"123456\" message { text: \"Hi!\" })`\n//\n// The special name `*` can be used in the body mapping to define that\n// every field not bound by the path template should be mapped to the\n// request body.  This enables the following alternative definition of\n// the update method:\n//\n//     service Messaging {\n//       rpc UpdateMessage(Message) returns (Message) {\n//         option (google.api.http) = {\n//           patch: \"/v1/messages/{message_id}\"\n//           body: \"*\"\n//         };\n//       }\n//     }\n//     message Message {\n//       string message_id = 1;\n//       string text = 2;\n//     }\n//\n//\n// The following HTTP JSON to RPC mapping is enabled:\n//\n// HTTP | gRPC\n// -----|-----\n// `PATCH /v1/messages/123456 { \"text\": \"Hi!\" }` | `UpdateMessage(message_id:\n// \"123456\" text: \"Hi!\")`\n//\n// Note that when using `*` in the body mapping, it is not possible to\n// have HTTP parameters, as all fields not bound by the path end in\n// the body. This makes this option more rarely used in practice when\n// defining REST APIs. The common usage of `*` is in custom methods\n// which don't use the URL at all for transferring data.\n//\n// It is possible to define multiple HTTP methods for one RPC by using\n// the `additional_bindings` option. Example:\n//\n//     service Messaging {\n//       rpc GetMessage(GetMessageRequest) returns (Message) {\n//         option (google.api.http) = {\n//           get: \"/v1/messages/{message_id}\"\n//           additional_bindings {\n//             get: \"/v1/users/{user_id}/messages/{message_id}\"\n//           }\n//         };\n//       }\n//     }\n//     message GetMessageRequest {\n//       string message_id = 1;\n//       string user_id = 2;\n//     }\n//\n// This enables the following two alternative HTTP JSON to RPC mappings:\n//\n// HTTP | gRPC\n// -----|-----\n// `GET /v1/messages/123456` | `GetMessage(message_id: \"123456\")`\n// `GET /v1/users/me/messages/123456` | `GetMessage(user_id: \"me\" message_id:\n// \"123456\")`\n//\n// ## Rules for HTTP mapping\n//\n// 1. Leaf request fields (recursive expansion nested messages in the request\n//    message) are classified into three categories:\n//    - Fields referred by the path template. They are passed via the URL path.\n//    - Fields referred by the [HttpRule.body][google.api.HttpRule.body]. They are passed via the HTTP\n//      request body.\n//    - All other fields are passed via the URL query parameters, and the\n//      parameter name is the field path in the request message. A repeated\n//      field can be represented as multiple query parameters under the same\n//      name.\n//  2. If [HttpRule.body][google.api.HttpRule.body] is \"*\", there is no URL query parameter, all fields\n//     are passed via URL path and HTTP request body.\n//  3. If [HttpRule.body][google.api.HttpRule.body] is omitted, there is no HTTP request body, all\n//     fields are passed via URL path and URL query parameters.\n//\n// ### Path template syntax\n//\n//     Template = \"/\" Segments [ Verb ] ;\n//     Segments = Segment { \"/\" Segment } ;\n//     Segment  = \"*\" | \"**\" | LITERAL | Variable ;\n//     Variable = \"{\" FieldPath [ \"=\" Segments ] \"}\" ;\n//     FieldPath = IDENT { \".\" IDENT } ;\n//     Verb     = \":\" LITERAL ;\n//\n// The syntax `*` matches a single URL path segment. The syntax `**` matches\n// zero or more URL path segments, which must be the last part of the URL path\n// except the `Verb`.\n//\n// The syntax `Variable` matches part of the URL path as specified by its\n// template. A variable template must not contain other variables. If a variable\n// matches a single path segment, its template may be omitted, e.g. `{var}`\n// is equivalent to `{var=*}`.\n//\n// The syntax `LITERAL` matches literal text in the URL path. If the `LITERAL`\n// contains any reserved character, such characters should be percent-encoded\n// before the matching.\n//\n// If a variable contains exactly one path segment, such as `\"{var}\"` or\n// `\"{var=*}\"`, when such a variable is expanded into a URL path on the client\n// side, all characters except `[-_.~0-9a-zA-Z]` are percent-encoded. The\n// server side does the reverse decoding. Such variables show up in the\n// [Discovery\n// Document](https://developers.google.com/discovery/v1/reference/apis) as\n// `{var}`.\n//\n// If a variable contains multiple path segments, such as `\"{var=foo/*}\"`\n// or `\"{var=**}\"`, when such a variable is expanded into a URL path on the\n// client side, all characters except `[-_.~/0-9a-zA-Z]` are percent-encoded.\n// The server side does the reverse decoding, except \"%2F\" and \"%2f\" are left\n// unchanged. Such variables show up in the\n// [Discovery\n// Document](https://developers.google.com/discovery/v1/reference/apis) as\n// `{+var}`.\n//\n// ## Using gRPC API Service Configuration\n//\n// gRPC API Service Configuration (service config) is a configuration language\n// for configuring a gRPC service to become a user-facing product. The\n// service config is simply the YAML representation of the `google.api.Service`\n// proto message.\n//\n// As an alternative to annotating your proto file, you can configure gRPC\n// transcoding in your service config YAML files. You do this by specifying a\n// `HttpRule` that maps the gRPC method to a REST endpoint, achieving the same\n// effect as the proto annotation. This can be particularly useful if you\n// have a proto that is reused in multiple services. Note that any transcoding\n// specified in the service config will override any matching transcoding\n// configuration in the proto.\n//\n// Example:\n//\n//     http:\n//       rules:\n//         # Selects a gRPC method and applies HttpRule to it.\n//         - selector: example.v1.Messaging.GetMessage\n//           get: /v1/messages/{message_id}/{sub.subfield}\n//\n// ## Special notes\n//\n// When gRPC Transcoding is used to map a gRPC to JSON REST endpoints, the\n// proto to JSON conversion must follow the [proto3\n// specification](https://developers.google.com/protocol-buffers/docs/proto3#json).\n//\n// While the single segment variable follows the semantics of\n// [RFC 6570](https://tools.ietf.org/html/rfc6570) Section 3.2.2 Simple String\n// Expansion, the multi segment variable **does not** follow RFC 6570 Section\n// 3.2.3 Reserved Expansion. The reason is that the Reserved Expansion\n// does not expand special characters like `?` and `#`, which would lead\n// to invalid URLs. As the result, gRPC Transcoding uses a custom encoding\n// for multi segment variables.\n//\n// The path variables **must not** refer to any repeated or mapped field,\n// because client libraries are not capable of handling such variable expansion.\n//\n// The path variables **must not** capture the leading \"/\" character. The reason\n// is that the most common use case \"{var}\" does not capture the leading \"/\"\n// character. For consistency, all path variables must share the same behavior.\n//\n// Repeated message fields must not be mapped to URL query parameters, because\n// no client library can support such complicated mapping.\n//\n// If an API needs to use a JSON array for request or response body, it can map\n// the request or response body to a repeated field. However, some gRPC\n// Transcoding implementations may not support this feature.\nmessage HttpRule {\n  // Selects a method to which this rule applies.\n  //\n  // Refer to [selector][google.api.DocumentationRule.selector] for syntax details.\n  string selector = 1;\n\n  // Determines the URL pattern is matched by this rules. This pattern can be\n  // used with any of the {get|put|post|delete|patch} methods. A custom method\n  // can be defined using the 'custom' field.\n  oneof pattern {\n    // Maps to HTTP GET. Used for listing and getting information about\n    // resources.\n    string get = 2;\n\n    // Maps to HTTP PUT. Used for replacing a resource.\n    string put = 3;\n\n    // Maps to HTTP POST. Used for creating a resource or performing an action.\n    string post = 4;\n\n    // Maps to HTTP DELETE. Used for deleting a resource.\n    string delete = 5;\n\n    // Maps to HTTP PATCH. Used for updating a resource.\n    string patch = 6;\n\n    // The custom pattern is used for specifying an HTTP method that is not\n    // included in the `pattern` field, such as HEAD, or \"*\" to leave the\n    // HTTP method unspecified for this rule. The wild-card rule is useful\n    // for services that provide content to Web (HTML) clients.\n    CustomHttpPattern custom = 8;\n  }\n\n  // The name of the request field whose value is mapped to the HTTP request\n  // body, or `*` for mapping all request fields not captured by the path\n  // pattern to the HTTP body, or omitted for not having any HTTP request body.\n  //\n  // NOTE: the referred field must be present at the top-level of the request\n  // message type.\n  string body = 7;\n\n  // Optional. The name of the response field whose value is mapped to the HTTP\n  // response body. When omitted, the entire response message will be used\n  // as the HTTP response body.\n  //\n  // NOTE: The referred field must be present at the top-level of the response\n  // message type.\n  string response_body = 12;\n\n  // Additional HTTP bindings for the selector. Nested bindings must\n  // not contain an `additional_bindings` field themselves (that is,\n  // the nesting may only be one level deep).\n  repeated HttpRule additional_bindings = 11;\n}\n\n// A custom pattern is used for defining custom HTTP verb.\nmessage CustomHttpPattern {\n  // The name of this custom HTTP verb.\n  string kind = 1;\n\n  // The path matched by this custom verb.\n  string path = 2;\n}\n"
  },
  {
    "path": "shop/third_party/google/api/httpbody.proto",
    "content": "// Copyright 2020 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\npackage google.api;\n\nimport \"google/protobuf/any.proto\";\n\noption cc_enable_arenas = true;\noption go_package = \"google.golang.org/genproto/googleapis/api/httpbody;httpbody\";\noption java_multiple_files = true;\noption java_outer_classname = \"HttpBodyProto\";\noption java_package = \"com.google.api\";\noption objc_class_prefix = \"GAPI\";\n\n// Message that represents an arbitrary HTTP body. It should only be used for\n// payload formats that can't be represented as JSON, such as raw binary or\n// an HTML page.\n//\n//\n// This message can be used both in streaming and non-streaming API methods in\n// the request as well as the response.\n//\n// It can be used as a top-level request field, which is convenient if one\n// wants to extract parameters from either the URL or HTTP template into the\n// request fields and also want access to the raw HTTP body.\n//\n// Example:\n//\n//     message GetResourceRequest {\n//       // A unique request id.\n//       string request_id = 1;\n//\n//       // The raw HTTP body is bound to this field.\n//       google.api.HttpBody http_body = 2;\n//     }\n//\n//     service ResourceService {\n//       rpc GetResource(GetResourceRequest) returns (google.api.HttpBody);\n//       rpc UpdateResource(google.api.HttpBody) returns\n//       (google.protobuf.Empty);\n//     }\n//\n// Example with streaming methods:\n//\n//     service CaldavService {\n//       rpc GetCalendar(stream google.api.HttpBody)\n//         returns (stream google.api.HttpBody);\n//       rpc UpdateCalendar(stream google.api.HttpBody)\n//         returns (stream google.api.HttpBody);\n//     }\n//\n// Use of this type only changes how the request and response bodies are\n// handled, all other features will continue to work unchanged.\nmessage HttpBody {\n  // The HTTP Content-Type header value specifying the content type of the body.\n  string content_type = 1;\n\n  // The HTTP request/response body as raw binary.\n  bytes data = 2;\n\n  // Application specific response metadata. Must be set in the first response\n  // for streaming APIs.\n  repeated google.protobuf.Any extensions = 3;\n}\n"
  },
  {
    "path": "shop/third_party/google/protobuf/descriptor.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// The messages in this file describe the definitions found in .proto files.\n// A valid .proto file can be translated directly to a FileDescriptorProto\n// without any other information (e.g. without reading its imports).\n\n\nsyntax = \"proto2\";\n\npackage google.protobuf;\n\noption go_package = \"google.golang.org/protobuf/types/descriptorpb\";\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"DescriptorProtos\";\noption csharp_namespace = \"Google.Protobuf.Reflection\";\noption objc_class_prefix = \"GPB\";\noption cc_enable_arenas = true;\n\n// descriptor.proto must be optimized for speed because reflection-based\n// algorithms don't work during bootstrapping.\noption optimize_for = SPEED;\n\n// The protocol compiler can output a FileDescriptorSet containing the .proto\n// files it parses.\nmessage FileDescriptorSet {\n  repeated FileDescriptorProto file = 1;\n}\n\n// Describes a complete .proto file.\nmessage FileDescriptorProto {\n  optional string name = 1;     // file name, relative to root of source tree\n  optional string package = 2;  // e.g. \"foo\", \"foo.bar\", etc.\n\n  // Names of files imported by this file.\n  repeated string dependency = 3;\n  // Indexes of the public imported files in the dependency list above.\n  repeated int32 public_dependency = 10;\n  // Indexes of the weak imported files in the dependency list.\n  // For Google-internal migration only. Do not use.\n  repeated int32 weak_dependency = 11;\n\n  // All top-level definitions in this file.\n  repeated DescriptorProto message_type = 4;\n  repeated EnumDescriptorProto enum_type = 5;\n  repeated ServiceDescriptorProto service = 6;\n  repeated FieldDescriptorProto extension = 7;\n\n  optional FileOptions options = 8;\n\n  // This field contains optional information about the original source code.\n  // You may safely remove this entire field without harming runtime\n  // functionality of the descriptors -- the information is needed only by\n  // development tools.\n  optional SourceCodeInfo source_code_info = 9;\n\n  // The syntax of the proto file.\n  // The supported values are \"proto2\" and \"proto3\".\n  optional string syntax = 12;\n}\n\n// Describes a message type.\nmessage DescriptorProto {\n  optional string name = 1;\n\n  repeated FieldDescriptorProto field = 2;\n  repeated FieldDescriptorProto extension = 6;\n\n  repeated DescriptorProto nested_type = 3;\n  repeated EnumDescriptorProto enum_type = 4;\n\n  message ExtensionRange {\n    optional int32 start = 1;  // Inclusive.\n    optional int32 end = 2;    // Exclusive.\n\n    optional ExtensionRangeOptions options = 3;\n  }\n  repeated ExtensionRange extension_range = 5;\n\n  repeated OneofDescriptorProto oneof_decl = 8;\n\n  optional MessageOptions options = 7;\n\n  // Range of reserved tag numbers. Reserved tag numbers may not be used by\n  // fields or extension ranges in the same message. Reserved ranges may\n  // not overlap.\n  message ReservedRange {\n    optional int32 start = 1;  // Inclusive.\n    optional int32 end = 2;    // Exclusive.\n  }\n  repeated ReservedRange reserved_range = 9;\n  // Reserved field names, which may not be used by fields in the same message.\n  // A given name may only be reserved once.\n  repeated string reserved_name = 10;\n}\n\nmessage ExtensionRangeOptions {\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\n// Describes a field within a message.\nmessage FieldDescriptorProto {\n  enum Type {\n    // 0 is reserved for errors.\n    // Order is weird for historical reasons.\n    TYPE_DOUBLE = 1;\n    TYPE_FLOAT = 2;\n    // Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT64 if\n    // negative values are likely.\n    TYPE_INT64 = 3;\n    TYPE_UINT64 = 4;\n    // Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT32 if\n    // negative values are likely.\n    TYPE_INT32 = 5;\n    TYPE_FIXED64 = 6;\n    TYPE_FIXED32 = 7;\n    TYPE_BOOL = 8;\n    TYPE_STRING = 9;\n    // Tag-delimited aggregate.\n    // Group type is deprecated and not supported in proto3. However, Proto3\n    // implementations should still be able to parse the group wire format and\n    // treat group fields as unknown fields.\n    TYPE_GROUP = 10;\n    TYPE_MESSAGE = 11;  // Length-delimited aggregate.\n\n    // New in version 2.\n    TYPE_BYTES = 12;\n    TYPE_UINT32 = 13;\n    TYPE_ENUM = 14;\n    TYPE_SFIXED32 = 15;\n    TYPE_SFIXED64 = 16;\n    TYPE_SINT32 = 17;  // Uses ZigZag encoding.\n    TYPE_SINT64 = 18;  // Uses ZigZag encoding.\n  }\n\n  enum Label {\n    // 0 is reserved for errors\n    LABEL_OPTIONAL = 1;\n    LABEL_REQUIRED = 2;\n    LABEL_REPEATED = 3;\n  }\n\n  optional string name = 1;\n  optional int32 number = 3;\n  optional Label label = 4;\n\n  // If type_name is set, this need not be set.  If both this and type_name\n  // are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP.\n  optional Type type = 5;\n\n  // For message and enum types, this is the name of the type.  If the name\n  // starts with a '.', it is fully-qualified.  Otherwise, C++-like scoping\n  // rules are used to find the type (i.e. first the nested types within this\n  // message are searched, then within the parent, on up to the root\n  // namespace).\n  optional string type_name = 6;\n\n  // For extensions, this is the name of the type being extended.  It is\n  // resolved in the same manner as type_name.\n  optional string extendee = 2;\n\n  // For numeric types, contains the original text representation of the value.\n  // For booleans, \"true\" or \"false\".\n  // For strings, contains the default text contents (not escaped in any way).\n  // For bytes, contains the C escaped value.  All bytes >= 128 are escaped.\n  // TODO(kenton):  Base-64 encode?\n  optional string default_value = 7;\n\n  // If set, gives the index of a oneof in the containing type's oneof_decl\n  // list.  This field is a member of that oneof.\n  optional int32 oneof_index = 9;\n\n  // JSON name of this field. The value is set by protocol compiler. If the\n  // user has set a \"json_name\" option on this field, that option's value\n  // will be used. Otherwise, it's deduced from the field's name by converting\n  // it to camelCase.\n  optional string json_name = 10;\n\n  optional FieldOptions options = 8;\n\n  // If true, this is a proto3 \"optional\". When a proto3 field is optional, it\n  // tracks presence regardless of field type.\n  //\n  // When proto3_optional is true, this field must be belong to a oneof to\n  // signal to old proto3 clients that presence is tracked for this field. This\n  // oneof is known as a \"synthetic\" oneof, and this field must be its sole\n  // member (each proto3 optional field gets its own synthetic oneof). Synthetic\n  // oneofs exist in the descriptor only, and do not generate any API. Synthetic\n  // oneofs must be ordered after all \"real\" oneofs.\n  //\n  // For message fields, proto3_optional doesn't create any semantic change,\n  // since non-repeated message fields always track presence. However it still\n  // indicates the semantic detail of whether the user wrote \"optional\" or not.\n  // This can be useful for round-tripping the .proto file. For consistency we\n  // give message fields a synthetic oneof also, even though it is not required\n  // to track presence. This is especially important because the parser can't\n  // tell if a field is a message or an enum, so it must always create a\n  // synthetic oneof.\n  //\n  // Proto2 optional fields do not set this flag, because they already indicate\n  // optional with `LABEL_OPTIONAL`.\n  optional bool proto3_optional = 17;\n}\n\n// Describes a oneof.\nmessage OneofDescriptorProto {\n  optional string name = 1;\n  optional OneofOptions options = 2;\n}\n\n// Describes an enum type.\nmessage EnumDescriptorProto {\n  optional string name = 1;\n\n  repeated EnumValueDescriptorProto value = 2;\n\n  optional EnumOptions options = 3;\n\n  // Range of reserved numeric values. Reserved values may not be used by\n  // entries in the same enum. Reserved ranges may not overlap.\n  //\n  // Note that this is distinct from DescriptorProto.ReservedRange in that it\n  // is inclusive such that it can appropriately represent the entire int32\n  // domain.\n  message EnumReservedRange {\n    optional int32 start = 1;  // Inclusive.\n    optional int32 end = 2;    // Inclusive.\n  }\n\n  // Range of reserved numeric values. Reserved numeric values may not be used\n  // by enum values in the same enum declaration. Reserved ranges may not\n  // overlap.\n  repeated EnumReservedRange reserved_range = 4;\n\n  // Reserved enum value names, which may not be reused. A given name may only\n  // be reserved once.\n  repeated string reserved_name = 5;\n}\n\n// Describes a value within an enum.\nmessage EnumValueDescriptorProto {\n  optional string name = 1;\n  optional int32 number = 2;\n\n  optional EnumValueOptions options = 3;\n}\n\n// Describes a service.\nmessage ServiceDescriptorProto {\n  optional string name = 1;\n  repeated MethodDescriptorProto method = 2;\n\n  optional ServiceOptions options = 3;\n}\n\n// Describes a method of a service.\nmessage MethodDescriptorProto {\n  optional string name = 1;\n\n  // Input and output type names.  These are resolved in the same way as\n  // FieldDescriptorProto.type_name, but must refer to a message type.\n  optional string input_type = 2;\n  optional string output_type = 3;\n\n  optional MethodOptions options = 4;\n\n  // Identifies if client streams multiple client messages\n  optional bool client_streaming = 5 [default = false];\n  // Identifies if server streams multiple server messages\n  optional bool server_streaming = 6 [default = false];\n}\n\n\n// ===================================================================\n// Options\n\n// Each of the definitions above may have \"options\" attached.  These are\n// just annotations which may cause code to be generated slightly differently\n// or may contain hints for code that manipulates protocol messages.\n//\n// Clients may define custom options as extensions of the *Options messages.\n// These extensions may not yet be known at parsing time, so the parser cannot\n// store the values in them.  Instead it stores them in a field in the *Options\n// message called uninterpreted_option. This field must have the same name\n// across all *Options messages. We then use this field to populate the\n// extensions when we build a descriptor, at which point all protos have been\n// parsed and so all extensions are known.\n//\n// Extension numbers for custom options may be chosen as follows:\n// * For options which will only be used within a single application or\n//   organization, or for experimental options, use field numbers 50000\n//   through 99999.  It is up to you to ensure that you do not use the\n//   same number for multiple options.\n// * For options which will be published and used publicly by multiple\n//   independent entities, e-mail protobuf-global-extension-registry@google.com\n//   to reserve extension numbers. Simply provide your project name (e.g.\n//   Objective-C plugin) and your project website (if available) -- there's no\n//   need to explain how you intend to use them. Usually you only need one\n//   extension number. You can declare multiple options with only one extension\n//   number by putting them in a sub-message. See the Custom Options section of\n//   the docs for examples:\n//   https://developers.google.com/protocol-buffers/docs/proto#options\n//   If this turns out to be popular, a web service will be set up\n//   to automatically assign option numbers.\n\nmessage FileOptions {\n\n  // Sets the Java package where classes generated from this .proto will be\n  // placed.  By default, the proto package is used, but this is often\n  // inappropriate because proto packages do not normally start with backwards\n  // domain names.\n  optional string java_package = 1;\n\n\n  // Controls the name of the wrapper Java class generated for the .proto file.\n  // That class will always contain the .proto file's getDescriptor() method as\n  // well as any top-level extensions defined in the .proto file.\n  // If java_multiple_files is disabled, then all the other classes from the\n  // .proto file will be nested inside the single wrapper outer class.\n  optional string java_outer_classname = 8;\n\n  // If enabled, then the Java code generator will generate a separate .java\n  // file for each top-level message, enum, and service defined in the .proto\n  // file.  Thus, these types will *not* be nested inside the wrapper class\n  // named by java_outer_classname.  However, the wrapper class will still be\n  // generated to contain the file's getDescriptor() method as well as any\n  // top-level extensions defined in the file.\n  optional bool java_multiple_files = 10 [default = false];\n\n  // This option does nothing.\n  optional bool java_generate_equals_and_hash = 20 [deprecated=true];\n\n  // If set true, then the Java2 code generator will generate code that\n  // throws an exception whenever an attempt is made to assign a non-UTF-8\n  // byte sequence to a string field.\n  // Message reflection will do the same.\n  // However, an extension field still accepts non-UTF-8 byte sequences.\n  // This option has no effect on when used with the lite runtime.\n  optional bool java_string_check_utf8 = 27 [default = false];\n\n\n  // Generated classes can be optimized for speed or code size.\n  enum OptimizeMode {\n    SPEED = 1;         // Generate complete code for parsing, serialization,\n    // etc.\n    CODE_SIZE = 2;     // Use ReflectionOps to implement these methods.\n    LITE_RUNTIME = 3;  // Generate code using MessageLite and the lite runtime.\n  }\n  optional OptimizeMode optimize_for = 9 [default = SPEED];\n\n  // Sets the Go package where structs generated from this .proto will be\n  // placed. If omitted, the Go package will be derived from the following:\n  //   - The basename of the package import path, if provided.\n  //   - Otherwise, the package statement in the .proto file, if present.\n  //   - Otherwise, the basename of the .proto file, without extension.\n  optional string go_package = 11;\n\n\n\n\n  // Should generic services be generated in each language?  \"Generic\" services\n  // are not specific to any particular RPC system.  They are generated by the\n  // main code generators in each language (without additional plugins).\n  // Generic services were the only kind of service generation supported by\n  // early versions of google.protobuf.\n  //\n  // Generic services are now considered deprecated in favor of using plugins\n  // that generate code specific to your particular RPC system.  Therefore,\n  // these default to false.  Old code which depends on generic services should\n  // explicitly set them to true.\n  optional bool cc_generic_services = 16 [default = false];\n  optional bool java_generic_services = 17 [default = false];\n  optional bool py_generic_services = 18 [default = false];\n  optional bool php_generic_services = 42 [default = false];\n\n  // Is this file deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for everything in the file, or it will be completely ignored; in the very\n  // least, this is a formalization for deprecating files.\n  optional bool deprecated = 23 [default = false];\n\n  // Enables the use of arenas for the proto messages in this file. This applies\n  // only to generated classes for C++.\n  optional bool cc_enable_arenas = 31 [default = true];\n\n\n  // Sets the objective c class prefix which is prepended to all objective c\n  // generated classes from this .proto. There is no default.\n  optional string objc_class_prefix = 36;\n\n  // Namespace for generated classes; defaults to the package.\n  optional string csharp_namespace = 37;\n\n  // By default Swift generators will take the proto package and CamelCase it\n  // replacing '.' with underscore and use that to prefix the types/symbols\n  // defined. When this options is provided, they will use this value instead\n  // to prefix the types/symbols defined.\n  optional string swift_prefix = 39;\n\n  // Sets the php class prefix which is prepended to all php generated classes\n  // from this .proto. Default is empty.\n  optional string php_class_prefix = 40;\n\n  // Use this option to change the namespace of php generated classes. Default\n  // is empty. When this option is empty, the package name will be used for\n  // determining the namespace.\n  optional string php_namespace = 41;\n\n  // Use this option to change the namespace of php generated metadata classes.\n  // Default is empty. When this option is empty, the proto file name will be\n  // used for determining the namespace.\n  optional string php_metadata_namespace = 44;\n\n  // Use this option to change the package of ruby generated classes. Default\n  // is empty. When this option is not set, the package name will be used for\n  // determining the ruby package.\n  optional string ruby_package = 45;\n\n\n  // The parser stores options it doesn't recognize here.\n  // See the documentation for the \"Options\" section above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message.\n  // See the documentation for the \"Options\" section above.\n  extensions 1000 to max;\n\n  reserved 38;\n}\n\nmessage MessageOptions {\n  // Set true to use the old proto1 MessageSet wire format for extensions.\n  // This is provided for backwards-compatibility with the MessageSet wire\n  // format.  You should not use this for any other reason:  It's less\n  // efficient, has fewer features, and is more complicated.\n  //\n  // The message must be defined exactly as follows:\n  //   message Foo {\n  //     option message_set_wire_format = true;\n  //     extensions 4 to max;\n  //   }\n  // Note that the message cannot have any defined fields; MessageSets only\n  // have extensions.\n  //\n  // All extensions of your type must be singular messages; e.g. they cannot\n  // be int32s, enums, or repeated messages.\n  //\n  // Because this is an option, the above two restrictions are not enforced by\n  // the protocol compiler.\n  optional bool message_set_wire_format = 1 [default = false];\n\n  // Disables the generation of the standard \"descriptor()\" accessor, which can\n  // conflict with a field of the same name.  This is meant to make migration\n  // from proto1 easier; new code should avoid fields named \"descriptor\".\n  optional bool no_standard_descriptor_accessor = 2 [default = false];\n\n  // Is this message deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for the message, or it will be completely ignored; in the very least,\n  // this is a formalization for deprecating messages.\n  optional bool deprecated = 3 [default = false];\n\n  reserved 4, 5, 6;\n\n  // Whether the message is an automatically generated map entry type for the\n  // maps field.\n  //\n  // For maps fields:\n  //     map<KeyType, ValueType> map_field = 1;\n  // The parsed descriptor looks like:\n  //     message MapFieldEntry {\n  //         option map_entry = true;\n  //         optional KeyType key = 1;\n  //         optional ValueType value = 2;\n  //     }\n  //     repeated MapFieldEntry map_field = 1;\n  //\n  // Implementations may choose not to generate the map_entry=true message, but\n  // use a native map in the target language to hold the keys and values.\n  // The reflection APIs in such implementations still need to work as\n  // if the field is a repeated message field.\n  //\n  // NOTE: Do not set the option in .proto files. Always use the maps syntax\n  // instead. The option should only be implicitly set by the proto compiler\n  // parser.\n  optional bool map_entry = 7;\n\n  reserved 8;  // javalite_serializable\n  reserved 9;  // javanano_as_lite\n\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\nmessage FieldOptions {\n  // The ctype option instructs the C++ code generator to use a different\n  // representation of the field than it normally would.  See the specific\n  // options below.  This option is not yet implemented in the open source\n  // release -- sorry, we'll try to include it in a future version!\n  optional CType ctype = 1 [default = STRING];\n  enum CType {\n    // Default mode.\n    STRING = 0;\n\n    CORD = 1;\n\n    STRING_PIECE = 2;\n  }\n  // The packed option can be enabled for repeated primitive fields to enable\n  // a more efficient representation on the wire. Rather than repeatedly\n  // writing the tag and type for each element, the entire array is encoded as\n  // a single length-delimited blob. In proto3, only explicit setting it to\n  // false will avoid using packed encoding.\n  optional bool packed = 2;\n\n  // The jstype option determines the JavaScript type used for values of the\n  // field.  The option is permitted only for 64 bit integral and fixed types\n  // (int64, uint64, sint64, fixed64, sfixed64).  A field with jstype JS_STRING\n  // is represented as JavaScript string, which avoids loss of precision that\n  // can happen when a large value is converted to a floating point JavaScript.\n  // Specifying JS_NUMBER for the jstype causes the generated JavaScript code to\n  // use the JavaScript \"number\" type.  The behavior of the default option\n  // JS_NORMAL is implementation dependent.\n  //\n  // This option is an enum to permit additional types to be added, e.g.\n  // goog.math.Integer.\n  optional JSType jstype = 6 [default = JS_NORMAL];\n  enum JSType {\n    // Use the default type.\n    JS_NORMAL = 0;\n\n    // Use JavaScript strings.\n    JS_STRING = 1;\n\n    // Use JavaScript numbers.\n    JS_NUMBER = 2;\n  }\n\n  // Should this field be parsed lazily?  Lazy applies only to message-type\n  // fields.  It means that when the outer message is initially parsed, the\n  // inner message's contents will not be parsed but instead stored in encoded\n  // form.  The inner message will actually be parsed when it is first accessed.\n  //\n  // This is only a hint.  Implementations are free to choose whether to use\n  // eager or lazy parsing regardless of the value of this option.  However,\n  // setting this option true suggests that the protocol author believes that\n  // using lazy parsing on this field is worth the additional bookkeeping\n  // overhead typically needed to implement it.\n  //\n  // This option does not affect the public interface of any generated code;\n  // all method signatures remain the same.  Furthermore, thread-safety of the\n  // interface is not affected by this option; const methods remain safe to\n  // call from multiple threads concurrently, while non-const methods continue\n  // to require exclusive access.\n  //\n  //\n  // Note that implementations may choose not to check required fields within\n  // a lazy sub-message.  That is, calling IsInitialized() on the outer message\n  // may return true even if the inner message has missing required fields.\n  // This is necessary because otherwise the inner message would have to be\n  // parsed in order to perform the check, defeating the purpose of lazy\n  // parsing.  An implementation which chooses not to check required fields\n  // must be consistent about it.  That is, for any particular sub-message, the\n  // implementation must either *always* check its required fields, or *never*\n  // check its required fields, regardless of whether or not the message has\n  // been parsed.\n  optional bool lazy = 5 [default = false];\n\n  // Is this field deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for accessors, or it will be completely ignored; in the very least, this\n  // is a formalization for deprecating fields.\n  optional bool deprecated = 3 [default = false];\n\n  // For Google-internal migration only. Do not use.\n  optional bool weak = 10 [default = false];\n\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n\n  reserved 4;  // removed jtype\n}\n\nmessage OneofOptions {\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\nmessage EnumOptions {\n\n  // Set this option to true to allow mapping different tag names to the same\n  // value.\n  optional bool allow_alias = 2;\n\n  // Is this enum deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for the enum, or it will be completely ignored; in the very least, this\n  // is a formalization for deprecating enums.\n  optional bool deprecated = 3 [default = false];\n\n  reserved 5;  // javanano_as_lite\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\nmessage EnumValueOptions {\n  // Is this enum value deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for the enum value, or it will be completely ignored; in the very least,\n  // this is a formalization for deprecating enum values.\n  optional bool deprecated = 1 [default = false];\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\nmessage ServiceOptions {\n\n  // Note:  Field numbers 1 through 32 are reserved for Google's internal RPC\n  //   framework.  We apologize for hoarding these numbers to ourselves, but\n  //   we were already using them long before we decided to release Protocol\n  //   Buffers.\n\n  // Is this service deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for the service, or it will be completely ignored; in the very least,\n  // this is a formalization for deprecating services.\n  optional bool deprecated = 33 [default = false];\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\nmessage MethodOptions {\n\n  // Note:  Field numbers 1 through 32 are reserved for Google's internal RPC\n  //   framework.  We apologize for hoarding these numbers to ourselves, but\n  //   we were already using them long before we decided to release Protocol\n  //   Buffers.\n\n  // Is this method deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for the method, or it will be completely ignored; in the very least,\n  // this is a formalization for deprecating methods.\n  optional bool deprecated = 33 [default = false];\n\n  // Is this method side-effect-free (or safe in HTTP parlance), or idempotent,\n  // or neither? HTTP based RPC implementation may choose GET verb for safe\n  // methods, and PUT verb for idempotent methods instead of the default POST.\n  enum IdempotencyLevel {\n    IDEMPOTENCY_UNKNOWN = 0;\n    NO_SIDE_EFFECTS = 1;  // implies idempotent\n    IDEMPOTENT = 2;       // idempotent, but may have side effects\n  }\n  optional IdempotencyLevel idempotency_level = 34\n  [default = IDEMPOTENCY_UNKNOWN];\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\n\n// A message representing a option the parser does not recognize. This only\n// appears in options protos created by the compiler::Parser class.\n// DescriptorPool resolves these when building Descriptor objects. Therefore,\n// options protos in descriptor objects (e.g. returned by Descriptor::options(),\n// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions\n// in them.\nmessage UninterpretedOption {\n  // The name of the uninterpreted option.  Each string represents a segment in\n  // a dot-separated name.  is_extension is true iff a segment represents an\n  // extension (denoted with parentheses in options specs in .proto files).\n  // E.g.,{ [\"foo\", false], [\"bar.baz\", true], [\"qux\", false] } represents\n  // \"foo.(bar.baz).qux\".\n  message NamePart {\n    required string name_part = 1;\n    required bool is_extension = 2;\n  }\n  repeated NamePart name = 2;\n\n  // The value of the uninterpreted option, in whatever type the tokenizer\n  // identified it as during parsing. Exactly one of these should be set.\n  optional string identifier_value = 3;\n  optional uint64 positive_int_value = 4;\n  optional int64 negative_int_value = 5;\n  optional double double_value = 6;\n  optional bytes string_value = 7;\n  optional string aggregate_value = 8;\n}\n\n// ===================================================================\n// Optional source code info\n\n// Encapsulates information about the original source file from which a\n// FileDescriptorProto was generated.\nmessage SourceCodeInfo {\n  // A Location identifies a piece of source code in a .proto file which\n  // corresponds to a particular definition.  This information is intended\n  // to be useful to IDEs, code indexers, documentation generators, and similar\n  // tools.\n  //\n  // For example, say we have a file like:\n  //   message Foo {\n  //     optional string foo = 1;\n  //   }\n  // Let's look at just the field definition:\n  //   optional string foo = 1;\n  //   ^       ^^     ^^  ^  ^^^\n  //   a       bc     de  f  ghi\n  // We have the following locations:\n  //   span   path               represents\n  //   [a,i)  [ 4, 0, 2, 0 ]     The whole field definition.\n  //   [a,b)  [ 4, 0, 2, 0, 4 ]  The label (optional).\n  //   [c,d)  [ 4, 0, 2, 0, 5 ]  The type (string).\n  //   [e,f)  [ 4, 0, 2, 0, 1 ]  The name (foo).\n  //   [g,h)  [ 4, 0, 2, 0, 3 ]  The number (1).\n  //\n  // Notes:\n  // - A location may refer to a repeated field itself (i.e. not to any\n  //   particular index within it).  This is used whenever a set of elements are\n  //   logically enclosed in a single code segment.  For example, an entire\n  //   extend block (possibly containing multiple extension definitions) will\n  //   have an outer location whose path refers to the \"extensions\" repeated\n  //   field without an index.\n  // - Multiple locations may have the same path.  This happens when a single\n  //   logical declaration is spread out across multiple places.  The most\n  //   obvious example is the \"extend\" block again -- there may be multiple\n  //   extend blocks in the same scope, each of which will have the same path.\n  // - A location's span is not always a subset of its parent's span.  For\n  //   example, the \"extendee\" of an extension declaration appears at the\n  //   beginning of the \"extend\" block and is shared by all extensions within\n  //   the block.\n  // - Just because a location's span is a subset of some other location's span\n  //   does not mean that it is a descendant.  For example, a \"group\" defines\n  //   both a type and a field in a single declaration.  Thus, the locations\n  //   corresponding to the type and field and their components will overlap.\n  // - Code which tries to interpret locations should probably be designed to\n  //   ignore those that it doesn't understand, as more types of locations could\n  //   be recorded in the future.\n  repeated Location location = 1;\n  message Location {\n    // Identifies which part of the FileDescriptorProto was defined at this\n    // location.\n    //\n    // Each element is a field number or an index.  They form a path from\n    // the root FileDescriptorProto to the place where the definition occurs.  For\n    // example, this path:\n    //   [ 4, 3, 2, 7, 1 ]\n    // refers to:\n    //   file.message_type(3)  // 4, 3\n    //       .field(7)         // 2, 7\n    //       .name()           // 1\n    // This is because FileDescriptorProto.message_type has field number 4:\n    //   repeated DescriptorProto message_type = 4;\n    // and DescriptorProto.field has field number 2:\n    //   repeated FieldDescriptorProto field = 2;\n    // and FieldDescriptorProto.name has field number 1:\n    //   optional string name = 1;\n    //\n    // Thus, the above path gives the location of a field name.  If we removed\n    // the last element:\n    //   [ 4, 3, 2, 7 ]\n    // this path refers to the whole field declaration (from the beginning\n    // of the label to the terminating semicolon).\n    repeated int32 path = 1 [packed = true];\n\n    // Always has exactly three or four elements: start line, start column,\n    // end line (optional, otherwise assumed same as start line), end column.\n    // These are packed into a single field for efficiency.  Note that line\n    // and column numbers are zero-based -- typically you will want to add\n    // 1 to each before displaying to a user.\n    repeated int32 span = 2 [packed = true];\n\n    // If this SourceCodeInfo represents a complete declaration, these are any\n    // comments appearing before and after the declaration which appear to be\n    // attached to the declaration.\n    //\n    // A series of line comments appearing on consecutive lines, with no other\n    // tokens appearing on those lines, will be treated as a single comment.\n    //\n    // leading_detached_comments will keep paragraphs of comments that appear\n    // before (but not connected to) the current element. Each paragraph,\n    // separated by empty lines, will be one comment element in the repeated\n    // field.\n    //\n    // Only the comment content is provided; comment markers (e.g. //) are\n    // stripped out.  For block comments, leading whitespace and an asterisk\n    // will be stripped from the beginning of each line other than the first.\n    // Newlines are included in the output.\n    //\n    // Examples:\n    //\n    //   optional int32 foo = 1;  // Comment attached to foo.\n    //   // Comment attached to bar.\n    //   optional int32 bar = 2;\n    //\n    //   optional string baz = 3;\n    //   // Comment attached to baz.\n    //   // Another line attached to baz.\n    //\n    //   // Comment attached to qux.\n    //   //\n    //   // Another line attached to qux.\n    //   optional double qux = 4;\n    //\n    //   // Detached comment for corge. This is not leading or trailing comments\n    //   // to qux or corge because there are blank lines separating it from\n    //   // both.\n    //\n    //   // Detached comment for corge paragraph 2.\n    //\n    //   optional string corge = 5;\n    //   /* Block comment attached\n    //    * to corge.  Leading asterisks\n    //    * will be removed. */\n    //   /* Block comment attached to\n    //    * grault. */\n    //   optional int32 grault = 6;\n    //\n    //   // ignored detached comments.\n    optional string leading_comments = 3;\n    optional string trailing_comments = 4;\n    repeated string leading_detached_comments = 6;\n  }\n}\n\n// Describes the relationship between generated code and its original source\n// file. A GeneratedCodeInfo message is associated with only one generated\n// source file, but may contain references to different source .proto files.\nmessage GeneratedCodeInfo {\n  // An Annotation connects some span of text in generated code to an element\n  // of its generating .proto file.\n  repeated Annotation annotation = 1;\n  message Annotation {\n    // Identifies the element in the original source .proto file. This field\n    // is formatted the same as SourceCodeInfo.Location.path.\n    repeated int32 path = 1 [packed = true];\n\n    // Identifies the filesystem path to the original source .proto.\n    optional string source_file = 2;\n\n    // Identifies the starting offset in bytes in the generated code\n    // that relates to the identified object.\n    optional int32 begin = 3;\n\n    // Identifies the ending offset in bytes in the generated code that\n    // relates to the identified offset. The end offset should be one past\n    // the last relevant byte (so the length of the text = end - begin).\n    optional int32 end = 4;\n  }\n}\n"
  },
  {
    "path": "shop/third_party/protoc-gen-openapiv2/options/annotations.proto",
    "content": "syntax = \"proto3\";\n\npackage grpc.gateway.protoc_gen_openapiv2.options;\n\noption go_package = \"github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options\";\n\nimport \"google/protobuf/descriptor.proto\";\nimport \"protoc-gen-openapiv2/options/openapiv2.proto\";\n\nextend google.protobuf.FileOptions {\n  // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project.\n  //\n  // All IDs are the same, as assigned. It is okay that they are the same, as they extend\n  // different descriptor messages.\n  Swagger openapiv2_swagger = 1042;\n}\nextend google.protobuf.MethodOptions {\n  // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project.\n  //\n  // All IDs are the same, as assigned. It is okay that they are the same, as they extend\n  // different descriptor messages.\n  Operation openapiv2_operation = 1042;\n}\nextend google.protobuf.MessageOptions {\n  // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project.\n  //\n  // All IDs are the same, as assigned. It is okay that they are the same, as they extend\n  // different descriptor messages.\n  Schema openapiv2_schema = 1042;\n}\nextend google.protobuf.ServiceOptions {\n  // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project.\n  //\n  // All IDs are the same, as assigned. It is okay that they are the same, as they extend\n  // different descriptor messages.\n  Tag openapiv2_tag = 1042;\n}\nextend google.protobuf.FieldOptions {\n  // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project.\n  //\n  // All IDs are the same, as assigned. It is okay that they are the same, as they extend\n  // different descriptor messages.\n  JSONSchema openapiv2_field = 1042;\n}\n"
  },
  {
    "path": "shop/third_party/protoc-gen-openapiv2/options/openapiv2.proto",
    "content": "syntax = \"proto3\";\n\npackage grpc.gateway.protoc_gen_openapiv2.options;\n\noption go_package = \"github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options\";\n\nimport \"google/protobuf/struct.proto\";\n\n// Scheme describes the schemes supported by the OpenAPI Swagger\n// and Operation objects.\nenum Scheme {\n  UNKNOWN = 0;\n  HTTP = 1;\n  HTTPS = 2;\n  WS = 3;\n  WSS = 4;\n}\n\n// `Swagger` is a representation of OpenAPI v2 specification's Swagger object.\n//\n// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#swaggerObject\n//\n// Example:\n//\n//  option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {\n//    info: {\n//      title: \"Echo API\";\n//      version: \"1.0\";\n//      description: \";\n//      contact: {\n//        name: \"gRPC-Gateway project\";\n//        url: \"https://github.com/grpc-ecosystem/grpc-gateway\";\n//        email: \"none@example.com\";\n//      };\n//      license: {\n//        name: \"BSD 3-Clause License\";\n//        url: \"https://github.com/grpc-ecosystem/grpc-gateway/blob/master/LICENSE.txt\";\n//      };\n//    };\n//    schemes: HTTPS;\n//    consumes: \"application/json\";\n//    produces: \"application/json\";\n//  };\n//\nmessage Swagger {\n  // Specifies the OpenAPI Specification version being used. It can be\n  // used by the OpenAPI UI and other clients to interpret the API listing. The \n  // value MUST be \"2.0\".\n  string swagger = 1;\n  // Provides metadata about the API. The metadata can be used by the \n  // clients if needed.\n  Info info = 2;\n  // The host (name or ip) serving the API. This MUST be the host only and does \n  // not include the scheme nor sub-paths. It MAY include a port. If the host is\n  // not included, the host serving the documentation is to be used (including\n  // the port). The host does not support path templating.\n  string host = 3;\n  // The base path on which the API is served, which is relative to the host. If\n  // it is not included, the API is served directly under the host. The value \n  // MUST start with a leading slash (/). The basePath does not support path\n  // templating.\n  // Note that using `base_path` does not change the endpoint paths that are \n  // generated in the resulting OpenAPI file. If you wish to use `base_path`\n  // with relatively generated OpenAPI paths, the `base_path` prefix must be \n  // manually removed from your `google.api.http` paths and your code changed to \n  // serve the API from the `base_path`.\n  string base_path = 4;\n  // The transfer protocol of the API. Values MUST be from the list: \"http\",\n  // \"https\", \"ws\", \"wss\". If the schemes is not included, the default scheme to\n  // be used is the one used to access the OpenAPI definition itself.\n  repeated Scheme schemes = 5;\n  // A list of MIME types the APIs can consume. This is global to all APIs but \n  // can be overridden on specific API calls. Value MUST be as described under\n  // Mime Types.\n  repeated string consumes = 6;\n  // A list of MIME types the APIs can produce. This is global to all APIs but\n  // can be overridden on specific API calls. Value MUST be as described under\n  // Mime Types.\n  repeated string produces = 7;\n  // field 8 is reserved for 'paths'.\n  reserved 8;\n  // field 9 is reserved for 'definitions', which at this time are already\n  // exposed as and customizable as proto messages.\n  reserved 9;\n  // An object to hold responses that can be used across operations. This\n  // property does not define global responses for all operations.\n  map<string, Response> responses = 10;\n  // Security scheme definitions that can be used across the specification.\n  SecurityDefinitions security_definitions = 11;\n  // A declaration of which security schemes are applied for the API as a whole.\n  // The list of values describes alternative security schemes that can be used \n  // (that is, there is a logical OR between the security requirements). \n  // Individual operations can override this definition.\n  repeated SecurityRequirement security = 12;\n  // field 13 is reserved for 'tags', which are supposed to be exposed as and\n  // customizable as proto services. TODO(ivucica): add processing of proto\n  // service objects into OpenAPI v2 Tag objects.\n  reserved 13;\n  // Additional external documentation.\n  ExternalDocumentation external_docs = 14;\n  map<string, google.protobuf.Value> extensions = 15;\n}\n\n// `Operation` is a representation of OpenAPI v2 specification's Operation object.\n//\n// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#operationObject\n//\n// Example:\n//\n//  service EchoService {\n//    rpc Echo(SimpleMessage) returns (SimpleMessage) {\n//      option (google.api.http) = {\n//        get: \"/v1/example/echo/{id}\"\n//      };\n//\n//      option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {\n//        summary: \"Get a message.\";\n//        operation_id: \"getMessage\";\n//        tags: \"echo\";\n//        responses: {\n//          key: \"200\"\n//            value: {\n//            description: \"OK\";\n//          }\n//        }\n//      };\n//    }\n//  }\nmessage Operation {\n  // A list of tags for API documentation control. Tags can be used for logical\n  // grouping of operations by resources or any other qualifier.\n  repeated string tags = 1;\n  // A short summary of what the operation does. For maximum readability in the\n  // swagger-ui, this field SHOULD be less than 120 characters.\n  string summary = 2;\n  // A verbose explanation of the operation behavior. GFM syntax can be used for\n  // rich text representation.\n  string description = 3;\n  // Additional external documentation for this operation.\n  ExternalDocumentation external_docs = 4;\n  // Unique string used to identify the operation. The id MUST be unique among\n  // all operations described in the API. Tools and libraries MAY use the\n  // operationId to uniquely identify an operation, therefore, it is recommended\n  // to follow common programming naming conventions.\n  string operation_id = 5;\n  // A list of MIME types the operation can consume. This overrides the consumes\n  // definition at the OpenAPI Object. An empty value MAY be used to clear the\n  // global definition. Value MUST be as described under Mime Types.\n  repeated string consumes = 6;\n  // A list of MIME types the operation can produce. This overrides the produces\n  // definition at the OpenAPI Object. An empty value MAY be used to clear the\n  // global definition. Value MUST be as described under Mime Types.\n  repeated string produces = 7;\n  // field 8 is reserved for 'parameters'.\n  reserved 8;\n  // The list of possible responses as they are returned from executing this\n  // operation.\n  map<string, Response> responses = 9;\n  // The transfer protocol for the operation. Values MUST be from the list:\n  // \"http\", \"https\", \"ws\", \"wss\". The value overrides the OpenAPI Object\n  // schemes definition.\n  repeated Scheme schemes = 10;\n  // Declares this operation to be deprecated. Usage of the declared operation\n  // should be refrained. Default value is false.\n  bool deprecated = 11;\n  // A declaration of which security schemes are applied for this operation. The\n  // list of values describes alternative security schemes that can be used\n  // (that is, there is a logical OR between the security requirements). This\n  // definition overrides any declared top-level security. To remove a top-level\n  // security declaration, an empty array can be used.\n  repeated SecurityRequirement security = 12;\n  map<string, google.protobuf.Value> extensions = 13;\n}\n\n// `Header` is a representation of OpenAPI v2 specification's Header object.\n//\n// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#headerObject\n//\nmessage Header {\n  // `Description` is a short description of the header.\n  string description = 1;\n  // The type of the object. The value MUST be one of \"string\", \"number\", \"integer\", or \"boolean\". The \"array\" type is not supported.\n  string type = 2;\n  // `Format` The extending format for the previously mentioned type.\n  string format = 3;\n  // field 4 is reserved for 'items', but in OpenAPI-specific way.\n  reserved 4;\n  // field 5 is reserved `Collection Format` Determines the format of the array if type array is used.\n  reserved 5;\n  // `Default` Declares the value of the header that the server will use if none is provided.\n  // See: https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-6.2.\n  // Unlike JSON Schema this value MUST conform to the defined type for the header.\n  string default = 6;\n  // field 7 is reserved for 'maximum'.\n  reserved 7;\n  // field 8 is reserved for 'exclusiveMaximum'.\n  reserved 8;\n  // field 9 is reserved for 'minimum'.\n  reserved 9;\n  // field 10 is reserved for 'exclusiveMinimum'.\n  reserved 10;\n  // field 11 is reserved for 'maxLength'.\n  reserved 11;\n  // field 12 is reserved for 'minLength'.\n  reserved 12;\n  // 'Pattern' See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.2.3.\n  string pattern = 13;\n  // field 14 is reserved for 'maxItems'.\n  reserved 14;\n  // field 15 is reserved for 'minItems'.\n  reserved 15;\n  // field 16 is reserved for 'uniqueItems'.\n  reserved 16;\n  // field 17 is reserved for 'enum'.\n  reserved 17;\n  // field 18 is reserved for 'multipleOf'.\n  reserved 18;\n}\n\n// `Response` is a representation of OpenAPI v2 specification's Response object.\n//\n// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#responseObject\n//\nmessage Response {\n  // `Description` is a short description of the response.\n  // GFM syntax can be used for rich text representation.\n  string description = 1;\n  // `Schema` optionally defines the structure of the response.\n  // If `Schema` is not provided, it means there is no content to the response.\n  Schema schema = 2;\n  // `Headers` A list of headers that are sent with the response.\n  // `Header` name is expected to be a string in the canonical format of the MIME header key\n  // See: https://golang.org/pkg/net/textproto/#CanonicalMIMEHeaderKey\n  map<string, Header> headers = 3;\n  // `Examples` gives per-mimetype response examples.\n  // See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#example-object\n  map<string, string> examples = 4;\n  map<string, google.protobuf.Value> extensions = 5;\n}\n\n// `Info` is a representation of OpenAPI v2 specification's Info object.\n//\n// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#infoObject\n//\n// Example:\n//\n//  option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {\n//    info: {\n//      title: \"Echo API\";\n//      version: \"1.0\";\n//      description: \";\n//      contact: {\n//        name: \"gRPC-Gateway project\";\n//        url: \"https://github.com/grpc-ecosystem/grpc-gateway\";\n//        email: \"none@example.com\";\n//      };\n//      license: {\n//        name: \"BSD 3-Clause License\";\n//        url: \"https://github.com/grpc-ecosystem/grpc-gateway/blob/master/LICENSE.txt\";\n//      };\n//    };\n//    ...\n//  };\n//\nmessage Info {\n  // The title of the application.\n  string title = 1;\n  // A short description of the application. GFM syntax can be used for rich\n  // text representation.\n  string description = 2;\n  // The Terms of Service for the API.\n  string terms_of_service = 3;\n  // The contact information for the exposed API.\n  Contact contact = 4;\n  // The license information for the exposed API.\n  License license = 5;\n  // Provides the version of the application API (not to be confused\n  // with the specification version).\n  string version = 6;\n  map<string, google.protobuf.Value> extensions = 7;\n}\n\n// `Contact` is a representation of OpenAPI v2 specification's Contact object.\n//\n// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#contactObject\n//\n// Example:\n//\n//  option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {\n//    info: {\n//      ...\n//      contact: {\n//        name: \"gRPC-Gateway project\";\n//        url: \"https://github.com/grpc-ecosystem/grpc-gateway\";\n//        email: \"none@example.com\";\n//      };\n//      ...\n//    };\n//    ...\n//  };\n//\nmessage Contact {\n  // The identifying name of the contact person/organization.\n  string name = 1;\n  // The URL pointing to the contact information. MUST be in the format of a\n  // URL.\n  string url = 2;\n  // The email address of the contact person/organization. MUST be in the format\n  // of an email address.\n  string email = 3;\n}\n\n// `License` is a representation of OpenAPI v2 specification's License object.\n//\n// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#licenseObject\n//\n// Example:\n//\n//  option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {\n//    info: {\n//      ...\n//      license: {\n//        name: \"BSD 3-Clause License\";\n//        url: \"https://github.com/grpc-ecosystem/grpc-gateway/blob/master/LICENSE.txt\";\n//      };\n//      ...\n//    };\n//    ...\n//  };\n//\nmessage License {\n  // The license name used for the API.\n  string name = 1;\n  // A URL to the license used for the API. MUST be in the format of a URL.\n  string url = 2;\n}\n\n// `ExternalDocumentation` is a representation of OpenAPI v2 specification's\n// ExternalDocumentation object.\n//\n// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#externalDocumentationObject\n//\n// Example:\n//\n//  option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {\n//    ...\n//    external_docs: {\n//      description: \"More about gRPC-Gateway\";\n//      url: \"https://github.com/grpc-ecosystem/grpc-gateway\";\n//    }\n//    ...\n//  };\n//\nmessage ExternalDocumentation {\n  // A short description of the target documentation. GFM syntax can be used for\n  // rich text representation.\n  string description = 1;\n  // The URL for the target documentation. Value MUST be in the format\n  // of a URL.\n  string url = 2;\n}\n\n// `Schema` is a representation of OpenAPI v2 specification's Schema object.\n//\n// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#schemaObject\n//\nmessage Schema {\n  JSONSchema json_schema = 1;\n  // Adds support for polymorphism. The discriminator is the schema property\n  // name that is used to differentiate between other schema that inherit this\n  // schema. The property name used MUST be defined at this schema and it MUST\n  // be in the required property list. When used, the value MUST be the name of\n  // this schema or any schema that inherits it.\n  string discriminator = 2;\n  // Relevant only for Schema \"properties\" definitions. Declares the property as\n  // \"read only\". This means that it MAY be sent as part of a response but MUST\n  // NOT be sent as part of the request. Properties marked as readOnly being\n  // true SHOULD NOT be in the required list of the defined schema. Default\n  // value is false.\n  bool read_only = 3;\n  // field 4 is reserved for 'xml'.\n  reserved 4;\n  // Additional external documentation for this schema.\n  ExternalDocumentation external_docs = 5;\n  // A free-form property to include an example of an instance for this schema in JSON.\n  // This is copied verbatim to the output.\n  string example = 6;\n}\n\n// `JSONSchema` represents properties from JSON Schema taken, and as used, in\n// the OpenAPI v2 spec.\n//\n// This includes changes made by OpenAPI v2.\n//\n// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#schemaObject\n//\n// See also: https://cswr.github.io/JsonSchema/spec/basic_types/,\n// https://github.com/json-schema-org/json-schema-spec/blob/master/schema.json\n//\n// Example:\n//\n//  message SimpleMessage {\n//    option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = {\n//      json_schema: {\n//        title: \"SimpleMessage\"\n//        description: \"A simple message.\"\n//        required: [\"id\"]\n//      }\n//    };\n//\n//    // Id represents the message identifier.\n//    string id = 1; [\n//        (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {\n//          {description: \"The unique identifier of the simple message.\"\n//        }];\n//  }\n//\nmessage JSONSchema {\n  // field 1 is reserved for '$id', omitted from OpenAPI v2.\n  reserved 1;\n  // field 2 is reserved for '$schema', omitted from OpenAPI v2.\n  reserved 2;\n  // Ref is used to define an external reference to include in the message.\n  // This could be a fully qualified proto message reference, and that type must\n  // be imported into the protofile. If no message is identified, the Ref will\n  // be used verbatim in the output.\n  // For example:\n  //  `ref: \".google.protobuf.Timestamp\"`.\n  string ref = 3;\n  // field 4 is reserved for '$comment', omitted from OpenAPI v2.\n  reserved 4;\n  // The title of the schema.\n  string title = 5;\n  // A short description of the schema.\n  string description = 6;\n  string default = 7;\n  bool read_only = 8;\n  // A free-form property to include a JSON example of this field. This is copied\n  // verbatim to the output swagger.json. Quotes must be escaped.\n  // This property is the same for 2.0 and 3.0.0 https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/3.0.0.md#schemaObject  https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#schemaObject\n  string example = 9;\n  double multiple_of = 10;\n  // Maximum represents an inclusive upper limit for a numeric instance. The \n  // value of MUST be a number, \n  double maximum = 11;\n  bool exclusive_maximum = 12;\n  // minimum represents an inclusive lower limit for a numeric instance. The \n  // value of MUST be a number, \n  double minimum = 13;\n  bool exclusive_minimum = 14;\n  uint64 max_length = 15;\n  uint64 min_length = 16;\n  string pattern = 17;\n  // field 18 is reserved for 'additionalItems', omitted from OpenAPI v2.\n  reserved 18;\n  // field 19 is reserved for 'items', but in OpenAPI-specific way.\n  // TODO(ivucica): add 'items'?\n  reserved 19;\n  uint64 max_items = 20;\n  uint64 min_items = 21;\n  bool unique_items = 22;\n  // field 23 is reserved for 'contains', omitted from OpenAPI v2.\n  reserved 23;\n  uint64 max_properties = 24;\n  uint64 min_properties = 25;\n  repeated string required = 26;\n  // field 27 is reserved for 'additionalProperties', but in OpenAPI-specific\n  // way. TODO(ivucica): add 'additionalProperties'?\n  reserved 27;\n  // field 28 is reserved for 'definitions', omitted from OpenAPI v2.\n  reserved 28;\n  // field 29 is reserved for 'properties', but in OpenAPI-specific way.\n  // TODO(ivucica): add 'additionalProperties'?\n  reserved 29;\n  // following fields are reserved, as the properties have been omitted from\n  // OpenAPI v2:\n  // patternProperties, dependencies, propertyNames, const\n  reserved 30 to 33;\n  // Items in 'array' must be unique.\n  repeated string array = 34;\n\n  enum JSONSchemaSimpleTypes {\n    UNKNOWN = 0;\n    ARRAY = 1;\n    BOOLEAN = 2;\n    INTEGER = 3;\n    NULL = 4;\n    NUMBER = 5;\n    OBJECT = 6;\n    STRING = 7;\n  }\n\n  repeated JSONSchemaSimpleTypes type = 35;\n  // `Format`\n  string format = 36;\n  // following fields are reserved, as the properties have been omitted from \n  // OpenAPI v2: contentMediaType, contentEncoding, if, then, else\n  reserved 37 to 41;\n  // field 42 is reserved for 'allOf', but in OpenAPI-specific way.\n  // TODO(ivucica): add 'allOf'?\n  reserved 42;\n  // following fields are reserved, as the properties have been omitted from\n  // OpenAPI v2:\n  // anyOf, oneOf, not\n  reserved 43 to 45;\n  // Items in `enum` must be unique https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.5.1\n  repeated string enum = 46;\n}\n\n// `Tag` is a representation of OpenAPI v2 specification's Tag object.\n//\n// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#tagObject\n//\nmessage Tag {\n  // field 1 is reserved for 'name'. In our generator, this is (to be) extracted\n  // from the name of proto service, and thus not exposed to the user, as\n  // changing tag object's name would break the link to the references to the\n  // tag in individual operation specifications.\n  //\n  // TODO(ivucica): Add 'name' property. Use it to allow override of the name of\n  // global Tag object, then use that name to reference the tag throughout the\n  // OpenAPI file.\n  reserved 1;\n  // A short description for the tag. GFM syntax can be used for rich text \n  // representation.\n  string description = 2;\n  // Additional external documentation for this tag.\n  ExternalDocumentation external_docs = 3;\n}\n\n// `SecurityDefinitions` is a representation of OpenAPI v2 specification's\n// Security Definitions object.\n//\n// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#securityDefinitionsObject\n//\n// A declaration of the security schemes available to be used in the\n// specification. This does not enforce the security schemes on the operations\n// and only serves to provide the relevant details for each scheme.\nmessage SecurityDefinitions {\n  // A single security scheme definition, mapping a \"name\" to the scheme it\n  // defines.\n  map<string, SecurityScheme> security = 1;\n}\n\n// `SecurityScheme` is a representation of OpenAPI v2 specification's\n// Security Scheme object.\n//\n// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#securitySchemeObject\n//\n// Allows the definition of a security scheme that can be used by the\n// operations. Supported schemes are basic authentication, an API key (either as\n// a header or as a query parameter) and OAuth2's common flows (implicit,\n// password, application and access code).\nmessage SecurityScheme {\n  // The type of the security scheme. Valid values are \"basic\",\n  // \"apiKey\" or \"oauth2\".\n  enum Type {\n    TYPE_INVALID = 0;\n    TYPE_BASIC = 1;\n    TYPE_API_KEY = 2;\n    TYPE_OAUTH2 = 3;\n  }\n\n  // The location of the API key. Valid values are \"query\" or \"header\".\n  enum In {\n    IN_INVALID = 0;\n    IN_QUERY = 1;\n    IN_HEADER = 2;\n  }\n\n  // The flow used by the OAuth2 security scheme. Valid values are\n  // \"implicit\", \"password\", \"application\" or \"accessCode\".\n  enum Flow {\n    FLOW_INVALID = 0;\n    FLOW_IMPLICIT = 1;\n    FLOW_PASSWORD = 2;\n    FLOW_APPLICATION = 3;\n    FLOW_ACCESS_CODE = 4;\n  }\n\n  // The type of the security scheme. Valid values are \"basic\",\n  // \"apiKey\" or \"oauth2\".\n  Type type = 1;\n  // A short description for security scheme.\n  string description = 2;\n  // The name of the header or query parameter to be used.\n  // Valid for apiKey.\n  string name = 3;\n  // The location of the API key. Valid values are \"query\" or\n  // \"header\".\n  // Valid for apiKey.\n  In in = 4;\n  // The flow used by the OAuth2 security scheme. Valid values are\n  // \"implicit\", \"password\", \"application\" or \"accessCode\".\n  // Valid for oauth2.\n  Flow flow = 5;\n  // The authorization URL to be used for this flow. This SHOULD be in\n  // the form of a URL.\n  // Valid for oauth2/implicit and oauth2/accessCode.\n  string authorization_url = 6;\n  // The token URL to be used for this flow. This SHOULD be in the\n  // form of a URL.\n  // Valid for oauth2/password, oauth2/application and oauth2/accessCode.\n  string token_url = 7;\n  // The available scopes for the OAuth2 security scheme.\n  // Valid for oauth2.\n  Scopes scopes = 8;\n  map<string, google.protobuf.Value> extensions = 9;\n}\n\n// `SecurityRequirement` is a representation of OpenAPI v2 specification's\n// Security Requirement object.\n//\n// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#securityRequirementObject\n//\n// Lists the required security schemes to execute this operation. The object can\n// have multiple security schemes declared in it which are all required (that\n// is, there is a logical AND between the schemes).\n//\n// The name used for each property MUST correspond to a security scheme\n// declared in the Security Definitions.\nmessage SecurityRequirement {\n  // If the security scheme is of type \"oauth2\", then the value is a list of\n  // scope names required for the execution. For other security scheme types,\n  // the array MUST be empty.\n  message SecurityRequirementValue {\n    repeated string scope = 1;\n  }\n  // Each name must correspond to a security scheme which is declared in\n  // the Security Definitions. If the security scheme is of type \"oauth2\",\n  // then the value is a list of scope names required for the execution.\n  // For other security scheme types, the array MUST be empty.\n  map<string, SecurityRequirementValue> security_requirement = 1;\n}\n\n// `Scopes` is a representation of OpenAPI v2 specification's Scopes object.\n//\n// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#scopesObject\n//\n// Lists the available scopes for an OAuth2 security scheme.\nmessage Scopes {\n  // Maps between a name of a scope to a short description of it (as the value\n  // of the property).\n  map<string, string> scope = 1;\n}"
  },
  {
    "path": "shop/third_party/validate/README.md",
    "content": "# protoc-gen-validate (PGV)\n\n* https://github.com/envoyproxy/protoc-gen-validate\n"
  },
  {
    "path": "shop/third_party/validate/validate.proto",
    "content": "syntax = \"proto2\";\npackage validate;\n\noption go_package = \"github.com/envoyproxy/protoc-gen-validate/validate\";\noption java_package = \"io.envoyproxy.pgv.validate\";\n\nimport \"google/protobuf/descriptor.proto\";\nimport \"google/protobuf/duration.proto\";\nimport \"google/protobuf/timestamp.proto\";\n\n// Validation rules applied at the message level\nextend google.protobuf.MessageOptions {\n    // Disabled nullifies any validation rules for this message, including any\n    // message fields associated with it that do support validation.\n    optional bool disabled = 1071;\n    // Ignore skips generation of validation methods for this message.\n    optional bool ignored = 1072;\n}\n\n// Validation rules applied at the oneof level\nextend google.protobuf.OneofOptions {\n    // Required ensures that exactly one the field options in a oneof is set;\n    // validation fails if no fields in the oneof are set.\n    optional bool required = 1071;\n}\n\n// Validation rules applied at the field level\nextend google.protobuf.FieldOptions {\n    // Rules specify the validations to be performed on this field. By default,\n    // no validation is performed against a field.\n    optional FieldRules rules = 1071;\n}\n\n// FieldRules encapsulates the rules for each type of field. Depending on the\n// field, the correct set should be used to ensure proper validations.\nmessage FieldRules {\n    optional MessageRules message = 17;\n    oneof type {\n        // Scalar Field Types\n        FloatRules    float    = 1;\n        DoubleRules   double   = 2;\n        Int32Rules    int32    = 3;\n        Int64Rules    int64    = 4;\n        UInt32Rules   uint32   = 5;\n        UInt64Rules   uint64   = 6;\n        SInt32Rules   sint32   = 7;\n        SInt64Rules   sint64   = 8;\n        Fixed32Rules  fixed32  = 9;\n        Fixed64Rules  fixed64  = 10;\n        SFixed32Rules sfixed32 = 11;\n        SFixed64Rules sfixed64 = 12;\n        BoolRules     bool     = 13;\n        StringRules   string   = 14;\n        BytesRules    bytes    = 15;\n\n        // Complex Field Types\n        EnumRules     enum     = 16;\n        RepeatedRules repeated = 18;\n        MapRules      map      = 19;\n\n        // Well-Known Field Types\n        AnyRules       any       = 20;\n        DurationRules  duration  = 21;\n        TimestampRules timestamp = 22;\n    }\n}\n\n// FloatRules describes the constraints applied to `float` values\nmessage FloatRules {\n    // Const specifies that this field must be exactly the specified value\n    optional float const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional float lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional float lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional float gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional float gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated float in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated float not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// DoubleRules describes the constraints applied to `double` values\nmessage DoubleRules {\n    // Const specifies that this field must be exactly the specified value\n    optional double const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional double lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional double lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional double gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional double gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated double in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated double not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// Int32Rules describes the constraints applied to `int32` values\nmessage Int32Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional int32 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional int32 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional int32 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional int32 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional int32 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated int32 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated int32 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// Int64Rules describes the constraints applied to `int64` values\nmessage Int64Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional int64 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional int64 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional int64 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional int64 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional int64 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated int64 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated int64 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// UInt32Rules describes the constraints applied to `uint32` values\nmessage UInt32Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional uint32 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional uint32 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional uint32 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional uint32 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional uint32 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated uint32 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated uint32 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// UInt64Rules describes the constraints applied to `uint64` values\nmessage UInt64Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional uint64 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional uint64 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional uint64 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional uint64 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional uint64 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated uint64 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated uint64 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// SInt32Rules describes the constraints applied to `sint32` values\nmessage SInt32Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional sint32 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional sint32 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional sint32 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional sint32 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional sint32 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated sint32 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated sint32 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// SInt64Rules describes the constraints applied to `sint64` values\nmessage SInt64Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional sint64 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional sint64 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional sint64 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional sint64 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional sint64 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated sint64 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated sint64 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// Fixed32Rules describes the constraints applied to `fixed32` values\nmessage Fixed32Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional fixed32 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional fixed32 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional fixed32 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional fixed32 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional fixed32 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated fixed32 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated fixed32 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// Fixed64Rules describes the constraints applied to `fixed64` values\nmessage Fixed64Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional fixed64 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional fixed64 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional fixed64 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional fixed64 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional fixed64 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated fixed64 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated fixed64 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// SFixed32Rules describes the constraints applied to `sfixed32` values\nmessage SFixed32Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional sfixed32 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional sfixed32 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional sfixed32 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional sfixed32 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional sfixed32 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated sfixed32 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated sfixed32 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// SFixed64Rules describes the constraints applied to `sfixed64` values\nmessage SFixed64Rules {\n    // Const specifies that this field must be exactly the specified value\n    optional sfixed64 const = 1;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional sfixed64 lt = 2;\n\n    // Lte specifies that this field must be less than or equal to the\n    // specified value, inclusive\n    optional sfixed64 lte = 3;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive. If the value of Gt is larger than a specified Lt or Lte, the\n    // range is reversed.\n    optional sfixed64 gt = 4;\n\n    // Gte specifies that this field must be greater than or equal to the\n    // specified value, inclusive. If the value of Gte is larger than a\n    // specified Lt or Lte, the range is reversed.\n    optional sfixed64 gte = 5;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated sfixed64 in = 6;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated sfixed64 not_in = 7;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 8;\n}\n\n// BoolRules describes the constraints applied to `bool` values\nmessage BoolRules {\n    // Const specifies that this field must be exactly the specified value\n    optional bool const = 1;\n}\n\n// StringRules describe the constraints applied to `string` values\nmessage StringRules {\n    // Const specifies that this field must be exactly the specified value\n    optional string const = 1;\n\n    // Len specifies that this field must be the specified number of\n    // characters (Unicode code points). Note that the number of\n    // characters may differ from the number of bytes in the string.\n    optional uint64 len = 19;\n\n    // MinLen specifies that this field must be the specified number of\n    // characters (Unicode code points) at a minimum. Note that the number of\n    // characters may differ from the number of bytes in the string.\n    optional uint64 min_len = 2;\n\n    // MaxLen specifies that this field must be the specified number of\n    // characters (Unicode code points) at a maximum. Note that the number of\n    // characters may differ from the number of bytes in the string.\n    optional uint64 max_len = 3;\n\n    // LenBytes specifies that this field must be the specified number of bytes\n    // at a minimum\n    optional uint64 len_bytes = 20;\n\n    // MinBytes specifies that this field must be the specified number of bytes\n    // at a minimum\n    optional uint64 min_bytes = 4;\n\n    // MaxBytes specifies that this field must be the specified number of bytes\n    // at a maximum\n    optional uint64 max_bytes = 5;\n\n    // Pattern specifes that this field must match against the specified\n    // regular expression (RE2 syntax). The included expression should elide\n    // any delimiters.\n    optional string pattern  = 6;\n\n    // Prefix specifies that this field must have the specified substring at\n    // the beginning of the string.\n    optional string prefix   = 7;\n\n    // Suffix specifies that this field must have the specified substring at\n    // the end of the string.\n    optional string suffix   = 8;\n\n    // Contains specifies that this field must have the specified substring\n    // anywhere in the string.\n    optional string contains = 9;\n\n    // NotContains specifies that this field cannot have the specified substring\n    // anywhere in the string.\n    optional string not_contains = 23;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated string in     = 10;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated string not_in = 11;\n\n    // WellKnown rules provide advanced constraints against common string\n    // patterns\n    oneof well_known {\n        // Email specifies that the field must be a valid email address as\n        // defined by RFC 5322\n        bool email    = 12;\n\n        // Hostname specifies that the field must be a valid hostname as\n        // defined by RFC 1034. This constraint does not support\n        // internationalized domain names (IDNs).\n        bool hostname = 13;\n\n        // Ip specifies that the field must be a valid IP (v4 or v6) address.\n        // Valid IPv6 addresses should not include surrounding square brackets.\n        bool ip       = 14;\n\n        // Ipv4 specifies that the field must be a valid IPv4 address.\n        bool ipv4     = 15;\n\n        // Ipv6 specifies that the field must be a valid IPv6 address. Valid\n        // IPv6 addresses should not include surrounding square brackets.\n        bool ipv6     = 16;\n\n        // Uri specifies that the field must be a valid, absolute URI as defined\n        // by RFC 3986\n        bool uri      = 17;\n\n        // UriRef specifies that the field must be a valid URI as defined by RFC\n        // 3986 and may be relative or absolute.\n        bool uri_ref  = 18;\n\n        // Address specifies that the field must be either a valid hostname as\n        // defined by RFC 1034 (which does not support internationalized domain\n        // names or IDNs), or it can be a valid IP (v4 or v6).\n        bool address  = 21;\n\n        // Uuid specifies that the field must be a valid UUID as defined by\n        // RFC 4122\n        bool uuid     = 22;\n\n        // WellKnownRegex specifies a common well known pattern defined as a regex.\n        KnownRegex well_known_regex = 24;\n    }\n\n  // This applies to regexes HTTP_HEADER_NAME and HTTP_HEADER_VALUE to enable\n  // strict header validation.\n  // By default, this is true, and HTTP header validations are RFC-compliant.\n  // Setting to false will enable a looser validations that only disallows\n  // \\r\\n\\0 characters, which can be used to bypass header matching rules.\n  optional bool strict = 25 [default = true];\n\n  // IgnoreEmpty specifies that the validation rules of this field should be\n  // evaluated only if the field is not empty\n  optional bool ignore_empty = 26;\n}\n\n// WellKnownRegex contain some well-known patterns.\nenum KnownRegex {\n  UNKNOWN = 0;\n\n  // HTTP header name as defined by RFC 7230.\n  HTTP_HEADER_NAME = 1;\n\n  // HTTP header value as defined by RFC 7230.\n  HTTP_HEADER_VALUE = 2;\n}\n\n// BytesRules describe the constraints applied to `bytes` values\nmessage BytesRules {\n    // Const specifies that this field must be exactly the specified value\n    optional bytes const = 1;\n\n    // Len specifies that this field must be the specified number of bytes\n    optional uint64 len = 13;\n\n    // MinLen specifies that this field must be the specified number of bytes\n    // at a minimum\n    optional uint64 min_len = 2;\n\n    // MaxLen specifies that this field must be the specified number of bytes\n    // at a maximum\n    optional uint64 max_len = 3;\n\n    // Pattern specifes that this field must match against the specified\n    // regular expression (RE2 syntax). The included expression should elide\n    // any delimiters.\n    optional string pattern  = 4;\n\n    // Prefix specifies that this field must have the specified bytes at the\n    // beginning of the string.\n    optional bytes  prefix   = 5;\n\n    // Suffix specifies that this field must have the specified bytes at the\n    // end of the string.\n    optional bytes  suffix   = 6;\n\n    // Contains specifies that this field must have the specified bytes\n    // anywhere in the string.\n    optional bytes  contains = 7;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated bytes in     = 8;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated bytes not_in = 9;\n\n    // WellKnown rules provide advanced constraints against common byte\n    // patterns\n    oneof well_known {\n        // Ip specifies that the field must be a valid IP (v4 or v6) address in\n        // byte format\n        bool ip   = 10;\n\n        // Ipv4 specifies that the field must be a valid IPv4 address in byte\n        // format\n        bool ipv4 = 11;\n\n        // Ipv6 specifies that the field must be a valid IPv6 address in byte\n        // format\n        bool ipv6 = 12;\n    }\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 14;\n}\n\n// EnumRules describe the constraints applied to enum values\nmessage EnumRules {\n    // Const specifies that this field must be exactly the specified value\n    optional int32 const        = 1;\n\n    // DefinedOnly specifies that this field must be only one of the defined\n    // values for this enum, failing on any undefined value.\n    optional bool  defined_only = 2;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated int32 in           = 3;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated int32 not_in       = 4;\n}\n\n// MessageRules describe the constraints applied to embedded message values.\n// For message-type fields, validation is performed recursively.\nmessage MessageRules {\n    // Skip specifies that the validation rules of this field should not be\n    // evaluated\n    optional bool skip     = 1;\n\n    // Required specifies that this field must be set\n    optional bool required = 2;\n}\n\n// RepeatedRules describe the constraints applied to `repeated` values\nmessage RepeatedRules {\n    // MinItems specifies that this field must have the specified number of\n    // items at a minimum\n    optional uint64 min_items = 1;\n\n    // MaxItems specifies that this field must have the specified number of\n    // items at a maximum\n    optional uint64 max_items = 2;\n\n    // Unique specifies that all elements in this field must be unique. This\n    // contraint is only applicable to scalar and enum types (messages are not\n    // supported).\n    optional bool   unique    = 3;\n\n    // Items specifies the contraints to be applied to each item in the field.\n    // Repeated message fields will still execute validation against each item\n    // unless skip is specified here.\n    optional FieldRules items = 4;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 5;\n}\n\n// MapRules describe the constraints applied to `map` values\nmessage MapRules {\n    // MinPairs specifies that this field must have the specified number of\n    // KVs at a minimum\n    optional uint64 min_pairs = 1;\n\n    // MaxPairs specifies that this field must have the specified number of\n    // KVs at a maximum\n    optional uint64 max_pairs = 2;\n\n    // NoSparse specifies values in this field cannot be unset. This only\n    // applies to map's with message value types.\n    optional bool no_sparse = 3;\n\n    // Keys specifies the constraints to be applied to each key in the field.\n    optional FieldRules keys   = 4;\n\n    // Values specifies the constraints to be applied to the value of each key\n    // in the field. Message values will still have their validations evaluated\n    // unless skip is specified here.\n    optional FieldRules values = 5;\n\n    // IgnoreEmpty specifies that the validation rules of this field should be\n    // evaluated only if the field is not empty\n    optional bool ignore_empty = 6;\n}\n\n// AnyRules describe constraints applied exclusively to the\n// `google.protobuf.Any` well-known type\nmessage AnyRules {\n    // Required specifies that this field must be set\n    optional bool required = 1;\n\n    // In specifies that this field's `type_url` must be equal to one of the\n    // specified values.\n    repeated string in     = 2;\n\n    // NotIn specifies that this field's `type_url` must not be equal to any of\n    // the specified values.\n    repeated string not_in = 3;\n}\n\n// DurationRules describe the constraints applied exclusively to the\n// `google.protobuf.Duration` well-known type\nmessage DurationRules {\n    // Required specifies that this field must be set\n    optional bool required = 1;\n\n    // Const specifies that this field must be exactly the specified value\n    optional google.protobuf.Duration const = 2;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional google.protobuf.Duration lt = 3;\n\n    // Lt specifies that this field must be less than the specified value,\n    // inclusive\n    optional google.protobuf.Duration lte = 4;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive\n    optional google.protobuf.Duration gt = 5;\n\n    // Gte specifies that this field must be greater than the specified value,\n    // inclusive\n    optional google.protobuf.Duration gte = 6;\n\n    // In specifies that this field must be equal to one of the specified\n    // values\n    repeated google.protobuf.Duration in = 7;\n\n    // NotIn specifies that this field cannot be equal to one of the specified\n    // values\n    repeated google.protobuf.Duration not_in = 8;\n}\n\n// TimestampRules describe the constraints applied exclusively to the\n// `google.protobuf.Timestamp` well-known type\nmessage TimestampRules {\n    // Required specifies that this field must be set\n    optional bool required = 1;\n\n    // Const specifies that this field must be exactly the specified value\n    optional google.protobuf.Timestamp const = 2;\n\n    // Lt specifies that this field must be less than the specified value,\n    // exclusive\n    optional google.protobuf.Timestamp lt = 3;\n\n    // Lte specifies that this field must be less than the specified value,\n    // inclusive\n    optional google.protobuf.Timestamp lte = 4;\n\n    // Gt specifies that this field must be greater than the specified value,\n    // exclusive\n    optional google.protobuf.Timestamp gt = 5;\n\n    // Gte specifies that this field must be greater than the specified value,\n    // inclusive\n    optional google.protobuf.Timestamp gte = 6;\n\n    // LtNow specifies that this must be less than the current time. LtNow\n    // can only be used with the Within rule.\n    optional bool lt_now  = 7;\n\n    // GtNow specifies that this must be greater than the current time. GtNow\n    // can only be used with the Within rule.\n    optional bool gt_now  = 8;\n\n    // Within specifies that this field must be within this duration of the\n    // current time. This constraint can be used alone or with the LtNow and\n    // GtNow rules.\n    optional google.protobuf.Duration within = 9;\n}\n"
  },
  {
    "path": "web/admin/config/config.dev.js",
    "content": "// https://umijs.org/config/\nimport { defineConfig } from 'umi';\nexport default defineConfig({\n  plugins: [\n    // https://github.com/zthxxx/react-dev-inspector\n    'react-dev-inspector/plugins/umi/react-inspector',\n  ],\n  // https://github.com/zthxxx/react-dev-inspector#inspector-loader-props\n  inspectorConfig: {\n    exclude: [],\n    babelPlugins: [],\n    babelOptions: {},\n  },\n});\n"
  },
  {
    "path": "web/admin/config/config.js",
    "content": "// https://umijs.org/config/\nimport { defineConfig } from 'umi';\nimport { join } from 'path';\nimport defaultSettings from './defaultSettings';\nimport proxy from './proxy';\nimport routes from './routes';\nconst { REACT_APP_ENV } = process.env;\nexport default defineConfig({\n  hash: true,\n  antd: {},\n  dva: {\n    hmr: true,\n  },\n  layout: {\n    // https://umijs.org/zh-CN/plugins/plugin-layout\n    locale: true,\n    siderWidth: 208,\n    ...defaultSettings,\n  },\n  // https://umijs.org/zh-CN/plugins/plugin-locale\n  locale: {\n    // default zh-CN\n    default: 'zh-CN',\n    antd: true,\n    // default true, when it is true, will use `navigator.language` overwrite default\n    baseNavigator: true,\n  },\n  dynamicImport: {\n    loading: '@ant-design/pro-layout/es/PageLoading',\n  },\n  targets: {\n    ie: 11,\n  },\n  // umi routes: https://umijs.org/docs/routing\n  routes,\n  // Theme for antd: https://ant.design/docs/react/customize-theme-cn\n  theme: {\n    'root-entry-name': 'variable',\n  },\n  // esbuild is father build tools\n  // https://umijs.org/plugins/plugin-esbuild\n  esbuild: {},\n  title: false,\n  ignoreMomentLocale: true,\n  proxy: proxy[REACT_APP_ENV || 'dev'],\n    manifest: {\n    basePath: '/',\n  },\n  // Fast Refresh 热更新\n  fastRefresh: {},\n  openAPI: [\n    {\n      requestLibPath: \"import { request } from 'umi'\",\n      // 或者使用在线的版本\n      // schemaPath: \"https://gw.alipayobjects.com/os/antfincdn/M%24jrzTTYJN/oneapi.json\"\n      schemaPath: join(__dirname, 'oneapi.json'),\n      mock: false,\n    },\n    {\n      requestLibPath: \"import { request } from 'umi'\",\n      schemaPath: 'https://gw.alipayobjects.com/os/antfincdn/CA1dOm%2631B/openapi.json',\n      projectName: 'swagger',\n    },\n  ],\n  nodeModulesTransform: {\n    type: 'none',\n  },\n  mfsu: {},\n  webpack5: {},\n  exportStatic: {},\n});\n"
  },
  {
    "path": "web/admin/config/defaultSettings.js",
    "content": "const Settings = {\n  navTheme: 'light',\n  // 拂晓蓝\n  primaryColor: '#1890ff',\n  layout: 'mix',\n  contentWidth: 'Fluid',\n  fixedHeader: false,\n  fixSiderbar: true,\n  colorWeak: false,\n  title: 'Ant Design Pro',\n  pwa: false,\n  logo: 'https://gw.alipayobjects.com/zos/rmsportal/KDpgvguMpGfqaHPjicRK.svg',\n  iconfontUrl: '',\n};\nexport default Settings;\n"
  },
  {
    "path": "web/admin/config/oneapi.json",
    "content": "{\n  \"openapi\": \"3.0.1\",\n  \"info\": {\n    \"title\": \"Ant Design Pro\",\n    \"version\": \"1.0.0\"\n  },\n  \"servers\": [\n    {\n      \"url\": \"http://localhost:8000/\"\n    },\n    {\n      \"url\": \"https://localhost:8000/\"\n    }\n  ],\n  \"paths\": {\n    \"/api/currentUser\": {\n      \"get\": {\n        \"tags\": [\"api\"],\n        \"description\": \"获取当前的用户\",\n        \"operationId\": \"currentUser\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Success\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/CurrentUser\"\n                }\n              }\n            }\n          },\n          \"401\": {\n            \"description\": \"Error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ErrorResponse\"\n                }\n              }\n            }\n          }\n        }\n      },\n      \"x-swagger-router-controller\": \"api\"\n    },\n    \"/api/login/captcha\": {\n      \"post\": {\n        \"description\": \"发送验证码\",\n        \"operationId\": \"getFakeCaptcha\",\n        \"tags\": [\"login\"],\n        \"parameters\": [\n          {\n            \"name\": \"phone\",\n            \"in\": \"query\",\n            \"description\": \"手机号\",\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Success\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/FakeCaptcha\"\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/api/login/outLogin\": {\n      \"post\": {\n        \"description\": \"登录接口\",\n        \"operationId\": \"outLogin\",\n        \"tags\": [\"login\"],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Success\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\"\n                }\n              }\n            }\n          },\n          \"401\": {\n            \"description\": \"Error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ErrorResponse\"\n                }\n              }\n            }\n          }\n        }\n      },\n      \"x-swagger-router-controller\": \"api\"\n    },\n    \"/api/login/account\": {\n      \"post\": {\n        \"tags\": [\"login\"],\n        \"description\": \"登录接口\",\n        \"operationId\": \"login\",\n        \"requestBody\": {\n          \"description\": \"登录系统\",\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/LoginParams\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Success\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/LoginResult\"\n                }\n              }\n            }\n          },\n          \"401\": {\n            \"description\": \"Error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ErrorResponse\"\n                }\n              }\n            }\n          }\n        },\n        \"x-codegen-request-body-name\": \"body\"\n      },\n      \"x-swagger-router-controller\": \"api\"\n    },\n    \"/api/notices\": {\n      \"summary\": \"getNotices\",\n      \"description\": \"NoticeIconItem\",\n      \"get\": {\n        \"tags\": [\"api\"],\n        \"operationId\": \"getNotices\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Success\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/NoticeIconList\"\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/api/rule\": {\n      \"get\": {\n        \"tags\": [\"rule\"],\n        \"description\": \"获取规则列表\",\n        \"operationId\": \"rule\",\n        \"parameters\": [\n          {\n            \"name\": \"current\",\n            \"in\": \"query\",\n            \"description\": \"当前的页码\",\n            \"schema\": {\n              \"type\": \"number\"\n            }\n          },\n          {\n            \"name\": \"pageSize\",\n            \"in\": \"query\",\n            \"description\": \"页面的容量\",\n            \"schema\": {\n              \"type\": \"number\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Success\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/RuleList\"\n                }\n              }\n            }\n          },\n          \"401\": {\n            \"description\": \"Error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ErrorResponse\"\n                }\n              }\n            }\n          }\n        }\n      },\n      \"post\": {\n        \"tags\": [\"rule\"],\n        \"description\": \"新建规则\",\n        \"operationId\": \"addRule\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Success\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/RuleListItem\"\n                }\n              }\n            }\n          },\n          \"401\": {\n            \"description\": \"Error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ErrorResponse\"\n                }\n              }\n            }\n          }\n        }\n      },\n      \"put\": {\n        \"tags\": [\"rule\"],\n        \"description\": \"新建规则\",\n        \"operationId\": \"updateRule\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Success\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/RuleListItem\"\n                }\n              }\n            }\n          },\n          \"401\": {\n            \"description\": \"Error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ErrorResponse\"\n                }\n              }\n            }\n          }\n        }\n      },\n      \"delete\": {\n        \"tags\": [\"rule\"],\n        \"description\": \"删除规则\",\n        \"operationId\": \"removeRule\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Success\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\"\n                }\n              }\n            }\n          },\n          \"401\": {\n            \"description\": \"Error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ErrorResponse\"\n                }\n              }\n            }\n          }\n        }\n      },\n      \"x-swagger-router-controller\": \"api\"\n    },\n    \"/swagger\": {\n      \"x-swagger-pipe\": \"swagger_raw\"\n    }\n  },\n  \"components\": {\n    \"schemas\": {\n      \"CurrentUser\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"name\": {\n            \"type\": \"string\"\n          },\n          \"avatar\": {\n            \"type\": \"string\"\n          },\n          \"userid\": {\n            \"type\": \"string\"\n          },\n          \"email\": {\n            \"type\": \"string\"\n          },\n          \"signature\": {\n            \"type\": \"string\"\n          },\n          \"title\": {\n            \"type\": \"string\"\n          },\n          \"group\": {\n            \"type\": \"string\"\n          },\n          \"tags\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"object\",\n              \"properties\": {\n                \"key\": {\n                  \"type\": \"string\"\n                },\n                \"label\": {\n                  \"type\": \"string\"\n                }\n              }\n            }\n          },\n          \"notifyCount\": {\n            \"type\": \"integer\",\n            \"format\": \"int32\"\n          },\n          \"unreadCount\": {\n            \"type\": \"integer\",\n            \"format\": \"int32\"\n          },\n          \"country\": {\n            \"type\": \"string\"\n          },\n          \"access\": {\n            \"type\": \"string\"\n          },\n          \"geographic\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"province\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"label\": {\n                    \"type\": \"string\"\n                  },\n                  \"key\": {\n                    \"type\": \"string\"\n                  }\n                }\n              },\n              \"city\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"label\": {\n                    \"type\": \"string\"\n                  },\n                  \"key\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          },\n          \"address\": {\n            \"type\": \"string\"\n          },\n          \"phone\": {\n            \"type\": \"string\"\n          }\n        }\n      },\n      \"LoginResult\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"status\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\"\n          },\n          \"currentAuthority\": {\n            \"type\": \"string\"\n          }\n        }\n      },\n      \"PageParams\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"current\": {\n            \"type\": \"number\"\n          },\n          \"pageSize\": {\n            \"type\": \"number\"\n          }\n        }\n      },\n      \"RuleListItem\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"key\": {\n            \"type\": \"integer\",\n            \"format\": \"int32\"\n          },\n          \"disabled\": {\n            \"type\": \"boolean\"\n          },\n          \"href\": {\n            \"type\": \"string\"\n          },\n          \"avatar\": {\n            \"type\": \"string\"\n          },\n          \"name\": {\n            \"type\": \"string\"\n          },\n          \"owner\": {\n            \"type\": \"string\"\n          },\n          \"desc\": {\n            \"type\": \"string\"\n          },\n          \"callNo\": {\n            \"type\": \"integer\",\n            \"format\": \"int32\"\n          },\n          \"status\": {\n            \"type\": \"integer\",\n            \"format\": \"int32\"\n          },\n          \"updatedAt\": {\n            \"type\": \"string\",\n            \"format\": \"datetime\"\n          },\n          \"createdAt\": {\n            \"type\": \"string\",\n            \"format\": \"datetime\"\n          },\n          \"progress\": {\n            \"type\": \"integer\",\n            \"format\": \"int32\"\n          }\n        }\n      },\n      \"RuleList\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"data\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/RuleListItem\"\n            }\n          },\n          \"total\": {\n            \"type\": \"integer\",\n            \"description\": \"列表的内容总数\",\n            \"format\": \"int32\"\n          },\n          \"success\": {\n            \"type\": \"boolean\"\n          }\n        }\n      },\n      \"FakeCaptcha\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"code\": {\n            \"type\": \"integer\",\n            \"format\": \"int32\"\n          },\n          \"status\": {\n            \"type\": \"string\"\n          }\n        }\n      },\n      \"LoginParams\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"username\": {\n            \"type\": \"string\"\n          },\n          \"password\": {\n            \"type\": \"string\"\n          },\n          \"autoLogin\": {\n            \"type\": \"boolean\"\n          },\n          \"type\": {\n            \"type\": \"string\"\n          }\n        }\n      },\n      \"ErrorResponse\": {\n        \"required\": [\"errorCode\"],\n        \"type\": \"object\",\n        \"properties\": {\n          \"errorCode\": {\n            \"type\": \"string\",\n            \"description\": \"业务约定的错误码\"\n          },\n          \"errorMessage\": {\n            \"type\": \"string\",\n            \"description\": \"业务上的错误信息\"\n          },\n          \"success\": {\n            \"type\": \"boolean\",\n            \"description\": \"业务上的请求是否成功\"\n          }\n        }\n      },\n      \"NoticeIconList\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"data\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/NoticeIconItem\"\n            }\n          },\n          \"total\": {\n            \"type\": \"integer\",\n            \"description\": \"列表的内容总数\",\n            \"format\": \"int32\"\n          },\n          \"success\": {\n            \"type\": \"boolean\"\n          }\n        }\n      },\n      \"NoticeIconItemType\": {\n        \"title\": \"NoticeIconItemType\",\n        \"description\": \"已读未读列表的枚举\",\n        \"type\": \"string\",\n        \"properties\": {},\n        \"enum\": [\"notification\", \"message\", \"event\"]\n      },\n      \"NoticeIconItem\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"extra\": {\n            \"type\": \"string\",\n            \"format\": \"any\"\n          },\n          \"key\": { \"type\": \"string\" },\n          \"read\": {\n            \"type\": \"boolean\"\n          },\n          \"avatar\": {\n            \"type\": \"string\"\n          },\n          \"title\": {\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"type\": \"string\"\n          },\n          \"datetime\": {\n            \"type\": \"string\",\n            \"format\": \"date\"\n          },\n          \"description\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"extensions\": {\n              \"x-is-enum\": true\n            },\n            \"$ref\": \"#/components/schemas/NoticeIconItemType\"\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "web/admin/config/proxy.js",
    "content": "/**\n * 在生产环境 代理是无法生效的，所以这里没有生产环境的配置\n * -------------------------------\n * The agent cannot take effect in the production environment\n * so there is no configuration of the production environment\n * For details, please see\n * https://pro.ant.design/docs/deploy\n */\nexport default {\n  dev: {\n    // localhost:8000/api/** -> https://preview.pro.ant.design/api/**\n    '/api/': {\n      // 要代理的地址\n      target: 'http://localhost:9099',\n      // 配置了这个可以从 http 代理到 https\n      // 依赖 origin 的功能可能需要这个，比如 cookie\n      changeOrigin: true,\n      pathRewrite: {\n        '^': '',\n      },\n    },\n  },\n  test: {\n    '/api/': {\n      target: 'https://proapi.azurewebsites.net',\n      changeOrigin: true,\n      pathRewrite: {\n        '^': '',\n      },\n    },\n  },\n  pre: {\n    '/api/': {\n      target: 'http://127.0.0.1:9099',\n      changeOrigin: true,\n      pathRewrite: {\n        '^': '',\n      },\n    },\n  },\n};\n"
  },
  {
    "path": "web/admin/config/routes.js",
    "content": "export default [\n  {\n    path: '/user',\n    layout: false,\n    routes: [\n      {\n        path: '/user',\n        routes: [\n          {\n            name: 'login',\n            path: '/user/login',\n            component: './user/Login',\n          },\n        ],\n      },\n      {\n        component: './404',\n      },\n    ],\n  },\n  {\n    path: '/welcome',\n    name: 'welcome',\n    icon: 'smile',\n    component: './Welcome',\n  },\n  {\n    path: '/admin',\n    name: 'admin',\n    icon: 'crown',\n    access: 'canAdmin',\n    component: './Admin',\n    routes: [\n      {\n        path: '/admin/sub-page',\n        name: 'sub-page',\n        icon: 'smile',\n        component: './Welcome',\n      },\n      {\n        component: './404',\n      },\n    ],\n  },\n  {\n    name: 'list.table-list',\n    icon: 'table',\n    path: '/list',\n    component: './TableList',\n  },\n  {\n    path: '/',\n    redirect: '/welcome',\n  },\n  {\n    component: './404',\n  },\n];\n"
  },
  {
    "path": "web/admin/jest.config.js",
    "content": "module.exports = {\n  testURL: 'http://localhost:8000',\n  verbose: false,\n  extraSetupFiles: ['./tests/setupTests.js'],\n  globals: {\n    ANT_DESIGN_PRO_ONLY_DO_NOT_USE_IN_YOUR_PRODUCTION: false,\n    localStorage: null,\n  },\n};\n"
  },
  {
    "path": "web/admin/jsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"jsx\": \"react-jsx\",\n    \"emitDecoratorMetadata\": true,\n    \"experimentalDecorators\": true,\n    \"baseUrl\": \".\",\n    \"paths\": {\n      \"@/*\": [\"./src/*\"]\n    }\n  }\n}\n"
  },
  {
    "path": "web/admin/package.json",
    "content": "{\n  \"name\": \"ant-design-pro\",\n  \"version\": \"5.2.0\",\n  \"private\": true,\n  \"description\": \"An out-of-box UI solution for enterprise applications\",\n  \"scripts\": {\n    \"analyze\": \"cross-env ANALYZE=1 umi build\",\n    \"build\": \"umi build\",\n    \"deploy\": \"npm run build && npm run gh-pages\",\n    \"dev\": \"npm run start:dev\",\n    \"gh-pages\": \"gh-pages -d dist\",\n    \"i18n-remove\": \"pro i18n-remove --locale=zh-CN --write\",\n    \"postinstall\": \"umi g tmp\",\n    \"lint\": \"umi g tmp && npm run lint:js && npm run lint:style && npm run lint:prettier && npm run tsc\",\n    \"lint-staged\": \"lint-staged\",\n    \"lint-staged:js\": \"eslint --ext .js,.jsx,.ts,.tsx \",\n    \"lint:fix\": \"eslint --fix --cache --ext .js,.jsx,.ts,.tsx --format=pretty ./src && npm run lint:style\",\n    \"lint:js\": \"eslint --cache --ext .js,.jsx,.ts,.tsx --format=pretty ./src\",\n    \"lint:prettier\": \"prettier -c --write \\\"src/**/*\\\" --end-of-line auto\",\n    \"lint:style\": \"stylelint --fix \\\"src/**/*.less\\\" --syntax less\",\n    \"openapi\": \"umi openapi\",\n    \"playwright\": \"playwright install && playwright test\",\n    \"precommit\": \"lint-staged\",\n    \"prettier\": \"prettier -c --write \\\"src/**/*\\\"\",\n    \"serve\": \"umi-serve\",\n    \"start\": \"cross-env UMI_ENV=dev umi dev\",\n    \"start:dev\": \"cross-env REACT_APP_ENV=dev MOCK=none UMI_ENV=dev umi dev\",\n    \"start:no-mock\": \"cross-env MOCK=none UMI_ENV=dev umi dev\",\n    \"start:no-ui\": \"cross-env UMI_UI=none UMI_ENV=dev umi dev\",\n    \"start:pre\": \"cross-env REACT_APP_ENV=pre UMI_ENV=dev umi dev\",\n    \"start:test\": \"cross-env REACT_APP_ENV=test MOCK=none UMI_ENV=dev umi dev\",\n    \"test\": \"umi test\",\n    \"test:component\": \"umi test ./src/components\",\n    \"test:e2e\": \"node ./tests/run-tests.js\",\n    \"tsc\": \"tsc --noEmit\"\n  },\n  \"lint-staged\": {\n    \"**/*.less\": \"stylelint --syntax less\",\n    \"**/*.{js,jsx,ts,tsx}\": \"npm run lint-staged:js\",\n    \"**/*.{js,jsx,tsx,ts,less,md,json}\": [\"prettier --write\"]\n  },\n  \"browserslist\": [\"> 1%\", \"last 2 versions\", \"not ie <= 10\"],\n  \"dependencies\": {\n    \"@ant-design/icons\": \"^4.7.0\",\n    \"@ant-design/pro-descriptions\": \"^1.10.0\",\n    \"@ant-design/pro-form\": \"^1.52.0\",\n    \"@ant-design/pro-layout\": \"^6.32.0\",\n    \"@ant-design/pro-table\": \"^2.61.0\",\n    \"@umijs/route-utils\": \"^2.0.0\",\n    \"antd\": \"^4.17.0\",\n    \"classnames\": \"^2.3.0\",\n    \"lodash\": \"^4.17.0\",\n    \"moment\": \"^2.29.0\",\n    \"omit.js\": \"^2.0.2\",\n    \"rc-menu\": \"^9.1.0\",\n    \"rc-util\": \"^5.16.0\",\n    \"react\": \"^17.0.0\",\n    \"react-dev-inspector\": \"^1.7.0\",\n    \"react-dom\": \"^17.0.0\",\n    \"react-helmet-async\": \"^1.2.0\",\n    \"umi\": \"^3.5.0\"\n  },\n  \"devDependencies\": {\n    \"@ant-design/pro-cli\": \"^2.1.0\",\n    \"@playwright/test\": \"^1.17.0\",\n    \"@types/express\": \"^4.17.0\",\n    \"@types/history\": \"^4.7.0\",\n    \"@types/jest\": \"^26.0.0\",\n    \"@types/lodash\": \"^4.14.0\",\n    \"@types/react\": \"^17.0.0\",\n    \"@types/react-dom\": \"^17.0.0\",\n    \"@types/react-helmet\": \"^6.1.0\",\n    \"@umijs/fabric\": \"^2.8.0\",\n    \"@umijs/openapi\": \"^1.3.0\",\n    \"@umijs/plugin-blocks\": \"^2.2.0\",\n    \"@umijs/plugin-esbuild\": \"^1.4.0\",\n    \"@umijs/plugin-openapi\": \"^1.3.0\",\n    \"@umijs/preset-ant-design-pro\": \"^1.3.0\",\n    \"@umijs/preset-dumi\": \"^1.1.0\",\n    \"@umijs/preset-react\": \"^1.8.17\",\n    \"@umijs/yorkie\": \"^2.0.5\",\n    \"carlo\": \"^0.9.46\",\n    \"cross-env\": \"^7.0.0\",\n    \"cross-port-killer\": \"^1.3.0\",\n    \"detect-installer\": \"^1.0.0\",\n    \"enzyme\": \"^3.11.0\",\n    \"eslint\": \"^7.32.0\",\n    \"express\": \"^4.17.0\",\n    \"gh-pages\": \"^3.2.0\",\n    \"jsdom-global\": \"^3.0.0\",\n    \"lint-staged\": \"^10.0.0\",\n    \"mockjs\": \"^1.1.0\",\n    \"prettier\": \"^2.5.0\",\n    \"puppeteer-core\": \"^8.0.0\",\n    \"stylelint\": \"^13.0.0\",\n    \"swagger-ui-react\": \"^3.52.0\",\n    \"typescript\": \"^4.5.0\",\n    \"umi-serve\": \"^1.9.10\"\n  },\n  \"engines\": { \"node\": \">=10.0.0\" },\n  \"gitHooks\": { \"commit-msg\": \"fabric verify-commit\" }\n}\n"
  },
  {
    "path": "web/admin/public/CNAME",
    "content": "preview.pro.ant.design"
  },
  {
    "path": "web/admin/src/access.js",
    "content": "/**\n * @see https://umijs.org/zh-CN/plugins/plugin-access\n * */\nexport default function access(initialState) {\n  const { currentUser } = initialState || {};\n  return {\n    canAdmin: currentUser && currentUser.access === 'admin',\n  };\n}\n"
  },
  {
    "path": "web/admin/src/app.jsx",
    "content": "import { SettingDrawer } from '@ant-design/pro-layout';\nimport { PageLoading } from '@ant-design/pro-layout';\nimport { history, Link } from 'umi';\nimport RightContent from '@/components/RightContent';\nimport Footer from '@/components/Footer';\nimport { currentUser as queryCurrentUser } from './services/ant-design-pro/api';\nimport { BookOutlined, LinkOutlined } from '@ant-design/icons';\nimport defaultSettings from '../config/defaultSettings';\nconst isDev = process.env.NODE_ENV === 'development';\nconst loginPath = '/user/login';\n/** 获取用户信息比较慢的时候会展示一个 loading */\n\nexport const initialStateConfig = {\n  loading: <PageLoading />,\n};\n/**\n * @see  https://umijs.org/zh-CN/plugins/plugin-initial-state\n * */\n\nexport async function getInitialState() {\n  const fetchUserInfo = async () => {\n    try {\n      const msg = await queryCurrentUser();\n      return msg.data;\n    } catch (error) {\n      history.push(loginPath);\n    }\n\n    return undefined;\n  }; // 如果是登录页面，不执行\n\n  if (history.location.pathname !== loginPath) {\n    const currentUser = await fetchUserInfo();\n    return {\n      fetchUserInfo,\n      currentUser,\n      settings: defaultSettings,\n    };\n  }\n\n  return {\n    fetchUserInfo,\n    settings: defaultSettings,\n  };\n} // ProLayout 支持的api https://procomponents.ant.design/components/layout\n\nexport const layout = ({ initialState, setInitialState }) => {\n  return {\n    rightContentRender: () => <RightContent />,\n    disableContentMargin: false,\n    waterMarkProps: {\n      content: initialState?.currentUser?.name,\n    },\n    footerRender: () => <Footer />,\n    onPageChange: () => {\n      const { location } = history; // 如果没有登录，重定向到 login\n\n      if (!initialState?.currentUser && location.pathname !== loginPath) {\n        history.push(loginPath);\n      }\n    },\n    links: isDev\n      ? [\n          <Link to=\"/umi/plugin/openapi\" target=\"_blank\">\n            <LinkOutlined />\n            <span>OpenAPI 文档</span>\n          </Link>,\n          <Link to=\"/~docs\">\n            <BookOutlined />\n            <span>业务组件文档</span>\n          </Link>,\n        ]\n      : [],\n    menuHeaderRender: undefined,\n    // 自定义 403 页面\n    // unAccessible: <div>unAccessible</div>,\n    // 增加一个 loading 的状态\n    childrenRender: (children, props) => {\n      // if (initialState?.loading) return <PageLoading />;\n      return (\n        <>\n          {children}\n          {!props.location?.pathname?.includes('/login') && (\n            <SettingDrawer\n              enableDarkTheme\n              settings={initialState?.settings}\n              onSettingChange={(settings) => {\n                setInitialState((preInitialState) => ({ ...preInitialState, settings }));\n              }}\n            />\n          )}\n        </>\n      );\n    },\n    ...initialState?.settings,\n  };\n};\n"
  },
  {
    "path": "web/admin/src/components/Footer/index.jsx",
    "content": "import { useIntl } from 'umi';\nimport { GithubOutlined } from '@ant-design/icons';\nimport { DefaultFooter } from '@ant-design/pro-layout';\n\nconst Footer = () => {\n  const intl = useIntl();\n  const defaultMessage = intl.formatMessage({\n    id: 'app.copyright.produced',\n    defaultMessage: '蚂蚁集团体验技术部出品',\n  });\n  const currentYear = new Date().getFullYear();\n  return (\n    <DefaultFooter\n      copyright={`${currentYear} ${defaultMessage}`}\n      links={[\n        {\n          key: 'Ant Design Pro',\n          title: 'Ant Design Pro',\n          href: 'https://pro.ant.design',\n          blankTarget: true,\n        },\n        {\n          key: 'github',\n          title: <GithubOutlined />,\n          href: 'https://github.com/ant-design/ant-design-pro',\n          blankTarget: true,\n        },\n        {\n          key: 'Ant Design',\n          title: 'Ant Design',\n          href: 'https://ant.design',\n          blankTarget: true,\n        },\n      ]}\n    />\n  );\n};\n\nexport default Footer;\n"
  },
  {
    "path": "web/admin/src/components/HeaderDropdown/index.jsx",
    "content": "import { Dropdown } from 'antd';\nimport React from 'react';\nimport classNames from 'classnames';\nimport styles from './index.less';\n\nconst HeaderDropdown = ({ overlayClassName: cls, ...restProps }) => (\n  <Dropdown overlayClassName={classNames(styles.container, cls)} {...restProps} />\n);\n\nexport default HeaderDropdown;\n"
  },
  {
    "path": "web/admin/src/components/HeaderDropdown/index.less",
    "content": "@import (reference) '~antd/es/style/themes/index';\n\n.container > * {\n  background-color: @popover-bg;\n  border-radius: 4px;\n  box-shadow: @shadow-1-down;\n}\n\n@media screen and (max-width: @screen-xs) {\n  .container {\n    width: 100% !important;\n  }\n  .container > * {\n    border-radius: 0 !important;\n  }\n}\n"
  },
  {
    "path": "web/admin/src/components/HeaderSearch/index.jsx",
    "content": "import { SearchOutlined } from '@ant-design/icons';\nimport { AutoComplete, Input } from 'antd';\nimport useMergedState from 'rc-util/es/hooks/useMergedState';\nimport React, { useRef } from 'react';\nimport classNames from 'classnames';\nimport styles from './index.less';\n\nconst HeaderSearch = (props) => {\n  const {\n    className,\n    defaultValue,\n    onVisibleChange,\n    placeholder,\n    visible,\n    defaultVisible,\n    ...restProps\n  } = props;\n  const inputRef = useRef(null);\n  const [value, setValue] = useMergedState(defaultValue, {\n    value: props.value,\n    onChange: props.onChange,\n  });\n  const [searchMode, setSearchMode] = useMergedState(defaultVisible ?? false, {\n    value: props.visible,\n    onChange: onVisibleChange,\n  });\n  const inputClass = classNames(styles.input, {\n    [styles.show]: searchMode,\n  });\n  return (\n    <div\n      className={classNames(className, styles.headerSearch)}\n      onClick={() => {\n        setSearchMode(true);\n\n        if (searchMode && inputRef.current) {\n          inputRef.current.focus();\n        }\n      }}\n      onTransitionEnd={({ propertyName }) => {\n        if (propertyName === 'width' && !searchMode) {\n          if (onVisibleChange) {\n            onVisibleChange(searchMode);\n          }\n        }\n      }}\n    >\n      <SearchOutlined\n        key=\"Icon\"\n        style={{\n          cursor: 'pointer',\n        }}\n      />\n      <AutoComplete\n        key=\"AutoComplete\"\n        className={inputClass}\n        value={value}\n        options={restProps.options}\n        onChange={setValue}\n      >\n        <Input\n          size=\"small\"\n          ref={inputRef}\n          defaultValue={defaultValue}\n          aria-label={placeholder}\n          placeholder={placeholder}\n          onKeyDown={(e) => {\n            if (e.key === 'Enter') {\n              if (restProps.onSearch) {\n                restProps.onSearch(value);\n              }\n            }\n          }}\n          onBlur={() => {\n            setSearchMode(false);\n          }}\n        />\n      </AutoComplete>\n    </div>\n  );\n};\n\nexport default HeaderSearch;\n"
  },
  {
    "path": "web/admin/src/components/HeaderSearch/index.less",
    "content": "@import (reference) '~antd/es/style/themes/index';\n\n.headerSearch {\n  display: inline-flex;\n  align-items: center;\n  .input {\n    width: 0;\n    min-width: 0;\n    overflow: hidden;\n    background: transparent;\n    border-radius: 0;\n    transition: width 0.3s, margin-left 0.3s;\n    :global(.ant-select-selection) {\n      background: transparent;\n    }\n    input {\n      box-shadow: none !important;\n    }\n\n    &.show {\n      width: 210px;\n      margin-left: 8px;\n    }\n  }\n}\n"
  },
  {
    "path": "web/admin/src/components/NoticeIcon/NoticeIcon.jsx",
    "content": "import { BellOutlined } from '@ant-design/icons';\nimport { Badge, Spin, Tabs } from 'antd';\nimport useMergedState from 'rc-util/es/hooks/useMergedState';\nimport React from 'react';\nimport classNames from 'classnames';\nimport NoticeList from './NoticeList';\nimport HeaderDropdown from '../HeaderDropdown';\nimport styles from './index.less';\nconst { TabPane } = Tabs;\n\nconst NoticeIcon = (props) => {\n  const getNotificationBox = () => {\n    const {\n      children,\n      loading,\n      onClear,\n      onTabChange,\n      onItemClick,\n      onViewMore,\n      clearText,\n      viewMoreText,\n    } = props;\n\n    if (!children) {\n      return null;\n    }\n\n    const panes = [];\n    React.Children.forEach(children, (child) => {\n      if (!child) {\n        return;\n      }\n\n      const { list, title, count, tabKey, showClear, showViewMore } = child.props;\n      const len = list && list.length ? list.length : 0;\n      const msgCount = count || count === 0 ? count : len;\n      const tabTitle = msgCount > 0 ? `${title} (${msgCount})` : title;\n      panes.push(\n        <TabPane tab={tabTitle} key={tabKey}>\n          <NoticeList\n            clearText={clearText}\n            viewMoreText={viewMoreText}\n            list={list}\n            tabKey={tabKey}\n            onClear={() => onClear && onClear(title, tabKey)}\n            onClick={(item) => onItemClick && onItemClick(item, child.props)}\n            onViewMore={(event) => onViewMore && onViewMore(child.props, event)}\n            showClear={showClear}\n            showViewMore={showViewMore}\n            title={title}\n          />\n        </TabPane>,\n      );\n    });\n    return (\n      <>\n        <Spin spinning={loading} delay={300}>\n          <Tabs className={styles.tabs} onChange={onTabChange}>\n            {panes}\n          </Tabs>\n        </Spin>\n      </>\n    );\n  };\n\n  const { className, count, bell } = props;\n  const [visible, setVisible] = useMergedState(false, {\n    value: props.popupVisible,\n    onChange: props.onPopupVisibleChange,\n  });\n  const noticeButtonClass = classNames(className, styles.noticeButton);\n  const notificationBox = getNotificationBox();\n  const NoticeBellIcon = bell || <BellOutlined className={styles.icon} />;\n  const trigger = (\n    <span\n      className={classNames(noticeButtonClass, {\n        opened: visible,\n      })}\n    >\n      <Badge\n        count={count}\n        style={{\n          boxShadow: 'none',\n        }}\n        className={styles.badge}\n      >\n        {NoticeBellIcon}\n      </Badge>\n    </span>\n  );\n\n  if (!notificationBox) {\n    return trigger;\n  }\n\n  return (\n    <HeaderDropdown\n      placement=\"bottomRight\"\n      overlay={notificationBox}\n      overlayClassName={styles.popover}\n      trigger={['click']}\n      visible={visible}\n      onVisibleChange={setVisible}\n    >\n      {trigger}\n    </HeaderDropdown>\n  );\n};\n\nNoticeIcon.defaultProps = {\n  emptyImage: 'https://gw.alipayobjects.com/zos/rmsportal/wAhyIChODzsoKIOBHcBk.svg',\n};\nNoticeIcon.Tab = NoticeList;\nexport default NoticeIcon;\n"
  },
  {
    "path": "web/admin/src/components/NoticeIcon/NoticeList.jsx",
    "content": "import { Avatar, List } from 'antd';\nimport React from 'react';\nimport classNames from 'classnames';\nimport styles from './NoticeList.less';\n\nconst NoticeList = ({\n  list = [],\n  onClick,\n  onClear,\n  title,\n  onViewMore,\n  emptyText,\n  showClear = true,\n  clearText,\n  viewMoreText,\n  showViewMore = false,\n}) => {\n  if (!list || list.length === 0) {\n    return (\n      <div className={styles.notFound}>\n        <img\n          src=\"https://gw.alipayobjects.com/zos/rmsportal/sAuJeJzSKbUmHfBQRzmZ.svg\"\n          alt=\"not found\"\n        />\n        <div>{emptyText}</div>\n      </div>\n    );\n  }\n\n  return (\n    <div>\n      <List\n        className={styles.list}\n        dataSource={list}\n        renderItem={(item, i) => {\n          const itemCls = classNames(styles.item, {\n            [styles.read]: item.read,\n          }); // eslint-disable-next-line no-nested-ternary\n\n          const leftIcon = item.avatar ? (\n            typeof item.avatar === 'string' ? (\n              <Avatar className={styles.avatar} src={item.avatar} />\n            ) : (\n              <span className={styles.iconElement}>{item.avatar}</span>\n            )\n          ) : null;\n          return (\n            <List.Item\n              className={itemCls}\n              key={item.key || i}\n              onClick={() => {\n                onClick?.(item);\n              }}\n            >\n              <List.Item.Meta\n                className={styles.meta}\n                avatar={leftIcon}\n                title={\n                  <div className={styles.title}>\n                    {item.title}\n                    <div className={styles.extra}>{item.extra}</div>\n                  </div>\n                }\n                description={\n                  <div>\n                    <div className={styles.description}>{item.description}</div>\n                    <div className={styles.datetime}>{item.datetime}</div>\n                  </div>\n                }\n              />\n            </List.Item>\n          );\n        }}\n      />\n      <div className={styles.bottomBar}>\n        {showClear ? (\n          <div onClick={onClear}>\n            {clearText} {title}\n          </div>\n        ) : null}\n        {showViewMore ? (\n          <div\n            onClick={(e) => {\n              if (onViewMore) {\n                onViewMore(e);\n              }\n            }}\n          >\n            {viewMoreText}\n          </div>\n        ) : null}\n      </div>\n    </div>\n  );\n};\n\nexport default NoticeList;\n"
  },
  {
    "path": "web/admin/src/components/NoticeIcon/NoticeList.less",
    "content": "@import (reference) '~antd/es/style/themes/index';\n\n.list {\n  max-height: 400px;\n  overflow: auto;\n  &::-webkit-scrollbar {\n    display: none;\n  }\n  .item {\n    padding-right: 24px;\n    padding-left: 24px;\n    overflow: hidden;\n    cursor: pointer;\n    transition: all 0.3s;\n\n    .meta {\n      width: 100%;\n    }\n\n    .avatar {\n      margin-top: 4px;\n      background: @component-background;\n    }\n    .iconElement {\n      font-size: 32px;\n    }\n\n    &.read {\n      opacity: 0.4;\n    }\n    &:last-child {\n      border-bottom: 0;\n    }\n    &:hover {\n      background: @primary-1;\n    }\n    .title {\n      margin-bottom: 8px;\n      font-weight: normal;\n    }\n    .description {\n      font-size: 12px;\n      line-height: @line-height-base;\n    }\n    .datetime {\n      margin-top: 4px;\n      font-size: 12px;\n      line-height: @line-height-base;\n    }\n    .extra {\n      float: right;\n      margin-top: -1.5px;\n      margin-right: 0;\n      color: @text-color-secondary;\n      font-weight: normal;\n    }\n  }\n  .loadMore {\n    padding: 8px 0;\n    color: @primary-6;\n    text-align: center;\n    cursor: pointer;\n    &.loadedAll {\n      color: rgba(0, 0, 0, 0.25);\n      cursor: unset;\n    }\n  }\n}\n\n.notFound {\n  padding: 73px 0 88px;\n  color: @text-color-secondary;\n  text-align: center;\n  img {\n    display: inline-block;\n    height: 76px;\n    margin-bottom: 16px;\n  }\n}\n\n.bottomBar {\n  height: 46px;\n  color: @text-color;\n  line-height: 46px;\n  text-align: center;\n  border-top: 1px solid @border-color-split;\n  border-radius: 0 0 @border-radius-base @border-radius-base;\n  transition: all 0.3s;\n  div {\n    display: inline-block;\n    width: 50%;\n    cursor: pointer;\n    transition: all 0.3s;\n    user-select: none;\n\n    &:only-child {\n      width: 100%;\n    }\n    &:not(:only-child):last-child {\n      border-left: 1px solid @border-color-split;\n    }\n  }\n}\n"
  },
  {
    "path": "web/admin/src/components/NoticeIcon/index.jsx",
    "content": "import { useEffect, useState } from 'react';\nimport { Tag, message } from 'antd';\nimport { groupBy } from 'lodash';\nimport moment from 'moment';\nimport { useModel, useRequest } from 'umi';\nimport { getNotices } from '@/services/ant-design-pro/api';\nimport NoticeIcon from './NoticeIcon';\nimport styles from './index.less';\n\nconst getNoticeData = (notices) => {\n  if (!notices || notices.length === 0 || !Array.isArray(notices)) {\n    return {};\n  }\n\n  const newNotices = notices.map((notice) => {\n    const newNotice = { ...notice };\n\n    if (newNotice.datetime) {\n      newNotice.datetime = moment(notice.datetime).fromNow();\n    }\n\n    if (newNotice.id) {\n      newNotice.key = newNotice.id;\n    }\n\n    if (newNotice.extra && newNotice.status) {\n      const color = {\n        todo: '',\n        processing: 'blue',\n        urgent: 'red',\n        doing: 'gold',\n      }[newNotice.status];\n      newNotice.extra = (\n        <Tag\n          color={color}\n          style={{\n            marginRight: 0,\n          }}\n        >\n          {newNotice.extra}\n        </Tag>\n      );\n    }\n\n    return newNotice;\n  });\n  return groupBy(newNotices, 'type');\n};\n\nconst getUnreadData = (noticeData) => {\n  const unreadMsg = {};\n  Object.keys(noticeData).forEach((key) => {\n    const value = noticeData[key];\n\n    if (!unreadMsg[key]) {\n      unreadMsg[key] = 0;\n    }\n\n    if (Array.isArray(value)) {\n      unreadMsg[key] = value.filter((item) => !item.read).length;\n    }\n  });\n  return unreadMsg;\n};\n\nconst NoticeIconView = () => {\n  const { initialState } = useModel('@@initialState');\n  const { currentUser } = initialState || {};\n  const [notices, setNotices] = useState([]);\n  const { data } = useRequest(getNotices);\n  useEffect(() => {\n    setNotices(data || []);\n  }, [data]);\n  const noticeData = getNoticeData(notices);\n  const unreadMsg = getUnreadData(noticeData || {});\n\n  const changeReadState = (id) => {\n    setNotices(\n      notices.map((item) => {\n        const notice = { ...item };\n\n        if (notice.id === id) {\n          notice.read = true;\n        }\n\n        return notice;\n      }),\n    );\n  };\n\n  const clearReadState = (title, key) => {\n    setNotices(\n      notices.map((item) => {\n        const notice = { ...item };\n\n        if (notice.type === key) {\n          notice.read = true;\n        }\n\n        return notice;\n      }),\n    );\n    message.success(`${'清空了'} ${title}`);\n  };\n\n  return (\n    <NoticeIcon\n      className={styles.action}\n      count={currentUser && currentUser.unreadCount}\n      onItemClick={(item) => {\n        changeReadState(item.id);\n      }}\n      onClear={(title, key) => clearReadState(title, key)}\n      loading={false}\n      clearText=\"清空\"\n      viewMoreText=\"查看更多\"\n      onViewMore={() => message.info('Click on view more')}\n      clearClose\n    >\n      <NoticeIcon.Tab\n        tabKey=\"notification\"\n        count={unreadMsg.notification}\n        list={noticeData.notification}\n        title=\"通知\"\n        emptyText=\"你已查看所有通知\"\n        showViewMore\n      />\n      <NoticeIcon.Tab\n        tabKey=\"message\"\n        count={unreadMsg.message}\n        list={noticeData.message}\n        title=\"消息\"\n        emptyText=\"您已读完所有消息\"\n        showViewMore\n      />\n      <NoticeIcon.Tab\n        tabKey=\"event\"\n        title=\"待办\"\n        emptyText=\"你已完成所有待办\"\n        count={unreadMsg.event}\n        list={noticeData.event}\n        showViewMore\n      />\n    </NoticeIcon>\n  );\n};\n\nexport default NoticeIconView;\n"
  },
  {
    "path": "web/admin/src/components/NoticeIcon/index.less",
    "content": "@import (reference) '~antd/es/style/themes/index';\n\n.popover {\n  position: relative;\n  width: 336px;\n}\n\n.noticeButton {\n  display: inline-block;\n  cursor: pointer;\n  transition: all 0.3s;\n}\n.icon {\n  padding: 4px;\n  vertical-align: middle;\n}\n\n.badge {\n  font-size: 16px;\n}\n\n.tabs {\n  :global {\n    .ant-tabs-nav-list {\n      margin: auto;\n    }\n\n    .ant-tabs-nav-scroll {\n      text-align: center;\n    }\n    .ant-tabs-nav {\n      margin-bottom: 0;\n    }\n  }\n}\n"
  },
  {
    "path": "web/admin/src/components/RightContent/AvatarDropdown.jsx",
    "content": "import React, { useCallback } from 'react';\nimport { LogoutOutlined, SettingOutlined, UserOutlined } from '@ant-design/icons';\nimport { Avatar, Menu, Spin } from 'antd';\nimport { history, useModel } from 'umi';\nimport { stringify } from 'querystring';\nimport HeaderDropdown from '../HeaderDropdown';\nimport styles from './index.less';\nimport { outLogin } from '@/services/ant-design-pro/api';\n\n/**\n * 退出登录，并且将当前的 url 保存\n */\nconst loginOut = async () => {\n  await outLogin();\n  const { query = {}, search, pathname } = history.location;\n  const { redirect } = query; // Note: There may be security issues, please note\n\n  if (window.location.pathname !== '/user/login' && !redirect) {\n    history.replace({\n      pathname: '/user/login',\n      search: stringify({\n        redirect: pathname + search,\n      }),\n    });\n  }\n};\n\nconst AvatarDropdown = ({ menu }) => {\n  const { initialState, setInitialState } = useModel('@@initialState');\n  const onMenuClick = useCallback(\n    (event) => {\n      const { key } = event;\n\n      if (key === 'logout') {\n        setInitialState((s) => ({ ...s, currentUser: undefined }));\n        loginOut();\n        return;\n      }\n\n      history.push(`/account/${key}`);\n    },\n    [setInitialState],\n  );\n  const loading = (\n    <span className={`${styles.action} ${styles.account}`}>\n      <Spin\n        size=\"small\"\n        style={{\n          marginLeft: 8,\n          marginRight: 8,\n        }}\n      />\n    </span>\n  );\n\n  if (!initialState) {\n    return loading;\n  }\n\n  const { currentUser } = initialState;\n\n  if (!currentUser || !currentUser.name) {\n    return loading;\n  }\n\n  const menuHeaderDropdown = (\n    <Menu className={styles.menu} selectedKeys={[]} onClick={onMenuClick}>\n      {menu && (\n        <Menu.Item key=\"center\">\n          <UserOutlined />\n          个人中心\n        </Menu.Item>\n      )}\n      {menu && (\n        <Menu.Item key=\"settings\">\n          <SettingOutlined />\n          个人设置\n        </Menu.Item>\n      )}\n      {menu && <Menu.Divider />}\n\n      <Menu.Item key=\"logout\">\n        <LogoutOutlined />\n        退出登录\n      </Menu.Item>\n    </Menu>\n  );\n  return (\n    <HeaderDropdown overlay={menuHeaderDropdown}>\n      <span className={`${styles.action} ${styles.account}`}>\n        <Avatar size=\"small\" className={styles.avatar} src={currentUser.avatar} alt=\"avatar\" />\n        <span className={`${styles.name} anticon`}>{currentUser.name}</span>\n      </span>\n    </HeaderDropdown>\n  );\n};\n\nexport default AvatarDropdown;\n"
  },
  {
    "path": "web/admin/src/components/RightContent/index.jsx",
    "content": "import { Space } from 'antd';\nimport { QuestionCircleOutlined } from '@ant-design/icons';\nimport React from 'react';\nimport { useModel, SelectLang } from 'umi';\nimport Avatar from './AvatarDropdown';\nimport HeaderSearch from '../HeaderSearch';\nimport styles from './index.less';\n\nconst GlobalHeaderRight = () => {\n  const { initialState } = useModel('@@initialState');\n\n  if (!initialState || !initialState.settings) {\n    return null;\n  }\n\n  const { navTheme, layout } = initialState.settings;\n  let className = styles.right;\n\n  if ((navTheme === 'dark' && layout === 'top') || layout === 'mix') {\n    className = `${styles.right}  ${styles.dark}`;\n  }\n\n  return (\n    <Space className={className}>\n      <HeaderSearch\n        className={`${styles.action} ${styles.search}`}\n        placeholder=\"站内搜索\"\n        defaultValue=\"umi ui\"\n        options={[\n          {\n            label: <a href=\"https://umijs.org/zh/guide/umi-ui.html\">umi ui</a>,\n            value: 'umi ui',\n          },\n          {\n            label: <a href=\"next.ant.design\">Ant Design</a>,\n            value: 'Ant Design',\n          },\n          {\n            label: <a href=\"https://protable.ant.design/\">Pro Table</a>,\n            value: 'Pro Table',\n          },\n          {\n            label: <a href=\"https://prolayout.ant.design/\">Pro Layout</a>,\n            value: 'Pro Layout',\n          },\n        ]} // onSearch={value => {\n        //   console.log('input', value);\n        // }}\n      />\n      <span\n        className={styles.action}\n        onClick={() => {\n          window.open('https://pro.ant.design/docs/getting-started');\n        }}\n      >\n        <QuestionCircleOutlined />\n      </span>\n      <Avatar />\n      <SelectLang className={styles.action} />\n    </Space>\n  );\n};\n\nexport default GlobalHeaderRight;\n"
  },
  {
    "path": "web/admin/src/components/RightContent/index.less",
    "content": "@import (reference) '~antd/es/style/themes/index';\n\n@pro-header-hover-bg: rgba(0, 0, 0, 0.025);\n\n.menu {\n  :global(.anticon) {\n    margin-right: 8px;\n  }\n  :global(.ant-dropdown-menu-item) {\n    min-width: 160px;\n  }\n}\n\n.right {\n  display: flex;\n  float: right;\n  height: 48px;\n  margin-left: auto;\n  overflow: hidden;\n  .action {\n    display: flex;\n    align-items: center;\n    height: 48px;\n    padding: 0 12px;\n    cursor: pointer;\n    transition: all 0.3s;\n    > span {\n      vertical-align: middle;\n    }\n    &:hover {\n      background: @pro-header-hover-bg;\n    }\n    &:global(.opened) {\n      background: @pro-header-hover-bg;\n    }\n  }\n  .search {\n    padding: 0 12px;\n    &:hover {\n      background: transparent;\n    }\n  }\n  .account {\n    .avatar {\n      margin-right: 8px;\n      color: @primary-color;\n      vertical-align: top;\n      background: rgba(255, 255, 255, 0.85);\n    }\n  }\n}\n\n.dark {\n  .action {\n    &:hover {\n      background: #252a3d;\n    }\n    &:global(.opened) {\n      background: #252a3d;\n    }\n  }\n}\n\n@media only screen and (max-width: @screen-md) {\n  :global(.ant-divider-vertical) {\n    vertical-align: unset;\n  }\n  .name {\n    display: none;\n  }\n  .right {\n    position: absolute;\n    top: 0;\n    right: 12px;\n    .account {\n      .avatar {\n        margin-right: 0;\n      }\n    }\n    .search {\n      display: none;\n    }\n  }\n}\n"
  },
  {
    "path": "web/admin/src/components/index.md",
    "content": "﻿---\ntitle: 业务组件\nsidemenu: false\n---\n\n> 此功能由[dumi](https://d.umijs.org/zh-CN/guide/advanced#umi-%E9%A1%B9%E7%9B%AE%E9%9B%86%E6%88%90%E6%A8%A1%E5%BC%8F)提供，dumi 是一个 📖 为组件开发场景而生的文档工具，用过的都说好。\n\n# 业务组件\n\n这里列举了 Pro 中所有用到的组件，这些组件不适合作为组件库，但是在业务中却真实需要。所以我们准备了这个文档，来指导大家是否需要使用这个组件。\n\n## Footer 页脚组件\n\n这个组件自带了一些 Pro 的配置，你一般都需要改掉它的信息。\n\n```tsx\n/**\n * background: '#f0f2f5'\n */\nimport React from 'react';\nimport Footer from '@/components/Footer';\n\nexport default () => <Footer />;\n```\n\n## HeaderDropdown 头部下拉列表\n\nHeaderDropdown 是 antd Dropdown 的封装，但是增加了移动端的特殊处理，用法也是相同的。\n\n```tsx\n/**\n * background: '#f0f2f5'\n */\nimport { Button, Menu } from 'antd';\nimport React from 'react';\nimport HeaderDropdown from '@/components/HeaderDropdown';\n\nexport default () => {\n  const menuHeaderDropdown = (\n    <Menu selectedKeys={[]}>\n      <Menu.Item key=\"center\">个人中心</Menu.Item>\n      <Menu.Item key=\"settings\">个人设置</Menu.Item>\n      <Menu.Divider />\n      <Menu.Item key=\"logout\">退出登录</Menu.Item>\n    </Menu>\n  );\n  return (\n    <HeaderDropdown overlay={menuHeaderDropdown}>\n      <Button>hover 展示菜单</Button>\n    </HeaderDropdown>\n  );\n};\n```\n\n## HeaderSearch 头部搜索框\n\n一个带补全数据的输入框，支持收起和展开 Input\n\n```tsx\n/**\n * background: '#f0f2f5'\n */\nimport { Button, Menu } from 'antd';\nimport React from 'react';\nimport HeaderSearch from '@/components/HeaderSearch';\n\nexport default () => {\n  return (\n    <HeaderSearch\n      placeholder=\"站内搜索\"\n      defaultValue=\"umi ui\"\n      options={[\n        { label: 'Ant Design Pro', value: 'Ant Design Pro' },\n        {\n          label: 'Ant Design',\n          value: 'Ant Design',\n        },\n        {\n          label: 'Pro Table',\n          value: 'Pro Table',\n        },\n        {\n          label: 'Pro Layout',\n          value: 'Pro Layout',\n        },\n      ]}\n      onSearch={(value) => {\n        console.log('input', value);\n      }}\n    />\n  );\n};\n```\n\n### API\n\n| 参数            | 说明                               | 类型                         | 默认值 |\n| --------------- | ---------------------------------- | ---------------------------- | ------ |\n| value           | 输入框的值                         | `string`                     | -      |\n| onChange        | 值修改后触发                       | `(value?: string) => void`   | -      |\n| onSearch        | 查询后触发                         | `(value?: string) => void`   | -      |\n| options         | 选项菜单的的列表                   | `{label,value}[]`            | -      |\n| defaultVisible  | 输入框默认是否显示，只有第一次生效 | `boolean`                    | -      |\n| visible         | 输入框是否显示                     | `boolean`                    | -      |\n| onVisibleChange | 输入框显示隐藏的回调函数           | `(visible: boolean) => void` | -      |\n\n## NoticeIcon 通知工具\n\n通知工具提供一个展示多种通知信息的界面。\n\n```tsx\n/**\n * background: '#f0f2f5'\n */\nimport { message } from 'antd';\nimport React from 'react';\nimport NoticeIcon from '@/components/NoticeIcon/NoticeIcon';\n\nexport default () => {\n  const list = [\n    {\n      id: '000000001',\n      avatar: 'https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png',\n      title: '你收到了 14 份新周报',\n      datetime: '2017-08-09',\n      type: 'notification',\n    },\n    {\n      id: '000000002',\n      avatar: 'https://gw.alipayobjects.com/zos/rmsportal/OKJXDXrmkNshAMvwtvhu.png',\n      title: '你推荐的 曲妮妮 已通过第三轮面试',\n      datetime: '2017-08-08',\n      type: 'notification',\n    },\n  ];\n  return (\n    <NoticeIcon\n      count={10}\n      onItemClick={(item) => {\n        message.info(`${item.title} 被点击了`);\n      }}\n      onClear={(title: string, key: string) => message.info('点击了清空更多')}\n      loading={false}\n      clearText=\"清空\"\n      viewMoreText=\"查看更多\"\n      onViewMore={() => message.info('点击了查看更多')}\n      clearClose\n    >\n      <NoticeIcon.Tab\n        tabKey=\"notification\"\n        count={2}\n        list={list}\n        title=\"通知\"\n        emptyText=\"你已查看所有通知\"\n        showViewMore\n      />\n      <NoticeIcon.Tab\n        tabKey=\"message\"\n        count={2}\n        list={list}\n        title=\"消息\"\n        emptyText=\"您已读完所有消息\"\n        showViewMore\n      />\n      <NoticeIcon.Tab\n        tabKey=\"event\"\n        title=\"待办\"\n        emptyText=\"你已完成所有待办\"\n        count={2}\n        list={list}\n        showViewMore\n      />\n    </NoticeIcon>\n  );\n};\n```\n\n### NoticeIcon API\n\n| 参数 | 说明 | 类型 | 默认值 |\n| --- | --- | --- | --- |\n| count | 有多少未读通知 | `number` | - |\n| bell | 铃铛的图表 | `ReactNode` | - |\n| onClear | 点击清空数据按钮 | `(tabName: string, tabKey: string) => void` | - |\n| onItemClick | 未读消息列被点击 | `(item: API.NoticeIconData, tabProps: NoticeIconTabProps) => void` | - |\n| onViewMore | 查看更多的按钮点击 | `(tabProps: NoticeIconTabProps, e: MouseEvent) => void` | - |\n| onTabChange | 通知 Tab 的切换 | `(tabTile: string) => void;` | - |\n| popupVisible | 通知显示是否展示 | `boolean` | - |\n| onPopupVisibleChange | 通知信息显示隐藏的回调函数 | `(visible: boolean) => void` | - |\n| clearText | 清空按钮的文字 | `string` | - |\n| viewMoreText | 查看更多的按钮文字 | `string` | - |\n| clearClose | 展示清空按钮 | `boolean` | - |\n| emptyImage | 列表为空时的兜底展示 | `ReactNode` | - |\n\n### NoticeIcon.Tab API\n\n| 参数         | 说明               | 类型                                 | 默认值 |\n| ------------ | ------------------ | ------------------------------------ | ------ |\n| count        | 有多少未读通知     | `number`                             | -      |\n| title        | 通知 Tab 的标题    | `ReactNode`                          | -      |\n| showClear    | 展示清除按钮       | `boolean`                            | `true` |\n| showViewMore | 展示加载更         | `boolean`                            | `true` |\n| tabKey       | Tab 的唯一 key     | `string`                             | -      |\n| onClick      | 子项的单击事件     | `(item: API.NoticeIconData) => void` | -      |\n| onClear      | 清楚按钮的点击     | `()=>void`                           | -      |\n| emptyText    | 为空的时候测试     | `()=>void`                           | -      |\n| viewMoreText | 查看更多的按钮文字 | `string`                             | -      |\n| onViewMore   | 查看更多的按钮点击 | `( e: MouseEvent) => void`           | -      |\n| list         | 通知信息的列表     | `API.NoticeIconData`                 | -      |\n\n### NoticeIconData\n\n```tsx | pure\nexport interface NoticeIconData {\n  id: string;\n  key: string;\n  avatar: string;\n  title: string;\n  datetime: string;\n  type: string;\n  read?: boolean;\n  description: string;\n  clickClose?: boolean;\n  extra: any;\n  status: string;\n}\n```\n\n## RightContent\n\nRightContent 是以上几个组件的组合，同时新增了 plugins 的 `SelectLang` 插件。\n\n```tsx | pure\n<Space>\n  <HeaderSearch\n    placeholder=\"站内搜索\"\n    defaultValue=\"umi ui\"\n    options={[\n      { label: <a href=\"https://umijs.org/zh/guide/umi-ui.html\">umi ui</a>, value: 'umi ui' },\n      {\n        label: <a href=\"next.ant.design\">Ant Design</a>,\n        value: 'Ant Design',\n      },\n      {\n        label: <a href=\"https://protable.ant.design/\">Pro Table</a>,\n        value: 'Pro Table',\n      },\n      {\n        label: <a href=\"https://prolayout.ant.design/\">Pro Layout</a>,\n        value: 'Pro Layout',\n      },\n    ]}\n  />\n  <Tooltip title=\"使用文档\">\n    <span\n      className={styles.action}\n      onClick={() => {\n        window.location.href = 'https://pro.ant.design/docs/getting-started';\n      }}\n    >\n      <QuestionCircleOutlined />\n    </span>\n  </Tooltip>\n  <Avatar />\n  {REACT_APP_ENV && (\n    <span>\n      <Tag color={ENVTagColor[REACT_APP_ENV]}>{REACT_APP_ENV}</Tag>\n    </span>\n  )}\n  <SelectLang className={styles.action} />\n</Space>\n```\n"
  },
  {
    "path": "web/admin/src/e2e/baseLayout.e2e.spec.js",
    "content": "import { test, expect } from '@playwright/test';\n\nconst { uniq } = require('lodash');\n\nconst RouterConfig = require('../../config/routes').default;\n\nconst BASE_URL = `http://localhost:${process.env.PORT || 8001}`;\n\nfunction formatter(routes, parentPath = '') {\n  const fixedParentPath = parentPath.replace(/\\/{1,}/g, '/');\n  let result = [];\n  routes.forEach((item) => {\n    if (item.path && !item.path.startsWith('/')) {\n      result.push(`${fixedParentPath}/${item.path}`.replace(/\\/{1,}/g, '/'));\n    }\n\n    if (item.path && item.path.startsWith('/')) {\n      result.push(`${item.path}`.replace(/\\/{1,}/g, '/'));\n    }\n\n    if (item.routes) {\n      result = result.concat(\n        formatter(item.routes, item.path ? `${fixedParentPath}/${item.path}` : parentPath),\n      );\n    }\n  });\n  return uniq(result.filter((item) => !!item));\n}\n\nconst testPage = (path, page) => async () => {\n  await page.evaluate(() => {\n    localStorage.setItem('antd-pro-authority', '[\"admin\"]');\n  });\n  await page.goto(`${BASE_URL}${path}`);\n  await page.waitForSelector('footer', {\n    timeout: 2000,\n  });\n  const haveFooter = await page.evaluate(() => document.getElementsByTagName('footer').length > 0);\n  expect(haveFooter).toBeTruthy();\n};\n\nconst routers = formatter(RouterConfig);\nrouters.forEach((route) => {\n  test(`test route page ${route}`, async ({ page }) => {\n    await testPage(route, page);\n  });\n});\n"
  },
  {
    "path": "web/admin/src/global.jsx",
    "content": "import { Button, message, notification } from 'antd';\nimport { useIntl } from 'umi';\nimport defaultSettings from '../config/defaultSettings';\nconst { pwa } = defaultSettings;\nconst isHttps = document.location.protocol === 'https:';\n\nconst clearCache = () => {\n  // remove all caches\n  if (window.caches) {\n    caches\n      .keys()\n      .then((keys) => {\n        keys.forEach((key) => {\n          caches.delete(key);\n        });\n      })\n      .catch((e) => console.log(e));\n  }\n}; // if pwa is true\n\nif (pwa) {\n  // Notify user if offline now\n  window.addEventListener('sw.offline', () => {\n    message.warning(\n      useIntl().formatMessage({\n        id: 'app.pwa.offline',\n      }),\n    );\n  }); // Pop up a prompt on the page asking the user if they want to use the latest version\n\n  window.addEventListener('sw.updated', (event) => {\n    const e = event;\n\n    const reloadSW = async () => {\n      // Check if there is sw whose state is waiting in ServiceWorkerRegistration\n      // https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerRegistration\n      const worker = e.detail && e.detail.waiting;\n\n      if (!worker) {\n        return true;\n      } // Send skip-waiting event to waiting SW with MessageChannel\n\n      await new Promise((resolve, reject) => {\n        const channel = new MessageChannel();\n\n        channel.port1.onmessage = (msgEvent) => {\n          if (msgEvent.data.error) {\n            reject(msgEvent.data.error);\n          } else {\n            resolve(msgEvent.data);\n          }\n        };\n\n        worker.postMessage(\n          {\n            type: 'skip-waiting',\n          },\n          [channel.port2],\n        );\n      });\n      clearCache();\n      window.location.reload();\n      return true;\n    };\n\n    const key = `open${Date.now()}`;\n    const btn = (\n      <Button\n        type=\"primary\"\n        onClick={() => {\n          notification.close(key);\n          reloadSW();\n        }}\n      >\n        {useIntl().formatMessage({\n          id: 'app.pwa.serviceworker.updated.ok',\n        })}\n      </Button>\n    );\n    notification.open({\n      message: useIntl().formatMessage({\n        id: 'app.pwa.serviceworker.updated',\n      }),\n      description: useIntl().formatMessage({\n        id: 'app.pwa.serviceworker.updated.hint',\n      }),\n      btn,\n      key,\n      onClose: async () => null,\n    });\n  });\n} else if ('serviceWorker' in navigator && isHttps) {\n  // unregister service worker\n  const { serviceWorker } = navigator;\n\n  if (serviceWorker.getRegistrations) {\n    serviceWorker.getRegistrations().then((sws) => {\n      sws.forEach((sw) => {\n        sw.unregister();\n      });\n    });\n  }\n\n  serviceWorker.getRegistration().then((sw) => {\n    if (sw) sw.unregister();\n  });\n  clearCache();\n}\n"
  },
  {
    "path": "web/admin/src/global.less",
    "content": "@import '~antd/es/style/variable.less';\n\nhtml,\nbody,\n#root {\n  height: 100%;\n}\n\n.colorWeak {\n  filter: invert(80%);\n}\n\n.ant-layout {\n  min-height: 100vh;\n}\n.ant-pro-sider.ant-layout-sider.ant-pro-sider-fixed {\n  left: unset;\n}\n\ncanvas {\n  display: block;\n}\n\nbody {\n  text-rendering: optimizeLegibility;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\nul,\nol {\n  list-style: none;\n}\n\n@media (max-width: @screen-xs) {\n  .ant-table {\n    width: 100%;\n    overflow-x: auto;\n    &-thead > tr,\n    &-tbody > tr {\n      > th,\n      > td {\n        white-space: pre;\n        > span {\n          display: block;\n        }\n      }\n    }\n  }\n}\n\n// Compatible with IE11\n@media screen and(-ms-high-contrast: active), (-ms-high-contrast: none) {\n  body .ant-design-pro > .ant-layout {\n    min-height: 100vh;\n  }\n}\n"
  },
  {
    "path": "web/admin/src/locales/bn-BD/component.js",
    "content": "export default {\n  'component.tagSelect.expand': 'বিস্তৃত',\n  'component.tagSelect.collapse': 'সঙ্কুচিত',\n  'component.tagSelect.all': 'সব',\n};\n"
  },
  {
    "path": "web/admin/src/locales/bn-BD/globalHeader.js",
    "content": "export default {\n  'component.globalHeader.search': 'অনুসন্ধান করুন',\n  'component.globalHeader.search.example1': 'অনুসন্ধান উদাহরণ ১',\n  'component.globalHeader.search.example2': 'অনুসন্ধান উদাহরণ ২',\n  'component.globalHeader.search.example3': 'অনুসন্ধান উদাহরণ ৩',\n  'component.globalHeader.help': 'সহায়তা',\n  'component.globalHeader.notification': 'বিজ্ঞপ্তি',\n  'component.globalHeader.notification.empty': 'আপনি সমস্ত বিজ্ঞপ্তি দেখেছেন।',\n  'component.globalHeader.message': 'বার্তা',\n  'component.globalHeader.message.empty': 'আপনি সমস্ত বার্তা দেখেছেন।',\n  'component.globalHeader.event': 'ঘটনা',\n  'component.globalHeader.event.empty': 'আপনি সমস্ত ইভেন্ট দেখেছেন।',\n  'component.noticeIcon.clear': 'সাফ',\n  'component.noticeIcon.cleared': 'সাফ করা হয়েছে',\n  'component.noticeIcon.empty': 'বিজ্ঞপ্তি নেই',\n  'component.noticeIcon.view-more': 'আরো দেখুন',\n};\n"
  },
  {
    "path": "web/admin/src/locales/bn-BD/menu.js",
    "content": "export default {\n  'menu.welcome': 'স্বাগতম',\n  'menu.more-blocks': 'আরও ব্লক',\n  'menu.home': 'নীড়',\n  'menu.admin': 'অ্যাডমিন',\n  'menu.admin.sub-page': 'উপ-পৃষ্ঠা',\n  'menu.login': 'প্রবেশ',\n  'menu.register': 'নিবন্ধন',\n  'menu.register-result': 'নিবন্ধনে ফলাফল',\n  'menu.dashboard': 'ড্যাশবোর্ড',\n  'menu.dashboard.analysis': 'বিশ্লেষণ',\n  'menu.dashboard.monitor': 'নিরীক্ষণ',\n  'menu.dashboard.workplace': 'কর্মক্ষেত্র',\n  'menu.exception.403': '403',\n  'menu.exception.404': '404',\n  'menu.exception.500': '500',\n  'menu.form': 'ফর্ম',\n  'menu.form.basic-form': 'বেসিক ফর্ম',\n  'menu.form.step-form': 'পদক্ষেপ ফর্ম',\n  'menu.form.step-form.info': 'পদক্ষেপ ফর্ম (স্থানান্তর তথ্য লিখুন)',\n  'menu.form.step-form.confirm': 'পদক্ষেপ ফর্ম (স্থানান্তর তথ্য নিশ্চিত করুন)',\n  'menu.form.step-form.result': 'পদক্ষেপ ফর্ম (সমাপ্ত)',\n  'menu.form.advanced-form': 'উন্নত ফর্ম',\n  'menu.list': 'তালিকা',\n  'menu.list.table-list': 'অনুসন্ধানের টেবিল',\n  'menu.list.basic-list': 'বেসিক তালিকা',\n  'menu.list.card-list': 'কার্ডের তালিকা',\n  'menu.list.search-list': 'অনুসন্ধানের তালিকা',\n  'menu.list.search-list.articles': 'অনুসন্ধানের তালিকা (নিবন্ধসমূহ)',\n  'menu.list.search-list.projects': 'অনুসন্ধানের তালিকা (প্রকল্পগুলি)',\n  'menu.list.search-list.applications': 'অনুসন্ধানের তালিকা (অ্যাপ্লিকেশন)',\n  'menu.profile': 'প্রোফাইল',\n  'menu.profile.basic': 'বেসিক প্রোফাইল',\n  'menu.profile.advanced': 'উন্নত প্রোফাইল',\n  'menu.result': 'ফলাফল',\n  'menu.result.success': 'সাফল্য',\n  'menu.result.fail': 'ব্যর্থ',\n  'menu.exception': 'ব্যতিক্রম',\n  'menu.exception.not-permission': '403',\n  'menu.exception.not-find': '404',\n  'menu.exception.server-error': '500',\n  'menu.exception.trigger': 'ট্রিগার',\n  'menu.account': 'হিসাব',\n  'menu.account.center': 'অ্যাকাউন্ট কেন্দ্র',\n  'menu.account.settings': 'অ্যাকাউন্ট সেটিংস',\n  'menu.account.trigger': 'ট্রিগার ত্রুটি',\n  'menu.account.logout': 'প্রস্থান',\n  'menu.editor': 'গ্রাফিক সম্পাদক',\n  'menu.editor.flow': 'ফ্লো এডিটর',\n  'menu.editor.mind': 'মাইন্ড এডিটর',\n  'menu.editor.koni': 'কোনি সম্পাদক',\n};\n"
  },
  {
    "path": "web/admin/src/locales/bn-BD/pages.js",
    "content": "export default {\n  'pages.layouts.userLayout.title':\n    'পিঁপড়া ডিজাইন হচ্ছে সিহু জেলার সবচেয়ে প্রভাবশালী ওয়েব ডিজাইনের স্পেসিফিকেশন',\n  'pages.login.accountLogin.tab': 'অ্যাকাউন্টে লগইন',\n  'pages.login.accountLogin.errorMessage': 'ভুল ব্যবহারকারীর নাম/পাসওয়ার্ড(admin/ant.design)',\n  'pages.login.failure': 'লগইন ব্যর্থ হয়েছে। আবার চেষ্টা করুন!',\n  'pages.login.success': 'সফল লগইন!',\n  'pages.login.username.placeholder': 'ব্যবহারকারীর নাম: admin or user',\n  'pages.login.username.required': 'আপনার ব্যবহারকারীর নাম ইনপুট করুন!',\n  'pages.login.password.placeholder': 'পাসওয়ার্ড: ant.design',\n  'pages.login.password.required': 'আপনার পাসওয়ার্ড ইনপুট করুন!',\n  'pages.login.phoneLogin.tab': 'ফোন লগইন',\n  'pages.login.phoneLogin.errorMessage': 'যাচাইকরণ কোড ত্রুটি',\n  'pages.login.phoneNumber.placeholder': 'ফোন নম্বর',\n  'pages.login.phoneNumber.required': 'আপনার ফোন নম্বর ইনপুট করুন!',\n  'pages.login.phoneNumber.invalid': 'ফোন নম্বরটি সঠিক নয়!',\n  'pages.login.captcha.placeholder': 'যাচাইকরণের কোড',\n  'pages.login.captcha.required': 'দয়া করে ভেরিফিকেশন কোডটি ইনপুট করুন!',\n  'pages.login.phoneLogin.getVerificationCode': 'কোড পান',\n  'pages.getCaptchaSecondText': 'সেকেন্ড',\n  'pages.login.rememberMe': 'আমাকে মনে রাখুন',\n  'pages.login.forgotPassword': 'পাসওয়ার্ড ভুলে গেছেন?',\n  'pages.login.submit': 'প্রবেশ করুন',\n  'pages.login.loginWith': 'লগইন করতে পারেন:',\n  'pages.login.registerAccount': 'অ্যাকাউন্ট নিবন্ধন করুন',\n  'pages.welcome.advancedComponent': 'অ্যাডভান্সড কম্পোনেন্ট',\n  'pages.welcome.link': 'স্বাগতম',\n  'pages.welcome.advancedLayout': 'অ্যাডভান্সড লেআউট',\n  'pages.welcome.alertMessage': 'দ্রুত এবং শক্তিশালী ভারী শুল্ক উপাদান প্রকাশ করা হয়েছে।',\n  'pages.admin.subPage.title': 'এই পৃষ্ঠাটি কেবল অ্যাডমিন দ্বারা দেখা যাবে',\n  'pages.admin.subPage.alertMessage':\n    'UMI UI এখন প্রকাশিত হয়েছে, অভিজ্ঞতা শুরু করতে npm run ui ব্যবহার করতে স্বাগতম।',\n  'pages.searchTable.createForm.newRule': 'নতুন বিধি',\n  'pages.searchTable.updateForm.ruleConfig': 'বিধি কনফিগারেশন',\n  'pages.searchTable.updateForm.basicConfig': 'মৌলিক তথ্য',\n  'pages.searchTable.updateForm.ruleName.nameLabel': 'বিধি নাম',\n  'pages.searchTable.updateForm.ruleName.nameRules': 'বিধির নাম লিখুন!',\n  'pages.searchTable.updateForm.ruleDesc.descLabel': 'বিধির বিবরণ',\n  'pages.searchTable.updateForm.ruleDesc.descPlaceholder': 'কমপক্ষে পাঁচটি অক্ষর লিখুন',\n  'pages.searchTable.updateForm.ruleDesc.descRules':\n    'কমপক্ষে পাঁচটি অক্ষরের একটি বিধান বিবরণ লিখুন!',\n  'pages.searchTable.updateForm.ruleProps.title': 'বৈশিষ্ট্য কনফিগার করুন',\n  'pages.searchTable.updateForm.object': 'নিরীক্ষণ অবজেক্ট',\n  'pages.searchTable.updateForm.ruleProps.templateLabel': 'বিধি টেম্পলেট',\n  'pages.searchTable.updateForm.ruleProps.typeLabel': 'বিধি প্রকার',\n  'pages.searchTable.updateForm.schedulingPeriod.title': 'সময়সূচী নির্ধারণ করুন',\n  'pages.searchTable.updateForm.schedulingPeriod.timeLabel': 'শুরুর সময়',\n  'pages.searchTable.updateForm.schedulingPeriod.timeRules': 'একটি শুরুর সময় চয়ন করুন!',\n  'pages.searchTable.titleDesc': 'বর্ণনা',\n  'pages.searchTable.ruleName': 'বিধি নাম প্রয়োজন',\n  'pages.searchTable.titleCallNo': 'পরিষেবা কল সংখ্যা',\n  'pages.searchTable.titleStatus': 'অবস্থা',\n  'pages.searchTable.nameStatus.default': 'ডিফল্ট',\n  'pages.searchTable.nameStatus.running': 'চলমান',\n  'pages.searchTable.nameStatus.online': 'অনলাইন',\n  'pages.searchTable.nameStatus.abnormal': 'অস্বাভাবিক',\n  'pages.searchTable.titleUpdatedAt': 'সর্বশেষ নির্ধারিত',\n  'pages.searchTable.exception': 'ব্যতিক্রম জন্য কারণ লিখুন!',\n  'pages.searchTable.titleOption': 'অপশন',\n  'pages.searchTable.config': 'কনফিগারেশন',\n  'pages.searchTable.subscribeAlert': 'সতর্কতা সাবস্ক্রাইব করুন',\n  'pages.searchTable.title': 'ইনকয়েরি ফরম',\n  'pages.searchTable.new': 'নতুন',\n  'pages.searchTable.chosen': 'নির্বাচিত',\n  'pages.searchTable.item': 'আইটেম',\n  'pages.searchTable.totalServiceCalls': 'পরিষেবা কলগুলির মোট সংখ্যা',\n  'pages.searchTable.tenThousand': '000',\n  'pages.searchTable.batchDeletion': 'একসাখে ডিলিট',\n  'pages.searchTable.batchApproval': 'একসাখে অনুমোদন',\n};\n"
  },
  {
    "path": "web/admin/src/locales/bn-BD/pwa.js",
    "content": "export default {\n  'app.pwa.offline': 'আপনি এখন অফলাইন',\n  'app.pwa.serviceworker.updated': 'নতুন সামগ্রী উপলব্ধ',\n  'app.pwa.serviceworker.updated.hint':\n    'বর্তমান পৃষ্ঠাটি পুনরায় লোড করতে দয়া করে \"রিফ্রেশ\" বোতাম টিপুন',\n  'app.pwa.serviceworker.updated.ok': 'রিফ্রেশ',\n};\n"
  },
  {
    "path": "web/admin/src/locales/bn-BD/settingDrawer.js",
    "content": "export default {\n  'app.setting.pagestyle': 'পৃষ্ঠা স্টাইল সেটিং',\n  'app.setting.pagestyle.dark': 'ডার্ক স্টাইল',\n  'app.setting.pagestyle.light': 'লাইট স্টাইল',\n  'app.setting.content-width': 'সামগ্রীর প্রস্থ',\n  'app.setting.content-width.fixed': 'স্থির',\n  'app.setting.content-width.fluid': 'প্রবাহী',\n  'app.setting.themecolor': 'থিম রঙ',\n  'app.setting.themecolor.dust': 'ডাস্ট রেড',\n  'app.setting.themecolor.volcano': 'আগ্নেয়গিরি',\n  'app.setting.themecolor.sunset': 'সানসেট কমলা',\n  'app.setting.themecolor.cyan': 'সবুজাভ নীল',\n  'app.setting.themecolor.green': 'পোলার সবুজ',\n  'app.setting.themecolor.daybreak': 'দিবস ব্রেক ব্লু (ডিফল্ট)',\n  'app.setting.themecolor.geekblue': 'গিক আঠালো',\n  'app.setting.themecolor.purple': 'গোল্ডেন বেগুনি',\n  'app.setting.navigationmode': 'নেভিগেশন মোড',\n  'app.setting.sidemenu': 'সাইড মেনু লেআউট',\n  'app.setting.topmenu': 'টপ মেনু লেআউট',\n  'app.setting.fixedheader': 'স্থির হেডার',\n  'app.setting.fixedsidebar': 'স্থির সাইডবার',\n  'app.setting.fixedsidebar.hint': 'সাইড মেনু বিন্যাসে কাজ করে',\n  'app.setting.hideheader': 'স্ক্রোল করার সময় হেডার লুকানো',\n  'app.setting.hideheader.hint': 'লুকানো হেডার সক্ষম থাকলে কাজ করে',\n  'app.setting.othersettings': 'অন্যান্য সেটিংস্',\n  'app.setting.weakmode': 'দুর্বল মোড',\n  'app.setting.copy': 'সেটিং কপি করুন',\n  'app.setting.copyinfo': 'সাফল্যের অনুলিপি করুন - প্রতিস্থাপন করুন: src/models/setting.js',\n  'app.setting.production.hint':\n    'কেবল বিকাশের পরিবেশে প্যানেল শো সেট করা হচ্ছে, দয়া করে ম্যানুয়ালি সংশোধন করুন',\n};\n"
  },
  {
    "path": "web/admin/src/locales/bn-BD/settings.js",
    "content": "export default {\n  'app.settings.menuMap.basic': 'মৌলিক বৈশিষ্ট্যসহ',\n  'app.settings.menuMap.security': 'নিরাপত্তা বিন্যাস',\n  'app.settings.menuMap.binding': 'অ্যাকাউন্ট বাঁধাই',\n  'app.settings.menuMap.notification': 'নতুন বার্তা বিজ্ঞপ্তি',\n  'app.settings.basic.avatar': 'অবতার',\n  'app.settings.basic.change-avatar': 'অবতার পরিবর্তন করুন',\n  'app.settings.basic.email': 'ইমেইল',\n  'app.settings.basic.email-message': 'আপনার ইমেইল ইনপুট করুন!',\n  'app.settings.basic.nickname': 'ডাক নাম',\n  'app.settings.basic.nickname-message': 'আপনার ডাকনামটি ইনপুট করুন!',\n  'app.settings.basic.profile': 'ব্যক্তিগত প্রোফাইল',\n  'app.settings.basic.profile-message': 'আপনার ব্যক্তিগত প্রোফাইল ইনপুট করুন!',\n  'app.settings.basic.profile-placeholder': 'নিজের সাথে সংক্ষিপ্ত পরিচয়',\n  'app.settings.basic.country': 'দেশ/অঞ্চল',\n  'app.settings.basic.country-message': 'আপনার দেশ ইনপুট করুন!',\n  'app.settings.basic.geographic': 'প্রদেশ বা শহর',\n  'app.settings.basic.geographic-message': 'আপনার ভৌগলিক তথ্য ইনপুট করুন!',\n  'app.settings.basic.address': 'রাস্তার ঠিকানা',\n  'app.settings.basic.address-message': 'দয়া করে আপনার ঠিকানা ইনপুট করুন!',\n  'app.settings.basic.phone': 'ফোন নম্বর',\n  'app.settings.basic.phone-message': 'আপনার ফোন ইনপুট করুন!',\n  'app.settings.basic.update': 'তথ্য হালনাগাদ',\n  'app.settings.security.strong': 'শক্তিশালী',\n  'app.settings.security.medium': 'মধ্যম',\n  'app.settings.security.weak': 'দুর্বল',\n  'app.settings.security.password': 'অ্যাকাউন্টের পাসওয়ার্ড',\n  'app.settings.security.password-description': 'বর্তমান পাসওয়ার্ড শক্তি',\n  'app.settings.security.phone': 'সুরক্ষা ফোন',\n  'app.settings.security.phone-description': 'আবদ্ধ ফোন',\n  'app.settings.security.question': 'নিরাপত্তা প্রশ্ন',\n  'app.settings.security.question-description':\n    'সুরক্ষা প্রশ্ন সেট করা নেই, এবং সুরক্ষা নীতি কার্যকরভাবে অ্যাকাউন্ট সুরক্ষা রক্ষা করতে পারে',\n  'app.settings.security.email': 'ব্যাকআপ ইমেইল',\n  'app.settings.security.email-description': 'বাউন্ড ইমেইল',\n  'app.settings.security.mfa': 'MFA ডিভাইস',\n  'app.settings.security.mfa-description':\n    \"আনবাউন্ড এমএফএ ডিভাইস, বাঁধাইয়ের পরে, দু'বার নিশ্চিত করা যায়\",\n  'app.settings.security.modify': 'পরিবর্তন করুন',\n  'app.settings.security.set': 'সেট',\n  'app.settings.security.bind': 'বাঁধাই',\n  'app.settings.binding.taobao': 'বাঁধাই তাওবাও',\n  'app.settings.binding.taobao-description': 'বর্তমানে আনবাউন্ড তাওবাও অ্যাকাউন্ট',\n  'app.settings.binding.alipay': 'বাইন্ডিং আলিপে',\n  'app.settings.binding.alipay-description': 'বর্তমানে আনবাউন্ড আলিপে অ্যাকাউন্ট',\n  'app.settings.binding.dingding': 'বাঁধাই ডিঙ্গটালক',\n  'app.settings.binding.dingding-description': 'বর্তমানে আনবাউন্ড ডিঙ্গটাল অ্যাকাউন্ট',\n  'app.settings.binding.bind': 'বাঁধাই',\n  'app.settings.notification.password': 'অ্যাকাউন্টের পাসওয়ার্ড',\n  'app.settings.notification.password-description':\n    'অন্যান্য ব্যবহারকারীর বার্তাগুলি স্টেশন চিঠি আকারে জানানো হবে',\n  'app.settings.notification.messages': 'সিস্টেম বার্তা',\n  'app.settings.notification.messages-description':\n    'সিস্টেম বার্তাগুলি স্টেশন চিঠির আকারে জানানো হবে',\n  'app.settings.notification.todo': 'করণীয় বিজ্ঞপ্তি',\n  'app.settings.notification.todo-description': 'করণীয় তালিকাটি স্টেশন থেকে চিঠি আকারে জানানো হবে',\n  'app.settings.open': 'খোলা',\n  'app.settings.close': 'বন্ধ',\n};\n"
  },
  {
    "path": "web/admin/src/locales/bn-BD.js",
    "content": "import component from './bn-BD/component';\nimport globalHeader from './bn-BD/globalHeader';\nimport menu from './bn-BD/menu';\nimport pages from './bn-BD/pages';\nimport pwa from './bn-BD/pwa';\nimport settingDrawer from './bn-BD/settingDrawer';\nimport settings from './bn-BD/settings';\nexport default {\n  'navBar.lang': 'ভাষা',\n  'layout.user.link.help': 'সহায়তা',\n  'layout.user.link.privacy': 'গোপনীয়তা',\n  'layout.user.link.terms': 'শর্তাদি',\n  'app.copyright.produced': 'প্রযোজনা করেছেন অ্যান্ট ফিনান্সিয়াল এক্সপেরিয়েন্স ডিপার্টমেন্ট',\n  'app.preview.down.block': 'আপনার স্থানীয় প্রকল্পে এই পৃষ্ঠাটি ডাউনলোড করুন',\n  'app.welcome.link.fetch-blocks': 'সমস্ত ব্লক পান',\n  'app.welcome.link.block-list':\n    '`block` ডেভেলপমেন্ট এর উপর ভিত্তি করে দ্রুত স্ট্যান্ডার্ড, পৃষ্ঠাসমূহ তৈরি করুন।',\n  ...globalHeader,\n  ...menu,\n  ...settingDrawer,\n  ...settings,\n  ...pwa,\n  ...component,\n  ...pages,\n};\n"
  },
  {
    "path": "web/admin/src/locales/en-US/component.js",
    "content": "export default {\n  'component.tagSelect.expand': 'Expand',\n  'component.tagSelect.collapse': 'Collapse',\n  'component.tagSelect.all': 'All',\n};\n"
  },
  {
    "path": "web/admin/src/locales/en-US/globalHeader.js",
    "content": "export default {\n  'component.globalHeader.search': 'Search',\n  'component.globalHeader.search.example1': 'Search example 1',\n  'component.globalHeader.search.example2': 'Search example 2',\n  'component.globalHeader.search.example3': 'Search example 3',\n  'component.globalHeader.help': 'Help',\n  'component.globalHeader.notification': 'Notification',\n  'component.globalHeader.notification.empty': 'You have viewed all notifications.',\n  'component.globalHeader.message': 'Message',\n  'component.globalHeader.message.empty': 'You have viewed all messsages.',\n  'component.globalHeader.event': 'Event',\n  'component.globalHeader.event.empty': 'You have viewed all events.',\n  'component.noticeIcon.clear': 'Clear',\n  'component.noticeIcon.cleared': 'Cleared',\n  'component.noticeIcon.empty': 'No notifications',\n  'component.noticeIcon.view-more': 'View more',\n};\n"
  },
  {
    "path": "web/admin/src/locales/en-US/menu.js",
    "content": "export default {\n  'menu.welcome': 'Welcome',\n  'menu.more-blocks': 'More Blocks',\n  'menu.home': 'Home',\n  'menu.admin': 'Admin',\n  'menu.admin.sub-page': 'Sub-Page',\n  'menu.login': 'Login',\n  'menu.register': 'Register',\n  'menu.register-result': 'Register Result',\n  'menu.dashboard': 'Dashboard',\n  'menu.dashboard.analysis': 'Analysis',\n  'menu.dashboard.monitor': 'Monitor',\n  'menu.dashboard.workplace': 'Workplace',\n  'menu.exception.403': '403',\n  'menu.exception.404': '404',\n  'menu.exception.500': '500',\n  'menu.form': 'Form',\n  'menu.form.basic-form': 'Basic Form',\n  'menu.form.step-form': 'Step Form',\n  'menu.form.step-form.info': 'Step Form(write transfer information)',\n  'menu.form.step-form.confirm': 'Step Form(confirm transfer information)',\n  'menu.form.step-form.result': 'Step Form(finished)',\n  'menu.form.advanced-form': 'Advanced Form',\n  'menu.list': 'List',\n  'menu.list.table-list': 'Search Table',\n  'menu.list.basic-list': 'Basic List',\n  'menu.list.card-list': 'Card List',\n  'menu.list.search-list': 'Search List',\n  'menu.list.search-list.articles': 'Search List(articles)',\n  'menu.list.search-list.projects': 'Search List(projects)',\n  'menu.list.search-list.applications': 'Search List(applications)',\n  'menu.profile': 'Profile',\n  'menu.profile.basic': 'Basic Profile',\n  'menu.profile.advanced': 'Advanced Profile',\n  'menu.result': 'Result',\n  'menu.result.success': 'Success',\n  'menu.result.fail': 'Fail',\n  'menu.exception': 'Exception',\n  'menu.exception.not-permission': '403',\n  'menu.exception.not-find': '404',\n  'menu.exception.server-error': '500',\n  'menu.exception.trigger': 'Trigger',\n  'menu.account': 'Account',\n  'menu.account.center': 'Account Center',\n  'menu.account.settings': 'Account Settings',\n  'menu.account.trigger': 'Trigger Error',\n  'menu.account.logout': 'Logout',\n  'menu.editor': 'Graphic Editor',\n  'menu.editor.flow': 'Flow Editor',\n  'menu.editor.mind': 'Mind Editor',\n  'menu.editor.koni': 'Koni Editor',\n};\n"
  },
  {
    "path": "web/admin/src/locales/en-US/pages.js",
    "content": "export default {\n  'pages.layouts.userLayout.title':\n    'Ant Design is the most influential web design specification in Xihu district',\n  'pages.login.accountLogin.tab': 'Account Login',\n  'pages.login.accountLogin.errorMessage': 'Incorrect username/password(admin/ant.design)',\n  'pages.login.failure': 'Login failed, please try again!',\n  'pages.login.success': 'Login successful!',\n  'pages.login.username.placeholder': 'Username: admin or user',\n  'pages.login.username.required': 'Please input your username!',\n  'pages.login.password.placeholder': 'Password: ant.design',\n  'pages.login.password.required': 'Please input your password!',\n  'pages.login.phoneLogin.tab': 'Phone Login',\n  'pages.login.phoneLogin.errorMessage': 'Verification Code Error',\n  'pages.login.phoneNumber.placeholder': 'Phone Number',\n  'pages.login.phoneNumber.required': 'Please input your phone number!',\n  'pages.login.phoneNumber.invalid': 'Phone number is invalid!',\n  'pages.login.captcha.placeholder': 'Verification Code',\n  'pages.login.captcha.required': 'Please input verification code!',\n  'pages.login.phoneLogin.getVerificationCode': 'Get Code',\n  'pages.getCaptchaSecondText': 'sec(s)',\n  'pages.login.rememberMe': 'Remember me',\n  'pages.login.forgotPassword': 'Forgot Password ?',\n  'pages.login.submit': 'Login',\n  'pages.login.loginWith': 'Login with :',\n  'pages.login.registerAccount': 'Register Account',\n  'pages.welcome.advancedComponent': 'Advanced Component',\n  'pages.welcome.link': 'Welcome',\n  'pages.welcome.advancedLayout': 'Advanced Layout',\n  'pages.welcome.alertMessage': 'Faster and stronger heavy-duty components have been released.',\n  'pages.admin.subPage.title': 'This page can only be viewed by Admin',\n  'pages.admin.subPage.alertMessage':\n    'Umi ui is now released, welcome to use npm run ui to start the experience.',\n  'pages.searchTable.createForm.newRule': 'New Rule',\n  'pages.searchTable.updateForm.ruleConfig': 'Rule configuration',\n  'pages.searchTable.updateForm.basicConfig': 'Basic Information',\n  'pages.searchTable.updateForm.ruleName.nameLabel': 'Rule Name',\n  'pages.searchTable.updateForm.ruleName.nameRules': 'Please enter the rule name!',\n  'pages.searchTable.updateForm.ruleDesc.descLabel': 'Rule Description',\n  'pages.searchTable.updateForm.ruleDesc.descPlaceholder': 'Please enter at least five characters',\n  'pages.searchTable.updateForm.ruleDesc.descRules':\n    'Please enter a rule description of at least five characters!',\n  'pages.searchTable.updateForm.ruleProps.title': 'Configure Properties',\n  'pages.searchTable.updateForm.object': 'Monitoring Object',\n  'pages.searchTable.updateForm.ruleProps.templateLabel': 'Rule Template',\n  'pages.searchTable.updateForm.ruleProps.typeLabel': 'Rule Type',\n  'pages.searchTable.updateForm.schedulingPeriod.title': 'Set Scheduling Period',\n  'pages.searchTable.updateForm.schedulingPeriod.timeLabel': 'Starting Time',\n  'pages.searchTable.updateForm.schedulingPeriod.timeRules': 'Please choose a start time!',\n  'pages.searchTable.titleDesc': 'Description',\n  'pages.searchTable.ruleName': 'Rule name is required',\n  'pages.searchTable.titleCallNo': 'Number of Service Calls',\n  'pages.searchTable.titleStatus': 'Status',\n  'pages.searchTable.nameStatus.default': 'default',\n  'pages.searchTable.nameStatus.running': 'running',\n  'pages.searchTable.nameStatus.online': 'online',\n  'pages.searchTable.nameStatus.abnormal': 'abnormal',\n  'pages.searchTable.titleUpdatedAt': 'Last Scheduled at',\n  'pages.searchTable.exception': 'Please enter the reason for the exception!',\n  'pages.searchTable.titleOption': 'Option',\n  'pages.searchTable.config': 'Configuration',\n  'pages.searchTable.subscribeAlert': 'Subscribe to alerts',\n  'pages.searchTable.title': 'Enquiry Form',\n  'pages.searchTable.new': 'New',\n  'pages.searchTable.chosen': 'chosen',\n  'pages.searchTable.item': 'item',\n  'pages.searchTable.totalServiceCalls': 'Total Number of Service Calls',\n  'pages.searchTable.tenThousand': '0000',\n  'pages.searchTable.batchDeletion': 'bacth deletion',\n  'pages.searchTable.batchApproval': 'batch approval',\n};\n"
  },
  {
    "path": "web/admin/src/locales/en-US/pwa.js",
    "content": "export default {\n  'app.pwa.offline': 'You are offline now',\n  'app.pwa.serviceworker.updated': 'New content is available',\n  'app.pwa.serviceworker.updated.hint': 'Please press the \"Refresh\" button to reload current page',\n  'app.pwa.serviceworker.updated.ok': 'Refresh',\n};\n"
  },
  {
    "path": "web/admin/src/locales/en-US/settingDrawer.js",
    "content": "export default {\n  'app.setting.pagestyle': 'Page style setting',\n  'app.setting.pagestyle.dark': 'Dark style',\n  'app.setting.pagestyle.light': 'Light style',\n  'app.setting.content-width': 'Content Width',\n  'app.setting.content-width.fixed': 'Fixed',\n  'app.setting.content-width.fluid': 'Fluid',\n  'app.setting.themecolor': 'Theme Color',\n  'app.setting.themecolor.dust': 'Dust Red',\n  'app.setting.themecolor.volcano': 'Volcano',\n  'app.setting.themecolor.sunset': 'Sunset Orange',\n  'app.setting.themecolor.cyan': 'Cyan',\n  'app.setting.themecolor.green': 'Polar Green',\n  'app.setting.themecolor.daybreak': 'Daybreak Blue (default)',\n  'app.setting.themecolor.geekblue': 'Geek Glue',\n  'app.setting.themecolor.purple': 'Golden Purple',\n  'app.setting.navigationmode': 'Navigation Mode',\n  'app.setting.sidemenu': 'Side Menu Layout',\n  'app.setting.topmenu': 'Top Menu Layout',\n  'app.setting.fixedheader': 'Fixed Header',\n  'app.setting.fixedsidebar': 'Fixed Sidebar',\n  'app.setting.fixedsidebar.hint': 'Works on Side Menu Layout',\n  'app.setting.hideheader': 'Hidden Header when scrolling',\n  'app.setting.hideheader.hint': 'Works when Hidden Header is enabled',\n  'app.setting.othersettings': 'Other Settings',\n  'app.setting.weakmode': 'Weak Mode',\n  'app.setting.copy': 'Copy Setting',\n  'app.setting.copyinfo': 'copy success，please replace defaultSettings in src/models/setting.js',\n  'app.setting.production.hint':\n    'Setting panel shows in development environment only, please manually modify',\n};\n"
  },
  {
    "path": "web/admin/src/locales/en-US/settings.js",
    "content": "export default {\n  'app.settings.menuMap.basic': 'Basic Settings',\n  'app.settings.menuMap.security': 'Security Settings',\n  'app.settings.menuMap.binding': 'Account Binding',\n  'app.settings.menuMap.notification': 'New Message Notification',\n  'app.settings.basic.avatar': 'Avatar',\n  'app.settings.basic.change-avatar': 'Change avatar',\n  'app.settings.basic.email': 'Email',\n  'app.settings.basic.email-message': 'Please input your email!',\n  'app.settings.basic.nickname': 'Nickname',\n  'app.settings.basic.nickname-message': 'Please input your Nickname!',\n  'app.settings.basic.profile': 'Personal profile',\n  'app.settings.basic.profile-message': 'Please input your personal profile!',\n  'app.settings.basic.profile-placeholder': 'Brief introduction to yourself',\n  'app.settings.basic.country': 'Country/Region',\n  'app.settings.basic.country-message': 'Please input your country!',\n  'app.settings.basic.geographic': 'Province or city',\n  'app.settings.basic.geographic-message': 'Please input your geographic info!',\n  'app.settings.basic.address': 'Street Address',\n  'app.settings.basic.address-message': 'Please input your address!',\n  'app.settings.basic.phone': 'Phone Number',\n  'app.settings.basic.phone-message': 'Please input your phone!',\n  'app.settings.basic.update': 'Update Information',\n  'app.settings.security.strong': 'Strong',\n  'app.settings.security.medium': 'Medium',\n  'app.settings.security.weak': 'Weak',\n  'app.settings.security.password': 'Account Password',\n  'app.settings.security.password-description': 'Current password strength',\n  'app.settings.security.phone': 'Security Phone',\n  'app.settings.security.phone-description': 'Bound phone',\n  'app.settings.security.question': 'Security Question',\n  'app.settings.security.question-description':\n    'The security question is not set, and the security policy can effectively protect the account security',\n  'app.settings.security.email': 'Backup Email',\n  'app.settings.security.email-description': 'Bound Email',\n  'app.settings.security.mfa': 'MFA Device',\n  'app.settings.security.mfa-description':\n    'Unbound MFA device, after binding, can be confirmed twice',\n  'app.settings.security.modify': 'Modify',\n  'app.settings.security.set': 'Set',\n  'app.settings.security.bind': 'Bind',\n  'app.settings.binding.taobao': 'Binding Taobao',\n  'app.settings.binding.taobao-description': 'Currently unbound Taobao account',\n  'app.settings.binding.alipay': 'Binding Alipay',\n  'app.settings.binding.alipay-description': 'Currently unbound Alipay account',\n  'app.settings.binding.dingding': 'Binding DingTalk',\n  'app.settings.binding.dingding-description': 'Currently unbound DingTalk account',\n  'app.settings.binding.bind': 'Bind',\n  'app.settings.notification.password': 'Account Password',\n  'app.settings.notification.password-description':\n    'Messages from other users will be notified in the form of a station letter',\n  'app.settings.notification.messages': 'System Messages',\n  'app.settings.notification.messages-description':\n    'System messages will be notified in the form of a station letter',\n  'app.settings.notification.todo': 'To-do Notification',\n  'app.settings.notification.todo-description':\n    'The to-do list will be notified in the form of a letter from the station',\n  'app.settings.open': 'Open',\n  'app.settings.close': 'Close',\n};\n"
  },
  {
    "path": "web/admin/src/locales/en-US.js",
    "content": "import component from './en-US/component';\nimport globalHeader from './en-US/globalHeader';\nimport menu from './en-US/menu';\nimport pages from './en-US/pages';\nimport pwa from './en-US/pwa';\nimport settingDrawer from './en-US/settingDrawer';\nimport settings from './en-US/settings';\nexport default {\n  'navBar.lang': 'Languages',\n  'layout.user.link.help': 'Help',\n  'layout.user.link.privacy': 'Privacy',\n  'layout.user.link.terms': 'Terms',\n  'app.copyright.produced': 'Produced by Ant Financial Experience Department',\n  'app.preview.down.block': 'Download this page to your local project',\n  'app.welcome.link.fetch-blocks': 'Get all block',\n  'app.welcome.link.block-list': 'Quickly build standard, pages based on `block` development',\n  ...globalHeader,\n  ...menu,\n  ...settingDrawer,\n  ...settings,\n  ...pwa,\n  ...component,\n  ...pages,\n};\n"
  },
  {
    "path": "web/admin/src/locales/fa-IR/component.js",
    "content": "export default {\n  'component.tagSelect.expand': 'باز',\n  'component.tagSelect.collapse': 'بسته ',\n  'component.tagSelect.all': 'همه',\n};\n"
  },
  {
    "path": "web/admin/src/locales/fa-IR/globalHeader.js",
    "content": "export default {\n  'component.globalHeader.search': 'جستجو ',\n  'component.globalHeader.search.example1': 'مثال 1 را جستجو کنید',\n  'component.globalHeader.search.example2': 'مثال 2 را جستجو کنید',\n  'component.globalHeader.search.example3': 'مثال 3 را جستجو کنید',\n  'component.globalHeader.help': 'کمک',\n  'component.globalHeader.notification': 'اعلان',\n  'component.globalHeader.notification.empty': 'شما همه اعلان ها را مشاهده کرده اید.',\n  'component.globalHeader.message': 'پیام',\n  'component.globalHeader.message.empty': 'شما همه پیام ها را مشاهده کرده اید.',\n  'component.globalHeader.event': 'رویداد',\n  'component.globalHeader.event.empty': 'شما همه رویدادها را مشاهده کرده اید.',\n  'component.noticeIcon.clear': 'پاک کردن',\n  'component.noticeIcon.cleared': 'پاک شد',\n  'component.noticeIcon.empty': 'بدون اعلان',\n  'component.noticeIcon.view-more': 'نمایش بیشتر',\n};\n"
  },
  {
    "path": "web/admin/src/locales/fa-IR/menu.js",
    "content": "export default {\n  'menu.welcome': 'خوش آمدید',\n  'menu.more-blocks': 'بلوک های بیشتر',\n  'menu.home': 'خانه',\n  'menu.admin': 'مدیر',\n  'menu.admin.sub-page': 'زیر صفحه',\n  'menu.login': 'ورود',\n  'menu.register': 'ثبت نام',\n  'menu.register-result': 'ثبت نام نتیجه',\n  'menu.dashboard': 'داشبورد',\n  'menu.dashboard.analysis': 'تحلیل و بررسی',\n  'menu.dashboard.monitor': 'نظارت',\n  'menu.dashboard.workplace': 'محل کار',\n  'menu.exception.403': '403',\n  'menu.exception.404': '404',\n  'menu.exception.500': '500',\n  'menu.form': 'فرم',\n  'menu.form.basic-form': 'فرم اساسی',\n  'menu.form.step-form': 'فرم مرحله',\n  'menu.form.step-form.info': 'فرم مرحله (نوشتن اطلاعات انتقال)',\n  'menu.form.step-form.confirm': 'فرم مرحله (تأیید اطلاعات انتقال)',\n  'menu.form.step-form.result': 'فرم مرحله (تمام شده)',\n  'menu.form.advanced-form': 'فرم پیشرفته',\n  'menu.list': 'لیست',\n  'menu.list.table-list': 'جدول جستجو',\n  'menu.list.basic-list': 'لیست اصلی',\n  'menu.list.card-list': 'لیست کارت',\n  'menu.list.search-list': 'لیست جستجو',\n  'menu.list.search-list.articles': 'لیست جستجو (مقالات)',\n  'menu.list.search-list.projects': 'لیست جستجو (پروژه ها)',\n  'menu.list.search-list.applications': 'لیست جستجو (برنامه ها)',\n  'menu.profile': 'مشخصات',\n  'menu.profile.basic': 'مشخصات عمومی',\n  'menu.profile.advanced': 'مشخصات پیشرفته',\n  'menu.result': 'نتیجه',\n  'menu.result.success': 'موفق',\n  'menu.result.fail': 'ناموفق',\n  'menu.exception': 'استثنا',\n  'menu.exception.not-permission': '403',\n  'menu.exception.not-find': '404',\n  'menu.exception.server-error': '500',\n  'menu.exception.trigger': 'راه اندازی',\n  'menu.account': 'حساب',\n  'menu.account.center': 'مرکز حساب',\n  'menu.account.settings': 'تنظیمات حساب',\n  'menu.account.trigger': 'خطای راه اندازی',\n  'menu.account.logout': 'خروج',\n  'menu.editor': 'ویرایشگر گرافیک',\n  'menu.editor.flow': 'ویرایشگر جریان',\n  'menu.editor.mind': 'ویرایشگر ذهن',\n  'menu.editor.koni': 'ویرایشگر Koni',\n};\n"
  },
  {
    "path": "web/admin/src/locales/fa-IR/pages.js",
    "content": "export default {\n  'pages.layouts.userLayout.title': 'طراحی مورچه تأثیرگذارترین مشخصات طراحی وب در منطقه Xihu است',\n  'pages.login.accountLogin.tab': 'ورود به حساب کاربری',\n  'pages.login.accountLogin.errorMessage': 'نام کاربری / رمزعبور نادرست (مدیر / ant.design)',\n  'pages.login.username.placeholder': 'نام کاربری: مدیر یا کاربر',\n  'pages.login.username.required': 'لطفا نام کاربری خود را وارد کنید!',\n  'pages.login.password.placeholder': 'رمز عبور: ant.design',\n  'pages.login.password.required': 'لطفاً رمز ورود خود را وارد کنید!',\n  'pages.login.phoneLogin.tab': 'ورود به سیستم تلفن',\n  'pages.login.phoneLogin.errorMessage': 'خطای کد تأیید',\n  'pages.login.phoneNumber.placeholder': 'شماره تلفن',\n  'pages.login.phoneNumber.required': 'لطفاً شماره تلفن خود را وارد کنید!',\n  'pages.login.phoneNumber.invalid': 'شماره تلفن نامعتبر است!',\n  'pages.login.captcha.placeholder': 'کد تایید',\n  'pages.login.captcha.required': 'لطفا کد تأیید را وارد کنید!',\n  'pages.login.phoneLogin.getVerificationCode': 'دریافت کد',\n  'pages.getCaptchaSecondText': 'ثانیه',\n  'pages.login.rememberMe': 'مرا به خاطر بسپار',\n  'pages.login.forgotPassword': 'رمز عبور را فراموش کرده اید ?',\n  'pages.login.submit': 'ارسال',\n  'pages.login.loginWith': 'وارد شوید با :',\n  'pages.login.registerAccount': 'ثبت نام',\n  'pages.welcome.advancedComponent': 'مولفه پیشرفته',\n  'pages.welcome.link': 'خوش آمدید',\n  'pages.welcome.advancedLayout': 'چیدمان پیشرفته',\n  'pages.welcome.alertMessage': 'اجزای سنگین تر سریعتر و قوی تر آزاد شده اند.',\n  'pages.admin.subPage.title': 'این صفحه فقط توسط مدیر قابل مشاهده است',\n  'pages.admin.subPage.alertMessage':\n    'رابط کاربری Umi اکنون منتشر شده است ، برای شروع تجربه استفاده از npm run ui خوش آمدید.',\n  'pages.searchTable.createForm.newRule': 'قانون جدید',\n  'pages.searchTable.updateForm.ruleConfig': 'پیکربندی قانون',\n  'pages.searchTable.updateForm.basicConfig': 'اطلاعات اولیه',\n  'pages.searchTable.updateForm.ruleName.nameLabel': ' نام قانون',\n  'pages.searchTable.updateForm.ruleName.nameRules': 'لطفاً نام قانون را وارد کنید!',\n  'pages.searchTable.updateForm.ruleDesc.descLabel': 'شرح قانون',\n  'pages.searchTable.updateForm.ruleDesc.descPlaceholder': 'لطفاً حداقل پنج حرف وارد کنید',\n  'pages.searchTable.updateForm.ruleDesc.descRules':\n    'لطفاً حداقل یک قانون حاوی پنج کاراکتر شرح دهید!',\n  'pages.searchTable.updateForm.ruleProps.title': 'پیکربندی خصوصیات',\n  'pages.searchTable.updateForm.object': 'نظارت بر شی',\n  'pages.searchTable.updateForm.ruleProps.templateLabel': 'الگوی قانون',\n  'pages.searchTable.updateForm.ruleProps.typeLabel': 'نوع قانون',\n  'pages.searchTable.updateForm.schedulingPeriod.title': 'تنظیم دوره زمان بندی',\n  'pages.searchTable.updateForm.schedulingPeriod.timeLabel': 'زمان شروع',\n  'pages.searchTable.updateForm.schedulingPeriod.timeRules': 'لطفاً زمان شروع را انتخاب کنید!',\n  'pages.searchTable.titleDesc': 'شرح',\n  'pages.searchTable.ruleName': 'نام قانون لازم است',\n  'pages.searchTable.titleCallNo': 'تعداد تماس های خدماتی',\n  'pages.searchTable.titleStatus': 'وضعیت',\n  'pages.searchTable.nameStatus.default': 'پیش فرض',\n  'pages.searchTable.nameStatus.running': 'در حال دویدن',\n  'pages.searchTable.nameStatus.online': 'برخط',\n  'pages.searchTable.nameStatus.abnormal': 'غیرطبیعی',\n  'pages.searchTable.titleUpdatedAt': 'آخرین برنامه ریزی در',\n  'pages.searchTable.exception': 'لطفا دلیل استثنا را وارد کنید!',\n  'pages.searchTable.titleOption': 'گزینه',\n  'pages.searchTable.config': 'پیکربندی',\n  'pages.searchTable.subscribeAlert': 'مشترک شدن در هشدارها',\n  'pages.searchTable.title': 'فرم درخواست',\n  'pages.searchTable.new': 'جدید',\n  'pages.searchTable.chosen': 'انتخاب شده',\n  'pages.searchTable.item': 'مورد',\n  'pages.searchTable.totalServiceCalls': 'تعداد کل تماس های خدماتی',\n  'pages.searchTable.tenThousand': '0000',\n  'pages.searchTable.batchDeletion': 'حذف دسته ای',\n  'pages.searchTable.batchApproval': 'تصویب دسته ای',\n};\n"
  },
  {
    "path": "web/admin/src/locales/fa-IR/pwa.js",
    "content": "export default {\n  'app.pwa.offline': 'شما اکنون آفلاین هستید',\n  'app.pwa.serviceworker.updated': 'مطالب جدید در دسترس است',\n  'app.pwa.serviceworker.updated.hint':\n    'لطفاً برای بارگیری مجدد صفحه فعلی ، دکمه \"تازه سازی\" را فشار دهید',\n  'app.pwa.serviceworker.updated.ok': 'تازه سازی',\n};\n"
  },
  {
    "path": "web/admin/src/locales/fa-IR/settingDrawer.js",
    "content": "export default {\n  'app.setting.pagestyle': 'تنظیم نوع صفحه',\n  'app.setting.pagestyle.dark': 'سبک تیره',\n  'app.setting.pagestyle.light': 'سبک سبک',\n  'app.setting.content-width': 'عرض محتوا',\n  'app.setting.content-width.fixed': 'ثابت',\n  'app.setting.content-width.fluid': 'شناور',\n  'app.setting.themecolor': 'رنگ تم',\n  'app.setting.themecolor.dust': 'گرد و غبار قرمز',\n  'app.setting.themecolor.volcano': 'آتشفشان',\n  'app.setting.themecolor.sunset': 'غروب نارنجی',\n  'app.setting.themecolor.cyan': 'فیروزه ای',\n  'app.setting.themecolor.green': 'سبز قطبی',\n  'app.setting.themecolor.daybreak': 'آبی روشن(پیشفرض)',\n  'app.setting.themecolor.geekblue': 'چسب گیک',\n  'app.setting.themecolor.purple': 'بنفش طلایی',\n  'app.setting.navigationmode': 'حالت پیمایش',\n  'app.setting.sidemenu': 'طرح منوی کناری',\n  'app.setting.topmenu': 'طرح منوی بالایی',\n  'app.setting.fixedheader': 'سرصفحه ثابت',\n  'app.setting.fixedsidebar': 'نوار کناری ثابت',\n  'app.setting.fixedsidebar.hint': 'کار بر روی منوی کناری',\n  'app.setting.hideheader': 'هدر پنهان هنگام پیمایش',\n  'app.setting.hideheader.hint': 'وقتی Hidden Header فعال باشد کار می کند',\n  'app.setting.othersettings': 'تنظیمات دیگر',\n  'app.setting.weakmode': 'حالت ضعیف',\n  'app.setting.copy': 'تنظیمات کپی',\n  'app.setting.copyinfo':\n    'موفقیت در کپی کردن ， لطفا defaultSettings را در src / models / setting.js جایگزین کنید',\n  'app.setting.production.hint':\n    'صفحه تنظیم فقط در محیط توسعه نمایش داده می شود ، لطفاً دستی تغییر دهید',\n};\n"
  },
  {
    "path": "web/admin/src/locales/fa-IR/settings.js",
    "content": "export default {\n  'app.settings.menuMap.basic': 'تنظیمات پایه ',\n  'app.settings.menuMap.security': 'تنظیمات امنیتی',\n  'app.settings.menuMap.binding': 'صحافی حساب',\n  'app.settings.menuMap.notification': 'اعلان پیام جدید',\n  'app.settings.basic.avatar': 'آواتار',\n  'app.settings.basic.change-avatar': 'آواتار را تغییر دهید',\n  'app.settings.basic.email': 'ایمیل',\n  'app.settings.basic.email-message': 'لطفا ایمیل خود را وارد کنید!',\n  'app.settings.basic.nickname': 'نام مستعار',\n  'app.settings.basic.nickname-message': 'لطفاً نام مستعار خود را وارد کنید!',\n  'app.settings.basic.profile': 'پروفایل شخصی',\n  'app.settings.basic.profile-message': 'لطفاً مشخصات شخصی خود را وارد کنید!',\n  'app.settings.basic.profile-placeholder': 'معرفی مختصر خودتان',\n  'app.settings.basic.country': 'کشور / منطقه',\n  'app.settings.basic.country-message': 'لطفاً کشور خود را وارد کنید!',\n  'app.settings.basic.geographic': 'استان یا شهر',\n  'app.settings.basic.geographic-message': 'لطفاً اطلاعات جغرافیایی خود را وارد کنید!',\n  'app.settings.basic.address': 'آدرس خیابان',\n  'app.settings.basic.address-message': 'لطفا آدرس خود را وارد کنید!',\n  'app.settings.basic.phone': 'شماره تلفن',\n  'app.settings.basic.phone-message': 'لطفاً تلفن خود را وارد کنید!',\n  'app.settings.basic.update': 'به روز رسانی اطلاعات',\n  'app.settings.security.strong': 'قوی',\n  'app.settings.security.medium': 'متوسط',\n  'app.settings.security.weak': 'ضعیف',\n  'app.settings.security.password': 'رمز عبور حساب کاربری',\n  'app.settings.security.password-description': 'قدرت رمز عبور فعلی',\n  'app.settings.security.phone': 'تلفن امنیتی',\n  'app.settings.security.phone-description': 'تلفن مقید',\n  'app.settings.security.question': 'سوال امنیتی',\n  'app.settings.security.question-description':\n    'سوال امنیتی تنظیم نشده است و سیاست امنیتی می تواند به طور موثر از امنیت حساب محافظت کند',\n  'app.settings.security.email': 'ایمیل پشتیبان',\n  'app.settings.security.email-description': 'ایمیل مقید',\n  'app.settings.security.mfa': 'دستگاه MFA',\n  'app.settings.security.mfa-description':\n    'دستگاه MFA بسته نشده ، پس از اتصال ، می تواند دو بار تأیید شود',\n  'app.settings.security.modify': 'تغییر',\n  'app.settings.security.set': 'تنظیم',\n  'app.settings.security.bind': 'بستن',\n  'app.settings.binding.taobao': 'اتصال Taobao',\n  'app.settings.binding.taobao-description': 'حساب Taobao در حال حاضر بسته نشده است',\n  'app.settings.binding.alipay': 'اتصال Alipay',\n  'app.settings.binding.alipay-description': 'حساب Alipay در حال حاضر بسته نشده است',\n  'app.settings.binding.dingding': 'اتصال DingTalk',\n  'app.settings.binding.dingding-description': 'حساب DingTalk در حال حاضر محدود نشده است',\n  'app.settings.binding.bind': 'بستن',\n  'app.settings.notification.password': 'رمز عبور حساب کاربری',\n  'app.settings.notification.password-description':\n    'پیام های سایر کاربران در قالب یک نامه ایستگاهی اعلام خواهد شد',\n  'app.settings.notification.messages': 'پیام های سیستم',\n  'app.settings.notification.messages-description':\n    'پیام های سیستم به صورت نامه ایستگاه مطلع می شوند',\n  'app.settings.notification.todo': 'اعلان کارها',\n  'app.settings.notification.todo-description':\n    'لیست کارها به صورت نامه ای از ایستگاه اطلاع داده می شود',\n  'app.settings.open': 'باز کن',\n  'app.settings.close': 'بستن',\n};\n"
  },
  {
    "path": "web/admin/src/locales/fa-IR.js",
    "content": "import component from './fa-IR/component';\nimport globalHeader from './fa-IR/globalHeader';\nimport menu from './fa-IR/menu';\nimport pwa from './fa-IR/pwa';\nimport settingDrawer from './fa-IR/settingDrawer';\nimport settings from './fa-IR/settings';\nimport pages from './fa-IR/pages';\nexport default {\n  'navBar.lang': 'زبان ها  ',\n  'layout.user.link.help': 'کمک',\n  'layout.user.link.privacy': 'حریم خصوصی',\n  'layout.user.link.terms': 'مقررات',\n  'app.preview.down.block': 'این صفحه را در پروژه محلی خود بارگیری کنید',\n  'app.welcome.link.fetch-blocks': 'دریافت تمام بلوک',\n  'app.welcome.link.block-list': 'به سرعت صفحات استاندارد مبتنی بر توسعه \"بلوک\" را بسازید',\n  ...globalHeader,\n  ...menu,\n  ...settingDrawer,\n  ...settings,\n  ...pwa,\n  ...component,\n  ...pages,\n};\n"
  },
  {
    "path": "web/admin/src/locales/id-ID/component.js",
    "content": "export default {\n  'component.tagSelect.expand': 'Perluas',\n  'component.tagSelect.collapse': 'Lipat',\n  'component.tagSelect.all': 'Semua',\n};\n"
  },
  {
    "path": "web/admin/src/locales/id-ID/globalHeader.js",
    "content": "export default {\n  'component.globalHeader.search': 'Pencarian',\n  'component.globalHeader.search.example1': 'Contoh 1 Pencarian',\n  'component.globalHeader.search.example2': 'Contoh 2 Pencarian',\n  'component.globalHeader.search.example3': 'Contoh 3 Pencarian',\n  'component.globalHeader.help': 'Bantuan',\n  'component.globalHeader.notification': 'Notifikasi',\n  'component.globalHeader.notification.empty': 'Anda telah membaca semua notifikasi',\n  'component.globalHeader.message': 'Pesan',\n  'component.globalHeader.message.empty': 'Anda telah membaca semua pesan.',\n  'component.globalHeader.event': 'Acara',\n  'component.globalHeader.event.empty': 'Anda telah melihat semua acara.',\n  'component.noticeIcon.clear': 'Kosongkan',\n  'component.noticeIcon.cleared': 'Berhasil dikosongkan',\n  'component.noticeIcon.empty': 'Tidak ada pemberitahuan',\n  'component.noticeIcon.view-more': 'Melihat lebih',\n};\n"
  },
  {
    "path": "web/admin/src/locales/id-ID/menu.js",
    "content": "export default {\n  'menu.welcome': 'Selamat Datang',\n  'menu.more-blocks': 'Blocks Lainnya',\n  'menu.home': 'Halaman Awal',\n  'menu.admin': 'Admin',\n  'menu.admin.sub-page': 'Sub-Halaman',\n  'menu.login': 'Masuk',\n  'menu.register': 'Pendaftaran',\n  'menu.register-result': 'Hasil Pendaftaran',\n  'menu.dashboard': 'Dasbor',\n  'menu.dashboard.analysis': 'Analisis',\n  'menu.dashboard.monitor': 'Monitor',\n  'menu.dashboard.workplace': 'Workplace',\n  'menu.exception.403': '403',\n  'menu.exception.404': '404',\n  'menu.exception.500': '500',\n  'menu.form': 'Form',\n  'menu.form.basic-form': 'Form Dasar',\n  'menu.form.step-form': 'Form Bertahap',\n  'menu.form.step-form.info': 'Form Bertahap(menulis informasi yang dibagikan)',\n  'menu.form.step-form.confirm': 'Form Bertahap(konfirmasi informasi yang dibagikan)',\n  'menu.form.step-form.result': 'Form Bertahap(selesai)',\n  'menu.form.advanced-form': 'Form Lanjutan',\n  'menu.list': 'Daftar',\n  'menu.list.table-list': 'Tabel Pencarian',\n  'menu.list.basic-list': 'Daftar Dasar',\n  'menu.list.card-list': 'Daftar Kartu',\n  'menu.list.search-list': 'Daftar Pencarian',\n  'menu.list.search-list.articles': 'Daftar Pencarian(artikel)',\n  'menu.list.search-list.projects': 'Daftar Pencarian(projek)',\n  'menu.list.search-list.applications': 'Daftar Pencarian(aplikasi)',\n  'menu.profile': 'Profil',\n  'menu.profile.basic': 'Profil Dasar',\n  'menu.profile.advanced': 'Profile Lanjutan',\n  'menu.result': 'Hasil',\n  'menu.result.success': 'Sukses',\n  'menu.result.fail': 'Gagal',\n  'menu.exception': 'Pengecualian',\n  'menu.exception.not-permission': '403',\n  'menu.exception.not-find': '404',\n  'menu.exception.server-error': '500',\n  'menu.exception.trigger': 'Jalankan',\n  'menu.account': 'Akun',\n  'menu.account.center': 'Detail Akun',\n  'menu.account.settings': 'Pengaturan Akun',\n  'menu.account.trigger': 'Mengaktivasi Error',\n  'menu.account.logout': 'Keluar',\n  'menu.editor': 'Penyusun Grafis',\n  'menu.editor.flow': 'Penyusun Alur',\n  'menu.editor.mind': 'Penyusun Mind',\n  'menu.editor.koni': 'Penyusun Koni',\n};\n"
  },
  {
    "path": "web/admin/src/locales/id-ID/pages.js",
    "content": "export default {\n  'pages.layouts.userLayout.title':\n    'Ant Design adalah spesifikasi desain Web yang paling berpengaruh di Kabupaten Xihu',\n  'pages.login.accountLogin.tab': 'Login dengan akun',\n  'pages.login.accountLogin.errorMessage': 'Nama pengguna dan kata sandi salah(admin/ant.design)',\n  'pages.login.username.placeholder': 'nama pengguna: admin atau user',\n  'pages.login.username.required': 'Nama pengguna harus diisi!',\n  'pages.login.password.placeholder': 'kata sandi: ant.design',\n  'pages.login.password.required': 'Kata sandi harus diisi!',\n  'pages.login.phoneLogin.tab': 'Login dengan ponsel',\n  'pages.login.phoneLogin.errorMessage': 'Kesalahan kode verifikasi',\n  'pages.login.phoneNumber.placeholder': 'masukkan nomor telepon',\n  'pages.login.phoneNumber.required': 'Nomor ponsel harus diisi!',\n  'pages.login.phoneNumber.invalid': 'Nomor ponsel tidak valid!',\n  'pages.login.captcha.placeholder': 'kode verifikasi',\n  'pages.login.captcha.required': 'Kode verifikasi diperlukan!',\n  'pages.login.phoneLogin.getVerificationCode': 'Dapatkan kode',\n  'pages.getCaptchaSecondText': 'detik tersisa',\n  'pages.login.rememberMe': 'Ingat saya',\n  'pages.login.forgotPassword': 'Lupa Kata Sandi?',\n  'pages.login.submit': 'Masuk',\n  'pages.login.loginWith': 'Masuk dengan :',\n  'pages.login.registerAccount': 'Daftar Akun',\n  'pages.welcome.advancedComponent': 'Formulir Lanjutan',\n  'pages.welcome.link': 'Selamat datang',\n  'pages.welcome.advancedLayout': 'Tata letak Lanjutan',\n  'pages.welcome.alertMessage':\n    'Komponen heavy-duty yang lebih cepat dan lebih kuat telah dirilis.',\n  'pages.admin.subPage.title': 'Halaman ini hanya dapat dilihat oleh admin',\n  'pages.admin.subPage.alertMessage':\n    'umi ui telah dirilis, silahkan gunakan npm run ui untuk memulai pengalaman.',\n  'pages.searchTable.createForm.newRule': 'Aturan baru',\n  'pages.searchTable.updateForm.ruleConfig': 'Konfigurasi aturan',\n  'pages.searchTable.updateForm.basicConfig': 'Informasi dasar',\n  'pages.searchTable.updateForm.ruleName.nameLabel': 'Nama aturan',\n  'pages.searchTable.updateForm.ruleName.nameRules': 'Harap masukkan nama aturan!',\n  'pages.searchTable.updateForm.ruleDesc.descLabel': 'Deskripsi aturan',\n  'pages.searchTable.updateForm.ruleDesc.descPlaceholder':\n    'Harap masukkan setidaknya lima karakter',\n  'pages.searchTable.updateForm.ruleDesc.descRules':\n    'Harap masukkan deskripsi aturan setidaknya lima karakter!',\n  'pages.searchTable.updateForm.ruleProps.title': 'Properti aturan',\n  'pages.searchTable.updateForm.object': 'Objek pemantauan',\n  'pages.searchTable.updateForm.ruleProps.templateLabel': 'Template aturan',\n  'pages.searchTable.updateForm.ruleProps.typeLabel': 'Jenis aturan',\n  'pages.searchTable.updateForm.schedulingPeriod.title': 'Periode penjadwalan',\n  'pages.searchTable.updateForm.schedulingPeriod.timeLabel': 'Waktu mulai',\n  'pages.searchTable.updateForm.schedulingPeriod.timeRules': 'Pilih waktu mulai!',\n  'pages.searchTable.titleDesc': 'deskripsi',\n  'pages.searchTable.ruleName': 'Nama aturan wajib diisi',\n  'pages.searchTable.titleCallNo': 'Jumlah panggilan',\n  'pages.searchTable.titleStatus': 'Status',\n  'pages.searchTable.nameStatus.default': 'default',\n  'pages.searchTable.nameStatus.running': 'menyala',\n  'pages.searchTable.nameStatus.online': 'online',\n  'pages.searchTable.nameStatus.abnormal': 'abnormal',\n  'pages.searchTable.titleUpdatedAt': 'Waktu terjadwal',\n  'pages.searchTable.exception': 'Harap masukkan alasan pengecualian!',\n  'pages.searchTable.titleOption': 'Pengoperasian',\n  'pages.searchTable.config': 'Konfigurasi',\n  'pages.searchTable.subscribeAlert': 'Berlangganan notifikasi',\n  'pages.searchTable.title': 'Formulir pertanyaan',\n  'pages.searchTable.new': 'Baru',\n  'pages.searchTable.chosen': 'Terpilih',\n  'pages.searchTable.item': 'item',\n  'pages.searchTable.totalServiceCalls': 'Jumlah total panggilan layanan',\n  'pages.searchTable.tenThousand': '0000',\n  'pages.searchTable.batchDeletion': 'Penghapusan batch',\n  'pages.searchTable.batchApproval': 'Persetujuan batch',\n};\n"
  },
  {
    "path": "web/admin/src/locales/id-ID/pwa.js",
    "content": "export default {\n  'app.pwa.offline': 'Koneksi anda terputus',\n  'app.pwa.serviceworker.updated': 'Konten baru sudah tersedia',\n  'app.pwa.serviceworker.updated.hint':\n    'Silahkan klik tombol \"Refresh\" untuk memuat ulang halaman ini',\n  'app.pwa.serviceworker.updated.ok': 'Memuat ulang',\n};\n"
  },
  {
    "path": "web/admin/src/locales/id-ID/settingDrawer.js",
    "content": "export default {\n  'app.setting.pagestyle': 'Pengaturan style Halaman',\n  'app.setting.pagestyle.dark': 'Style Gelap',\n  'app.setting.pagestyle.light': 'Style Cerah',\n  'app.setting.content-width': 'Lebar Konten',\n  'app.setting.content-width.fixed': 'Tetap',\n  'app.setting.content-width.fluid': 'Fluid',\n  'app.setting.themecolor': 'Theme Color',\n  'app.setting.themecolor.dust': 'Dust Red',\n  'app.setting.themecolor.volcano': 'Volcano',\n  'app.setting.themecolor.sunset': 'Sunset Orange',\n  'app.setting.themecolor.cyan': 'Cyan',\n  'app.setting.themecolor.green': 'Polar Green',\n  'app.setting.themecolor.daybreak': 'Daybreak Blue (bawaan)',\n  'app.setting.themecolor.geekblue': 'Geek Glue',\n  'app.setting.themecolor.purple': 'Golden Purple',\n  'app.setting.navigationmode': 'Mode Navigasi',\n  'app.setting.sidemenu': 'Susunan Menu Samping',\n  'app.setting.topmenu': 'Susunan Menu Atas',\n  'app.setting.fixedheader': 'Header Tetap',\n  'app.setting.fixedsidebar': 'Sidebar Tetap',\n  'app.setting.fixedsidebar.hint': 'Berjalan pada Susunan Menu Samping',\n  'app.setting.hideheader': 'Sembunyikan Header ketika gulir ke bawah',\n  'app.setting.hideheader.hint': 'Bekerja ketika Header tersembunyi dimunculkan',\n  'app.setting.othersettings': 'Pengaturan Lainnya',\n  'app.setting.weakmode': 'Mode Lemah',\n  'app.setting.copy': 'Salin Pengaturan',\n  'app.setting.copyinfo':\n    'Berhasil disalin，tolong ubah defaultSettings pada src/models/setting.js',\n  'app.setting.production.hint':\n    'Panel pengaturan hanya muncul pada lingkungan pengembangan, silahkan modifikasi secara menual',\n};\n"
  },
  {
    "path": "web/admin/src/locales/id-ID/settings.js",
    "content": "export default {\n  'app.settings.menuMap.basic': 'Pengaturan Dasar',\n  'app.settings.menuMap.security': 'Pengaturan Keamanan',\n  'app.settings.menuMap.binding': 'Pengikatan Akun',\n  'app.settings.menuMap.notification': 'Notifikasi Pesan Baru',\n  'app.settings.basic.avatar': 'Avatar',\n  'app.settings.basic.change-avatar': 'Ubah avatar',\n  'app.settings.basic.email': 'Email',\n  'app.settings.basic.email-message': 'Tolong masukkan email!',\n  'app.settings.basic.nickname': 'Nickname',\n  'app.settings.basic.nickname-message': 'Tolong masukkan Nickname!',\n  'app.settings.basic.profile': 'Profil Personal',\n  'app.settings.basic.profile-message': 'Tolong masukkan profil personal!',\n  'app.settings.basic.profile-placeholder': 'Perkenalan Singkat tentang Diri Anda',\n  'app.settings.basic.country': 'Negara/Wilayah',\n  'app.settings.basic.country-message': 'Tolong masukkan negara anda!',\n  'app.settings.basic.geographic': 'Provinsi atau kota',\n  'app.settings.basic.geographic-message': 'Tolong masukkan info geografis anda!',\n  'app.settings.basic.address': 'Alamat Jalan',\n  'app.settings.basic.address-message': 'Tolong masukkan Alamat Jalan anda!',\n  'app.settings.basic.phone': 'Nomor Ponsel',\n  'app.settings.basic.phone-message': 'Tolong masukkan Nomor Ponsel anda!',\n  'app.settings.basic.update': 'Perbarui Informasi',\n  'app.settings.security.strong': 'Kuat',\n  'app.settings.security.medium': 'Sedang',\n  'app.settings.security.weak': 'Lemah',\n  'app.settings.security.password': 'Kata Sandi Akun',\n  'app.settings.security.password-description': 'Kekuatan Kata Sandi saat ini',\n  'app.settings.security.phone': 'Keamanan Ponsel',\n  'app.settings.security.phone-description': 'Mengikat Ponsel',\n  'app.settings.security.question': 'Pertanyaan Keamanan',\n  'app.settings.security.question-description':\n    'Pertanyaan Keamanan belum diatur, dan kebijakan keamanan dapat melindungi akun secara efektif',\n  'app.settings.security.email': 'Email Cadangan',\n  'app.settings.security.email-description': 'Mengikat Email',\n  'app.settings.security.mfa': 'Perangka MFA',\n  'app.settings.security.mfa-description':\n    'Tidak mengikat Perangkat MFA, setelah diikat, dapat dikonfirmasi dua kali',\n  'app.settings.security.modify': 'Modifikasi',\n  'app.settings.security.set': 'Setel',\n  'app.settings.security.bind': 'Ikat',\n  'app.settings.binding.taobao': 'Mengikat Taobao',\n  'app.settings.binding.taobao-description': 'Tidak mengikat akun Taobao saat ini',\n  'app.settings.binding.alipay': 'Mengikat Alipay',\n  'app.settings.binding.alipay-description': 'Tidak mengikat akun Alipay saat ini',\n  'app.settings.binding.dingding': 'Mengikat DingTalk',\n  'app.settings.binding.dingding-description': 'Tidak mengikat akun DingTalk',\n  'app.settings.binding.bind': 'Ikat',\n  'app.settings.notification.password': 'Kata Sandi Akun',\n  'app.settings.notification.password-description':\n    'Pesan dari pengguna lain akan diberitahu dalam bentuk surat',\n  'app.settings.notification.messages': 'Pesan Sistem',\n  'app.settings.notification.messages-description':\n    'Pesan sistem akan diberitahu dalam bentuk surat',\n  'app.settings.notification.todo': 'Notifikasi daftar To-do',\n  'app.settings.notification.todo-description':\n    'Daftar to-do akan diberitahukan dalam bentuk surat dari stasiun',\n  'app.settings.open': 'Buka',\n  'app.settings.close': 'Tutup',\n};\n"
  },
  {
    "path": "web/admin/src/locales/id-ID.js",
    "content": "import component from './id-ID/component';\nimport globalHeader from './id-ID/globalHeader';\nimport menu from './id-ID/menu';\nimport pwa from './id-ID/pwa';\nimport settingDrawer from './id-ID/settingDrawer';\nimport settings from './id-ID/settings';\nimport pages from './id-ID/pages';\nexport default {\n  'navbar.lang': 'Bahasa',\n  'layout.user.link.help': 'Bantuan',\n  'layout.user.link.privacy': 'Privasi',\n  'layout.user.link.terms': 'Ketentuan',\n  'app.preview.down.block': 'Unduh halaman ini dalam projek lokal anda',\n  'app.welcome.link.fetch-blocks': 'Dapatkan semua blok',\n  'app.welcome.link.block-list':\n    'Buat standar dengan cepat, halaman-halaman berdasarkan pengembangan `block`',\n  ...globalHeader,\n  ...menu,\n  ...settingDrawer,\n  ...settings,\n  ...pwa,\n  ...component,\n  ...pages,\n};\n"
  },
  {
    "path": "web/admin/src/locales/ja-JP/component.js",
    "content": "export default {\n  'component.tagSelect.expand': '展開',\n  'component.tagSelect.collapse': '折りたたむ',\n  'component.tagSelect.all': 'すべて',\n};\n"
  },
  {
    "path": "web/admin/src/locales/ja-JP/globalHeader.js",
    "content": "export default {\n  'component.globalHeader.search': '検索',\n  'component.globalHeader.search.example1': '検索例1',\n  'component.globalHeader.search.example2': '検索例2',\n  'component.globalHeader.search.example3': '検索例3',\n  'component.globalHeader.help': 'ヘルプ',\n  'component.globalHeader.notification': '通知',\n  'component.globalHeader.notification.empty': 'すべての通知を表示しました。',\n  'component.globalHeader.message': 'メッセージ',\n  'component.globalHeader.message.empty': 'すべてのメッセージを表示しました。',\n  'component.globalHeader.event': 'イベント',\n  'component.globalHeader.event.empty': 'すべてのイベントを表示しました。',\n  'component.noticeIcon.clear': 'クリア',\n  'component.noticeIcon.cleared': 'クリア済み',\n  'component.noticeIcon.empty': '通知なし',\n  'component.noticeIcon.view-more': 'もっと見る',\n};\n"
  },
  {
    "path": "web/admin/src/locales/ja-JP/menu.js",
    "content": "export default {\n  'menu.welcome': 'ようこそ',\n  'menu.more-blocks': 'その他のブロック',\n  'menu.home': 'ホーム',\n  'menu.admin': '管理者',\n  'menu.admin.sub-page': 'サブページ',\n  'menu.login': 'ログイン',\n  'menu.register': '登録',\n  'menu.register-result': '登録結果',\n  'menu.dashboard': 'ダッシュボード',\n  'menu.dashboard.analysis': '分析',\n  'menu.dashboard.monitor': 'モニター',\n  'menu.dashboard.workplace': '職場',\n  'menu.exception.403': '403',\n  'menu.exception.404': '404',\n  'menu.exception.500': '500',\n  'menu.form': 'フォーム',\n  'menu.form.basic-form': '基本フォーム',\n  'menu.form.step-form': 'ステップフォーム',\n  'menu.form.step-form.info': 'ステップフォーム（転送情報の書き込み）',\n  'menu.form.step-form.confirm': 'ステップフォーム（転送情報の確認）',\n  'menu.form.step-form.result': 'ステップフォーム（完成）',\n  'menu.form.advanced-form': '高度なフォーム',\n  'menu.list': 'リスト',\n  'menu.list.table-list': '検索テーブル',\n  'menu.list.basic-list': '基本リスト',\n  'menu.list.card-list': 'カードリスト',\n  'menu.list.search-list': '検索リスト',\n  'menu.list.search-list.articles': '検索リスト(記事)',\n  'menu.list.search-list.projects': '検索リスト(プロジェクト)',\n  'menu.list.search-list.applications': '検索リスト(アプリ)',\n  'menu.profile': 'プロフィール',\n  'menu.profile.basic': '基本プロフィール',\n  'menu.profile.advanced': '高度なプロフィール',\n  'menu.result': '結果',\n  'menu.result.success': '成功',\n  'menu.result.fail': '失敗',\n  'menu.exception': '例外',\n  'menu.exception.not-permission': '403',\n  'menu.exception.not-find': '404',\n  'menu.exception.server-error': '500',\n  'menu.exception.trigger': 'トリガー',\n  'menu.account': 'アカウント',\n  'menu.account.center': 'アカウントセンター',\n  'menu.account.settings': 'アカウント設定',\n  'menu.account.trigger': 'トリガーエラー',\n  'menu.account.logout': 'ログアウト',\n  'menu.editor': 'グラフィックエディタ',\n  'menu.editor.flow': 'フローエディタ',\n  'menu.editor.mind': 'マインドエディター',\n  'menu.editor.koni': 'コニエディター',\n};\n"
  },
  {
    "path": "web/admin/src/locales/ja-JP/pages.js",
    "content": "export default {\n  'pages.layouts.userLayout.title': 'Ant Designは、西湖区で最も影響力のあるWebデザイン仕様です。',\n  'pages.login.accountLogin.tab': 'アカウントログイン',\n  'pages.login.accountLogin.errorMessage':\n    'ユーザー名/パスワードが正しくありません(admin/ant.design)',\n  'pages.login.username.placeholder': 'ユーザー名：adminまたはuser',\n  'pages.login.username.required': 'ユーザー名を入力してください！',\n  'pages.login.password.placeholder': 'パスワード：ant.design',\n  'pages.login.password.required': 'パスワードを入力してください！',\n  'pages.login.phoneLogin.tab': '電話ログイン',\n  'pages.login.phoneLogin.errorMessage': '検証コードエラー',\n  'pages.login.phoneNumber.placeholder': '電話番号',\n  'pages.login.phoneNumber.required': '電話番号を入力してください！',\n  'pages.login.phoneNumber.invalid': '電話番号が無効です！',\n  'pages.login.captcha.placeholder': '確認コード',\n  'pages.login.captcha.required': '確認コードを入力してください！',\n  'pages.login.phoneLogin.getVerificationCode': '確認コードを取得',\n  'pages.getCaptchaSecondText': '秒',\n  'pages.login.rememberMe': 'Remember me',\n  'pages.login.forgotPassword': 'パスワードをお忘れですか？',\n  'pages.login.submit': 'ログイン',\n  'pages.login.loginWith': 'その他のログイン方法：',\n  'pages.login.registerAccount': 'アカウント登録',\n  'pages.welcome.advancedComponent': '高度なコンポーネント',\n  'pages.welcome.link': 'ようこそ',\n  'pages.welcome.advancedLayout': '高度なレイアウト',\n  'pages.welcome.alertMessage': 'より高速で強力な頑丈なコンポーネントがリリースされました。',\n  'pages.admin.subPage.title': 'このページは管理者のみが表示できます',\n  'pages.admin.subPage.alertMessage':\n    'Umi uiがリリースされました。npm run uiを使用して体験してください。',\n  'pages.searchTable.createForm.newRule': '新しいルール',\n  'pages.searchTable.updateForm.ruleConfig': 'ルール構成',\n  'pages.searchTable.updateForm.basicConfig': '基本情報',\n  'pages.searchTable.updateForm.ruleName.nameLabel': 'ルール名',\n  'pages.searchTable.updateForm.ruleName.nameRules': 'ルール名を入力してください！',\n  'pages.searchTable.updateForm.ruleDesc.descLabel': 'ルールの説明',\n  'pages.searchTable.updateForm.ruleDesc.descPlaceholder': '5文字以上入力してください',\n  'pages.searchTable.updateForm.ruleDesc.descRules': '5文字以上のルールの説明を入力してください！',\n  'pages.searchTable.updateForm.ruleProps.title': 'プロパティの構成',\n  'pages.searchTable.updateForm.object': '監視対象',\n  'pages.searchTable.updateForm.ruleProps.templateLabel': 'ルールテンプレート',\n  'pages.searchTable.updateForm.ruleProps.typeLabel': 'ルールタイプ',\n  'pages.searchTable.updateForm.schedulingPeriod.title': 'スケジュール期間の設定',\n  'pages.searchTable.updateForm.schedulingPeriod.timeLabel': '開始時間',\n  'pages.searchTable.updateForm.schedulingPeriod.timeRules': '開始時間を選択してください！',\n  'pages.searchTable.titleDesc': '説明',\n  'pages.searchTable.ruleName': 'ルール名が必要です',\n  'pages.searchTable.titleCallNo': 'サービスコール数',\n  'pages.searchTable.titleStatus': 'ステータス',\n  'pages.searchTable.nameStatus.default': 'デフォルト',\n  'pages.searchTable.nameStatus.running': '起動中',\n  'pages.searchTable.nameStatus.online': 'オンライン',\n  'pages.searchTable.nameStatus.abnormal': '異常',\n  'pages.searchTable.titleUpdatedAt': '最終スケジュール',\n  'pages.searchTable.exception': '例外の理由を入力してください！',\n  'pages.searchTable.titleOption': 'オプション',\n  'pages.searchTable.config': '構成',\n  'pages.searchTable.subscribeAlert': 'アラートを購読する',\n  'pages.searchTable.title': 'お問い合わせフォーム',\n  'pages.searchTable.new': '新しい',\n  'pages.searchTable.chosen': '選んだ項目',\n  'pages.searchTable.item': '項目',\n  'pages.searchTable.totalServiceCalls': 'サービスコールの総数',\n  'pages.searchTable.tenThousand': '万',\n  'pages.searchTable.batchDeletion': 'バッチ削除',\n  'pages.searchTable.batchApproval': 'バッチ承認',\n};\n"
  },
  {
    "path": "web/admin/src/locales/ja-JP/pwa.js",
    "content": "export default {\n  'app.pwa.offline': 'あなたは今オフラインです',\n  'app.pwa.serviceworker.updated': '新しいコンテンツが利用可能です',\n  'app.pwa.serviceworker.updated.hint':\n    '現在のページをリロードするには、「更新」ボタンを押してください',\n  'app.pwa.serviceworker.updated.ok': 'リフレッシュ',\n};\n"
  },
  {
    "path": "web/admin/src/locales/ja-JP/settingDrawer.js",
    "content": "export default {\n  'app.setting.pagestyle': 'ページスタイル設定',\n  'app.setting.pagestyle.dark': 'ダークスタイル',\n  'app.setting.pagestyle.light': 'ライトスタイル',\n  'app.setting.content-width': 'コンテンツの幅',\n  'app.setting.content-width.fixed': '固定',\n  'app.setting.content-width.fluid': '流体',\n  'app.setting.themecolor': 'テーマカラー',\n  'app.setting.themecolor.dust': 'ダストレッド',\n  'app.setting.themecolor.volcano': 'ボルケ-ノ',\n  'app.setting.themecolor.sunset': 'サンセットオレンジ',\n  'app.setting.themecolor.cyan': 'シアン',\n  'app.setting.themecolor.green': 'ポーラーグリーン',\n  'app.setting.themecolor.daybreak': '夜明けの青（デフォルト）',\n  'app.setting.themecolor.geekblue': 'ギーク ブルー',\n  'app.setting.themecolor.purple': 'ゴールデンパープル',\n  'app.setting.navigationmode': 'ナビゲーションモード',\n  'app.setting.sidemenu': 'サイドメニューのレイアウト',\n  'app.setting.topmenu': 'トップメニューのレイアウト',\n  'app.setting.fixedheader': '固定ヘッダー',\n  'app.setting.fixedsidebar': '固定サイドバー',\n  'app.setting.fixedsidebar.hint': 'サイドメニューのレイアウトで動作します',\n  'app.setting.hideheader': 'スクロール時の非表示ヘッダー',\n  'app.setting.hideheader.hint': '非表示ヘッダーが有効になっている場合に機能します',\n  'app.setting.othersettings': 'その他の設定',\n  'app.setting.weakmode': 'ウィークモード',\n  'app.setting.copy': 'コピー設定',\n  'app.setting.copyinfo':\n    'コピーが成功しました。src/models/setting.jsのdefaultSettingsを置き換えてください',\n  'app.setting.production.hint': '設定パネルは開発環境でのみ表示されます。手動で変更してください',\n};\n"
  },
  {
    "path": "web/admin/src/locales/ja-JP/settings.js",
    "content": "export default {\n  'app.settings.menuMap.basic': '基本設定',\n  'app.settings.menuMap.security': 'セキュリティ設定',\n  'app.settings.menuMap.binding': 'アカウントのバインド',\n  'app.settings.menuMap.notification': '新しいメッセージの通知',\n  'app.settings.basic.avatar': 'アバター',\n  'app.settings.basic.change-avatar': 'アバターを変更する',\n  'app.settings.basic.email': 'メール',\n  'app.settings.basic.email-message': 'メールアドレスを入力してください！',\n  'app.settings.basic.nickname': 'ニックネーム',\n  'app.settings.basic.nickname-message': 'ニックネームを入力してください！',\n  'app.settings.basic.profile': '個人プロフィール',\n  'app.settings.basic.profile-message': '個人プロフィールを入力してください!',\n  'app.settings.basic.profile-placeholder': '自己紹介',\n  'app.settings.basic.country': '国/地域',\n  'app.settings.basic.country-message': 'あなたの国を入力してください!',\n  'app.settings.basic.geographic': '州または市',\n  'app.settings.basic.geographic-message': '地理情報を入力してください!',\n  'app.settings.basic.address': '住所',\n  'app.settings.basic.address-message': '住所を入力してください!',\n  'app.settings.basic.phone': '電話番号',\n  'app.settings.basic.phone-message': '電話番号を入力してください!',\n  'app.settings.basic.update': '更新情報',\n  'app.settings.security.strong': '強い',\n  'app.settings.security.medium': 'ミディアム',\n  'app.settings.security.weak': '弱い',\n  'app.settings.security.password': 'アカウントパスワード',\n  'app.settings.security.password-description': '現在のパスワードの強度',\n  'app.settings.security.phone': 'セキュリティ電話番号',\n  'app.settings.security.phone-description': 'バインドされた電話番号',\n  'app.settings.security.question': '秘密の質問',\n  'app.settings.security.question-description':\n    'セキュリティの質問が設定されてません。セキュリティポリシーはアカウントのセキュリティを効果的に保護できます',\n  'app.settings.security.email': 'バックアップメール',\n  'app.settings.security.email-description': 'バインドされたメール',\n  'app.settings.security.mfa': '多要素認証デバイス',\n  'app.settings.security.mfa-description':\n    'バインドされていない多要素認証デバイスは、バインド後、2回確認できます',\n  'app.settings.security.modify': '変更する',\n  'app.settings.security.set': 'セットする',\n  'app.settings.security.bind': 'バインド',\n  'app.settings.binding.taobao': 'タオバオをバインドする',\n  'app.settings.binding.taobao-description': '現在バインドされていないタオバオアカウント',\n  'app.settings.binding.alipay': 'アリペイをバインドする',\n  'app.settings.binding.alipay-description': '現在バインドされていないアリペイアカウント',\n  'app.settings.binding.dingding': 'ディントークをバインドする',\n  'app.settings.binding.dingding-description': '現在バインドされていないディントークアカウント',\n  'app.settings.binding.bind': 'バインド',\n  'app.settings.notification.password': 'アカウントパスワード',\n  'app.settings.notification.password-description':\n    '他のユーザーからのメッセージは、ステーションレターの形式で通知されます',\n  'app.settings.notification.messages': 'システムメッセージ',\n  'app.settings.notification.messages-description':\n    'システムメッセージは、ステーションレターの形式で通知されます',\n  'app.settings.notification.todo': 'To Do（用事) 通知',\n  'app.settings.notification.todo-description': 'To Doタスクは、内部レターの形式で通知されます',\n  'app.settings.open': '開く',\n  'app.settings.close': '閉じる',\n};\n"
  },
  {
    "path": "web/admin/src/locales/ja-JP.js",
    "content": "import globalHeader from './ja-JP/globalHeader';\nimport menu from './ja-JP/menu';\nimport settingDrawer from './ja-JP/settingDrawer';\nimport settings from './ja-JP/settings';\nimport pwa from './ja-JP/pwa';\nimport component from './ja-JP/component';\nimport pages from './ja-JP/pages';\nexport default {\n  'navBar.lang': '言語',\n  'layout.user.link.help': 'ヘルプ',\n  'layout.user.link.privacy': 'プライバシー',\n  'layout.user.link.terms': '利用規約',\n  'app.preview.down.block': 'このページをローカルプロジェクトにダウンロードしてください',\n  'app.welcome.link.fetch-blocks': '',\n  'app.welcome.link.block-list': '',\n  ...globalHeader,\n  ...menu,\n  ...settingDrawer,\n  ...settings,\n  ...pwa,\n  ...component,\n  ...pages,\n};\n"
  },
  {
    "path": "web/admin/src/locales/pt-BR/component.js",
    "content": "export default {\n  'component.tagSelect.expand': 'Expandir',\n  'component.tagSelect.collapse': 'Diminuir',\n  'component.tagSelect.all': 'Todas',\n};\n"
  },
  {
    "path": "web/admin/src/locales/pt-BR/globalHeader.js",
    "content": "export default {\n  'component.globalHeader.search': 'Busca',\n  'component.globalHeader.search.example1': 'Exemplo de busca 1',\n  'component.globalHeader.search.example2': 'Exemplo de busca 2',\n  'component.globalHeader.search.example3': 'Exemplo de busca 3',\n  'component.globalHeader.help': 'Ajuda',\n  'component.globalHeader.notification': 'Notificação',\n  'component.globalHeader.notification.empty': 'Você visualizou todas as notificações.',\n  'component.globalHeader.message': 'Mensagem',\n  'component.globalHeader.message.empty': 'Você visualizou todas as mensagens.',\n  'component.globalHeader.event': 'Evento',\n  'component.globalHeader.event.empty': 'Você visualizou todos os eventos.',\n  'component.noticeIcon.clear': 'Limpar',\n  'component.noticeIcon.cleared': 'Limpo',\n  'component.noticeIcon.empty': 'Sem notificações',\n  'component.noticeIcon.loaded': 'Carregado',\n  'component.noticeIcon.view-more': 'Veja mais',\n};\n"
  },
  {
    "path": "web/admin/src/locales/pt-BR/menu.js",
    "content": "export default {\n  'menu.welcome': 'Welcome',\n  'menu.more-blocks': 'More Blocks',\n  'menu.home': 'Início',\n  'menu.login': 'Login',\n  'menu.admin': 'Admin',\n  'menu.admin.sub-page': 'Sub-Page',\n  'menu.register': 'Registro',\n  'menu.register-result': 'Resultado de registro',\n  'menu.dashboard': 'Dashboard',\n  'menu.dashboard.analysis': 'Análise',\n  'menu.dashboard.monitor': 'Monitor',\n  'menu.dashboard.workplace': 'Ambiente de Trabalho',\n  'menu.exception.403': '403',\n  'menu.exception.404': '404',\n  'menu.exception.500': '500',\n  'menu.form': 'Formulário',\n  'menu.form.basic-form': 'Formulário Básico',\n  'menu.form.step-form': 'Formulário Assistido',\n  'menu.form.step-form.info': 'Formulário Assistido(gravar informações de transferência)',\n  'menu.form.step-form.confirm': 'Formulário Assistido(confirmar informações de transferência)',\n  'menu.form.step-form.result': 'Formulário Assistido(finalizado)',\n  'menu.form.advanced-form': 'Formulário Avançado',\n  'menu.list': 'Lista',\n  'menu.list.table-list': 'Tabela de Busca',\n  'menu.list.basic-list': 'Lista Básica',\n  'menu.list.card-list': 'Lista de Card',\n  'menu.list.search-list': 'Lista de Busca',\n  'menu.list.search-list.articles': 'Lista de Busca(artigos)',\n  'menu.list.search-list.projects': 'Lista de Busca(projetos)',\n  'menu.list.search-list.applications': 'Lista de Busca(aplicações)',\n  'menu.profile': 'Perfil',\n  'menu.profile.basic': 'Perfil Básico',\n  'menu.profile.advanced': 'Perfil Avançado',\n  'menu.result': 'Resultado',\n  'menu.result.success': 'Sucesso',\n  'menu.result.fail': 'Falha',\n  'menu.exception': 'Exceção',\n  'menu.exception.not-permission': '403',\n  'menu.exception.not-find': '404',\n  'menu.exception.server-error': '500',\n  'menu.exception.trigger': 'Disparar',\n  'menu.account': 'Conta',\n  'menu.account.center': 'Central da Conta',\n  'menu.account.settings': 'Configurar Conta',\n  'menu.account.trigger': 'Disparar Erro',\n  'menu.account.logout': 'Sair',\n  'menu.editor': 'Graphic Editor',\n  'menu.editor.flow': 'Flow Editor',\n  'menu.editor.mind': 'Mind Editor',\n  'menu.editor.koni': 'Koni Editor',\n};\n"
  },
  {
    "path": "web/admin/src/locales/pt-BR/pages.js",
    "content": "export default {\n  'pages.layouts.userLayout.title':\n    'Ant Design é a especificação de web design mais influente no distrito de Xihu',\n  'pages.login.accountLogin.tab': 'Login da conta',\n  'pages.login.accountLogin.errorMessage': 'usuário/senha incorreto(admin/ant.design)',\n  'pages.login.username.placeholder': 'Usuário: admin or user',\n  'pages.login.username.required': 'Por favor insira seu usuário!',\n  'pages.login.password.placeholder': 'Senha: ant.design',\n  'pages.login.password.required': 'Por favor insira sua senha!',\n  'pages.login.phoneLogin.tab': 'Login com Telefone',\n  'pages.login.phoneLogin.errorMessage': 'Erro de Código de Verificação',\n  'pages.login.phoneNumber.placeholder': 'Telefone',\n  'pages.login.phoneNumber.required': 'Por favor entre com seu telefone!',\n  'pages.login.phoneNumber.invalid': 'Telefone é inválido!',\n  'pages.login.captcha.placeholder': 'Código de Verificação',\n  'pages.login.captcha.required': 'Por favor entre com o código de verificação!',\n  'pages.login.phoneLogin.getVerificationCode': 'Obter Código',\n  'pages.getCaptchaSecondText': 'seg(s)',\n  'pages.login.rememberMe': 'Lembre-me',\n  'pages.login.forgotPassword': 'Perdeu a Senha ?',\n  'pages.login.submit': 'Enviar',\n  'pages.login.loginWith': 'Login com :',\n  'pages.login.registerAccount': 'Registra Conta',\n  'pages.welcome.advancedComponent': 'Componente Avançado',\n  'pages.welcome.link': 'Bem-vindo',\n  'pages.welcome.advancedLayout': 'Layout Avançado',\n  'pages.welcome.alertMessage': 'Componentes pesados mais rápidos e mais fortes foram lançados.',\n  'pages.admin.subPage.title': 'Esta página só pode ser vista pelo Admin',\n  'pages.admin.subPage.alertMessage':\n    'O Umi ui foi lançado, bem-vindo ao usar o npm run ui para iniciar a experiência.',\n  'pages.searchTable.createForm.newRule': 'Neva Regra',\n  'pages.searchTable.updateForm.ruleConfig': 'Configuração de Regra',\n  'pages.searchTable.updateForm.basicConfig': 'Informação básica',\n  'pages.searchTable.updateForm.ruleName.nameLabel': 'Nome da Regra',\n  'pages.searchTable.updateForm.ruleName.nameRules': 'Por favor entre com o nome da regra!',\n  'pages.searchTable.updateForm.ruleDesc.descLabel': 'Descrição da Regra',\n  'pages.searchTable.updateForm.ruleDesc.descPlaceholder':\n    'Por favor insira ao menos cinco caracteres',\n  'pages.searchTable.updateForm.ruleDesc.descRules':\n    'Insira uma descrição de regra de pelo menos cinco caracteres!',\n  'pages.searchTable.updateForm.ruleProps.title': 'Configurar Propriedades',\n  'pages.searchTable.updateForm.object': 'Objeto de Monitoramento',\n  'pages.searchTable.updateForm.ruleProps.templateLabel': 'Modelo de Regra',\n  'pages.searchTable.updateForm.ruleProps.typeLabel': 'Tipo de Regra',\n  'pages.searchTable.updateForm.schedulingPeriod.title': 'Definir Período de Agendamento',\n  'pages.searchTable.updateForm.schedulingPeriod.timeLabel': 'Hora de Início',\n  'pages.searchTable.updateForm.schedulingPeriod.timeRules':\n    'Por favor selecione um horáriod e início!',\n  'pages.searchTable.titleDesc': 'Descrição',\n  'pages.searchTable.ruleName': 'O nome da regra é obrigatório',\n  'pages.searchTable.titleCallNo': 'Número de chamadas de serviço',\n  'pages.searchTable.titleStatus': 'Status',\n  'pages.searchTable.nameStatus.default': 'padrão',\n  'pages.searchTable.nameStatus.running': 'executando',\n  'pages.searchTable.nameStatus.online': 'online',\n  'pages.searchTable.nameStatus.abnormal': 'anormal',\n  'pages.searchTable.titleUpdatedAt': 'Última programação em',\n  'pages.searchTable.exception': 'Por favor, indique o motivo da exceção!',\n  'pages.searchTable.titleOption': 'Opção',\n  'pages.searchTable.config': 'Configuração',\n  'pages.searchTable.subscribeAlert': 'Inscreva-se para receber alertas',\n  'pages.searchTable.title': 'Formulário de Consulta',\n  'pages.searchTable.new': 'Novo',\n  'pages.searchTable.chosen': 'selecionado',\n  'pages.searchTable.item': 'item',\n  'pages.searchTable.totalServiceCalls': 'Número total de chamadas de serviço',\n  'pages.searchTable.tenThousand': '0000',\n  'pages.searchTable.batchDeletion': 'deleção em lote',\n  'pages.searchTable.batchApproval': 'aprovação em lote',\n};\n"
  },
  {
    "path": "web/admin/src/locales/pt-BR/pwa.js",
    "content": "export default {\n  'app.pwa.offline': 'Você está offline agora',\n  'app.pwa.serviceworker.updated': 'Novo conteúdo está disponível',\n  'app.pwa.serviceworker.updated.hint':\n    'Por favor, pressione o botão \"Atualizar\" para recarregar a página atual',\n  'app.pwa.serviceworker.updated.ok': 'Atualizar',\n};\n"
  },
  {
    "path": "web/admin/src/locales/pt-BR/settingDrawer.js",
    "content": "export default {\n  'app.setting.pagestyle': 'Configuração de estilo da página',\n  'app.setting.pagestyle.dark': 'Dark style',\n  'app.setting.pagestyle.light': 'Light style',\n  'app.setting.content-width': 'Largura do conteúdo',\n  'app.setting.content-width.fixed': 'Fixo',\n  'app.setting.content-width.fluid': 'Fluido',\n  'app.setting.themecolor': 'Cor do Tema',\n  'app.setting.themecolor.dust': 'Dust Red',\n  'app.setting.themecolor.volcano': 'Volcano',\n  'app.setting.themecolor.sunset': 'Sunset Orange',\n  'app.setting.themecolor.cyan': 'Cyan',\n  'app.setting.themecolor.green': 'Polar Green',\n  'app.setting.themecolor.daybreak': 'Daybreak Blue (default)',\n  'app.setting.themecolor.geekblue': 'Geek Glue',\n  'app.setting.themecolor.purple': 'Golden Purple',\n  'app.setting.navigationmode': 'Modo de Navegação',\n  'app.setting.sidemenu': 'Layout do Menu Lateral',\n  'app.setting.topmenu': 'Layout do Menu Superior',\n  'app.setting.fixedheader': 'Cabeçalho fixo',\n  'app.setting.fixedsidebar': 'Barra lateral fixa',\n  'app.setting.fixedsidebar.hint': 'Funciona no layout do menu lateral',\n  'app.setting.hideheader': 'Esconder o cabeçalho quando rolar',\n  'app.setting.hideheader.hint': 'Funciona quando o esconder cabeçalho está abilitado',\n  'app.setting.othersettings': 'Outras configurações',\n  'app.setting.weakmode': 'Weak Mode',\n  'app.setting.copy': 'Copiar Configuração',\n  'app.setting.copyinfo':\n    'copiado com sucesso，por favor trocar o defaultSettings em src/models/setting.js',\n  'app.setting.production.hint':\n    'O painel de configuração apenas é exibido no ambiente de desenvolvimento, por favor modifique manualmente o',\n};\n"
  },
  {
    "path": "web/admin/src/locales/pt-BR/settings.js",
    "content": "export default {\n  'app.settings.menuMap.basic': 'Configurações Básicas',\n  'app.settings.menuMap.security': 'Configurações de Segurança',\n  'app.settings.menuMap.binding': 'Vinculação de Conta',\n  'app.settings.menuMap.notification': 'Mensagens de Notificação',\n  'app.settings.basic.avatar': 'Avatar',\n  'app.settings.basic.change-avatar': 'Alterar avatar',\n  'app.settings.basic.email': 'Email',\n  'app.settings.basic.email-message': 'Por favor insira seu email!',\n  'app.settings.basic.nickname': 'Nome de usuário',\n  'app.settings.basic.nickname-message': 'Por favor insira seu nome de usuário!',\n  'app.settings.basic.profile': 'Perfil pessoal',\n  'app.settings.basic.profile-message': 'Por favor insira seu perfil pessoal!',\n  'app.settings.basic.profile-placeholder': 'Breve introdução sua',\n  'app.settings.basic.country': 'País/Região',\n  'app.settings.basic.country-message': 'Por favor insira país!',\n  'app.settings.basic.geographic': 'Província, estado ou cidade',\n  'app.settings.basic.geographic-message': 'Por favor insira suas informações geográficas!',\n  'app.settings.basic.address': 'Endereço',\n  'app.settings.basic.address-message': 'Por favor insira seu endereço!',\n  'app.settings.basic.phone': 'Número de telefone',\n  'app.settings.basic.phone-message': 'Por favor insira seu número de telefone!',\n  'app.settings.basic.update': 'Atualizar Informações',\n  'app.settings.security.strong': 'Forte',\n  'app.settings.security.medium': 'Média',\n  'app.settings.security.weak': 'Fraca',\n  'app.settings.security.password': 'Senha da Conta',\n  'app.settings.security.password-description': 'Força da senha',\n  'app.settings.security.phone': 'Telefone de Seguraça',\n  'app.settings.security.phone-description': 'Telefone vinculado',\n  'app.settings.security.question': 'Pergunta de Segurança',\n  'app.settings.security.question-description':\n    'A pergunta de segurança não está definida e a política de segurança pode proteger efetivamente a segurança da conta',\n  'app.settings.security.email': 'Email de Backup',\n  'app.settings.security.email-description': 'Email vinculado',\n  'app.settings.security.mfa': 'Dispositivo MFA',\n  'app.settings.security.mfa-description':\n    'O dispositivo MFA não vinculado, após a vinculação, pode ser confirmado duas vezes',\n  'app.settings.security.modify': 'Modificar',\n  'app.settings.security.set': 'Atribuir',\n  'app.settings.security.bind': 'Vincular',\n  'app.settings.binding.taobao': 'Vincular Taobao',\n  'app.settings.binding.taobao-description': 'Atualmente não vinculado à conta Taobao',\n  'app.settings.binding.alipay': 'Vincular Alipay',\n  'app.settings.binding.alipay-description': 'Atualmente não vinculado à conta Alipay',\n  'app.settings.binding.dingding': 'Vincular DingTalk',\n  'app.settings.binding.dingding-description': 'Atualmente não vinculado à conta DingTalk',\n  'app.settings.binding.bind': 'Vincular',\n  'app.settings.notification.password': 'Senha da Conta',\n  'app.settings.notification.password-description':\n    'Mensagens de outros usuários serão notificadas na forma de uma estação de letra',\n  'app.settings.notification.messages': 'Mensagens de Sistema',\n  'app.settings.notification.messages-description':\n    'Mensagens de sistema serão notificadas na forma de uma estação de letra',\n  'app.settings.notification.todo': 'Notificação de To-do',\n  'app.settings.notification.todo-description':\n    'A lista de to-do será notificada na forma de uma estação de letra',\n  'app.settings.open': 'Aberto',\n  'app.settings.close': 'Fechado',\n};\n"
  },
  {
    "path": "web/admin/src/locales/pt-BR.js",
    "content": "import component from './pt-BR/component';\nimport globalHeader from './pt-BR/globalHeader';\nimport menu from './pt-BR/menu';\nimport pwa from './pt-BR/pwa';\nimport settingDrawer from './pt-BR/settingDrawer';\nimport settings from './pt-BR/settings';\nimport pages from './pt-BR/pages';\nexport default {\n  'navBar.lang': 'Idiomas',\n  'layout.user.link.help': 'ajuda',\n  'layout.user.link.privacy': 'política de privacidade',\n  'layout.user.link.terms': 'termos de serviços',\n  'app.preview.down.block': 'Download this page to your local project',\n  ...globalHeader,\n  ...menu,\n  ...settingDrawer,\n  ...settings,\n  ...pwa,\n  ...component,\n  ...pages,\n};\n"
  },
  {
    "path": "web/admin/src/locales/zh-CN/component.js",
    "content": "export default {\n  'component.tagSelect.expand': '展开',\n  'component.tagSelect.collapse': '收起',\n  'component.tagSelect.all': '全部',\n};\n"
  },
  {
    "path": "web/admin/src/locales/zh-CN/globalHeader.js",
    "content": "export default {\n  'component.globalHeader.search': '站内搜索',\n  'component.globalHeader.search.example1': '搜索提示一',\n  'component.globalHeader.search.example2': '搜索提示二',\n  'component.globalHeader.search.example3': '搜索提示三',\n  'component.globalHeader.help': '使用文档',\n  'component.globalHeader.notification': '通知',\n  'component.globalHeader.notification.empty': '你已查看所有通知',\n  'component.globalHeader.message': '消息',\n  'component.globalHeader.message.empty': '您已读完所有消息',\n  'component.globalHeader.event': '待办',\n  'component.globalHeader.event.empty': '你已完成所有待办',\n  'component.noticeIcon.clear': '清空',\n  'component.noticeIcon.cleared': '清空了',\n  'component.noticeIcon.empty': '暂无数据',\n  'component.noticeIcon.view-more': '查看更多',\n};\n"
  },
  {
    "path": "web/admin/src/locales/zh-CN/menu.js",
    "content": "export default {\n  'menu.welcome': '欢迎',\n  'menu.more-blocks': '更多区块',\n  'menu.home': '首页',\n  'menu.admin': '管理页',\n  'menu.admin.sub-page': '二级管理页',\n  'menu.login': '登录',\n  'menu.register': '注册',\n  'menu.register-result': '注册结果',\n  'menu.dashboard': 'Dashboard',\n  'menu.dashboard.analysis': '分析页',\n  'menu.dashboard.monitor': '监控页',\n  'menu.dashboard.workplace': '工作台',\n  'menu.exception.403': '403',\n  'menu.exception.404': '404',\n  'menu.exception.500': '500',\n  'menu.form': '表单页',\n  'menu.form.basic-form': '基础表单',\n  'menu.form.step-form': '分步表单',\n  'menu.form.step-form.info': '分步表单（填写转账信息）',\n  'menu.form.step-form.confirm': '分步表单（确认转账信息）',\n  'menu.form.step-form.result': '分步表单（完成）',\n  'menu.form.advanced-form': '高级表单',\n  'menu.list': '列表页',\n  'menu.list.table-list': '查询表格',\n  'menu.list.basic-list': '标准列表',\n  'menu.list.card-list': '卡片列表',\n  'menu.list.search-list': '搜索列表',\n  'menu.list.search-list.articles': '搜索列表（文章）',\n  'menu.list.search-list.projects': '搜索列表（项目）',\n  'menu.list.search-list.applications': '搜索列表（应用）',\n  'menu.profile': '详情页',\n  'menu.profile.basic': '基础详情页',\n  'menu.profile.advanced': '高级详情页',\n  'menu.result': '结果页',\n  'menu.result.success': '成功页',\n  'menu.result.fail': '失败页',\n  'menu.exception': '异常页',\n  'menu.exception.not-permission': '403',\n  'menu.exception.not-find': '404',\n  'menu.exception.server-error': '500',\n  'menu.exception.trigger': '触发错误',\n  'menu.account': '个人页',\n  'menu.account.center': '个人中心',\n  'menu.account.settings': '个人设置',\n  'menu.account.trigger': '触发报错',\n  'menu.account.logout': '退出登录',\n  'menu.editor': '图形编辑器',\n  'menu.editor.flow': '流程编辑器',\n  'menu.editor.mind': '脑图编辑器',\n  'menu.editor.koni': '拓扑编辑器',\n};\n"
  },
  {
    "path": "web/admin/src/locales/zh-CN/pages.js",
    "content": "export default {\n  'pages.layouts.userLayout.title': 'Ant Design 是西湖区最具影响力的 Web 设计规范',\n  'pages.login.accountLogin.tab': '账户密码登录',\n  'pages.login.accountLogin.errorMessage': '错误的用户名和密码(admin/ant.design)',\n  'pages.login.failure': '登录失败，请重试！',\n  'pages.login.success': '登录成功！',\n  'pages.login.username.placeholder': '用户名: admin or user',\n  'pages.login.username.required': '用户名是必填项！',\n  'pages.login.password.placeholder': '密码: ant.design',\n  'pages.login.password.required': '密码是必填项！',\n  'pages.login.phoneLogin.tab': '手机号登录',\n  'pages.login.phoneLogin.errorMessage': '验证码错误',\n  'pages.login.phoneNumber.placeholder': '请输入手机号！',\n  'pages.login.phoneNumber.required': '手机号是必填项！',\n  'pages.login.phoneNumber.invalid': '不合法的手机号！',\n  'pages.login.captcha.placeholder': '请输入验证码！',\n  'pages.login.captcha.required': '验证码是必填项！',\n  'pages.login.phoneLogin.getVerificationCode': '获取验证码',\n  'pages.getCaptchaSecondText': '秒后重新获取',\n  'pages.login.rememberMe': '自动登录',\n  'pages.login.forgotPassword': '忘记密码 ?',\n  'pages.login.submit': '登录',\n  'pages.login.loginWith': '其他登录方式 :',\n  'pages.login.registerAccount': '注册账户',\n  'pages.welcome.advancedComponent': '高级表格',\n  'pages.welcome.link': '欢迎使用',\n  'pages.welcome.advancedLayout': '高级布局',\n  'pages.welcome.alertMessage': '更快更强的重型组件，已经发布。',\n  'pages.admin.subPage.title': ' 这个页面只有 admin 权限才能查看',\n  'pages.admin.subPage.alertMessage': 'umi ui 现已发布，欢迎使用 npm run ui 启动体验。',\n  'pages.searchTable.createForm.newRule': '新建规则',\n  'pages.searchTable.updateForm.ruleConfig': '规则配置',\n  'pages.searchTable.updateForm.basicConfig': '基本信息',\n  'pages.searchTable.updateForm.ruleName.nameLabel': '规则名称',\n  'pages.searchTable.updateForm.ruleName.nameRules': '请输入规则名称！',\n  'pages.searchTable.updateForm.ruleDesc.descLabel': '规则描述',\n  'pages.searchTable.updateForm.ruleDesc.descPlaceholder': '请输入至少五个字符',\n  'pages.searchTable.updateForm.ruleDesc.descRules': '请输入至少五个字符的规则描述！',\n  'pages.searchTable.updateForm.ruleProps.title': '配置规则属性',\n  'pages.searchTable.updateForm.object': '监控对象',\n  'pages.searchTable.updateForm.ruleProps.templateLabel': '规则模板',\n  'pages.searchTable.updateForm.ruleProps.typeLabel': '规则类型',\n  'pages.searchTable.updateForm.schedulingPeriod.title': '设定调度周期',\n  'pages.searchTable.updateForm.schedulingPeriod.timeLabel': '开始时间',\n  'pages.searchTable.updateForm.schedulingPeriod.timeRules': '请选择开始时间！',\n  'pages.searchTable.titleDesc': '描述',\n  'pages.searchTable.ruleName': '规则名称为必填项',\n  'pages.searchTable.titleCallNo': '服务调用次数',\n  'pages.searchTable.titleStatus': '状态',\n  'pages.searchTable.nameStatus.default': '关闭',\n  'pages.searchTable.nameStatus.running': '运行中',\n  'pages.searchTable.nameStatus.online': '已上线',\n  'pages.searchTable.nameStatus.abnormal': '异常',\n  'pages.searchTable.titleUpdatedAt': '上次调度时间',\n  'pages.searchTable.exception': '请输入异常原因！',\n  'pages.searchTable.titleOption': '操作',\n  'pages.searchTable.config': '配置',\n  'pages.searchTable.subscribeAlert': '订阅警报',\n  'pages.searchTable.title': '查询表格',\n  'pages.searchTable.new': '新建',\n  'pages.searchTable.chosen': '已选择',\n  'pages.searchTable.item': '项',\n  'pages.searchTable.totalServiceCalls': '服务调用次数总计',\n  'pages.searchTable.tenThousand': '万',\n  'pages.searchTable.batchDeletion': '批量删除',\n  'pages.searchTable.batchApproval': '批量审批',\n};\n"
  },
  {
    "path": "web/admin/src/locales/zh-CN/pwa.js",
    "content": "export default {\n  'app.pwa.offline': '当前处于离线状态',\n  'app.pwa.serviceworker.updated': '有新内容',\n  'app.pwa.serviceworker.updated.hint': '请点击“刷新”按钮或者手动刷新页面',\n  'app.pwa.serviceworker.updated.ok': '刷新',\n};\n"
  },
  {
    "path": "web/admin/src/locales/zh-CN/settingDrawer.js",
    "content": "export default {\n  'app.setting.pagestyle': '整体风格设置',\n  'app.setting.pagestyle.dark': '暗色菜单风格',\n  'app.setting.pagestyle.light': '亮色菜单风格',\n  'app.setting.content-width': '内容区域宽度',\n  'app.setting.content-width.fixed': '定宽',\n  'app.setting.content-width.fluid': '流式',\n  'app.setting.themecolor': '主题色',\n  'app.setting.themecolor.dust': '薄暮',\n  'app.setting.themecolor.volcano': '火山',\n  'app.setting.themecolor.sunset': '日暮',\n  'app.setting.themecolor.cyan': '明青',\n  'app.setting.themecolor.green': '极光绿',\n  'app.setting.themecolor.daybreak': '拂晓蓝（默认）',\n  'app.setting.themecolor.geekblue': '极客蓝',\n  'app.setting.themecolor.purple': '酱紫',\n  'app.setting.navigationmode': '导航模式',\n  'app.setting.sidemenu': '侧边菜单布局',\n  'app.setting.topmenu': '顶部菜单布局',\n  'app.setting.fixedheader': '固定 Header',\n  'app.setting.fixedsidebar': '固定侧边菜单',\n  'app.setting.fixedsidebar.hint': '侧边菜单布局时可配置',\n  'app.setting.hideheader': '下滑时隐藏 Header',\n  'app.setting.hideheader.hint': '固定 Header 时可配置',\n  'app.setting.othersettings': '其他设置',\n  'app.setting.weakmode': '色弱模式',\n  'app.setting.copy': '拷贝设置',\n  'app.setting.copyinfo': '拷贝成功，请到 config/defaultSettings.js 中替换默认配置',\n  'app.setting.production.hint':\n    '配置栏只在开发环境用于预览，生产环境不会展现，请拷贝后手动修改配置文件',\n};\n"
  },
  {
    "path": "web/admin/src/locales/zh-CN/settings.js",
    "content": "export default {\n  'app.settings.menuMap.basic': '基本设置',\n  'app.settings.menuMap.security': '安全设置',\n  'app.settings.menuMap.binding': '账号绑定',\n  'app.settings.menuMap.notification': '新消息通知',\n  'app.settings.basic.avatar': '头像',\n  'app.settings.basic.change-avatar': '更换头像',\n  'app.settings.basic.email': '邮箱',\n  'app.settings.basic.email-message': '请输入您的邮箱!',\n  'app.settings.basic.nickname': '昵称',\n  'app.settings.basic.nickname-message': '请输入您的昵称!',\n  'app.settings.basic.profile': '个人简介',\n  'app.settings.basic.profile-message': '请输入个人简介!',\n  'app.settings.basic.profile-placeholder': '个人简介',\n  'app.settings.basic.country': '国家/地区',\n  'app.settings.basic.country-message': '请输入您的国家或地区!',\n  'app.settings.basic.geographic': '所在省市',\n  'app.settings.basic.geographic-message': '请输入您的所在省市!',\n  'app.settings.basic.address': '街道地址',\n  'app.settings.basic.address-message': '请输入您的街道地址!',\n  'app.settings.basic.phone': '联系电话',\n  'app.settings.basic.phone-message': '请输入您的联系电话!',\n  'app.settings.basic.update': '更新基本信息',\n  'app.settings.security.strong': '强',\n  'app.settings.security.medium': '中',\n  'app.settings.security.weak': '弱',\n  'app.settings.security.password': '账户密码',\n  'app.settings.security.password-description': '当前密码强度',\n  'app.settings.security.phone': '密保手机',\n  'app.settings.security.phone-description': '已绑定手机',\n  'app.settings.security.question': '密保问题',\n  'app.settings.security.question-description': '未设置密保问题，密保问题可有效保护账户安全',\n  'app.settings.security.email': '备用邮箱',\n  'app.settings.security.email-description': '已绑定邮箱',\n  'app.settings.security.mfa': 'MFA 设备',\n  'app.settings.security.mfa-description': '未绑定 MFA 设备，绑定后，可以进行二次确认',\n  'app.settings.security.modify': '修改',\n  'app.settings.security.set': '设置',\n  'app.settings.security.bind': '绑定',\n  'app.settings.binding.taobao': '绑定淘宝',\n  'app.settings.binding.taobao-description': '当前未绑定淘宝账号',\n  'app.settings.binding.alipay': '绑定支付宝',\n  'app.settings.binding.alipay-description': '当前未绑定支付宝账号',\n  'app.settings.binding.dingding': '绑定钉钉',\n  'app.settings.binding.dingding-description': '当前未绑定钉钉账号',\n  'app.settings.binding.bind': '绑定',\n  'app.settings.notification.password': '账户密码',\n  'app.settings.notification.password-description': '其他用户的消息将以站内信的形式通知',\n  'app.settings.notification.messages': '系统消息',\n  'app.settings.notification.messages-description': '系统消息将以站内信的形式通知',\n  'app.settings.notification.todo': '待办任务',\n  'app.settings.notification.todo-description': '待办任务将以站内信的形式通知',\n  'app.settings.open': '开',\n  'app.settings.close': '关',\n};\n"
  },
  {
    "path": "web/admin/src/locales/zh-CN.js",
    "content": "import component from './zh-CN/component';\nimport globalHeader from './zh-CN/globalHeader';\nimport menu from './zh-CN/menu';\nimport pwa from './zh-CN/pwa';\nimport settingDrawer from './zh-CN/settingDrawer';\nimport settings from './zh-CN/settings';\nimport pages from './zh-CN/pages';\nexport default {\n  'navBar.lang': '语言',\n  'layout.user.link.help': '帮助',\n  'layout.user.link.privacy': '隐私',\n  'layout.user.link.terms': '条款',\n  'app.copyright.produced': '蚂蚁集团体验技术部出品',\n  'app.preview.down.block': '下载此页面到本地项目',\n  'app.welcome.link.fetch-blocks': '获取全部区块',\n  'app.welcome.link.block-list': '基于 block 开发，快速构建标准页面',\n  ...pages,\n  ...globalHeader,\n  ...menu,\n  ...settingDrawer,\n  ...settings,\n  ...pwa,\n  ...component,\n};\n"
  },
  {
    "path": "web/admin/src/locales/zh-TW/component.js",
    "content": "export default {\n  'component.tagSelect.expand': '展開',\n  'component.tagSelect.collapse': '收起',\n  'component.tagSelect.all': '全部',\n};\n"
  },
  {
    "path": "web/admin/src/locales/zh-TW/globalHeader.js",
    "content": "export default {\n  'component.globalHeader.search': '站內搜索',\n  'component.globalHeader.search.example1': '搜索提示壹',\n  'component.globalHeader.search.example2': '搜索提示二',\n  'component.globalHeader.search.example3': '搜索提示三',\n  'component.globalHeader.help': '使用手冊',\n  'component.globalHeader.notification': '通知',\n  'component.globalHeader.notification.empty': '妳已查看所有通知',\n  'component.globalHeader.message': '消息',\n  'component.globalHeader.message.empty': '您已讀完所有消息',\n  'component.globalHeader.event': '待辦',\n  'component.globalHeader.event.empty': '妳已完成所有待辦',\n  'component.noticeIcon.clear': '清空',\n  'component.noticeIcon.cleared': '清空了',\n  'component.noticeIcon.empty': '暫無資料',\n  'component.noticeIcon.view-more': '查看更多',\n};\n"
  },
  {
    "path": "web/admin/src/locales/zh-TW/menu.js",
    "content": "export default {\n  'menu.welcome': '歡迎',\n  'menu.more-blocks': '更多區塊',\n  'menu.home': '首頁',\n  'menu.login': '登錄',\n  'menu.admin': '权限',\n  'menu.admin.sub-page': '二级管理页',\n  'menu.exception.403': '403',\n  'menu.exception.404': '404',\n  'menu.exception.500': '500',\n  'menu.register': '註冊',\n  'menu.register-result': '註冊結果',\n  'menu.dashboard': 'Dashboard',\n  'menu.dashboard.analysis': '分析頁',\n  'menu.dashboard.monitor': '監控頁',\n  'menu.dashboard.workplace': '工作臺',\n  'menu.form': '表單頁',\n  'menu.form.basic-form': '基礎表單',\n  'menu.form.step-form': '分步表單',\n  'menu.form.step-form.info': '分步表單（填寫轉賬信息）',\n  'menu.form.step-form.confirm': '分步表單（確認轉賬信息）',\n  'menu.form.step-form.result': '分步表單（完成）',\n  'menu.form.advanced-form': '高級表單',\n  'menu.list': '列表頁',\n  'menu.list.table-list': '查詢表格',\n  'menu.list.basic-list': '標淮列表',\n  'menu.list.card-list': '卡片列表',\n  'menu.list.search-list': '搜索列表',\n  'menu.list.search-list.articles': '搜索列表（文章）',\n  'menu.list.search-list.projects': '搜索列表（項目）',\n  'menu.list.search-list.applications': '搜索列表（應用）',\n  'menu.profile': '詳情頁',\n  'menu.profile.basic': '基礎詳情頁',\n  'menu.profile.advanced': '高級詳情頁',\n  'menu.result': '結果頁',\n  'menu.result.success': '成功頁',\n  'menu.result.fail': '失敗頁',\n  'menu.account': '個人頁',\n  'menu.account.center': '個人中心',\n  'menu.account.settings': '個人設置',\n  'menu.account.trigger': '觸發報錯',\n  'menu.account.logout': '退出登錄',\n  'menu.exception': '异常页',\n  'menu.exception.not-permission': '403',\n  'menu.exception.not-find': '404',\n  'menu.exception.server-error': '500',\n  'menu.exception.trigger': '触发错误',\n  'menu.editor': '圖形編輯器',\n  'menu.editor.flow': '流程編輯器',\n  'menu.editor.mind': '腦圖編輯器',\n  'menu.editor.koni': '拓撲編輯器',\n};\n"
  },
  {
    "path": "web/admin/src/locales/zh-TW/pwa.js",
    "content": "export default {\n  'app.pwa.offline': '當前處於離線狀態',\n  'app.pwa.serviceworker.updated': '有新內容',\n  'app.pwa.serviceworker.updated.hint': '請點擊“刷新”按鈕或者手動刷新頁面',\n  'app.pwa.serviceworker.updated.ok': '刷新',\n};\n"
  },
  {
    "path": "web/admin/src/locales/zh-TW/settingDrawer.js",
    "content": "export default {\n  'app.setting.pagestyle': '整體風格設置',\n  'app.setting.pagestyle.dark': '暗色菜單風格',\n  'app.setting.pagestyle.light': '亮色菜單風格',\n  'app.setting.content-width': '內容區域寬度',\n  'app.setting.content-width.fixed': '定寬',\n  'app.setting.content-width.fluid': '流式',\n  'app.setting.themecolor': '主題色',\n  'app.setting.themecolor.dust': '薄暮',\n  'app.setting.themecolor.volcano': '火山',\n  'app.setting.themecolor.sunset': '日暮',\n  'app.setting.themecolor.cyan': '明青',\n  'app.setting.themecolor.green': '極光綠',\n  'app.setting.themecolor.daybreak': '拂曉藍（默認）',\n  'app.setting.themecolor.geekblue': '極客藍',\n  'app.setting.themecolor.purple': '醬紫',\n  'app.setting.navigationmode': '導航模式',\n  'app.setting.sidemenu': '側邊菜單布局',\n  'app.setting.topmenu': '頂部菜單布局',\n  'app.setting.fixedheader': '固定 Header',\n  'app.setting.fixedsidebar': '固定側邊菜單',\n  'app.setting.fixedsidebar.hint': '側邊菜單布局時可配置',\n  'app.setting.hideheader': '下滑時隱藏 Header',\n  'app.setting.hideheader.hint': '固定 Header 時可配置',\n  'app.setting.othersettings': '其他設置',\n  'app.setting.weakmode': '色弱模式',\n  'app.setting.copy': '拷貝設置',\n  'app.setting.copyinfo': '拷貝成功，請到 config/defaultSettings.js 中替換默認配置',\n  'app.setting.production.hint':\n    '配置欄只在開發環境用於預覽，生產環境不會展現，請拷貝後手動修改配置文件',\n};\n"
  },
  {
    "path": "web/admin/src/locales/zh-TW/settings.js",
    "content": "export default {\n  'app.settings.menuMap.basic': '基本設置',\n  'app.settings.menuMap.security': '安全設置',\n  'app.settings.menuMap.binding': '賬號綁定',\n  'app.settings.menuMap.notification': '新消息通知',\n  'app.settings.basic.avatar': '頭像',\n  'app.settings.basic.change-avatar': '更換頭像',\n  'app.settings.basic.email': '郵箱',\n  'app.settings.basic.email-message': '請輸入您的郵箱!',\n  'app.settings.basic.nickname': '昵稱',\n  'app.settings.basic.nickname-message': '請輸入您的昵稱!',\n  'app.settings.basic.profile': '個人簡介',\n  'app.settings.basic.profile-message': '請輸入個人簡介!',\n  'app.settings.basic.profile-placeholder': '個人簡介',\n  'app.settings.basic.country': '國家/地區',\n  'app.settings.basic.country-message': '請輸入您的國家或地區!',\n  'app.settings.basic.geographic': '所在省市',\n  'app.settings.basic.geographic-message': '請輸入您的所在省市!',\n  'app.settings.basic.address': '街道地址',\n  'app.settings.basic.address-message': '請輸入您的街道地址!',\n  'app.settings.basic.phone': '聯系電話',\n  'app.settings.basic.phone-message': '請輸入您的聯系電話!',\n  'app.settings.basic.update': '更新基本信息',\n  'app.settings.security.strong': '強',\n  'app.settings.security.medium': '中',\n  'app.settings.security.weak': '弱',\n  'app.settings.security.password': '賬戶密碼',\n  'app.settings.security.password-description': '當前密碼強度',\n  'app.settings.security.phone': '密保手機',\n  'app.settings.security.phone-description': '已綁定手機',\n  'app.settings.security.question': '密保問題',\n  'app.settings.security.question-description': '未設置密保問題，密保問題可有效保護賬戶安全',\n  'app.settings.security.email': '備用郵箱',\n  'app.settings.security.email-description': '已綁定郵箱',\n  'app.settings.security.mfa': 'MFA 設備',\n  'app.settings.security.mfa-description': '未綁定 MFA 設備，綁定後，可以進行二次確認',\n  'app.settings.security.modify': '修改',\n  'app.settings.security.set': '設置',\n  'app.settings.security.bind': '綁定',\n  'app.settings.binding.taobao': '綁定淘寶',\n  'app.settings.binding.taobao-description': '當前未綁定淘寶賬號',\n  'app.settings.binding.alipay': '綁定支付寶',\n  'app.settings.binding.alipay-description': '當前未綁定支付寶賬號',\n  'app.settings.binding.dingding': '綁定釘釘',\n  'app.settings.binding.dingding-description': '當前未綁定釘釘賬號',\n  'app.settings.binding.bind': '綁定',\n  'app.settings.notification.password': '賬戶密碼',\n  'app.settings.notification.password-description': '其他用戶的消息將以站內信的形式通知',\n  'app.settings.notification.messages': '系統消息',\n  'app.settings.notification.messages-description': '系統消息將以站內信的形式通知',\n  'app.settings.notification.todo': '待辦任務',\n  'app.settings.notification.todo-description': '待辦任務將以站內信的形式通知',\n  'app.settings.open': '開',\n  'app.settings.close': '關',\n};\n"
  },
  {
    "path": "web/admin/src/locales/zh-TW.js",
    "content": "import component from './zh-TW/component';\nimport globalHeader from './zh-TW/globalHeader';\nimport menu from './zh-TW/menu';\nimport pwa from './zh-TW/pwa';\nimport settingDrawer from './zh-TW/settingDrawer';\nimport settings from './zh-TW/settings';\nexport default {\n  'navBar.lang': '語言',\n  'layout.user.link.help': '幫助',\n  'layout.user.link.privacy': '隱私',\n  'layout.user.link.terms': '條款',\n  'app.preview.down.block': '下載此頁面到本地項目',\n  ...globalHeader,\n  ...menu,\n  ...settingDrawer,\n  ...settings,\n  ...pwa,\n  ...component,\n};\n"
  },
  {
    "path": "web/admin/src/manifest.json",
    "content": "{\n  \"name\": \"Ant Design Pro\",\n  \"short_name\": \"Ant Design Pro\",\n  \"display\": \"standalone\",\n  \"start_url\": \"./?utm_source=homescreen\",\n  \"theme_color\": \"#002140\",\n  \"background_color\": \"#001529\",\n  \"icons\": [\n    {\n      \"src\": \"icons/icon-192x192.png\",\n      \"sizes\": \"192x192\"\n    },\n    {\n      \"src\": \"icons/icon-128x128.png\",\n      \"sizes\": \"128x128\"\n    },\n    {\n      \"src\": \"icons/icon-512x512.png\",\n      \"sizes\": \"512x512\"\n    }\n  ]\n}\n"
  },
  {
    "path": "web/admin/src/pages/404.jsx",
    "content": "import { Button, Result } from 'antd';\nimport React from 'react';\nimport { history } from 'umi';\n\nconst NoFoundPage = () => (\n  <Result\n    status=\"404\"\n    title=\"404\"\n    subTitle=\"Sorry, the page you visited does not exist.\"\n    extra={\n      <Button type=\"primary\" onClick={() => history.push('/')}>\n        Back Home\n      </Button>\n    }\n  />\n);\n\nexport default NoFoundPage;\n"
  },
  {
    "path": "web/admin/src/pages/Admin.jsx",
    "content": "import React from 'react';\nimport { HeartTwoTone, SmileTwoTone } from '@ant-design/icons';\nimport { Card, Typography, Alert } from 'antd';\nimport { PageHeaderWrapper } from '@ant-design/pro-layout';\nimport { useIntl } from 'umi';\n\nconst Admin = () => {\n  const intl = useIntl();\n  return (\n    <PageHeaderWrapper\n      content={intl.formatMessage({\n        id: 'pages.admin.subPage.title',\n        defaultMessage: 'This page can only be viewed by admin',\n      })}\n    >\n      <Card>\n        <Alert\n          message={intl.formatMessage({\n            id: 'pages.welcome.alertMessage',\n            defaultMessage: 'Faster and stronger heavy-duty components have been released.',\n          })}\n          type=\"success\"\n          showIcon\n          banner\n          style={{\n            margin: -12,\n            marginBottom: 48,\n          }}\n        />\n        <Typography.Title\n          level={2}\n          style={{\n            textAlign: 'center',\n          }}\n        >\n          <SmileTwoTone /> Ant Design Pro <HeartTwoTone twoToneColor=\"#eb2f96\" /> You\n        </Typography.Title>\n      </Card>\n      <p\n        style={{\n          textAlign: 'center',\n          marginTop: 24,\n        }}\n      >\n        Want to add more pages? Please refer to{' '}\n        <a href=\"https://pro.ant.design/docs/block-cn\" target=\"_blank\" rel=\"noopener noreferrer\">\n          use block\n        </a>\n        。\n      </p>\n    </PageHeaderWrapper>\n  );\n};\n\nexport default Admin;\n"
  },
  {
    "path": "web/admin/src/pages/TableList/components/UpdateForm.jsx",
    "content": "import React from 'react';\nimport { Modal } from 'antd';\nimport {\n  ProFormSelect,\n  ProFormText,\n  ProFormTextArea,\n  StepsForm,\n  ProFormRadio,\n  ProFormDateTimePicker,\n} from '@ant-design/pro-form';\nimport { useIntl, FormattedMessage } from 'umi';\n\nconst UpdateForm = (props) => {\n  const intl = useIntl();\n  return (\n    <StepsForm\n      stepsProps={{\n        size: 'small',\n      }}\n      stepsFormRender={(dom, submitter) => {\n        return (\n          <Modal\n            width={640}\n            bodyStyle={{\n              padding: '32px 40px 48px',\n            }}\n            destroyOnClose\n            title={intl.formatMessage({\n              id: 'pages.searchTable.updateForm.ruleConfig',\n              defaultMessage: '规则配置',\n            })}\n            visible={props.updateModalVisible}\n            footer={submitter}\n            onCancel={() => {\n              props.onCancel();\n            }}\n          >\n            {dom}\n          </Modal>\n        );\n      }}\n      onFinish={props.onSubmit}\n    >\n      <StepsForm.StepForm\n        initialValues={{\n          name: props.values.name,\n          desc: props.values.desc,\n        }}\n        title={intl.formatMessage({\n          id: 'pages.searchTable.updateForm.basicConfig',\n          defaultMessage: '基本信息',\n        })}\n      >\n        <ProFormText\n          name=\"name\"\n          label={intl.formatMessage({\n            id: 'pages.searchTable.updateForm.ruleName.nameLabel',\n            defaultMessage: '规则名称',\n          })}\n          width=\"md\"\n          rules={[\n            {\n              required: true,\n              message: (\n                <FormattedMessage\n                  id=\"pages.searchTable.updateForm.ruleName.nameRules\"\n                  defaultMessage=\"请输入规则名称！\"\n                />\n              ),\n            },\n          ]}\n        />\n        <ProFormTextArea\n          name=\"desc\"\n          width=\"md\"\n          label={intl.formatMessage({\n            id: 'pages.searchTable.updateForm.ruleDesc.descLabel',\n            defaultMessage: '规则描述',\n          })}\n          placeholder={intl.formatMessage({\n            id: 'pages.searchTable.updateForm.ruleDesc.descPlaceholder',\n            defaultMessage: '请输入至少五个字符',\n          })}\n          rules={[\n            {\n              required: true,\n              message: (\n                <FormattedMessage\n                  id=\"pages.searchTable.updateForm.ruleDesc.descRules\"\n                  defaultMessage=\"请输入至少五个字符的规则描述！\"\n                />\n              ),\n              min: 5,\n            },\n          ]}\n        />\n      </StepsForm.StepForm>\n      <StepsForm.StepForm\n        initialValues={{\n          target: '0',\n          template: '0',\n        }}\n        title={intl.formatMessage({\n          id: 'pages.searchTable.updateForm.ruleProps.title',\n          defaultMessage: '配置规则属性',\n        })}\n      >\n        <ProFormSelect\n          name=\"target\"\n          width=\"md\"\n          label={intl.formatMessage({\n            id: 'pages.searchTable.updateForm.object',\n            defaultMessage: '监控对象',\n          })}\n          valueEnum={{\n            0: '表一',\n            1: '表二',\n          }}\n        />\n        <ProFormSelect\n          name=\"template\"\n          width=\"md\"\n          label={intl.formatMessage({\n            id: 'pages.searchTable.updateForm.ruleProps.templateLabel',\n            defaultMessage: '规则模板',\n          })}\n          valueEnum={{\n            0: '规则模板一',\n            1: '规则模板二',\n          }}\n        />\n        <ProFormRadio.Group\n          name=\"type\"\n          label={intl.formatMessage({\n            id: 'pages.searchTable.updateForm.ruleProps.typeLabel',\n            defaultMessage: '规则类型',\n          })}\n          options={[\n            {\n              value: '0',\n              label: '强',\n            },\n            {\n              value: '1',\n              label: '弱',\n            },\n          ]}\n        />\n      </StepsForm.StepForm>\n      <StepsForm.StepForm\n        initialValues={{\n          type: '1',\n          frequency: 'month',\n        }}\n        title={intl.formatMessage({\n          id: 'pages.searchTable.updateForm.schedulingPeriod.title',\n          defaultMessage: '设定调度周期',\n        })}\n      >\n        <ProFormDateTimePicker\n          name=\"time\"\n          width=\"md\"\n          label={intl.formatMessage({\n            id: 'pages.searchTable.updateForm.schedulingPeriod.timeLabel',\n            defaultMessage: '开始时间',\n          })}\n          rules={[\n            {\n              required: true,\n              message: (\n                <FormattedMessage\n                  id=\"pages.searchTable.updateForm.schedulingPeriod.timeRules\"\n                  defaultMessage=\"请选择开始时间！\"\n                />\n              ),\n            },\n          ]}\n        />\n        <ProFormSelect\n          name=\"frequency\"\n          label={intl.formatMessage({\n            id: 'pages.searchTable.updateForm.object',\n            defaultMessage: '监控对象',\n          })}\n          width=\"md\"\n          valueEnum={{\n            month: '月',\n            week: '周',\n          }}\n        />\n      </StepsForm.StepForm>\n    </StepsForm>\n  );\n};\n\nexport default UpdateForm;\n"
  },
  {
    "path": "web/admin/src/pages/TableList/index.jsx",
    "content": "import { PlusOutlined } from '@ant-design/icons';\nimport { Button, message, Input, Drawer } from 'antd';\nimport React, { useState, useRef } from 'react';\nimport { useIntl, FormattedMessage } from 'umi';\nimport { PageContainer, FooterToolbar } from '@ant-design/pro-layout';\nimport ProTable from '@ant-design/pro-table';\nimport { ModalForm, ProFormText, ProFormTextArea } from '@ant-design/pro-form';\nimport ProDescriptions from '@ant-design/pro-descriptions';\nimport UpdateForm from './components/UpdateForm';\nimport { rule, addRule, updateRule, removeRule } from '@/services/ant-design-pro/api';\n/**\n * @en-US Add node\n * @zh-CN 添加节点\n * @param fields\n */\n\nconst handleAdd = async (fields) => {\n  const hide = message.loading('正在添加');\n\n  try {\n    await addRule({ ...fields });\n    hide();\n    message.success('Added successfully');\n    return true;\n  } catch (error) {\n    hide();\n    message.error('Adding failed, please try again!');\n    return false;\n  }\n};\n/**\n * @en-US Update node\n * @zh-CN 更新节点\n *\n * @param fields\n */\n\nconst handleUpdate = async (fields) => {\n  const hide = message.loading('Configuring');\n\n  try {\n    await updateRule({\n      name: fields.name,\n      desc: fields.desc,\n      key: fields.key,\n    });\n    hide();\n    message.success('Configuration is successful');\n    return true;\n  } catch (error) {\n    hide();\n    message.error('Configuration failed, please try again!');\n    return false;\n  }\n};\n/**\n *  Delete node\n * @zh-CN 删除节点\n *\n * @param selectedRows\n */\n\nconst handleRemove = async (selectedRows) => {\n  const hide = message.loading('正在删除');\n  if (!selectedRows) return true;\n\n  try {\n    await removeRule({\n      key: selectedRows.map((row) => row.key),\n    });\n    hide();\n    message.success('Deleted successfully and will refresh soon');\n    return true;\n  } catch (error) {\n    hide();\n    message.error('Delete failed, please try again');\n    return false;\n  }\n};\n\nconst TableList = () => {\n  /**\n   * @en-US Pop-up window of new window\n   * @zh-CN 新建窗口的弹窗\n   *  */\n  const [createModalVisible, handleModalVisible] = useState(false);\n  /**\n   * @en-US The pop-up window of the distribution update window\n   * @zh-CN 分布更新窗口的弹窗\n   * */\n\n  const [updateModalVisible, handleUpdateModalVisible] = useState(false);\n  const [showDetail, setShowDetail] = useState(false);\n  const actionRef = useRef();\n  const [currentRow, setCurrentRow] = useState();\n  const [selectedRowsState, setSelectedRows] = useState([]);\n  /**\n   * @en-US International configuration\n   * @zh-CN 国际化配置\n   * */\n\n  const intl = useIntl();\n  const columns = [\n    {\n      title: (\n        <FormattedMessage\n          id=\"pages.searchTable.updateForm.ruleName.nameLabel\"\n          defaultMessage=\"Rule name\"\n        />\n      ),\n      dataIndex: 'name',\n      tip: 'The rule name is the unique key',\n      render: (dom, entity) => {\n        return (\n          <a\n            onClick={() => {\n              setCurrentRow(entity);\n              setShowDetail(true);\n            }}\n          >\n            {dom}\n          </a>\n        );\n      },\n    },\n    {\n      title: <FormattedMessage id=\"pages.searchTable.titleDesc\" defaultMessage=\"Description\" />,\n      dataIndex: 'desc',\n      valueType: 'textarea',\n    },\n    {\n      title: (\n        <FormattedMessage\n          id=\"pages.searchTable.titleCallNo\"\n          defaultMessage=\"Number of service calls\"\n        />\n      ),\n      dataIndex: 'callNo',\n      sorter: true,\n      hideInForm: true,\n      renderText: (val) =>\n        `${val}${intl.formatMessage({\n          id: 'pages.searchTable.tenThousand',\n          defaultMessage: ' 万 ',\n        })}`,\n    },\n    {\n      title: <FormattedMessage id=\"pages.searchTable.titleStatus\" defaultMessage=\"Status\" />,\n      dataIndex: 'status',\n      hideInForm: true,\n      valueEnum: {\n        0: {\n          text: (\n            <FormattedMessage\n              id=\"pages.searchTable.nameStatus.default\"\n              defaultMessage=\"Shut down\"\n            />\n          ),\n          status: 'Default',\n        },\n        1: {\n          text: (\n            <FormattedMessage id=\"pages.searchTable.nameStatus.running\" defaultMessage=\"Running\" />\n          ),\n          status: 'Processing',\n        },\n        2: {\n          text: (\n            <FormattedMessage id=\"pages.searchTable.nameStatus.online\" defaultMessage=\"Online\" />\n          ),\n          status: 'Success',\n        },\n        3: {\n          text: (\n            <FormattedMessage\n              id=\"pages.searchTable.nameStatus.abnormal\"\n              defaultMessage=\"Abnormal\"\n            />\n          ),\n          status: 'Error',\n        },\n      },\n    },\n    {\n      title: (\n        <FormattedMessage\n          id=\"pages.searchTable.titleUpdatedAt\"\n          defaultMessage=\"Last scheduled time\"\n        />\n      ),\n      sorter: true,\n      dataIndex: 'updatedAt',\n      valueType: 'dateTime',\n      renderFormItem: (item, { defaultRender, ...rest }, form) => {\n        const status = form.getFieldValue('status');\n\n        if (`${status}` === '0') {\n          return false;\n        }\n\n        if (`${status}` === '3') {\n          return (\n            <Input\n              {...rest}\n              placeholder={intl.formatMessage({\n                id: 'pages.searchTable.exception',\n                defaultMessage: 'Please enter the reason for the exception!',\n              })}\n            />\n          );\n        }\n\n        return defaultRender(item);\n      },\n    },\n    {\n      title: <FormattedMessage id=\"pages.searchTable.titleOption\" defaultMessage=\"Operating\" />,\n      dataIndex: 'option',\n      valueType: 'option',\n      render: (_, record) => [\n        <a\n          key=\"config\"\n          onClick={() => {\n            handleUpdateModalVisible(true);\n            setCurrentRow(record);\n          }}\n        >\n          <FormattedMessage id=\"pages.searchTable.config\" defaultMessage=\"Configuration\" />\n        </a>,\n        <a key=\"subscribeAlert\" href=\"https://procomponents.ant.design/\">\n          <FormattedMessage\n            id=\"pages.searchTable.subscribeAlert\"\n            defaultMessage=\"Subscribe to alerts\"\n          />\n        </a>,\n      ],\n    },\n  ];\n  return (\n    <PageContainer>\n      <ProTable\n        headerTitle={intl.formatMessage({\n          id: 'pages.searchTable.title',\n          defaultMessage: 'Enquiry form',\n        })}\n        actionRef={actionRef}\n        rowKey=\"key\"\n        search={{\n          labelWidth: 120,\n        }}\n        toolBarRender={() => [\n          <Button\n            type=\"primary\"\n            key=\"primary\"\n            onClick={() => {\n              handleModalVisible(true);\n            }}\n          >\n            <PlusOutlined /> <FormattedMessage id=\"pages.searchTable.new\" defaultMessage=\"New\" />\n          </Button>,\n        ]}\n        request={rule}\n        columns={columns}\n        rowSelection={{\n          onChange: (_, selectedRows) => {\n            setSelectedRows(selectedRows);\n          },\n        }}\n      />\n      {selectedRowsState?.length > 0 && (\n        <FooterToolbar\n          extra={\n            <div>\n              <FormattedMessage id=\"pages.searchTable.chosen\" defaultMessage=\"Chosen\" />{' '}\n              <a\n                style={{\n                  fontWeight: 600,\n                }}\n              >\n                {selectedRowsState.length}\n              </a>{' '}\n              <FormattedMessage id=\"pages.searchTable.item\" defaultMessage=\"项\" />\n              &nbsp;&nbsp;\n              <span>\n                <FormattedMessage\n                  id=\"pages.searchTable.totalServiceCalls\"\n                  defaultMessage=\"Total number of service calls\"\n                />{' '}\n                {selectedRowsState.reduce((pre, item) => pre + item.callNo, 0)}{' '}\n                <FormattedMessage id=\"pages.searchTable.tenThousand\" defaultMessage=\"万\" />\n              </span>\n            </div>\n          }\n        >\n          <Button\n            onClick={async () => {\n              await handleRemove(selectedRowsState);\n              setSelectedRows([]);\n              actionRef.current?.reloadAndRest?.();\n            }}\n          >\n            <FormattedMessage\n              id=\"pages.searchTable.batchDeletion\"\n              defaultMessage=\"Batch deletion\"\n            />\n          </Button>\n          <Button type=\"primary\">\n            <FormattedMessage\n              id=\"pages.searchTable.batchApproval\"\n              defaultMessage=\"Batch approval\"\n            />\n          </Button>\n        </FooterToolbar>\n      )}\n      <ModalForm\n        title={intl.formatMessage({\n          id: 'pages.searchTable.createForm.newRule',\n          defaultMessage: 'New rule',\n        })}\n        width=\"400px\"\n        visible={createModalVisible}\n        onVisibleChange={handleModalVisible}\n        onFinish={async (value) => {\n          const success = await handleAdd(value);\n\n          if (success) {\n            handleModalVisible(false);\n\n            if (actionRef.current) {\n              actionRef.current.reload();\n            }\n          }\n        }}\n      >\n        <ProFormText\n          rules={[\n            {\n              required: true,\n              message: (\n                <FormattedMessage\n                  id=\"pages.searchTable.ruleName\"\n                  defaultMessage=\"Rule name is required\"\n                />\n              ),\n            },\n          ]}\n          width=\"md\"\n          name=\"name\"\n        />\n        <ProFormTextArea width=\"md\" name=\"desc\" />\n      </ModalForm>\n      <UpdateForm\n        onSubmit={async (value) => {\n          const success = await handleUpdate(value);\n\n          if (success) {\n            handleUpdateModalVisible(false);\n            setCurrentRow(undefined);\n\n            if (actionRef.current) {\n              actionRef.current.reload();\n            }\n          }\n        }}\n        onCancel={() => {\n          handleUpdateModalVisible(false);\n\n          if (!showDetail) {\n            setCurrentRow(undefined);\n          }\n        }}\n        updateModalVisible={updateModalVisible}\n        values={currentRow || {}}\n      />\n\n      <Drawer\n        width={600}\n        visible={showDetail}\n        onClose={() => {\n          setCurrentRow(undefined);\n          setShowDetail(false);\n        }}\n        closable={false}\n      >\n        {currentRow?.name && (\n          <ProDescriptions\n            column={2}\n            title={currentRow?.name}\n            request={async () => ({\n              data: currentRow || {},\n            })}\n            params={{\n              id: currentRow?.name,\n            }}\n            columns={columns}\n          />\n        )}\n      </Drawer>\n    </PageContainer>\n  );\n};\n\nexport default TableList;\n"
  },
  {
    "path": "web/admin/src/pages/Welcome.jsx",
    "content": "import React from 'react';\nimport { PageContainer } from '@ant-design/pro-layout';\nimport { Card, Alert, Typography } from 'antd';\nimport { useIntl, FormattedMessage } from 'umi';\nimport styles from './Welcome.less';\n\nconst CodePreview = ({ children }) => (\n  <pre className={styles.pre}>\n    <code>\n      <Typography.Text copyable>{children}</Typography.Text>\n    </code>\n  </pre>\n);\n\nconst Welcome = () => {\n  const intl = useIntl();\n  return (\n    <PageContainer>\n      <Card>\n        <Alert\n          message={intl.formatMessage({\n            id: 'pages.welcome.alertMessage',\n            defaultMessage: 'Faster and stronger heavy-duty components have been released.',\n          })}\n          type=\"success\"\n          showIcon\n          banner\n          style={{\n            margin: -12,\n            marginBottom: 24,\n          }}\n        />\n        <Typography.Text strong>\n          <FormattedMessage id=\"pages.welcome.advancedComponent\" defaultMessage=\"Advanced Form\" />{' '}\n          <a\n            href=\"https://procomponents.ant.design/components/table\"\n            rel=\"noopener noreferrer\"\n            target=\"__blank\"\n          >\n            <FormattedMessage id=\"pages.welcome.link\" defaultMessage=\"Welcome\" />\n          </a>\n        </Typography.Text>\n        <CodePreview>yarn add @ant-design/pro-table</CodePreview>\n        <Typography.Text\n          strong\n          style={{\n            marginBottom: 12,\n          }}\n        >\n          <FormattedMessage id=\"pages.welcome.advancedLayout\" defaultMessage=\"Advanced layout\" />{' '}\n          <a\n            href=\"https://procomponents.ant.design/components/layout\"\n            rel=\"noopener noreferrer\"\n            target=\"__blank\"\n          >\n            <FormattedMessage id=\"pages.welcome.link\" defaultMessage=\"Welcome\" />\n          </a>\n        </Typography.Text>\n        <CodePreview>yarn add @ant-design/pro-layout</CodePreview>\n      </Card>\n    </PageContainer>\n  );\n};\n\nexport default Welcome;\n"
  },
  {
    "path": "web/admin/src/pages/Welcome.less",
    "content": "@import (reference) '~antd/es/style/themes/index';\n\n.pre {\n  margin: 12px 0;\n  padding: 12px 20px;\n  background: @input-bg;\n  box-shadow: @card-shadow;\n}\n"
  },
  {
    "path": "web/admin/src/pages/document.ejs",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"theme-color\" content=\"#1890ff\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n    <meta\n      name=\"keywords\"\n      content=\"antd,umi,umijs,ant design,Scaffolding, layout, Ant Design, project, Pro, admin, console, homepage, out-of-the-box, middle and back office, solution, component library\"\n    />\n    <meta\n      name=\"description\"\n      content=\"\n    An out-of-box UI solution for enterprise applications as a React boilerplate.\"\n    />\n    <meta\n      name=\"description\"\n      content=\"\n      Out-of-the-box mid-stage front-end/design solution.\"\n    />\n    <meta\n      name=\"viewport\"\n      content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0\"\n    />\n    <title>Ant Design Pro</title>\n    <link rel=\"icon\" href=\"<%= context.config.publicPath +'favicon.ico'%>\" type=\"image/x-icon\" />\n  </head>\n  <body>\n    <noscript>\n      <div class=\"noscript-container\">\n        Hi there! Please\n        <div class=\"noscript-enableJS\">\n          <a href=\"https://www.enablejavascript.io/en\" target=\"_blank\" rel=\"noopener noreferrer\">\n            <b>enable Javascript</b>\n          </a>\n        </div>\n        in your browser to use Ant Design, Out-of-the-box mid-stage front/design solution!\n      </div>\n    </noscript>\n    <div id=\"root\">\n      <style>\n        html,\n        body,\n        #root {\n          height: 100%;\n          margin: 0;\n          padding: 0;\n        }\n        #root {\n          background-repeat: no-repeat;\n          background-size: 100% auto;\n        }\n        .noscript-container {\n          display: flex;\n          align-content: center;\n          justify-content: center;\n          margin-top: 90px;\n          font-size: 20px;\n          font-family: 'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode',\n            Geneva, Verdana, sans-serif;\n        }\n        .noscript-enableJS {\n          padding-right: 3px;\n          padding-left: 3px;\n        }\n        .page-loading-warp {\n          display: flex;\n          align-items: center;\n          justify-content: center;\n          padding: 98px;\n        }\n        .ant-spin {\n          position: absolute;\n          display: none;\n          -webkit-box-sizing: border-box;\n          box-sizing: border-box;\n          margin: 0;\n          padding: 0;\n          color: rgba(0, 0, 0, 0.65);\n          color: #1890ff;\n          font-size: 14px;\n          font-variant: tabular-nums;\n          line-height: 1.5;\n          text-align: center;\n          list-style: none;\n          opacity: 0;\n          -webkit-transition: -webkit-transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86);\n          transition: -webkit-transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86);\n          transition: transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86);\n          transition: transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86),\n            -webkit-transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86);\n          -webkit-font-feature-settings: 'tnum';\n          font-feature-settings: 'tnum';\n        }\n\n        .ant-spin-spinning {\n          position: static;\n          display: inline-block;\n          opacity: 1;\n        }\n\n        .ant-spin-dot {\n          position: relative;\n          display: inline-block;\n          width: 20px;\n          height: 20px;\n          font-size: 20px;\n        }\n\n        .ant-spin-dot-item {\n          position: absolute;\n          display: block;\n          width: 9px;\n          height: 9px;\n          background-color: #1890ff;\n          border-radius: 100%;\n          -webkit-transform: scale(0.75);\n          -ms-transform: scale(0.75);\n          transform: scale(0.75);\n          -webkit-transform-origin: 50% 50%;\n          -ms-transform-origin: 50% 50%;\n          transform-origin: 50% 50%;\n          opacity: 0.3;\n          -webkit-animation: antspinmove 1s infinite linear alternate;\n          animation: antSpinMove 1s infinite linear alternate;\n        }\n\n        .ant-spin-dot-item:nth-child(1) {\n          top: 0;\n          left: 0;\n        }\n\n        .ant-spin-dot-item:nth-child(2) {\n          top: 0;\n          right: 0;\n          -webkit-animation-delay: 0.4s;\n          animation-delay: 0.4s;\n        }\n\n        .ant-spin-dot-item:nth-child(3) {\n          right: 0;\n          bottom: 0;\n          -webkit-animation-delay: 0.8s;\n          animation-delay: 0.8s;\n        }\n\n        .ant-spin-dot-item:nth-child(4) {\n          bottom: 0;\n          left: 0;\n          -webkit-animation-delay: 1.2s;\n          animation-delay: 1.2s;\n        }\n\n        .ant-spin-dot-spin {\n          -webkit-transform: rotate(45deg);\n          -ms-transform: rotate(45deg);\n          transform: rotate(45deg);\n          -webkit-animation: antrotate 1.2s infinite linear;\n          animation: antRotate 1.2s infinite linear;\n        }\n\n        .ant-spin-lg .ant-spin-dot {\n          width: 32px;\n          height: 32px;\n          font-size: 32px;\n        }\n\n        .ant-spin-lg .ant-spin-dot i {\n          width: 14px;\n          height: 14px;\n        }\n\n        @media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {\n          .ant-spin-blur {\n            background: #fff;\n            opacity: 0.5;\n          }\n        }\n\n        @-webkit-keyframes antSpinMove {\n          to {\n            opacity: 1;\n          }\n        }\n\n        @keyframes antSpinMove {\n          to {\n            opacity: 1;\n          }\n        }\n\n        @-webkit-keyframes antRotate {\n          to {\n            -webkit-transform: rotate(405deg);\n            transform: rotate(405deg);\n          }\n        }\n\n        @keyframes antRotate {\n          to {\n            -webkit-transform: rotate(405deg);\n            transform: rotate(405deg);\n          }\n        }\n      </style>\n      <div\n        style=\"\n          display: flex;\n          flex-direction: column;\n          align-items: center;\n          justify-content: center;\n          height: 100%;\n          min-height: 420px;\n        \"\n      >\n        <img src=\"<%= context.config.publicPath +'pro_icon.svg'%>\" alt=\"logo\" width=\"256\" />\n        <div class=\"page-loading-warp\">\n          <div class=\"ant-spin ant-spin-lg ant-spin-spinning\">\n            <span class=\"ant-spin-dot ant-spin-dot-spin\"\n              ><i class=\"ant-spin-dot-item\"></i><i class=\"ant-spin-dot-item\"></i\n              ><i class=\"ant-spin-dot-item\"></i><i class=\"ant-spin-dot-item\"></i\n            ></span>\n          </div>\n        </div>\n        <div style=\"display: flex; align-items: center; justify-content: center\">\n          <img\n            src=\"https://gw.alipayobjects.com/zos/rmsportal/KDpgvguMpGfqaHPjicRK.svg\"\n            width=\"32\"\n            style=\"margin-right: 8px\"\n          />\n          Ant Design\n        </div>\n      </div>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "web/admin/src/pages/user/Login/index.jsx",
    "content": "import {\n  AlipayCircleOutlined,\n  LockOutlined,\n  MobileOutlined,\n  TaobaoCircleOutlined,\n  UserOutlined,\n  WeiboCircleOutlined,\n} from '@ant-design/icons';\nimport { Alert, message, Tabs } from 'antd';\nimport React, { useState } from 'react';\nimport { ProFormCaptcha, ProFormCheckbox, ProFormText, LoginForm } from '@ant-design/pro-form';\nimport { useIntl, history, FormattedMessage, SelectLang, useModel } from 'umi';\nimport Footer from '@/components/Footer';\nimport { login } from '@/services/ant-design-pro/api';\nimport { getFakeCaptcha } from '@/services/ant-design-pro/login';\nimport styles from './index.less';\n\nconst LoginMessage = ({ content }) => (\n  <Alert\n    style={{\n      marginBottom: 24,\n    }}\n    message={content}\n    type=\"error\"\n    showIcon\n  />\n);\n\nconst Login = () => {\n  const [userLoginState, setUserLoginState] = useState({});\n  const [type, setType] = useState('account');\n  const { initialState, setInitialState } = useModel('@@initialState');\n  const intl = useIntl();\n\n  const fetchUserInfo = async () => {\n    const userInfo = await initialState?.fetchUserInfo?.();\n\n    if (userInfo) {\n      await setInitialState((s) => ({ ...s, currentUser: userInfo }));\n    }\n  };\n\n  const handleSubmit = async (values) => {\n    try {\n      // 登录\n      const msg = await login({ ...values, type });\n\n      if (msg.status === 'ok') {\n        const defaultLoginSuccessMessage = intl.formatMessage({\n          id: 'pages.login.success',\n          defaultMessage: '登录成功！',\n        });\n        message.success(defaultLoginSuccessMessage);\n        await fetchUserInfo();\n        /** 此方法会跳转到 redirect 参数所在的位置 */\n\n        if (!history) return;\n        const { query } = history.location;\n        const { redirect } = query;\n        history.push(redirect || '/');\n        return;\n      }\n\n      console.log(msg); // 如果失败去设置用户错误信息\n\n      setUserLoginState(msg);\n    } catch (error) {\n      const defaultLoginFailureMessage = intl.formatMessage({\n        id: 'pages.login.failure',\n        defaultMessage: '登录失败，请重试！',\n      });\n      message.error(defaultLoginFailureMessage);\n    }\n  };\n\n  const { status, type: loginType } = userLoginState;\n  return (\n    <div className={styles.container}>\n      <div className={styles.lang} data-lang>\n        {SelectLang && <SelectLang />}\n      </div>\n      <div className={styles.content}>\n        <LoginForm\n          logo={<img alt=\"logo\" src=\"/logo.svg\" />}\n          title=\"Ant Design\"\n          subTitle={intl.formatMessage({\n            id: 'pages.layouts.userLayout.title',\n          })}\n          initialValues={{\n            autoLogin: true,\n          }}\n          actions={[\n            <FormattedMessage\n              key=\"loginWith\"\n              id=\"pages.login.loginWith\"\n              defaultMessage=\"其他登录方式\"\n            />,\n            <AlipayCircleOutlined key=\"AlipayCircleOutlined\" className={styles.icon} />,\n            <TaobaoCircleOutlined key=\"TaobaoCircleOutlined\" className={styles.icon} />,\n            <WeiboCircleOutlined key=\"WeiboCircleOutlined\" className={styles.icon} />,\n          ]}\n          onFinish={async (values) => {\n            await handleSubmit(values);\n          }}\n        >\n          <Tabs activeKey={type} onChange={setType}>\n            <Tabs.TabPane\n              key=\"account\"\n              tab={intl.formatMessage({\n                id: 'pages.login.accountLogin.tab',\n                defaultMessage: '账户密码登录',\n              })}\n            />\n            <Tabs.TabPane\n              key=\"mobile\"\n              tab={intl.formatMessage({\n                id: 'pages.login.phoneLogin.tab',\n                defaultMessage: '手机号登录',\n              })}\n            />\n          </Tabs>\n\n          {status === 'error' && loginType === 'account' && (\n            <LoginMessage\n              content={intl.formatMessage({\n                id: 'pages.login.accountLogin.errorMessage',\n                defaultMessage: '账户或密码错误(admin/ant.design)',\n              })}\n            />\n          )}\n          {type === 'account' && (\n            <>\n              <ProFormText\n                name=\"username\"\n                fieldProps={{\n                  size: 'large',\n                  prefix: <UserOutlined className={styles.prefixIcon} />,\n                }}\n                placeholder={intl.formatMessage({\n                  id: 'pages.login.username.placeholder',\n                  defaultMessage: '用户名: admin or user',\n                })}\n                rules={[\n                  {\n                    required: true,\n                    message: (\n                      <FormattedMessage\n                        id=\"pages.login.username.required\"\n                        defaultMessage=\"请输入用户名!\"\n                      />\n                    ),\n                  },\n                ]}\n              />\n              <ProFormText.Password\n                name=\"password\"\n                fieldProps={{\n                  size: 'large',\n                  prefix: <LockOutlined className={styles.prefixIcon} />,\n                }}\n                placeholder={intl.formatMessage({\n                  id: 'pages.login.password.placeholder',\n                  defaultMessage: '密码: ant.design',\n                })}\n                rules={[\n                  {\n                    required: true,\n                    message: (\n                      <FormattedMessage\n                        id=\"pages.login.password.required\"\n                        defaultMessage=\"请输入密码！\"\n                      />\n                    ),\n                  },\n                ]}\n              />\n            </>\n          )}\n\n          {status === 'error' && loginType === 'mobile' && <LoginMessage content=\"验证码错误\" />}\n          {type === 'mobile' && (\n            <>\n              <ProFormText\n                fieldProps={{\n                  size: 'large',\n                  prefix: <MobileOutlined className={styles.prefixIcon} />,\n                }}\n                name=\"mobile\"\n                placeholder={intl.formatMessage({\n                  id: 'pages.login.phoneNumber.placeholder',\n                  defaultMessage: '手机号',\n                })}\n                rules={[\n                  {\n                    required: true,\n                    message: (\n                      <FormattedMessage\n                        id=\"pages.login.phoneNumber.required\"\n                        defaultMessage=\"请输入手机号！\"\n                      />\n                    ),\n                  },\n                  {\n                    pattern: /^1\\d{10}$/,\n                    message: (\n                      <FormattedMessage\n                        id=\"pages.login.phoneNumber.invalid\"\n                        defaultMessage=\"手机号格式错误！\"\n                      />\n                    ),\n                  },\n                ]}\n              />\n              <ProFormCaptcha\n                fieldProps={{\n                  size: 'large',\n                  prefix: <LockOutlined className={styles.prefixIcon} />,\n                }}\n                captchaProps={{\n                  size: 'large',\n                }}\n                placeholder={intl.formatMessage({\n                  id: 'pages.login.captcha.placeholder',\n                  defaultMessage: '请输入验证码',\n                })}\n                captchaTextRender={(timing, count) => {\n                  if (timing) {\n                    return `${count} ${intl.formatMessage({\n                      id: 'pages.getCaptchaSecondText',\n                      defaultMessage: '获取验证码',\n                    })}`;\n                  }\n\n                  return intl.formatMessage({\n                    id: 'pages.login.phoneLogin.getVerificationCode',\n                    defaultMessage: '获取验证码',\n                  });\n                }}\n                name=\"captcha\"\n                rules={[\n                  {\n                    required: true,\n                    message: (\n                      <FormattedMessage\n                        id=\"pages.login.captcha.required\"\n                        defaultMessage=\"请输入验证码！\"\n                      />\n                    ),\n                  },\n                ]}\n                onGetCaptcha={async (phone) => {\n                  const result = await getFakeCaptcha({\n                    phone,\n                  });\n\n                  if (result === false) {\n                    return;\n                  }\n\n                  message.success('获取验证码成功！验证码为：1234');\n                }}\n              />\n            </>\n          )}\n          <div\n            style={{\n              marginBottom: 24,\n            }}\n          >\n            <ProFormCheckbox noStyle name=\"autoLogin\">\n              <FormattedMessage id=\"pages.login.rememberMe\" defaultMessage=\"自动登录\" />\n            </ProFormCheckbox>\n            <a\n              style={{\n                float: 'right',\n              }}\n            >\n              <FormattedMessage id=\"pages.login.forgotPassword\" defaultMessage=\"忘记密码\" />\n            </a>\n          </div>\n        </LoginForm>\n      </div>\n      <Footer />\n    </div>\n  );\n};\n\nexport default Login;\n"
  },
  {
    "path": "web/admin/src/pages/user/Login/index.less",
    "content": "@import (reference) '~antd/es/style/themes/index';\n\n.container {\n  display: flex;\n  flex-direction: column;\n  height: 100vh;\n  overflow: auto;\n  background: @layout-body-background;\n}\n\n.lang {\n  width: 100%;\n  height: 40px;\n  line-height: 44px;\n  text-align: right;\n  :global(.ant-dropdown-trigger) {\n    margin-right: 24px;\n  }\n}\n\n.content {\n  flex: 1;\n  padding: 32px 0;\n}\n\n@media (min-width: @screen-md-min) {\n  .container {\n    background-image: url('https://gw.alipayobjects.com/zos/rmsportal/TVYTbAXWheQpRcWDaDMu.svg');\n    background-repeat: no-repeat;\n    background-position: center 110px;\n    background-size: 100%;\n  }\n\n  .content {\n    padding: 32px 0 24px;\n  }\n}\n\n.icon {\n  margin-left: 8px;\n  color: rgba(0, 0, 0, 0.2);\n  font-size: 24px;\n  vertical-align: middle;\n  cursor: pointer;\n  transition: color 0.3s;\n\n  &:hover {\n    color: @primary-color;\n  }\n}\n"
  },
  {
    "path": "web/admin/src/service-worker.js",
    "content": "/* eslint-disable no-restricted-globals */\n/* eslint-disable no-underscore-dangle */\n/* globals workbox */\nworkbox.core.setCacheNameDetails({\n  prefix: 'antd-pro',\n  suffix: 'v5',\n});\n// Control all opened tabs ASAP\nworkbox.clientsClaim();\n\n/**\n * Use precaching list generated by workbox in build process.\n * https://developers.google.com/web/tools/workbox/reference-docs/latest/workbox.precaching\n */\nworkbox.precaching.precacheAndRoute(self.__precacheManifest || []);\n\n/**\n * Register a navigation route.\n * https://developers.google.com/web/tools/workbox/modules/workbox-routing#how_to_register_a_navigation_route\n */\nworkbox.routing.registerNavigationRoute('/index.html');\n\n/**\n * Use runtime cache:\n * https://developers.google.com/web/tools/workbox/reference-docs/latest/workbox.routing#.registerRoute\n *\n * Workbox provides all common caching strategies including CacheFirst, NetworkFirst etc.\n * https://developers.google.com/web/tools/workbox/reference-docs/latest/workbox.strategies\n */\n\n/** Handle API requests */\nworkbox.routing.registerRoute(/\\/api\\//, workbox.strategies.networkFirst());\n\n/** Handle third party requests */\nworkbox.routing.registerRoute(\n  /^https:\\/\\/gw\\.alipayobjects\\.com\\//,\n  workbox.strategies.networkFirst(),\n);\nworkbox.routing.registerRoute(\n  /^https:\\/\\/cdnjs\\.cloudflare\\.com\\//,\n  workbox.strategies.networkFirst(),\n);\nworkbox.routing.registerRoute(/\\/color.less/, workbox.strategies.networkFirst());\n\n/** Response to client after skipping waiting with MessageChannel */\naddEventListener('message', (event) => {\n  const replyPort = event.ports[0];\n  const message = event.data;\n  if (replyPort && message && message.type === 'skip-waiting') {\n    event.waitUntil(\n      self.skipWaiting().then(\n        () => {\n          replyPort.postMessage({\n            error: null,\n          });\n        },\n        (error) => {\n          replyPort.postMessage({\n            error,\n          });\n        },\n      ),\n    );\n  }\n});\n"
  },
  {
    "path": "web/admin/src/services/ant-design-pro/api.js",
    "content": "// @ts-ignore\n\n/* eslint-disable */\nimport { request } from 'umi';\n/** 获取当前的用户 GET /api/currentUser */\n\nexport async function currentUser(options) {\n  return request('/api/currentUser', {\n    method: 'GET',\n    ...(options || {}),\n  });\n}\n/** 退出登录接口 POST /api/login/outLogin */\n\nexport async function outLogin(options) {\n  return request('/api/login/outLogin', {\n    method: 'POST',\n    ...(options || {}),\n  });\n}\n/** 登录接口 POST /api/login/account */\n\nexport async function login(body, options) {\n  return request('/api/users/login', {\n    method: 'POST',\n    headers: {\n      'Content-Type': 'application/json',\n    },\n    data: body,\n    ...(options || {}),\n  });\n}\n/** 此处后端没有提供注释 GET /api/notices */\n\nexport async function getNotices(options) {\n  return request('/api/notices', {\n    method: 'GET',\n    ...(options || {}),\n  });\n}\n/** 获取规则列表 GET /api/rule */\n\nexport async function rule(params, options) {\n  return request('/api/rule', {\n    method: 'GET',\n    params: { ...params },\n    ...(options || {}),\n  });\n}\n/** 新建规则 PUT /api/rule */\n\nexport async function updateRule(options) {\n  return request('/api/rule', {\n    method: 'PUT',\n    ...(options || {}),\n  });\n}\n/** 新建规则 POST /api/rule */\n\nexport async function addRule(options) {\n  return request('/api/rule', {\n    method: 'POST',\n    ...(options || {}),\n  });\n}\n/** 删除规则 DELETE /api/rule */\n\nexport async function removeRule(options) {\n  return request('/api/rule', {\n    method: 'DELETE',\n    ...(options || {}),\n  });\n}\n"
  },
  {
    "path": "web/admin/src/services/ant-design-pro/index.js",
    "content": "// @ts-ignore\n\n/* eslint-disable */\n// API 更新时间：\n// API 唯一标识：\nimport * as api from './api';\nimport * as login from './login';\nexport default {\n  api,\n  login,\n};\n"
  },
  {
    "path": "web/admin/src/services/ant-design-pro/login.js",
    "content": "// @ts-ignore\n\n/* eslint-disable */\nimport { request } from 'umi';\n/** 发送验证码 POST /api/login/captcha */\n\nexport async function getFakeCaptcha(params, options) {\n  return request('/api/users/captcha', {\n    method: 'GET',\n    params: { ...params },\n    ...(options || {}),\n  });\n}\n"
  },
  {
    "path": "web/admin/src/services/swagger/index.js",
    "content": "// @ts-ignore\n\n/* eslint-disable */\n// API 更新时间：\n// API 唯一标识：\nimport * as pet from './pet';\nimport * as store from './store';\nimport * as user from './user';\nexport default {\n  pet,\n  store,\n  user,\n};\n"
  },
  {
    "path": "web/admin/src/services/swagger/pet.js",
    "content": "// @ts-ignore\n\n/* eslint-disable */\nimport { request } from 'umi';\n/** Update an existing pet PUT /pet */\n\nexport async function updatePet(body, options) {\n  return request('/pet', {\n    method: 'PUT',\n    headers: {\n      'Content-Type': 'application/json',\n    },\n    data: body,\n    ...(options || {}),\n  });\n}\n/** Add a new pet to the store POST /pet */\n\nexport async function addPet(body, options) {\n  return request('/pet', {\n    method: 'POST',\n    headers: {\n      'Content-Type': 'application/json',\n    },\n    data: body,\n    ...(options || {}),\n  });\n}\n/** Finds Pets by status Multiple status values can be provided with comma separated strings GET /pet/findByStatus */\n\nexport async function findPetsByStatus(params, options) {\n  return request('/pet/findByStatus', {\n    method: 'GET',\n    params: { ...params },\n    ...(options || {}),\n  });\n}\n/** Finds Pets by tags Muliple tags can be provided with comma separated strings. Use         tag1, tag2, tag3 for testing. GET /pet/findByTags */\n\nexport async function findPetsByTags(params, options) {\n  return request('/pet/findByTags', {\n    method: 'GET',\n    params: { ...params },\n    ...(options || {}),\n  });\n}\n/** Find pet by ID Returns a single pet GET /pet/${param0} */\n\nexport async function getPetById(params, options) {\n  const { petId: param0 } = params;\n  return request(`/pet/${param0}`, {\n    method: 'GET',\n    params: { ...params },\n    ...(options || {}),\n  });\n}\n/** Updates a pet in the store with form data POST /pet/${param0} */\n\nexport async function updatePetWithForm(params, body, options) {\n  const { petId: param0 } = params;\n  const formData = new FormData();\n  Object.keys(body).forEach((ele) => {\n    const item = body[ele];\n\n    if (item !== undefined && item !== null) {\n      formData.append(ele, typeof item === 'object' ? JSON.stringify(item) : item);\n    }\n  });\n  return request(`/pet/${param0}`, {\n    method: 'POST',\n    headers: {\n      'Content-Type': 'application/x-www-form-urlencoded',\n    },\n    params: { ...params },\n    data: formData,\n    ...(options || {}),\n  });\n}\n/** Deletes a pet DELETE /pet/${param0} */\n\nexport async function deletePet(params, options) {\n  const { petId: param0 } = params;\n  return request(`/pet/${param0}`, {\n    method: 'DELETE',\n    params: { ...params },\n    ...(options || {}),\n  });\n}\n/** uploads an image POST /pet/${param0}/uploadImage */\n\nexport async function uploadFile(params, body, options) {\n  const { petId: param0 } = params;\n  const formData = new FormData();\n  Object.keys(body).forEach((ele) => {\n    const item = body[ele];\n\n    if (item !== undefined && item !== null) {\n      formData.append(ele, typeof item === 'object' ? JSON.stringify(item) : item);\n    }\n  });\n  return request(`/pet/${param0}/uploadImage`, {\n    method: 'POST',\n    headers: {\n      'Content-Type': 'multipart/form-data',\n    },\n    params: { ...params },\n    data: formData,\n    ...(options || {}),\n  });\n}\n"
  },
  {
    "path": "web/admin/src/services/swagger/store.js",
    "content": "// @ts-ignore\n\n/* eslint-disable */\nimport { request } from 'umi';\n/** Returns pet inventories by status Returns a map of status codes to quantities GET /store/inventory */\n\nexport async function getInventory(options) {\n  return request('/store/inventory', {\n    method: 'GET',\n    ...(options || {}),\n  });\n}\n/** Place an s for a pet POST /store/s */\n\nexport async function placeOrder(body, options) {\n  return request('/store/s', {\n    method: 'POST',\n    data: body,\n    ...(options || {}),\n  });\n}\n/** Find purchase s by ID For valid response try integer IDs with value >= 1 and <= 10.         Other values will generated exceptions GET /store/s/${param0} */\n\nexport async function getOrderById(params, options) {\n  const { orderId: param0 } = params;\n  return request(`/store/order/${param0}`, {\n    method: 'GET',\n    params: { ...params },\n    ...(options || {}),\n  });\n}\n/** Delete purchase s by ID For valid response try integer IDs with positive integer value.         Negative or non-integer values will generate API errors DELETE /store/s/${param0} */\n\nexport async function deleteOrder(params, options) {\n  const { orderId: param0 } = params;\n  return request(`/store/order/${param0}`, {\n    method: 'DELETE',\n    params: { ...params },\n    ...(options || {}),\n  });\n}\n"
  },
  {
    "path": "web/admin/src/services/swagger/user.js",
    "content": "// @ts-ignore\n\n/* eslint-disable */\nimport { request } from 'umi';\n/** Create user This can only be done by the logged in user. POST /user */\n\nexport async function createUser(body, options) {\n  return request('/user', {\n    method: 'POST',\n    data: body,\n    ...(options || {}),\n  });\n}\n/** Creates list of users with given input array POST /user/createWithArray */\n\nexport async function createUsersWithArrayInput(body, options) {\n  return request('/user/createWithArray', {\n    method: 'POST',\n    data: body,\n    ...(options || {}),\n  });\n}\n/** Creates list of users with given input array POST /user/createWithList */\n\nexport async function createUsersWithListInput(body, options) {\n  return request('/user/createWithList', {\n    method: 'POST',\n    data: body,\n    ...(options || {}),\n  });\n}\n/** Logs user into the system GET /user/login */\n\nexport async function loginUser(params, options) {\n  return request('/user/login', {\n    method: 'GET',\n    params: { ...params },\n    ...(options || {}),\n  });\n}\n/** Logs out current logged in user session GET /user/logout */\n\nexport async function logoutUser(options) {\n  return request('/user/logout', {\n    method: 'GET',\n    ...(options || {}),\n  });\n}\n/** Get user by user name GET /user/${param0} */\n\nexport async function getUserByName(params, options) {\n  const { username: param0 } = params;\n  return request(`/user/${param0}`, {\n    method: 'GET',\n    params: { ...params },\n    ...(options || {}),\n  });\n}\n/** Updated user This can only be done by the logged in user. PUT /user/${param0} */\n\nexport async function updateUser(params, body, options) {\n  const { username: param0 } = params;\n  return request(`/user/${param0}`, {\n    method: 'PUT',\n    params: { ...params },\n    data: body,\n    ...(options || {}),\n  });\n}\n/** Delete user This can only be done by the logged in user. DELETE /user/${param0} */\n\nexport async function deleteUser(params, options) {\n  const { username: param0 } = params;\n  return request(`/user/${param0}`, {\n    method: 'DELETE',\n    params: { ...params },\n    ...(options || {}),\n  });\n}\n"
  },
  {
    "path": "web/admin/tests/run-tests.js",
    "content": "/* eslint-disable @typescript-eslint/no-var-requires */\nconst { spawn } = require('child_process');\nconst { kill } = require('cross-port-killer');\n\nconst env = Object.create(process.env);\nenv.BROWSER = 'none';\nenv.TEST = true;\nenv.UMI_UI = 'none';\nenv.PROGRESS = 'none';\n// flag to prevent multiple test\nlet once = false;\n\nconst startServer = spawn(/^win/.test(process.platform) ? 'npm.cmd' : 'npm', ['run', 'serve'], {\n  env,\n});\n\nstartServer.stderr.on('data', (data) => {\n  // eslint-disable-next-line\n  console.log(data.toString());\n});\n\nstartServer.on('exit', () => {\n  kill(process.env.PORT || 8000);\n});\n\nconsole.log('Starting development s for e2e tests...');\nstartServer.stdout.on('data', (data) => {\n  console.log(data.toString());\n  // hack code , wait umi\n  if (!once && data.toString().indexOf('Serving your umi project!') >= 0) {\n    // eslint-disable-next-line\n    once = true;\n    console.log('Development s is started, ready to run tests.');\n    const testCmd = spawn(\n      /^win/.test(process.platform) ? 'npm.cmd' : 'npm',\n      ['run', 'playwright'],\n      {\n        stdio: 'inherit',\n      },\n    );\n    testCmd.on('exit', (code) => {\n      console.log(code);\n      startServer.kill();\n      process.exit(code);\n    });\n  }\n});\n"
  },
  {
    "path": "web/admin/tests/setupTests.js",
    "content": "﻿// do some test init\n\nconst localStorageMock = {\n  getItem: jest.fn(),\n  setItem: jest.fn(),\n  removeItem: jest.fn(),\n  clear: jest.fn(),\n};\n\nglobal.localStorage = localStorageMock;\n"
  }
]