mirror of
https://gitlab.com/pulsechaincom/prysm-pulse.git
synced 2024-12-22 03:30:35 +00:00
Add a gRPC gateway (#2604)
This commit is contained in:
parent
71b5d5beec
commit
9e98e914a1
24
BUILD.bazel
24
BUILD.bazel
@ -32,6 +32,24 @@ alias(
|
||||
],
|
||||
)
|
||||
|
||||
# Protobuf gRPC compiler without gogoproto. Required for gRPC gateway.
|
||||
alias(
|
||||
name = "grpc_nogogo_proto_compiler",
|
||||
actual = "@io_bazel_rules_go//proto:go_grpc",
|
||||
visibility = [
|
||||
"//proto:__subpackages__",
|
||||
],
|
||||
)
|
||||
|
||||
# Protobuf gRPC gateway compiler
|
||||
alias(
|
||||
name = "grpc_gateway_proto_compiler",
|
||||
actual = "@grpc_ecosystem_grpc_gateway//protoc-gen-grpc-gateway:go_gen_grpc_gateway",
|
||||
visibility = [
|
||||
"//proto:__subpackages__",
|
||||
],
|
||||
)
|
||||
|
||||
gometalinter(
|
||||
name = "gometalinter",
|
||||
config = "//:.gometalinter.json",
|
||||
@ -44,8 +62,8 @@ gometalinter(
|
||||
goimports(
|
||||
name = "goimports",
|
||||
display_diffs = True,
|
||||
write = False,
|
||||
prefix = prefix,
|
||||
write = False,
|
||||
)
|
||||
|
||||
workspace_binary(
|
||||
@ -55,6 +73,8 @@ workspace_binary(
|
||||
|
||||
nogo(
|
||||
name = "nogo",
|
||||
config = "nogo_config.json",
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"@org_golang_x_tools//go/analysis/passes/unsafeptr:go_tool_library",
|
||||
"@org_golang_x_tools//go/analysis/passes/unreachable:go_tool_library",
|
||||
@ -87,6 +107,4 @@ nogo(
|
||||
"@org_golang_x_tools//go/analysis/passes/inspect:go_tool_library",
|
||||
"@org_golang_x_tools//go/analysis/passes/asmdecl:go_tool_library",
|
||||
],
|
||||
visibility = ["//visibility:public"],
|
||||
config = "nogo_config.json",
|
||||
)
|
||||
|
24
WORKSPACE
24
WORKSPACE
@ -129,11 +129,21 @@ http_archive(
|
||||
url = "https://github.com/kubernetes/repo-infra/archive/df02ded38f9506e5bbcbf21702034b4fef815f2f.tar.gz",
|
||||
)
|
||||
|
||||
http_archive(
|
||||
name = "com_github_bazelbuild_buildtools",
|
||||
strip_prefix = "buildtools-bf564b4925ab5876a3f64d8b90fab7f769013d42",
|
||||
url = "https://github.com/bazelbuild/buildtools/archive/bf564b4925ab5876a3f64d8b90fab7f769013d42.zip",
|
||||
)
|
||||
|
||||
load("@com_github_bazelbuild_buildtools//buildifier:deps.bzl", "buildifier_dependencies")
|
||||
|
||||
buildifier_dependencies()
|
||||
|
||||
http_archive(
|
||||
name = "com_github_prysmaticlabs_go_ssz",
|
||||
sha256 = "9e753a6e5c4f6f7f3b4af584f326b1c650aee6af85fc98416fbe7d1579d6e4d7",
|
||||
strip_prefix = "go-ssz-85eecc65d2c7a3b20501fe662210e5045f7bcbe1",
|
||||
url = "https://github.com/prysmaticlabs/go-ssz/archive/85eecc65d2c7a3b20501fe662210e5045f7bcbe1.tar.gz",
|
||||
sha256 = "9e753a6e5c4f6f7f3b4af584f326b1c650aee6af85fc98416fbe7d1579d6e4d7",
|
||||
)
|
||||
|
||||
load("@com_github_prysmaticlabs_go_ssz//:deps.bzl", "go_ssz_dependencies")
|
||||
@ -1101,3 +1111,15 @@ go_repository(
|
||||
commit = "13fe31bbdd7a6f706b9114e188cdb53856be4d64",
|
||||
importpath = "github.com/joonix/log",
|
||||
)
|
||||
|
||||
go_repository(
|
||||
name = "grpc_ecosystem_grpc_gateway",
|
||||
commit = "8fd5fd9d19ce68183a6b0934519dfe7fe6269612",
|
||||
importpath = "github.com/grpc-ecosystem/grpc-gateway",
|
||||
)
|
||||
|
||||
go_repository(
|
||||
name = "com_github_ghodss_yaml",
|
||||
commit = "25d852aebe32c875e9c044af3eef9c7dc6bc777f",
|
||||
importpath = "github.com/ghodss/yaml",
|
||||
)
|
||||
|
@ -1,4 +1,4 @@
|
||||
load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library")
|
||||
load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library", "go_test")
|
||||
load("@io_bazel_rules_docker//go:image.bzl", "go_image")
|
||||
load("@io_bazel_rules_docker//container:container.bzl", "container_push")
|
||||
|
||||
@ -8,6 +8,9 @@ go_library(
|
||||
"main.go",
|
||||
"usage.go",
|
||||
],
|
||||
data = [
|
||||
"//proto/beacon/rpc/v1:swagger",
|
||||
],
|
||||
importpath = "github.com/prysmaticlabs/prysm/beacon-chain",
|
||||
visibility = ["//beacon-chain:__subpackages__"],
|
||||
deps = [
|
||||
@ -69,3 +72,11 @@ go_binary(
|
||||
embed = [":go_default_library"],
|
||||
visibility = ["//beacon-chain:__subpackages__"],
|
||||
)
|
||||
|
||||
go_test(
|
||||
name = "go_default_test",
|
||||
size = "small",
|
||||
srcs = ["usage_test.go"],
|
||||
embed = [":go_default_library"],
|
||||
deps = ["@com_github_urfave_cli//:go_default_library"],
|
||||
)
|
||||
|
23
beacon-chain/gateway/BUILD.bazel
Normal file
23
beacon-chain/gateway/BUILD.bazel
Normal file
@ -0,0 +1,23 @@
|
||||
load("@io_bazel_rules_go//go:def.bzl", "go_library")
|
||||
|
||||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = [
|
||||
"gateway.go",
|
||||
"handlers.go",
|
||||
"log.go",
|
||||
],
|
||||
importpath = "github.com/prysmaticlabs/prysm/beacon-chain/gateway",
|
||||
visibility = [
|
||||
"//beacon-chain/gateway/server:__pkg__",
|
||||
"//beacon-chain/node:__pkg__",
|
||||
],
|
||||
deps = [
|
||||
"//proto/beacon/rpc/v1:v1_grpc_gateway_proto",
|
||||
"//shared:go_default_library",
|
||||
"@com_github_sirupsen_logrus//:go_default_library",
|
||||
"@grpc_ecosystem_grpc_gateway//runtime:go_default_library",
|
||||
"@org_golang_google_grpc//:go_default_library",
|
||||
"@org_golang_google_grpc//connectivity:go_default_library",
|
||||
],
|
||||
)
|
144
beacon-chain/gateway/gateway.go
Normal file
144
beacon-chain/gateway/gateway.go
Normal file
@ -0,0 +1,144 @@
|
||||
package gateway
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"net"
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
gwruntime "github.com/grpc-ecosystem/grpc-gateway/runtime"
|
||||
pb "github.com/prysmaticlabs/prysm/proto/beacon/rpc/v1_gateway"
|
||||
"github.com/prysmaticlabs/prysm/shared"
|
||||
"google.golang.org/grpc"
|
||||
"google.golang.org/grpc/connectivity"
|
||||
)
|
||||
|
||||
var _ = shared.Service(&Gateway{})
|
||||
|
||||
// Gateway is the gRPC gateway to serve HTTP JSON traffic as a proxy and forward
|
||||
// it to the beacon-chain gRPC server.
|
||||
type Gateway struct {
|
||||
conn *grpc.ClientConn
|
||||
ctx context.Context
|
||||
cancel context.CancelFunc
|
||||
gatewayAddr string
|
||||
remoteAddr string
|
||||
server *http.Server
|
||||
mux *http.ServeMux
|
||||
|
||||
startFailure error
|
||||
}
|
||||
|
||||
// Start the gateway service. This serves the HTTP JSON traffic on the specified
|
||||
// port.
|
||||
func (g *Gateway) Start() {
|
||||
ctx, cancel := context.WithCancel(g.ctx)
|
||||
g.cancel = cancel
|
||||
|
||||
log.WithField("address", g.gatewayAddr).Info("Starting gRPC gateway.")
|
||||
|
||||
conn, err := dial(ctx, "tcp", g.remoteAddr)
|
||||
if err != nil {
|
||||
log.WithError(err).Error("Failed to connect to gRPC server")
|
||||
g.startFailure = err
|
||||
return
|
||||
}
|
||||
|
||||
g.conn = conn
|
||||
|
||||
gwmux := gwruntime.NewServeMux()
|
||||
for _, f := range []func(context.Context, *gwruntime.ServeMux, *grpc.ClientConn) error{
|
||||
pb.RegisterBeaconServiceHandler,
|
||||
} {
|
||||
if err := f(ctx, gwmux, conn); err != nil {
|
||||
log.WithError(err).Error("Failed to start gateway")
|
||||
g.startFailure = err
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
g.mux.Handle("/", gwmux)
|
||||
|
||||
g.server = &http.Server{
|
||||
Addr: g.gatewayAddr,
|
||||
Handler: g.mux,
|
||||
}
|
||||
go func() {
|
||||
if err := g.server.ListenAndServe(); err != http.ErrServerClosed {
|
||||
log.WithError(err).Error("Failed to listen and serve")
|
||||
g.startFailure = err
|
||||
return
|
||||
}
|
||||
}()
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// Status of grpc gateway. Returns an error if this service is unhealthy.
|
||||
func (g *Gateway) Status() error {
|
||||
if g.startFailure != nil {
|
||||
return g.startFailure
|
||||
}
|
||||
|
||||
if s := g.conn.GetState(); s != connectivity.Ready {
|
||||
return fmt.Errorf("grpc server is %s", s)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Stop the gateway with a graceful shutdown.
|
||||
func (g *Gateway) Stop() error {
|
||||
if err := g.server.Shutdown(g.ctx); err != nil {
|
||||
log.WithError(err).Error("Failed to shut down server")
|
||||
}
|
||||
|
||||
if g.cancel != nil {
|
||||
g.cancel()
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// New returns a new gateway server which translates HTTP into gRPC.
|
||||
// Accepts a context and optional http.ServeMux.
|
||||
func New(ctx context.Context, remoteAddress, gatewayAddress string, mux *http.ServeMux) *Gateway {
|
||||
if mux == nil {
|
||||
mux = http.NewServeMux()
|
||||
}
|
||||
|
||||
return &Gateway{
|
||||
remoteAddr: remoteAddress,
|
||||
gatewayAddr: gatewayAddress,
|
||||
ctx: ctx,
|
||||
mux: mux,
|
||||
}
|
||||
}
|
||||
|
||||
// dial the gRPC server.
|
||||
func dial(ctx context.Context, network, addr string) (*grpc.ClientConn, error) {
|
||||
switch network {
|
||||
case "tcp":
|
||||
return dialTCP(ctx, addr)
|
||||
case "unix":
|
||||
return dialUnix(ctx, addr)
|
||||
default:
|
||||
return nil, fmt.Errorf("unsupported network type %q", network)
|
||||
}
|
||||
}
|
||||
|
||||
// dialTCP creates a client connection via TCP.
|
||||
// "addr" must be a valid TCP address with a port number.
|
||||
func dialTCP(ctx context.Context, addr string) (*grpc.ClientConn, error) {
|
||||
return grpc.DialContext(ctx, addr, grpc.WithInsecure())
|
||||
}
|
||||
|
||||
// dialUnix creates a client connection via a unix domain socket.
|
||||
// "addr" must be a valid path to the socket.
|
||||
func dialUnix(ctx context.Context, addr string) (*grpc.ClientConn, error) {
|
||||
d := func(addr string, timeout time.Duration) (net.Conn, error) {
|
||||
return net.DialTimeout("unix", addr, timeout)
|
||||
}
|
||||
return grpc.DialContext(ctx, addr, grpc.WithInsecure(), grpc.WithDialer(d))
|
||||
}
|
26
beacon-chain/gateway/handlers.go
Normal file
26
beacon-chain/gateway/handlers.go
Normal file
@ -0,0 +1,26 @@
|
||||
package gateway
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"path"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Swagger directory for the runtime files provided by bazel data.
|
||||
const swaggerDir = "proto/beacon/rpc/v1/"
|
||||
|
||||
// SwaggerServer returns swagger specification files located under "/swagger/"
|
||||
func SwaggerServer() http.HandlerFunc {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
if !strings.HasSuffix(r.URL.Path, ".swagger.json") {
|
||||
log.Debugf("Not Found: %s", r.URL.Path)
|
||||
http.NotFound(w, r)
|
||||
return
|
||||
}
|
||||
|
||||
log.Debugf("Serving %s\n", r.URL.Path)
|
||||
p := strings.TrimPrefix(r.URL.Path, "/swagger/")
|
||||
p = path.Join(swaggerDir, p)
|
||||
http.ServeFile(w, r, p)
|
||||
}
|
||||
}
|
5
beacon-chain/gateway/log.go
Normal file
5
beacon-chain/gateway/log.go
Normal file
@ -0,0 +1,5 @@
|
||||
package gateway
|
||||
|
||||
import "github.com/sirupsen/logrus"
|
||||
|
||||
var log = logrus.WithField("prefix", "gateway")
|
52
beacon-chain/gateway/server/BUILD.bazel
Normal file
52
beacon-chain/gateway/server/BUILD.bazel
Normal file
@ -0,0 +1,52 @@
|
||||
load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library")
|
||||
load("@io_bazel_rules_docker//go:image.bzl", "go_image")
|
||||
load("@io_bazel_rules_docker//container:container.bzl", "container_push")
|
||||
|
||||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = ["main.go"],
|
||||
importpath = "github.com/prysmaticlabs/prysm/beacon-chain/gateway/server",
|
||||
visibility = ["//visibility:private"],
|
||||
deps = [
|
||||
"//beacon-chain/gateway:go_default_library",
|
||||
"@com_github_joonix_log//:go_default_library",
|
||||
"@com_github_sirupsen_logrus//:go_default_library",
|
||||
"@grpc_ecosystem_grpc_gateway//runtime:go_default_library",
|
||||
],
|
||||
)
|
||||
|
||||
go_binary(
|
||||
name = "server",
|
||||
embed = [":go_default_library"],
|
||||
visibility = ["//visibility:private"],
|
||||
)
|
||||
|
||||
go_image(
|
||||
name = "image",
|
||||
srcs = [
|
||||
"main.go",
|
||||
],
|
||||
goarch = "amd64",
|
||||
goos = "linux",
|
||||
importpath = "github.com/prysmaticlabs/prysm/beacon-chain/gateway/server",
|
||||
race = "off",
|
||||
tags = ["manual"],
|
||||
visibility = ["//visibility:private"],
|
||||
deps = [
|
||||
"//beacon-chain/gateway:go_default_library",
|
||||
"@com_github_joonix_log//:go_default_library",
|
||||
"@com_github_sirupsen_logrus//:go_default_library",
|
||||
"@grpc_ecosystem_grpc_gateway//runtime:go_default_library",
|
||||
],
|
||||
)
|
||||
|
||||
container_push(
|
||||
name = "push_image",
|
||||
format = "Docker",
|
||||
image = ":image",
|
||||
registry = "gcr.io",
|
||||
repository = "prysmaticlabs/prysm/beacon-chain/gateway",
|
||||
tag = "latest",
|
||||
tags = ["manual"],
|
||||
visibility = ["//visibility:private"],
|
||||
)
|
75
beacon-chain/gateway/server/main.go
Normal file
75
beacon-chain/gateway/server/main.go
Normal file
@ -0,0 +1,75 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"flag"
|
||||
"fmt"
|
||||
"net/http"
|
||||
|
||||
gwruntime "github.com/grpc-ecosystem/grpc-gateway/runtime"
|
||||
joonix "github.com/joonix/log"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/gateway"
|
||||
"github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
// Endpoint describes a gRPC endpoint
|
||||
type Endpoint struct {
|
||||
Network, Addr string
|
||||
}
|
||||
|
||||
// Options is a set of options to be passed to Run
|
||||
type Options struct {
|
||||
// Addr is the address to listen
|
||||
Addr string
|
||||
|
||||
// GRPCServer defines an endpoint of a gRPC service
|
||||
GRPCServer Endpoint
|
||||
|
||||
// SwaggerDir is a path to a directory from which the server
|
||||
// serves swagger specs.
|
||||
SwaggerDir string
|
||||
|
||||
// Mux is a list of options to be passed to the grpc-gateway multiplexer
|
||||
Mux []gwruntime.ServeMuxOption
|
||||
}
|
||||
|
||||
var (
|
||||
beaconRPC = flag.String("beacon-rpc", "localhost:4000", "Beacon chain gRPC endpoint")
|
||||
port = flag.Int("port", 8000, "Port to serve on")
|
||||
debug = flag.Bool("debug", false, "Enable debug logging")
|
||||
)
|
||||
|
||||
func init() {
|
||||
logrus.SetFormatter(joonix.NewFormatter())
|
||||
}
|
||||
|
||||
var log = logrus.New()
|
||||
|
||||
func main() {
|
||||
flag.Parse()
|
||||
if *debug {
|
||||
log.SetLevel(logrus.DebugLevel)
|
||||
}
|
||||
|
||||
mux := http.NewServeMux()
|
||||
gw := gateway.New(context.Background(), *beaconRPC, fmt.Sprintf("0.0.0.0:%d", *port), mux)
|
||||
mux.HandleFunc("/swagger/", gateway.SwaggerServer())
|
||||
mux.HandleFunc("/healthz", healthzServer(gw))
|
||||
gw.Start()
|
||||
|
||||
select {}
|
||||
}
|
||||
|
||||
// healthzServer returns a simple health handler which returns ok.
|
||||
func healthzServer(gw *gateway.Gateway) http.HandlerFunc {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
w.Header().Set("Content-Type", "text/plain")
|
||||
if err := gw.Status(); err != nil {
|
||||
http.Error(w, err.Error(), http.StatusBadGateway)
|
||||
return
|
||||
}
|
||||
if _, err := fmt.Fprintln(w, "ok"); err != nil {
|
||||
log.WithError(err).Error("failed to respond to healthz")
|
||||
}
|
||||
}
|
||||
}
|
@ -7,6 +7,10 @@ import (
|
||||
"runtime"
|
||||
|
||||
joonix "github.com/joonix/log"
|
||||
"github.com/sirupsen/logrus"
|
||||
"github.com/urfave/cli"
|
||||
"github.com/x-cray/logrus-prefixed-formatter"
|
||||
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/node"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/utils"
|
||||
"github.com/prysmaticlabs/prysm/shared/cmd"
|
||||
@ -14,25 +18,49 @@ import (
|
||||
"github.com/prysmaticlabs/prysm/shared/featureconfig"
|
||||
"github.com/prysmaticlabs/prysm/shared/logutil"
|
||||
"github.com/prysmaticlabs/prysm/shared/version"
|
||||
"github.com/sirupsen/logrus"
|
||||
"github.com/urfave/cli"
|
||||
prefixed "github.com/x-cray/logrus-prefixed-formatter"
|
||||
)
|
||||
|
||||
func startNode(ctx *cli.Context) error {
|
||||
verbosity := ctx.GlobalString(cmd.VerbosityFlag.Name)
|
||||
level, err := logrus.ParseLevel(verbosity)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
logrus.SetLevel(level)
|
||||
var appFlags = []cli.Flag{
|
||||
utils.NoCustomConfigFlag,
|
||||
utils.DepositContractFlag,
|
||||
utils.Web3ProviderFlag,
|
||||
utils.HTTPWeb3ProviderFlag,
|
||||
utils.RPCPort,
|
||||
utils.CertFlag,
|
||||
utils.KeyFlag,
|
||||
utils.EnableDBCleanup,
|
||||
utils.GRPCGatewayPort,
|
||||
cmd.BootstrapNode,
|
||||
cmd.NoDiscovery,
|
||||
cmd.StaticPeers,
|
||||
cmd.RelayNode,
|
||||
cmd.P2PPort,
|
||||
cmd.P2PHost,
|
||||
cmd.P2PMaxPeers,
|
||||
cmd.P2PPrivKey,
|
||||
cmd.P2PWhitelist,
|
||||
cmd.DataDirFlag,
|
||||
cmd.VerbosityFlag,
|
||||
cmd.EnableTracingFlag,
|
||||
cmd.TracingProcessNameFlag,
|
||||
cmd.TracingEndpointFlag,
|
||||
cmd.TraceSampleFractionFlag,
|
||||
cmd.MonitoringPortFlag,
|
||||
cmd.DisableMonitoringFlag,
|
||||
cmd.ClearDB,
|
||||
cmd.LogFormat,
|
||||
cmd.MaxGoroutines,
|
||||
debug.PProfFlag,
|
||||
debug.PProfAddrFlag,
|
||||
debug.PProfPortFlag,
|
||||
debug.MemProfileRateFlag,
|
||||
debug.CPUProfileFlag,
|
||||
debug.TraceFlag,
|
||||
cmd.LogFileName,
|
||||
}
|
||||
|
||||
beacon, err := node.NewBeaconNode(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
beacon.Start()
|
||||
return nil
|
||||
func init() {
|
||||
appFlags = append(appFlags, featureconfig.BeaconChainFlags...)
|
||||
}
|
||||
|
||||
func main() {
|
||||
@ -43,45 +71,7 @@ func main() {
|
||||
app.Action = startNode
|
||||
app.Version = version.GetVersion()
|
||||
|
||||
app.Flags = []cli.Flag{
|
||||
utils.NoCustomConfigFlag,
|
||||
utils.DepositContractFlag,
|
||||
utils.Web3ProviderFlag,
|
||||
utils.HTTPWeb3ProviderFlag,
|
||||
utils.RPCPort,
|
||||
utils.CertFlag,
|
||||
utils.KeyFlag,
|
||||
utils.EnableDBCleanup,
|
||||
cmd.BootstrapNode,
|
||||
cmd.NoDiscovery,
|
||||
cmd.StaticPeers,
|
||||
cmd.RelayNode,
|
||||
cmd.P2PPort,
|
||||
cmd.P2PHost,
|
||||
cmd.P2PMaxPeers,
|
||||
cmd.P2PPrivKey,
|
||||
cmd.P2PWhitelist,
|
||||
cmd.DataDirFlag,
|
||||
cmd.VerbosityFlag,
|
||||
cmd.EnableTracingFlag,
|
||||
cmd.TracingProcessNameFlag,
|
||||
cmd.TracingEndpointFlag,
|
||||
cmd.TraceSampleFractionFlag,
|
||||
cmd.MonitoringPortFlag,
|
||||
cmd.DisableMonitoringFlag,
|
||||
cmd.ClearDB,
|
||||
cmd.LogFormat,
|
||||
cmd.MaxGoroutines,
|
||||
debug.PProfFlag,
|
||||
debug.PProfAddrFlag,
|
||||
debug.PProfPortFlag,
|
||||
debug.MemProfileRateFlag,
|
||||
debug.CPUProfileFlag,
|
||||
debug.TraceFlag,
|
||||
cmd.LogFileName,
|
||||
}
|
||||
|
||||
app.Flags = append(app.Flags, featureconfig.BeaconChainFlags...)
|
||||
app.Flags = appFlags
|
||||
|
||||
app.Before = func(ctx *cli.Context) error {
|
||||
format := ctx.GlobalString(cmd.LogFormat.Name)
|
||||
@ -121,3 +111,19 @@ func main() {
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
func startNode(ctx *cli.Context) error {
|
||||
verbosity := ctx.GlobalString(cmd.VerbosityFlag.Name)
|
||||
level, err := logrus.ParseLevel(verbosity)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
logrus.SetLevel(level)
|
||||
|
||||
beacon, err := node.NewBeaconNode(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
beacon.Start()
|
||||
return nil
|
||||
}
|
||||
|
@ -13,6 +13,7 @@ go_library(
|
||||
"//beacon-chain/attestation:go_default_library",
|
||||
"//beacon-chain/blockchain:go_default_library",
|
||||
"//beacon-chain/db:go_default_library",
|
||||
"//beacon-chain/gateway:go_default_library",
|
||||
"//beacon-chain/operations:go_default_library",
|
||||
"//beacon-chain/powchain:go_default_library",
|
||||
"//beacon-chain/rpc:go_default_library",
|
||||
|
@ -16,6 +16,7 @@ import (
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/attestation"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/blockchain"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/db"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/gateway"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/operations"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/powchain"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/rpc"
|
||||
@ -110,6 +111,10 @@ func NewBeaconNode(ctx *cli.Context) (*BeaconNode, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if err := beacon.registerGRPCGateway(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if !ctx.GlobalBool(cmd.DisableMonitoringFlag.Name) {
|
||||
if err := beacon.registerPrometheusService(ctx); err != nil {
|
||||
return nil, err
|
||||
@ -397,3 +402,13 @@ func (b *BeaconNode) registerAttestationService() error {
|
||||
|
||||
return b.services.RegisterService(attsService)
|
||||
}
|
||||
|
||||
func (b *BeaconNode) registerGRPCGateway(ctx *cli.Context) error {
|
||||
gatewayPort := ctx.GlobalInt(utils.GRPCGatewayPort.Name)
|
||||
if gatewayPort > 0 {
|
||||
selfAddress := fmt.Sprintf("127.0.0.1:%d", ctx.GlobalInt(utils.RPCPort.Name))
|
||||
gatewayAddress := fmt.Sprintf("127.0.0.1:%d", gatewayPort)
|
||||
return b.services.RegisterService(gateway.New(context.Background(), selfAddress, gatewayAddress, nil /*optional mux*/))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
@ -57,6 +57,7 @@ var appHelpFlagGroups = []flagGroup{
|
||||
cmd.MonitoringPortFlag,
|
||||
cmd.DisableMonitoringFlag,
|
||||
cmd.MaxGoroutines,
|
||||
cmd.ClearDB,
|
||||
},
|
||||
},
|
||||
{
|
||||
@ -80,6 +81,25 @@ var appHelpFlagGroups = []flagGroup{
|
||||
utils.CertFlag,
|
||||
utils.KeyFlag,
|
||||
utils.EnableDBCleanup,
|
||||
utils.GRPCGatewayPort,
|
||||
utils.HTTPWeb3ProviderFlag,
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "p2p",
|
||||
Flags: []cli.Flag{
|
||||
cmd.P2PHost,
|
||||
cmd.P2PMaxPeers,
|
||||
cmd.P2PPrivKey,
|
||||
cmd.P2PWhitelist,
|
||||
cmd.StaticPeers,
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "log",
|
||||
Flags: []cli.Flag{
|
||||
cmd.LogFormat,
|
||||
cmd.LogFileName,
|
||||
},
|
||||
},
|
||||
{
|
||||
|
41
beacon-chain/usage_test.go
Normal file
41
beacon-chain/usage_test.go
Normal file
@ -0,0 +1,41 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/urfave/cli"
|
||||
)
|
||||
|
||||
func TestAllFlagsExistInHelp(t *testing.T) {
|
||||
// If this test is failing, it is because you've recently added/removed a
|
||||
// flag in beacon chain main.go, but did not add/remove it to the usage.go
|
||||
// flag grouping (appHelpFlagGroups).
|
||||
|
||||
var helpFlags []cli.Flag
|
||||
for _, group := range appHelpFlagGroups {
|
||||
helpFlags = append(helpFlags, group.Flags...)
|
||||
}
|
||||
|
||||
for _, flag := range appFlags {
|
||||
if !doesFlagExist(flag, helpFlags) {
|
||||
t.Errorf("Flag %s does not exist in help/usage flags.", flag.GetName())
|
||||
}
|
||||
}
|
||||
|
||||
for _, flag := range helpFlags {
|
||||
if !doesFlagExist(flag, appFlags) {
|
||||
t.Errorf("Flag %s does not exist in main.go, "+
|
||||
"but exists in help flags", flag.GetName())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func doesFlagExist(flag cli.Flag, flags []cli.Flag) bool {
|
||||
for _, f := range flags {
|
||||
if f == flag {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
@ -28,10 +28,10 @@ var (
|
||||
Usage: "Deposit contract address. Beacon chain node will listen logs coming from the deposit contract to determine when validator is eligible to participate.",
|
||||
}
|
||||
// RPCPort defines a beacon node RPC port to open.
|
||||
RPCPort = cli.StringFlag{
|
||||
RPCPort = cli.IntFlag{
|
||||
Name: "rpc-port",
|
||||
Usage: "RPC port exposed by a beacon node",
|
||||
Value: "4000",
|
||||
Value: 4000,
|
||||
}
|
||||
// CertFlag defines a flag for the node's TLS certificate.
|
||||
CertFlag = cli.StringFlag{
|
||||
@ -48,4 +48,9 @@ var (
|
||||
Name: "enable-db-cleanup",
|
||||
Usage: "Enable automatic DB cleanup routine",
|
||||
}
|
||||
// GRPCGatewayPort enables a gRPC gateway to be exposed for Prysm.
|
||||
GRPCGatewayPort = cli.IntFlag{
|
||||
Name: "grpc-gateway-port",
|
||||
Usage: "Enable gRPC gateway for JSON requests",
|
||||
}
|
||||
)
|
||||
|
@ -9,6 +9,23 @@ spec:
|
||||
gateways:
|
||||
- prylabs-wildcard-gateway
|
||||
http:
|
||||
- match:
|
||||
- uri:
|
||||
prefix: /v1/beacon
|
||||
- uri:
|
||||
prefix: /swagger/
|
||||
route:
|
||||
- destination:
|
||||
port:
|
||||
number: 8000
|
||||
host: public-api-gateway.beacon-chain.svc.cluster.local
|
||||
corsPolicy:
|
||||
allowOrigin:
|
||||
- "*"
|
||||
allowHeaders:
|
||||
- content-type
|
||||
allowMethods:
|
||||
- GET
|
||||
- match:
|
||||
- uri:
|
||||
prefix: /faucet.FaucetService
|
||||
@ -76,4 +93,19 @@ spec:
|
||||
- grpc-status
|
||||
- grpc-message
|
||||
retries:
|
||||
attempts: 3
|
||||
attempts: 3
|
||||
- match:
|
||||
- uri:
|
||||
prefix: /
|
||||
route:
|
||||
- destination:
|
||||
port:
|
||||
number: 8080
|
||||
host: public-api-ui.beacon-chain.svc.cluster.local
|
||||
corsPolicy:
|
||||
allowOrigin:
|
||||
- "*"
|
||||
allowHeaders:
|
||||
- content-type
|
||||
allowMethods:
|
||||
- GET
|
151
k8s/beacon-chain/public-api.yaml
Normal file
151
k8s/beacon-chain/public-api.yaml
Normal file
@ -0,0 +1,151 @@
|
||||
kind: Deployment
|
||||
apiVersion: apps/v1
|
||||
metadata:
|
||||
name: public-api-swagger-ui
|
||||
namespace: beacon-chain
|
||||
labels:
|
||||
app: beacon-chain
|
||||
component: public-api-swagger-ui
|
||||
version: production
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: beacon-chain
|
||||
component: public-api-swagger-ui
|
||||
version: production
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: beacon-chain
|
||||
component: public-api-swagger-ui
|
||||
version: production
|
||||
spec:
|
||||
priorityClassName: production-priority
|
||||
containers:
|
||||
- name: ui
|
||||
image: swaggerapi/swagger-ui:v3.0.5
|
||||
ports:
|
||||
- containerPort: 8080
|
||||
name: http-ui
|
||||
env:
|
||||
- name: API_URL
|
||||
value: https://api.prylabs.net/swagger/services.swagger.json
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: /
|
||||
port: 8080
|
||||
initialDelaySeconds: 3
|
||||
periodSeconds: 15
|
||||
resources:
|
||||
requests:
|
||||
cpu: "100m"
|
||||
---
|
||||
apiVersion: autoscaling/v2beta1
|
||||
kind: HorizontalPodAutoscaler
|
||||
metadata:
|
||||
name: public-api-swagger-ui
|
||||
namespace: beacon-chain
|
||||
spec:
|
||||
scaleTargetRef:
|
||||
apiVersion: extensions/v1beta1
|
||||
kind: Deployment
|
||||
name: public-api-swagger-ui
|
||||
minReplicas: 1
|
||||
maxReplicas: 3
|
||||
metrics:
|
||||
- type: Resource
|
||||
resource:
|
||||
name: cpu
|
||||
targetAverageUtilization: 80
|
||||
---
|
||||
kind: Deployment
|
||||
apiVersion: apps/v1
|
||||
metadata:
|
||||
name: public-api-gateway
|
||||
namespace: beacon-chain
|
||||
labels:
|
||||
app: beacon-chain
|
||||
component: public-api-gateway
|
||||
version: production
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: beacon-chain
|
||||
component: public-api-gateway
|
||||
version: production
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: beacon-chain
|
||||
component: public-api-gateway
|
||||
version: production
|
||||
spec:
|
||||
priorityClassName: production-priority
|
||||
containers:
|
||||
- name: server
|
||||
image: gcr.io/prysmaticlabs/prysm/beacon-chain/gateway:latest
|
||||
args:
|
||||
- --beacon-rpc=beacon-chain.beacon-chain.svc.cluster.local:4000
|
||||
- --port=8000
|
||||
ports:
|
||||
- containerPort: 8000
|
||||
name: http-gateway
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: /healthz
|
||||
port: 8000
|
||||
initialDelaySeconds: 3
|
||||
periodSeconds: 15
|
||||
resources:
|
||||
requests:
|
||||
cpu: "100m"
|
||||
---
|
||||
apiVersion: autoscaling/v2beta1
|
||||
kind: HorizontalPodAutoscaler
|
||||
metadata:
|
||||
name: public-api-gateway
|
||||
namespace: beacon-chain
|
||||
spec:
|
||||
scaleTargetRef:
|
||||
apiVersion: extensions/v1beta1
|
||||
kind: Deployment
|
||||
name: public-api-gateway
|
||||
minReplicas: 1
|
||||
maxReplicas: 10
|
||||
metrics:
|
||||
- type: Resource
|
||||
resource:
|
||||
name: cpu
|
||||
targetAverageUtilization: 80
|
||||
---
|
||||
kind: Service
|
||||
apiVersion: v1
|
||||
metadata:
|
||||
name: public-api-gateway
|
||||
namespace: beacon-chain
|
||||
spec:
|
||||
selector:
|
||||
app: beacon-chain
|
||||
component: public-api-gateway
|
||||
ports:
|
||||
- port: 8000
|
||||
targetPort: 8000
|
||||
name: http
|
||||
type: ClusterIP
|
||||
---
|
||||
kind: Service
|
||||
apiVersion: v1
|
||||
metadata:
|
||||
name: public-api-ui
|
||||
namespace: beacon-chain
|
||||
spec:
|
||||
selector:
|
||||
app: beacon-chain
|
||||
component: public-api-swagger-ui
|
||||
ports:
|
||||
- port: 8080
|
||||
targetPort: 8080
|
||||
name: http
|
||||
type: ClusterIP
|
@ -1,17 +1,37 @@
|
||||
# gazelle:ignore
|
||||
load("@io_bazel_rules_go//go:def.bzl", "go_library")
|
||||
load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library")
|
||||
load("@grpc_ecosystem_grpc_gateway//protoc-gen-swagger:defs.bzl", "protoc_gen_swagger")
|
||||
|
||||
go_proto_library(
|
||||
name = "v1_go_proto",
|
||||
compiler = "//:grpc_proto_compiler",
|
||||
importpath = "github.com/prysmaticlabs/prysm/proto/beacon/rpc/v1",
|
||||
proto = ":v1_proto",
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"//proto/beacon/p2p/v1:go_default_library",
|
||||
"//proto/sharding/p2p/v1:go_default_library",
|
||||
"@go_googleapis//google/api:annotations_go_proto",
|
||||
"@grpc_ecosystem_grpc_gateway//protoc-gen-swagger/options:options_go_proto",
|
||||
],
|
||||
)
|
||||
|
||||
go_proto_library(
|
||||
name = "v1_grpc_gateway_proto",
|
||||
compilers = [
|
||||
"//:grpc_nogogo_proto_compiler",
|
||||
"//:grpc_gateway_proto_compiler",
|
||||
],
|
||||
importpath = "github.com/prysmaticlabs/prysm/proto/beacon/rpc/v1_gateway",
|
||||
proto = ":v1_proto",
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"//proto/beacon/p2p/v1:go_default_library",
|
||||
"//proto/sharding/p2p/v1:go_default_library",
|
||||
"@go_googleapis//google/api:annotations_go_proto",
|
||||
"@grpc_ecosystem_grpc_gateway//protoc-gen-swagger/options:options_go_proto",
|
||||
],
|
||||
compiler = "//:grpc_proto_compiler",
|
||||
)
|
||||
|
||||
go_library(
|
||||
@ -23,12 +43,22 @@ go_library(
|
||||
|
||||
proto_library(
|
||||
name = "v1_proto",
|
||||
srcs = ["services.proto"],
|
||||
srcs = [
|
||||
"services.proto",
|
||||
],
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"//proto/beacon/p2p/v1:v1_proto",
|
||||
"//proto/sharding/p2p/v1:v1_proto",
|
||||
"@com_google_protobuf//:empty_proto",
|
||||
"@com_google_protobuf//:timestamp_proto",
|
||||
"@go_googleapis//google/api:annotations_proto",
|
||||
"@grpc_ecosystem_grpc_gateway//protoc-gen-swagger/options:options_proto",
|
||||
],
|
||||
)
|
||||
|
||||
protoc_gen_swagger(
|
||||
name = "swagger",
|
||||
proto = ":v1_proto",
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
||||
|
270
proto/beacon/rpc/v1/services.pb.go
generated
270
proto/beacon/rpc/v1/services.pb.go
generated
@ -9,7 +9,9 @@ import (
|
||||
fmt "fmt"
|
||||
proto "github.com/gogo/protobuf/proto"
|
||||
types "github.com/gogo/protobuf/types"
|
||||
_ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options"
|
||||
v1 "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
|
||||
_ "google.golang.org/genproto/googleapis/api/annotations"
|
||||
grpc "google.golang.org/grpc"
|
||||
io "io"
|
||||
math "math"
|
||||
@ -1763,130 +1765,150 @@ func init() {
|
||||
func init() { proto.RegisterFile("proto/beacon/rpc/v1/services.proto", fileDescriptor_9eb4e94b85965285) }
|
||||
|
||||
var fileDescriptor_9eb4e94b85965285 = []byte{
|
||||
// 1967 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x58, 0x4b, 0x6f, 0xdb, 0xc8,
|
||||
0x1d, 0x5f, 0xca, 0xb2, 0x23, 0xff, 0x25, 0x5b, 0xf4, 0xf8, 0x21, 0x45, 0xce, 0xc3, 0xcb, 0x05,
|
||||
0x1a, 0x27, 0x68, 0xe4, 0x44, 0x59, 0x64, 0x77, 0x13, 0x04, 0x5b, 0xc9, 0x96, 0x13, 0x75, 0x0d,
|
||||
0xc5, 0xa1, 0xb4, 0x4e, 0x5b, 0x14, 0x20, 0x46, 0xd2, 0x58, 0x66, 0x2d, 0x71, 0x18, 0x72, 0x64,
|
||||
0xc4, 0x97, 0x2d, 0x7a, 0x2c, 0x7a, 0xeb, 0x07, 0x68, 0xbf, 0x44, 0x8b, 0x9e, 0x7b, 0xeb, 0xb1,
|
||||
0x9f, 0xa0, 0x28, 0x82, 0xa2, 0xbd, 0xf7, 0x13, 0x14, 0xf3, 0x20, 0x45, 0x51, 0xa2, 0x2d, 0xf7,
|
||||
0x46, 0xfe, 0x9f, 0x33, 0xbf, 0xf9, 0xbf, 0x66, 0xc0, 0x70, 0x3d, 0xca, 0xe8, 0x5e, 0x87, 0xe0,
|
||||
0x2e, 0x75, 0xf6, 0x3c, 0xb7, 0xbb, 0x77, 0xf1, 0x74, 0xcf, 0x27, 0xde, 0x85, 0xdd, 0x25, 0x7e,
|
||||
0x59, 0x30, 0xd1, 0x16, 0x61, 0x67, 0xc4, 0x23, 0xa3, 0x61, 0x59, 0x8a, 0x95, 0x3d, 0xb7, 0x5b,
|
||||
0xbe, 0x78, 0x5a, 0xda, 0xee, 0x53, 0xda, 0x1f, 0x90, 0x3d, 0x21, 0xd5, 0x19, 0x9d, 0xee, 0x91,
|
||||
0xa1, 0xcb, 0x2e, 0xa5, 0x52, 0xe9, 0x7e, 0x9c, 0xc9, 0xec, 0x21, 0xf1, 0x19, 0x1e, 0xba, 0x81,
|
||||
0xc0, 0x84, 0x67, 0xb7, 0xe2, 0x72, 0xcf, 0xec, 0xd2, 0x0d, 0xdc, 0x1a, 0xc7, 0xb0, 0x7d, 0x82,
|
||||
0x07, 0x76, 0x0f, 0x33, 0xea, 0x1d, 0x13, 0xef, 0x94, 0x7a, 0x43, 0xec, 0x74, 0x89, 0x49, 0x3e,
|
||||
0x8c, 0x88, 0xcf, 0x10, 0x82, 0xb4, 0x3f, 0xa0, 0xac, 0xa8, 0xed, 0x68, 0xbb, 0x69, 0x53, 0x7c,
|
||||
0xa3, 0xbb, 0x00, 0xee, 0xa8, 0x33, 0xb0, 0xbb, 0xd6, 0x39, 0xb9, 0x2c, 0xa6, 0x76, 0xb4, 0xdd,
|
||||
0x9c, 0xb9, 0x2c, 0x29, 0xdf, 0x91, 0x4b, 0xe3, 0x5f, 0x1a, 0xdc, 0x99, 0x6d, 0xd2, 0x77, 0xa9,
|
||||
0xe3, 0x13, 0x54, 0x84, 0x5b, 0x1d, 0x3c, 0xe0, 0x24, 0x65, 0x36, 0xf8, 0x45, 0x0f, 0x41, 0x67,
|
||||
0x94, 0xe1, 0x81, 0x75, 0x11, 0xe8, 0xfb, 0xc2, 0x7e, 0xda, 0xcc, 0x0b, 0x7a, 0x68, 0xd6, 0x47,
|
||||
0xcf, 0xa1, 0x20, 0x45, 0x71, 0x97, 0xd9, 0x17, 0x24, 0xaa, 0xb1, 0x20, 0x34, 0x36, 0x05, 0xbb,
|
||||
0x2a, 0xb8, 0x11, 0xbd, 0xd7, 0xb0, 0x83, 0x2f, 0x88, 0x87, 0xfb, 0x64, 0x4a, 0xd3, 0x0a, 0x56,
|
||||
0x95, 0xde, 0xd1, 0x76, 0x53, 0xe6, 0x5d, 0x25, 0x17, 0x33, 0x51, 0x93, 0x42, 0xc6, 0x2b, 0x28,
|
||||
0x85, 0x34, 0x21, 0x82, 0x99, 0x4d, 0x9d, 0x00, 0xb7, 0xfb, 0x90, 0x1d, 0x63, 0xe4, 0x17, 0xb5,
|
||||
0x9d, 0x85, 0xdd, 0x9c, 0x09, 0x21, 0x48, 0xbe, 0xf1, 0xc7, 0x54, 0x04, 0xf8, 0xa8, 0xbe, 0x02,
|
||||
0xe9, 0x39, 0x6c, 0x62, 0x49, 0x25, 0x3d, 0x6b, 0xca, 0x54, 0x2d, 0x55, 0xd4, 0xcc, 0xf5, 0x50,
|
||||
0xe0, 0x38, 0xb4, 0x8b, 0x4e, 0x20, 0xe3, 0x33, 0xcc, 0x46, 0x3e, 0xe1, 0xd0, 0x2d, 0xec, 0x66,
|
||||
0x2b, 0x2f, 0xca, 0xb3, 0x23, 0xab, 0x7c, 0x85, 0xfb, 0x72, 0x4b, 0xd8, 0x30, 0x43, 0x5b, 0x25,
|
||||
0x17, 0x96, 0x24, 0x2d, 0x76, 0xfc, 0x5a, 0xec, 0xf8, 0xd1, 0x6b, 0x58, 0x92, 0x4a, 0xe2, 0xe4,
|
||||
0xb2, 0x95, 0xbd, 0x6b, 0xdd, 0x2b, 0x5f, 0xca, 0xb5, 0xa9, 0xd4, 0x8d, 0x17, 0x50, 0xa8, 0x7f,
|
||||
0xb4, 0x19, 0xe9, 0x8d, 0x4f, 0x6f, 0x6e, 0x74, 0x5f, 0x42, 0x71, 0x5a, 0x57, 0x21, 0x7b, 0xad,
|
||||
0x72, 0x0d, 0xb6, 0xaa, 0x8c, 0xf1, 0x34, 0xe2, 0x90, 0x1c, 0x60, 0x86, 0x03, 0xbf, 0x1b, 0xb0,
|
||||
0xe8, 0x9f, 0x61, 0xaf, 0xa7, 0xe2, 0x56, 0xfe, 0x84, 0x39, 0x92, 0x1a, 0xe7, 0x88, 0xf1, 0x29,
|
||||
0x05, 0x85, 0x29, 0x23, 0x6a, 0x01, 0x5f, 0x41, 0x51, 0x22, 0x61, 0x75, 0x06, 0xb4, 0x7b, 0x6e,
|
||||
0x79, 0x94, 0x32, 0xeb, 0x0c, 0xfb, 0x67, 0xcf, 0x2a, 0x0a, 0xce, 0x4d, 0xc9, 0xaf, 0x71, 0xb6,
|
||||
0x49, 0x29, 0x7b, 0x23, 0x98, 0xe8, 0x25, 0x94, 0x88, 0x4b, 0xbb, 0x67, 0x56, 0x87, 0x8e, 0x9c,
|
||||
0x1e, 0xf6, 0x2e, 0x27, 0x54, 0x65, 0x22, 0x16, 0x84, 0x44, 0x4d, 0x09, 0x44, 0x94, 0x1f, 0x40,
|
||||
0xfe, 0x57, 0x23, 0x9f, 0xd9, 0xa7, 0x36, 0xe9, 0x59, 0x42, 0x48, 0x25, 0xca, 0x6a, 0x48, 0xae,
|
||||
0x73, 0x2a, 0x7a, 0x05, 0xdb, 0x63, 0xc1, 0xe9, 0x15, 0xa6, 0x85, 0x9b, 0x62, 0x28, 0x12, 0x5f,
|
||||
0xe4, 0x11, 0xe8, 0x03, 0xcc, 0x37, 0x6e, 0x75, 0x3d, 0xea, 0xfb, 0x03, 0xdb, 0x39, 0x2f, 0x2e,
|
||||
0x8a, 0x48, 0xf8, 0x7c, 0x2a, 0x12, 0xdc, 0x8a, 0xcb, 0x23, 0x61, 0x3f, 0x10, 0x34, 0xf3, 0x52,
|
||||
0x35, 0x24, 0xa0, 0x6d, 0x58, 0x3e, 0x23, 0xb8, 0x67, 0x09, 0x80, 0x97, 0xc4, 0x7a, 0x33, 0x9c,
|
||||
0xd0, 0xe2, 0x20, 0xff, 0x56, 0x83, 0xd2, 0x31, 0x71, 0x7a, 0xb6, 0xd3, 0x8f, 0x60, 0x1d, 0x46,
|
||||
0xc9, 0x4b, 0x28, 0x9d, 0xda, 0x03, 0x46, 0x3c, 0xcb, 0x23, 0xb8, 0x77, 0x69, 0x9d, 0x52, 0xcf,
|
||||
0xb2, 0x9d, 0xee, 0x60, 0xe4, 0xdb, 0xd4, 0x11, 0x48, 0x67, 0xcc, 0x82, 0x94, 0x30, 0xb9, 0xc0,
|
||||
0x21, 0xf5, 0x1a, 0x01, 0x1b, 0x95, 0x61, 0xdd, 0xf5, 0xa8, 0x4b, 0x7d, 0x3c, 0x50, 0x20, 0x44,
|
||||
0xce, 0x78, 0x2d, 0x60, 0x89, 0xcd, 0x8b, 0xb5, 0x8c, 0x60, 0x7b, 0xe6, 0x52, 0xd4, 0x99, 0x9f,
|
||||
0xc0, 0x86, 0x2b, 0xd9, 0x16, 0x8e, 0xf0, 0x45, 0xf4, 0x65, 0x2b, 0x5f, 0x24, 0x21, 0x13, 0xb1,
|
||||
0x65, 0xae, 0xbb, 0xd3, 0xf6, 0x8d, 0x77, 0x80, 0xf6, 0xcf, 0xb0, 0xed, 0xb4, 0x18, 0xf6, 0x58,
|
||||
0xb4, 0xc2, 0xfa, 0x9c, 0x40, 0x7a, 0x6a, 0x9b, 0xc1, 0x2f, 0xfa, 0x1c, 0x72, 0x7d, 0xe2, 0x10,
|
||||
0xdf, 0xf6, 0x2d, 0xde, 0x2a, 0xd4, 0x7e, 0xb2, 0x8a, 0xd6, 0xb6, 0x87, 0xc4, 0xf8, 0x43, 0x0a,
|
||||
0x56, 0x8f, 0xc5, 0xfe, 0x48, 0x34, 0xdf, 0xb0, 0x47, 0x1c, 0x19, 0x04, 0x2a, 0x48, 0x41, 0x92,
|
||||
0xf8, 0xb1, 0x73, 0x01, 0x0e, 0x8f, 0xe5, 0x8c, 0x86, 0x1d, 0xe2, 0x29, 0xab, 0xc0, 0x49, 0x4d,
|
||||
0x41, 0x41, 0x5f, 0xc0, 0x8a, 0x87, 0x9d, 0x1e, 0xa6, 0x96, 0x47, 0x2e, 0x08, 0x1e, 0x88, 0xd8,
|
||||
0xcb, 0x99, 0x39, 0x49, 0x34, 0x05, 0x0d, 0xed, 0xc1, 0x7a, 0x04, 0x1c, 0xab, 0x63, 0xb3, 0x21,
|
||||
0xf6, 0xcf, 0x55, 0xc4, 0xa1, 0x08, 0xab, 0x26, 0x39, 0xe8, 0x05, 0xdc, 0x8e, 0x2a, 0xe0, 0x7e,
|
||||
0xdf, 0x23, 0x7d, 0xcc, 0x88, 0xe5, 0xdb, 0xfd, 0xe2, 0xe2, 0xce, 0xc2, 0x6e, 0xda, 0x2c, 0x44,
|
||||
0x04, 0xaa, 0x01, 0xbf, 0x65, 0xf7, 0xd1, 0xd7, 0xb0, 0x1c, 0x36, 0x4b, 0x11, 0x59, 0xd9, 0x4a,
|
||||
0xa9, 0x2c, 0xdb, 0x69, 0x39, 0x68, 0xa7, 0xe5, 0x76, 0x20, 0x61, 0x8e, 0x85, 0x8d, 0x57, 0x90,
|
||||
0x0f, 0xf1, 0x51, 0x80, 0x3f, 0x82, 0xb5, 0xa4, 0x5c, 0xce, 0x77, 0x26, 0x13, 0xc4, 0xf8, 0x0a,
|
||||
0x36, 0x94, 0xba, 0xd7, 0x70, 0x7a, 0xe4, 0x63, 0x04, 0xe4, 0x28, 0x86, 0x5a, 0x1c, 0x43, 0xe3,
|
||||
0x31, 0x6c, 0xc6, 0x14, 0x95, 0xf7, 0x0d, 0x58, 0xb4, 0x39, 0x21, 0x28, 0x4b, 0xe2, 0xc7, 0xa8,
|
||||
0xc0, 0x1a, 0xaf, 0xac, 0x84, 0xbb, 0x0e, 0x45, 0xef, 0x02, 0x70, 0x30, 0x88, 0x58, 0x68, 0x50,
|
||||
0xbc, 0xfd, 0x40, 0xcc, 0x78, 0x09, 0xab, 0x32, 0xbc, 0x42, 0x85, 0x87, 0xa0, 0x47, 0x21, 0x8e,
|
||||
0x9c, 0x7f, 0x3e, 0x42, 0xe7, 0x5b, 0x33, 0x9e, 0xc3, 0x66, 0x58, 0x6e, 0x27, 0x76, 0x76, 0x75,
|
||||
0xc7, 0x30, 0xca, 0xb0, 0x15, 0xd7, 0xbb, 0x72, 0x63, 0x16, 0x6c, 0xef, 0xd3, 0xe1, 0xd0, 0x66,
|
||||
0x8c, 0x90, 0xaa, 0xef, 0xdb, 0x7d, 0x67, 0x48, 0x1c, 0x16, 0x6d, 0x0e, 0xb2, 0x4a, 0x8a, 0x98,
|
||||
0x0f, 0x70, 0x14, 0x24, 0x91, 0x25, 0xf1, 0x06, 0x90, 0x9a, 0x6a, 0x00, 0x04, 0x0a, 0x2a, 0x97,
|
||||
0x0f, 0x88, 0x4b, 0x7d, 0x9b, 0x8d, 0xf3, 0xf8, 0xa7, 0xa0, 0x07, 0x79, 0xdc, 0x53, 0x3c, 0x95,
|
||||
0xc3, 0xf7, 0x93, 0x72, 0x58, 0xd9, 0x30, 0xf3, 0xee, 0xa4, 0x4d, 0xe3, 0x3f, 0xa9, 0x99, 0x1b,
|
||||
0x09, 0x7d, 0xf5, 0x01, 0x70, 0x48, 0x55, 0x5e, 0x5e, 0x27, 0x75, 0xd3, 0x2b, 0x0c, 0xcd, 0xe4,
|
||||
0x45, 0x4c, 0x97, 0xfe, 0xa1, 0xc1, 0xfa, 0x0c, 0x19, 0x74, 0x07, 0x96, 0xbb, 0x01, 0x59, 0xf8,
|
||||
0x4f, 0x9b, 0x63, 0xc2, 0xb8, 0x19, 0xa6, 0x66, 0x35, 0xc3, 0x85, 0xc8, 0xc0, 0x78, 0x1f, 0xb2,
|
||||
0xb6, 0x6f, 0xb9, 0x2a, 0x76, 0x45, 0x3e, 0x67, 0x4c, 0xb0, 0xfd, 0x20, 0x9a, 0x63, 0x01, 0xb2,
|
||||
0x18, 0x1f, 0x29, 0xbe, 0x0d, 0x47, 0x0a, 0x9e, 0xa7, 0xab, 0x95, 0x07, 0xf3, 0x8e, 0x14, 0xc1,
|
||||
0x28, 0xf1, 0x97, 0x14, 0x14, 0x12, 0xc6, 0x8d, 0x88, 0x71, 0xed, 0xff, 0x32, 0x8e, 0xbe, 0x81,
|
||||
0xdb, 0x84, 0x9d, 0x3d, 0x0d, 0xe2, 0x41, 0x75, 0x8b, 0x89, 0x4a, 0xc8, 0x67, 0xfb, 0xa7, 0xea,
|
||||
0xdc, 0x45, 0xcb, 0x50, 0x55, 0xf1, 0x4b, 0xd8, 0x0a, 0xb4, 0xc2, 0xc6, 0x64, 0x45, 0xe0, 0xdb,
|
||||
0x50, 0xdc, 0xb0, 0x2d, 0xf1, 0x56, 0x23, 0x52, 0x32, 0x9c, 0xd8, 0x54, 0x2b, 0x4f, 0xcb, 0x29,
|
||||
0x79, 0x4c, 0x97, 0xbd, 0xfc, 0x5b, 0xb8, 0x23, 0x0c, 0x70, 0x41, 0xdb, 0xb1, 0x22, 0x6a, 0x1f,
|
||||
0x46, 0x64, 0x44, 0x04, 0xd4, 0x69, 0xf3, 0x76, 0x20, 0xd3, 0x70, 0xc6, 0xa3, 0xe0, 0x3b, 0x2e,
|
||||
0x60, 0xbc, 0x03, 0xbd, 0xce, 0xd7, 0x1e, 0x9d, 0x5f, 0x5e, 0xc1, 0xb2, 0xdc, 0x30, 0x66, 0x58,
|
||||
0x80, 0x96, 0xad, 0xec, 0x24, 0x05, 0x7f, 0xa8, 0x9c, 0x21, 0xea, 0xcb, 0xf8, 0x7d, 0x0a, 0xd6,
|
||||
0x04, 0x08, 0x6d, 0x8f, 0x8c, 0x2b, 0xe8, 0x21, 0xa4, 0x99, 0xa7, 0xc2, 0x2c, 0x5b, 0xa9, 0x24,
|
||||
0x1d, 0xc2, 0x94, 0x62, 0x99, 0xff, 0x34, 0x69, 0x8f, 0x98, 0x42, 0xbf, 0xf4, 0x27, 0x0d, 0x32,
|
||||
0x01, 0x09, 0x7d, 0x03, 0x8b, 0xe2, 0x34, 0xd4, 0x2a, 0x13, 0xdb, 0x6c, 0x2d, 0x32, 0x6e, 0x49,
|
||||
0x0d, 0x1e, 0x92, 0xe3, 0x8a, 0x1e, 0x5c, 0x72, 0xc2, 0x52, 0x8e, 0x1e, 0x03, 0x72, 0xb1, 0xc7,
|
||||
0xec, 0xae, 0xed, 0x8a, 0x09, 0xfd, 0x82, 0x32, 0x12, 0xdc, 0x3c, 0xd6, 0xa2, 0x9c, 0x13, 0xce,
|
||||
0xe0, 0x19, 0xa0, 0x2e, 0x36, 0x42, 0x4e, 0x9e, 0x16, 0xc8, 0x3b, 0x0d, 0xa7, 0x18, 0x47, 0xb0,
|
||||
0xc1, 0x57, 0x1d, 0xce, 0x13, 0x41, 0x31, 0xdb, 0x86, 0x65, 0xd1, 0x14, 0x4e, 0x3d, 0x3a, 0x54,
|
||||
0xa5, 0x2c, 0xc3, 0x09, 0x87, 0x1e, 0x1d, 0xa2, 0x02, 0xdc, 0x12, 0x4c, 0x46, 0x55, 0x9c, 0x2d,
|
||||
0xf1, 0xdf, 0x36, 0x7d, 0xf4, 0x35, 0xac, 0x84, 0xd1, 0x6a, 0xd2, 0x01, 0x41, 0x59, 0xb8, 0xf5,
|
||||
0x7d, 0xf3, 0xbb, 0xe6, 0xdb, 0xf7, 0x4d, 0xfd, 0x33, 0x94, 0x83, 0x4c, 0xb5, 0xdd, 0xae, 0xb7,
|
||||
0xda, 0x75, 0x53, 0xd7, 0xf8, 0xdf, 0xb1, 0xf9, 0xf6, 0xf8, 0x6d, 0xab, 0x6e, 0xea, 0xa9, 0x47,
|
||||
0xbf, 0xd3, 0x20, 0x1f, 0x0b, 0x74, 0x84, 0x60, 0x55, 0x29, 0x5b, 0xad, 0x76, 0xb5, 0xfd, 0x7d,
|
||||
0x4b, 0xff, 0x8c, 0xd3, 0x8e, 0xeb, 0xcd, 0x83, 0x46, 0xf3, 0xb5, 0x55, 0xdd, 0x6f, 0x37, 0x4e,
|
||||
0xea, 0xba, 0x86, 0x00, 0x96, 0xd4, 0x77, 0x8a, 0xf3, 0x1b, 0xcd, 0x46, 0xbb, 0x51, 0x6d, 0xd7,
|
||||
0x0f, 0xac, 0xfa, 0xcf, 0x1a, 0x6d, 0x7d, 0x01, 0xe9, 0x90, 0x7b, 0xdf, 0x68, 0xbf, 0x39, 0x30,
|
||||
0xab, 0xef, 0xab, 0xb5, 0xa3, 0xba, 0x9e, 0xe6, 0x1a, 0x9c, 0x57, 0x3f, 0xd0, 0x17, 0xb9, 0x86,
|
||||
0xfc, 0xb6, 0x5a, 0x47, 0xd5, 0xd6, 0x9b, 0xfa, 0x81, 0xbe, 0x54, 0xf9, 0xf3, 0x22, 0xac, 0xc8,
|
||||
0xb3, 0x69, 0xc9, 0xcb, 0x32, 0xfa, 0x39, 0xac, 0xbd, 0xc7, 0x36, 0x3b, 0xa4, 0xde, 0x78, 0xec,
|
||||
0x41, 0x5b, 0x53, 0x7d, 0xbb, 0xce, 0xef, 0xc8, 0xa5, 0x47, 0x89, 0xc5, 0x72, 0x6a, 0x64, 0x7a,
|
||||
0xa2, 0xa1, 0x23, 0x58, 0xd9, 0xc7, 0x0e, 0x75, 0xec, 0x2e, 0x1e, 0xbc, 0x21, 0xb8, 0x97, 0x68,
|
||||
0x76, 0x9e, 0x30, 0x42, 0x26, 0xac, 0x1d, 0x89, 0x59, 0x36, 0x32, 0xae, 0xdd, 0xdc, 0x62, 0x44,
|
||||
0xf9, 0x89, 0x86, 0x7e, 0x01, 0xf9, 0x58, 0x5f, 0x4a, 0xb4, 0x98, 0x78, 0xeb, 0x4a, 0x6a, 0x6c,
|
||||
0x47, 0x90, 0x09, 0x72, 0x35, 0xd1, 0xe8, 0x6e, 0x92, 0xd1, 0xa9, 0x12, 0xf1, 0x13, 0xc8, 0x1c,
|
||||
0x52, 0xef, 0xfc, 0x4a, 0x6b, 0x77, 0x92, 0x36, 0xcd, 0x35, 0x51, 0x13, 0x96, 0xc3, 0x5c, 0x4f,
|
||||
0x34, 0xf1, 0x70, 0xee, 0x32, 0x81, 0xce, 0x41, 0x0f, 0x89, 0xb5, 0x4b, 0x9e, 0x62, 0x3e, 0xfa,
|
||||
0x71, 0x92, 0xfa, 0xac, 0x54, 0xbc, 0x81, 0xb3, 0xca, 0xbf, 0x35, 0xc8, 0xcb, 0xa3, 0x23, 0xde,
|
||||
0x38, 0x72, 0x41, 0x92, 0x44, 0x6c, 0xcd, 0x73, 0xe2, 0xa5, 0x1f, 0x25, 0x79, 0x8c, 0xcd, 0x68,
|
||||
0x1f, 0x61, 0x33, 0x76, 0xd7, 0xac, 0x32, 0xd1, 0x29, 0xca, 0x57, 0x1b, 0x88, 0xdf, 0x6f, 0x93,
|
||||
0xa3, 0x26, 0xe1, 0x2a, 0x5b, 0xf9, 0xeb, 0x42, 0x38, 0x0b, 0x87, 0x1b, 0x1d, 0xc0, 0xca, 0xc4,
|
||||
0x98, 0x9a, 0x0c, 0xf3, 0xac, 0x31, 0xb8, 0xf4, 0x78, 0x4e, 0x69, 0xb5, 0xf7, 0x1f, 0x60, 0x7d,
|
||||
0xc6, 0xbd, 0x0b, 0x55, 0xae, 0x89, 0xff, 0x19, 0xf7, 0xc5, 0xd2, 0xb3, 0x1b, 0xe9, 0x28, 0xff,
|
||||
0xbf, 0x84, 0x9c, 0x5a, 0x98, 0xcc, 0xfb, 0x79, 0x8a, 0x43, 0xe9, 0xc1, 0x35, 0x7b, 0x0c, 0xad,
|
||||
0x77, 0x40, 0xdf, 0xa7, 0x43, 0x77, 0xc4, 0x48, 0x38, 0xca, 0xcf, 0xe7, 0x21, 0x31, 0x58, 0xa7,
|
||||
0xae, 0x04, 0x95, 0xff, 0x2e, 0x82, 0x3e, 0x2e, 0xf9, 0xea, 0x10, 0x7f, 0x08, 0xeb, 0xec, 0x78,
|
||||
0x22, 0x48, 0x06, 0x35, 0xf9, 0x21, 0x2c, 0x19, 0xd4, 0x2b, 0x5e, 0x9f, 0x9e, 0x68, 0x88, 0xc2,
|
||||
0xea, 0xe4, 0x9d, 0x00, 0x3d, 0xbe, 0xd6, 0xd0, 0x44, 0x18, 0x95, 0xe7, 0x15, 0x57, 0x48, 0xff,
|
||||
0x7a, 0xf6, 0x08, 0xfc, 0xec, 0x06, 0xf3, 0xf6, 0xf5, 0x81, 0x74, 0xd5, 0xb4, 0xff, 0x61, 0xba,
|
||||
0xf1, 0xde, 0x70, 0xcb, 0x37, 0x7d, 0x69, 0x43, 0xbf, 0xd1, 0x60, 0x63, 0xd6, 0x4b, 0x2d, 0xba,
|
||||
0xfe, 0xd0, 0xa6, 0x9f, 0x8a, 0x4b, 0x5f, 0xde, 0x4c, 0x49, 0xad, 0x61, 0x04, 0x7a, 0xfc, 0xa5,
|
||||
0x0e, 0x25, 0x6e, 0x24, 0xe1, 0x3d, 0xb0, 0xf4, 0x64, 0x7e, 0x05, 0xe9, 0xb6, 0x96, 0xfb, 0xdb,
|
||||
0xa7, 0x7b, 0xda, 0xdf, 0x3f, 0xdd, 0xd3, 0xfe, 0xf9, 0xe9, 0x9e, 0xd6, 0x59, 0x12, 0x7d, 0xe5,
|
||||
0xd9, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x2c, 0xec, 0x2c, 0x7e, 0xa8, 0x17, 0x00, 0x00,
|
||||
// 2278 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x59, 0x4d, 0x6f, 0x1b, 0xc7,
|
||||
0xf9, 0xcf, 0x52, 0x94, 0x22, 0x3d, 0x92, 0x45, 0x6a, 0xf4, 0x6a, 0xca, 0x2f, 0x9b, 0xcd, 0x1f,
|
||||
0xb1, 0x2c, 0x44, 0x4b, 0x99, 0x0e, 0x9c, 0x44, 0x86, 0x91, 0x50, 0x12, 0x25, 0x33, 0x11, 0x68,
|
||||
0x79, 0x49, 0xdb, 0xff, 0x16, 0x05, 0xb6, 0xc3, 0xe5, 0x88, 0xdc, 0x88, 0xdc, 0x59, 0xef, 0x0e,
|
||||
0x19, 0xb3, 0x87, 0x14, 0xed, 0xa5, 0x28, 0x7a, 0x73, 0xef, 0xcd, 0x97, 0x28, 0x50, 0xa0, 0xb7,
|
||||
0xde, 0x8a, 0x9e, 0x0a, 0xf4, 0x58, 0xa0, 0x28, 0x8c, 0xa0, 0xbd, 0xf7, 0x13, 0x14, 0x33, 0x3b,
|
||||
0xbb, 0x5c, 0x91, 0x5c, 0x89, 0xea, 0x49, 0xdc, 0xe7, 0x75, 0xe6, 0x37, 0xcf, 0xdb, 0x8c, 0x40,
|
||||
0x73, 0x3d, 0xca, 0x68, 0xbe, 0x4e, 0xb0, 0x45, 0x9d, 0xbc, 0xe7, 0x5a, 0xf9, 0xde, 0x83, 0xbc,
|
||||
0x4f, 0xbc, 0x9e, 0x6d, 0x11, 0x5f, 0x17, 0x4c, 0xb4, 0x46, 0x58, 0x8b, 0x78, 0xa4, 0xdb, 0xd1,
|
||||
0x03, 0x31, 0xdd, 0x73, 0x2d, 0xbd, 0xf7, 0x20, 0xb7, 0xd9, 0xa4, 0xb4, 0xd9, 0x26, 0x79, 0x21,
|
||||
0x55, 0xef, 0x9e, 0xe5, 0x49, 0xc7, 0x65, 0xfd, 0x40, 0x29, 0x77, 0x77, 0x98, 0xc9, 0xec, 0x0e,
|
||||
0xf1, 0x19, 0xee, 0xb8, 0xa1, 0xc0, 0x05, 0xcf, 0x6e, 0xc1, 0xe5, 0x9e, 0x59, 0xdf, 0x0d, 0xdd,
|
||||
0xe6, 0x6e, 0x49, 0x0b, 0xd8, 0xb5, 0xf3, 0xd8, 0x71, 0x28, 0xc3, 0xcc, 0xa6, 0x4e, 0xc8, 0xfd,
|
||||
0x58, 0xfc, 0xb1, 0x76, 0x9a, 0xc4, 0xd9, 0xf1, 0xbf, 0xc5, 0xcd, 0x26, 0xf1, 0xf2, 0xd4, 0x15,
|
||||
0x12, 0xa3, 0xd2, 0xda, 0x29, 0x6c, 0xbe, 0xc4, 0x6d, 0xbb, 0x81, 0x19, 0xf5, 0x4e, 0x89, 0x77,
|
||||
0x46, 0xbd, 0x0e, 0x76, 0x2c, 0x62, 0x90, 0xd7, 0x5d, 0xe2, 0x33, 0x84, 0x20, 0xed, 0xb7, 0x29,
|
||||
0xdb, 0x50, 0x54, 0x65, 0x2b, 0x6d, 0x88, 0xdf, 0xe8, 0x36, 0x80, 0xdb, 0xad, 0xb7, 0x6d, 0xcb,
|
||||
0x3c, 0x27, 0xfd, 0x8d, 0x94, 0xaa, 0x6c, 0x2d, 0x18, 0x73, 0x01, 0xe5, 0x6b, 0xd2, 0xd7, 0x7e,
|
||||
0x50, 0xe0, 0xd6, 0x78, 0x93, 0xbe, 0x4b, 0x1d, 0x9f, 0xa0, 0x0d, 0x78, 0xbf, 0x8e, 0xdb, 0x9c,
|
||||
0x24, 0xcd, 0x86, 0x9f, 0xe8, 0x3e, 0x64, 0x19, 0x65, 0xb8, 0x6d, 0xf6, 0x42, 0x7d, 0x5f, 0xd8,
|
||||
0x4f, 0x1b, 0x19, 0x41, 0x8f, 0xcc, 0xfa, 0xe8, 0x11, 0xac, 0x07, 0xa2, 0xd8, 0x62, 0x76, 0x8f,
|
||||
0xc4, 0x35, 0xa6, 0x84, 0xc6, 0xaa, 0x60, 0x17, 0x05, 0x37, 0xa6, 0x77, 0x0c, 0x2a, 0xee, 0x11,
|
||||
0x0f, 0x37, 0xc9, 0x88, 0xa6, 0x19, 0xae, 0x2a, 0xad, 0x2a, 0x5b, 0x29, 0xe3, 0xb6, 0x94, 0x1b,
|
||||
0x32, 0xb1, 0x1f, 0x08, 0x69, 0x4f, 0x20, 0x17, 0xd1, 0x84, 0x88, 0x80, 0x35, 0xc4, 0xed, 0x2e,
|
||||
0xcc, 0x0f, 0x30, 0xf2, 0x37, 0x14, 0x75, 0x6a, 0x6b, 0xc1, 0x80, 0x08, 0x24, 0x5f, 0xfb, 0x3e,
|
||||
0x15, 0x03, 0x3e, 0xae, 0x2f, 0x41, 0x7a, 0x04, 0xab, 0x38, 0xa0, 0x92, 0x86, 0x39, 0x62, 0x6a,
|
||||
0x3f, 0xb5, 0xa1, 0x18, 0xcb, 0x91, 0xc0, 0x69, 0x64, 0x17, 0xbd, 0x84, 0x59, 0x9f, 0x61, 0xd6,
|
||||
0xf5, 0x09, 0x87, 0x6e, 0x6a, 0x6b, 0xbe, 0xb0, 0xa7, 0x8f, 0x8f, 0x52, 0xfd, 0x12, 0xf7, 0x7a,
|
||||
0x55, 0xd8, 0x30, 0x22, 0x5b, 0x39, 0x17, 0x66, 0x02, 0xda, 0xd0, 0xf1, 0x2b, 0x43, 0xc7, 0x8f,
|
||||
0x8e, 0x61, 0x26, 0x50, 0x12, 0x27, 0x37, 0x5f, 0xc8, 0x5f, 0xe9, 0x5e, 0xfa, 0x92, 0xae, 0x0d,
|
||||
0xa9, 0xae, 0xed, 0xc1, 0x7a, 0xe9, 0x8d, 0xcd, 0x48, 0x63, 0x70, 0x7a, 0x13, 0xa3, 0xfb, 0x18,
|
||||
0x36, 0x46, 0x75, 0x25, 0xb2, 0x57, 0x2a, 0xef, 0xc3, 0x5a, 0x91, 0x31, 0x9e, 0x92, 0x1c, 0x92,
|
||||
0x43, 0xcc, 0x70, 0xe8, 0x77, 0x05, 0xa6, 0xfd, 0x16, 0xf6, 0x1a, 0x32, 0x6e, 0x83, 0x8f, 0x28,
|
||||
0x47, 0x52, 0x83, 0x1c, 0xd1, 0xde, 0xa5, 0x60, 0x7d, 0xc4, 0x88, 0x5c, 0xc0, 0xa7, 0xb0, 0x11,
|
||||
0x20, 0x61, 0xd6, 0xdb, 0xd4, 0x3a, 0x37, 0x3d, 0x4a, 0x99, 0xd9, 0xc2, 0x7e, 0xeb, 0x61, 0x41,
|
||||
0xc2, 0xb9, 0x1a, 0xf0, 0xf7, 0x39, 0xdb, 0xa0, 0x94, 0x3d, 0x15, 0x4c, 0xf4, 0x18, 0x72, 0xc4,
|
||||
0xa5, 0x56, 0xcb, 0xac, 0xd3, 0xae, 0xd3, 0xc0, 0x5e, 0xff, 0x82, 0x6a, 0x90, 0x88, 0xeb, 0x42,
|
||||
0x62, 0x5f, 0x0a, 0xc4, 0x94, 0xef, 0x41, 0xe6, 0x9b, 0xae, 0xcf, 0xec, 0x33, 0x9b, 0x34, 0x4c,
|
||||
0x21, 0x24, 0x13, 0x65, 0x31, 0x22, 0x97, 0x38, 0x15, 0x3d, 0x81, 0xcd, 0x81, 0xe0, 0xe8, 0x0a,
|
||||
0xd3, 0xc2, 0xcd, 0x46, 0x24, 0x32, 0xbc, 0xc8, 0x13, 0xc8, 0xb6, 0x31, 0xdf, 0xb8, 0x69, 0x79,
|
||||
0xd4, 0xf7, 0xdb, 0xb6, 0x73, 0xbe, 0x31, 0x2d, 0x22, 0xe1, 0x83, 0x91, 0x48, 0x70, 0x0b, 0x2e,
|
||||
0x8f, 0x84, 0x83, 0x50, 0xd0, 0xc8, 0x04, 0xaa, 0x11, 0x01, 0x6d, 0xc2, 0x5c, 0x8b, 0xe0, 0x86,
|
||||
0x29, 0x00, 0x9e, 0x11, 0xeb, 0x9d, 0xe5, 0x84, 0x2a, 0x07, 0xf9, 0xd7, 0x0a, 0xe4, 0x4e, 0x89,
|
||||
0xd3, 0xb0, 0x9d, 0x66, 0x0c, 0xeb, 0x28, 0x4a, 0x1e, 0x43, 0xee, 0xcc, 0x6e, 0x33, 0xe2, 0x99,
|
||||
0x1e, 0xc1, 0x8d, 0xbe, 0x79, 0x46, 0x3d, 0xd3, 0x76, 0xac, 0x76, 0xd7, 0xb7, 0xa9, 0x23, 0x90,
|
||||
0x9e, 0x35, 0xd6, 0x03, 0x09, 0x83, 0x0b, 0x1c, 0x51, 0xaf, 0x1c, 0xb2, 0x91, 0x0e, 0xcb, 0xae,
|
||||
0x47, 0x5d, 0xea, 0xe3, 0xb6, 0x04, 0x21, 0x76, 0xc6, 0x4b, 0x21, 0x4b, 0x6c, 0x5e, 0xac, 0xa5,
|
||||
0x0b, 0x9b, 0x63, 0x97, 0x22, 0xcf, 0xfc, 0x25, 0xac, 0xb8, 0x01, 0xdb, 0xc4, 0x31, 0xbe, 0x88,
|
||||
0xbe, 0xf9, 0xc2, 0x87, 0x49, 0xc8, 0xc4, 0x6c, 0x19, 0xcb, 0xee, 0xa8, 0x7d, 0xed, 0x39, 0xa0,
|
||||
0x83, 0x16, 0xb6, 0x9d, 0x2a, 0xc3, 0x1e, 0x8b, 0x57, 0x58, 0x9f, 0x13, 0x48, 0x43, 0x6e, 0x33,
|
||||
0xfc, 0x44, 0x1f, 0xc0, 0x42, 0x93, 0x38, 0xc4, 0xb7, 0x7d, 0x93, 0xb7, 0x1d, 0xb9, 0x9f, 0x79,
|
||||
0x49, 0xab, 0xd9, 0x1d, 0xa2, 0xfd, 0x2e, 0x05, 0x8b, 0xa7, 0x62, 0x7f, 0x24, 0x9e, 0x6f, 0xd8,
|
||||
0x23, 0x4e, 0x10, 0x04, 0x32, 0x48, 0x21, 0x20, 0xf1, 0x63, 0xe7, 0x02, 0x1c, 0x1e, 0xd3, 0xe9,
|
||||
0x76, 0xea, 0xc4, 0x93, 0x56, 0x81, 0x93, 0x2a, 0x82, 0x82, 0x3e, 0x84, 0x1b, 0x1e, 0x76, 0x1a,
|
||||
0x98, 0x9a, 0x1e, 0xe9, 0x11, 0xdc, 0x16, 0xb1, 0xb7, 0x60, 0x2c, 0x04, 0x44, 0x43, 0xd0, 0x50,
|
||||
0x1e, 0x96, 0x63, 0xe0, 0x98, 0x75, 0x9b, 0x75, 0xb0, 0x7f, 0x2e, 0x23, 0x0e, 0xc5, 0x58, 0xfb,
|
||||
0x01, 0x07, 0xed, 0xc1, 0xcd, 0xb8, 0x02, 0x6e, 0x36, 0x3d, 0xd2, 0xc4, 0x8c, 0x98, 0xbe, 0xdd,
|
||||
0xdc, 0x98, 0x56, 0xa7, 0xb6, 0xd2, 0xc6, 0x7a, 0x4c, 0xa0, 0x18, 0xf2, 0xab, 0x76, 0x13, 0x7d,
|
||||
0x06, 0x73, 0x51, 0xe3, 0x15, 0x91, 0x35, 0x5f, 0xc8, 0xe9, 0x41, 0x63, 0xd5, 0xc3, 0xd6, 0xac,
|
||||
0xd7, 0x42, 0x09, 0x63, 0x20, 0xac, 0x3d, 0x81, 0x4c, 0x84, 0x8f, 0x04, 0x7c, 0x1b, 0x96, 0x92,
|
||||
0x72, 0x39, 0x53, 0xbf, 0x98, 0x20, 0xda, 0xa7, 0xb0, 0x22, 0xd5, 0xbd, 0xb2, 0xd3, 0x20, 0x6f,
|
||||
0x62, 0x20, 0xc7, 0x31, 0x54, 0x86, 0x31, 0xd4, 0x76, 0x60, 0x75, 0x48, 0x51, 0x7a, 0x5f, 0x81,
|
||||
0x69, 0x9b, 0x13, 0xc2, 0xb2, 0x24, 0x3e, 0xb4, 0x02, 0x2c, 0xf1, 0xca, 0x4a, 0xb8, 0xeb, 0x48,
|
||||
0xf4, 0x36, 0x00, 0x07, 0x83, 0x88, 0x85, 0x86, 0xc5, 0xdb, 0x0f, 0xc5, 0xb4, 0xc7, 0xb0, 0x18,
|
||||
0x84, 0x57, 0xa4, 0x70, 0x1f, 0xb2, 0x71, 0x88, 0x63, 0xe7, 0x9f, 0x89, 0xd1, 0xf9, 0xd6, 0xb4,
|
||||
0x47, 0xb0, 0x1a, 0x95, 0xdb, 0x0b, 0x3b, 0xbb, 0xbc, 0x63, 0x68, 0x3a, 0xac, 0x0d, 0xeb, 0x5d,
|
||||
0xba, 0x31, 0x13, 0x36, 0x0f, 0x68, 0xa7, 0x63, 0x33, 0x46, 0x48, 0xd1, 0xf7, 0xed, 0xa6, 0xd3,
|
||||
0x21, 0x0e, 0x8b, 0x37, 0x87, 0xa0, 0x4a, 0x8a, 0x98, 0x0f, 0x71, 0x14, 0x24, 0x91, 0x25, 0xc3,
|
||||
0x0d, 0x20, 0x35, 0xd2, 0x00, 0x08, 0xac, 0xcb, 0x5c, 0x3e, 0x24, 0x2e, 0xf5, 0x6d, 0x36, 0xc8,
|
||||
0xe3, 0xaf, 0x20, 0x1b, 0xe6, 0x71, 0x43, 0xf2, 0x64, 0x0e, 0xdf, 0x4d, 0xca, 0x61, 0x69, 0xc3,
|
||||
0xc8, 0xb8, 0x17, 0x6d, 0x6a, 0xff, 0x4e, 0x8d, 0xdd, 0x48, 0xe4, 0xab, 0x09, 0x80, 0x23, 0xaa,
|
||||
0xf4, 0x72, 0x9c, 0xd4, 0x4d, 0x2f, 0x31, 0x34, 0x96, 0x17, 0x33, 0x9d, 0xfb, 0x87, 0x02, 0xcb,
|
||||
0x63, 0x64, 0xd0, 0x2d, 0x98, 0xb3, 0x42, 0xb2, 0xf0, 0x9f, 0x36, 0x06, 0x84, 0x41, 0x33, 0x4c,
|
||||
0x8d, 0x6b, 0x86, 0x53, 0xb1, 0x81, 0xf1, 0x2e, 0xcc, 0xdb, 0xbe, 0xe9, 0xca, 0xd8, 0x15, 0xf9,
|
||||
0x3c, 0x6b, 0x80, 0xed, 0x87, 0xd1, 0x3c, 0x14, 0x20, 0xd3, 0xc3, 0x23, 0xc5, 0x17, 0xd1, 0x48,
|
||||
0xc1, 0xf3, 0x74, 0xb1, 0x70, 0x6f, 0xd2, 0x91, 0x22, 0x1c, 0x25, 0xfe, 0x90, 0x82, 0xf5, 0x84,
|
||||
0x71, 0x23, 0x66, 0x5c, 0xf9, 0x9f, 0x8c, 0xa3, 0xcf, 0xe1, 0x26, 0x61, 0xad, 0x07, 0x61, 0x3c,
|
||||
0xc8, 0x6e, 0x71, 0xa1, 0x12, 0xf2, 0x7b, 0xc2, 0x03, 0x79, 0xee, 0xa2, 0x65, 0xc8, 0xaa, 0xf8,
|
||||
0x09, 0xac, 0x85, 0x5a, 0x51, 0x63, 0x32, 0x63, 0xf0, 0xad, 0x48, 0x6e, 0xd4, 0x96, 0x78, 0xab,
|
||||
0x11, 0x29, 0x19, 0x4d, 0x6c, 0xb2, 0x95, 0xa7, 0x83, 0x29, 0x79, 0x40, 0x0f, 0x7a, 0xf9, 0x17,
|
||||
0x70, 0x4b, 0x18, 0xe0, 0x82, 0xb6, 0x63, 0xc6, 0xd4, 0x5e, 0x77, 0x49, 0x97, 0x08, 0xa8, 0xd3,
|
||||
0xc6, 0xcd, 0x50, 0xa6, 0xec, 0x0c, 0x46, 0xc1, 0xe7, 0x5c, 0x40, 0x7b, 0x0e, 0xd9, 0x12, 0x5f,
|
||||
0x7b, 0x7c, 0x7e, 0x79, 0x02, 0x73, 0xc1, 0x86, 0x31, 0xc3, 0x02, 0xb4, 0xf9, 0x82, 0x9a, 0x14,
|
||||
0xfc, 0x91, 0xf2, 0x2c, 0x91, 0xbf, 0xb4, 0xb7, 0x29, 0x58, 0x12, 0x20, 0xd4, 0x3c, 0x32, 0xa8,
|
||||
0xa0, 0x47, 0x90, 0x66, 0x9e, 0x0c, 0xb3, 0xf9, 0x42, 0x21, 0xe9, 0x10, 0x46, 0x14, 0x75, 0xfe,
|
||||
0x51, 0xa1, 0x0d, 0x62, 0x08, 0xfd, 0xdc, 0xef, 0x15, 0x98, 0x0d, 0x49, 0xe8, 0x73, 0x98, 0x16,
|
||||
0xa7, 0x21, 0x57, 0x99, 0xd8, 0x66, 0xf7, 0x63, 0xe3, 0x56, 0xa0, 0xc1, 0x43, 0x72, 0x50, 0xd1,
|
||||
0xc3, 0x4b, 0x4e, 0x54, 0xca, 0xd1, 0x0e, 0x20, 0x17, 0x7b, 0xcc, 0xb6, 0x6c, 0x57, 0x4c, 0xe8,
|
||||
0x3d, 0xca, 0x48, 0x78, 0xf3, 0x58, 0x8a, 0x73, 0x5e, 0x72, 0x06, 0xcf, 0x00, 0x79, 0xb1, 0x11,
|
||||
0x72, 0xc1, 0x69, 0x41, 0x70, 0xa7, 0xe1, 0x14, 0xed, 0x04, 0x56, 0xf8, 0xaa, 0xa3, 0x79, 0x22,
|
||||
0x2c, 0x66, 0x9b, 0x30, 0x27, 0x9a, 0xc2, 0x99, 0x47, 0x3b, 0xb2, 0x94, 0xcd, 0x72, 0xc2, 0x91,
|
||||
0x47, 0x3b, 0x68, 0x1d, 0xde, 0x17, 0x4c, 0x46, 0x65, 0x9c, 0xcd, 0xf0, 0xcf, 0x1a, 0xdd, 0xfe,
|
||||
0x0c, 0x6e, 0x44, 0xd1, 0x6a, 0xd0, 0x36, 0x41, 0xf3, 0xf0, 0xfe, 0x8b, 0xca, 0xd7, 0x95, 0x67,
|
||||
0xaf, 0x2a, 0xd9, 0xf7, 0xd0, 0x02, 0xcc, 0x16, 0x6b, 0xb5, 0x52, 0xb5, 0x56, 0x32, 0xb2, 0x0a,
|
||||
0xff, 0x3a, 0x35, 0x9e, 0x9d, 0x3e, 0xab, 0x96, 0x8c, 0x6c, 0x6a, 0xfb, 0x37, 0x0a, 0x64, 0x86,
|
||||
0x02, 0x1d, 0x21, 0x58, 0x94, 0xca, 0x66, 0xb5, 0x56, 0xac, 0xbd, 0xa8, 0x66, 0xdf, 0xe3, 0xb4,
|
||||
0xd3, 0x52, 0xe5, 0xb0, 0x5c, 0x39, 0x36, 0x8b, 0x07, 0xb5, 0xf2, 0xcb, 0x52, 0x56, 0x41, 0x00,
|
||||
0x33, 0xf2, 0x77, 0x8a, 0xf3, 0xcb, 0x95, 0x72, 0xad, 0x5c, 0xac, 0x95, 0x0e, 0xcd, 0xd2, 0xff,
|
||||
0x97, 0x6b, 0xd9, 0x29, 0x94, 0x85, 0x85, 0x57, 0xe5, 0xda, 0xd3, 0x43, 0xa3, 0xf8, 0xaa, 0xb8,
|
||||
0x7f, 0x52, 0xca, 0xa6, 0xb9, 0x06, 0xe7, 0x95, 0x0e, 0xb3, 0xd3, 0x5c, 0x23, 0xf8, 0x6d, 0x56,
|
||||
0x4f, 0x8a, 0xd5, 0xa7, 0xa5, 0xc3, 0xec, 0x4c, 0xe1, 0x57, 0x33, 0x70, 0x23, 0x38, 0x9b, 0x6a,
|
||||
0x70, 0xf1, 0x46, 0x3f, 0x82, 0xa5, 0x57, 0xd8, 0x66, 0x47, 0xd4, 0x1b, 0x8c, 0x3d, 0x68, 0x6d,
|
||||
0xa4, 0x6f, 0x97, 0xf8, 0x7d, 0x3b, 0xb7, 0x9d, 0x58, 0x2c, 0x47, 0x46, 0xa6, 0x5d, 0x05, 0x9d,
|
||||
0xc0, 0x8d, 0x03, 0xec, 0x50, 0xc7, 0xb6, 0x70, 0xfb, 0x29, 0xc1, 0x8d, 0x44, 0xb3, 0x93, 0x84,
|
||||
0x11, 0x32, 0x60, 0xe9, 0x44, 0xcc, 0xb2, 0xb1, 0x71, 0xed, 0xfa, 0x16, 0x63, 0xca, 0xbb, 0x0a,
|
||||
0xfa, 0x31, 0x64, 0x86, 0xfa, 0x52, 0xa2, 0xc5, 0xc4, 0x5b, 0x57, 0x52, 0x63, 0x3b, 0x81, 0xd9,
|
||||
0x30, 0x57, 0x13, 0x8d, 0x6e, 0x25, 0x19, 0x1d, 0x29, 0x11, 0x5f, 0xc2, 0xec, 0x11, 0xf5, 0xce,
|
||||
0x2f, 0xb5, 0x76, 0x2b, 0x69, 0xd3, 0x5c, 0x13, 0x7d, 0xaf, 0xc0, 0x5c, 0x94, 0xec, 0x89, 0x36,
|
||||
0xee, 0x4f, 0x5c, 0x27, 0xb4, 0x67, 0x6f, 0x8b, 0xbb, 0x48, 0x3f, 0x22, 0xcc, 0x6a, 0x11, 0x5f,
|
||||
0x15, 0x99, 0xac, 0xf2, 0x8a, 0xa1, 0xfa, 0xb6, 0x63, 0x11, 0xb5, 0x8d, 0x7d, 0xa6, 0x9e, 0xd9,
|
||||
0x0e, 0x6e, 0xdb, 0x3f, 0x23, 0x8d, 0x80, 0xaf, 0xff, 0xf2, 0x6f, 0x3f, 0xfc, 0x36, 0xb5, 0x86,
|
||||
0x56, 0xf2, 0xbd, 0x07, 0xe1, 0x73, 0x8c, 0x60, 0x70, 0x3d, 0x74, 0x0e, 0xd9, 0xc8, 0xcb, 0x7e,
|
||||
0x9f, 0x27, 0xad, 0x8f, 0x3e, 0x4e, 0x5a, 0xcf, 0xb8, 0xe4, 0xbe, 0xc6, 0xea, 0x0b, 0xff, 0x52,
|
||||
0x20, 0x13, 0x04, 0x03, 0xf1, 0x06, 0xb9, 0x00, 0x01, 0x49, 0x44, 0xeb, 0x24, 0x31, 0x94, 0xfb,
|
||||
0x28, 0xc9, 0xe3, 0xd0, 0xd4, 0xf7, 0x06, 0x56, 0x87, 0x6e, 0xaf, 0x45, 0x26, 0x7a, 0x8f, 0x7e,
|
||||
0xb9, 0x81, 0xe1, 0x1b, 0x73, 0x72, 0x1c, 0x26, 0x5c, 0x8e, 0x0b, 0x7f, 0x9a, 0x8a, 0xa6, 0xeb,
|
||||
0x68, 0xa3, 0x6d, 0xb8, 0x71, 0x61, 0xf0, 0x4d, 0x86, 0x79, 0xdc, 0x60, 0x9d, 0xdb, 0x99, 0x50,
|
||||
0x5a, 0xee, 0xfd, 0x3b, 0x58, 0x1e, 0x73, 0x93, 0x43, 0x85, 0x2b, 0x32, 0x6a, 0xcc, 0x0d, 0x34,
|
||||
0xf7, 0xf0, 0x5a, 0x3a, 0xd2, 0xff, 0x4f, 0x60, 0x41, 0x2e, 0x2c, 0xa8, 0x24, 0x93, 0x94, 0x9b,
|
||||
0xdc, 0xbd, 0x2b, 0xf6, 0x18, 0x59, 0xaf, 0x43, 0xf6, 0x80, 0x76, 0xdc, 0x2e, 0x23, 0xd1, 0xe5,
|
||||
0x60, 0x32, 0x0f, 0x89, 0xc1, 0x3a, 0x72, 0xc9, 0x28, 0xfc, 0x67, 0x1a, 0xb2, 0x83, 0x26, 0x22,
|
||||
0x0f, 0xf1, 0xbb, 0xa8, 0x72, 0x0f, 0x66, 0x8c, 0x64, 0x50, 0x93, 0x9f, 0xd6, 0x92, 0x41, 0xbd,
|
||||
0xe4, 0x3d, 0x6b, 0x57, 0x41, 0x14, 0x16, 0x2f, 0xde, 0x32, 0xd0, 0xce, 0x95, 0x86, 0x2e, 0x84,
|
||||
0x91, 0x3e, 0xa9, 0xb8, 0x44, 0xfa, 0xe7, 0xe3, 0x87, 0xea, 0x87, 0xd7, 0x98, 0xe0, 0xaf, 0x0e,
|
||||
0xa4, 0xcb, 0xee, 0x0f, 0xaf, 0x47, 0x5b, 0xf9, 0x35, 0xb7, 0x7c, 0xdd, 0xb7, 0x3b, 0xf4, 0x0b,
|
||||
0x05, 0x56, 0xc6, 0xbd, 0xfd, 0xa2, 0xab, 0x0f, 0x6d, 0xf4, 0xf1, 0x39, 0xf7, 0xc9, 0xf5, 0x94,
|
||||
0xe4, 0x1a, 0xba, 0x90, 0x1d, 0x7e, 0xfb, 0x43, 0x89, 0x1b, 0x49, 0x78, 0x61, 0xcc, 0xed, 0x4e,
|
||||
0xae, 0x10, 0xb8, 0xdd, 0xff, 0xcb, 0xd4, 0xdb, 0xe2, 0x1f, 0xa7, 0xd0, 0xdf, 0x15, 0x98, 0x3e,
|
||||
0xf5, 0xfa, 0x7e, 0x07, 0xfd, 0xdf, 0x57, 0xd5, 0x67, 0x15, 0xd5, 0x38, 0x3d, 0x50, 0xc3, 0xff,
|
||||
0x1a, 0xa8, 0xae, 0x47, 0x7b, 0x76, 0x83, 0xb7, 0x97, 0xbe, 0x2a, 0x84, 0x74, 0xed, 0x00, 0x16,
|
||||
0xc5, 0x2f, 0xcc, 0x6c, 0x4b, 0x3d, 0xc1, 0x75, 0x1f, 0xdd, 0x6c, 0x31, 0xe6, 0xfa, 0x7b, 0xf9,
|
||||
0xbc, 0x1b, 0xd2, 0xdb, 0xb8, 0xee, 0xeb, 0x16, 0xed, 0xe4, 0xd6, 0x18, 0xc1, 0x9d, 0x2f, 0x47,
|
||||
0xe8, 0xdb, 0x3f, 0x85, 0xbb, 0xc7, 0x95, 0x17, 0xea, 0x31, 0x71, 0x88, 0x87, 0xdb, 0x6a, 0xf0,
|
||||
0x1c, 0xac, 0x9e, 0xd8, 0x16, 0x71, 0x7c, 0xa2, 0xf6, 0x1e, 0xea, 0xbb, 0xe8, 0x49, 0x68, 0xb5,
|
||||
0x69, 0xb3, 0x56, 0xb7, 0xce, 0xd5, 0x2e, 0x3a, 0x08, 0xbe, 0x78, 0x7f, 0xab, 0xe7, 0x3b, 0x98,
|
||||
0xf7, 0x99, 0xfc, 0x49, 0xf9, 0xa0, 0x54, 0xa9, 0x96, 0xf4, 0x4e, 0xa3, 0x30, 0xbd, 0xab, 0xef,
|
||||
0xea, 0xbb, 0xb9, 0x0c, 0x76, 0x6d, 0xdd, 0xf5, 0xfa, 0xc2, 0xb3, 0x43, 0xd8, 0xb6, 0x92, 0x2a,
|
||||
0x64, 0xb1, 0xeb, 0xb6, 0x6d, 0x4b, 0xe4, 0x5b, 0xfe, 0x1b, 0x9f, 0x3a, 0x85, 0x9b, 0x71, 0x4a,
|
||||
0xd3, 0x73, 0xad, 0x9d, 0x6f, 0x49, 0x7d, 0x87, 0x91, 0x37, 0x2c, 0x81, 0x75, 0x89, 0x16, 0x67,
|
||||
0xed, 0x8d, 0xb8, 0xd8, 0x4b, 0x76, 0xe1, 0x3d, 0xe2, 0xf5, 0xb3, 0xef, 0x77, 0xd4, 0x63, 0xb1,
|
||||
0x53, 0xf4, 0xd1, 0x64, 0x3b, 0xff, 0xf3, 0xbb, 0x3b, 0xca, 0x5f, 0xdf, 0xdd, 0x51, 0xfe, 0xf9,
|
||||
0xee, 0x8e, 0x52, 0x9f, 0x11, 0x73, 0xc6, 0xc3, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0xe7, 0x36,
|
||||
0x39, 0x4a, 0x05, 0x1a, 0x00, 0x00,
|
||||
}
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
|
@ -5,6 +5,38 @@ package ethereum.beacon.rpc.v1;
|
||||
import "google/protobuf/empty.proto";
|
||||
import "google/protobuf/timestamp.proto";
|
||||
import "proto/beacon/p2p/v1/types.proto";
|
||||
import "google/api/annotations.proto";
|
||||
import "protoc-gen-swagger/options/annotations.proto";
|
||||
|
||||
option (grpc.gateway.protoc_gen_swagger.options.openapiv2_swagger) = {
|
||||
info: {
|
||||
title: "Prysm";
|
||||
version: "0.0.0";
|
||||
contact: {
|
||||
name: "Prysmatic Labs";
|
||||
url: "https://prysmaticlabs.com";
|
||||
email: "team@prysmaticlabs.com";
|
||||
};
|
||||
license: {
|
||||
name: "GNU General Public License v3.0";
|
||||
url: "https://github.com/prysmaticlabs/prysm/blob/master/LICENSE.md";
|
||||
};
|
||||
description: "JSON RPC services provided by Prysm."
|
||||
};
|
||||
external_docs: {
|
||||
url: "https://github.com/prysmaticlabs/prysm";
|
||||
description : "Prysm Github";
|
||||
};
|
||||
host: "api.prylabs.net",
|
||||
schemes: HTTPS;
|
||||
consumes: "application/json";
|
||||
consumes: "application/grpc-web-text";
|
||||
consumes: "application/grpc-web-json";
|
||||
produces: "application/json";
|
||||
produces: "application/grpc-web-text";
|
||||
consumes: "application/grpc-web-json";
|
||||
};
|
||||
|
||||
|
||||
service BeaconService {
|
||||
rpc WaitForChainStart(google.protobuf.Empty) returns (stream ChainStartResponse);
|
||||
@ -15,7 +47,14 @@ service BeaconService {
|
||||
rpc PendingDeposits(google.protobuf.Empty) returns (PendingDepositsResponse);
|
||||
rpc Eth1Data(google.protobuf.Empty) returns (Eth1DataResponse);
|
||||
rpc ForkData(google.protobuf.Empty) returns (ethereum.beacon.p2p.v1.Fork);
|
||||
rpc BlockTree(google.protobuf.Empty) returns (BlockTreeResponse);
|
||||
rpc BlockTree(google.protobuf.Empty) returns (BlockTreeResponse) {
|
||||
option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = {
|
||||
summary: "Fetches block tree since last finalized block.";
|
||||
};
|
||||
option (google.api.http) = {
|
||||
get: "/v1/beacon/blocktree";
|
||||
};
|
||||
}
|
||||
rpc BlockTreeBySlots(TreeBlockSlotRequest) returns (BlockTreeResponse);
|
||||
}
|
||||
|
||||
@ -201,4 +240,4 @@ enum ValidatorStatus {
|
||||
message TreeBlockSlotRequest {
|
||||
uint64 slot_from = 1 ;
|
||||
uint64 slot_to = 2 ;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user