diff --git a/cache/redis/client.go b/cache/redis/client.go
index 5c48b5e..40bae91 100644
--- a/cache/redis/client.go
+++ b/cache/redis/client.go
@@ -6,6 +6,7 @@
 
 import (
 	"context"
+	"errors"
 	"fmt"
 	"net"
 	"os"
@@ -29,7 +30,7 @@
 	host := os.Getenv("REDISHOST")
 	port := os.Getenv("REDISPORT")
 	if host == "" {
-		return "", fmt.Errorf("no REDISHOST environment")
+		return "", errors.New("no REDISHOST environment")
 	}
 	if port == "" {
 		port = "6379" // redis default port
diff --git a/cmd/auth_server/main.go b/cmd/auth_server/main.go
index f04157e..e152ae0 100644
--- a/cmd/auth_server/main.go
+++ b/cmd/auth_server/main.go
@@ -14,7 +14,7 @@
 	"flag"
 	"path/filepath"
 
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 
 	"go.opencensus.io/plugin/ocgrpc"
 	"go.opencensus.io/stats"
diff --git a/cmd/exec_server/main.go b/cmd/exec_server/main.go
index 87f65bd..1ee2ff3 100644
--- a/cmd/exec_server/main.go
+++ b/cmd/exec_server/main.go
@@ -11,6 +11,7 @@
 import (
 	"context"
 	"crypto/tls"
+	"errors"
 	"flag"
 	"fmt"
 	"io"
@@ -19,7 +20,7 @@
 	"path"
 	"time"
 
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 
 	"cloud.google.com/go/pubsub"
 	"cloud.google.com/go/storage"
@@ -184,7 +185,7 @@
 	if *pubsubProjectID == "" {
 		*pubsubProjectID = server.ProjectID(ctx)
 		if *pubsubProjectID == "" {
-			return nil, fmt.Errorf("--pubsub-project-id must be set")
+			return nil, errors.New("--pubsub-project-id must be set")
 		}
 	}
 	var err error
diff --git a/cmd/goma_replay/main.go b/cmd/goma_replay/main.go
index 06567ae..7867666 100644
--- a/cmd/goma_replay/main.go
+++ b/cmd/goma_replay/main.go
@@ -20,11 +20,14 @@
 	"io/ioutil"
 	"net/http"
 	"os"
+	"os/signal"
 	"os/user"
 	"path/filepath"
 	"strconv"
 	"strings"
 	"sync"
+	"sync/atomic"
+	"syscall"
 	"time"
 
 	"github.com/golang/protobuf/proto"
@@ -40,8 +43,9 @@
 var (
 	dataSourceDir = flag.String("data_source_dir", gomaTmpDir(), "data source directory")
 
-	repeat = flag.Int("n", 1, "N repeat request")
-	limit  = flag.Int("l", 1, "limit at most N request")
+	repeat  = flag.Int("n", 1, "N repeat request")
+	limit   = flag.Int("l", 1, "limit at most N request")
+	buildID = flag.String("build_id", "", "overrides build_id")
 
 	asInternal = flag.Bool("as_internal", true, "use oauth2 for internal client")
 	verbose    = flag.Bool("v", false, "verbose flag")
@@ -87,8 +91,12 @@
 			return fmt.Errorf("%s: %v", path, err)
 		}
 		clearInputs(req)
+		if *buildID != "" {
+			req.GetRequesterInfo().BuildId = proto.String(*buildID)
+		}
 		reqs = append(reqs, req)
-		fmt.Println("use ", path)
+		fmt.Printf("req[%d]=%s\n", len(reqs)-1, path)
+		logger.Debugf("req[%d]=%s", len(reqs)-1, req)
 		return nil
 	})
 	logger.Infof("loaded %d req(s): err=%v", len(reqs), err)
@@ -258,34 +266,101 @@
 	if err != nil {
 		fatalf("request data: %v", err)
 	}
+	if *buildID != "" {
+		fmt.Println("build_id:", *buildID)
+	}
+
+	sigch := make(chan os.Signal, 1)
+	signal.Notify(sigch, syscall.SIGTERM, syscall.SIGINT)
+	ctx, cancel := context.WithCancel(ctx)
+	defer cancel()
+	go func() {
+		for {
+			<-sigch
+			fmt.Println("interrupted")
+			if ctx.Err() != nil {
+				fmt.Println("interrupted again. exiting...")
+				os.Exit(1)
+			}
+			cancel()
+		}
+	}()
 
 	t0 := time.Now()
 	var wg sync.WaitGroup
-	sema := make(chan bool, *limit)
-	for i, req := range reqs {
-		for j := 0; j < *repeat; j++ {
-			wg.Add(1)
-			go func(i int, req *gomapb.ExecReq) {
-				defer wg.Done()
+	nreq, nrep := len(reqs), *repeat
+	// atomic counters
+	var (
+		running, finished int32
+		httpErrors        int32
+		gomaExecErrors    int32
+		gomaMissingInputs int32
+		gomaOtherErrors   int32
+	)
+	wg.Add(1)
+	go func() {
+		defer wg.Done()
+		sema := make(chan bool, *limit)
+	Loop:
+		for i, req := range reqs {
+			for j := 0; j < *repeat; j++ {
+				if ctx.Err() != nil {
+					nreq = i
+					nrep = j
+					break Loop
+				}
+				wg.Add(1)
 				sema <- true
-				defer func() {
-					<-sema
-				}()
-				resp := &gomapb.ExecResp{}
-				t := time.Now()
-				err = httprpc.Call(ctx, c, targ.String(), req, resp)
-				if err != nil {
-					errorf("req[%d] %v", i, err)
-				}
-				if e := resp.GetError(); e != gomapb.ExecResp_OK {
-					errorf("req[%d] ExecError %s", e)
-					logger.Debugf("%s", resp)
-				}
-
-				logger.Infof("req[%d] %s %s", i, resp.GetError(), time.Since(t))
-			}(i, req)
+				go func(i, j int, req *gomapb.ExecReq) {
+					defer wg.Done()
+					defer func() {
+						atomic.AddInt32(&running, -1)
+						atomic.AddInt32(&finished, 1)
+						<-sema
+					}()
+					atomic.AddInt32(&running, 1)
+					resp := &gomapb.ExecResp{}
+					t := time.Now()
+					err = httprpc.Call(ctx, c, targ.String(), req, resp)
+					if err != nil {
+						if ctx.Err() != nil {
+							return
+						}
+						atomic.AddInt32(&httpErrors, 1)
+						errorf("req[%d]%d %v", i, j, err)
+					}
+					if e := resp.GetError(); e != gomapb.ExecResp_OK {
+						atomic.AddInt32(&gomaExecErrors, 1)
+						errorf("req[%d]%d ExecError %s %s", i, j, e, time.Since(t))
+						logger.Debugf("%s", resp)
+					}
+					if len(resp.MissingInput) > 0 {
+						atomic.AddInt32(&gomaMissingInputs, 1)
+						errorf("req[%d]%d missing inputs=%d %s", i, j, len(resp.MissingInput), time.Since(t))
+					}
+					if len(resp.ErrorMessage) > 0 {
+						atomic.AddInt32(&gomaOtherErrors, 1)
+						errorf("req[%d]%d error %q %s", i, j, resp.ErrorMessage, time.Since(t))
+					}
+					logger.Infof("req[%d]%d %s %s", i, j, resp.GetError(), time.Since(t))
+				}(i, j, req)
+				fmt.Printf("req[%d]%d/%d %d/%d error %d/%d/%d/%d %s\r", i, j, *repeat,
+					atomic.LoadInt32(&running),
+					atomic.LoadInt32(&finished),
+					atomic.LoadInt32(&httpErrors),
+					atomic.LoadInt32(&gomaExecErrors),
+					atomic.LoadInt32(&gomaMissingInputs),
+					atomic.LoadInt32(&gomaOtherErrors),
+					time.Since(t0))
+			}
 		}
-	}
+	}()
 	wg.Wait()
-	fmt.Printf("%s %d reqs * %d (limit:%d) in %s\n", targ, len(reqs), *repeat, *limit, time.Since(t0))
+	fmt.Printf("%s %d/%d reqs * %d/%d (limit:%d) finished=%d error http=%d/exec=%d/missing=%d/other=%d in %s\n", targ, nreq, len(reqs), nrep, *repeat, *limit,
+		atomic.LoadInt32(&finished),
+		atomic.LoadInt32(&httpErrors),
+		atomic.LoadInt32(&gomaExecErrors),
+		atomic.LoadInt32(&gomaMissingInputs),
+		atomic.LoadInt32(&gomaOtherErrors),
+		time.Since(t0))
 }
diff --git a/cmd/remoteexec_proxy/main.go b/cmd/remoteexec_proxy/main.go
index 58f6128..395d284 100644
--- a/cmd/remoteexec_proxy/main.go
+++ b/cmd/remoteexec_proxy/main.go
@@ -23,10 +23,12 @@
 	"strings"
 	"time"
 
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 
+	"cloud.google.com/go/storage"
 	"go.opencensus.io/plugin/ocgrpc"
 	"go.opencensus.io/trace"
+	"google.golang.org/api/option"
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/credentials"
 
@@ -34,6 +36,7 @@
 	"go.chromium.org/goma/server/auth/account"
 	"go.chromium.org/goma/server/auth/acl"
 	"go.chromium.org/goma/server/cache"
+	"go.chromium.org/goma/server/cache/gcs"
 	"go.chromium.org/goma/server/cache/redis"
 	"go.chromium.org/goma/server/file"
 	"go.chromium.org/goma/server/frontend"
@@ -60,9 +63,11 @@
 	remoteexecAddr         = flag.String("remoteexec-addr", "", "remoteexec API endpoint")
 	remoteInstanceName     = flag.String("remote-instance-name", "", "remote instance name")
 	whitelistedUsers       = flag.String("whitelisted-users", "", "comma separated list of whitelisted user. if empty, current user is allowed.")
-	serviceAccountJSON     = flag.String("service-account-json", "", "service account json")
+	serviceAccountJSON     = flag.String("service-account-json", "", "service account json, used to talk to RBE and cloud storage (if --file-cache-bucket is used)")
 	platformContainerImage = flag.String("platform-container-image", "", "docker uri of platform container image")
 
+	fileCacheBucket = flag.String("file-cache-bucket", "", "file cache bucking store bucket")
+
 	traceProjectID = flag.String("trace-project-id", "", "project id for cloud tracing")
 	traceFraction  = flag.Float64("trace-sampling-fraction", 1.0, "sampling fraction for stackdriver trace")
 	traceQPS       = flag.Float64("trace-sampling-qps-limit", 1.0, "sampling qps limit for stackdriver trace")
@@ -255,19 +260,36 @@
 		CheckToken: aclCheck.CheckToken,
 	}
 
-	// TODO: support redis for cache?
-	cacheService, err := cache.New(cache.Config{
-		MaxBytes: 1 * 1024 * 1024 * 1024,
-	})
-	if err != nil {
-		logger.Fatal(err)
+	var cclient cachepb.CacheServiceClient
+	if *fileCacheBucket != "" {
+		logger.Infof("use cloud storage bucket: %s", *fileCacheBucket)
+		var opts []option.ClientOption
+		if *serviceAccountJSON != "" {
+			opts = append(opts, option.WithServiceAccountFile(*serviceAccountJSON))
+		}
+		gsclient, err := storage.NewClient(ctx, opts...)
+		if err != nil {
+			logger.Fatalf("storage client failed: %v", err)
+		}
+		defer gsclient.Close()
+		cclient = cache.LocalClient{
+			CacheServiceServer: gcs.New(gsclient.Bucket(*fileCacheBucket)),
+		}
+	} else {
+		cacheService, err := cache.New(cache.Config{
+			MaxBytes: 1 * 1024 * 1024 * 1024,
+		})
+		if err != nil {
+			logger.Fatal(err)
+		}
+		cclient = cacheClient{
+			Service: cacheService,
+		}
 	}
 
 	fileServiceClient := fileClient{
 		Service: &file.Service{
-			Cache: cacheClient{
-				Service: cacheService,
-			},
+			Cache: cclient,
 		},
 	}
 
diff --git a/command/configmap.go b/command/configmap.go
index 4f312c8..4546bb2 100644
--- a/command/configmap.go
+++ b/command/configmap.go
@@ -524,11 +524,11 @@
 func storageReadAll(ctx context.Context, client stiface.Client, bucket, name string) ([]byte, error) {
 	bkt := client.Bucket(bucket)
 	if bkt == nil {
-		return nil, fmt.Errorf("Could not find bucket %s", bucket)
+		return nil, fmt.Errorf("could not find bucket %s", bucket)
 	}
 	obj := bkt.Object(name)
 	if obj == nil {
-		return nil, fmt.Errorf("Could not find object %s/%s", bucket, name)
+		return nil, fmt.Errorf("could not find object %s/%s", bucket, name)
 	}
 	rd, err := obj.NewReader(ctx)
 	if err != nil {
@@ -567,7 +567,7 @@
 
 	bkt := client.Bucket(bucket)
 	if bkt == nil {
-		return nil, fmt.Errorf("Could not find storage bucket %s", bucket)
+		return nil, fmt.Errorf("could not find storage bucket %s", bucket)
 	}
 	iter := bkt.Objects(ctx, &storage.Query{
 		Prefix: obj,
@@ -655,7 +655,7 @@
 
 	bkt := client.Bucket(bucket)
 	if bkt == nil {
-		return nil, fmt.Errorf("Could not find storage bucket %s", bucket)
+		return nil, fmt.Errorf("could not find storage bucket %s", bucket)
 	}
 	iter := bkt.Objects(ctx, &storage.Query{
 		Prefix: obj,
diff --git a/command/descriptor/posixpath/posixpath.go b/command/descriptor/posixpath/posixpath.go
index 3f841bd..16ceeff 100644
--- a/command/descriptor/posixpath/posixpath.go
+++ b/command/descriptor/posixpath/posixpath.go
@@ -14,6 +14,7 @@
 type FilePath struct{}
 
 func (FilePath) IsAbs(path string) bool     { return IsAbs(path) }
+func (FilePath) Base(path string) string    { return Base(path) }
 func (FilePath) Dir(path string) string     { return Dir(path) }
 func (FilePath) Join(elem ...string) string { return Join(elem...) }
 
@@ -23,6 +24,7 @@
 
 func (FilePath) Clean(path string) string       { return Clean(path) }
 func (FilePath) SplitElem(path string) []string { return SplitElem(path) }
+func (FilePath) PathSep() string                { return "/" }
 
 // IsAbs returns true if fname is absolute path.
 func IsAbs(fname string) bool {
diff --git a/command/descriptor/relocate.go b/command/descriptor/relocate.go
index ca60b6b..78a0b00 100644
--- a/command/descriptor/relocate.go
+++ b/command/descriptor/relocate.go
@@ -19,6 +19,10 @@
 	// IsAbs reports whether the path is absolute.
 	IsAbs(path string) bool
 
+	// Base returns the last element of path, typically
+	// the filename.
+	Base(string) string
+
 	// Dir returns all but the last element of path, typically
 	// the path's directory.
 	// Different filepath.Dir, it won't clean "..".
@@ -37,6 +41,9 @@
 
 	// SplitElem splits path by path separator.
 	SplitElem(path string) []string
+
+	// PathSep returns the path separator.
+	PathSep() string
 }
 
 // FilePathOf returns FilePath of path type.
diff --git a/command/descriptor/winpath/winpath.go b/command/descriptor/winpath/winpath.go
index 6330083..32788c3 100644
--- a/command/descriptor/winpath/winpath.go
+++ b/command/descriptor/winpath/winpath.go
@@ -23,6 +23,7 @@
 type FilePath struct{}
 
 func (FilePath) IsAbs(path string) bool     { return IsAbs(path) }
+func (FilePath) Base(path string) string    { return Base(path) }
 func (FilePath) Dir(path string) string     { return Dir(path) }
 func (FilePath) Join(elem ...string) string { return Join(elem...) }
 
@@ -32,6 +33,7 @@
 
 func (FilePath) Clean(path string) string       { return Clean(path) }
 func (FilePath) SplitElem(path string) []string { return SplitElem(path) }
+func (FilePath) PathSep() string                { return `\` }
 
 // IsAbs returns true if fname is absolute path.
 func IsAbs(fname string) bool {
diff --git a/exec/inventory.go b/exec/inventory.go
index f0ff93c..412d764 100644
--- a/exec/inventory.go
+++ b/exec/inventory.go
@@ -6,6 +6,7 @@
 
 import (
 	"context"
+	"errors"
 	"fmt"
 	"net/http"
 	"path/filepath"
@@ -473,7 +474,7 @@
 	if len(dimensions) == 0 {
 		resp.Error = gomapb.ExecResp_BAD_REQUEST.Enum()
 		resp.ErrorMessage = append(resp.ErrorMessage, "No dimensions are specified")
-		return nil, nil, fmt.Errorf("No dimensions are specified")
+		return nil, nil, errors.New("no dimensions are specified")
 	}
 
 	// Select the best possible platform. If there is multiple possible platforms,
@@ -492,10 +493,17 @@
 		return nil, nil, fmt.Errorf("possible platform not found in inventory: dimensions=%v", dimensions)
 	}
 
+	cmdSel, _, err := fromCommandSpec(req.GetCommandSpec())
+	if err != nil {
+		resp.Error = gomapb.ExecResp_BAD_REQUEST.Enum()
+		return nil, nil, fmt.Errorf("normalize %v: %v", req.GetCommandSpec(), err)
+	}
+
 	// Dynamically generate cmdpb.Config here.
 	cfg := &cmdpb.Config{
 		RemoteexecPlatform: matchedConfig.remoteexecPlatform,
 		CmdDescriptor: &cmdpb.CmdDescriptor{
+			Selector: cmdSel.Proto(),
 			Setup: &cmdpb.CmdDescriptor_Setup{
 				PathType: pathTypeFromPathStyle(req.GetRequesterInfo().GetPathStyle()),
 			},
diff --git a/go.mod b/go.mod
index 7d3f5f0..a9a3f47 100644
--- a/go.mod
+++ b/go.mod
@@ -3,8 +3,9 @@
 go 1.12
 
 require (
-	cloud.google.com/go v0.37.4
-	contrib.go.opencensus.io/exporter/stackdriver v0.10.0
+	cloud.google.com/go v0.38.0
+	contrib.go.opencensus.io/exporter/stackdriver v0.11.0
+	github.com/bazelbuild/remote-apis v0.0.0-20190507145712-5556e9c6153f
 	github.com/fsnotify/fsnotify v1.4.7
 	github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef
 	github.com/golang/protobuf v1.3.1
@@ -14,7 +15,7 @@
 	github.com/googleapis/gax-go/v2 v2.0.4
 	github.com/googleapis/google-cloud-go-testing v0.0.0-20190307174402-f55056552511
 	github.com/grpc-ecosystem/go-grpc-middleware v1.0.0
-	go.opencensus.io v0.20.1
+	go.opencensus.io v0.21.0
 	go.uber.org/atomic v1.3.2 // indirect
 	go.uber.org/multierr v1.1.0 // indirect
 	go.uber.org/zap v1.9.1
@@ -22,8 +23,8 @@
 	golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53
 	golang.org/x/oauth2 v0.0.0-20190319182350-c85d3e98c914
 	golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6
-	google.golang.org/api v0.3.2
-	google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107
-	google.golang.org/grpc v1.19.1
+	google.golang.org/api v0.4.0
+	google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873
+	google.golang.org/grpc v1.20.1
 	gopkg.in/yaml.v2 v2.2.2 // indirect
 )
diff --git a/go.sum b/go.sum
index 0b1ee6c..0af150c 100644
--- a/go.sum
+++ b/go.sum
@@ -6,10 +6,15 @@
 cloud.google.com/go v0.37.1/go.mod h1:SAbnLi6YTSPKSI0dTUEOVLCkyPfKXK8n4ibqiMoj4ok=
 cloud.google.com/go v0.37.4 h1:glPeL3BQJsbF6aIIYfZizMwc5LTYz250bDMjttbBGAU=
 cloud.google.com/go v0.37.4/go.mod h1:NHPJ89PdicEuT9hdPXMROBD91xc5uRDxsMtSB16k7hw=
+cloud.google.com/go v0.38.0 h1:ROfEUZz+Gh5pa62DJWXSaonyu3StP6EA6lPEXPI6mCo=
+cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
 contrib.go.opencensus.io/exporter/ocagent v0.4.9 h1:8ZbMXpyd04/3LILa/9Tzr8N4HzZNj6Vb2xsaSuR4nQI=
 contrib.go.opencensus.io/exporter/ocagent v0.4.9/go.mod h1:ueLzZcP7LPhPulEBukGn4aLh7Mx9YJwpVJ9nL2FYltw=
+contrib.go.opencensus.io/exporter/ocagent v0.4.12/go.mod h1:450APlNTSR6FrvC3CTRqYosuDstRB9un7SOx2k/9ckA=
 contrib.go.opencensus.io/exporter/stackdriver v0.10.0 h1:izjZKmiNZ7KynTHN6rZajJNpjbnZyZDRlF38q65Zoj8=
 contrib.go.opencensus.io/exporter/stackdriver v0.10.0/go.mod h1:vZAW3NS0lTrrzGcMndYsNJuJKub+Ta3GnUeKOf69oOE=
+contrib.go.opencensus.io/exporter/stackdriver v0.11.0 h1:PV4m31gF3xT3oFDou7SxUVver/jja9sJ20HeTIGR2nM=
+contrib.go.opencensus.io/exporter/stackdriver v0.11.0/go.mod h1:hA7rlmtavV03FGxzWXAPBUnZeZBhWN/QYQAuMtxc9Bk=
 contrib.go.opencensus.io/resource v0.0.0-20190131005048-21591786a5e0 h1:ICrSnXeuT4427bpR8X9I7GxiyT4X5qgLtFT7m1IjK2c=
 contrib.go.opencensus.io/resource v0.0.0-20190131005048-21591786a5e0/go.mod h1:F361eGI91LCmW1I/Saf+rX0+OFcigGlFvXwEGEnkRLA=
 dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU=
@@ -27,6 +32,8 @@
 github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
 github.com/aws/aws-sdk-go v1.18.6 h1:NuUz/+bi6C5v3BpIXW/VfovfMpvlhl1WUnD0EiDkOwQ=
 github.com/aws/aws-sdk-go v1.18.6/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
+github.com/bazelbuild/remote-apis v0.0.0-20190507145712-5556e9c6153f h1:KLZodm2mQtskynsbHchbt9IIbGrpmBm3/585uCA798M=
+github.com/bazelbuild/remote-apis v0.0.0-20190507145712-5556e9c6153f/go.mod h1:9Y+1FnaNUGVV6wKE0Jdh+mguqDUsyd9uUqokalrC7DQ=
 github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
 github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g=
 github.com/census-instrumentation/opencensus-proto v0.2.0 h1:LzQXZOgg4CQfE6bFvXGM30YZL1WW/M337pXml+GrcZ4=
@@ -39,6 +46,7 @@
 github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
 github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
 github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
+github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g=
 github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
 github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
@@ -47,6 +55,7 @@
 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
 github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
 github.com/gogo/protobuf v1.1.1 h1:72R+M5VuhED/KujmZVcIquuo8mBgX4oVda//DQb3PXo=
 github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
 github.com/gogo/protobuf v1.2.0 h1:xU6/SpYbvkNYiptHJYEDRseDLvYE7wSqhYYNy0QSUzI=
@@ -110,6 +119,7 @@
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=
 github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
 github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4=
 github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
@@ -177,6 +187,9 @@
 go.opencensus.io v0.20.0/go.mod h1:NO/8qkisMZLZ1FCsKNqtJPwc8/TaclWyY0B6wcYNg9M=
 go.opencensus.io v0.20.1 h1:pMEjRZ1M4ebWGikflH7nQpV6+Zr88KBMA2XJD3sbijw=
 go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
+go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
+go.opencensus.io v0.21.0 h1:mU6zScU4U1YAFPHEHYk+3JC4SY7JxgkqS10ZOSyksNg=
+go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
 go.uber.org/atomic v1.3.2 h1:2Oa65PReHzfn29GpvgsYwloV9AVFHPDk8tYxt2c2tr4=
 go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
 go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI=
@@ -198,6 +211,7 @@
 golang.org/x/lint v0.0.0-20181217174547-8f45f776aaf1/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
 golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -245,6 +259,7 @@
 golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
 golang.org/x/tools v0.0.0-20190305160728-f8c04913dfb7/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
 google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
@@ -256,6 +271,8 @@
 google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
 google.golang.org/api v0.3.2 h1:iTp+3yyl/KOtxa/d1/JUE0GGSoR6FuW5udver22iwpw=
 google.golang.org/api v0.3.2/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
+google.golang.org/api v0.4.0 h1:KKgc1aqhV8wDPbDzlDtpvyjZFY3vjz85FP7p4wcQUyI=
+google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
 google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
@@ -271,6 +288,10 @@
 google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107 h1:xtNn7qFlagY2mQNFHMSRPjT2RkOV4OXM7P5TVy9xATo=
 google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7 h1:ZUjXAXmrAyrmmCPHgCA/vChHcpsX27MZ3yBonD/z1KE=
+google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873 h1:nfPFGzJkUDX6uBmpN/pSw7MbOAWegH5QDQuoXFHedLg=
+google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
 google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio=
 google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
@@ -278,6 +299,10 @@
 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 google.golang.org/grpc v1.19.1 h1:TrBcJ1yqAl1G++wO39nD/qtgpsW9/1+QGrluyMGEYgM=
 google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.20.0 h1:DlsSIrgEBuZAUFJcta2B5i/lzeHHbnfkNFAfFXLVFYQ=
+google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM=
+google.golang.org/grpc v1.20.1 h1:Hz2g2wirWK7H0qIIhGIqRGTuMwTE8HEKFnDZZ7lm9NU=
+google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
diff --git a/proto/remote-apis/build/bazel/remote/execution/v2/BUILD b/proto/remote-apis/build/bazel/remote/execution/v2/BUILD
deleted file mode 100644
index cd2b72a..0000000
--- a/proto/remote-apis/build/bazel/remote/execution/v2/BUILD
+++ /dev/null
@@ -1,22 +0,0 @@
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])
-
-proto_library(
-    name = "remote_execution_proto",
-    srcs = ["remote_execution.proto"],
-    deps = [
-        "//build/bazel/semver:semver_proto",
-        "@com_google_protobuf//:duration_proto",
-        "@com_google_protobuf//:timestamp_proto",
-        "@googleapis//:google_api_annotations_proto",
-        "@googleapis//:google_api_http_proto",
-        "@googleapis//:google_longrunning_operations_proto",
-        "@googleapis//:google_rpc_status_proto",
-    ],
-)
-
-java_proto_library(
-    name = "remote_execution_java_proto",
-    deps = [":remote_execution_proto"],
-)
diff --git a/proto/remote-apis/build/bazel/remote/execution/v2/remote_execution.pb.go b/proto/remote-apis/build/bazel/remote/execution/v2/remote_execution.pb.go
deleted file mode 100644
index dba3ca4..0000000
--- a/proto/remote-apis/build/bazel/remote/execution/v2/remote_execution.pb.go
+++ /dev/null
@@ -1,4329 +0,0 @@
-// Code generated by protoc-gen-go. DO NOT EDIT.
-// source: build/bazel/remote/execution/v2/remote_execution.proto
-
-package remoteexecution
-
-import (
-	context "context"
-	fmt "fmt"
-	proto "github.com/golang/protobuf/proto"
-	duration "github.com/golang/protobuf/ptypes/duration"
-	timestamp "github.com/golang/protobuf/ptypes/timestamp"
-	semver "go.chromium.org/goma/server/proto/remote-apis/build/bazel/semver"
-	_ "google.golang.org/genproto/googleapis/api/annotations"
-	longrunning "google.golang.org/genproto/googleapis/longrunning"
-	status "google.golang.org/genproto/googleapis/rpc/status"
-	grpc "google.golang.org/grpc"
-	math "math"
-)
-
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
-
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
-
-// The digest function used for converting values into keys for CAS and Action
-// Cache.
-type DigestFunction int32
-
-const (
-	// It is an error for the server to return this value.
-	DigestFunction_UNKNOWN DigestFunction = 0
-	// The Sha-256 digest function.
-	DigestFunction_SHA256 DigestFunction = 1
-	// The Sha-1 digest function.
-	DigestFunction_SHA1 DigestFunction = 2
-	// The MD5 digest function.
-	DigestFunction_MD5 DigestFunction = 3
-)
-
-var DigestFunction_name = map[int32]string{
-	0: "UNKNOWN",
-	1: "SHA256",
-	2: "SHA1",
-	3: "MD5",
-}
-
-var DigestFunction_value = map[string]int32{
-	"UNKNOWN": 0,
-	"SHA256":  1,
-	"SHA1":    2,
-	"MD5":     3,
-}
-
-func (x DigestFunction) String() string {
-	return proto.EnumName(DigestFunction_name, int32(x))
-}
-
-func (DigestFunction) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{0}
-}
-
-// The current stage of execution.
-type ExecuteOperationMetadata_Stage int32
-
-const (
-	ExecuteOperationMetadata_UNKNOWN ExecuteOperationMetadata_Stage = 0
-	// Checking the result against the cache.
-	ExecuteOperationMetadata_CACHE_CHECK ExecuteOperationMetadata_Stage = 1
-	// Currently idle, awaiting a free machine to execute.
-	ExecuteOperationMetadata_QUEUED ExecuteOperationMetadata_Stage = 2
-	// Currently being executed by a worker.
-	ExecuteOperationMetadata_EXECUTING ExecuteOperationMetadata_Stage = 3
-	// Finished execution.
-	ExecuteOperationMetadata_COMPLETED ExecuteOperationMetadata_Stage = 4
-)
-
-var ExecuteOperationMetadata_Stage_name = map[int32]string{
-	0: "UNKNOWN",
-	1: "CACHE_CHECK",
-	2: "QUEUED",
-	3: "EXECUTING",
-	4: "COMPLETED",
-}
-
-var ExecuteOperationMetadata_Stage_value = map[string]int32{
-	"UNKNOWN":     0,
-	"CACHE_CHECK": 1,
-	"QUEUED":      2,
-	"EXECUTING":   3,
-	"COMPLETED":   4,
-}
-
-func (x ExecuteOperationMetadata_Stage) String() string {
-	return proto.EnumName(ExecuteOperationMetadata_Stage_name, int32(x))
-}
-
-func (ExecuteOperationMetadata_Stage) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{19, 0}
-}
-
-// Describes how the server treats absolute symlink targets.
-type CacheCapabilities_SymlinkAbsolutePathStrategy int32
-
-const (
-	CacheCapabilities_UNKNOWN CacheCapabilities_SymlinkAbsolutePathStrategy = 0
-	// Server will return an `INVALID_ARGUMENT` on input symlinks with absolute
-	// targets.
-	// If an action tries to create an output symlink with an absolute target, a
-	// `FAILED_PRECONDITION` will be returned.
-	CacheCapabilities_DISALLOWED CacheCapabilities_SymlinkAbsolutePathStrategy = 1
-	// Server will allow symlink targets to escape the input root tree, possibly
-	// resulting in non-hermetic builds.
-	CacheCapabilities_ALLOWED CacheCapabilities_SymlinkAbsolutePathStrategy = 2
-)
-
-var CacheCapabilities_SymlinkAbsolutePathStrategy_name = map[int32]string{
-	0: "UNKNOWN",
-	1: "DISALLOWED",
-	2: "ALLOWED",
-}
-
-var CacheCapabilities_SymlinkAbsolutePathStrategy_value = map[string]int32{
-	"UNKNOWN":    0,
-	"DISALLOWED": 1,
-	"ALLOWED":    2,
-}
-
-func (x CacheCapabilities_SymlinkAbsolutePathStrategy) String() string {
-	return proto.EnumName(CacheCapabilities_SymlinkAbsolutePathStrategy_name, int32(x))
-}
-
-func (CacheCapabilities_SymlinkAbsolutePathStrategy) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{35, 0}
-}
-
-// An `Action` captures all the information about an execution which is required
-// to reproduce it.
-//
-// `Action`s are the core component of the [Execution] service. A single
-// `Action` represents a repeatable action that can be performed by the
-// execution service. `Action`s can be succinctly identified by the digest of
-// their wire format encoding and, once an `Action` has been executed, will be
-// cached in the action cache. Future requests can then use the cached result
-// rather than needing to run afresh.
-//
-// When a server completes execution of an
-// [Action][build.bazel.remote.execution.v2.Action], it MAY choose to
-// cache the [result][build.bazel.remote.execution.v2.ActionResult] in
-// the [ActionCache][build.bazel.remote.execution.v2.ActionCache] unless
-// `do_not_cache` is `true`. Clients SHOULD expect the server to do so. By
-// default, future calls to
-// [Execute][build.bazel.remote.execution.v2.Execution.Execute] the same
-// `Action` will also serve their results from the cache. Clients must take care
-// to understand the caching behaviour. Ideally, all `Action`s will be
-// reproducible so that serving a result from cache is always desirable and
-// correct.
-type Action struct {
-	// The digest of the [Command][build.bazel.remote.execution.v2.Command]
-	// to run, which MUST be present in the
-	// [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
-	CommandDigest *Digest `protobuf:"bytes,1,opt,name=command_digest,json=commandDigest,proto3" json:"command_digest,omitempty"`
-	// The digest of the root
-	// [Directory][build.bazel.remote.execution.v2.Directory] for the input
-	// files. The files in the directory tree are available in the correct
-	// location on the build machine before the command is executed. The root
-	// directory, as well as every subdirectory and content blob referred to, MUST
-	// be in the
-	// [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
-	InputRootDigest *Digest `protobuf:"bytes,2,opt,name=input_root_digest,json=inputRootDigest,proto3" json:"input_root_digest,omitempty"`
-	// A timeout after which the execution should be killed. If the timeout is
-	// absent, then the client is specifying that the execution should continue
-	// as long as the server will let it. The server SHOULD impose a timeout if
-	// the client does not specify one, however, if the client does specify a
-	// timeout that is longer than the server's maximum timeout, the server MUST
-	// reject the request.
-	//
-	// The timeout is a part of the
-	// [Action][build.bazel.remote.execution.v2.Action] message, and
-	// therefore two `Actions` with different timeouts are different, even if they
-	// are otherwise identical. This is because, if they were not, running an
-	// `Action` with a lower timeout than is required might result in a cache hit
-	// from an execution run with a longer timeout, hiding the fact that the
-	// timeout is too short. By encoding it directly in the `Action`, a lower
-	// timeout will result in a cache miss and the execution timeout will fail
-	// immediately, rather than whenever the cache entry gets evicted.
-	Timeout *duration.Duration `protobuf:"bytes,6,opt,name=timeout,proto3" json:"timeout,omitempty"`
-	// If true, then the `Action`'s result cannot be cached, and in-flight
-	// requests for the same `Action` may not be merged.
-	DoNotCache           bool     `protobuf:"varint,7,opt,name=do_not_cache,json=doNotCache,proto3" json:"do_not_cache,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *Action) Reset()         { *m = Action{} }
-func (m *Action) String() string { return proto.CompactTextString(m) }
-func (*Action) ProtoMessage()    {}
-func (*Action) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{0}
-}
-
-func (m *Action) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Action.Unmarshal(m, b)
-}
-func (m *Action) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Action.Marshal(b, m, deterministic)
-}
-func (m *Action) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Action.Merge(m, src)
-}
-func (m *Action) XXX_Size() int {
-	return xxx_messageInfo_Action.Size(m)
-}
-func (m *Action) XXX_DiscardUnknown() {
-	xxx_messageInfo_Action.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Action proto.InternalMessageInfo
-
-func (m *Action) GetCommandDigest() *Digest {
-	if m != nil {
-		return m.CommandDigest
-	}
-	return nil
-}
-
-func (m *Action) GetInputRootDigest() *Digest {
-	if m != nil {
-		return m.InputRootDigest
-	}
-	return nil
-}
-
-func (m *Action) GetTimeout() *duration.Duration {
-	if m != nil {
-		return m.Timeout
-	}
-	return nil
-}
-
-func (m *Action) GetDoNotCache() bool {
-	if m != nil {
-		return m.DoNotCache
-	}
-	return false
-}
-
-// A `Command` is the actual command executed by a worker running an
-// [Action][build.bazel.remote.execution.v2.Action] and specifications of its
-// environment.
-//
-// Except as otherwise required, the environment (such as which system
-// libraries or binaries are available, and what filesystems are mounted where)
-// is defined by and specific to the implementation of the remote execution API.
-type Command struct {
-	// The arguments to the command. The first argument must be the path to the
-	// executable, which must be either a relative path, in which case it is
-	// evaluated with respect to the input root, or an absolute path.
-	Arguments []string `protobuf:"bytes,1,rep,name=arguments,proto3" json:"arguments,omitempty"`
-	// The environment variables to set when running the program. The worker may
-	// provide its own default environment variables; these defaults can be
-	// overridden using this field. Additional variables can also be specified.
-	//
-	// In order to ensure that equivalent
-	// [Command][build.bazel.remote.execution.v2.Command]s always hash to the same
-	// value, the environment variables MUST be lexicographically sorted by name.
-	// Sorting of strings is done by code point, equivalently, by the UTF-8 bytes.
-	EnvironmentVariables []*Command_EnvironmentVariable `protobuf:"bytes,2,rep,name=environment_variables,json=environmentVariables,proto3" json:"environment_variables,omitempty"`
-	// A list of the output files that the client expects to retrieve from the
-	// action. Only the listed files, as well as directories listed in
-	// `output_directories`, will be returned to the client as output.
-	// Other files or directories that may be created during command execution
-	// are discarded.
-	//
-	// The paths are relative to the working directory of the action execution.
-	// The paths are specified using a single forward slash (`/`) as a path
-	// separator, even if the execution platform natively uses a different
-	// separator. The path MUST NOT include a trailing slash, nor a leading slash,
-	// being a relative path.
-	//
-	// In order to ensure consistent hashing of the same Action, the output paths
-	// MUST be sorted lexicographically by code point (or, equivalently, by UTF-8
-	// bytes).
-	//
-	// An output file cannot be duplicated, be a parent of another output file, or
-	// have the same path as any of the listed output directories.
-	//
-	// Directories leading up to the output files are created by the worker prior
-	// to execution, even if they are not explicitly part of the input root.
-	OutputFiles []string `protobuf:"bytes,3,rep,name=output_files,json=outputFiles,proto3" json:"output_files,omitempty"`
-	// A list of the output directories that the client expects to retrieve from
-	// the action. Only the listed directories will be returned (an entire
-	// directory structure will be returned as a
-	// [Tree][build.bazel.remote.execution.v2.Tree] message digest, see
-	// [OutputDirectory][build.bazel.remote.execution.v2.OutputDirectory]), as
-	// well as files listed in `output_files`. Other files or directories that
-	// may be created during command execution are discarded.
-	//
-	// The paths are relative to the working directory of the action execution.
-	// The paths are specified using a single forward slash (`/`) as a path
-	// separator, even if the execution platform natively uses a different
-	// separator. The path MUST NOT include a trailing slash, nor a leading slash,
-	// being a relative path. The special value of empty string is allowed,
-	// although not recommended, and can be used to capture the entire working
-	// directory tree, including inputs.
-	//
-	// In order to ensure consistent hashing of the same Action, the output paths
-	// MUST be sorted lexicographically by code point (or, equivalently, by UTF-8
-	// bytes).
-	//
-	// An output directory cannot be duplicated or have the same path as any of
-	// the listed output files.
-	//
-	// Directories leading up to the output directories (but not the output
-	// directories themselves) are created by the worker prior to execution, even
-	// if they are not explicitly part of the input root.
-	OutputDirectories []string `protobuf:"bytes,4,rep,name=output_directories,json=outputDirectories,proto3" json:"output_directories,omitempty"`
-	// The platform requirements for the execution environment. The server MAY
-	// choose to execute the action on any worker satisfying the requirements, so
-	// the client SHOULD ensure that running the action on any such worker will
-	// have the same result.
-	Platform *Platform `protobuf:"bytes,5,opt,name=platform,proto3" json:"platform,omitempty"`
-	// The working directory, relative to the input root, for the command to run
-	// in. It must be a directory which exists in the input tree. If it is left
-	// empty, then the action is run in the input root.
-	WorkingDirectory     string   `protobuf:"bytes,6,opt,name=working_directory,json=workingDirectory,proto3" json:"working_directory,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *Command) Reset()         { *m = Command{} }
-func (m *Command) String() string { return proto.CompactTextString(m) }
-func (*Command) ProtoMessage()    {}
-func (*Command) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{1}
-}
-
-func (m *Command) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Command.Unmarshal(m, b)
-}
-func (m *Command) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Command.Marshal(b, m, deterministic)
-}
-func (m *Command) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Command.Merge(m, src)
-}
-func (m *Command) XXX_Size() int {
-	return xxx_messageInfo_Command.Size(m)
-}
-func (m *Command) XXX_DiscardUnknown() {
-	xxx_messageInfo_Command.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Command proto.InternalMessageInfo
-
-func (m *Command) GetArguments() []string {
-	if m != nil {
-		return m.Arguments
-	}
-	return nil
-}
-
-func (m *Command) GetEnvironmentVariables() []*Command_EnvironmentVariable {
-	if m != nil {
-		return m.EnvironmentVariables
-	}
-	return nil
-}
-
-func (m *Command) GetOutputFiles() []string {
-	if m != nil {
-		return m.OutputFiles
-	}
-	return nil
-}
-
-func (m *Command) GetOutputDirectories() []string {
-	if m != nil {
-		return m.OutputDirectories
-	}
-	return nil
-}
-
-func (m *Command) GetPlatform() *Platform {
-	if m != nil {
-		return m.Platform
-	}
-	return nil
-}
-
-func (m *Command) GetWorkingDirectory() string {
-	if m != nil {
-		return m.WorkingDirectory
-	}
-	return ""
-}
-
-// An `EnvironmentVariable` is one variable to set in the running program's
-// environment.
-type Command_EnvironmentVariable struct {
-	// The variable name.
-	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	// The variable value.
-	Value                string   `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *Command_EnvironmentVariable) Reset()         { *m = Command_EnvironmentVariable{} }
-func (m *Command_EnvironmentVariable) String() string { return proto.CompactTextString(m) }
-func (*Command_EnvironmentVariable) ProtoMessage()    {}
-func (*Command_EnvironmentVariable) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{1, 0}
-}
-
-func (m *Command_EnvironmentVariable) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Command_EnvironmentVariable.Unmarshal(m, b)
-}
-func (m *Command_EnvironmentVariable) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Command_EnvironmentVariable.Marshal(b, m, deterministic)
-}
-func (m *Command_EnvironmentVariable) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Command_EnvironmentVariable.Merge(m, src)
-}
-func (m *Command_EnvironmentVariable) XXX_Size() int {
-	return xxx_messageInfo_Command_EnvironmentVariable.Size(m)
-}
-func (m *Command_EnvironmentVariable) XXX_DiscardUnknown() {
-	xxx_messageInfo_Command_EnvironmentVariable.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Command_EnvironmentVariable proto.InternalMessageInfo
-
-func (m *Command_EnvironmentVariable) GetName() string {
-	if m != nil {
-		return m.Name
-	}
-	return ""
-}
-
-func (m *Command_EnvironmentVariable) GetValue() string {
-	if m != nil {
-		return m.Value
-	}
-	return ""
-}
-
-// A `Platform` is a set of requirements, such as hardware, operating system, or
-// compiler toolchain, for an
-// [Action][build.bazel.remote.execution.v2.Action]'s execution
-// environment. A `Platform` is represented as a series of key-value pairs
-// representing the properties that are required of the platform.
-type Platform struct {
-	// The properties that make up this platform. In order to ensure that
-	// equivalent `Platform`s always hash to the same value, the properties MUST
-	// be lexicographically sorted by name, and then by value. Sorting of strings
-	// is done by code point, equivalently, by the UTF-8 bytes.
-	Properties           []*Platform_Property `protobuf:"bytes,1,rep,name=properties,proto3" json:"properties,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
-	XXX_unrecognized     []byte               `json:"-"`
-	XXX_sizecache        int32                `json:"-"`
-}
-
-func (m *Platform) Reset()         { *m = Platform{} }
-func (m *Platform) String() string { return proto.CompactTextString(m) }
-func (*Platform) ProtoMessage()    {}
-func (*Platform) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{2}
-}
-
-func (m *Platform) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Platform.Unmarshal(m, b)
-}
-func (m *Platform) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Platform.Marshal(b, m, deterministic)
-}
-func (m *Platform) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Platform.Merge(m, src)
-}
-func (m *Platform) XXX_Size() int {
-	return xxx_messageInfo_Platform.Size(m)
-}
-func (m *Platform) XXX_DiscardUnknown() {
-	xxx_messageInfo_Platform.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Platform proto.InternalMessageInfo
-
-func (m *Platform) GetProperties() []*Platform_Property {
-	if m != nil {
-		return m.Properties
-	}
-	return nil
-}
-
-// A single property for the environment. The server is responsible for
-// specifying the property `name`s that it accepts. If an unknown `name` is
-// provided in the requirements for an
-// [Action][build.bazel.remote.execution.v2.Action], the server SHOULD
-// reject the execution request. If permitted by the server, the same `name`
-// may occur multiple times.
-//
-// The server is also responsible for specifying the interpretation of
-// property `value`s. For instance, a property describing how much RAM must be
-// available may be interpreted as allowing a worker with 16GB to fulfill a
-// request for 8GB, while a property describing the OS environment on which
-// the action must be performed may require an exact match with the worker's
-// OS.
-//
-// The server MAY use the `value` of one or more properties to determine how
-// it sets up the execution environment, such as by making specific system
-// files available to the worker.
-type Platform_Property struct {
-	// The property name.
-	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	// The property value.
-	Value                string   `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *Platform_Property) Reset()         { *m = Platform_Property{} }
-func (m *Platform_Property) String() string { return proto.CompactTextString(m) }
-func (*Platform_Property) ProtoMessage()    {}
-func (*Platform_Property) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{2, 0}
-}
-
-func (m *Platform_Property) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Platform_Property.Unmarshal(m, b)
-}
-func (m *Platform_Property) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Platform_Property.Marshal(b, m, deterministic)
-}
-func (m *Platform_Property) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Platform_Property.Merge(m, src)
-}
-func (m *Platform_Property) XXX_Size() int {
-	return xxx_messageInfo_Platform_Property.Size(m)
-}
-func (m *Platform_Property) XXX_DiscardUnknown() {
-	xxx_messageInfo_Platform_Property.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Platform_Property proto.InternalMessageInfo
-
-func (m *Platform_Property) GetName() string {
-	if m != nil {
-		return m.Name
-	}
-	return ""
-}
-
-func (m *Platform_Property) GetValue() string {
-	if m != nil {
-		return m.Value
-	}
-	return ""
-}
-
-// A `Directory` represents a directory node in a file tree, containing zero or
-// more children [FileNodes][build.bazel.remote.execution.v2.FileNode],
-// [DirectoryNodes][build.bazel.remote.execution.v2.DirectoryNode] and
-// [SymlinkNodes][build.bazel.remote.execution.v2.SymlinkNode].
-// Each `Node` contains its name in the directory, either the digest of its
-// content (either a file blob or a `Directory` proto) or a symlink target, as
-// well as possibly some metadata about the file or directory.
-//
-// In order to ensure that two equivalent directory trees hash to the same
-// value, the following restrictions MUST be obeyed when constructing a
-// a `Directory`:
-//
-// * Every child in the directory must have a path of exactly one segment.
-//   Multiple levels of directory hierarchy may not be collapsed.
-// * Each child in the directory must have a unique path segment (file name).
-//   Note that while the API itself is case-sensitive, the environment where
-//   the Action is executed may or may not be case-sensitive. That is, it is
-//   legal to call the API with a Directory that has both "Foo" and "foo" as
-//   children, but the Action may be rejected by the remote system upon
-//   execution.
-// * The files, directories and symlinks in the directory must each be sorted
-//   in lexicographical order by path. The path strings must be sorted by code
-//   point, equivalently, by UTF-8 bytes.
-//
-// A `Directory` that obeys the restrictions is said to be in canonical form.
-//
-// As an example, the following could be used for a file named `bar` and a
-// directory named `foo` with an executable file named `baz` (hashes shortened
-// for readability):
-//
-// ```json
-// // (Directory proto)
-// {
-//   files: [
-//     {
-//       name: "bar",
-//       digest: {
-//         hash: "4a73bc9d03...",
-//         size: 65534
-//       }
-//     }
-//   ],
-//   directories: [
-//     {
-//       name: "foo",
-//       digest: {
-//         hash: "4cf2eda940...",
-//         size: 43
-//       }
-//     }
-//   ]
-// }
-//
-// // (Directory proto with hash "4cf2eda940..." and size 43)
-// {
-//   files: [
-//     {
-//       name: "baz",
-//       digest: {
-//         hash: "b2c941073e...",
-//         size: 1294,
-//       },
-//       is_executable: true
-//     }
-//   ]
-// }
-// ```
-type Directory struct {
-	// The files in the directory.
-	Files []*FileNode `protobuf:"bytes,1,rep,name=files,proto3" json:"files,omitempty"`
-	// The subdirectories in the directory.
-	Directories []*DirectoryNode `protobuf:"bytes,2,rep,name=directories,proto3" json:"directories,omitempty"`
-	// The symlinks in the directory.
-	Symlinks             []*SymlinkNode `protobuf:"bytes,3,rep,name=symlinks,proto3" json:"symlinks,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
-	XXX_unrecognized     []byte         `json:"-"`
-	XXX_sizecache        int32          `json:"-"`
-}
-
-func (m *Directory) Reset()         { *m = Directory{} }
-func (m *Directory) String() string { return proto.CompactTextString(m) }
-func (*Directory) ProtoMessage()    {}
-func (*Directory) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{3}
-}
-
-func (m *Directory) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Directory.Unmarshal(m, b)
-}
-func (m *Directory) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Directory.Marshal(b, m, deterministic)
-}
-func (m *Directory) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Directory.Merge(m, src)
-}
-func (m *Directory) XXX_Size() int {
-	return xxx_messageInfo_Directory.Size(m)
-}
-func (m *Directory) XXX_DiscardUnknown() {
-	xxx_messageInfo_Directory.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Directory proto.InternalMessageInfo
-
-func (m *Directory) GetFiles() []*FileNode {
-	if m != nil {
-		return m.Files
-	}
-	return nil
-}
-
-func (m *Directory) GetDirectories() []*DirectoryNode {
-	if m != nil {
-		return m.Directories
-	}
-	return nil
-}
-
-func (m *Directory) GetSymlinks() []*SymlinkNode {
-	if m != nil {
-		return m.Symlinks
-	}
-	return nil
-}
-
-// A `FileNode` represents a single file and associated metadata.
-type FileNode struct {
-	// The name of the file.
-	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	// The digest of the file's content.
-	Digest *Digest `protobuf:"bytes,2,opt,name=digest,proto3" json:"digest,omitempty"`
-	// True if file is executable, false otherwise.
-	IsExecutable         bool     `protobuf:"varint,4,opt,name=is_executable,json=isExecutable,proto3" json:"is_executable,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *FileNode) Reset()         { *m = FileNode{} }
-func (m *FileNode) String() string { return proto.CompactTextString(m) }
-func (*FileNode) ProtoMessage()    {}
-func (*FileNode) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{4}
-}
-
-func (m *FileNode) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_FileNode.Unmarshal(m, b)
-}
-func (m *FileNode) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_FileNode.Marshal(b, m, deterministic)
-}
-func (m *FileNode) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_FileNode.Merge(m, src)
-}
-func (m *FileNode) XXX_Size() int {
-	return xxx_messageInfo_FileNode.Size(m)
-}
-func (m *FileNode) XXX_DiscardUnknown() {
-	xxx_messageInfo_FileNode.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_FileNode proto.InternalMessageInfo
-
-func (m *FileNode) GetName() string {
-	if m != nil {
-		return m.Name
-	}
-	return ""
-}
-
-func (m *FileNode) GetDigest() *Digest {
-	if m != nil {
-		return m.Digest
-	}
-	return nil
-}
-
-func (m *FileNode) GetIsExecutable() bool {
-	if m != nil {
-		return m.IsExecutable
-	}
-	return false
-}
-
-// A `DirectoryNode` represents a child of a
-// [Directory][build.bazel.remote.execution.v2.Directory] which is itself
-// a `Directory` and its associated metadata.
-type DirectoryNode struct {
-	// The name of the directory.
-	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	// The digest of the
-	// [Directory][build.bazel.remote.execution.v2.Directory] object
-	// represented. See [Digest][build.bazel.remote.execution.v2.Digest]
-	// for information about how to take the digest of a proto message.
-	Digest               *Digest  `protobuf:"bytes,2,opt,name=digest,proto3" json:"digest,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *DirectoryNode) Reset()         { *m = DirectoryNode{} }
-func (m *DirectoryNode) String() string { return proto.CompactTextString(m) }
-func (*DirectoryNode) ProtoMessage()    {}
-func (*DirectoryNode) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{5}
-}
-
-func (m *DirectoryNode) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_DirectoryNode.Unmarshal(m, b)
-}
-func (m *DirectoryNode) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_DirectoryNode.Marshal(b, m, deterministic)
-}
-func (m *DirectoryNode) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_DirectoryNode.Merge(m, src)
-}
-func (m *DirectoryNode) XXX_Size() int {
-	return xxx_messageInfo_DirectoryNode.Size(m)
-}
-func (m *DirectoryNode) XXX_DiscardUnknown() {
-	xxx_messageInfo_DirectoryNode.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_DirectoryNode proto.InternalMessageInfo
-
-func (m *DirectoryNode) GetName() string {
-	if m != nil {
-		return m.Name
-	}
-	return ""
-}
-
-func (m *DirectoryNode) GetDigest() *Digest {
-	if m != nil {
-		return m.Digest
-	}
-	return nil
-}
-
-// A `SymlinkNode` represents a symbolic link.
-type SymlinkNode struct {
-	// The name of the symlink.
-	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	// The target path of the symlink. The path separator is a forward slash `/`.
-	// The target path can be relative to the parent directory of the symlink or
-	// it can be an absolute path starting with `/`. Support for absolute paths
-	// can be checked using the [Capabilities][build.bazel.remote.execution.v2.Capabilities]
-	// API. The canonical form forbids the substrings `/./` and `//` in the target
-	// path. `..` components are allowed anywhere in the target path.
-	Target               string   `protobuf:"bytes,2,opt,name=target,proto3" json:"target,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *SymlinkNode) Reset()         { *m = SymlinkNode{} }
-func (m *SymlinkNode) String() string { return proto.CompactTextString(m) }
-func (*SymlinkNode) ProtoMessage()    {}
-func (*SymlinkNode) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{6}
-}
-
-func (m *SymlinkNode) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_SymlinkNode.Unmarshal(m, b)
-}
-func (m *SymlinkNode) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_SymlinkNode.Marshal(b, m, deterministic)
-}
-func (m *SymlinkNode) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_SymlinkNode.Merge(m, src)
-}
-func (m *SymlinkNode) XXX_Size() int {
-	return xxx_messageInfo_SymlinkNode.Size(m)
-}
-func (m *SymlinkNode) XXX_DiscardUnknown() {
-	xxx_messageInfo_SymlinkNode.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_SymlinkNode proto.InternalMessageInfo
-
-func (m *SymlinkNode) GetName() string {
-	if m != nil {
-		return m.Name
-	}
-	return ""
-}
-
-func (m *SymlinkNode) GetTarget() string {
-	if m != nil {
-		return m.Target
-	}
-	return ""
-}
-
-// A content digest. A digest for a given blob consists of the size of the blob
-// and its hash. The hash algorithm to use is defined by the server, but servers
-// SHOULD use SHA-256.
-//
-// The size is considered to be an integral part of the digest and cannot be
-// separated. That is, even if the `hash` field is correctly specified but
-// `size_bytes` is not, the server MUST reject the request.
-//
-// The reason for including the size in the digest is as follows: in a great
-// many cases, the server needs to know the size of the blob it is about to work
-// with prior to starting an operation with it, such as flattening Merkle tree
-// structures or streaming it to a worker. Technically, the server could
-// implement a separate metadata store, but this results in a significantly more
-// complicated implementation as opposed to having the client specify the size
-// up-front (or storing the size along with the digest in every message where
-// digests are embedded). This does mean that the API leaks some implementation
-// details of (what we consider to be) a reasonable server implementation, but
-// we consider this to be a worthwhile tradeoff.
-//
-// When a `Digest` is used to refer to a proto message, it always refers to the
-// message in binary encoded form. To ensure consistent hashing, clients and
-// servers MUST ensure that they serialize messages according to the following
-// rules, even if there are alternate valid encodings for the same message:
-//
-// * Fields are serialized in tag order.
-// * There are no unknown fields.
-// * There are no duplicate fields.
-// * Fields are serialized according to the default semantics for their type.
-//
-// Most protocol buffer implementations will always follow these rules when
-// serializing, but care should be taken to avoid shortcuts. For instance,
-// concatenating two messages to merge them may produce duplicate fields.
-type Digest struct {
-	// The hash. In the case of SHA-256, it will always be a lowercase hex string
-	// exactly 64 characters long.
-	Hash string `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"`
-	// The size of the blob, in bytes.
-	SizeBytes            int64    `protobuf:"varint,2,opt,name=size_bytes,json=sizeBytes,proto3" json:"size_bytes,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *Digest) Reset()         { *m = Digest{} }
-func (m *Digest) String() string { return proto.CompactTextString(m) }
-func (*Digest) ProtoMessage()    {}
-func (*Digest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{7}
-}
-
-func (m *Digest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Digest.Unmarshal(m, b)
-}
-func (m *Digest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Digest.Marshal(b, m, deterministic)
-}
-func (m *Digest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Digest.Merge(m, src)
-}
-func (m *Digest) XXX_Size() int {
-	return xxx_messageInfo_Digest.Size(m)
-}
-func (m *Digest) XXX_DiscardUnknown() {
-	xxx_messageInfo_Digest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Digest proto.InternalMessageInfo
-
-func (m *Digest) GetHash() string {
-	if m != nil {
-		return m.Hash
-	}
-	return ""
-}
-
-func (m *Digest) GetSizeBytes() int64 {
-	if m != nil {
-		return m.SizeBytes
-	}
-	return 0
-}
-
-// ExecutedActionMetadata contains details about a completed execution.
-type ExecutedActionMetadata struct {
-	// The name of the worker which ran the execution.
-	Worker string `protobuf:"bytes,1,opt,name=worker,proto3" json:"worker,omitempty"`
-	// When was the action added to the queue.
-	QueuedTimestamp *timestamp.Timestamp `protobuf:"bytes,2,opt,name=queued_timestamp,json=queuedTimestamp,proto3" json:"queued_timestamp,omitempty"`
-	// When the worker received the action.
-	WorkerStartTimestamp *timestamp.Timestamp `protobuf:"bytes,3,opt,name=worker_start_timestamp,json=workerStartTimestamp,proto3" json:"worker_start_timestamp,omitempty"`
-	// When the worker completed the action, including all stages.
-	WorkerCompletedTimestamp *timestamp.Timestamp `protobuf:"bytes,4,opt,name=worker_completed_timestamp,json=workerCompletedTimestamp,proto3" json:"worker_completed_timestamp,omitempty"`
-	// When the worker started fetching action inputs.
-	InputFetchStartTimestamp *timestamp.Timestamp `protobuf:"bytes,5,opt,name=input_fetch_start_timestamp,json=inputFetchStartTimestamp,proto3" json:"input_fetch_start_timestamp,omitempty"`
-	// When the worker finished fetching action inputs.
-	InputFetchCompletedTimestamp *timestamp.Timestamp `protobuf:"bytes,6,opt,name=input_fetch_completed_timestamp,json=inputFetchCompletedTimestamp,proto3" json:"input_fetch_completed_timestamp,omitempty"`
-	// When the worker started executing the action command.
-	ExecutionStartTimestamp *timestamp.Timestamp `protobuf:"bytes,7,opt,name=execution_start_timestamp,json=executionStartTimestamp,proto3" json:"execution_start_timestamp,omitempty"`
-	// When the worker completed executing the action command.
-	ExecutionCompletedTimestamp *timestamp.Timestamp `protobuf:"bytes,8,opt,name=execution_completed_timestamp,json=executionCompletedTimestamp,proto3" json:"execution_completed_timestamp,omitempty"`
-	// When the worker started uploading action outputs.
-	OutputUploadStartTimestamp *timestamp.Timestamp `protobuf:"bytes,9,opt,name=output_upload_start_timestamp,json=outputUploadStartTimestamp,proto3" json:"output_upload_start_timestamp,omitempty"`
-	// When the worker finished uploading action outputs.
-	OutputUploadCompletedTimestamp *timestamp.Timestamp `protobuf:"bytes,10,opt,name=output_upload_completed_timestamp,json=outputUploadCompletedTimestamp,proto3" json:"output_upload_completed_timestamp,omitempty"`
-	XXX_NoUnkeyedLiteral           struct{}             `json:"-"`
-	XXX_unrecognized               []byte               `json:"-"`
-	XXX_sizecache                  int32                `json:"-"`
-}
-
-func (m *ExecutedActionMetadata) Reset()         { *m = ExecutedActionMetadata{} }
-func (m *ExecutedActionMetadata) String() string { return proto.CompactTextString(m) }
-func (*ExecutedActionMetadata) ProtoMessage()    {}
-func (*ExecutedActionMetadata) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{8}
-}
-
-func (m *ExecutedActionMetadata) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ExecutedActionMetadata.Unmarshal(m, b)
-}
-func (m *ExecutedActionMetadata) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ExecutedActionMetadata.Marshal(b, m, deterministic)
-}
-func (m *ExecutedActionMetadata) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ExecutedActionMetadata.Merge(m, src)
-}
-func (m *ExecutedActionMetadata) XXX_Size() int {
-	return xxx_messageInfo_ExecutedActionMetadata.Size(m)
-}
-func (m *ExecutedActionMetadata) XXX_DiscardUnknown() {
-	xxx_messageInfo_ExecutedActionMetadata.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ExecutedActionMetadata proto.InternalMessageInfo
-
-func (m *ExecutedActionMetadata) GetWorker() string {
-	if m != nil {
-		return m.Worker
-	}
-	return ""
-}
-
-func (m *ExecutedActionMetadata) GetQueuedTimestamp() *timestamp.Timestamp {
-	if m != nil {
-		return m.QueuedTimestamp
-	}
-	return nil
-}
-
-func (m *ExecutedActionMetadata) GetWorkerStartTimestamp() *timestamp.Timestamp {
-	if m != nil {
-		return m.WorkerStartTimestamp
-	}
-	return nil
-}
-
-func (m *ExecutedActionMetadata) GetWorkerCompletedTimestamp() *timestamp.Timestamp {
-	if m != nil {
-		return m.WorkerCompletedTimestamp
-	}
-	return nil
-}
-
-func (m *ExecutedActionMetadata) GetInputFetchStartTimestamp() *timestamp.Timestamp {
-	if m != nil {
-		return m.InputFetchStartTimestamp
-	}
-	return nil
-}
-
-func (m *ExecutedActionMetadata) GetInputFetchCompletedTimestamp() *timestamp.Timestamp {
-	if m != nil {
-		return m.InputFetchCompletedTimestamp
-	}
-	return nil
-}
-
-func (m *ExecutedActionMetadata) GetExecutionStartTimestamp() *timestamp.Timestamp {
-	if m != nil {
-		return m.ExecutionStartTimestamp
-	}
-	return nil
-}
-
-func (m *ExecutedActionMetadata) GetExecutionCompletedTimestamp() *timestamp.Timestamp {
-	if m != nil {
-		return m.ExecutionCompletedTimestamp
-	}
-	return nil
-}
-
-func (m *ExecutedActionMetadata) GetOutputUploadStartTimestamp() *timestamp.Timestamp {
-	if m != nil {
-		return m.OutputUploadStartTimestamp
-	}
-	return nil
-}
-
-func (m *ExecutedActionMetadata) GetOutputUploadCompletedTimestamp() *timestamp.Timestamp {
-	if m != nil {
-		return m.OutputUploadCompletedTimestamp
-	}
-	return nil
-}
-
-// An ActionResult represents the result of an
-// [Action][build.bazel.remote.execution.v2.Action] being run.
-type ActionResult struct {
-	// The output files of the action. For each output file requested in the
-	// `output_files` field of the Action, if the corresponding file existed after
-	// the action completed, a single entry will be present either in this field,
-	// or in the output_file_symlinks field, if the file was a symbolic link to
-	// another file.
-	//
-	// If the action does not produce the requested output, or produces a
-	// directory where a regular file is expected or vice versa, then that output
-	// will be omitted from the list. The server is free to arrange the output
-	// list as desired; clients MUST NOT assume that the output list is sorted.
-	OutputFiles []*OutputFile `protobuf:"bytes,2,rep,name=output_files,json=outputFiles,proto3" json:"output_files,omitempty"`
-	// The output files of the action that are symbolic links to other files. Those
-	// may be links to other output files, or input files, or even absolute paths
-	// outside of the working directory, if the server supports
-	// [SymlinkAbsolutePathStrategy.ALLOWED][build.bazel.remote.execution.v2.CacheCapabilities.SymlinkAbsolutePathStrategy].
-	// For each output file requested in the `output_files` field of the Action,
-	// if the corresponding file existed after
-	// the action completed, a single entry will be present either in this field,
-	// or in the `output_files` field, if the file was not a symbolic link.
-	//
-	// If the action does not produce the requested output, or produces a
-	// directory where a regular file is expected or vice versa, then that output
-	// will be omitted from the list. The server is free to arrange the output
-	// list as desired; clients MUST NOT assume that the output list is sorted.
-	OutputFileSymlinks []*OutputSymlink `protobuf:"bytes,10,rep,name=output_file_symlinks,json=outputFileSymlinks,proto3" json:"output_file_symlinks,omitempty"`
-	// The output directories of the action. For each output directory requested
-	// in the `output_directories` field of the Action, if the corresponding
-	// directory existed after the action completed, a single entry will be
-	// present in the output list, which will contain the digest of a
-	// [Tree][build.bazel.remote.execution.v2.Tree] message containing the
-	// directory tree, and the path equal exactly to the corresponding Action
-	// output_directories member.
-	//
-	// As an example, suppose the Action had an output directory `a/b/dir` and the
-	// execution produced the following contents in `a/b/dir`: a file named `bar`
-	// and a directory named `foo` with an executable file named `baz`. Then,
-	// output_directory will contain (hashes shortened for readability):
-	//
-	// ```json
-	// // OutputDirectory proto:
-	// {
-	//   path: "a/b/dir"
-	//   tree_digest: {
-	//     hash: "4a73bc9d03...",
-	//     size: 55
-	//   }
-	// }
-	// // Tree proto with hash "4a73bc9d03..." and size 55:
-	// {
-	//   root: {
-	//     files: [
-	//       {
-	//         name: "bar",
-	//         digest: {
-	//           hash: "4a73bc9d03...",
-	//           size: 65534
-	//         }
-	//       }
-	//     ],
-	//     directories: [
-	//       {
-	//         name: "foo",
-	//         digest: {
-	//           hash: "4cf2eda940...",
-	//           size: 43
-	//         }
-	//       }
-	//     ]
-	//   }
-	//   children : {
-	//     // (Directory proto with hash "4cf2eda940..." and size 43)
-	//     files: [
-	//       {
-	//         name: "baz",
-	//         digest: {
-	//           hash: "b2c941073e...",
-	//           size: 1294,
-	//         },
-	//         is_executable: true
-	//       }
-	//     ]
-	//   }
-	// }
-	// ```
-	OutputDirectories []*OutputDirectory `protobuf:"bytes,3,rep,name=output_directories,json=outputDirectories,proto3" json:"output_directories,omitempty"`
-	// The output directories of the action that are symbolic links to other
-	// directories. Those may be links to other output directories, or input
-	// directories, or even absolute paths outside of the working directory,
-	// if the server supports
-	// [SymlinkAbsolutePathStrategy.ALLOWED][build.bazel.remote.execution.v2.CacheCapabilities.SymlinkAbsolutePathStrategy].
-	// For each output directory requested in the `output_directories` field of
-	// the Action, if the directory file existed after
-	// the action completed, a single entry will be present either in this field,
-	// or in the `output_directories` field, if the directory was not a symbolic link.
-	//
-	// If the action does not produce the requested output, or produces a
-	// file where a directory is expected or vice versa, then that output
-	// will be omitted from the list. The server is free to arrange the output
-	// list as desired; clients MUST NOT assume that the output list is sorted.
-	OutputDirectorySymlinks []*OutputSymlink `protobuf:"bytes,11,rep,name=output_directory_symlinks,json=outputDirectorySymlinks,proto3" json:"output_directory_symlinks,omitempty"`
-	// The exit code of the command.
-	ExitCode int32 `protobuf:"varint,4,opt,name=exit_code,json=exitCode,proto3" json:"exit_code,omitempty"`
-	// The standard output buffer of the action. The server will determine, based
-	// on the size of the buffer, whether to return it in raw form or to return
-	// a digest in `stdout_digest` that points to the buffer. If neither is set,
-	// then the buffer is empty. The client SHOULD NOT assume it will get one of
-	// the raw buffer or a digest on any given request and should be prepared to
-	// handle either.
-	StdoutRaw []byte `protobuf:"bytes,5,opt,name=stdout_raw,json=stdoutRaw,proto3" json:"stdout_raw,omitempty"`
-	// The digest for a blob containing the standard output of the action, which
-	// can be retrieved from the
-	// [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
-	// See `stdout_raw` for when this will be set.
-	StdoutDigest *Digest `protobuf:"bytes,6,opt,name=stdout_digest,json=stdoutDigest,proto3" json:"stdout_digest,omitempty"`
-	// The standard error buffer of the action. The server will determine, based
-	// on the size of the buffer, whether to return it in raw form or to return
-	// a digest in `stderr_digest` that points to the buffer. If neither is set,
-	// then the buffer is empty. The client SHOULD NOT assume it will get one of
-	// the raw buffer or a digest on any given request and should be prepared to
-	// handle either.
-	StderrRaw []byte `protobuf:"bytes,7,opt,name=stderr_raw,json=stderrRaw,proto3" json:"stderr_raw,omitempty"`
-	// The digest for a blob containing the standard error of the action, which
-	// can be retrieved from the
-	// [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
-	// See `stderr_raw` for when this will be set.
-	StderrDigest *Digest `protobuf:"bytes,8,opt,name=stderr_digest,json=stderrDigest,proto3" json:"stderr_digest,omitempty"`
-	// The details of the execution that originally produced this result.
-	ExecutionMetadata    *ExecutedActionMetadata `protobuf:"bytes,9,opt,name=execution_metadata,json=executionMetadata,proto3" json:"execution_metadata,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
-	XXX_unrecognized     []byte                  `json:"-"`
-	XXX_sizecache        int32                   `json:"-"`
-}
-
-func (m *ActionResult) Reset()         { *m = ActionResult{} }
-func (m *ActionResult) String() string { return proto.CompactTextString(m) }
-func (*ActionResult) ProtoMessage()    {}
-func (*ActionResult) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{9}
-}
-
-func (m *ActionResult) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ActionResult.Unmarshal(m, b)
-}
-func (m *ActionResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ActionResult.Marshal(b, m, deterministic)
-}
-func (m *ActionResult) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ActionResult.Merge(m, src)
-}
-func (m *ActionResult) XXX_Size() int {
-	return xxx_messageInfo_ActionResult.Size(m)
-}
-func (m *ActionResult) XXX_DiscardUnknown() {
-	xxx_messageInfo_ActionResult.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ActionResult proto.InternalMessageInfo
-
-func (m *ActionResult) GetOutputFiles() []*OutputFile {
-	if m != nil {
-		return m.OutputFiles
-	}
-	return nil
-}
-
-func (m *ActionResult) GetOutputFileSymlinks() []*OutputSymlink {
-	if m != nil {
-		return m.OutputFileSymlinks
-	}
-	return nil
-}
-
-func (m *ActionResult) GetOutputDirectories() []*OutputDirectory {
-	if m != nil {
-		return m.OutputDirectories
-	}
-	return nil
-}
-
-func (m *ActionResult) GetOutputDirectorySymlinks() []*OutputSymlink {
-	if m != nil {
-		return m.OutputDirectorySymlinks
-	}
-	return nil
-}
-
-func (m *ActionResult) GetExitCode() int32 {
-	if m != nil {
-		return m.ExitCode
-	}
-	return 0
-}
-
-func (m *ActionResult) GetStdoutRaw() []byte {
-	if m != nil {
-		return m.StdoutRaw
-	}
-	return nil
-}
-
-func (m *ActionResult) GetStdoutDigest() *Digest {
-	if m != nil {
-		return m.StdoutDigest
-	}
-	return nil
-}
-
-func (m *ActionResult) GetStderrRaw() []byte {
-	if m != nil {
-		return m.StderrRaw
-	}
-	return nil
-}
-
-func (m *ActionResult) GetStderrDigest() *Digest {
-	if m != nil {
-		return m.StderrDigest
-	}
-	return nil
-}
-
-func (m *ActionResult) GetExecutionMetadata() *ExecutedActionMetadata {
-	if m != nil {
-		return m.ExecutionMetadata
-	}
-	return nil
-}
-
-// An `OutputFile` is similar to a
-// [FileNode][build.bazel.remote.execution.v2.FileNode], but it is used as an
-// output in an `ActionResult`. It allows a full file path rather than
-// only a name.
-//
-// `OutputFile` is binary-compatible with `FileNode`.
-type OutputFile struct {
-	// The full path of the file relative to the working directory, including the
-	// filename. The path separator is a forward slash `/`. Since this is a
-	// relative path, it MUST NOT begin with a leading forward slash.
-	Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
-	// The digest of the file's content.
-	Digest *Digest `protobuf:"bytes,2,opt,name=digest,proto3" json:"digest,omitempty"`
-	// True if file is executable, false otherwise.
-	IsExecutable         bool     `protobuf:"varint,4,opt,name=is_executable,json=isExecutable,proto3" json:"is_executable,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *OutputFile) Reset()         { *m = OutputFile{} }
-func (m *OutputFile) String() string { return proto.CompactTextString(m) }
-func (*OutputFile) ProtoMessage()    {}
-func (*OutputFile) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{10}
-}
-
-func (m *OutputFile) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_OutputFile.Unmarshal(m, b)
-}
-func (m *OutputFile) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_OutputFile.Marshal(b, m, deterministic)
-}
-func (m *OutputFile) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_OutputFile.Merge(m, src)
-}
-func (m *OutputFile) XXX_Size() int {
-	return xxx_messageInfo_OutputFile.Size(m)
-}
-func (m *OutputFile) XXX_DiscardUnknown() {
-	xxx_messageInfo_OutputFile.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_OutputFile proto.InternalMessageInfo
-
-func (m *OutputFile) GetPath() string {
-	if m != nil {
-		return m.Path
-	}
-	return ""
-}
-
-func (m *OutputFile) GetDigest() *Digest {
-	if m != nil {
-		return m.Digest
-	}
-	return nil
-}
-
-func (m *OutputFile) GetIsExecutable() bool {
-	if m != nil {
-		return m.IsExecutable
-	}
-	return false
-}
-
-// A `Tree` contains all the
-// [Directory][build.bazel.remote.execution.v2.Directory] protos in a
-// single directory Merkle tree, compressed into one message.
-type Tree struct {
-	// The root directory in the tree.
-	Root *Directory `protobuf:"bytes,1,opt,name=root,proto3" json:"root,omitempty"`
-	// All the child directories: the directories referred to by the root and,
-	// recursively, all its children. In order to reconstruct the directory tree,
-	// the client must take the digests of each of the child directories and then
-	// build up a tree starting from the `root`.
-	Children             []*Directory `protobuf:"bytes,2,rep,name=children,proto3" json:"children,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
-	XXX_unrecognized     []byte       `json:"-"`
-	XXX_sizecache        int32        `json:"-"`
-}
-
-func (m *Tree) Reset()         { *m = Tree{} }
-func (m *Tree) String() string { return proto.CompactTextString(m) }
-func (*Tree) ProtoMessage()    {}
-func (*Tree) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{11}
-}
-
-func (m *Tree) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Tree.Unmarshal(m, b)
-}
-func (m *Tree) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Tree.Marshal(b, m, deterministic)
-}
-func (m *Tree) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Tree.Merge(m, src)
-}
-func (m *Tree) XXX_Size() int {
-	return xxx_messageInfo_Tree.Size(m)
-}
-func (m *Tree) XXX_DiscardUnknown() {
-	xxx_messageInfo_Tree.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Tree proto.InternalMessageInfo
-
-func (m *Tree) GetRoot() *Directory {
-	if m != nil {
-		return m.Root
-	}
-	return nil
-}
-
-func (m *Tree) GetChildren() []*Directory {
-	if m != nil {
-		return m.Children
-	}
-	return nil
-}
-
-// An `OutputDirectory` is the output in an `ActionResult` corresponding to a
-// directory's full contents rather than a single file.
-type OutputDirectory struct {
-	// The full path of the directory relative to the working directory. The path
-	// separator is a forward slash `/`. Since this is a relative path, it MUST
-	// NOT begin with a leading forward slash. The empty string value is allowed,
-	// and it denotes the entire working directory.
-	Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
-	// The digest of the encoded
-	// [Tree][build.bazel.remote.execution.v2.Tree] proto containing the
-	// directory's contents.
-	TreeDigest           *Digest  `protobuf:"bytes,3,opt,name=tree_digest,json=treeDigest,proto3" json:"tree_digest,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *OutputDirectory) Reset()         { *m = OutputDirectory{} }
-func (m *OutputDirectory) String() string { return proto.CompactTextString(m) }
-func (*OutputDirectory) ProtoMessage()    {}
-func (*OutputDirectory) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{12}
-}
-
-func (m *OutputDirectory) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_OutputDirectory.Unmarshal(m, b)
-}
-func (m *OutputDirectory) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_OutputDirectory.Marshal(b, m, deterministic)
-}
-func (m *OutputDirectory) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_OutputDirectory.Merge(m, src)
-}
-func (m *OutputDirectory) XXX_Size() int {
-	return xxx_messageInfo_OutputDirectory.Size(m)
-}
-func (m *OutputDirectory) XXX_DiscardUnknown() {
-	xxx_messageInfo_OutputDirectory.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_OutputDirectory proto.InternalMessageInfo
-
-func (m *OutputDirectory) GetPath() string {
-	if m != nil {
-		return m.Path
-	}
-	return ""
-}
-
-func (m *OutputDirectory) GetTreeDigest() *Digest {
-	if m != nil {
-		return m.TreeDigest
-	}
-	return nil
-}
-
-// An `OutputSymlink` is similar to a
-// [Symlink][build.bazel.remote.execution.v2.SymlinkNode], but it is used as an
-// output in an `ActionResult`.
-//
-// `OutputSymlink` is binary-compatible with `SymlinkNode`.
-type OutputSymlink struct {
-	// The full path of the symlink relative to the working directory, including the
-	// filename. The path separator is a forward slash `/`. Since this is a
-	// relative path, it MUST NOT begin with a leading forward slash.
-	Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
-	// The target path of the symlink. The path separator is a forward slash `/`.
-	// The target path can be relative to the parent directory of the symlink or
-	// it can be an absolute path starting with `/`. Support for absolute paths
-	// can be checked using the [Capabilities][build.bazel.remote.execution.v2.Capabilities]
-	// API. The canonical form forbids the substrings `/./` and `//` in the target
-	// path. `..` components are allowed anywhere in the target path.
-	Target               string   `protobuf:"bytes,2,opt,name=target,proto3" json:"target,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *OutputSymlink) Reset()         { *m = OutputSymlink{} }
-func (m *OutputSymlink) String() string { return proto.CompactTextString(m) }
-func (*OutputSymlink) ProtoMessage()    {}
-func (*OutputSymlink) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{13}
-}
-
-func (m *OutputSymlink) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_OutputSymlink.Unmarshal(m, b)
-}
-func (m *OutputSymlink) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_OutputSymlink.Marshal(b, m, deterministic)
-}
-func (m *OutputSymlink) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_OutputSymlink.Merge(m, src)
-}
-func (m *OutputSymlink) XXX_Size() int {
-	return xxx_messageInfo_OutputSymlink.Size(m)
-}
-func (m *OutputSymlink) XXX_DiscardUnknown() {
-	xxx_messageInfo_OutputSymlink.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_OutputSymlink proto.InternalMessageInfo
-
-func (m *OutputSymlink) GetPath() string {
-	if m != nil {
-		return m.Path
-	}
-	return ""
-}
-
-func (m *OutputSymlink) GetTarget() string {
-	if m != nil {
-		return m.Target
-	}
-	return ""
-}
-
-// An `ExecutionPolicy` can be used to control the scheduling of the action.
-type ExecutionPolicy struct {
-	// The priority (relative importance) of this action. Generally, a lower value
-	// means that the action should be run sooner than actions having a greater
-	// priority value, but the interpretation of a given value is server-
-	// dependent. A priority of 0 means the *default* priority. Priorities may be
-	// positive or negative, and such actions should run later or sooner than
-	// actions having the default priority, respectively. The particular semantics
-	// of this field is up to the server. In particular, every server will have
-	// their own supported range of priorities, and will decide how these map into
-	// scheduling policy.
-	Priority             int32    `protobuf:"varint,1,opt,name=priority,proto3" json:"priority,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *ExecutionPolicy) Reset()         { *m = ExecutionPolicy{} }
-func (m *ExecutionPolicy) String() string { return proto.CompactTextString(m) }
-func (*ExecutionPolicy) ProtoMessage()    {}
-func (*ExecutionPolicy) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{14}
-}
-
-func (m *ExecutionPolicy) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ExecutionPolicy.Unmarshal(m, b)
-}
-func (m *ExecutionPolicy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ExecutionPolicy.Marshal(b, m, deterministic)
-}
-func (m *ExecutionPolicy) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ExecutionPolicy.Merge(m, src)
-}
-func (m *ExecutionPolicy) XXX_Size() int {
-	return xxx_messageInfo_ExecutionPolicy.Size(m)
-}
-func (m *ExecutionPolicy) XXX_DiscardUnknown() {
-	xxx_messageInfo_ExecutionPolicy.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ExecutionPolicy proto.InternalMessageInfo
-
-func (m *ExecutionPolicy) GetPriority() int32 {
-	if m != nil {
-		return m.Priority
-	}
-	return 0
-}
-
-// A `ResultsCachePolicy` is used for fine-grained control over how action
-// outputs are stored in the CAS and Action Cache.
-type ResultsCachePolicy struct {
-	// The priority (relative importance) of this content in the overall cache.
-	// Generally, a lower value means a longer retention time or other advantage,
-	// but the interpretation of a given value is server-dependent. A priority of
-	// 0 means a *default* value, decided by the server.
-	//
-	// The particular semantics of this field is up to the server. In particular,
-	// every server will have their own supported range of priorities, and will
-	// decide how these map into retention/eviction policy.
-	Priority             int32    `protobuf:"varint,1,opt,name=priority,proto3" json:"priority,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *ResultsCachePolicy) Reset()         { *m = ResultsCachePolicy{} }
-func (m *ResultsCachePolicy) String() string { return proto.CompactTextString(m) }
-func (*ResultsCachePolicy) ProtoMessage()    {}
-func (*ResultsCachePolicy) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{15}
-}
-
-func (m *ResultsCachePolicy) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ResultsCachePolicy.Unmarshal(m, b)
-}
-func (m *ResultsCachePolicy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ResultsCachePolicy.Marshal(b, m, deterministic)
-}
-func (m *ResultsCachePolicy) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ResultsCachePolicy.Merge(m, src)
-}
-func (m *ResultsCachePolicy) XXX_Size() int {
-	return xxx_messageInfo_ResultsCachePolicy.Size(m)
-}
-func (m *ResultsCachePolicy) XXX_DiscardUnknown() {
-	xxx_messageInfo_ResultsCachePolicy.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ResultsCachePolicy proto.InternalMessageInfo
-
-func (m *ResultsCachePolicy) GetPriority() int32 {
-	if m != nil {
-		return m.Priority
-	}
-	return 0
-}
-
-// A request message for
-// [Execution.Execute][build.bazel.remote.execution.v2.Execution.Execute].
-type ExecuteRequest struct {
-	// The instance of the execution system to operate against. A server may
-	// support multiple instances of the execution system (with their own workers,
-	// storage, caches, etc.). The server MAY require use of this field to select
-	// between them in an implementation-defined fashion, otherwise it can be
-	// omitted.
-	InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"`
-	// If true, the action will be executed even if its result is already
-	// present in the [ActionCache][build.bazel.remote.execution.v2.ActionCache].
-	// The execution is still allowed to be merged with other in-flight executions
-	// of the same action, however - semantically, the service MUST only guarantee
-	// that the results of an execution with this field set were not visible
-	// before the corresponding execution request was sent.
-	// Note that actions from execution requests setting this field set are still
-	// eligible to be entered into the action cache upon completion, and services
-	// SHOULD overwrite any existing entries that may exist. This allows
-	// skip_cache_lookup requests to be used as a mechanism for replacing action
-	// cache entries that reference outputs no longer available or that are
-	// poisoned in any way.
-	// If false, the result may be served from the action cache.
-	SkipCacheLookup bool `protobuf:"varint,3,opt,name=skip_cache_lookup,json=skipCacheLookup,proto3" json:"skip_cache_lookup,omitempty"`
-	// The digest of the [Action][build.bazel.remote.execution.v2.Action] to
-	// execute.
-	ActionDigest *Digest `protobuf:"bytes,6,opt,name=action_digest,json=actionDigest,proto3" json:"action_digest,omitempty"`
-	// An optional policy for execution of the action.
-	// The server will have a default policy if this is not provided.
-	ExecutionPolicy *ExecutionPolicy `protobuf:"bytes,7,opt,name=execution_policy,json=executionPolicy,proto3" json:"execution_policy,omitempty"`
-	// An optional policy for the results of this execution in the remote cache.
-	// The server will have a default policy if this is not provided.
-	// This may be applied to both the ActionResult and the associated blobs.
-	ResultsCachePolicy   *ResultsCachePolicy `protobuf:"bytes,8,opt,name=results_cache_policy,json=resultsCachePolicy,proto3" json:"results_cache_policy,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
-	XXX_unrecognized     []byte              `json:"-"`
-	XXX_sizecache        int32               `json:"-"`
-}
-
-func (m *ExecuteRequest) Reset()         { *m = ExecuteRequest{} }
-func (m *ExecuteRequest) String() string { return proto.CompactTextString(m) }
-func (*ExecuteRequest) ProtoMessage()    {}
-func (*ExecuteRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{16}
-}
-
-func (m *ExecuteRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ExecuteRequest.Unmarshal(m, b)
-}
-func (m *ExecuteRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ExecuteRequest.Marshal(b, m, deterministic)
-}
-func (m *ExecuteRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ExecuteRequest.Merge(m, src)
-}
-func (m *ExecuteRequest) XXX_Size() int {
-	return xxx_messageInfo_ExecuteRequest.Size(m)
-}
-func (m *ExecuteRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_ExecuteRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ExecuteRequest proto.InternalMessageInfo
-
-func (m *ExecuteRequest) GetInstanceName() string {
-	if m != nil {
-		return m.InstanceName
-	}
-	return ""
-}
-
-func (m *ExecuteRequest) GetSkipCacheLookup() bool {
-	if m != nil {
-		return m.SkipCacheLookup
-	}
-	return false
-}
-
-func (m *ExecuteRequest) GetActionDigest() *Digest {
-	if m != nil {
-		return m.ActionDigest
-	}
-	return nil
-}
-
-func (m *ExecuteRequest) GetExecutionPolicy() *ExecutionPolicy {
-	if m != nil {
-		return m.ExecutionPolicy
-	}
-	return nil
-}
-
-func (m *ExecuteRequest) GetResultsCachePolicy() *ResultsCachePolicy {
-	if m != nil {
-		return m.ResultsCachePolicy
-	}
-	return nil
-}
-
-// A `LogFile` is a log stored in the CAS.
-type LogFile struct {
-	// The digest of the log contents.
-	Digest *Digest `protobuf:"bytes,1,opt,name=digest,proto3" json:"digest,omitempty"`
-	// This is a hint as to the purpose of the log, and is set to true if the log
-	// is human-readable text that can be usefully displayed to a user, and false
-	// otherwise. For instance, if a command-line client wishes to print the
-	// server logs to the terminal for a failed action, this allows it to avoid
-	// displaying a binary file.
-	HumanReadable        bool     `protobuf:"varint,2,opt,name=human_readable,json=humanReadable,proto3" json:"human_readable,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *LogFile) Reset()         { *m = LogFile{} }
-func (m *LogFile) String() string { return proto.CompactTextString(m) }
-func (*LogFile) ProtoMessage()    {}
-func (*LogFile) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{17}
-}
-
-func (m *LogFile) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_LogFile.Unmarshal(m, b)
-}
-func (m *LogFile) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_LogFile.Marshal(b, m, deterministic)
-}
-func (m *LogFile) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_LogFile.Merge(m, src)
-}
-func (m *LogFile) XXX_Size() int {
-	return xxx_messageInfo_LogFile.Size(m)
-}
-func (m *LogFile) XXX_DiscardUnknown() {
-	xxx_messageInfo_LogFile.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_LogFile proto.InternalMessageInfo
-
-func (m *LogFile) GetDigest() *Digest {
-	if m != nil {
-		return m.Digest
-	}
-	return nil
-}
-
-func (m *LogFile) GetHumanReadable() bool {
-	if m != nil {
-		return m.HumanReadable
-	}
-	return false
-}
-
-// The response message for
-// [Execution.Execute][build.bazel.remote.execution.v2.Execution.Execute],
-// which will be contained in the [response
-// field][google.longrunning.Operation.response] of the
-// [Operation][google.longrunning.Operation].
-type ExecuteResponse struct {
-	// The result of the action.
-	Result *ActionResult `protobuf:"bytes,1,opt,name=result,proto3" json:"result,omitempty"`
-	// True if the result was served from cache, false if it was executed.
-	CachedResult bool `protobuf:"varint,2,opt,name=cached_result,json=cachedResult,proto3" json:"cached_result,omitempty"`
-	// If the status has a code other than `OK`, it indicates that the action did
-	// not finish execution. For example, if the operation times out during
-	// execution, the status will have a `DEADLINE_EXCEEDED` code. Servers MUST
-	// use this field for errors in execution, rather than the error field on the
-	// `Operation` object.
-	//
-	// If the status code is other than `OK`, then the result MUST NOT be cached.
-	// For an error status, the `result` field is optional; the server may
-	// populate the output-, stdout-, and stderr-related fields if it has any
-	// information available, such as the stdout and stderr of a timed-out action.
-	Status *status.Status `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
-	// An optional list of additional log outputs the server wishes to provide. A
-	// server can use this to return execution-specific logs however it wishes.
-	// This is intended primarily to make it easier for users to debug issues that
-	// may be outside of the actual job execution, such as by identifying the
-	// worker executing the action or by providing logs from the worker's setup
-	// phase. The keys SHOULD be human readable so that a client can display them
-	// to a user.
-	ServerLogs map[string]*LogFile `protobuf:"bytes,4,rep,name=server_logs,json=serverLogs,proto3" json:"server_logs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
-	// Freeform informational message with details on the execution of the action
-	// that may be displayed to the user upon failure or when requested explicitly.
-	Message              string   `protobuf:"bytes,5,opt,name=message,proto3" json:"message,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *ExecuteResponse) Reset()         { *m = ExecuteResponse{} }
-func (m *ExecuteResponse) String() string { return proto.CompactTextString(m) }
-func (*ExecuteResponse) ProtoMessage()    {}
-func (*ExecuteResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{18}
-}
-
-func (m *ExecuteResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ExecuteResponse.Unmarshal(m, b)
-}
-func (m *ExecuteResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ExecuteResponse.Marshal(b, m, deterministic)
-}
-func (m *ExecuteResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ExecuteResponse.Merge(m, src)
-}
-func (m *ExecuteResponse) XXX_Size() int {
-	return xxx_messageInfo_ExecuteResponse.Size(m)
-}
-func (m *ExecuteResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_ExecuteResponse.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ExecuteResponse proto.InternalMessageInfo
-
-func (m *ExecuteResponse) GetResult() *ActionResult {
-	if m != nil {
-		return m.Result
-	}
-	return nil
-}
-
-func (m *ExecuteResponse) GetCachedResult() bool {
-	if m != nil {
-		return m.CachedResult
-	}
-	return false
-}
-
-func (m *ExecuteResponse) GetStatus() *status.Status {
-	if m != nil {
-		return m.Status
-	}
-	return nil
-}
-
-func (m *ExecuteResponse) GetServerLogs() map[string]*LogFile {
-	if m != nil {
-		return m.ServerLogs
-	}
-	return nil
-}
-
-func (m *ExecuteResponse) GetMessage() string {
-	if m != nil {
-		return m.Message
-	}
-	return ""
-}
-
-// Metadata about an ongoing
-// [execution][build.bazel.remote.execution.v2.Execution.Execute], which
-// will be contained in the [metadata
-// field][google.longrunning.Operation.response] of the
-// [Operation][google.longrunning.Operation].
-type ExecuteOperationMetadata struct {
-	Stage ExecuteOperationMetadata_Stage `protobuf:"varint,1,opt,name=stage,proto3,enum=build.bazel.remote.execution.v2.ExecuteOperationMetadata_Stage" json:"stage,omitempty"`
-	// The digest of the [Action][build.bazel.remote.execution.v2.Action]
-	// being executed.
-	ActionDigest *Digest `protobuf:"bytes,2,opt,name=action_digest,json=actionDigest,proto3" json:"action_digest,omitempty"`
-	// If set, the client can use this name with
-	// [ByteStream.Read][google.bytestream.ByteStream.Read] to stream the
-	// standard output.
-	StdoutStreamName string `protobuf:"bytes,3,opt,name=stdout_stream_name,json=stdoutStreamName,proto3" json:"stdout_stream_name,omitempty"`
-	// If set, the client can use this name with
-	// [ByteStream.Read][google.bytestream.ByteStream.Read] to stream the
-	// standard error.
-	StderrStreamName     string   `protobuf:"bytes,4,opt,name=stderr_stream_name,json=stderrStreamName,proto3" json:"stderr_stream_name,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *ExecuteOperationMetadata) Reset()         { *m = ExecuteOperationMetadata{} }
-func (m *ExecuteOperationMetadata) String() string { return proto.CompactTextString(m) }
-func (*ExecuteOperationMetadata) ProtoMessage()    {}
-func (*ExecuteOperationMetadata) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{19}
-}
-
-func (m *ExecuteOperationMetadata) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ExecuteOperationMetadata.Unmarshal(m, b)
-}
-func (m *ExecuteOperationMetadata) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ExecuteOperationMetadata.Marshal(b, m, deterministic)
-}
-func (m *ExecuteOperationMetadata) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ExecuteOperationMetadata.Merge(m, src)
-}
-func (m *ExecuteOperationMetadata) XXX_Size() int {
-	return xxx_messageInfo_ExecuteOperationMetadata.Size(m)
-}
-func (m *ExecuteOperationMetadata) XXX_DiscardUnknown() {
-	xxx_messageInfo_ExecuteOperationMetadata.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ExecuteOperationMetadata proto.InternalMessageInfo
-
-func (m *ExecuteOperationMetadata) GetStage() ExecuteOperationMetadata_Stage {
-	if m != nil {
-		return m.Stage
-	}
-	return ExecuteOperationMetadata_UNKNOWN
-}
-
-func (m *ExecuteOperationMetadata) GetActionDigest() *Digest {
-	if m != nil {
-		return m.ActionDigest
-	}
-	return nil
-}
-
-func (m *ExecuteOperationMetadata) GetStdoutStreamName() string {
-	if m != nil {
-		return m.StdoutStreamName
-	}
-	return ""
-}
-
-func (m *ExecuteOperationMetadata) GetStderrStreamName() string {
-	if m != nil {
-		return m.StderrStreamName
-	}
-	return ""
-}
-
-// A request message for
-// [WaitExecution][build.bazel.remote.execution.v2.Execution.WaitExecution].
-type WaitExecutionRequest struct {
-	// The name of the [Operation][google.longrunning.Operation]
-	// returned by [Execute][build.bazel.remote.execution.v2.Execution.Execute].
-	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *WaitExecutionRequest) Reset()         { *m = WaitExecutionRequest{} }
-func (m *WaitExecutionRequest) String() string { return proto.CompactTextString(m) }
-func (*WaitExecutionRequest) ProtoMessage()    {}
-func (*WaitExecutionRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{20}
-}
-
-func (m *WaitExecutionRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_WaitExecutionRequest.Unmarshal(m, b)
-}
-func (m *WaitExecutionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_WaitExecutionRequest.Marshal(b, m, deterministic)
-}
-func (m *WaitExecutionRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_WaitExecutionRequest.Merge(m, src)
-}
-func (m *WaitExecutionRequest) XXX_Size() int {
-	return xxx_messageInfo_WaitExecutionRequest.Size(m)
-}
-func (m *WaitExecutionRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_WaitExecutionRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_WaitExecutionRequest proto.InternalMessageInfo
-
-func (m *WaitExecutionRequest) GetName() string {
-	if m != nil {
-		return m.Name
-	}
-	return ""
-}
-
-// A request message for
-// [ActionCache.GetActionResult][build.bazel.remote.execution.v2.ActionCache.GetActionResult].
-type GetActionResultRequest struct {
-	// The instance of the execution system to operate against. A server may
-	// support multiple instances of the execution system (with their own workers,
-	// storage, caches, etc.). The server MAY require use of this field to select
-	// between them in an implementation-defined fashion, otherwise it can be
-	// omitted.
-	InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"`
-	// The digest of the [Action][build.bazel.remote.execution.v2.Action]
-	// whose result is requested.
-	ActionDigest         *Digest  `protobuf:"bytes,2,opt,name=action_digest,json=actionDigest,proto3" json:"action_digest,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *GetActionResultRequest) Reset()         { *m = GetActionResultRequest{} }
-func (m *GetActionResultRequest) String() string { return proto.CompactTextString(m) }
-func (*GetActionResultRequest) ProtoMessage()    {}
-func (*GetActionResultRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{21}
-}
-
-func (m *GetActionResultRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetActionResultRequest.Unmarshal(m, b)
-}
-func (m *GetActionResultRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetActionResultRequest.Marshal(b, m, deterministic)
-}
-func (m *GetActionResultRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetActionResultRequest.Merge(m, src)
-}
-func (m *GetActionResultRequest) XXX_Size() int {
-	return xxx_messageInfo_GetActionResultRequest.Size(m)
-}
-func (m *GetActionResultRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetActionResultRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetActionResultRequest proto.InternalMessageInfo
-
-func (m *GetActionResultRequest) GetInstanceName() string {
-	if m != nil {
-		return m.InstanceName
-	}
-	return ""
-}
-
-func (m *GetActionResultRequest) GetActionDigest() *Digest {
-	if m != nil {
-		return m.ActionDigest
-	}
-	return nil
-}
-
-// A request message for
-// [ActionCache.UpdateActionResult][build.bazel.remote.execution.v2.ActionCache.UpdateActionResult].
-type UpdateActionResultRequest struct {
-	// The instance of the execution system to operate against. A server may
-	// support multiple instances of the execution system (with their own workers,
-	// storage, caches, etc.). The server MAY require use of this field to select
-	// between them in an implementation-defined fashion, otherwise it can be
-	// omitted.
-	InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"`
-	// The digest of the [Action][build.bazel.remote.execution.v2.Action]
-	// whose result is being uploaded.
-	ActionDigest *Digest `protobuf:"bytes,2,opt,name=action_digest,json=actionDigest,proto3" json:"action_digest,omitempty"`
-	// The [ActionResult][build.bazel.remote.execution.v2.ActionResult]
-	// to store in the cache.
-	ActionResult *ActionResult `protobuf:"bytes,3,opt,name=action_result,json=actionResult,proto3" json:"action_result,omitempty"`
-	// An optional policy for the results of this execution in the remote cache.
-	// The server will have a default policy if this is not provided.
-	// This may be applied to both the ActionResult and the associated blobs.
-	ResultsCachePolicy   *ResultsCachePolicy `protobuf:"bytes,4,opt,name=results_cache_policy,json=resultsCachePolicy,proto3" json:"results_cache_policy,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
-	XXX_unrecognized     []byte              `json:"-"`
-	XXX_sizecache        int32               `json:"-"`
-}
-
-func (m *UpdateActionResultRequest) Reset()         { *m = UpdateActionResultRequest{} }
-func (m *UpdateActionResultRequest) String() string { return proto.CompactTextString(m) }
-func (*UpdateActionResultRequest) ProtoMessage()    {}
-func (*UpdateActionResultRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{22}
-}
-
-func (m *UpdateActionResultRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_UpdateActionResultRequest.Unmarshal(m, b)
-}
-func (m *UpdateActionResultRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_UpdateActionResultRequest.Marshal(b, m, deterministic)
-}
-func (m *UpdateActionResultRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_UpdateActionResultRequest.Merge(m, src)
-}
-func (m *UpdateActionResultRequest) XXX_Size() int {
-	return xxx_messageInfo_UpdateActionResultRequest.Size(m)
-}
-func (m *UpdateActionResultRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_UpdateActionResultRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_UpdateActionResultRequest proto.InternalMessageInfo
-
-func (m *UpdateActionResultRequest) GetInstanceName() string {
-	if m != nil {
-		return m.InstanceName
-	}
-	return ""
-}
-
-func (m *UpdateActionResultRequest) GetActionDigest() *Digest {
-	if m != nil {
-		return m.ActionDigest
-	}
-	return nil
-}
-
-func (m *UpdateActionResultRequest) GetActionResult() *ActionResult {
-	if m != nil {
-		return m.ActionResult
-	}
-	return nil
-}
-
-func (m *UpdateActionResultRequest) GetResultsCachePolicy() *ResultsCachePolicy {
-	if m != nil {
-		return m.ResultsCachePolicy
-	}
-	return nil
-}
-
-// A request message for
-// [ContentAddressableStorage.FindMissingBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.FindMissingBlobs].
-type FindMissingBlobsRequest struct {
-	// The instance of the execution system to operate against. A server may
-	// support multiple instances of the execution system (with their own workers,
-	// storage, caches, etc.). The server MAY require use of this field to select
-	// between them in an implementation-defined fashion, otherwise it can be
-	// omitted.
-	InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"`
-	// A list of the blobs to check.
-	BlobDigests          []*Digest `protobuf:"bytes,2,rep,name=blob_digests,json=blobDigests,proto3" json:"blob_digests,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
-	XXX_unrecognized     []byte    `json:"-"`
-	XXX_sizecache        int32     `json:"-"`
-}
-
-func (m *FindMissingBlobsRequest) Reset()         { *m = FindMissingBlobsRequest{} }
-func (m *FindMissingBlobsRequest) String() string { return proto.CompactTextString(m) }
-func (*FindMissingBlobsRequest) ProtoMessage()    {}
-func (*FindMissingBlobsRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{23}
-}
-
-func (m *FindMissingBlobsRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_FindMissingBlobsRequest.Unmarshal(m, b)
-}
-func (m *FindMissingBlobsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_FindMissingBlobsRequest.Marshal(b, m, deterministic)
-}
-func (m *FindMissingBlobsRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_FindMissingBlobsRequest.Merge(m, src)
-}
-func (m *FindMissingBlobsRequest) XXX_Size() int {
-	return xxx_messageInfo_FindMissingBlobsRequest.Size(m)
-}
-func (m *FindMissingBlobsRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_FindMissingBlobsRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_FindMissingBlobsRequest proto.InternalMessageInfo
-
-func (m *FindMissingBlobsRequest) GetInstanceName() string {
-	if m != nil {
-		return m.InstanceName
-	}
-	return ""
-}
-
-func (m *FindMissingBlobsRequest) GetBlobDigests() []*Digest {
-	if m != nil {
-		return m.BlobDigests
-	}
-	return nil
-}
-
-// A response message for
-// [ContentAddressableStorage.FindMissingBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.FindMissingBlobs].
-type FindMissingBlobsResponse struct {
-	// A list of the blobs requested *not* present in the storage.
-	MissingBlobDigests   []*Digest `protobuf:"bytes,2,rep,name=missing_blob_digests,json=missingBlobDigests,proto3" json:"missing_blob_digests,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
-	XXX_unrecognized     []byte    `json:"-"`
-	XXX_sizecache        int32     `json:"-"`
-}
-
-func (m *FindMissingBlobsResponse) Reset()         { *m = FindMissingBlobsResponse{} }
-func (m *FindMissingBlobsResponse) String() string { return proto.CompactTextString(m) }
-func (*FindMissingBlobsResponse) ProtoMessage()    {}
-func (*FindMissingBlobsResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{24}
-}
-
-func (m *FindMissingBlobsResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_FindMissingBlobsResponse.Unmarshal(m, b)
-}
-func (m *FindMissingBlobsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_FindMissingBlobsResponse.Marshal(b, m, deterministic)
-}
-func (m *FindMissingBlobsResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_FindMissingBlobsResponse.Merge(m, src)
-}
-func (m *FindMissingBlobsResponse) XXX_Size() int {
-	return xxx_messageInfo_FindMissingBlobsResponse.Size(m)
-}
-func (m *FindMissingBlobsResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_FindMissingBlobsResponse.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_FindMissingBlobsResponse proto.InternalMessageInfo
-
-func (m *FindMissingBlobsResponse) GetMissingBlobDigests() []*Digest {
-	if m != nil {
-		return m.MissingBlobDigests
-	}
-	return nil
-}
-
-// A request message for
-// [ContentAddressableStorage.BatchUpdateBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchUpdateBlobs].
-type BatchUpdateBlobsRequest struct {
-	// The instance of the execution system to operate against. A server may
-	// support multiple instances of the execution system (with their own workers,
-	// storage, caches, etc.). The server MAY require use of this field to select
-	// between them in an implementation-defined fashion, otherwise it can be
-	// omitted.
-	InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"`
-	// The individual upload requests.
-	Requests             []*BatchUpdateBlobsRequest_Request `protobuf:"bytes,2,rep,name=requests,proto3" json:"requests,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                           `json:"-"`
-	XXX_unrecognized     []byte                             `json:"-"`
-	XXX_sizecache        int32                              `json:"-"`
-}
-
-func (m *BatchUpdateBlobsRequest) Reset()         { *m = BatchUpdateBlobsRequest{} }
-func (m *BatchUpdateBlobsRequest) String() string { return proto.CompactTextString(m) }
-func (*BatchUpdateBlobsRequest) ProtoMessage()    {}
-func (*BatchUpdateBlobsRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{25}
-}
-
-func (m *BatchUpdateBlobsRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_BatchUpdateBlobsRequest.Unmarshal(m, b)
-}
-func (m *BatchUpdateBlobsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_BatchUpdateBlobsRequest.Marshal(b, m, deterministic)
-}
-func (m *BatchUpdateBlobsRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_BatchUpdateBlobsRequest.Merge(m, src)
-}
-func (m *BatchUpdateBlobsRequest) XXX_Size() int {
-	return xxx_messageInfo_BatchUpdateBlobsRequest.Size(m)
-}
-func (m *BatchUpdateBlobsRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_BatchUpdateBlobsRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_BatchUpdateBlobsRequest proto.InternalMessageInfo
-
-func (m *BatchUpdateBlobsRequest) GetInstanceName() string {
-	if m != nil {
-		return m.InstanceName
-	}
-	return ""
-}
-
-func (m *BatchUpdateBlobsRequest) GetRequests() []*BatchUpdateBlobsRequest_Request {
-	if m != nil {
-		return m.Requests
-	}
-	return nil
-}
-
-// A request corresponding to a single blob that the client wants to upload.
-type BatchUpdateBlobsRequest_Request struct {
-	// The digest of the blob. This MUST be the digest of `data`.
-	Digest *Digest `protobuf:"bytes,1,opt,name=digest,proto3" json:"digest,omitempty"`
-	// The raw binary data.
-	Data                 []byte   `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *BatchUpdateBlobsRequest_Request) Reset()         { *m = BatchUpdateBlobsRequest_Request{} }
-func (m *BatchUpdateBlobsRequest_Request) String() string { return proto.CompactTextString(m) }
-func (*BatchUpdateBlobsRequest_Request) ProtoMessage()    {}
-func (*BatchUpdateBlobsRequest_Request) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{25, 0}
-}
-
-func (m *BatchUpdateBlobsRequest_Request) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_BatchUpdateBlobsRequest_Request.Unmarshal(m, b)
-}
-func (m *BatchUpdateBlobsRequest_Request) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_BatchUpdateBlobsRequest_Request.Marshal(b, m, deterministic)
-}
-func (m *BatchUpdateBlobsRequest_Request) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_BatchUpdateBlobsRequest_Request.Merge(m, src)
-}
-func (m *BatchUpdateBlobsRequest_Request) XXX_Size() int {
-	return xxx_messageInfo_BatchUpdateBlobsRequest_Request.Size(m)
-}
-func (m *BatchUpdateBlobsRequest_Request) XXX_DiscardUnknown() {
-	xxx_messageInfo_BatchUpdateBlobsRequest_Request.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_BatchUpdateBlobsRequest_Request proto.InternalMessageInfo
-
-func (m *BatchUpdateBlobsRequest_Request) GetDigest() *Digest {
-	if m != nil {
-		return m.Digest
-	}
-	return nil
-}
-
-func (m *BatchUpdateBlobsRequest_Request) GetData() []byte {
-	if m != nil {
-		return m.Data
-	}
-	return nil
-}
-
-// A response message for
-// [ContentAddressableStorage.BatchUpdateBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchUpdateBlobs].
-type BatchUpdateBlobsResponse struct {
-	// The responses to the requests.
-	Responses            []*BatchUpdateBlobsResponse_Response `protobuf:"bytes,1,rep,name=responses,proto3" json:"responses,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                             `json:"-"`
-	XXX_unrecognized     []byte                               `json:"-"`
-	XXX_sizecache        int32                                `json:"-"`
-}
-
-func (m *BatchUpdateBlobsResponse) Reset()         { *m = BatchUpdateBlobsResponse{} }
-func (m *BatchUpdateBlobsResponse) String() string { return proto.CompactTextString(m) }
-func (*BatchUpdateBlobsResponse) ProtoMessage()    {}
-func (*BatchUpdateBlobsResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{26}
-}
-
-func (m *BatchUpdateBlobsResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_BatchUpdateBlobsResponse.Unmarshal(m, b)
-}
-func (m *BatchUpdateBlobsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_BatchUpdateBlobsResponse.Marshal(b, m, deterministic)
-}
-func (m *BatchUpdateBlobsResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_BatchUpdateBlobsResponse.Merge(m, src)
-}
-func (m *BatchUpdateBlobsResponse) XXX_Size() int {
-	return xxx_messageInfo_BatchUpdateBlobsResponse.Size(m)
-}
-func (m *BatchUpdateBlobsResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_BatchUpdateBlobsResponse.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_BatchUpdateBlobsResponse proto.InternalMessageInfo
-
-func (m *BatchUpdateBlobsResponse) GetResponses() []*BatchUpdateBlobsResponse_Response {
-	if m != nil {
-		return m.Responses
-	}
-	return nil
-}
-
-// A response corresponding to a single blob that the client tried to upload.
-type BatchUpdateBlobsResponse_Response struct {
-	// The blob digest to which this response corresponds.
-	Digest *Digest `protobuf:"bytes,1,opt,name=digest,proto3" json:"digest,omitempty"`
-	// The result of attempting to upload that blob.
-	Status               *status.Status `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
-	XXX_unrecognized     []byte         `json:"-"`
-	XXX_sizecache        int32          `json:"-"`
-}
-
-func (m *BatchUpdateBlobsResponse_Response) Reset()         { *m = BatchUpdateBlobsResponse_Response{} }
-func (m *BatchUpdateBlobsResponse_Response) String() string { return proto.CompactTextString(m) }
-func (*BatchUpdateBlobsResponse_Response) ProtoMessage()    {}
-func (*BatchUpdateBlobsResponse_Response) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{26, 0}
-}
-
-func (m *BatchUpdateBlobsResponse_Response) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_BatchUpdateBlobsResponse_Response.Unmarshal(m, b)
-}
-func (m *BatchUpdateBlobsResponse_Response) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_BatchUpdateBlobsResponse_Response.Marshal(b, m, deterministic)
-}
-func (m *BatchUpdateBlobsResponse_Response) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_BatchUpdateBlobsResponse_Response.Merge(m, src)
-}
-func (m *BatchUpdateBlobsResponse_Response) XXX_Size() int {
-	return xxx_messageInfo_BatchUpdateBlobsResponse_Response.Size(m)
-}
-func (m *BatchUpdateBlobsResponse_Response) XXX_DiscardUnknown() {
-	xxx_messageInfo_BatchUpdateBlobsResponse_Response.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_BatchUpdateBlobsResponse_Response proto.InternalMessageInfo
-
-func (m *BatchUpdateBlobsResponse_Response) GetDigest() *Digest {
-	if m != nil {
-		return m.Digest
-	}
-	return nil
-}
-
-func (m *BatchUpdateBlobsResponse_Response) GetStatus() *status.Status {
-	if m != nil {
-		return m.Status
-	}
-	return nil
-}
-
-// A request message for
-// [ContentAddressableStorage.BatchReadBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchReadBlobs].
-type BatchReadBlobsRequest struct {
-	// The instance of the execution system to operate against. A server may
-	// support multiple instances of the execution system (with their own workers,
-	// storage, caches, etc.). The server MAY require use of this field to select
-	// between them in an implementation-defined fashion, otherwise it can be
-	// omitted.
-	InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"`
-	// The individual blob digests.
-	Digests              []*Digest `protobuf:"bytes,2,rep,name=digests,proto3" json:"digests,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
-	XXX_unrecognized     []byte    `json:"-"`
-	XXX_sizecache        int32     `json:"-"`
-}
-
-func (m *BatchReadBlobsRequest) Reset()         { *m = BatchReadBlobsRequest{} }
-func (m *BatchReadBlobsRequest) String() string { return proto.CompactTextString(m) }
-func (*BatchReadBlobsRequest) ProtoMessage()    {}
-func (*BatchReadBlobsRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{27}
-}
-
-func (m *BatchReadBlobsRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_BatchReadBlobsRequest.Unmarshal(m, b)
-}
-func (m *BatchReadBlobsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_BatchReadBlobsRequest.Marshal(b, m, deterministic)
-}
-func (m *BatchReadBlobsRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_BatchReadBlobsRequest.Merge(m, src)
-}
-func (m *BatchReadBlobsRequest) XXX_Size() int {
-	return xxx_messageInfo_BatchReadBlobsRequest.Size(m)
-}
-func (m *BatchReadBlobsRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_BatchReadBlobsRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_BatchReadBlobsRequest proto.InternalMessageInfo
-
-func (m *BatchReadBlobsRequest) GetInstanceName() string {
-	if m != nil {
-		return m.InstanceName
-	}
-	return ""
-}
-
-func (m *BatchReadBlobsRequest) GetDigests() []*Digest {
-	if m != nil {
-		return m.Digests
-	}
-	return nil
-}
-
-// A response message for
-// [ContentAddressableStorage.BatchReadBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchReadBlobs].
-type BatchReadBlobsResponse struct {
-	// The responses to the requests.
-	Responses            []*BatchReadBlobsResponse_Response `protobuf:"bytes,1,rep,name=responses,proto3" json:"responses,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                           `json:"-"`
-	XXX_unrecognized     []byte                             `json:"-"`
-	XXX_sizecache        int32                              `json:"-"`
-}
-
-func (m *BatchReadBlobsResponse) Reset()         { *m = BatchReadBlobsResponse{} }
-func (m *BatchReadBlobsResponse) String() string { return proto.CompactTextString(m) }
-func (*BatchReadBlobsResponse) ProtoMessage()    {}
-func (*BatchReadBlobsResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{28}
-}
-
-func (m *BatchReadBlobsResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_BatchReadBlobsResponse.Unmarshal(m, b)
-}
-func (m *BatchReadBlobsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_BatchReadBlobsResponse.Marshal(b, m, deterministic)
-}
-func (m *BatchReadBlobsResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_BatchReadBlobsResponse.Merge(m, src)
-}
-func (m *BatchReadBlobsResponse) XXX_Size() int {
-	return xxx_messageInfo_BatchReadBlobsResponse.Size(m)
-}
-func (m *BatchReadBlobsResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_BatchReadBlobsResponse.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_BatchReadBlobsResponse proto.InternalMessageInfo
-
-func (m *BatchReadBlobsResponse) GetResponses() []*BatchReadBlobsResponse_Response {
-	if m != nil {
-		return m.Responses
-	}
-	return nil
-}
-
-// A response corresponding to a single blob that the client tried to download.
-type BatchReadBlobsResponse_Response struct {
-	// The digest to which this response corresponds.
-	Digest *Digest `protobuf:"bytes,1,opt,name=digest,proto3" json:"digest,omitempty"`
-	// The raw binary data.
-	Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"`
-	// The result of attempting to download that blob.
-	Status               *status.Status `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
-	XXX_unrecognized     []byte         `json:"-"`
-	XXX_sizecache        int32          `json:"-"`
-}
-
-func (m *BatchReadBlobsResponse_Response) Reset()         { *m = BatchReadBlobsResponse_Response{} }
-func (m *BatchReadBlobsResponse_Response) String() string { return proto.CompactTextString(m) }
-func (*BatchReadBlobsResponse_Response) ProtoMessage()    {}
-func (*BatchReadBlobsResponse_Response) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{28, 0}
-}
-
-func (m *BatchReadBlobsResponse_Response) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_BatchReadBlobsResponse_Response.Unmarshal(m, b)
-}
-func (m *BatchReadBlobsResponse_Response) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_BatchReadBlobsResponse_Response.Marshal(b, m, deterministic)
-}
-func (m *BatchReadBlobsResponse_Response) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_BatchReadBlobsResponse_Response.Merge(m, src)
-}
-func (m *BatchReadBlobsResponse_Response) XXX_Size() int {
-	return xxx_messageInfo_BatchReadBlobsResponse_Response.Size(m)
-}
-func (m *BatchReadBlobsResponse_Response) XXX_DiscardUnknown() {
-	xxx_messageInfo_BatchReadBlobsResponse_Response.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_BatchReadBlobsResponse_Response proto.InternalMessageInfo
-
-func (m *BatchReadBlobsResponse_Response) GetDigest() *Digest {
-	if m != nil {
-		return m.Digest
-	}
-	return nil
-}
-
-func (m *BatchReadBlobsResponse_Response) GetData() []byte {
-	if m != nil {
-		return m.Data
-	}
-	return nil
-}
-
-func (m *BatchReadBlobsResponse_Response) GetStatus() *status.Status {
-	if m != nil {
-		return m.Status
-	}
-	return nil
-}
-
-// A request message for
-// [ContentAddressableStorage.GetTree][build.bazel.remote.execution.v2.ContentAddressableStorage.GetTree].
-type GetTreeRequest struct {
-	// The instance of the execution system to operate against. A server may
-	// support multiple instances of the execution system (with their own workers,
-	// storage, caches, etc.). The server MAY require use of this field to select
-	// between them in an implementation-defined fashion, otherwise it can be
-	// omitted.
-	InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"`
-	// The digest of the root, which must be an encoded
-	// [Directory][build.bazel.remote.execution.v2.Directory] message
-	// stored in the
-	// [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
-	RootDigest *Digest `protobuf:"bytes,2,opt,name=root_digest,json=rootDigest,proto3" json:"root_digest,omitempty"`
-	// A maximum page size to request. If present, the server will request no more
-	// than this many items. Regardless of whether a page size is specified, the
-	// server may place its own limit on the number of items to be returned and
-	// require the client to retrieve more items using a subsequent request.
-	PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
-	// A page token, which must be a value received in a previous
-	// [GetTreeResponse][build.bazel.remote.execution.v2.GetTreeResponse].
-	// If present, the server will use it to return the following page of results.
-	PageToken            string   `protobuf:"bytes,4,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *GetTreeRequest) Reset()         { *m = GetTreeRequest{} }
-func (m *GetTreeRequest) String() string { return proto.CompactTextString(m) }
-func (*GetTreeRequest) ProtoMessage()    {}
-func (*GetTreeRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{29}
-}
-
-func (m *GetTreeRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetTreeRequest.Unmarshal(m, b)
-}
-func (m *GetTreeRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetTreeRequest.Marshal(b, m, deterministic)
-}
-func (m *GetTreeRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetTreeRequest.Merge(m, src)
-}
-func (m *GetTreeRequest) XXX_Size() int {
-	return xxx_messageInfo_GetTreeRequest.Size(m)
-}
-func (m *GetTreeRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetTreeRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetTreeRequest proto.InternalMessageInfo
-
-func (m *GetTreeRequest) GetInstanceName() string {
-	if m != nil {
-		return m.InstanceName
-	}
-	return ""
-}
-
-func (m *GetTreeRequest) GetRootDigest() *Digest {
-	if m != nil {
-		return m.RootDigest
-	}
-	return nil
-}
-
-func (m *GetTreeRequest) GetPageSize() int32 {
-	if m != nil {
-		return m.PageSize
-	}
-	return 0
-}
-
-func (m *GetTreeRequest) GetPageToken() string {
-	if m != nil {
-		return m.PageToken
-	}
-	return ""
-}
-
-// A response message for
-// [ContentAddressableStorage.GetTree][build.bazel.remote.execution.v2.ContentAddressableStorage.GetTree].
-type GetTreeResponse struct {
-	// The directories descended from the requested root.
-	Directories []*Directory `protobuf:"bytes,1,rep,name=directories,proto3" json:"directories,omitempty"`
-	// If present, signifies that there are more results which the client can
-	// retrieve by passing this as the page_token in a subsequent
-	// [request][build.bazel.remote.execution.v2.GetTreeRequest].
-	// If empty, signifies that this is the last page of results.
-	NextPageToken        string   `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *GetTreeResponse) Reset()         { *m = GetTreeResponse{} }
-func (m *GetTreeResponse) String() string { return proto.CompactTextString(m) }
-func (*GetTreeResponse) ProtoMessage()    {}
-func (*GetTreeResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{30}
-}
-
-func (m *GetTreeResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetTreeResponse.Unmarshal(m, b)
-}
-func (m *GetTreeResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetTreeResponse.Marshal(b, m, deterministic)
-}
-func (m *GetTreeResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetTreeResponse.Merge(m, src)
-}
-func (m *GetTreeResponse) XXX_Size() int {
-	return xxx_messageInfo_GetTreeResponse.Size(m)
-}
-func (m *GetTreeResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetTreeResponse.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetTreeResponse proto.InternalMessageInfo
-
-func (m *GetTreeResponse) GetDirectories() []*Directory {
-	if m != nil {
-		return m.Directories
-	}
-	return nil
-}
-
-func (m *GetTreeResponse) GetNextPageToken() string {
-	if m != nil {
-		return m.NextPageToken
-	}
-	return ""
-}
-
-// A request message for
-// [Capabilities.GetCapabilities][build.bazel.remote.execution.v2.Capabilities.GetCapabilities].
-type GetCapabilitiesRequest struct {
-	// The instance of the execution system to operate against. A server may
-	// support multiple instances of the execution system (with their own workers,
-	// storage, caches, etc.). The server MAY require use of this field to select
-	// between them in an implementation-defined fashion, otherwise it can be
-	// omitted.
-	InstanceName         string   `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *GetCapabilitiesRequest) Reset()         { *m = GetCapabilitiesRequest{} }
-func (m *GetCapabilitiesRequest) String() string { return proto.CompactTextString(m) }
-func (*GetCapabilitiesRequest) ProtoMessage()    {}
-func (*GetCapabilitiesRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{31}
-}
-
-func (m *GetCapabilitiesRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetCapabilitiesRequest.Unmarshal(m, b)
-}
-func (m *GetCapabilitiesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetCapabilitiesRequest.Marshal(b, m, deterministic)
-}
-func (m *GetCapabilitiesRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetCapabilitiesRequest.Merge(m, src)
-}
-func (m *GetCapabilitiesRequest) XXX_Size() int {
-	return xxx_messageInfo_GetCapabilitiesRequest.Size(m)
-}
-func (m *GetCapabilitiesRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetCapabilitiesRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetCapabilitiesRequest proto.InternalMessageInfo
-
-func (m *GetCapabilitiesRequest) GetInstanceName() string {
-	if m != nil {
-		return m.InstanceName
-	}
-	return ""
-}
-
-// A response message for
-// [Capabilities.GetCapabilities][build.bazel.remote.execution.v2.Capabilities.GetCapabilities].
-type ServerCapabilities struct {
-	// Capabilities of the remote cache system.
-	CacheCapabilities *CacheCapabilities `protobuf:"bytes,1,opt,name=cache_capabilities,json=cacheCapabilities,proto3" json:"cache_capabilities,omitempty"`
-	// Capabilities of the remote execution system.
-	ExecutionCapabilities *ExecutionCapabilities `protobuf:"bytes,2,opt,name=execution_capabilities,json=executionCapabilities,proto3" json:"execution_capabilities,omitempty"`
-	// Earliest RE API version supported, including deprecated versions.
-	DeprecatedApiVersion *semver.SemVer `protobuf:"bytes,3,opt,name=deprecated_api_version,json=deprecatedApiVersion,proto3" json:"deprecated_api_version,omitempty"`
-	// Earliest non-deprecated RE API version supported.
-	LowApiVersion *semver.SemVer `protobuf:"bytes,4,opt,name=low_api_version,json=lowApiVersion,proto3" json:"low_api_version,omitempty"`
-	// Latest RE API version supported.
-	HighApiVersion       *semver.SemVer `protobuf:"bytes,5,opt,name=high_api_version,json=highApiVersion,proto3" json:"high_api_version,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
-	XXX_unrecognized     []byte         `json:"-"`
-	XXX_sizecache        int32          `json:"-"`
-}
-
-func (m *ServerCapabilities) Reset()         { *m = ServerCapabilities{} }
-func (m *ServerCapabilities) String() string { return proto.CompactTextString(m) }
-func (*ServerCapabilities) ProtoMessage()    {}
-func (*ServerCapabilities) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{32}
-}
-
-func (m *ServerCapabilities) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ServerCapabilities.Unmarshal(m, b)
-}
-func (m *ServerCapabilities) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ServerCapabilities.Marshal(b, m, deterministic)
-}
-func (m *ServerCapabilities) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ServerCapabilities.Merge(m, src)
-}
-func (m *ServerCapabilities) XXX_Size() int {
-	return xxx_messageInfo_ServerCapabilities.Size(m)
-}
-func (m *ServerCapabilities) XXX_DiscardUnknown() {
-	xxx_messageInfo_ServerCapabilities.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ServerCapabilities proto.InternalMessageInfo
-
-func (m *ServerCapabilities) GetCacheCapabilities() *CacheCapabilities {
-	if m != nil {
-		return m.CacheCapabilities
-	}
-	return nil
-}
-
-func (m *ServerCapabilities) GetExecutionCapabilities() *ExecutionCapabilities {
-	if m != nil {
-		return m.ExecutionCapabilities
-	}
-	return nil
-}
-
-func (m *ServerCapabilities) GetDeprecatedApiVersion() *semver.SemVer {
-	if m != nil {
-		return m.DeprecatedApiVersion
-	}
-	return nil
-}
-
-func (m *ServerCapabilities) GetLowApiVersion() *semver.SemVer {
-	if m != nil {
-		return m.LowApiVersion
-	}
-	return nil
-}
-
-func (m *ServerCapabilities) GetHighApiVersion() *semver.SemVer {
-	if m != nil {
-		return m.HighApiVersion
-	}
-	return nil
-}
-
-// Describes the server/instance capabilities for updating the action cache.
-type ActionCacheUpdateCapabilities struct {
-	UpdateEnabled        bool     `protobuf:"varint,1,opt,name=update_enabled,json=updateEnabled,proto3" json:"update_enabled,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *ActionCacheUpdateCapabilities) Reset()         { *m = ActionCacheUpdateCapabilities{} }
-func (m *ActionCacheUpdateCapabilities) String() string { return proto.CompactTextString(m) }
-func (*ActionCacheUpdateCapabilities) ProtoMessage()    {}
-func (*ActionCacheUpdateCapabilities) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{33}
-}
-
-func (m *ActionCacheUpdateCapabilities) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ActionCacheUpdateCapabilities.Unmarshal(m, b)
-}
-func (m *ActionCacheUpdateCapabilities) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ActionCacheUpdateCapabilities.Marshal(b, m, deterministic)
-}
-func (m *ActionCacheUpdateCapabilities) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ActionCacheUpdateCapabilities.Merge(m, src)
-}
-func (m *ActionCacheUpdateCapabilities) XXX_Size() int {
-	return xxx_messageInfo_ActionCacheUpdateCapabilities.Size(m)
-}
-func (m *ActionCacheUpdateCapabilities) XXX_DiscardUnknown() {
-	xxx_messageInfo_ActionCacheUpdateCapabilities.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ActionCacheUpdateCapabilities proto.InternalMessageInfo
-
-func (m *ActionCacheUpdateCapabilities) GetUpdateEnabled() bool {
-	if m != nil {
-		return m.UpdateEnabled
-	}
-	return false
-}
-
-// Allowed values for priority in
-// [ResultsCachePolicy][google.devtools.remoteexecution.v2.ResultsCachePolicy]
-// Used for querying both cache and execution valid priority ranges.
-type PriorityCapabilities struct {
-	Priorities           []*PriorityCapabilities_PriorityRange `protobuf:"bytes,1,rep,name=priorities,proto3" json:"priorities,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                              `json:"-"`
-	XXX_unrecognized     []byte                                `json:"-"`
-	XXX_sizecache        int32                                 `json:"-"`
-}
-
-func (m *PriorityCapabilities) Reset()         { *m = PriorityCapabilities{} }
-func (m *PriorityCapabilities) String() string { return proto.CompactTextString(m) }
-func (*PriorityCapabilities) ProtoMessage()    {}
-func (*PriorityCapabilities) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{34}
-}
-
-func (m *PriorityCapabilities) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_PriorityCapabilities.Unmarshal(m, b)
-}
-func (m *PriorityCapabilities) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_PriorityCapabilities.Marshal(b, m, deterministic)
-}
-func (m *PriorityCapabilities) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_PriorityCapabilities.Merge(m, src)
-}
-func (m *PriorityCapabilities) XXX_Size() int {
-	return xxx_messageInfo_PriorityCapabilities.Size(m)
-}
-func (m *PriorityCapabilities) XXX_DiscardUnknown() {
-	xxx_messageInfo_PriorityCapabilities.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_PriorityCapabilities proto.InternalMessageInfo
-
-func (m *PriorityCapabilities) GetPriorities() []*PriorityCapabilities_PriorityRange {
-	if m != nil {
-		return m.Priorities
-	}
-	return nil
-}
-
-// Supported range of priorities, including boundaries.
-type PriorityCapabilities_PriorityRange struct {
-	MinPriority          int32    `protobuf:"varint,1,opt,name=min_priority,json=minPriority,proto3" json:"min_priority,omitempty"`
-	MaxPriority          int32    `protobuf:"varint,2,opt,name=max_priority,json=maxPriority,proto3" json:"max_priority,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *PriorityCapabilities_PriorityRange) Reset()         { *m = PriorityCapabilities_PriorityRange{} }
-func (m *PriorityCapabilities_PriorityRange) String() string { return proto.CompactTextString(m) }
-func (*PriorityCapabilities_PriorityRange) ProtoMessage()    {}
-func (*PriorityCapabilities_PriorityRange) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{34, 0}
-}
-
-func (m *PriorityCapabilities_PriorityRange) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_PriorityCapabilities_PriorityRange.Unmarshal(m, b)
-}
-func (m *PriorityCapabilities_PriorityRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_PriorityCapabilities_PriorityRange.Marshal(b, m, deterministic)
-}
-func (m *PriorityCapabilities_PriorityRange) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_PriorityCapabilities_PriorityRange.Merge(m, src)
-}
-func (m *PriorityCapabilities_PriorityRange) XXX_Size() int {
-	return xxx_messageInfo_PriorityCapabilities_PriorityRange.Size(m)
-}
-func (m *PriorityCapabilities_PriorityRange) XXX_DiscardUnknown() {
-	xxx_messageInfo_PriorityCapabilities_PriorityRange.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_PriorityCapabilities_PriorityRange proto.InternalMessageInfo
-
-func (m *PriorityCapabilities_PriorityRange) GetMinPriority() int32 {
-	if m != nil {
-		return m.MinPriority
-	}
-	return 0
-}
-
-func (m *PriorityCapabilities_PriorityRange) GetMaxPriority() int32 {
-	if m != nil {
-		return m.MaxPriority
-	}
-	return 0
-}
-
-// Capabilities of the remote cache system.
-type CacheCapabilities struct {
-	// All the digest functions supported by the remote cache.
-	// Remote cache may support multiple digest functions simultaneously.
-	DigestFunction []DigestFunction `protobuf:"varint,1,rep,packed,name=digest_function,json=digestFunction,proto3,enum=build.bazel.remote.execution.v2.DigestFunction" json:"digest_function,omitempty"`
-	// Capabilities for updating the action cache.
-	ActionCacheUpdateCapabilities *ActionCacheUpdateCapabilities `protobuf:"bytes,2,opt,name=action_cache_update_capabilities,json=actionCacheUpdateCapabilities,proto3" json:"action_cache_update_capabilities,omitempty"`
-	// Supported cache priority range for both CAS and ActionCache.
-	CachePriorityCapabilities *PriorityCapabilities `protobuf:"bytes,3,opt,name=cache_priority_capabilities,json=cachePriorityCapabilities,proto3" json:"cache_priority_capabilities,omitempty"`
-	// Maximum total size of blobs to be uploaded/downloaded using
-	// batch methods. A value of 0 means no limit is set, although
-	// in practice there will always be a message size limitation
-	// of the protocol in use, e.g. GRPC.
-	MaxBatchTotalSizeBytes int64 `protobuf:"varint,4,opt,name=max_batch_total_size_bytes,json=maxBatchTotalSizeBytes,proto3" json:"max_batch_total_size_bytes,omitempty"`
-	// Whether absolute symlink targets are supported.
-	SymlinkAbsolutePathStrategy CacheCapabilities_SymlinkAbsolutePathStrategy `protobuf:"varint,5,opt,name=symlink_absolute_path_strategy,json=symlinkAbsolutePathStrategy,proto3,enum=build.bazel.remote.execution.v2.CacheCapabilities_SymlinkAbsolutePathStrategy" json:"symlink_absolute_path_strategy,omitempty"`
-	XXX_NoUnkeyedLiteral        struct{}                                      `json:"-"`
-	XXX_unrecognized            []byte                                        `json:"-"`
-	XXX_sizecache               int32                                         `json:"-"`
-}
-
-func (m *CacheCapabilities) Reset()         { *m = CacheCapabilities{} }
-func (m *CacheCapabilities) String() string { return proto.CompactTextString(m) }
-func (*CacheCapabilities) ProtoMessage()    {}
-func (*CacheCapabilities) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{35}
-}
-
-func (m *CacheCapabilities) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_CacheCapabilities.Unmarshal(m, b)
-}
-func (m *CacheCapabilities) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_CacheCapabilities.Marshal(b, m, deterministic)
-}
-func (m *CacheCapabilities) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_CacheCapabilities.Merge(m, src)
-}
-func (m *CacheCapabilities) XXX_Size() int {
-	return xxx_messageInfo_CacheCapabilities.Size(m)
-}
-func (m *CacheCapabilities) XXX_DiscardUnknown() {
-	xxx_messageInfo_CacheCapabilities.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_CacheCapabilities proto.InternalMessageInfo
-
-func (m *CacheCapabilities) GetDigestFunction() []DigestFunction {
-	if m != nil {
-		return m.DigestFunction
-	}
-	return nil
-}
-
-func (m *CacheCapabilities) GetActionCacheUpdateCapabilities() *ActionCacheUpdateCapabilities {
-	if m != nil {
-		return m.ActionCacheUpdateCapabilities
-	}
-	return nil
-}
-
-func (m *CacheCapabilities) GetCachePriorityCapabilities() *PriorityCapabilities {
-	if m != nil {
-		return m.CachePriorityCapabilities
-	}
-	return nil
-}
-
-func (m *CacheCapabilities) GetMaxBatchTotalSizeBytes() int64 {
-	if m != nil {
-		return m.MaxBatchTotalSizeBytes
-	}
-	return 0
-}
-
-func (m *CacheCapabilities) GetSymlinkAbsolutePathStrategy() CacheCapabilities_SymlinkAbsolutePathStrategy {
-	if m != nil {
-		return m.SymlinkAbsolutePathStrategy
-	}
-	return CacheCapabilities_UNKNOWN
-}
-
-// Capabilities of the remote execution system.
-type ExecutionCapabilities struct {
-	// Remote execution may only support a single digest function.
-	DigestFunction DigestFunction `protobuf:"varint,1,opt,name=digest_function,json=digestFunction,proto3,enum=build.bazel.remote.execution.v2.DigestFunction" json:"digest_function,omitempty"`
-	// Whether remote execution is enabled for the particular server/instance.
-	ExecEnabled bool `protobuf:"varint,2,opt,name=exec_enabled,json=execEnabled,proto3" json:"exec_enabled,omitempty"`
-	// Supported execution priority range.
-	ExecutionPriorityCapabilities *PriorityCapabilities `protobuf:"bytes,3,opt,name=execution_priority_capabilities,json=executionPriorityCapabilities,proto3" json:"execution_priority_capabilities,omitempty"`
-	XXX_NoUnkeyedLiteral          struct{}              `json:"-"`
-	XXX_unrecognized              []byte                `json:"-"`
-	XXX_sizecache                 int32                 `json:"-"`
-}
-
-func (m *ExecutionCapabilities) Reset()         { *m = ExecutionCapabilities{} }
-func (m *ExecutionCapabilities) String() string { return proto.CompactTextString(m) }
-func (*ExecutionCapabilities) ProtoMessage()    {}
-func (*ExecutionCapabilities) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{36}
-}
-
-func (m *ExecutionCapabilities) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ExecutionCapabilities.Unmarshal(m, b)
-}
-func (m *ExecutionCapabilities) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ExecutionCapabilities.Marshal(b, m, deterministic)
-}
-func (m *ExecutionCapabilities) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ExecutionCapabilities.Merge(m, src)
-}
-func (m *ExecutionCapabilities) XXX_Size() int {
-	return xxx_messageInfo_ExecutionCapabilities.Size(m)
-}
-func (m *ExecutionCapabilities) XXX_DiscardUnknown() {
-	xxx_messageInfo_ExecutionCapabilities.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ExecutionCapabilities proto.InternalMessageInfo
-
-func (m *ExecutionCapabilities) GetDigestFunction() DigestFunction {
-	if m != nil {
-		return m.DigestFunction
-	}
-	return DigestFunction_UNKNOWN
-}
-
-func (m *ExecutionCapabilities) GetExecEnabled() bool {
-	if m != nil {
-		return m.ExecEnabled
-	}
-	return false
-}
-
-func (m *ExecutionCapabilities) GetExecutionPriorityCapabilities() *PriorityCapabilities {
-	if m != nil {
-		return m.ExecutionPriorityCapabilities
-	}
-	return nil
-}
-
-// Details for the tool used to call the API.
-type ToolDetails struct {
-	// Name of the tool, e.g. bazel.
-	ToolName string `protobuf:"bytes,1,opt,name=tool_name,json=toolName,proto3" json:"tool_name,omitempty"`
-	// Version of the tool used for the request, e.g. 5.0.3.
-	ToolVersion          string   `protobuf:"bytes,2,opt,name=tool_version,json=toolVersion,proto3" json:"tool_version,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *ToolDetails) Reset()         { *m = ToolDetails{} }
-func (m *ToolDetails) String() string { return proto.CompactTextString(m) }
-func (*ToolDetails) ProtoMessage()    {}
-func (*ToolDetails) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{37}
-}
-
-func (m *ToolDetails) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ToolDetails.Unmarshal(m, b)
-}
-func (m *ToolDetails) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ToolDetails.Marshal(b, m, deterministic)
-}
-func (m *ToolDetails) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ToolDetails.Merge(m, src)
-}
-func (m *ToolDetails) XXX_Size() int {
-	return xxx_messageInfo_ToolDetails.Size(m)
-}
-func (m *ToolDetails) XXX_DiscardUnknown() {
-	xxx_messageInfo_ToolDetails.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ToolDetails proto.InternalMessageInfo
-
-func (m *ToolDetails) GetToolName() string {
-	if m != nil {
-		return m.ToolName
-	}
-	return ""
-}
-
-func (m *ToolDetails) GetToolVersion() string {
-	if m != nil {
-		return m.ToolVersion
-	}
-	return ""
-}
-
-// An optional Metadata to attach to any RPC request to tell the server about an
-// external context of the request. The server may use this for logging or other
-// purposes. To use it, the client attaches the header to the call using the
-// canonical proto serialization:
-//
-// * name: `build.bazel.remote.execution.v2.requestmetadata-bin`
-// * contents: the base64 encoded binary `RequestMetadata` message.
-type RequestMetadata struct {
-	// The details for the tool invoking the requests.
-	ToolDetails *ToolDetails `protobuf:"bytes,1,opt,name=tool_details,json=toolDetails,proto3" json:"tool_details,omitempty"`
-	// An identifier that ties multiple requests to the same action.
-	// For example, multiple requests to the CAS, Action Cache, and Execution
-	// API are used in order to compile foo.cc.
-	ActionId string `protobuf:"bytes,2,opt,name=action_id,json=actionId,proto3" json:"action_id,omitempty"`
-	// An identifier that ties multiple actions together to a final result.
-	// For example, multiple actions are required to build and run foo_test.
-	ToolInvocationId string `protobuf:"bytes,3,opt,name=tool_invocation_id,json=toolInvocationId,proto3" json:"tool_invocation_id,omitempty"`
-	// An identifier to tie multiple tool invocations together. For example,
-	// runs of foo_test, bar_test and baz_test on a post-submit of a given patch.
-	CorrelatedInvocationsId string   `protobuf:"bytes,4,opt,name=correlated_invocations_id,json=correlatedInvocationsId,proto3" json:"correlated_invocations_id,omitempty"`
-	XXX_NoUnkeyedLiteral    struct{} `json:"-"`
-	XXX_unrecognized        []byte   `json:"-"`
-	XXX_sizecache           int32    `json:"-"`
-}
-
-func (m *RequestMetadata) Reset()         { *m = RequestMetadata{} }
-func (m *RequestMetadata) String() string { return proto.CompactTextString(m) }
-func (*RequestMetadata) ProtoMessage()    {}
-func (*RequestMetadata) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{38}
-}
-
-func (m *RequestMetadata) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_RequestMetadata.Unmarshal(m, b)
-}
-func (m *RequestMetadata) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_RequestMetadata.Marshal(b, m, deterministic)
-}
-func (m *RequestMetadata) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_RequestMetadata.Merge(m, src)
-}
-func (m *RequestMetadata) XXX_Size() int {
-	return xxx_messageInfo_RequestMetadata.Size(m)
-}
-func (m *RequestMetadata) XXX_DiscardUnknown() {
-	xxx_messageInfo_RequestMetadata.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_RequestMetadata proto.InternalMessageInfo
-
-func (m *RequestMetadata) GetToolDetails() *ToolDetails {
-	if m != nil {
-		return m.ToolDetails
-	}
-	return nil
-}
-
-func (m *RequestMetadata) GetActionId() string {
-	if m != nil {
-		return m.ActionId
-	}
-	return ""
-}
-
-func (m *RequestMetadata) GetToolInvocationId() string {
-	if m != nil {
-		return m.ToolInvocationId
-	}
-	return ""
-}
-
-func (m *RequestMetadata) GetCorrelatedInvocationsId() string {
-	if m != nil {
-		return m.CorrelatedInvocationsId
-	}
-	return ""
-}
-
-func init() {
-	proto.RegisterEnum("build.bazel.remote.execution.v2.DigestFunction", DigestFunction_name, DigestFunction_value)
-	proto.RegisterEnum("build.bazel.remote.execution.v2.ExecuteOperationMetadata_Stage", ExecuteOperationMetadata_Stage_name, ExecuteOperationMetadata_Stage_value)
-	proto.RegisterEnum("build.bazel.remote.execution.v2.CacheCapabilities_SymlinkAbsolutePathStrategy", CacheCapabilities_SymlinkAbsolutePathStrategy_name, CacheCapabilities_SymlinkAbsolutePathStrategy_value)
-	proto.RegisterType((*Action)(nil), "build.bazel.remote.execution.v2.Action")
-	proto.RegisterType((*Command)(nil), "build.bazel.remote.execution.v2.Command")
-	proto.RegisterType((*Command_EnvironmentVariable)(nil), "build.bazel.remote.execution.v2.Command.EnvironmentVariable")
-	proto.RegisterType((*Platform)(nil), "build.bazel.remote.execution.v2.Platform")
-	proto.RegisterType((*Platform_Property)(nil), "build.bazel.remote.execution.v2.Platform.Property")
-	proto.RegisterType((*Directory)(nil), "build.bazel.remote.execution.v2.Directory")
-	proto.RegisterType((*FileNode)(nil), "build.bazel.remote.execution.v2.FileNode")
-	proto.RegisterType((*DirectoryNode)(nil), "build.bazel.remote.execution.v2.DirectoryNode")
-	proto.RegisterType((*SymlinkNode)(nil), "build.bazel.remote.execution.v2.SymlinkNode")
-	proto.RegisterType((*Digest)(nil), "build.bazel.remote.execution.v2.Digest")
-	proto.RegisterType((*ExecutedActionMetadata)(nil), "build.bazel.remote.execution.v2.ExecutedActionMetadata")
-	proto.RegisterType((*ActionResult)(nil), "build.bazel.remote.execution.v2.ActionResult")
-	proto.RegisterType((*OutputFile)(nil), "build.bazel.remote.execution.v2.OutputFile")
-	proto.RegisterType((*Tree)(nil), "build.bazel.remote.execution.v2.Tree")
-	proto.RegisterType((*OutputDirectory)(nil), "build.bazel.remote.execution.v2.OutputDirectory")
-	proto.RegisterType((*OutputSymlink)(nil), "build.bazel.remote.execution.v2.OutputSymlink")
-	proto.RegisterType((*ExecutionPolicy)(nil), "build.bazel.remote.execution.v2.ExecutionPolicy")
-	proto.RegisterType((*ResultsCachePolicy)(nil), "build.bazel.remote.execution.v2.ResultsCachePolicy")
-	proto.RegisterType((*ExecuteRequest)(nil), "build.bazel.remote.execution.v2.ExecuteRequest")
-	proto.RegisterType((*LogFile)(nil), "build.bazel.remote.execution.v2.LogFile")
-	proto.RegisterType((*ExecuteResponse)(nil), "build.bazel.remote.execution.v2.ExecuteResponse")
-	proto.RegisterMapType((map[string]*LogFile)(nil), "build.bazel.remote.execution.v2.ExecuteResponse.ServerLogsEntry")
-	proto.RegisterType((*ExecuteOperationMetadata)(nil), "build.bazel.remote.execution.v2.ExecuteOperationMetadata")
-	proto.RegisterType((*WaitExecutionRequest)(nil), "build.bazel.remote.execution.v2.WaitExecutionRequest")
-	proto.RegisterType((*GetActionResultRequest)(nil), "build.bazel.remote.execution.v2.GetActionResultRequest")
-	proto.RegisterType((*UpdateActionResultRequest)(nil), "build.bazel.remote.execution.v2.UpdateActionResultRequest")
-	proto.RegisterType((*FindMissingBlobsRequest)(nil), "build.bazel.remote.execution.v2.FindMissingBlobsRequest")
-	proto.RegisterType((*FindMissingBlobsResponse)(nil), "build.bazel.remote.execution.v2.FindMissingBlobsResponse")
-	proto.RegisterType((*BatchUpdateBlobsRequest)(nil), "build.bazel.remote.execution.v2.BatchUpdateBlobsRequest")
-	proto.RegisterType((*BatchUpdateBlobsRequest_Request)(nil), "build.bazel.remote.execution.v2.BatchUpdateBlobsRequest.Request")
-	proto.RegisterType((*BatchUpdateBlobsResponse)(nil), "build.bazel.remote.execution.v2.BatchUpdateBlobsResponse")
-	proto.RegisterType((*BatchUpdateBlobsResponse_Response)(nil), "build.bazel.remote.execution.v2.BatchUpdateBlobsResponse.Response")
-	proto.RegisterType((*BatchReadBlobsRequest)(nil), "build.bazel.remote.execution.v2.BatchReadBlobsRequest")
-	proto.RegisterType((*BatchReadBlobsResponse)(nil), "build.bazel.remote.execution.v2.BatchReadBlobsResponse")
-	proto.RegisterType((*BatchReadBlobsResponse_Response)(nil), "build.bazel.remote.execution.v2.BatchReadBlobsResponse.Response")
-	proto.RegisterType((*GetTreeRequest)(nil), "build.bazel.remote.execution.v2.GetTreeRequest")
-	proto.RegisterType((*GetTreeResponse)(nil), "build.bazel.remote.execution.v2.GetTreeResponse")
-	proto.RegisterType((*GetCapabilitiesRequest)(nil), "build.bazel.remote.execution.v2.GetCapabilitiesRequest")
-	proto.RegisterType((*ServerCapabilities)(nil), "build.bazel.remote.execution.v2.ServerCapabilities")
-	proto.RegisterType((*ActionCacheUpdateCapabilities)(nil), "build.bazel.remote.execution.v2.ActionCacheUpdateCapabilities")
-	proto.RegisterType((*PriorityCapabilities)(nil), "build.bazel.remote.execution.v2.PriorityCapabilities")
-	proto.RegisterType((*PriorityCapabilities_PriorityRange)(nil), "build.bazel.remote.execution.v2.PriorityCapabilities.PriorityRange")
-	proto.RegisterType((*CacheCapabilities)(nil), "build.bazel.remote.execution.v2.CacheCapabilities")
-	proto.RegisterType((*ExecutionCapabilities)(nil), "build.bazel.remote.execution.v2.ExecutionCapabilities")
-	proto.RegisterType((*ToolDetails)(nil), "build.bazel.remote.execution.v2.ToolDetails")
-	proto.RegisterType((*RequestMetadata)(nil), "build.bazel.remote.execution.v2.RequestMetadata")
-}
-
-func init() {
-	proto.RegisterFile("build/bazel/remote/execution/v2/remote_execution.proto", fileDescriptor_c43847ba40caac95)
-}
-
-var fileDescriptor_c43847ba40caac95 = []byte{
-	// 3076 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x5a, 0x4d, 0x70, 0x5b, 0x57,
-	0xf5, 0xff, 0x3f, 0x49, 0x96, 0xa5, 0x23, 0xdb, 0x52, 0xee, 0xdf, 0x71, 0x1c, 0xb9, 0x69, 0x92,
-	0xd7, 0x69, 0x31, 0x4e, 0x23, 0xa5, 0x0a, 0x4d, 0x5b, 0xf7, 0x23, 0xf8, 0x43, 0x89, 0x93, 0x3a,
-	0xb6, 0x79, 0xb2, 0xd3, 0x14, 0x4a, 0x5f, 0xaf, 0xf4, 0xae, 0xe5, 0x87, 0xa5, 0xf7, 0x94, 0xf7,
-	0xae, 0xec, 0x38, 0x9d, 0x0c, 0x33, 0xcc, 0x40, 0x87, 0x96, 0x29, 0x8b, 0xb2, 0x82, 0x15, 0x2c,
-	0x19, 0x96, 0x6c, 0x18, 0x60, 0xc3, 0x0a, 0xb6, 0x30, 0x03, 0x4b, 0x36, 0x2c, 0x60, 0xa6, 0x2b,
-	0x66, 0xd8, 0xb1, 0x60, 0xee, 0xc7, 0xfb, 0x92, 0xe4, 0x3c, 0xc9, 0x49, 0x19, 0x56, 0x7a, 0xef,
-	0xdc, 0x7b, 0x7e, 0xe7, 0xdc, 0x73, 0xcf, 0xc7, 0x3d, 0xf7, 0x09, 0xae, 0xd5, 0xbb, 0x66, 0xcb,
-	0x28, 0xd7, 0xf1, 0x43, 0xd2, 0x2a, 0x3b, 0xa4, 0x6d, 0x53, 0x52, 0x26, 0x0f, 0x48, 0xa3, 0x4b,
-	0x4d, 0xdb, 0x2a, 0x1f, 0x54, 0x24, 0x4d, 0xf7, 0x69, 0xa5, 0x8e, 0x63, 0x53, 0x1b, 0x9d, 0xe7,
-	0x7c, 0x25, 0xce, 0x57, 0x12, 0x73, 0x4a, 0xc1, 0x9c, 0x83, 0x4a, 0xf1, 0x7c, 0x18, 0xd8, 0x25,
-	0xed, 0x03, 0xe2, 0xc8, 0x1f, 0x81, 0x50, 0x7c, 0xa6, 0x69, 0xdb, 0xcd, 0x16, 0x29, 0xe3, 0x8e,
-	0x59, 0xc6, 0x96, 0x65, 0x53, 0xcc, 0x58, 0x5d, 0x39, 0xfa, 0x9c, 0x1c, 0x6d, 0xd9, 0x56, 0xd3,
-	0xe9, 0x5a, 0x96, 0x69, 0x35, 0xcb, 0x76, 0x87, 0x38, 0x91, 0x49, 0xcf, 0xca, 0x49, 0xfc, 0xad,
-	0xde, 0xdd, 0x2d, 0x1b, 0x5d, 0x31, 0x41, 0x8e, 0x9f, 0xef, 0x1d, 0xa7, 0x66, 0x9b, 0xb8, 0x14,
-	0xb7, 0x3b, 0x72, 0xc2, 0x19, 0x39, 0xc1, 0xe9, 0x34, 0xca, 0x2e, 0xc5, 0xb4, 0x2b, 0x91, 0xd5,
-	0x8f, 0x13, 0x90, 0x5e, 0x6a, 0x30, 0x28, 0xb4, 0x01, 0x53, 0x0d, 0xbb, 0xdd, 0xc6, 0x96, 0xa1,
-	0x1b, 0x66, 0x93, 0xb8, 0x74, 0x56, 0xb9, 0xa0, 0xcc, 0xe7, 0x2a, 0x5f, 0x2a, 0xc5, 0x98, 0xa0,
-	0xb4, 0xca, 0xa7, 0x6b, 0x93, 0x92, 0x5d, 0xbc, 0xa2, 0x1a, 0x9c, 0x32, 0xad, 0x4e, 0x97, 0xea,
-	0x8e, 0x6d, 0x53, 0x0f, 0x32, 0x31, 0x1a, 0x64, 0x9e, 0x23, 0x68, 0xb6, 0x4d, 0x25, 0xe8, 0x55,
-	0x18, 0x67, 0x6b, 0xb3, 0xbb, 0x74, 0x36, 0xcd, 0xa1, 0xce, 0x96, 0xc4, 0xd2, 0x4a, 0xde, 0xda,
-	0x4b, 0xab, 0xd2, 0x36, 0x9a, 0x37, 0x13, 0x5d, 0x80, 0x09, 0xc3, 0xd6, 0x2d, 0x9b, 0xea, 0x0d,
-	0xdc, 0xd8, 0x23, 0xb3, 0xe3, 0x17, 0x94, 0xf9, 0x8c, 0x06, 0x86, 0xbd, 0x61, 0xd3, 0x15, 0x46,
-	0xb9, 0x9d, 0xca, 0x24, 0x0b, 0x69, 0xf5, 0xa7, 0x49, 0x18, 0x5f, 0x11, 0x6b, 0x40, 0xcf, 0x40,
-	0x16, 0x3b, 0xcd, 0x6e, 0x9b, 0x58, 0xd4, 0x9d, 0x55, 0x2e, 0x24, 0xe7, 0xb3, 0x5a, 0x40, 0x40,
-	0xf7, 0xe1, 0x34, 0xb1, 0x0e, 0x4c, 0xc7, 0xb6, 0xd8, 0xbb, 0x7e, 0x80, 0x1d, 0x13, 0xd7, 0x5b,
-	0xc4, 0x9d, 0x4d, 0x5c, 0x48, 0xce, 0xe7, 0x2a, 0x6f, 0xc4, 0xae, 0x4f, 0x8a, 0x29, 0x55, 0x03,
-	0x94, 0xbb, 0x12, 0x44, 0x9b, 0x26, 0xfd, 0x44, 0x17, 0x5d, 0x84, 0x09, 0xbb, 0x4b, 0x99, 0x3d,
-	0x77, 0x4d, 0x26, 0x29, 0xc9, 0x75, 0xca, 0x09, 0xda, 0x0d, 0x46, 0x42, 0x97, 0x01, 0xc9, 0x29,
-	0x86, 0xe9, 0x90, 0x06, 0xb5, 0x1d, 0x93, 0xb8, 0xb3, 0x29, 0x3e, 0xf1, 0x94, 0x18, 0x59, 0x0d,
-	0x06, 0x50, 0x15, 0x32, 0x9d, 0x16, 0xa6, 0xbb, 0xb6, 0xd3, 0x9e, 0x1d, 0xe3, 0xc6, 0xfc, 0x72,
-	0xac, 0xde, 0x5b, 0x92, 0x41, 0xf3, 0x59, 0xd1, 0x25, 0x38, 0x75, 0x68, 0x3b, 0xfb, 0xa6, 0xd5,
-	0xf4, 0xc5, 0x1e, 0xf1, 0xcd, 0xc9, 0x6a, 0x05, 0x39, 0xe0, 0x49, 0x3d, 0x2a, 0x5e, 0x87, 0xff,
-	0x1f, 0xb0, 0x64, 0x84, 0x20, 0x65, 0xe1, 0x36, 0xe1, 0x1e, 0x97, 0xd5, 0xf8, 0x33, 0x9a, 0x86,
-	0xb1, 0x03, 0xdc, 0xea, 0x12, 0xee, 0x33, 0x59, 0x4d, 0xbc, 0xa8, 0x3f, 0x52, 0x20, 0xe3, 0x29,
-	0x81, 0x34, 0x80, 0x8e, 0xc3, 0xa2, 0x85, 0xb2, 0x85, 0x2a, 0xdc, 0xf6, 0x95, 0xa1, 0xd7, 0x50,
-	0xda, 0x12, 0xbc, 0x47, 0x5a, 0x08, 0xa5, 0xf8, 0x15, 0xc8, 0x78, 0xf4, 0x11, 0xd4, 0xfa, 0xbb,
-	0x02, 0x59, 0x7f, 0x95, 0xe8, 0x3a, 0x8c, 0x89, 0x4d, 0x12, 0x2a, 0xc5, 0x9b, 0x95, 0xed, 0xdf,
-	0x86, 0x6d, 0x10, 0x4d, 0xf0, 0xa1, 0x2d, 0xc8, 0x85, 0xb7, 0x50, 0x78, 0x55, 0x69, 0x88, 0xa8,
-	0x91, 0x1a, 0x70, 0xac, 0x30, 0x04, 0x5a, 0x83, 0x8c, 0x7b, 0xd4, 0x6e, 0x99, 0xd6, 0xbe, 0x70,
-	0x9d, 0x5c, 0xe5, 0xc5, 0x58, 0xb8, 0x9a, 0x60, 0xe0, 0x60, 0x3e, 0xb7, 0xfa, 0xb1, 0x02, 0x19,
-	0x4f, 0xdf, 0x81, 0x16, 0xba, 0x0e, 0xe9, 0x93, 0x45, 0xbb, 0x64, 0x43, 0xcf, 0xc1, 0xa4, 0xe9,
-	0xca, 0x4c, 0xcc, 0xdc, 0x63, 0x36, 0xc5, 0x03, 0x76, 0xc2, 0x74, 0xab, 0x3e, 0x8d, 0x87, 0x6c,
-	0x4a, 0x35, 0x60, 0x32, 0xb2, 0xe8, 0x2f, 0x44, 0x21, 0xf5, 0x35, 0xc8, 0x85, 0x6c, 0x31, 0x50,
-	0xc6, 0x0c, 0xa4, 0x29, 0x76, 0x9a, 0x84, 0x4a, 0xbf, 0x90, 0x6f, 0xea, 0xeb, 0x90, 0x96, 0xa9,
-	0x0b, 0x41, 0x6a, 0x0f, 0xbb, 0x7b, 0x1e, 0x17, 0x7b, 0x46, 0xe7, 0x00, 0x5c, 0xf3, 0x21, 0xd1,
-	0xeb, 0x47, 0x94, 0x6f, 0xb3, 0x32, 0x9f, 0xd4, 0xb2, 0x8c, 0xb2, 0xcc, 0x08, 0xea, 0x5f, 0xd3,
-	0x30, 0x23, 0x96, 0x4c, 0x0c, 0x91, 0xa5, 0xef, 0x10, 0x8a, 0x0d, 0x4c, 0x31, 0x93, 0xc7, 0x82,
-	0x8b, 0x38, 0x12, 0x4f, 0xbe, 0xa1, 0x2a, 0x14, 0xee, 0x77, 0x49, 0x97, 0x18, 0xba, 0x5f, 0x03,
-	0xe4, 0xaa, 0x8b, 0x7d, 0x99, 0x72, 0xdb, 0x9b, 0xa1, 0xe5, 0x05, 0x8f, 0x4f, 0x40, 0x5b, 0x30,
-	0x23, 0x00, 0x75, 0x97, 0x62, 0x87, 0x86, 0xc0, 0x92, 0xb1, 0x60, 0xd3, 0x82, 0xb3, 0xc6, 0x18,
-	0x03, 0xc4, 0x7b, 0x50, 0x94, 0x88, 0x0d, 0xbb, 0xdd, 0x69, 0x11, 0x1a, 0x51, 0x31, 0x15, 0x8b,
-	0x3a, 0x2b, 0xb8, 0x57, 0x3c, 0xe6, 0x00, 0xf9, 0x5d, 0x98, 0x13, 0x85, 0x66, 0x97, 0xd0, 0xc6,
-	0x5e, 0x9f, 0xc2, 0x63, 0xf1, 0xd0, 0x9c, 0xfd, 0x06, 0xe3, 0xee, 0x51, 0x1a, 0xc3, 0xf9, 0x30,
-	0xf4, 0x20, 0xcd, 0xd3, 0xb1, 0xf0, 0xcf, 0x04, 0xf0, 0x03, 0xb4, 0xbf, 0x0b, 0x67, 0x7d, 0xd7,
-	0xeb, 0xd3, 0x7d, 0x3c, 0x16, 0xfc, 0x8c, 0xcf, 0xdc, 0xa3, 0xfa, 0xfb, 0x70, 0x2e, 0xc0, 0x1d,
-	0xa4, 0x78, 0x26, 0x16, 0x7b, 0xce, 0x07, 0x18, 0xa0, 0xf7, 0x37, 0xe1, 0x9c, 0x2c, 0x36, 0xdd,
-	0x4e, 0xcb, 0xc6, 0x46, 0x9f, 0xee, 0xd9, 0x58, 0xfc, 0xa2, 0x00, 0xd8, 0xe1, 0xfc, 0x3d, 0xea,
-	0x13, 0xb8, 0x18, 0x85, 0x1f, 0xb4, 0x04, 0x88, 0x15, 0xf1, 0x6c, 0x58, 0x44, 0xff, 0x2a, 0xd4,
-	0x7f, 0x8e, 0xc1, 0x84, 0x88, 0x2c, 0x8d, 0xb8, 0xdd, 0x16, 0x45, 0x1b, 0x3d, 0x65, 0x56, 0xa4,
-	0xde, 0x4b, 0xb1, 0x19, 0x63, 0xd3, 0xaf, 0xc3, 0xd1, 0x9a, 0xfc, 0x01, 0x4c, 0x87, 0xf0, 0x74,
-	0x3f, 0x07, 0xc3, 0x90, 0x29, 0x5d, 0xe0, 0xca, 0xec, 0xa3, 0xa1, 0x00, 0x5a, 0x92, 0x5c, 0xa4,
-	0x0f, 0xac, 0xfa, 0x22, 0xc7, 0x5f, 0x19, 0x12, 0xdf, 0xcf, 0xa1, 0x83, 0xce, 0x09, 0xdf, 0x82,
-	0xb3, 0x3d, 0x02, 0x8e, 0x82, 0x75, 0xe4, 0x4e, 0xb4, 0x8e, 0x33, 0x51, 0x29, 0x47, 0xfe, 0x62,
-	0xe6, 0x20, 0x4b, 0x1e, 0x98, 0x54, 0x6f, 0xd8, 0x86, 0x48, 0xfb, 0x63, 0x5a, 0x86, 0x11, 0x56,
-	0x58, 0xde, 0x65, 0xd9, 0x92, 0x1a, 0x36, 0x3b, 0x52, 0xe2, 0x43, 0x1e, 0xd7, 0x13, 0x5a, 0x56,
-	0x50, 0x34, 0x7c, 0x88, 0xd6, 0x61, 0x52, 0x0e, 0xcb, 0x6c, 0x9f, 0x1e, 0x2d, 0xdb, 0x4f, 0x08,
-	0x6e, 0x99, 0xae, 0x85, 0x30, 0xe2, 0x38, 0x5c, 0xd8, 0xb8, 0x2f, 0x8c, 0x38, 0x4e, 0x20, 0x8c,
-	0x0d, 0x4b, 0x61, 0x99, 0xd1, 0x85, 0x11, 0xc7, 0x91, 0xc2, 0x76, 0x01, 0x05, 0xc1, 0xda, 0x96,
-	0x39, 0x5e, 0x46, 0xd0, 0x2b, 0xb1, 0x90, 0x83, 0x4b, 0x84, 0x76, 0xca, 0x9f, 0xe4, 0x91, 0x6e,
-	0xa7, 0x32, 0x4a, 0x21, 0xa1, 0xfe, 0x40, 0x01, 0x08, 0xfc, 0x95, 0x15, 0xa6, 0x0e, 0xa6, 0x7e,
-	0x61, 0x62, 0xcf, 0xff, 0xd5, 0x1a, 0xfe, 0xa9, 0x02, 0xa9, 0x6d, 0x87, 0x10, 0xf4, 0x16, 0xa4,
-	0x58, 0xaf, 0x20, 0xfb, 0x8e, 0x85, 0xe1, 0x8f, 0x3b, 0x1a, 0xe7, 0x43, 0x37, 0x20, 0xd3, 0xd8,
-	0x33, 0x5b, 0x86, 0x43, 0x2c, 0x19, 0xb7, 0xa3, 0x60, 0xf8, 0xbc, 0x6a, 0x17, 0xf2, 0x3d, 0x61,
-	0x31, 0xd0, 0x46, 0x6b, 0x90, 0xa3, 0x0e, 0x21, 0x9e, 0x03, 0x24, 0x47, 0x33, 0x14, 0x30, 0x5e,
-	0xf1, 0x7c, 0x3b, 0x95, 0x49, 0x14, 0x92, 0xea, 0xeb, 0x30, 0x19, 0x89, 0x92, 0x81, 0x42, 0x8f,
-	0x3b, 0x67, 0x5c, 0x86, 0x7c, 0xd5, 0x93, 0xb2, 0x65, 0xb7, 0xcc, 0xc6, 0x11, 0x2a, 0x42, 0xa6,
-	0xe3, 0x98, 0xb6, 0x63, 0xd2, 0x23, 0x0e, 0x31, 0xa6, 0xf9, 0xef, 0xea, 0x15, 0x40, 0x22, 0xe1,
-	0xb9, 0xbc, 0x01, 0x1a, 0x82, 0xe3, 0xbb, 0x49, 0x98, 0x92, 0x8e, 0xa6, 0x91, 0xfb, 0x5d, 0x6f,
-	0x8f, 0x2d, 0x97, 0x62, 0xab, 0x41, 0xf4, 0xd0, 0x81, 0x68, 0xc2, 0x23, 0x6e, 0xb0, 0x83, 0xd1,
-	0x02, 0x9c, 0x72, 0xf7, 0xcd, 0x8e, 0x68, 0xbd, 0xf4, 0x96, 0x6d, 0xef, 0x77, 0xc5, 0x21, 0x22,
-	0xa3, 0xe5, 0xd9, 0x00, 0x97, 0xbf, 0xce, 0xc9, 0x2c, 0xa8, 0x30, 0xf7, 0xe1, 0x93, 0x46, 0xb0,
-	0xe0, 0x96, 0x41, 0xf5, 0x0d, 0x28, 0x04, 0x41, 0xd5, 0xe1, 0x2b, 0x94, 0x05, 0xf5, 0xca, 0x90,
-	0x21, 0xe5, 0xdb, 0x52, 0xcb, 0x93, 0x1e, 0xe3, 0x12, 0x98, 0x76, 0x84, 0x01, 0xe5, 0xca, 0xa4,
-	0x00, 0x91, 0x06, 0xae, 0xc6, 0x0a, 0xe8, 0xb7, 0xbe, 0x86, 0x9c, 0x3e, 0x9a, 0xf0, 0x8c, 0xdb,
-	0xa9, 0x4c, 0xaa, 0x30, 0x76, 0x3b, 0x95, 0x19, 0x2b, 0xa4, 0xd5, 0xfb, 0x30, 0xbe, 0x6e, 0x37,
-	0x79, 0xe0, 0x06, 0x41, 0xaa, 0x9c, 0x2c, 0x48, 0x9f, 0x87, 0xa9, 0xbd, 0x6e, 0x1b, 0x5b, 0xba,
-	0x43, 0xb0, 0xc1, 0xa3, 0x34, 0xc1, 0x37, 0x66, 0x92, 0x53, 0x35, 0x49, 0x54, 0x7f, 0x98, 0xf4,
-	0x9c, 0x8b, 0x68, 0xc4, 0xed, 0xd8, 0x96, 0x4b, 0x50, 0x15, 0xd2, 0x42, 0x5d, 0x29, 0xfb, 0x72,
-	0xac, 0xec, 0x70, 0x99, 0xd5, 0x24, 0x33, 0x73, 0x21, 0x6e, 0x3e, 0x43, 0x97, 0x68, 0x42, 0x81,
-	0x09, 0x41, 0x94, 0x35, 0x79, 0x01, 0xd2, 0xe2, 0xd2, 0x42, 0xc6, 0x18, 0xf2, 0x0a, 0xbe, 0xd3,
-	0x69, 0x94, 0x6a, 0x7c, 0x44, 0x93, 0x33, 0x10, 0x86, 0x9c, 0x4b, 0x9c, 0x03, 0xe2, 0xe8, 0x2d,
-	0xbb, 0x29, 0x9a, 0xdf, 0x5c, 0xe5, 0xab, 0xc3, 0xa6, 0x50, 0x6f, 0x79, 0xa5, 0x1a, 0xc7, 0x58,
-	0xb7, 0x9b, 0x6e, 0xd5, 0xa2, 0xce, 0x91, 0x06, 0xae, 0x4f, 0x40, 0xb3, 0x30, 0xde, 0x26, 0xae,
-	0x8b, 0x9b, 0x84, 0xd7, 0xa0, 0xac, 0xe6, 0xbd, 0x16, 0x9b, 0x90, 0xef, 0x61, 0x44, 0x05, 0x48,
-	0xee, 0x93, 0x23, 0x19, 0x19, 0xec, 0x11, 0xbd, 0x15, 0x6e, 0x20, 0x73, 0x95, 0xf9, 0x58, 0xdd,
-	0xe4, 0x76, 0xcb, 0x56, 0x73, 0x31, 0xf1, 0xaa, 0xa2, 0x7e, 0x9e, 0x80, 0x59, 0xa9, 0xf2, 0xa6,
-	0x77, 0x59, 0xe4, 0xb7, 0x06, 0x3b, 0x30, 0xe6, 0x52, 0xa6, 0x1d, 0x13, 0x3a, 0x55, 0xb9, 0x3e,
-	0xec, 0xe2, 0xfb, 0x90, 0x98, 0x6d, 0x9b, 0x44, 0x13, 0x68, 0xfd, 0xc1, 0x99, 0x78, 0x92, 0xe0,
-	0x7c, 0x11, 0x90, 0x2c, 0xd6, 0x2e, 0x75, 0x08, 0x6e, 0x8b, 0x04, 0x92, 0x14, 0xd7, 0x06, 0x62,
-	0xa4, 0xc6, 0x07, 0x78, 0x12, 0x11, 0xb3, 0x59, 0xb5, 0x0d, 0xcf, 0x4e, 0xf9, 0xb3, 0x89, 0xe3,
-	0x04, 0xb3, 0xd5, 0x4d, 0x18, 0xe3, 0x9a, 0xa3, 0x1c, 0x8c, 0xef, 0x6c, 0xbc, 0xbd, 0xb1, 0xf9,
-	0xce, 0x46, 0xe1, 0xff, 0x50, 0x1e, 0x72, 0x2b, 0x4b, 0x2b, 0x6b, 0x55, 0x7d, 0x65, 0xad, 0xba,
-	0xf2, 0x76, 0x41, 0x41, 0x00, 0xe9, 0xaf, 0xed, 0x54, 0x77, 0xaa, 0xab, 0x85, 0x04, 0x9a, 0x84,
-	0x6c, 0xf5, 0x5e, 0x75, 0x65, 0x67, 0xfb, 0xd6, 0xc6, 0xcd, 0x42, 0x92, 0xbd, 0xae, 0x6c, 0xde,
-	0xd9, 0x5a, 0xaf, 0x6e, 0x57, 0x57, 0x0b, 0x29, 0x75, 0x01, 0xa6, 0xdf, 0xc1, 0x26, 0xf5, 0x93,
-	0x82, 0x97, 0x00, 0x07, 0x34, 0x82, 0xea, 0x27, 0x0a, 0xcc, 0xdc, 0x24, 0x34, 0xe2, 0xed, 0xa3,
-	0xe4, 0xcb, 0xa7, 0x6a, 0x66, 0xf5, 0x0f, 0x09, 0x38, 0xbb, 0xd3, 0x31, 0x30, 0x25, 0xff, 0x1b,
-	0x0a, 0x21, 0xcd, 0x47, 0x93, 0x01, 0x9f, 0x3c, 0x49, 0xfa, 0x90, 0x98, 0x32, 0x3f, 0x1c, 0x97,
-	0x8b, 0x53, 0x4f, 0x35, 0x17, 0xab, 0x1f, 0x2b, 0x70, 0xe6, 0x86, 0x69, 0x19, 0x77, 0x4c, 0xd7,
-	0x35, 0xad, 0xe6, 0x72, 0xcb, 0xae, 0xbb, 0x23, 0x59, 0xf2, 0x36, 0x4c, 0xd4, 0x5b, 0x76, 0x5d,
-	0xda, 0xd1, 0xeb, 0x2d, 0x86, 0x36, 0x64, 0x8e, 0x31, 0x8b, 0x67, 0x57, 0xed, 0xc2, 0x6c, 0xbf,
-	0x2e, 0x32, 0x37, 0xbf, 0x0b, 0xd3, 0x6d, 0x41, 0xd7, 0x9f, 0x44, 0x1e, 0x6a, 0x07, 0xe0, 0x9e,
-	0xd8, 0x7f, 0x2b, 0x70, 0x66, 0x19, 0xd3, 0xc6, 0x9e, 0x70, 0xaa, 0xd1, 0x6d, 0xf0, 0x1e, 0x64,
-	0x1c, 0x31, 0xdf, 0xd3, 0x27, 0x3e, 0x39, 0x1f, 0x23, 0xb0, 0x24, 0x7f, 0x35, 0x1f, 0xb1, 0xf8,
-	0x3e, 0x8c, 0x7b, 0xda, 0x3c, 0x71, 0x71, 0x44, 0x90, 0xe2, 0xa7, 0xf0, 0x04, 0x3f, 0xfa, 0xf3,
-	0x67, 0xf5, 0x5f, 0x0a, 0xcc, 0xf6, 0x6b, 0x23, 0xcd, 0xfe, 0x01, 0x64, 0x1d, 0xf9, 0xec, 0xdd,
-	0xfc, 0x2d, 0x9f, 0x60, 0x6d, 0xb2, 0x02, 0x79, 0x0f, 0x5a, 0x00, 0x5a, 0x3c, 0x84, 0x8c, 0x2f,
-	0xed, 0x89, 0xd7, 0x17, 0x54, 0xd5, 0x44, 0x5c, 0x55, 0x55, 0xbf, 0x0d, 0xa7, 0xb9, 0xa2, 0xec,
-	0x48, 0x30, 0xfa, 0x9e, 0x2f, 0xc1, 0xf8, 0x09, 0x5d, 0xd0, 0xe3, 0x53, 0xbf, 0x97, 0x80, 0x99,
-	0x5e, 0x0d, 0xa4, 0x21, 0xde, 0xef, 0x37, 0xfb, 0x90, 0x2e, 0xd5, 0x87, 0x35, 0xd0, 0xe8, 0x9f,
-	0x28, 0x4f, 0xd3, 0xea, 0x03, 0xbc, 0x6a, 0x94, 0xf3, 0x8d, 0xfa, 0x6b, 0x05, 0xa6, 0x6e, 0x12,
-	0xca, 0xfa, 0xa5, 0x91, 0xf6, 0x60, 0x0d, 0x72, 0x4f, 0xf0, 0x1d, 0x06, 0x9c, 0xe0, 0x13, 0xcc,
-	0x1c, 0x64, 0x3b, 0xb8, 0x49, 0x74, 0xd7, 0x7c, 0x28, 0x0a, 0x36, 0xeb, 0x12, 0x70, 0x93, 0xd4,
-	0xcc, 0x87, 0xbc, 0x45, 0xe7, 0x83, 0xd4, 0xde, 0x27, 0x96, 0x2c, 0xd0, 0x7c, 0xfa, 0x36, 0x23,
-	0xa8, 0x1f, 0x29, 0x90, 0xf7, 0xb5, 0x97, 0x26, 0x5d, 0x8f, 0xde, 0x75, 0x2b, 0x23, 0x37, 0x6e,
-	0x91, 0x7b, 0xee, 0x17, 0x20, 0x6f, 0x91, 0x07, 0x54, 0x0f, 0x69, 0x21, 0x1a, 0xa5, 0x49, 0x46,
-	0xde, 0xf2, 0x35, 0x79, 0x93, 0x57, 0xe9, 0x15, 0xdc, 0xc1, 0x75, 0xb3, 0x65, 0x52, 0x93, 0x8c,
-	0xe4, 0xd2, 0xea, 0xef, 0x92, 0x80, 0xc4, 0x51, 0x2f, 0x0c, 0x81, 0x30, 0x20, 0x51, 0x81, 0x1a,
-	0x21, 0xaa, 0x74, 0x95, 0xf8, 0x0f, 0x13, 0xbc, 0xd8, 0x44, 0x54, 0x3a, 0xd5, 0xe8, 0x25, 0xa1,
-	0x36, 0xcc, 0x84, 0xee, 0xf5, 0xc2, 0x62, 0xc4, 0x9e, 0x5e, 0x1b, 0xbe, 0xb7, 0x89, 0x88, 0x3a,
-	0x4d, 0x06, 0x91, 0xd1, 0x16, 0xcc, 0x18, 0xa4, 0xe3, 0x90, 0x06, 0xa6, 0xc4, 0xd0, 0x71, 0xc7,
-	0xd4, 0x0f, 0x88, 0xe3, 0x9a, 0xb6, 0xe5, 0x5f, 0x04, 0x87, 0xc5, 0xc9, 0x0f, 0x9f, 0x35, 0xd2,
-	0xbe, 0x4b, 0x1c, 0x6d, 0x3a, 0xe0, 0x5c, 0xea, 0x98, 0x77, 0x05, 0x1f, 0x5a, 0x86, 0x7c, 0xcb,
-	0x3e, 0x8c, 0x40, 0xa5, 0x62, 0xa1, 0x26, 0x5b, 0xf6, 0x61, 0x08, 0x63, 0x15, 0x0a, 0x7b, 0x66,
-	0x73, 0x2f, 0x02, 0x32, 0x16, 0x0b, 0x32, 0xc5, 0x78, 0x02, 0x14, 0xf5, 0x06, 0x9c, 0x13, 0xa7,
-	0x0a, 0x6e, 0x78, 0x91, 0x84, 0x23, 0x8b, 0x7f, 0x1e, 0xa6, 0xba, 0x9c, 0xaa, 0x13, 0x8b, 0x75,
-	0x42, 0x06, 0xdf, 0xca, 0x8c, 0x36, 0x29, 0xa8, 0x55, 0x41, 0x54, 0xff, 0xa8, 0xc0, 0xf4, 0x96,
-	0xec, 0x93, 0x23, 0xfc, 0x0d, 0x00, 0xd9, 0x3f, 0x07, 0x9e, 0xbd, 0x12, 0xff, 0x7d, 0x6a, 0x00,
-	0x94, 0x4f, 0xd4, 0xb0, 0xd5, 0x24, 0x5a, 0x08, 0xb6, 0xb8, 0x03, 0x93, 0x91, 0x41, 0x74, 0x11,
-	0x26, 0xda, 0xa6, 0xa5, 0xf7, 0x74, 0xf2, 0xb9, 0xb6, 0x69, 0x79, 0xf3, 0xf8, 0x14, 0xfc, 0x20,
-	0x98, 0x92, 0x90, 0x53, 0xf0, 0x03, 0x6f, 0x8a, 0xfa, 0xfd, 0x31, 0x38, 0xd5, 0xe7, 0x90, 0xe8,
-	0x1e, 0xe4, 0x45, 0x06, 0xd1, 0x77, 0xbb, 0x16, 0xb7, 0x1d, 0x5f, 0xd6, 0x54, 0xa5, 0x3c, 0x64,
-	0x2a, 0xb9, 0x21, 0xd9, 0xb4, 0x29, 0x23, 0xf2, 0x8e, 0x3e, 0x52, 0xe0, 0x82, 0x3c, 0x19, 0x8a,
-	0x10, 0x92, 0x96, 0x1f, 0xe0, 0xe2, 0x6f, 0x0d, 0x79, 0x58, 0x3c, 0x66, 0x5b, 0xb5, 0x73, 0xf8,
-	0xb1, 0xbb, 0xde, 0x85, 0x39, 0x79, 0x8c, 0x94, 0xb6, 0x88, 0xea, 0x20, 0xfc, 0xfe, 0xe5, 0x13,
-	0x6d, 0xa3, 0x76, 0x96, 0x23, 0x0f, 0x74, 0x96, 0x45, 0x28, 0xb2, 0x3d, 0xa9, 0xb3, 0xca, 0xa4,
-	0x53, 0x9b, 0xe2, 0x96, 0x1e, 0xfa, 0x36, 0x94, 0xe2, 0xdf, 0x86, 0x66, 0xda, 0xf8, 0x01, 0x2f,
-	0x5d, 0xdb, 0x6c, 0xbc, 0xe6, 0x7d, 0x28, 0x42, 0x9f, 0x29, 0xf0, 0xac, 0xbc, 0x92, 0xd5, 0x71,
-	0xdd, 0xb5, 0x5b, 0x5d, 0x4a, 0xf4, 0x0e, 0xa6, 0x7b, 0xac, 0x5f, 0xc2, 0x94, 0x34, 0x8f, 0x78,
-	0x78, 0x4c, 0x55, 0x36, 0x46, 0x4f, 0x42, 0xde, 0x67, 0xc0, 0x25, 0x89, 0xbb, 0x85, 0xe9, 0x5e,
-	0x4d, 0xa2, 0x6a, 0x73, 0xee, 0xf1, 0x83, 0xea, 0x4d, 0x98, 0x7b, 0x0c, 0x6f, 0xb4, 0x3b, 0x9b,
-	0x02, 0x58, 0xbd, 0x55, 0x5b, 0x5a, 0x5f, 0xdf, 0x7c, 0xa7, 0xba, 0x5a, 0x50, 0xd8, 0xa0, 0xf7,
-	0x92, 0x50, 0x3f, 0x4b, 0xc0, 0xe9, 0x81, 0x59, 0x6b, 0xb0, 0x3f, 0x2a, 0x4f, 0xc3, 0x1f, 0x2f,
-	0xc2, 0x04, 0x9b, 0xee, 0x47, 0xbe, 0xb8, 0x98, 0xc8, 0x31, 0x9a, 0x8c, 0x7b, 0xf4, 0x08, 0xce,
-	0x87, 0x2e, 0x98, 0x9e, 0xbe, 0xb3, 0x04, 0x1f, 0x70, 0x06, 0x0d, 0xab, 0x77, 0x20, 0xb7, 0x6d,
-	0xdb, 0xad, 0x55, 0x42, 0xb1, 0xd9, 0xe2, 0x57, 0xe7, 0xd4, 0xb6, 0x5b, 0xe1, 0x9a, 0x95, 0x61,
-	0x04, 0x5e, 0xfe, 0x2f, 0xc2, 0x04, 0x1f, 0xf4, 0x92, 0xa5, 0xa8, 0x89, 0x39, 0x46, 0xf3, 0xb2,
-	0xe1, 0x3f, 0x14, 0xc8, 0xcb, 0x1a, 0xe8, 0x5f, 0x25, 0x6c, 0x4a, 0x36, 0x43, 0xc8, 0x90, 0x95,
-	0x2c, 0xfe, 0xcb, 0x71, 0x48, 0x2f, 0x21, 0x24, 0xa4, 0xa4, 0x0c, 0x72, 0xd3, 0x90, 0x4a, 0x64,
-	0x04, 0xe1, 0x96, 0xc1, 0xba, 0x7c, 0x2e, 0xcd, 0xb4, 0x0e, 0xec, 0x06, 0xf6, 0x66, 0xc9, 0x3b,
-	0x01, 0x36, 0x72, 0xcb, 0x1f, 0xb8, 0x65, 0xa0, 0x45, 0x38, 0xdb, 0xb0, 0x1d, 0x87, 0xb4, 0x78,
-	0x65, 0x0a, 0x78, 0x5c, 0xc6, 0x24, 0x4e, 0x1e, 0x67, 0x82, 0x09, 0x01, 0xab, 0x7b, 0xcb, 0x58,
-	0x78, 0x03, 0xa6, 0xa2, 0xdb, 0x1f, 0x75, 0x46, 0x80, 0x74, 0x6d, 0x6d, 0xa9, 0xf2, 0xf2, 0xb5,
-	0x82, 0x82, 0x32, 0x90, 0xaa, 0xad, 0x2d, 0xbd, 0x54, 0x48, 0xa0, 0x71, 0x48, 0xde, 0x59, 0x7d,
-	0xb9, 0x90, 0xac, 0xfc, 0x2a, 0x01, 0x59, 0xdf, 0x1d, 0xd1, 0xa7, 0x0a, 0x8c, 0xcb, 0x1b, 0x14,
-	0x54, 0x1e, 0xfe, 0xa2, 0x89, 0x1b, 0xba, 0x78, 0xce, 0x3b, 0xea, 0x85, 0xfe, 0xff, 0x53, 0xf2,
-	0x2f, 0x62, 0xd4, 0x97, 0xbe, 0xf3, 0xa7, 0xbf, 0x7d, 0x96, 0xb8, 0xa4, 0xbe, 0x50, 0x3e, 0xa8,
-	0x94, 0x3f, 0x8c, 0x1c, 0x4b, 0xde, 0x5c, 0x58, 0x78, 0x54, 0x16, 0xa6, 0x73, 0x17, 0x85, 0x08,
-	0xb2, 0xa8, 0x2c, 0x5c, 0x51, 0xd0, 0x8f, 0x15, 0x98, 0x8c, 0x5c, 0x57, 0xa0, 0x78, 0xff, 0x1b,
-	0x74, 0xbd, 0x31, 0x9a, 0x72, 0x5c, 0xa7, 0xe0, 0x9f, 0x4b, 0xe5, 0x85, 0x85, 0x47, 0x8b, 0x87,
-	0x61, 0x54, 0xae, 0x5c, 0xe5, 0xcf, 0x49, 0xc8, 0x85, 0xb2, 0x33, 0xfa, 0x8b, 0x38, 0x11, 0x46,
-	0xbe, 0xc1, 0xc5, 0x7f, 0xf1, 0x18, 0x7c, 0xc1, 0x52, 0x1c, 0xed, 0x16, 0x41, 0x7d, 0x8f, 0x2f,
-	0xe0, 0x2e, 0xda, 0x7e, 0xac, 0x75, 0xe5, 0xed, 0x40, 0xf9, 0xc3, 0xc8, 0x2d, 0x48, 0x69, 0x0f,
-	0xbb, 0x7b, 0x8f, 0x7a, 0x89, 0x41, 0xc2, 0x7e, 0x84, 0x3e, 0x57, 0x00, 0xf5, 0x5f, 0xbd, 0xa0,
-	0xc5, 0x58, 0x1d, 0x8f, 0xbd, 0xaf, 0x19, 0x75, 0x7d, 0xfb, 0x7c, 0x7d, 0xa4, 0xf8, 0x85, 0xac,
-	0x6f, 0x31, 0x7a, 0x8f, 0x53, 0xf9, 0x49, 0x1a, 0xce, 0xae, 0xd8, 0x16, 0x25, 0x16, 0x5d, 0x32,
-	0x0c, 0x87, 0xb8, 0x2e, 0x4b, 0x92, 0x35, 0x6a, 0x3b, 0xb8, 0x49, 0xd0, 0x6f, 0x14, 0x28, 0xf4,
-	0xde, 0x57, 0xa0, 0x57, 0x87, 0xf8, 0x5f, 0xcc, 0xc0, 0xeb, 0x96, 0xe2, 0x6b, 0x27, 0xe0, 0x14,
-	0xed, 0x86, 0x7a, 0x95, 0x1b, 0xe5, 0xb2, 0x3a, 0x7f, 0x8c, 0x51, 0xea, 0x6c, 0xf6, 0xe2, 0x6e,
-	0xc0, 0xbe, 0xa8, 0x2c, 0x70, 0xf5, 0x7b, 0x3b, 0xf5, 0x21, 0xd4, 0x3f, 0xe6, 0xe2, 0x62, 0x08,
-	0xf5, 0x8f, 0xbb, 0x16, 0x18, 0x52, 0xfd, 0x7a, 0xc0, 0xce, 0xd4, 0xff, 0xa5, 0x02, 0x53, 0xd1,
-	0x8e, 0x17, 0x5d, 0x1b, 0xb9, 0x45, 0x16, 0xaa, 0xbf, 0x72, 0xc2, 0xd6, 0x3a, 0x36, 0x95, 0x85,
-	0x14, 0x67, 0xcc, 0x4c, 0xed, 0xdf, 0x2b, 0x30, 0x2e, 0xbb, 0xc5, 0x21, 0x32, 0x6b, 0xb4, 0x2b,
-	0x2e, 0x5e, 0x19, 0x9e, 0x41, 0x6a, 0x78, 0x8f, 0x6b, 0xa8, 0xa1, 0xad, 0xc7, 0x69, 0x58, 0xfe,
-	0x30, 0xd4, 0x46, 0x7b, 0x41, 0x12, 0x26, 0x85, 0x43, 0xa4, 0x29, 0x24, 0x5c, 0x51, 0x2a, 0xbf,
-	0x55, 0x60, 0x22, 0x72, 0x70, 0xf9, 0x85, 0xc8, 0x7b, 0x11, 0xda, 0x50, 0x79, 0x6f, 0x40, 0xcb,
-	0x5a, 0x8c, 0xbf, 0xe2, 0xec, 0xef, 0x55, 0xd5, 0x4b, 0x7c, 0xb9, 0xcf, 0xa3, 0xe7, 0x8e, 0x59,
-	0x6e, 0xf8, 0x1c, 0xb3, 0xec, 0x40, 0xdc, 0x1f, 0x61, 0x97, 0xa7, 0x35, 0x4e, 0x0c, 0xbe, 0x9c,
-	0x39, 0x36, 0xb5, 0xb7, 0x94, 0xaf, 0xe7, 0xc5, 0x64, 0x7f, 0xee, 0xcf, 0x12, 0x49, 0xad, 0x7a,
-	0xef, 0xe7, 0x89, 0xf3, 0xcb, 0x1c, 0x70, 0x99, 0x03, 0x0a, 0xde, 0xa0, 0x35, 0x2d, 0xdd, 0xad,
-	0xd4, 0xd3, 0xfc, 0xff, 0x1c, 0x57, 0xff, 0x13, 0x00, 0x00, 0xff, 0xff, 0x4a, 0x7b, 0x67, 0xb6,
-	0xbb, 0x2b, 0x00, 0x00,
-}
-
-// Reference imports to suppress errors if they are not otherwise used.
-var _ context.Context
-var _ grpc.ClientConn
-
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the grpc package it is being compiled against.
-const _ = grpc.SupportPackageIsVersion4
-
-// ExecutionClient is the client API for Execution service.
-//
-// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
-type ExecutionClient interface {
-	// Execute an action remotely.
-	//
-	// In order to execute an action, the client must first upload all of the
-	// inputs, the
-	// [Command][build.bazel.remote.execution.v2.Command] to run, and the
-	// [Action][build.bazel.remote.execution.v2.Action] into the
-	// [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
-	// It then calls `Execute` with an `action_digest` referring to them. The
-	// server will run the action and eventually return the result.
-	//
-	// The input `Action`'s fields MUST meet the various canonicalization
-	// requirements specified in the documentation for their types so that it has
-	// the same digest as other logically equivalent `Action`s. The server MAY
-	// enforce the requirements and return errors if a non-canonical input is
-	// received. It MAY also proceed without verifying some or all of the
-	// requirements, such as for performance reasons. If the server does not
-	// verify the requirement, then it will treat the `Action` as distinct from
-	// another logically equivalent action if they hash differently.
-	//
-	// Returns a stream of
-	// [google.longrunning.Operation][google.longrunning.Operation] messages
-	// describing the resulting execution, with eventual `response`
-	// [ExecuteResponse][build.bazel.remote.execution.v2.ExecuteResponse]. The
-	// `metadata` on the operation is of type
-	// [ExecuteOperationMetadata][build.bazel.remote.execution.v2.ExecuteOperationMetadata].
-	//
-	// If the client remains connected after the first response is returned after
-	// the server, then updates are streamed as if the client had called
-	// [WaitExecution][build.bazel.remote.execution.v2.Execution.WaitExecution]
-	// until the execution completes or the request reaches an error. The
-	// operation can also be queried using [Operations
-	// API][google.longrunning.Operations.GetOperation].
-	//
-	// The server NEED NOT implement other methods or functionality of the
-	// Operations API.
-	//
-	// Errors discovered during creation of the `Operation` will be reported
-	// as gRPC Status errors, while errors that occurred while running the
-	// action will be reported in the `status` field of the `ExecuteResponse`. The
-	// server MUST NOT set the `error` field of the `Operation` proto.
-	// The possible errors include:
-	//
-	// * `INVALID_ARGUMENT`: One or more arguments are invalid.
-	// * `FAILED_PRECONDITION`: One or more errors occurred in setting up the
-	//   action requested, such as a missing input or command or no worker being
-	//   available. The client may be able to fix the errors and retry.
-	// * `RESOURCE_EXHAUSTED`: There is insufficient quota of some resource to run
-	//   the action.
-	// * `UNAVAILABLE`: Due to a transient condition, such as all workers being
-	//   occupied (and the server does not support a queue), the action could not
-	//   be started. The client should retry.
-	// * `INTERNAL`: An internal error occurred in the execution engine or the
-	//   worker.
-	// * `DEADLINE_EXCEEDED`: The execution timed out.
-	// * `CANCELLED`: The operation was cancelled by the client. This status is
-	//   only possible if the server implements the Operations API CancelOperation
-	//   method, and it was called for the current execution.
-	//
-	// In the case of a missing input or command, the server SHOULD additionally
-	// send a [PreconditionFailure][google.rpc.PreconditionFailure] error detail
-	// where, for each requested blob not present in the CAS, there is a
-	// `Violation` with a `type` of `MISSING` and a `subject` of
-	// `"blobs/{hash}/{size}"` indicating the digest of the missing blob.
-	Execute(ctx context.Context, in *ExecuteRequest, opts ...grpc.CallOption) (Execution_ExecuteClient, error)
-	// Wait for an execution operation to complete. When the client initially
-	// makes the request, the server immediately responds with the current status
-	// of the execution. The server will leave the request stream open until the
-	// operation completes, and then respond with the completed operation. The
-	// server MAY choose to stream additional updates as execution progresses,
-	// such as to provide an update as to the state of the execution.
-	WaitExecution(ctx context.Context, in *WaitExecutionRequest, opts ...grpc.CallOption) (Execution_WaitExecutionClient, error)
-}
-
-type executionClient struct {
-	cc *grpc.ClientConn
-}
-
-func NewExecutionClient(cc *grpc.ClientConn) ExecutionClient {
-	return &executionClient{cc}
-}
-
-func (c *executionClient) Execute(ctx context.Context, in *ExecuteRequest, opts ...grpc.CallOption) (Execution_ExecuteClient, error) {
-	stream, err := c.cc.NewStream(ctx, &_Execution_serviceDesc.Streams[0], "/build.bazel.remote.execution.v2.Execution/Execute", opts...)
-	if err != nil {
-		return nil, err
-	}
-	x := &executionExecuteClient{stream}
-	if err := x.ClientStream.SendMsg(in); err != nil {
-		return nil, err
-	}
-	if err := x.ClientStream.CloseSend(); err != nil {
-		return nil, err
-	}
-	return x, nil
-}
-
-type Execution_ExecuteClient interface {
-	Recv() (*longrunning.Operation, error)
-	grpc.ClientStream
-}
-
-type executionExecuteClient struct {
-	grpc.ClientStream
-}
-
-func (x *executionExecuteClient) Recv() (*longrunning.Operation, error) {
-	m := new(longrunning.Operation)
-	if err := x.ClientStream.RecvMsg(m); err != nil {
-		return nil, err
-	}
-	return m, nil
-}
-
-func (c *executionClient) WaitExecution(ctx context.Context, in *WaitExecutionRequest, opts ...grpc.CallOption) (Execution_WaitExecutionClient, error) {
-	stream, err := c.cc.NewStream(ctx, &_Execution_serviceDesc.Streams[1], "/build.bazel.remote.execution.v2.Execution/WaitExecution", opts...)
-	if err != nil {
-		return nil, err
-	}
-	x := &executionWaitExecutionClient{stream}
-	if err := x.ClientStream.SendMsg(in); err != nil {
-		return nil, err
-	}
-	if err := x.ClientStream.CloseSend(); err != nil {
-		return nil, err
-	}
-	return x, nil
-}
-
-type Execution_WaitExecutionClient interface {
-	Recv() (*longrunning.Operation, error)
-	grpc.ClientStream
-}
-
-type executionWaitExecutionClient struct {
-	grpc.ClientStream
-}
-
-func (x *executionWaitExecutionClient) Recv() (*longrunning.Operation, error) {
-	m := new(longrunning.Operation)
-	if err := x.ClientStream.RecvMsg(m); err != nil {
-		return nil, err
-	}
-	return m, nil
-}
-
-// ExecutionServer is the server API for Execution service.
-type ExecutionServer interface {
-	// Execute an action remotely.
-	//
-	// In order to execute an action, the client must first upload all of the
-	// inputs, the
-	// [Command][build.bazel.remote.execution.v2.Command] to run, and the
-	// [Action][build.bazel.remote.execution.v2.Action] into the
-	// [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
-	// It then calls `Execute` with an `action_digest` referring to them. The
-	// server will run the action and eventually return the result.
-	//
-	// The input `Action`'s fields MUST meet the various canonicalization
-	// requirements specified in the documentation for their types so that it has
-	// the same digest as other logically equivalent `Action`s. The server MAY
-	// enforce the requirements and return errors if a non-canonical input is
-	// received. It MAY also proceed without verifying some or all of the
-	// requirements, such as for performance reasons. If the server does not
-	// verify the requirement, then it will treat the `Action` as distinct from
-	// another logically equivalent action if they hash differently.
-	//
-	// Returns a stream of
-	// [google.longrunning.Operation][google.longrunning.Operation] messages
-	// describing the resulting execution, with eventual `response`
-	// [ExecuteResponse][build.bazel.remote.execution.v2.ExecuteResponse]. The
-	// `metadata` on the operation is of type
-	// [ExecuteOperationMetadata][build.bazel.remote.execution.v2.ExecuteOperationMetadata].
-	//
-	// If the client remains connected after the first response is returned after
-	// the server, then updates are streamed as if the client had called
-	// [WaitExecution][build.bazel.remote.execution.v2.Execution.WaitExecution]
-	// until the execution completes or the request reaches an error. The
-	// operation can also be queried using [Operations
-	// API][google.longrunning.Operations.GetOperation].
-	//
-	// The server NEED NOT implement other methods or functionality of the
-	// Operations API.
-	//
-	// Errors discovered during creation of the `Operation` will be reported
-	// as gRPC Status errors, while errors that occurred while running the
-	// action will be reported in the `status` field of the `ExecuteResponse`. The
-	// server MUST NOT set the `error` field of the `Operation` proto.
-	// The possible errors include:
-	//
-	// * `INVALID_ARGUMENT`: One or more arguments are invalid.
-	// * `FAILED_PRECONDITION`: One or more errors occurred in setting up the
-	//   action requested, such as a missing input or command or no worker being
-	//   available. The client may be able to fix the errors and retry.
-	// * `RESOURCE_EXHAUSTED`: There is insufficient quota of some resource to run
-	//   the action.
-	// * `UNAVAILABLE`: Due to a transient condition, such as all workers being
-	//   occupied (and the server does not support a queue), the action could not
-	//   be started. The client should retry.
-	// * `INTERNAL`: An internal error occurred in the execution engine or the
-	//   worker.
-	// * `DEADLINE_EXCEEDED`: The execution timed out.
-	// * `CANCELLED`: The operation was cancelled by the client. This status is
-	//   only possible if the server implements the Operations API CancelOperation
-	//   method, and it was called for the current execution.
-	//
-	// In the case of a missing input or command, the server SHOULD additionally
-	// send a [PreconditionFailure][google.rpc.PreconditionFailure] error detail
-	// where, for each requested blob not present in the CAS, there is a
-	// `Violation` with a `type` of `MISSING` and a `subject` of
-	// `"blobs/{hash}/{size}"` indicating the digest of the missing blob.
-	Execute(*ExecuteRequest, Execution_ExecuteServer) error
-	// Wait for an execution operation to complete. When the client initially
-	// makes the request, the server immediately responds with the current status
-	// of the execution. The server will leave the request stream open until the
-	// operation completes, and then respond with the completed operation. The
-	// server MAY choose to stream additional updates as execution progresses,
-	// such as to provide an update as to the state of the execution.
-	WaitExecution(*WaitExecutionRequest, Execution_WaitExecutionServer) error
-}
-
-func RegisterExecutionServer(s *grpc.Server, srv ExecutionServer) {
-	s.RegisterService(&_Execution_serviceDesc, srv)
-}
-
-func _Execution_Execute_Handler(srv interface{}, stream grpc.ServerStream) error {
-	m := new(ExecuteRequest)
-	if err := stream.RecvMsg(m); err != nil {
-		return err
-	}
-	return srv.(ExecutionServer).Execute(m, &executionExecuteServer{stream})
-}
-
-type Execution_ExecuteServer interface {
-	Send(*longrunning.Operation) error
-	grpc.ServerStream
-}
-
-type executionExecuteServer struct {
-	grpc.ServerStream
-}
-
-func (x *executionExecuteServer) Send(m *longrunning.Operation) error {
-	return x.ServerStream.SendMsg(m)
-}
-
-func _Execution_WaitExecution_Handler(srv interface{}, stream grpc.ServerStream) error {
-	m := new(WaitExecutionRequest)
-	if err := stream.RecvMsg(m); err != nil {
-		return err
-	}
-	return srv.(ExecutionServer).WaitExecution(m, &executionWaitExecutionServer{stream})
-}
-
-type Execution_WaitExecutionServer interface {
-	Send(*longrunning.Operation) error
-	grpc.ServerStream
-}
-
-type executionWaitExecutionServer struct {
-	grpc.ServerStream
-}
-
-func (x *executionWaitExecutionServer) Send(m *longrunning.Operation) error {
-	return x.ServerStream.SendMsg(m)
-}
-
-var _Execution_serviceDesc = grpc.ServiceDesc{
-	ServiceName: "build.bazel.remote.execution.v2.Execution",
-	HandlerType: (*ExecutionServer)(nil),
-	Methods:     []grpc.MethodDesc{},
-	Streams: []grpc.StreamDesc{
-		{
-			StreamName:    "Execute",
-			Handler:       _Execution_Execute_Handler,
-			ServerStreams: true,
-		},
-		{
-			StreamName:    "WaitExecution",
-			Handler:       _Execution_WaitExecution_Handler,
-			ServerStreams: true,
-		},
-	},
-	Metadata: "build/bazel/remote/execution/v2/remote_execution.proto",
-}
-
-// ActionCacheClient is the client API for ActionCache service.
-//
-// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
-type ActionCacheClient interface {
-	// Retrieve a cached execution result.
-	//
-	// Errors:
-	//
-	// * `NOT_FOUND`: The requested `ActionResult` is not in the cache.
-	GetActionResult(ctx context.Context, in *GetActionResultRequest, opts ...grpc.CallOption) (*ActionResult, error)
-	// Upload a new execution result.
-	//
-	// In order to allow the server to perform access control based on the type of
-	// action, and to assist with client debugging, the client MUST first upload
-	// the [Action][build.bazel.remote.execution.v2.Execution] that produced the
-	// result, along with its
-	// [Command][build.bazel.remote.execution.v2.Command], into the
-	// `ContentAddressableStorage`.
-	//
-	// Errors:
-	//
-	// * `INVALID_ARGUMENT`: One or more arguments are invalid.
-	// * `FAILED_PRECONDITION`: One or more errors occurred in updating the
-	//   action result, such as a missing command or action.
-	// * `RESOURCE_EXHAUSTED`: There is insufficient storage space to add the
-	//   entry to the cache.
-	UpdateActionResult(ctx context.Context, in *UpdateActionResultRequest, opts ...grpc.CallOption) (*ActionResult, error)
-}
-
-type actionCacheClient struct {
-	cc *grpc.ClientConn
-}
-
-func NewActionCacheClient(cc *grpc.ClientConn) ActionCacheClient {
-	return &actionCacheClient{cc}
-}
-
-func (c *actionCacheClient) GetActionResult(ctx context.Context, in *GetActionResultRequest, opts ...grpc.CallOption) (*ActionResult, error) {
-	out := new(ActionResult)
-	err := c.cc.Invoke(ctx, "/build.bazel.remote.execution.v2.ActionCache/GetActionResult", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *actionCacheClient) UpdateActionResult(ctx context.Context, in *UpdateActionResultRequest, opts ...grpc.CallOption) (*ActionResult, error) {
-	out := new(ActionResult)
-	err := c.cc.Invoke(ctx, "/build.bazel.remote.execution.v2.ActionCache/UpdateActionResult", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-// ActionCacheServer is the server API for ActionCache service.
-type ActionCacheServer interface {
-	// Retrieve a cached execution result.
-	//
-	// Errors:
-	//
-	// * `NOT_FOUND`: The requested `ActionResult` is not in the cache.
-	GetActionResult(context.Context, *GetActionResultRequest) (*ActionResult, error)
-	// Upload a new execution result.
-	//
-	// In order to allow the server to perform access control based on the type of
-	// action, and to assist with client debugging, the client MUST first upload
-	// the [Action][build.bazel.remote.execution.v2.Execution] that produced the
-	// result, along with its
-	// [Command][build.bazel.remote.execution.v2.Command], into the
-	// `ContentAddressableStorage`.
-	//
-	// Errors:
-	//
-	// * `INVALID_ARGUMENT`: One or more arguments are invalid.
-	// * `FAILED_PRECONDITION`: One or more errors occurred in updating the
-	//   action result, such as a missing command or action.
-	// * `RESOURCE_EXHAUSTED`: There is insufficient storage space to add the
-	//   entry to the cache.
-	UpdateActionResult(context.Context, *UpdateActionResultRequest) (*ActionResult, error)
-}
-
-func RegisterActionCacheServer(s *grpc.Server, srv ActionCacheServer) {
-	s.RegisterService(&_ActionCache_serviceDesc, srv)
-}
-
-func _ActionCache_GetActionResult_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(GetActionResultRequest)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(ActionCacheServer).GetActionResult(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/build.bazel.remote.execution.v2.ActionCache/GetActionResult",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(ActionCacheServer).GetActionResult(ctx, req.(*GetActionResultRequest))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _ActionCache_UpdateActionResult_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(UpdateActionResultRequest)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(ActionCacheServer).UpdateActionResult(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/build.bazel.remote.execution.v2.ActionCache/UpdateActionResult",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(ActionCacheServer).UpdateActionResult(ctx, req.(*UpdateActionResultRequest))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-var _ActionCache_serviceDesc = grpc.ServiceDesc{
-	ServiceName: "build.bazel.remote.execution.v2.ActionCache",
-	HandlerType: (*ActionCacheServer)(nil),
-	Methods: []grpc.MethodDesc{
-		{
-			MethodName: "GetActionResult",
-			Handler:    _ActionCache_GetActionResult_Handler,
-		},
-		{
-			MethodName: "UpdateActionResult",
-			Handler:    _ActionCache_UpdateActionResult_Handler,
-		},
-	},
-	Streams:  []grpc.StreamDesc{},
-	Metadata: "build/bazel/remote/execution/v2/remote_execution.proto",
-}
-
-// ContentAddressableStorageClient is the client API for ContentAddressableStorage service.
-//
-// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
-type ContentAddressableStorageClient interface {
-	// Determine if blobs are present in the CAS.
-	//
-	// Clients can use this API before uploading blobs to determine which ones are
-	// already present in the CAS and do not need to be uploaded again.
-	//
-	// There are no method-specific errors.
-	FindMissingBlobs(ctx context.Context, in *FindMissingBlobsRequest, opts ...grpc.CallOption) (*FindMissingBlobsResponse, error)
-	// Upload many blobs at once.
-	//
-	// The server may enforce a limit of the combined total size of blobs
-	// to be uploaded using this API. This limit may be obtained using the
-	// [Capabilities][build.bazel.remote.execution.v2.Capabilities] API.
-	// Requests exceeding the limit should either be split into smaller
-	// chunks or uploaded using the
-	// [ByteStream API][google.bytestream.ByteStream], as appropriate.
-	//
-	// This request is equivalent to calling a Bytestream `Write` request
-	// on each individual blob, in parallel. The requests may succeed or fail
-	// independently.
-	//
-	// Errors:
-	//
-	// * `INVALID_ARGUMENT`: The client attempted to upload more than the
-	//   server supported limit.
-	//
-	// Individual requests may return the following errors, additionally:
-	//
-	// * `RESOURCE_EXHAUSTED`: There is insufficient disk quota to store the blob.
-	// * `INVALID_ARGUMENT`: The
-	// [Digest][build.bazel.remote.execution.v2.Digest] does not match the
-	// provided data.
-	BatchUpdateBlobs(ctx context.Context, in *BatchUpdateBlobsRequest, opts ...grpc.CallOption) (*BatchUpdateBlobsResponse, error)
-	// Download many blobs at once.
-	//
-	// The server may enforce a limit of the combined total size of blobs
-	// to be downloaded using this API. This limit may be obtained using the
-	// [Capabilities][build.bazel.remote.execution.v2.Capabilities] API.
-	// Requests exceeding the limit should either be split into smaller
-	// chunks or downloaded using the
-	// [ByteStream API][google.bytestream.ByteStream], as appropriate.
-	//
-	// This request is equivalent to calling a Bytestream `Read` request
-	// on each individual blob, in parallel. The requests may succeed or fail
-	// independently.
-	//
-	// Errors:
-	//
-	// * `INVALID_ARGUMENT`: The client attempted to read more than the
-	//   server supported limit.
-	//
-	// Every error on individual read will be returned in the corresponding digest
-	// status.
-	BatchReadBlobs(ctx context.Context, in *BatchReadBlobsRequest, opts ...grpc.CallOption) (*BatchReadBlobsResponse, error)
-	// Fetch the entire directory tree rooted at a node.
-	//
-	// This request must be targeted at a
-	// [Directory][build.bazel.remote.execution.v2.Directory] stored in the
-	// [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage]
-	// (CAS). The server will enumerate the `Directory` tree recursively and
-	// return every node descended from the root.
-	//
-	// The GetTreeRequest.page_token parameter can be used to skip ahead in
-	// the stream (e.g. when retrying a partially completed and aborted request),
-	// by setting it to a value taken from GetTreeResponse.next_page_token of the
-	// last successfully processed GetTreeResponse).
-	//
-	// The exact traversal order is unspecified and, unless retrieving subsequent
-	// pages from an earlier request, is not guaranteed to be stable across
-	// multiple invocations of `GetTree`.
-	//
-	// If part of the tree is missing from the CAS, the server will return the
-	// portion present and omit the rest.
-	//
-	// * `NOT_FOUND`: The requested tree root is not present in the CAS.
-	GetTree(ctx context.Context, in *GetTreeRequest, opts ...grpc.CallOption) (ContentAddressableStorage_GetTreeClient, error)
-}
-
-type contentAddressableStorageClient struct {
-	cc *grpc.ClientConn
-}
-
-func NewContentAddressableStorageClient(cc *grpc.ClientConn) ContentAddressableStorageClient {
-	return &contentAddressableStorageClient{cc}
-}
-
-func (c *contentAddressableStorageClient) FindMissingBlobs(ctx context.Context, in *FindMissingBlobsRequest, opts ...grpc.CallOption) (*FindMissingBlobsResponse, error) {
-	out := new(FindMissingBlobsResponse)
-	err := c.cc.Invoke(ctx, "/build.bazel.remote.execution.v2.ContentAddressableStorage/FindMissingBlobs", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *contentAddressableStorageClient) BatchUpdateBlobs(ctx context.Context, in *BatchUpdateBlobsRequest, opts ...grpc.CallOption) (*BatchUpdateBlobsResponse, error) {
-	out := new(BatchUpdateBlobsResponse)
-	err := c.cc.Invoke(ctx, "/build.bazel.remote.execution.v2.ContentAddressableStorage/BatchUpdateBlobs", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *contentAddressableStorageClient) BatchReadBlobs(ctx context.Context, in *BatchReadBlobsRequest, opts ...grpc.CallOption) (*BatchReadBlobsResponse, error) {
-	out := new(BatchReadBlobsResponse)
-	err := c.cc.Invoke(ctx, "/build.bazel.remote.execution.v2.ContentAddressableStorage/BatchReadBlobs", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *contentAddressableStorageClient) GetTree(ctx context.Context, in *GetTreeRequest, opts ...grpc.CallOption) (ContentAddressableStorage_GetTreeClient, error) {
-	stream, err := c.cc.NewStream(ctx, &_ContentAddressableStorage_serviceDesc.Streams[0], "/build.bazel.remote.execution.v2.ContentAddressableStorage/GetTree", opts...)
-	if err != nil {
-		return nil, err
-	}
-	x := &contentAddressableStorageGetTreeClient{stream}
-	if err := x.ClientStream.SendMsg(in); err != nil {
-		return nil, err
-	}
-	if err := x.ClientStream.CloseSend(); err != nil {
-		return nil, err
-	}
-	return x, nil
-}
-
-type ContentAddressableStorage_GetTreeClient interface {
-	Recv() (*GetTreeResponse, error)
-	grpc.ClientStream
-}
-
-type contentAddressableStorageGetTreeClient struct {
-	grpc.ClientStream
-}
-
-func (x *contentAddressableStorageGetTreeClient) Recv() (*GetTreeResponse, error) {
-	m := new(GetTreeResponse)
-	if err := x.ClientStream.RecvMsg(m); err != nil {
-		return nil, err
-	}
-	return m, nil
-}
-
-// ContentAddressableStorageServer is the server API for ContentAddressableStorage service.
-type ContentAddressableStorageServer interface {
-	// Determine if blobs are present in the CAS.
-	//
-	// Clients can use this API before uploading blobs to determine which ones are
-	// already present in the CAS and do not need to be uploaded again.
-	//
-	// There are no method-specific errors.
-	FindMissingBlobs(context.Context, *FindMissingBlobsRequest) (*FindMissingBlobsResponse, error)
-	// Upload many blobs at once.
-	//
-	// The server may enforce a limit of the combined total size of blobs
-	// to be uploaded using this API. This limit may be obtained using the
-	// [Capabilities][build.bazel.remote.execution.v2.Capabilities] API.
-	// Requests exceeding the limit should either be split into smaller
-	// chunks or uploaded using the
-	// [ByteStream API][google.bytestream.ByteStream], as appropriate.
-	//
-	// This request is equivalent to calling a Bytestream `Write` request
-	// on each individual blob, in parallel. The requests may succeed or fail
-	// independently.
-	//
-	// Errors:
-	//
-	// * `INVALID_ARGUMENT`: The client attempted to upload more than the
-	//   server supported limit.
-	//
-	// Individual requests may return the following errors, additionally:
-	//
-	// * `RESOURCE_EXHAUSTED`: There is insufficient disk quota to store the blob.
-	// * `INVALID_ARGUMENT`: The
-	// [Digest][build.bazel.remote.execution.v2.Digest] does not match the
-	// provided data.
-	BatchUpdateBlobs(context.Context, *BatchUpdateBlobsRequest) (*BatchUpdateBlobsResponse, error)
-	// Download many blobs at once.
-	//
-	// The server may enforce a limit of the combined total size of blobs
-	// to be downloaded using this API. This limit may be obtained using the
-	// [Capabilities][build.bazel.remote.execution.v2.Capabilities] API.
-	// Requests exceeding the limit should either be split into smaller
-	// chunks or downloaded using the
-	// [ByteStream API][google.bytestream.ByteStream], as appropriate.
-	//
-	// This request is equivalent to calling a Bytestream `Read` request
-	// on each individual blob, in parallel. The requests may succeed or fail
-	// independently.
-	//
-	// Errors:
-	//
-	// * `INVALID_ARGUMENT`: The client attempted to read more than the
-	//   server supported limit.
-	//
-	// Every error on individual read will be returned in the corresponding digest
-	// status.
-	BatchReadBlobs(context.Context, *BatchReadBlobsRequest) (*BatchReadBlobsResponse, error)
-	// Fetch the entire directory tree rooted at a node.
-	//
-	// This request must be targeted at a
-	// [Directory][build.bazel.remote.execution.v2.Directory] stored in the
-	// [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage]
-	// (CAS). The server will enumerate the `Directory` tree recursively and
-	// return every node descended from the root.
-	//
-	// The GetTreeRequest.page_token parameter can be used to skip ahead in
-	// the stream (e.g. when retrying a partially completed and aborted request),
-	// by setting it to a value taken from GetTreeResponse.next_page_token of the
-	// last successfully processed GetTreeResponse).
-	//
-	// The exact traversal order is unspecified and, unless retrieving subsequent
-	// pages from an earlier request, is not guaranteed to be stable across
-	// multiple invocations of `GetTree`.
-	//
-	// If part of the tree is missing from the CAS, the server will return the
-	// portion present and omit the rest.
-	//
-	// * `NOT_FOUND`: The requested tree root is not present in the CAS.
-	GetTree(*GetTreeRequest, ContentAddressableStorage_GetTreeServer) error
-}
-
-func RegisterContentAddressableStorageServer(s *grpc.Server, srv ContentAddressableStorageServer) {
-	s.RegisterService(&_ContentAddressableStorage_serviceDesc, srv)
-}
-
-func _ContentAddressableStorage_FindMissingBlobs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(FindMissingBlobsRequest)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(ContentAddressableStorageServer).FindMissingBlobs(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/build.bazel.remote.execution.v2.ContentAddressableStorage/FindMissingBlobs",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(ContentAddressableStorageServer).FindMissingBlobs(ctx, req.(*FindMissingBlobsRequest))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _ContentAddressableStorage_BatchUpdateBlobs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(BatchUpdateBlobsRequest)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(ContentAddressableStorageServer).BatchUpdateBlobs(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/build.bazel.remote.execution.v2.ContentAddressableStorage/BatchUpdateBlobs",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(ContentAddressableStorageServer).BatchUpdateBlobs(ctx, req.(*BatchUpdateBlobsRequest))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _ContentAddressableStorage_BatchReadBlobs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(BatchReadBlobsRequest)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(ContentAddressableStorageServer).BatchReadBlobs(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/build.bazel.remote.execution.v2.ContentAddressableStorage/BatchReadBlobs",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(ContentAddressableStorageServer).BatchReadBlobs(ctx, req.(*BatchReadBlobsRequest))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _ContentAddressableStorage_GetTree_Handler(srv interface{}, stream grpc.ServerStream) error {
-	m := new(GetTreeRequest)
-	if err := stream.RecvMsg(m); err != nil {
-		return err
-	}
-	return srv.(ContentAddressableStorageServer).GetTree(m, &contentAddressableStorageGetTreeServer{stream})
-}
-
-type ContentAddressableStorage_GetTreeServer interface {
-	Send(*GetTreeResponse) error
-	grpc.ServerStream
-}
-
-type contentAddressableStorageGetTreeServer struct {
-	grpc.ServerStream
-}
-
-func (x *contentAddressableStorageGetTreeServer) Send(m *GetTreeResponse) error {
-	return x.ServerStream.SendMsg(m)
-}
-
-var _ContentAddressableStorage_serviceDesc = grpc.ServiceDesc{
-	ServiceName: "build.bazel.remote.execution.v2.ContentAddressableStorage",
-	HandlerType: (*ContentAddressableStorageServer)(nil),
-	Methods: []grpc.MethodDesc{
-		{
-			MethodName: "FindMissingBlobs",
-			Handler:    _ContentAddressableStorage_FindMissingBlobs_Handler,
-		},
-		{
-			MethodName: "BatchUpdateBlobs",
-			Handler:    _ContentAddressableStorage_BatchUpdateBlobs_Handler,
-		},
-		{
-			MethodName: "BatchReadBlobs",
-			Handler:    _ContentAddressableStorage_BatchReadBlobs_Handler,
-		},
-	},
-	Streams: []grpc.StreamDesc{
-		{
-			StreamName:    "GetTree",
-			Handler:       _ContentAddressableStorage_GetTree_Handler,
-			ServerStreams: true,
-		},
-	},
-	Metadata: "build/bazel/remote/execution/v2/remote_execution.proto",
-}
-
-// CapabilitiesClient is the client API for Capabilities service.
-//
-// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
-type CapabilitiesClient interface {
-	// GetCapabilities returns the server capabilities configuration.
-	GetCapabilities(ctx context.Context, in *GetCapabilitiesRequest, opts ...grpc.CallOption) (*ServerCapabilities, error)
-}
-
-type capabilitiesClient struct {
-	cc *grpc.ClientConn
-}
-
-func NewCapabilitiesClient(cc *grpc.ClientConn) CapabilitiesClient {
-	return &capabilitiesClient{cc}
-}
-
-func (c *capabilitiesClient) GetCapabilities(ctx context.Context, in *GetCapabilitiesRequest, opts ...grpc.CallOption) (*ServerCapabilities, error) {
-	out := new(ServerCapabilities)
-	err := c.cc.Invoke(ctx, "/build.bazel.remote.execution.v2.Capabilities/GetCapabilities", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-// CapabilitiesServer is the server API for Capabilities service.
-type CapabilitiesServer interface {
-	// GetCapabilities returns the server capabilities configuration.
-	GetCapabilities(context.Context, *GetCapabilitiesRequest) (*ServerCapabilities, error)
-}
-
-func RegisterCapabilitiesServer(s *grpc.Server, srv CapabilitiesServer) {
-	s.RegisterService(&_Capabilities_serviceDesc, srv)
-}
-
-func _Capabilities_GetCapabilities_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(GetCapabilitiesRequest)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(CapabilitiesServer).GetCapabilities(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/build.bazel.remote.execution.v2.Capabilities/GetCapabilities",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(CapabilitiesServer).GetCapabilities(ctx, req.(*GetCapabilitiesRequest))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-var _Capabilities_serviceDesc = grpc.ServiceDesc{
-	ServiceName: "build.bazel.remote.execution.v2.Capabilities",
-	HandlerType: (*CapabilitiesServer)(nil),
-	Methods: []grpc.MethodDesc{
-		{
-			MethodName: "GetCapabilities",
-			Handler:    _Capabilities_GetCapabilities_Handler,
-		},
-	},
-	Streams:  []grpc.StreamDesc{},
-	Metadata: "build/bazel/remote/execution/v2/remote_execution.proto",
-}
diff --git a/proto/remote-apis/build/bazel/remote/execution/v2/remote_execution.proto b/proto/remote-apis/build/bazel/remote/execution/v2/remote_execution.proto
deleted file mode 100644
index ca96a34..0000000
--- a/proto/remote-apis/build/bazel/remote/execution/v2/remote_execution.proto
+++ /dev/null
@@ -1,1433 +0,0 @@
-// Copyright 2018 The Bazel Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-syntax = "proto3";
-
-package build.bazel.remote.execution.v2;
-
-import "build/bazel/semver/semver.proto";
-import "google/api/annotations.proto";
-import "google/longrunning/operations.proto";
-import "google/protobuf/duration.proto";
-import "google/protobuf/timestamp.proto";
-import "google/rpc/status.proto";
-
-option csharp_namespace = "Build.Bazel.Remote.Execution.V2";
-option go_package = "remoteexecution";
-option java_multiple_files = true;
-option java_outer_classname = "RemoteExecutionProto";
-option java_package = "build.bazel.remote.execution.v2";
-option objc_class_prefix = "REX";
-
-
-// The Remote Execution API is used to execute an
-// [Action][build.bazel.remote.execution.v2.Action] on the remote
-// workers.
-//
-// As with other services in the Remote Execution API, any call may return an
-// error with a [RetryInfo][google.rpc.RetryInfo] error detail providing
-// information about when the client should retry the request; clients SHOULD
-// respect the information provided.
-service Execution {
-  // Execute an action remotely.
-  //
-  // In order to execute an action, the client must first upload all of the
-  // inputs, the
-  // [Command][build.bazel.remote.execution.v2.Command] to run, and the
-  // [Action][build.bazel.remote.execution.v2.Action] into the
-  // [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
-  // It then calls `Execute` with an `action_digest` referring to them. The
-  // server will run the action and eventually return the result.
-  //
-  // The input `Action`'s fields MUST meet the various canonicalization
-  // requirements specified in the documentation for their types so that it has
-  // the same digest as other logically equivalent `Action`s. The server MAY
-  // enforce the requirements and return errors if a non-canonical input is
-  // received. It MAY also proceed without verifying some or all of the
-  // requirements, such as for performance reasons. If the server does not
-  // verify the requirement, then it will treat the `Action` as distinct from
-  // another logically equivalent action if they hash differently.
-  //
-  // Returns a stream of
-  // [google.longrunning.Operation][google.longrunning.Operation] messages
-  // describing the resulting execution, with eventual `response`
-  // [ExecuteResponse][build.bazel.remote.execution.v2.ExecuteResponse]. The
-  // `metadata` on the operation is of type
-  // [ExecuteOperationMetadata][build.bazel.remote.execution.v2.ExecuteOperationMetadata].
-  //
-  // If the client remains connected after the first response is returned after
-  // the server, then updates are streamed as if the client had called
-  // [WaitExecution][build.bazel.remote.execution.v2.Execution.WaitExecution]
-  // until the execution completes or the request reaches an error. The
-  // operation can also be queried using [Operations
-  // API][google.longrunning.Operations.GetOperation].
-  //
-  // The server NEED NOT implement other methods or functionality of the
-  // Operations API.
-  //
-  // Errors discovered during creation of the `Operation` will be reported
-  // as gRPC Status errors, while errors that occurred while running the
-  // action will be reported in the `status` field of the `ExecuteResponse`. The
-  // server MUST NOT set the `error` field of the `Operation` proto.
-  // The possible errors include:
-  //
-  // * `INVALID_ARGUMENT`: One or more arguments are invalid.
-  // * `FAILED_PRECONDITION`: One or more errors occurred in setting up the
-  //   action requested, such as a missing input or command or no worker being
-  //   available. The client may be able to fix the errors and retry.
-  // * `RESOURCE_EXHAUSTED`: There is insufficient quota of some resource to run
-  //   the action.
-  // * `UNAVAILABLE`: Due to a transient condition, such as all workers being
-  //   occupied (and the server does not support a queue), the action could not
-  //   be started. The client should retry.
-  // * `INTERNAL`: An internal error occurred in the execution engine or the
-  //   worker.
-  // * `DEADLINE_EXCEEDED`: The execution timed out.
-  // * `CANCELLED`: The operation was cancelled by the client. This status is
-  //   only possible if the server implements the Operations API CancelOperation
-  //   method, and it was called for the current execution.
-  //
-  // In the case of a missing input or command, the server SHOULD additionally
-  // send a [PreconditionFailure][google.rpc.PreconditionFailure] error detail
-  // where, for each requested blob not present in the CAS, there is a
-  // `Violation` with a `type` of `MISSING` and a `subject` of
-  // `"blobs/{hash}/{size}"` indicating the digest of the missing blob.
-  rpc Execute(ExecuteRequest) returns (stream google.longrunning.Operation) {
-    option (google.api.http) = { post: "/v2/{instance_name=**}/actions:execute" body: "*" };
-  }
-
-  // Wait for an execution operation to complete. When the client initially
-  // makes the request, the server immediately responds with the current status
-  // of the execution. The server will leave the request stream open until the
-  // operation completes, and then respond with the completed operation. The
-  // server MAY choose to stream additional updates as execution progresses,
-  // such as to provide an update as to the state of the execution.
-  rpc WaitExecution(WaitExecutionRequest) returns (stream google.longrunning.Operation) {
-    option (google.api.http) = { post: "/v2/{name=operations/**}:waitExecution" body: "*" };
-  }
-}
-
-// The action cache API is used to query whether a given action has already been
-// performed and, if so, retrieve its result. Unlike the
-// [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage],
-// which addresses blobs by their own content, the action cache addresses the
-// [ActionResult][build.bazel.remote.execution.v2.ActionResult] by a
-// digest of the encoded [Action][build.bazel.remote.execution.v2.Action]
-// which produced them.
-//
-// The lifetime of entries in the action cache is implementation-specific, but
-// the server SHOULD assume that more recently used entries are more likely to
-// be used again. Additionally, action cache implementations SHOULD ensure that
-// any blobs referenced in the
-// [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage]
-// are still valid when returning a result.
-//
-// As with other services in the Remote Execution API, any call may return an
-// error with a [RetryInfo][google.rpc.RetryInfo] error detail providing
-// information about when the client should retry the request; clients SHOULD
-// respect the information provided.
-service ActionCache {
-  // Retrieve a cached execution result.
-  //
-  // Errors:
-  //
-  // * `NOT_FOUND`: The requested `ActionResult` is not in the cache.
-  rpc GetActionResult(GetActionResultRequest) returns (ActionResult) {
-    option (google.api.http) = { get: "/v2/{instance_name=**}/actionResults/{action_digest.hash}/{action_digest.size_bytes}" };
-  }
-
-  // Upload a new execution result.
-  //
-  // In order to allow the server to perform access control based on the type of
-  // action, and to assist with client debugging, the client MUST first upload
-  // the [Action][build.bazel.remote.execution.v2.Execution] that produced the
-  // result, along with its
-  // [Command][build.bazel.remote.execution.v2.Command], into the
-  // `ContentAddressableStorage`.
-  //
-  // Errors:
-  //
-  // * `INVALID_ARGUMENT`: One or more arguments are invalid.
-  // * `FAILED_PRECONDITION`: One or more errors occurred in updating the
-  //   action result, such as a missing command or action.
-  // * `RESOURCE_EXHAUSTED`: There is insufficient storage space to add the
-  //   entry to the cache.
-  rpc UpdateActionResult(UpdateActionResultRequest) returns (ActionResult) {
-    option (google.api.http) = { put: "/v2/{instance_name=**}/actionResults/{action_digest.hash}/{action_digest.size_bytes}" body: "action_result" };
-  }
-}
-
-// The CAS (content-addressable storage) is used to store the inputs to and
-// outputs from the execution service. Each piece of content is addressed by the
-// digest of its binary data.
-//
-// Most of the binary data stored in the CAS is opaque to the execution engine,
-// and is only used as a communication medium. In order to build an
-// [Action][build.bazel.remote.execution.v2.Action],
-// however, the client will need to also upload the
-// [Command][build.bazel.remote.execution.v2.Command] and input root
-// [Directory][build.bazel.remote.execution.v2.Directory] for the Action.
-// The Command and Directory messages must be marshalled to wire format and then
-// uploaded under the hash as with any other piece of content. In practice, the
-// input root directory is likely to refer to other Directories in its
-// hierarchy, which must also each be uploaded on their own.
-//
-// For small file uploads the client should group them together and call
-// [BatchUpdateBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchUpdateBlobs].
-// For large uploads, the client must use the
-// [Write method][google.bytestream.ByteStream.Write] of the ByteStream API. The
-// `resource_name` is `{instance_name}/uploads/{uuid}/blobs/{hash}/{size}`,
-// where `instance_name` is as described in the next paragraph, `uuid` is a
-// version 4 UUID generated by the client, and `hash` and `size` are the
-// [Digest][build.bazel.remote.execution.v2.Digest] of the blob. The
-// `uuid` is used only to avoid collisions when multiple clients try to upload
-// the same file (or the same client tries to upload the file multiple times at
-// once on different threads), so the client MAY reuse the `uuid` for uploading
-// different blobs. The `resource_name` may optionally have a trailing filename
-// (or other metadata) for a client to use if it is storing URLs, as in
-// `{instance}/uploads/{uuid}/blobs/{hash}/{size}/foo/bar/baz.cc`. Anything
-// after the `size` is ignored.
-//
-// A single server MAY support multiple instances of the execution system, each
-// with their own workers, storage, cache, etc. The exact relationship between
-// instances is up to the server. If the server does, then the `instance_name`
-// is an identifier, possibly containing multiple path segments, used to
-// distinguish between the various instances on the server, in a manner defined
-// by the server. For servers which do not support multiple instances, then the
-// `instance_name` is the empty path and the leading slash is omitted, so that
-// the `resource_name` becomes `uploads/{uuid}/blobs/{hash}/{size}`.
-// To simplify parsing, a path segment cannot equal any of the following
-// keywords: `blobs`, `uploads`, `actions`, `actionResults`, `operations` and
-// `capabilities`.
-//
-// When attempting an upload, if another client has already completed the upload
-// (which may occur in the middle of a single upload if another client uploads
-// the same blob concurrently), the request will terminate immediately with
-// a response whose `committed_size` is the full size of the uploaded file
-// (regardless of how much data was transmitted by the client). If the client
-// completes the upload but the
-// [Digest][build.bazel.remote.execution.v2.Digest] does not match, an
-// `INVALID_ARGUMENT` error will be returned. In either case, the client should
-// not attempt to retry the upload.
-//
-// For downloading blobs, the client must use the
-// [Read method][google.bytestream.ByteStream.Read] of the ByteStream API, with
-// a `resource_name` of `"{instance_name}/blobs/{hash}/{size}"`, where
-// `instance_name` is the instance name (see above), and `hash` and `size` are
-// the [Digest][build.bazel.remote.execution.v2.Digest] of the blob.
-//
-// The lifetime of entries in the CAS is implementation specific, but it SHOULD
-// be long enough to allow for newly-added and recently looked-up entries to be
-// used in subsequent calls (e.g. to
-// [Execute][build.bazel.remote.execution.v2.Execution.Execute]).
-//
-// As with other services in the Remote Execution API, any call may return an
-// error with a [RetryInfo][google.rpc.RetryInfo] error detail providing
-// information about when the client should retry the request; clients SHOULD
-// respect the information provided.
-service ContentAddressableStorage {
-  // Determine if blobs are present in the CAS.
-  //
-  // Clients can use this API before uploading blobs to determine which ones are
-  // already present in the CAS and do not need to be uploaded again.
-  //
-  // There are no method-specific errors.
-  rpc FindMissingBlobs(FindMissingBlobsRequest) returns (FindMissingBlobsResponse) {
-    option (google.api.http) = { post: "/v2/{instance_name=**}/blobs:findMissing" body: "*" };
-  }
-
-  // Upload many blobs at once.
-  //
-  // The server may enforce a limit of the combined total size of blobs
-  // to be uploaded using this API. This limit may be obtained using the
-  // [Capabilities][build.bazel.remote.execution.v2.Capabilities] API.
-  // Requests exceeding the limit should either be split into smaller
-  // chunks or uploaded using the
-  // [ByteStream API][google.bytestream.ByteStream], as appropriate.
-  //
-  // This request is equivalent to calling a Bytestream `Write` request
-  // on each individual blob, in parallel. The requests may succeed or fail
-  // independently.
-  //
-  // Errors:
-  //
-  // * `INVALID_ARGUMENT`: The client attempted to upload more than the
-  //   server supported limit.
-  //
-  // Individual requests may return the following errors, additionally:
-  //
-  // * `RESOURCE_EXHAUSTED`: There is insufficient disk quota to store the blob.
-  // * `INVALID_ARGUMENT`: The
-  // [Digest][build.bazel.remote.execution.v2.Digest] does not match the
-  // provided data.
-  rpc BatchUpdateBlobs(BatchUpdateBlobsRequest) returns (BatchUpdateBlobsResponse) {
-    option (google.api.http) = { post: "/v2/{instance_name=**}/blobs:batchUpdate" body: "*" };
-  }
-
-  // Download many blobs at once.
-  //
-  // The server may enforce a limit of the combined total size of blobs
-  // to be downloaded using this API. This limit may be obtained using the
-  // [Capabilities][build.bazel.remote.execution.v2.Capabilities] API.
-  // Requests exceeding the limit should either be split into smaller
-  // chunks or downloaded using the
-  // [ByteStream API][google.bytestream.ByteStream], as appropriate.
-  //
-  // This request is equivalent to calling a Bytestream `Read` request
-  // on each individual blob, in parallel. The requests may succeed or fail
-  // independently.
-  //
-  // Errors:
-  //
-  // * `INVALID_ARGUMENT`: The client attempted to read more than the
-  //   server supported limit.
-  //
-  // Every error on individual read will be returned in the corresponding digest
-  // status.
-  rpc BatchReadBlobs(BatchReadBlobsRequest) returns (BatchReadBlobsResponse) {
-    option (google.api.http) = { post: "/v2/{instance_name=**}/blobs:batchRead" body: "*" };
-  }
-
-  // Fetch the entire directory tree rooted at a node.
-  //
-  // This request must be targeted at a
-  // [Directory][build.bazel.remote.execution.v2.Directory] stored in the
-  // [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage]
-  // (CAS). The server will enumerate the `Directory` tree recursively and
-  // return every node descended from the root.
-  //
-  // The GetTreeRequest.page_token parameter can be used to skip ahead in
-  // the stream (e.g. when retrying a partially completed and aborted request),
-  // by setting it to a value taken from GetTreeResponse.next_page_token of the
-  // last successfully processed GetTreeResponse).
-  //
-  // The exact traversal order is unspecified and, unless retrieving subsequent
-  // pages from an earlier request, is not guaranteed to be stable across
-  // multiple invocations of `GetTree`.
-  //
-  // If part of the tree is missing from the CAS, the server will return the
-  // portion present and omit the rest.
-  //
-  // * `NOT_FOUND`: The requested tree root is not present in the CAS.
-  rpc GetTree(GetTreeRequest) returns (stream GetTreeResponse) {
-    option (google.api.http) = { get: "/v2/{instance_name=**}/blobs/{root_digest.hash}/{root_digest.size_bytes}:getTree" };
-  }
-}
-
-// The Capabilities service may be used by remote execution clients to query
-// various server properties, in order to self-configure or return meaningful
-// error messages.
-//
-// The query may include a particular `instance_name`, in which case the values
-// returned will pertain to that instance.
-service Capabilities {
-  // GetCapabilities returns the server capabilities configuration.
-  rpc GetCapabilities(GetCapabilitiesRequest) returns (ServerCapabilities) {
-    option (google.api.http) = {
-      get: "/v2/{instance_name=**}/capabilities"
-    };
-  }
-}
-
-// An `Action` captures all the information about an execution which is required
-// to reproduce it.
-//
-// `Action`s are the core component of the [Execution] service. A single
-// `Action` represents a repeatable action that can be performed by the
-// execution service. `Action`s can be succinctly identified by the digest of
-// their wire format encoding and, once an `Action` has been executed, will be
-// cached in the action cache. Future requests can then use the cached result
-// rather than needing to run afresh.
-//
-// When a server completes execution of an
-// [Action][build.bazel.remote.execution.v2.Action], it MAY choose to
-// cache the [result][build.bazel.remote.execution.v2.ActionResult] in
-// the [ActionCache][build.bazel.remote.execution.v2.ActionCache] unless
-// `do_not_cache` is `true`. Clients SHOULD expect the server to do so. By
-// default, future calls to
-// [Execute][build.bazel.remote.execution.v2.Execution.Execute] the same
-// `Action` will also serve their results from the cache. Clients must take care
-// to understand the caching behaviour. Ideally, all `Action`s will be
-// reproducible so that serving a result from cache is always desirable and
-// correct.
-message Action {
-  // The digest of the [Command][build.bazel.remote.execution.v2.Command]
-  // to run, which MUST be present in the
-  // [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
-  Digest command_digest = 1;
-
-  // The digest of the root
-  // [Directory][build.bazel.remote.execution.v2.Directory] for the input
-  // files. The files in the directory tree are available in the correct
-  // location on the build machine before the command is executed. The root
-  // directory, as well as every subdirectory and content blob referred to, MUST
-  // be in the
-  // [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
-  Digest input_root_digest = 2;
-
-  reserved 3 to 5; // Used for fields moved to [Command][build.bazel.remote.execution.v2.Command].
-
-  // A timeout after which the execution should be killed. If the timeout is
-  // absent, then the client is specifying that the execution should continue
-  // as long as the server will let it. The server SHOULD impose a timeout if
-  // the client does not specify one, however, if the client does specify a
-  // timeout that is longer than the server's maximum timeout, the server MUST
-  // reject the request.
-  //
-  // The timeout is a part of the
-  // [Action][build.bazel.remote.execution.v2.Action] message, and
-  // therefore two `Actions` with different timeouts are different, even if they
-  // are otherwise identical. This is because, if they were not, running an
-  // `Action` with a lower timeout than is required might result in a cache hit
-  // from an execution run with a longer timeout, hiding the fact that the
-  // timeout is too short. By encoding it directly in the `Action`, a lower
-  // timeout will result in a cache miss and the execution timeout will fail
-  // immediately, rather than whenever the cache entry gets evicted.
-  google.protobuf.Duration timeout = 6;
-
-  // If true, then the `Action`'s result cannot be cached, and in-flight
-  // requests for the same `Action` may not be merged.
-  bool do_not_cache = 7;
-}
-
-// A `Command` is the actual command executed by a worker running an
-// [Action][build.bazel.remote.execution.v2.Action] and specifications of its
-// environment.
-//
-// Except as otherwise required, the environment (such as which system
-// libraries or binaries are available, and what filesystems are mounted where)
-// is defined by and specific to the implementation of the remote execution API.
-message Command {
-  // An `EnvironmentVariable` is one variable to set in the running program's
-  // environment.
-  message EnvironmentVariable {
-    // The variable name.
-    string name = 1;
-
-    // The variable value.
-    string value = 2;
-  }
-
-  // The arguments to the command. The first argument must be the path to the
-  // executable, which must be either a relative path, in which case it is
-  // evaluated with respect to the input root, or an absolute path.
-  repeated string arguments = 1;
-
-  // The environment variables to set when running the program. The worker may
-  // provide its own default environment variables; these defaults can be
-  // overridden using this field. Additional variables can also be specified.
-  //
-  // In order to ensure that equivalent
-  // [Command][build.bazel.remote.execution.v2.Command]s always hash to the same
-  // value, the environment variables MUST be lexicographically sorted by name.
-  // Sorting of strings is done by code point, equivalently, by the UTF-8 bytes.
-  repeated EnvironmentVariable environment_variables = 2;
-
-  // A list of the output files that the client expects to retrieve from the
-  // action. Only the listed files, as well as directories listed in
-  // `output_directories`, will be returned to the client as output.
-  // Other files or directories that may be created during command execution
-  // are discarded.
-  //
-  // The paths are relative to the working directory of the action execution.
-  // The paths are specified using a single forward slash (`/`) as a path
-  // separator, even if the execution platform natively uses a different
-  // separator. The path MUST NOT include a trailing slash, nor a leading slash,
-  // being a relative path.
-  //
-  // In order to ensure consistent hashing of the same Action, the output paths
-  // MUST be sorted lexicographically by code point (or, equivalently, by UTF-8
-  // bytes).
-  //
-  // An output file cannot be duplicated, be a parent of another output file, or
-  // have the same path as any of the listed output directories.
-  //
-  // Directories leading up to the output files are created by the worker prior
-  // to execution, even if they are not explicitly part of the input root.
-  repeated string output_files = 3;
-
-  // A list of the output directories that the client expects to retrieve from
-  // the action. Only the listed directories will be returned (an entire
-  // directory structure will be returned as a
-  // [Tree][build.bazel.remote.execution.v2.Tree] message digest, see
-  // [OutputDirectory][build.bazel.remote.execution.v2.OutputDirectory]), as
-  // well as files listed in `output_files`. Other files or directories that
-  // may be created during command execution are discarded.
-  //
-  // The paths are relative to the working directory of the action execution.
-  // The paths are specified using a single forward slash (`/`) as a path
-  // separator, even if the execution platform natively uses a different
-  // separator. The path MUST NOT include a trailing slash, nor a leading slash,
-  // being a relative path. The special value of empty string is allowed,
-  // although not recommended, and can be used to capture the entire working
-  // directory tree, including inputs.
-  //
-  // In order to ensure consistent hashing of the same Action, the output paths
-  // MUST be sorted lexicographically by code point (or, equivalently, by UTF-8
-  // bytes).
-  //
-  // An output directory cannot be duplicated or have the same path as any of
-  // the listed output files.
-  //
-  // Directories leading up to the output directories (but not the output
-  // directories themselves) are created by the worker prior to execution, even
-  // if they are not explicitly part of the input root.
-  repeated string output_directories = 4;
-
-  // The platform requirements for the execution environment. The server MAY
-  // choose to execute the action on any worker satisfying the requirements, so
-  // the client SHOULD ensure that running the action on any such worker will
-  // have the same result.
-  Platform platform = 5;
-
-  // The working directory, relative to the input root, for the command to run
-  // in. It must be a directory which exists in the input tree. If it is left
-  // empty, then the action is run in the input root.
-  string working_directory = 6;
-}
-
-// A `Platform` is a set of requirements, such as hardware, operating system, or
-// compiler toolchain, for an
-// [Action][build.bazel.remote.execution.v2.Action]'s execution
-// environment. A `Platform` is represented as a series of key-value pairs
-// representing the properties that are required of the platform.
-message Platform {
-  // A single property for the environment. The server is responsible for
-  // specifying the property `name`s that it accepts. If an unknown `name` is
-  // provided in the requirements for an
-  // [Action][build.bazel.remote.execution.v2.Action], the server SHOULD
-  // reject the execution request. If permitted by the server, the same `name`
-  // may occur multiple times.
-  //
-  // The server is also responsible for specifying the interpretation of
-  // property `value`s. For instance, a property describing how much RAM must be
-  // available may be interpreted as allowing a worker with 16GB to fulfill a
-  // request for 8GB, while a property describing the OS environment on which
-  // the action must be performed may require an exact match with the worker's
-  // OS.
-  //
-  // The server MAY use the `value` of one or more properties to determine how
-  // it sets up the execution environment, such as by making specific system
-  // files available to the worker.
-  message Property {
-    // The property name.
-    string name = 1;
-
-    // The property value.
-    string value = 2;
-  }
-
-  // The properties that make up this platform. In order to ensure that
-  // equivalent `Platform`s always hash to the same value, the properties MUST
-  // be lexicographically sorted by name, and then by value. Sorting of strings
-  // is done by code point, equivalently, by the UTF-8 bytes.
-  repeated Property properties = 1;
-}
-
-// A `Directory` represents a directory node in a file tree, containing zero or
-// more children [FileNodes][build.bazel.remote.execution.v2.FileNode],
-// [DirectoryNodes][build.bazel.remote.execution.v2.DirectoryNode] and
-// [SymlinkNodes][build.bazel.remote.execution.v2.SymlinkNode].
-// Each `Node` contains its name in the directory, either the digest of its
-// content (either a file blob or a `Directory` proto) or a symlink target, as
-// well as possibly some metadata about the file or directory.
-//
-// In order to ensure that two equivalent directory trees hash to the same
-// value, the following restrictions MUST be obeyed when constructing a
-// a `Directory`:
-//
-// * Every child in the directory must have a path of exactly one segment.
-//   Multiple levels of directory hierarchy may not be collapsed.
-// * Each child in the directory must have a unique path segment (file name).
-//   Note that while the API itself is case-sensitive, the environment where
-//   the Action is executed may or may not be case-sensitive. That is, it is
-//   legal to call the API with a Directory that has both "Foo" and "foo" as
-//   children, but the Action may be rejected by the remote system upon
-//   execution.
-// * The files, directories and symlinks in the directory must each be sorted
-//   in lexicographical order by path. The path strings must be sorted by code
-//   point, equivalently, by UTF-8 bytes.
-//
-// A `Directory` that obeys the restrictions is said to be in canonical form.
-//
-// As an example, the following could be used for a file named `bar` and a
-// directory named `foo` with an executable file named `baz` (hashes shortened
-// for readability):
-//
-// ```json
-// // (Directory proto)
-// {
-//   files: [
-//     {
-//       name: "bar",
-//       digest: {
-//         hash: "4a73bc9d03...",
-//         size: 65534
-//       }
-//     }
-//   ],
-//   directories: [
-//     {
-//       name: "foo",
-//       digest: {
-//         hash: "4cf2eda940...",
-//         size: 43
-//       }
-//     }
-//   ]
-// }
-//
-// // (Directory proto with hash "4cf2eda940..." and size 43)
-// {
-//   files: [
-//     {
-//       name: "baz",
-//       digest: {
-//         hash: "b2c941073e...",
-//         size: 1294,
-//       },
-//       is_executable: true
-//     }
-//   ]
-// }
-// ```
-message Directory {
-  // The files in the directory.
-  repeated FileNode files = 1;
-
-  // The subdirectories in the directory.
-  repeated DirectoryNode directories = 2;
-
-  // The symlinks in the directory.
-  repeated SymlinkNode symlinks = 3;
-}
-
-// A `FileNode` represents a single file and associated metadata.
-message FileNode {
-  // The name of the file.
-  string name = 1;
-
-  // The digest of the file's content.
-  Digest digest = 2;
-
-  reserved 3; // Reserved to ensure wire-compatibility with `OutputFile`.
-
-  // True if file is executable, false otherwise.
-  bool is_executable = 4;
-}
-
-// A `DirectoryNode` represents a child of a
-// [Directory][build.bazel.remote.execution.v2.Directory] which is itself
-// a `Directory` and its associated metadata.
-message DirectoryNode {
-  // The name of the directory.
-  string name = 1;
-
-  // The digest of the
-  // [Directory][build.bazel.remote.execution.v2.Directory] object
-  // represented. See [Digest][build.bazel.remote.execution.v2.Digest]
-  // for information about how to take the digest of a proto message.
-  Digest digest = 2;
-}
-
-// A `SymlinkNode` represents a symbolic link.
-message SymlinkNode {
-  // The name of the symlink.
-  string name = 1;
-
-  // The target path of the symlink. The path separator is a forward slash `/`.
-  // The target path can be relative to the parent directory of the symlink or
-  // it can be an absolute path starting with `/`. Support for absolute paths
-  // can be checked using the [Capabilities][build.bazel.remote.execution.v2.Capabilities]
-  // API. The canonical form forbids the substrings `/./` and `//` in the target
-  // path. `..` components are allowed anywhere in the target path.
-  string target = 2;
-}
-
-// A content digest. A digest for a given blob consists of the size of the blob
-// and its hash. The hash algorithm to use is defined by the server, but servers
-// SHOULD use SHA-256.
-//
-// The size is considered to be an integral part of the digest and cannot be
-// separated. That is, even if the `hash` field is correctly specified but
-// `size_bytes` is not, the server MUST reject the request.
-//
-// The reason for including the size in the digest is as follows: in a great
-// many cases, the server needs to know the size of the blob it is about to work
-// with prior to starting an operation with it, such as flattening Merkle tree
-// structures or streaming it to a worker. Technically, the server could
-// implement a separate metadata store, but this results in a significantly more
-// complicated implementation as opposed to having the client specify the size
-// up-front (or storing the size along with the digest in every message where
-// digests are embedded). This does mean that the API leaks some implementation
-// details of (what we consider to be) a reasonable server implementation, but
-// we consider this to be a worthwhile tradeoff.
-//
-// When a `Digest` is used to refer to a proto message, it always refers to the
-// message in binary encoded form. To ensure consistent hashing, clients and
-// servers MUST ensure that they serialize messages according to the following
-// rules, even if there are alternate valid encodings for the same message:
-//
-// * Fields are serialized in tag order.
-// * There are no unknown fields.
-// * There are no duplicate fields.
-// * Fields are serialized according to the default semantics for their type.
-//
-// Most protocol buffer implementations will always follow these rules when
-// serializing, but care should be taken to avoid shortcuts. For instance,
-// concatenating two messages to merge them may produce duplicate fields.
-message Digest {
-  // The hash. In the case of SHA-256, it will always be a lowercase hex string
-  // exactly 64 characters long.
-  string hash = 1;
-
-  // The size of the blob, in bytes.
-  int64 size_bytes = 2;
-}
-
-// ExecutedActionMetadata contains details about a completed execution.
-message ExecutedActionMetadata {
-  // The name of the worker which ran the execution.
-  string worker = 1;
-
-  // When was the action added to the queue.
-  google.protobuf.Timestamp queued_timestamp = 2;
-
-  // When the worker received the action.
-  google.protobuf.Timestamp worker_start_timestamp = 3;
-
-  // When the worker completed the action, including all stages.
-  google.protobuf.Timestamp worker_completed_timestamp = 4;
-
-  // When the worker started fetching action inputs.
-  google.protobuf.Timestamp input_fetch_start_timestamp = 5;
-
-  // When the worker finished fetching action inputs.
-  google.protobuf.Timestamp input_fetch_completed_timestamp = 6;
-
-  // When the worker started executing the action command.
-  google.protobuf.Timestamp execution_start_timestamp = 7;
-
-  // When the worker completed executing the action command.
-  google.protobuf.Timestamp execution_completed_timestamp = 8;
-
-  // When the worker started uploading action outputs.
-  google.protobuf.Timestamp output_upload_start_timestamp = 9;
-
-  // When the worker finished uploading action outputs.
-  google.protobuf.Timestamp output_upload_completed_timestamp = 10;
-}
-
-// An ActionResult represents the result of an
-// [Action][build.bazel.remote.execution.v2.Action] being run.
-message ActionResult {
-  reserved 1; // Reserved for use as the resource name.
-
-  // The output files of the action. For each output file requested in the
-  // `output_files` field of the Action, if the corresponding file existed after
-  // the action completed, a single entry will be present either in this field,
-  // or in the output_file_symlinks field, if the file was a symbolic link to
-  // another file.
-  //
-  // If the action does not produce the requested output, or produces a
-  // directory where a regular file is expected or vice versa, then that output
-  // will be omitted from the list. The server is free to arrange the output
-  // list as desired; clients MUST NOT assume that the output list is sorted.
-  repeated OutputFile output_files = 2;
-
-  // The output files of the action that are symbolic links to other files. Those
-  // may be links to other output files, or input files, or even absolute paths
-  // outside of the working directory, if the server supports
-  // [SymlinkAbsolutePathStrategy.ALLOWED][build.bazel.remote.execution.v2.CacheCapabilities.SymlinkAbsolutePathStrategy].
-  // For each output file requested in the `output_files` field of the Action,
-  // if the corresponding file existed after
-  // the action completed, a single entry will be present either in this field,
-  // or in the `output_files` field, if the file was not a symbolic link.
-  //
-  // If the action does not produce the requested output, or produces a
-  // directory where a regular file is expected or vice versa, then that output
-  // will be omitted from the list. The server is free to arrange the output
-  // list as desired; clients MUST NOT assume that the output list is sorted.
-  repeated OutputSymlink output_file_symlinks = 10;
-
-  // The output directories of the action. For each output directory requested
-  // in the `output_directories` field of the Action, if the corresponding
-  // directory existed after the action completed, a single entry will be
-  // present in the output list, which will contain the digest of a
-  // [Tree][build.bazel.remote.execution.v2.Tree] message containing the
-  // directory tree, and the path equal exactly to the corresponding Action
-  // output_directories member.
-  //
-  // As an example, suppose the Action had an output directory `a/b/dir` and the
-  // execution produced the following contents in `a/b/dir`: a file named `bar`
-  // and a directory named `foo` with an executable file named `baz`. Then,
-  // output_directory will contain (hashes shortened for readability):
-  //
-  // ```json
-  // // OutputDirectory proto:
-  // {
-  //   path: "a/b/dir"
-  //   tree_digest: {
-  //     hash: "4a73bc9d03...",
-  //     size: 55
-  //   }
-  // }
-  // // Tree proto with hash "4a73bc9d03..." and size 55:
-  // {
-  //   root: {
-  //     files: [
-  //       {
-  //         name: "bar",
-  //         digest: {
-  //           hash: "4a73bc9d03...",
-  //           size: 65534
-  //         }
-  //       }
-  //     ],
-  //     directories: [
-  //       {
-  //         name: "foo",
-  //         digest: {
-  //           hash: "4cf2eda940...",
-  //           size: 43
-  //         }
-  //       }
-  //     ]
-  //   }
-  //   children : {
-  //     // (Directory proto with hash "4cf2eda940..." and size 43)
-  //     files: [
-  //       {
-  //         name: "baz",
-  //         digest: {
-  //           hash: "b2c941073e...",
-  //           size: 1294,
-  //         },
-  //         is_executable: true
-  //       }
-  //     ]
-  //   }
-  // }
-  // ```
-  repeated OutputDirectory output_directories = 3;
-
-  // The output directories of the action that are symbolic links to other
-  // directories. Those may be links to other output directories, or input
-  // directories, or even absolute paths outside of the working directory,
-  // if the server supports
-  // [SymlinkAbsolutePathStrategy.ALLOWED][build.bazel.remote.execution.v2.CacheCapabilities.SymlinkAbsolutePathStrategy].
-  // For each output directory requested in the `output_directories` field of
-  // the Action, if the directory file existed after
-  // the action completed, a single entry will be present either in this field,
-  // or in the `output_directories` field, if the directory was not a symbolic link.
-  //
-  // If the action does not produce the requested output, or produces a
-  // file where a directory is expected or vice versa, then that output
-  // will be omitted from the list. The server is free to arrange the output
-  // list as desired; clients MUST NOT assume that the output list is sorted.
-  repeated OutputSymlink output_directory_symlinks = 11;
-
-  // The exit code of the command.
-  int32 exit_code = 4;
-
-  // The standard output buffer of the action. The server will determine, based
-  // on the size of the buffer, whether to return it in raw form or to return
-  // a digest in `stdout_digest` that points to the buffer. If neither is set,
-  // then the buffer is empty. The client SHOULD NOT assume it will get one of
-  // the raw buffer or a digest on any given request and should be prepared to
-  // handle either.
-  bytes stdout_raw = 5;
-
-  // The digest for a blob containing the standard output of the action, which
-  // can be retrieved from the
-  // [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
-  // See `stdout_raw` for when this will be set.
-  Digest stdout_digest = 6;
-
-  // The standard error buffer of the action. The server will determine, based
-  // on the size of the buffer, whether to return it in raw form or to return
-  // a digest in `stderr_digest` that points to the buffer. If neither is set,
-  // then the buffer is empty. The client SHOULD NOT assume it will get one of
-  // the raw buffer or a digest on any given request and should be prepared to
-  // handle either.
-  bytes stderr_raw = 7;
-
-  // The digest for a blob containing the standard error of the action, which
-  // can be retrieved from the
-  // [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
-  // See `stderr_raw` for when this will be set.
-  Digest stderr_digest = 8;
-
-  // The details of the execution that originally produced this result.
-  ExecutedActionMetadata execution_metadata = 9;
-}
-
-// An `OutputFile` is similar to a
-// [FileNode][build.bazel.remote.execution.v2.FileNode], but it is used as an
-// output in an `ActionResult`. It allows a full file path rather than
-// only a name.
-//
-// `OutputFile` is binary-compatible with `FileNode`.
-message OutputFile {
-  // The full path of the file relative to the working directory, including the
-  // filename. The path separator is a forward slash `/`. Since this is a
-  // relative path, it MUST NOT begin with a leading forward slash.
-  string path = 1;
-
-  // The digest of the file's content.
-  Digest digest = 2;
-
-  reserved 3; // Used for a removed field in an earlier version of the API.
-
-  // True if file is executable, false otherwise.
-  bool is_executable = 4;
-}
-
-// A `Tree` contains all the
-// [Directory][build.bazel.remote.execution.v2.Directory] protos in a
-// single directory Merkle tree, compressed into one message.
-message Tree {
-  // The root directory in the tree.
-  Directory root = 1;
-
-  // All the child directories: the directories referred to by the root and,
-  // recursively, all its children. In order to reconstruct the directory tree,
-  // the client must take the digests of each of the child directories and then
-  // build up a tree starting from the `root`.
-  repeated Directory children = 2;
-}
-
-// An `OutputDirectory` is the output in an `ActionResult` corresponding to a
-// directory's full contents rather than a single file.
-message OutputDirectory {
-  // The full path of the directory relative to the working directory. The path
-  // separator is a forward slash `/`. Since this is a relative path, it MUST
-  // NOT begin with a leading forward slash. The empty string value is allowed,
-  // and it denotes the entire working directory.
-  string path = 1;
-
-  reserved 2; // Used for a removed field in an earlier version of the API.
-
-  // The digest of the encoded
-  // [Tree][build.bazel.remote.execution.v2.Tree] proto containing the
-  // directory's contents.
-  Digest tree_digest = 3;
-}
-
-// An `OutputSymlink` is similar to a
-// [Symlink][build.bazel.remote.execution.v2.SymlinkNode], but it is used as an
-// output in an `ActionResult`.
-//
-// `OutputSymlink` is binary-compatible with `SymlinkNode`.
-message OutputSymlink {
-  // The full path of the symlink relative to the working directory, including the
-  // filename. The path separator is a forward slash `/`. Since this is a
-  // relative path, it MUST NOT begin with a leading forward slash.
-  string path = 1;
-
-  // The target path of the symlink. The path separator is a forward slash `/`.
-  // The target path can be relative to the parent directory of the symlink or
-  // it can be an absolute path starting with `/`. Support for absolute paths
-  // can be checked using the [Capabilities][build.bazel.remote.execution.v2.Capabilities]
-  // API. The canonical form forbids the substrings `/./` and `//` in the target
-  // path. `..` components are allowed anywhere in the target path.
-  string target = 2;
-}
-
-// An `ExecutionPolicy` can be used to control the scheduling of the action.
-message ExecutionPolicy {
-  // The priority (relative importance) of this action. Generally, a lower value
-  // means that the action should be run sooner than actions having a greater
-  // priority value, but the interpretation of a given value is server-
-  // dependent. A priority of 0 means the *default* priority. Priorities may be
-  // positive or negative, and such actions should run later or sooner than
-  // actions having the default priority, respectively. The particular semantics
-  // of this field is up to the server. In particular, every server will have
-  // their own supported range of priorities, and will decide how these map into
-  // scheduling policy.
-  int32 priority = 1;
-}
-
-// A `ResultsCachePolicy` is used for fine-grained control over how action
-// outputs are stored in the CAS and Action Cache.
-message ResultsCachePolicy {
-  // The priority (relative importance) of this content in the overall cache.
-  // Generally, a lower value means a longer retention time or other advantage,
-  // but the interpretation of a given value is server-dependent. A priority of
-  // 0 means a *default* value, decided by the server.
-  //
-  // The particular semantics of this field is up to the server. In particular,
-  // every server will have their own supported range of priorities, and will
-  // decide how these map into retention/eviction policy.
-  int32 priority = 1;
-}
-
-// A request message for
-// [Execution.Execute][build.bazel.remote.execution.v2.Execution.Execute].
-message ExecuteRequest {
-  // The instance of the execution system to operate against. A server may
-  // support multiple instances of the execution system (with their own workers,
-  // storage, caches, etc.). The server MAY require use of this field to select
-  // between them in an implementation-defined fashion, otherwise it can be
-  // omitted.
-  string instance_name = 1;
-
-  // If true, the action will be executed even if its result is already
-  // present in the [ActionCache][build.bazel.remote.execution.v2.ActionCache].
-  // The execution is still allowed to be merged with other in-flight executions
-  // of the same action, however - semantically, the service MUST only guarantee
-  // that the results of an execution with this field set were not visible
-  // before the corresponding execution request was sent.
-  // Note that actions from execution requests setting this field set are still
-  // eligible to be entered into the action cache upon completion, and services
-  // SHOULD overwrite any existing entries that may exist. This allows
-  // skip_cache_lookup requests to be used as a mechanism for replacing action
-  // cache entries that reference outputs no longer available or that are
-  // poisoned in any way.
-  // If false, the result may be served from the action cache.
-  bool skip_cache_lookup = 3;
-
-  reserved 2, 4, 5; // Used for removed fields in an earlier version of the API.
-
-  // The digest of the [Action][build.bazel.remote.execution.v2.Action] to
-  // execute.
-  Digest action_digest = 6;
-
-  // An optional policy for execution of the action.
-  // The server will have a default policy if this is not provided.
-  ExecutionPolicy execution_policy = 7;
-
-  // An optional policy for the results of this execution in the remote cache.
-  // The server will have a default policy if this is not provided.
-  // This may be applied to both the ActionResult and the associated blobs.
-  ResultsCachePolicy results_cache_policy = 8;
-}
-
-// A `LogFile` is a log stored in the CAS.
-message LogFile {
-  // The digest of the log contents.
-  Digest digest = 1;
-
-  // This is a hint as to the purpose of the log, and is set to true if the log
-  // is human-readable text that can be usefully displayed to a user, and false
-  // otherwise. For instance, if a command-line client wishes to print the
-  // server logs to the terminal for a failed action, this allows it to avoid
-  // displaying a binary file.
-  bool human_readable = 2;
-}
-
-// The response message for
-// [Execution.Execute][build.bazel.remote.execution.v2.Execution.Execute],
-// which will be contained in the [response
-// field][google.longrunning.Operation.response] of the
-// [Operation][google.longrunning.Operation].
-message ExecuteResponse {
-  // The result of the action.
-  ActionResult result = 1;
-
-  // True if the result was served from cache, false if it was executed.
-  bool cached_result = 2;
-
-  // If the status has a code other than `OK`, it indicates that the action did
-  // not finish execution. For example, if the operation times out during
-  // execution, the status will have a `DEADLINE_EXCEEDED` code. Servers MUST
-  // use this field for errors in execution, rather than the error field on the
-  // `Operation` object.
-  //
-  // If the status code is other than `OK`, then the result MUST NOT be cached.
-  // For an error status, the `result` field is optional; the server may
-  // populate the output-, stdout-, and stderr-related fields if it has any
-  // information available, such as the stdout and stderr of a timed-out action.
-  google.rpc.Status status = 3;
-
-  // An optional list of additional log outputs the server wishes to provide. A
-  // server can use this to return execution-specific logs however it wishes.
-  // This is intended primarily to make it easier for users to debug issues that
-  // may be outside of the actual job execution, such as by identifying the
-  // worker executing the action or by providing logs from the worker's setup
-  // phase. The keys SHOULD be human readable so that a client can display them
-  // to a user.
-  map<string, LogFile> server_logs = 4;
-
-  // Freeform informational message with details on the execution of the action
-  // that may be displayed to the user upon failure or when requested explicitly.
-  string message = 5;
-}
-
-// Metadata about an ongoing
-// [execution][build.bazel.remote.execution.v2.Execution.Execute], which
-// will be contained in the [metadata
-// field][google.longrunning.Operation.response] of the
-// [Operation][google.longrunning.Operation].
-message ExecuteOperationMetadata {
-  // The current stage of execution.
-  enum Stage {
-    UNKNOWN = 0;
-
-    // Checking the result against the cache.
-    CACHE_CHECK = 1;
-
-    // Currently idle, awaiting a free machine to execute.
-    QUEUED = 2;
-
-    // Currently being executed by a worker.
-    EXECUTING = 3;
-
-    // Finished execution.
-    COMPLETED = 4;
-  }
-
-  Stage stage = 1;
-
-  // The digest of the [Action][build.bazel.remote.execution.v2.Action]
-  // being executed.
-  Digest action_digest = 2;
-
-  // If set, the client can use this name with
-  // [ByteStream.Read][google.bytestream.ByteStream.Read] to stream the
-  // standard output.
-  string stdout_stream_name = 3;
-
-  // If set, the client can use this name with
-  // [ByteStream.Read][google.bytestream.ByteStream.Read] to stream the
-  // standard error.
-  string stderr_stream_name = 4;
-}
-
-// A request message for
-// [WaitExecution][build.bazel.remote.execution.v2.Execution.WaitExecution].
-message WaitExecutionRequest {
-  // The name of the [Operation][google.longrunning.Operation]
-  // returned by [Execute][build.bazel.remote.execution.v2.Execution.Execute].
-  string name = 1;
-}
-
-// A request message for
-// [ActionCache.GetActionResult][build.bazel.remote.execution.v2.ActionCache.GetActionResult].
-message GetActionResultRequest {
-  // The instance of the execution system to operate against. A server may
-  // support multiple instances of the execution system (with their own workers,
-  // storage, caches, etc.). The server MAY require use of this field to select
-  // between them in an implementation-defined fashion, otherwise it can be
-  // omitted.
-  string instance_name = 1;
-
-  // The digest of the [Action][build.bazel.remote.execution.v2.Action]
-  // whose result is requested.
-  Digest action_digest = 2;
-}
-
-// A request message for
-// [ActionCache.UpdateActionResult][build.bazel.remote.execution.v2.ActionCache.UpdateActionResult].
-message UpdateActionResultRequest {
-  // The instance of the execution system to operate against. A server may
-  // support multiple instances of the execution system (with their own workers,
-  // storage, caches, etc.). The server MAY require use of this field to select
-  // between them in an implementation-defined fashion, otherwise it can be
-  // omitted.
-  string instance_name = 1;
-
-  // The digest of the [Action][build.bazel.remote.execution.v2.Action]
-  // whose result is being uploaded.
-  Digest action_digest = 2;
-
-  // The [ActionResult][build.bazel.remote.execution.v2.ActionResult]
-  // to store in the cache.
-  ActionResult action_result = 3;
-
-  // An optional policy for the results of this execution in the remote cache.
-  // The server will have a default policy if this is not provided.
-  // This may be applied to both the ActionResult and the associated blobs.
-  ResultsCachePolicy results_cache_policy = 4;
-}
-
-// A request message for
-// [ContentAddressableStorage.FindMissingBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.FindMissingBlobs].
-message FindMissingBlobsRequest {
-  // The instance of the execution system to operate against. A server may
-  // support multiple instances of the execution system (with their own workers,
-  // storage, caches, etc.). The server MAY require use of this field to select
-  // between them in an implementation-defined fashion, otherwise it can be
-  // omitted.
-  string instance_name = 1;
-
-  // A list of the blobs to check.
-  repeated Digest blob_digests = 2;
-}
-
-// A response message for
-// [ContentAddressableStorage.FindMissingBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.FindMissingBlobs].
-message FindMissingBlobsResponse {
-  // A list of the blobs requested *not* present in the storage.
-  repeated Digest missing_blob_digests = 2;
-}
-
-// A request message for
-// [ContentAddressableStorage.BatchUpdateBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchUpdateBlobs].
-message BatchUpdateBlobsRequest {
-  // A request corresponding to a single blob that the client wants to upload.
-  message Request {
-    // The digest of the blob. This MUST be the digest of `data`.
-    Digest digest = 1;
-
-    // The raw binary data.
-    bytes data = 2;
-  }
-
-  // The instance of the execution system to operate against. A server may
-  // support multiple instances of the execution system (with their own workers,
-  // storage, caches, etc.). The server MAY require use of this field to select
-  // between them in an implementation-defined fashion, otherwise it can be
-  // omitted.
-  string instance_name = 1;
-
-  // The individual upload requests.
-  repeated Request requests = 2;
-}
-
-// A response message for
-// [ContentAddressableStorage.BatchUpdateBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchUpdateBlobs].
-message BatchUpdateBlobsResponse {
-  // A response corresponding to a single blob that the client tried to upload.
-  message Response {
-    // The blob digest to which this response corresponds.
-    Digest digest = 1;
-
-    // The result of attempting to upload that blob.
-    google.rpc.Status status = 2;
-  }
-
-  // The responses to the requests.
-  repeated Response responses = 1;
-}
-
-// A request message for
-// [ContentAddressableStorage.BatchReadBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchReadBlobs].
-message BatchReadBlobsRequest {
-  // The instance of the execution system to operate against. A server may
-  // support multiple instances of the execution system (with their own workers,
-  // storage, caches, etc.). The server MAY require use of this field to select
-  // between them in an implementation-defined fashion, otherwise it can be
-  // omitted.
-  string instance_name = 1;
-
-  // The individual blob digests.
-  repeated Digest digests = 2;
-}
-
-// A response message for
-// [ContentAddressableStorage.BatchReadBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchReadBlobs].
-message BatchReadBlobsResponse {
-  // A response corresponding to a single blob that the client tried to download.
-  message Response {
-    // The digest to which this response corresponds.
-    Digest digest = 1;
-
-    // The raw binary data.
-    bytes data = 2;
-
-    // The result of attempting to download that blob.
-    google.rpc.Status status = 3;
-  }
-
-  // The responses to the requests.
-  repeated Response responses = 1;
-}
-
-// A request message for
-// [ContentAddressableStorage.GetTree][build.bazel.remote.execution.v2.ContentAddressableStorage.GetTree].
-message GetTreeRequest {
-  // The instance of the execution system to operate against. A server may
-  // support multiple instances of the execution system (with their own workers,
-  // storage, caches, etc.). The server MAY require use of this field to select
-  // between them in an implementation-defined fashion, otherwise it can be
-  // omitted.
-  string instance_name = 1;
-
-  // The digest of the root, which must be an encoded
-  // [Directory][build.bazel.remote.execution.v2.Directory] message
-  // stored in the
-  // [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
-  Digest root_digest = 2;
-
-  // A maximum page size to request. If present, the server will request no more
-  // than this many items. Regardless of whether a page size is specified, the
-  // server may place its own limit on the number of items to be returned and
-  // require the client to retrieve more items using a subsequent request.
-  int32 page_size = 3;
-
-  // A page token, which must be a value received in a previous
-  // [GetTreeResponse][build.bazel.remote.execution.v2.GetTreeResponse].
-  // If present, the server will use it to return the following page of results.
-  string page_token = 4;
-}
-
-// A response message for
-// [ContentAddressableStorage.GetTree][build.bazel.remote.execution.v2.ContentAddressableStorage.GetTree].
-message GetTreeResponse {
-  // The directories descended from the requested root.
-  repeated Directory directories = 1;
-
-  // If present, signifies that there are more results which the client can
-  // retrieve by passing this as the page_token in a subsequent
-  // [request][build.bazel.remote.execution.v2.GetTreeRequest].
-  // If empty, signifies that this is the last page of results.
-  string next_page_token = 2;
-}
-
-// A request message for
-// [Capabilities.GetCapabilities][build.bazel.remote.execution.v2.Capabilities.GetCapabilities].
-message GetCapabilitiesRequest {
-  // The instance of the execution system to operate against. A server may
-  // support multiple instances of the execution system (with their own workers,
-  // storage, caches, etc.). The server MAY require use of this field to select
-  // between them in an implementation-defined fashion, otherwise it can be
-  // omitted.
-  string instance_name = 1;
-}
-
-// A response message for
-// [Capabilities.GetCapabilities][build.bazel.remote.execution.v2.Capabilities.GetCapabilities].
-message ServerCapabilities {
-  // Capabilities of the remote cache system.
-  CacheCapabilities cache_capabilities = 1;
-
-  // Capabilities of the remote execution system.
-  ExecutionCapabilities execution_capabilities = 2;
-
-  // Earliest RE API version supported, including deprecated versions.
-  build.bazel.semver.SemVer deprecated_api_version = 3;
-
-  // Earliest non-deprecated RE API version supported.
-  build.bazel.semver.SemVer low_api_version = 4;
-
-  // Latest RE API version supported.
-  build.bazel.semver.SemVer high_api_version = 5;
-}
-
-// The digest function used for converting values into keys for CAS and Action
-// Cache.
-enum DigestFunction {
-  // It is an error for the server to return this value.
-  UNKNOWN = 0;
-
-  // The Sha-256 digest function.
-  SHA256 = 1;
-
-  // The Sha-1 digest function.
-  SHA1 = 2;
-
-  // The MD5 digest function.
-  MD5 = 3;
-}
-
-// Describes the server/instance capabilities for updating the action cache.
-message ActionCacheUpdateCapabilities {
-  bool update_enabled = 1;
-}
-
-// Allowed values for priority in
-// [ResultsCachePolicy][google.devtools.remoteexecution.v2.ResultsCachePolicy]
-// Used for querying both cache and execution valid priority ranges.
-message PriorityCapabilities {
-  // Supported range of priorities, including boundaries.
-  message PriorityRange {
-    int32 min_priority = 1;
-    int32 max_priority = 2;
-  }
-  repeated PriorityRange priorities = 1;
-}
-
-// Capabilities of the remote cache system.
-message CacheCapabilities {
-  // Describes how the server treats absolute symlink targets.
-  enum SymlinkAbsolutePathStrategy {
-    UNKNOWN = 0;
-
-    // Server will return an `INVALID_ARGUMENT` on input symlinks with absolute
-    // targets.
-    // If an action tries to create an output symlink with an absolute target, a
-    // `FAILED_PRECONDITION` will be returned.
-    DISALLOWED = 1;
-
-    // Server will allow symlink targets to escape the input root tree, possibly
-    // resulting in non-hermetic builds.
-    ALLOWED = 2;
-  }
-
-  // All the digest functions supported by the remote cache.
-  // Remote cache may support multiple digest functions simultaneously.
-  repeated DigestFunction digest_function = 1;
-
-  // Capabilities for updating the action cache.
-  ActionCacheUpdateCapabilities action_cache_update_capabilities = 2;
-
-  // Supported cache priority range for both CAS and ActionCache.
-  PriorityCapabilities cache_priority_capabilities = 3;
-
-  // Maximum total size of blobs to be uploaded/downloaded using
-  // batch methods. A value of 0 means no limit is set, although
-  // in practice there will always be a message size limitation
-  // of the protocol in use, e.g. GRPC.
-  int64 max_batch_total_size_bytes = 4;
-
-  // Whether absolute symlink targets are supported.
-  SymlinkAbsolutePathStrategy symlink_absolute_path_strategy = 5;
-}
-
-// Capabilities of the remote execution system.
-message ExecutionCapabilities {
-  // Remote execution may only support a single digest function.
-  DigestFunction digest_function = 1;
-
-  // Whether remote execution is enabled for the particular server/instance.
-  bool exec_enabled = 2;
-
-  // Supported execution priority range.
-  PriorityCapabilities execution_priority_capabilities = 3;
-}
-
-// Details for the tool used to call the API.
-message ToolDetails {
-  // Name of the tool, e.g. bazel.
-  string tool_name = 1;
-
-  // Version of the tool used for the request, e.g. 5.0.3.
-  string tool_version = 2;
-}
-
-// An optional Metadata to attach to any RPC request to tell the server about an
-// external context of the request. The server may use this for logging or other
-// purposes. To use it, the client attaches the header to the call using the
-// canonical proto serialization:
-//
-// * name: `build.bazel.remote.execution.v2.requestmetadata-bin`
-// * contents: the base64 encoded binary `RequestMetadata` message.
-message RequestMetadata {
-  // The details for the tool invoking the requests.
-  ToolDetails tool_details = 1;
-
-  // An identifier that ties multiple requests to the same action.
-  // For example, multiple requests to the CAS, Action Cache, and Execution
-  // API are used in order to compile foo.cc.
-  string action_id = 2;
-
-  // An identifier that ties multiple actions together to a final result.
-  // For example, multiple actions are required to build and run foo_test.
-  string tool_invocation_id = 3;
-
-  // An identifier to tie multiple tool invocations together. For example,
-  // runs of foo_test, bar_test and baz_test on a post-submit of a given patch.
-  string correlated_invocations_id = 4;
-}
diff --git a/proto/remote-apis/build/bazel/semver/BUILD b/proto/remote-apis/build/bazel/semver/BUILD
deleted file mode 100644
index ee2a98c..0000000
--- a/proto/remote-apis/build/bazel/semver/BUILD
+++ /dev/null
@@ -1,13 +0,0 @@
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])
-
-proto_library(
-    name = "semver_proto",
-    srcs = ["semver.proto"],
-)
-
-java_proto_library(
-    name = "semver_java_proto",
-    deps = [":semver_proto"],
-)
diff --git a/proto/remote-apis/build/bazel/semver/semver.pb.go b/proto/remote-apis/build/bazel/semver/semver.pb.go
deleted file mode 100644
index 1ffaca5..0000000
--- a/proto/remote-apis/build/bazel/semver/semver.pb.go
+++ /dev/null
@@ -1,113 +0,0 @@
-// Code generated by protoc-gen-go. DO NOT EDIT.
-// source: build/bazel/semver/semver.proto
-
-package semver
-
-import (
-	fmt "fmt"
-	proto "github.com/golang/protobuf/proto"
-	math "math"
-)
-
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
-
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
-
-// The full version of a given tool.
-type SemVer struct {
-	// The major version, e.g 10 for 10.2.3.
-	Major int32 `protobuf:"varint,1,opt,name=major,proto3" json:"major,omitempty"`
-	// The minor version, e.g. 2 for 10.2.3.
-	Minor int32 `protobuf:"varint,2,opt,name=minor,proto3" json:"minor,omitempty"`
-	// The patch version, e.g 3 for 10.2.3.
-	Patch int32 `protobuf:"varint,3,opt,name=patch,proto3" json:"patch,omitempty"`
-	// The pre-release version. Either this field or major/minor/patch fields
-	// must be filled. They are mutually exclusive. Pre-release versions are
-	// assumed to be earlier than any released versions.
-	Prerelease           string   `protobuf:"bytes,4,opt,name=prerelease,proto3" json:"prerelease,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *SemVer) Reset()         { *m = SemVer{} }
-func (m *SemVer) String() string { return proto.CompactTextString(m) }
-func (*SemVer) ProtoMessage()    {}
-func (*SemVer) Descriptor() ([]byte, []int) {
-	return fileDescriptor_3d8602885cf21c73, []int{0}
-}
-
-func (m *SemVer) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_SemVer.Unmarshal(m, b)
-}
-func (m *SemVer) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_SemVer.Marshal(b, m, deterministic)
-}
-func (m *SemVer) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_SemVer.Merge(m, src)
-}
-func (m *SemVer) XXX_Size() int {
-	return xxx_messageInfo_SemVer.Size(m)
-}
-func (m *SemVer) XXX_DiscardUnknown() {
-	xxx_messageInfo_SemVer.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_SemVer proto.InternalMessageInfo
-
-func (m *SemVer) GetMajor() int32 {
-	if m != nil {
-		return m.Major
-	}
-	return 0
-}
-
-func (m *SemVer) GetMinor() int32 {
-	if m != nil {
-		return m.Minor
-	}
-	return 0
-}
-
-func (m *SemVer) GetPatch() int32 {
-	if m != nil {
-		return m.Patch
-	}
-	return 0
-}
-
-func (m *SemVer) GetPrerelease() string {
-	if m != nil {
-		return m.Prerelease
-	}
-	return ""
-}
-
-func init() {
-	proto.RegisterType((*SemVer)(nil), "build.bazel.semver.SemVer")
-}
-
-func init() { proto.RegisterFile("build/bazel/semver/semver.proto", fileDescriptor_3d8602885cf21c73) }
-
-var fileDescriptor_3d8602885cf21c73 = []byte{
-	// 178 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4f, 0x2a, 0xcd, 0xcc,
-	0x49, 0xd1, 0x4f, 0x4a, 0xac, 0x4a, 0xcd, 0xd1, 0x2f, 0x4e, 0xcd, 0x2d, 0x4b, 0x2d, 0x82, 0x52,
-	0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, 0x42, 0x42, 0x60, 0x05, 0x7a, 0x60, 0x05, 0x7a, 0x10, 0x19,
-	0xa5, 0x2c, 0x2e, 0xb6, 0xe0, 0xd4, 0xdc, 0xb0, 0xd4, 0x22, 0x21, 0x11, 0x2e, 0xd6, 0xdc, 0xc4,
-	0xac, 0xfc, 0x22, 0x09, 0x46, 0x05, 0x46, 0x0d, 0xd6, 0x20, 0x08, 0x07, 0x2c, 0x9a, 0x99, 0x97,
-	0x5f, 0x24, 0xc1, 0x04, 0x15, 0x05, 0x71, 0x40, 0xa2, 0x05, 0x89, 0x25, 0xc9, 0x19, 0x12, 0xcc,
-	0x10, 0x51, 0x30, 0x47, 0x48, 0x8e, 0x8b, 0xab, 0xa0, 0x28, 0xb5, 0x28, 0x35, 0x27, 0x35, 0xb1,
-	0x38, 0x55, 0x82, 0x45, 0x81, 0x51, 0x83, 0x33, 0x08, 0x49, 0xc4, 0xc9, 0x8d, 0x0b, 0x8b, 0x0b,
-	0x9c, 0xb8, 0x83, 0xc1, 0x74, 0x00, 0xc8, 0x89, 0x01, 0x8c, 0x51, 0x6c, 0x10, 0xe1, 0x45, 0x4c,
-	0xcc, 0xc1, 0xbe, 0x61, 0xab, 0x98, 0x84, 0x9c, 0xc0, 0x3a, 0x9c, 0xc0, 0x3a, 0x20, 0x2a, 0x93,
-	0xd8, 0xc0, 0xde, 0x31, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x49, 0x4e, 0xf3, 0x93, 0xf1, 0x00,
-	0x00, 0x00,
-}
diff --git a/proto/remote-apis/build/bazel/semver/semver.proto b/proto/remote-apis/build/bazel/semver/semver.proto
deleted file mode 100644
index 3b626b7..0000000
--- a/proto/remote-apis/build/bazel/semver/semver.proto
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2018 The Bazel Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-syntax = "proto3";
-
-package build.bazel.semver;
-
-option csharp_namespace = "Build.Bazel.Semver";
-option go_package = "semver";
-option java_multiple_files = true;
-option java_outer_classname = "SemverProto";
-option java_package = "build.bazel.semver";
-option objc_class_prefix = "SMV";
-
-// The full version of a given tool.
-message SemVer {
-  // The major version, e.g 10 for 10.2.3.
-  int32 major = 1;
-
-  // The minor version, e.g. 2 for 10.2.3.
-  int32 minor = 2;
-
-  // The patch version, e.g 3 for 10.2.3.
-  int32 patch = 3;
-
-  // The pre-release version. Either this field or major/minor/patch fields
-  // must be filled. They are mutually exclusive. Pre-release versions are
-  // assumed to be earlier than any released versions.
-  string prerelease = 4;
-}
diff --git a/proto/remote-apis/doc.go b/proto/remote-apis/doc.go
deleted file mode 100644
index ad8ebba..0000000
--- a/proto/remote-apis/doc.go
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2018 The Goma Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Package remoteapis comes from https://github.com/bazelbuild/remote-apis.
-// commit cfe8e540cbb424e3ebc649ddcbc91190f70e23a6
-package remoteapis
-
-//go:generate protoc -I.. -I. --go_out=plugins=grpc,Mgoogle/protobuf/timestamp.proto=github.com/golang/protobuf/ptypes/timestamp,Mgoogle/protobuf/duration.proto=github.com/golang/protobuf/ptypes/duration,Mgoogle/longrunning/operations.proto=google.golang.org/genproto/googleapis/longrunning,Mgoogle/rpc/status.proto=google.golang.org/genproto/googleapis/rpc/status,Mbuild/bazel/semver/semver.proto=go.chromium.org/goma/server/proto/remote-apis/build/bazel/semver:. build/bazel/remote/execution/v2/remote_execution.proto
-//go:generate protoc -I. --go_out=plugins=grpc:. build/bazel/semver/semver.proto
diff --git a/remoteexec/adapter.go b/remoteexec/adapter.go
index d2de558..5be173e 100644
--- a/remoteexec/adapter.go
+++ b/remoteexec/adapter.go
@@ -10,12 +10,13 @@
 
 import (
 	"context"
+	"fmt"
 	"path"
 	"strings"
 	"sync"
 	"time"
 
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 	"go.chromium.org/goma/server/server"
 
 	"github.com/golang/protobuf/proto"
@@ -259,35 +260,46 @@
 		return resp, nil
 	}
 	r.setupNewAction(ctx)
-	logger.Infof("setup %s", time.Since(t))
+
+	// Use this to collect all timestamps and then print on one line, regardless of where
+	// this function returns.
+	var timestamps []string
+	defer func() {
+		logger.Infof("%s", strings.Join(timestamps, ", "))
+	}()
+	addTimestamp := func(desc string, duration time.Duration) {
+		timestamps = append(timestamps, fmt.Sprintf("%s: %s", desc, duration))
+	}
+
+	addTimestamp("setup", time.Since(t))
 
 	eresp := &rpb.ExecuteResponse{}
 	var cached bool
 	eresp.Result, cached = r.checkCache(ctx)
-	var execStartTime time.Time
 	if !cached {
 		t = time.Now()
 		blobs := r.missingBlobs(ctx)
-		logger.Infof("check missing %s", time.Since(t))
+		addTimestamp("check missing", time.Since(t))
 		t = time.Now()
 		resp := r.uploadBlobs(ctx, blobs)
 		if resp != nil {
-			logger.Infof("fail fast for missing input: %s", time.Since(t))
+			addTimestamp("fail fast for missing input", time.Since(t))
 			return resp, nil
 		}
-		logger.Infof("upload blobs %s", time.Since(t))
+		addTimestamp("upload blobs", time.Since(t))
 
-		execStartTime = time.Now()
+		t = time.Now()
 		var err error
 		eresp, err = r.executeAction(ctx)
-		logger.Infof("execute %s: %v", time.Since(execStartTime), err)
+		addTimestamp("execute", time.Since(t))
 		if err != nil {
+			logger.Infof("execute err=%v", err)
 			return nil, err
 		}
 	}
 	t = time.Now()
 	resp, err = r.newResp(ctx, eresp, cached)
-	logger.Infof("response %s", time.Since(t))
-	logger.Infof("total %s", time.Since(t0))
+	addTimestamp("response", time.Since(t))
+	addTimestamp("total", time.Since(t0))
 	return resp, err
 }
diff --git a/remoteexec/adapter_test.go b/remoteexec/adapter_test.go
index b73275a..7ed49a9 100644
--- a/remoteexec/adapter_test.go
+++ b/remoteexec/adapter_test.go
@@ -14,16 +14,16 @@
 	"testing"
 	"time"
 
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 	"github.com/golang/protobuf/proto"
 	"github.com/google/go-cmp/cmp"
 	bpb "google.golang.org/genproto/googleapis/bytestream"
 
-	"go.chromium.org/goma/server/log"
 	gomapb "go.chromium.org/goma/server/proto/api"
 	cmdpb "go.chromium.org/goma/server/proto/command"
 	fpb "go.chromium.org/goma/server/proto/file"
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
 	"go.chromium.org/goma/server/remoteexec/cas"
+	"go.chromium.org/goma/server/remoteexec/digest"
 )
 
 func TestAdapterHandleMissingCompiler(t *testing.T) {
@@ -561,15 +561,15 @@
 }
 
 type fileState struct {
+	digest       *rpb.Digest
 	isFile       bool
 	isDir        bool
 	isExecutable bool
 }
 
 // TODO: implement this with GetTree?
-func dumpDirIter(ctx context.Context, bs bpb.ByteStreamClient, instance, dir string, d *rpb.Digest, files map[string]fileState) error {
-	logger := log.FromContext(ctx)
-	logger.Infof("dir:%s %s\n", dir, d)
+func dumpDirIter(ctx context.Context, t *testing.T, bs bpb.ByteStreamClient, instance, dir string, d *rpb.Digest, files map[string]fileState) error {
+	t.Logf("dir:%s %s", dir, d)
 
 	resname := cas.ResName(instance, d)
 	var buf bytes.Buffer
@@ -588,17 +588,18 @@
 	for _, f := range curdir.Files {
 		fname := filepath.Join(dir, f.Name)
 		files[fname] = fileState{
+			digest:       f.Digest,
 			isFile:       true,
 			isExecutable: f.IsExecutable,
 		}
-		logger.Infof("file:%s %s x:%t\n", fname, f.Digest, f.IsExecutable)
+		t.Logf("file:%s %s x:%t", fname, f.Digest, f.IsExecutable)
 	}
 	for _, subdir := range curdir.Directories {
 		dname := filepath.Join(dir, subdir.Name)
 		files[dname] = fileState{
 			isDir: true,
 		}
-		err := dumpDirIter(ctx, bs, instance, dname, subdir.Digest, files)
+		err := dumpDirIter(ctx, t, bs, instance, dname, subdir.Digest, files)
 		if err != nil {
 			return err
 		}
@@ -608,9 +609,9 @@
 
 // dumpDirs dumps file list and directory list.
 // The value of `files` means a file is executable or not.
-func dumpDir(ctx context.Context, bs bpb.ByteStreamClient, instance, dir string, d *rpb.Digest) (map[string]fileState, error) {
+func dumpDir(ctx context.Context, t *testing.T, bs bpb.ByteStreamClient, instance, dir string, d *rpb.Digest) (map[string]fileState, error) {
 	files := make(map[string]fileState)
-	err := dumpDirIter(ctx, bs, instance, dir, d, files)
+	err := dumpDirIter(ctx, t, bs, instance, dir, d, files)
 	if err != nil {
 		return nil, err
 	}
@@ -677,7 +678,7 @@
 	if action == nil {
 		t.Fatalf("gotAction is nil")
 	}
-	files, err := dumpDir(ctx, cluster.adapter.Client, cluster.adapter.DefaultInstance(), ".", action.InputRootDigest)
+	files, err := dumpDir(ctx, t, cluster.adapter.Client, cluster.adapter.DefaultInstance(), ".", action.InputRootDigest)
 	if err != nil {
 		t.Fatalf("err %v", err)
 	}
@@ -726,7 +727,7 @@
 			"-c", "../../src/hello.c",
 			"-o", "hello.o",
 		},
-		Env: []string{},
+		Env: []string{"PWD=/b/c/w/out/Release"},
 		Cwd: proto.String("/b/c/w/out/Release"),
 		Input: []*gomapb.ExecReq_Input{
 			clangToolchainInput,
@@ -762,17 +763,40 @@
 		t.Errorf("Exec error=%v; want=%v", resp.GetError(), gomapb.ExecResp_OK)
 	}
 
+	command := cluster.rbe.gotCommand
+	if command == nil {
+		t.Fatal("gotCommand is nil")
+	}
+	wantArgs := []string{
+		"out/Release/run.sh",
+		"../../bin/clang", "-Iinclude",
+		"-c", "../../src/hello.c",
+		"-o", "hello.o",
+	}
+	if !cmp.Equal(command.Arguments, wantArgs) {
+		t.Errorf("arguments=%q; want=%q", command.Arguments, wantArgs)
+	}
+	wantEnvs := []*rpb.Command_EnvironmentVariable{
+		{
+			Name:  "WORK_DIR",
+			Value: "out/Release",
+		},
+	}
+	if !cmp.Equal(command.EnvironmentVariables, wantEnvs, cmp.Comparer(proto.Equal)) {
+		t.Errorf("environment_variables=%s; want=%s", command.EnvironmentVariables, wantEnvs)
+	}
+
 	action := cluster.rbe.gotAction
 	if action == nil {
 		t.Fatalf("gotAction is nil")
 	}
-	files, err := dumpDir(ctx, cluster.adapter.Client, cluster.adapter.DefaultInstance(), ".", action.InputRootDigest)
+	files, err := dumpDir(ctx, t, cluster.adapter.Client, cluster.adapter.DefaultInstance(), ".", action.InputRootDigest)
 	if err != nil {
 		t.Fatalf("err %v", err)
 	}
 
 	// files and executables might contain extra "out/Release/run.sh".
-	wantFiles := []string{"bin/clang", "include/hello.h", "src/hello.c"}
+	wantFiles := []string{"out/Release/run.sh", "bin/clang", "include/hello.h", "src/hello.c"}
 	wantExecutables := []string{"bin/clang"}
 
 	for _, f := range wantFiles {
@@ -785,6 +809,146 @@
 			t.Errorf("%q was not an executable file, but should: files=%v", e, files)
 		}
 	}
+
+	if got, want := files["out/Release/run.sh"].digest, digest.Bytes("cwd-agnostic-wrapper-script", []byte(cwdAgnosticWrapperScript)).Digest(); !proto.Equal(got, want) {
+		t.Errorf("digest of out/Release/run.sh: %s != %s", got, want)
+	}
+}
+
+func TestAdaptorHandleArbitraryToolchainSupportNonCwdAgnostic(t *testing.T) {
+	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
+	defer cancel()
+
+	cluster := &fakeCluster{
+		rbe: newFakeRBE(),
+	}
+	err := cluster.setup(ctx, cluster.rbe.instancePrefix)
+	if err != nil {
+		t.Fatal(err)
+	}
+	defer cluster.teardown()
+
+	// Instead of adding a new compiler, register toolchain platform.
+	err = cluster.pushPlatform(ctx, "docker://grpc.io/goma-dev/container-image@sha256:yyyy", []string{"os:linux"})
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	var localFiles fakeLocalFiles
+	localFiles.Add("/b/c/w/bin/clang", randomBigSize())
+	localFiles.Add("/b/c/w/include/hello.h", randomSize())
+	localFiles.Add("/b/c/w/src/hello.c", randomSize())
+
+	clangToolchainInput := localFiles.mustInput(ctx, t, cluster.adapter.GomaFile, "/b/c/w/bin/clang", "../../bin/clang")
+	clangHashKey := localFiles.mustFileHash(ctx, t, "/b/c/w/bin/clang")
+
+	req := &gomapb.ExecReq{
+		CommandSpec: &gomapb.CommandSpec{
+			Name:              proto.String("clang"),
+			Version:           proto.String("1234"),
+			Target:            proto.String("x86-64-linux-gnu"),
+			BinaryHash:        []byte(clangHashKey),
+			LocalCompilerPath: proto.String("../../bin/clang"),
+		},
+		Arg: []string{
+			"../../bin/clang", "-Iinclude",
+			"-g", "-c", "../../src/hello.c",
+			"-o", "hello.o",
+		},
+		Env: []string{"PWD=/b/c/w/out/Debug"},
+		Cwd: proto.String("/b/c/w/out/Debug"),
+		Input: []*gomapb.ExecReq_Input{
+			clangToolchainInput,
+			localFiles.mustInput(ctx, t, cluster.adapter.GomaFile, "/b/c/w/include/hello.h", "../../include/hello.h"),
+			localFiles.mustInput(ctx, t, cluster.adapter.GomaFile, "/b/c/w/src/hello.c", "../../src/hello.c"),
+		},
+		Subprogram:        []*gomapb.SubprogramSpec{},
+		ToolchainIncluded: proto.Bool(true),
+		ToolchainSpecs: []*gomapb.ToolchainSpec{
+			&gomapb.ToolchainSpec{
+				Path:         proto.String("../../bin/clang"),
+				Hash:         proto.String(clangHashKey),
+				Size:         clangToolchainInput.Content.FileSize,
+				IsExecutable: proto.Bool(true),
+			},
+		},
+		RequesterInfo: &gomapb.RequesterInfo{
+			Dimensions: []string{
+				"os:linux",
+			},
+			PathStyle: gomapb.RequesterInfo_POSIX_STYLE.Enum(),
+		},
+		ExpectedOutputFiles: []string{
+			"hello.o",
+		},
+	}
+
+	resp, err := cluster.adapter.Exec(ctx, req)
+	if err != nil {
+		t.Fatalf("Exec(ctx, req)=%v; %v; want nil error", resp, err)
+	}
+	if resp.GetError() != gomapb.ExecResp_OK {
+		t.Errorf("Exec error=%v; want=%v", resp.GetError(), gomapb.ExecResp_OK)
+	}
+
+	command := cluster.rbe.gotCommand
+	if command == nil {
+		t.Fatal("gotCommand is nil")
+	}
+	wantArgs := []string{
+		"out/Debug/run.sh",
+		"../../bin/clang", "-Iinclude",
+		"-g", "-c", "../../src/hello.c",
+		"-o", "hello.o",
+	}
+	if !cmp.Equal(command.Arguments, wantArgs) {
+		t.Errorf("arguments=%q; want=%q", command.Arguments, wantArgs)
+	}
+	wantEnvs := []*rpb.Command_EnvironmentVariable{
+		{
+			Name:  "INPUT_ROOT_DIR",
+			Value: "/b/c/w",
+		},
+		{
+			Name:  "PWD",
+			Value: "/b/c/w/out/Debug",
+		},
+		{
+			Name:  "WORK_DIR",
+			Value: "out/Debug",
+		},
+	}
+	if !cmp.Equal(command.EnvironmentVariables, wantEnvs, cmp.Comparer(proto.Equal)) {
+		t.Errorf("environment_variables=%s; want=%s", command.EnvironmentVariables, wantEnvs)
+	}
+
+	action := cluster.rbe.gotAction
+	if action == nil {
+		t.Fatalf("gotAction is nil")
+	}
+	files, err := dumpDir(ctx, t, cluster.adapter.Client, cluster.adapter.DefaultInstance(), ".", action.InputRootDigest)
+	if err != nil {
+		t.Fatalf("err %v", err)
+	}
+
+	// files and executables might contain extra "out/Release/run.sh".
+	wantFiles := []string{"out/Debug/run.sh", "bin/clang", "include/hello.h", "src/hello.c"}
+	wantExecutables := []string{"bin/clang"}
+
+	for _, f := range wantFiles {
+		if !files[f].isFile {
+			t.Errorf("%q was not found in files, but should: files=%v", f, files)
+		}
+	}
+	for _, e := range wantExecutables {
+		if !files[e].isExecutable {
+			t.Errorf("%q was not an executable file, but should: files=%v", e, files)
+		}
+	}
+
+	if got, want := files["out/Debug/run.sh"].digest, digest.Bytes("wrapper-script", []byte(wrapperScript)).Digest(); !proto.Equal(got, want) {
+		t.Errorf("digest of out/Debug/run.sh: %s != %s", got, want)
+	}
 }
 
 func TestAdapterDockerProperties(t *testing.T) {
diff --git a/remoteexec/cas/bytestream.go b/remoteexec/cas/bytestream.go
index 51cad18..0150c39 100644
--- a/remoteexec/cas/bytestream.go
+++ b/remoteexec/cas/bytestream.go
@@ -12,7 +12,7 @@
 	"strings"
 	"time"
 
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 
 	"github.com/google/uuid"
 	"go.opencensus.io/trace"
diff --git a/remoteexec/cas/cas.go b/remoteexec/cas/cas.go
index 0e5cf0d..408a89b 100644
--- a/remoteexec/cas/cas.go
+++ b/remoteexec/cas/cas.go
@@ -14,7 +14,7 @@
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/codes"
 
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 
 	bpb "google.golang.org/genproto/googleapis/bytestream"
 
diff --git a/remoteexec/client.go b/remoteexec/client.go
index 3d58fbf..9eaae09 100644
--- a/remoteexec/client.go
+++ b/remoteexec/client.go
@@ -8,7 +8,7 @@
 	"context"
 	"time"
 
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 
 	"github.com/golang/protobuf/proto"
 	"github.com/golang/protobuf/ptypes"
@@ -149,6 +149,20 @@
 	return rpb.NewCapabilitiesClient(c.ClientConn).GetCapabilities(ctx, req, c.callOptions(opts...)...)
 }
 
+func logOpMetadata(logger log.Logger, op *lpb.Operation) {
+	if op.GetMetadata() == nil {
+		logger.Infof("operation update: no metadata")
+		return
+	}
+	md := &rpb.ExecuteOperationMetadata{}
+	err := ptypes.UnmarshalAny(op.GetMetadata(), md)
+	if err != nil {
+		logger.Warnf("operation update: %s: metadata bad type %T: %v", op.GetName(), op.GetMetadata(), err)
+		return
+	}
+	logger.Infof("operation update: %s: %v", op.GetName(), md)
+}
+
 // ExecuteAndWait executes and action remotely and wait its response.
 // it returns operation name, response and error.
 func ExecuteAndWait(ctx context.Context, c Client, req *rpb.ExecuteRequest, opts ...grpc.CallOption) (string, *rpb.ExecuteResponse, error) {
@@ -199,13 +213,7 @@
 				logger.Infof("operation starts: %s", opName)
 			}
 			if !op.GetDone() {
-				md := &rpb.ExecuteOperationMetadata{}
-				err = ptypes.UnmarshalAny(op.GetMetadata(), md)
-				if err != nil {
-					logger.Warnf("operation update: %s: metadata bad type %T: %v", op.GetName(), op.GetMetadata(), err)
-				} else {
-					logger.Infof("operation update: %s: %v", op.GetName(), md)
-				}
+				logOpMetadata(logger, op)
 				waitReq = &rpb.WaitExecutionRequest{
 					Name: opName,
 				}
diff --git a/remoteexec/cmdfile.go b/remoteexec/cmdfile.go
index ca5f58e..8760248 100644
--- a/remoteexec/cmdfile.go
+++ b/remoteexec/cmdfile.go
@@ -9,7 +9,7 @@
 	"fmt"
 	"io"
 
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 
 	pb "go.chromium.org/goma/server/proto/command"
 	"go.chromium.org/goma/server/remoteexec/digest"
diff --git a/remoteexec/cmdfile_test.go b/remoteexec/cmdfile_test.go
index c959a59..3bc359a 100644
--- a/remoteexec/cmdfile_test.go
+++ b/remoteexec/cmdfile_test.go
@@ -10,7 +10,7 @@
 	"reflect"
 	"testing"
 
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 
 	pb "go.chromium.org/goma/server/proto/command"
 	"go.chromium.org/goma/server/remoteexec/digest"
diff --git a/remoteexec/digest/digest.go b/remoteexec/digest/digest.go
index ca9401d..c912ce8 100644
--- a/remoteexec/digest/digest.go
+++ b/remoteexec/digest/digest.go
@@ -11,7 +11,7 @@
 	"fmt"
 	"io"
 
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 
 	"github.com/golang/protobuf/proto"
 
diff --git a/remoteexec/digest/digest_cache.go b/remoteexec/digest/digest_cache.go
index e1e31e9..2e28afc 100644
--- a/remoteexec/digest/digest_cache.go
+++ b/remoteexec/digest/digest_cache.go
@@ -10,7 +10,7 @@
 	"sync"
 	"time"
 
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 
 	"github.com/golang/protobuf/proto"
 
diff --git a/remoteexec/digest/digest_store.go b/remoteexec/digest/digest_store.go
index 8bed4b9..785a24a 100644
--- a/remoteexec/digest/digest_store.go
+++ b/remoteexec/digest/digest_store.go
@@ -3,7 +3,7 @@
 package digest
 
 import (
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 )
 
 type digestKey struct {
diff --git a/remoteexec/exec.go b/remoteexec/exec.go
index 5af9be4..67eaff1 100644
--- a/remoteexec/exec.go
+++ b/remoteexec/exec.go
@@ -15,7 +15,7 @@
 	"sync"
 	"time"
 
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 
 	"github.com/golang/protobuf/proto"
 	"github.com/golang/protobuf/ptypes"
@@ -58,16 +58,20 @@
 	action       *rpb.Action
 	actionDigest *rpb.Digest
 
+	needOverlay bool
+
 	err error
 }
 
 type clientFilePath interface {
 	IsAbs(path string) bool
+	Base(path string) string
 	Dir(path string) string
 	Join(elem ...string) string
 	Rel(basepath, targpath string) (string, error)
 	Clean(path string) string
 	SplitElem(path string) []string
+	PathSep() string
 }
 
 func doNotCache(req *gomapb.ExecReq) bool {
@@ -230,7 +234,7 @@
 		r.gomaResp.ErrorMessage = append(r.gomaResp.ErrorMessage, fmt.Sprintf("bad input: %v", err))
 		return r.gomaResp
 	}
-	rootDir, err := inputRootDir(r.filepath, inputPaths)
+	rootDir, needOverlay, err := inputRootDir(r.filepath, inputPaths, false)
 	if err != nil {
 		logger.Errorf("input root detection failed: %v", err)
 		logFileList(logger, "input paths", inputPaths)
@@ -239,6 +243,7 @@
 		return r.gomaResp
 	}
 	r.tree = merkletree.New(r.filepath, rootDir, r.digestStore)
+	r.needOverlay = needOverlay
 
 	logger.Infof("new input tree cwd:%s root:%s %s", r.gomaReq.GetCwd(), r.tree.RootDir(), r.cmdConfig.GetCmdDescriptor().GetSetup().GetPathType())
 	gi := gomaInput{
@@ -581,23 +586,33 @@
 		wd = "."
 	}
 	envs := []string{fmt.Sprintf("WORK_DIR=%s", wd)}
-	var data digest.Data
-	wrapperName := ""
+
+	// The developer of this program can make multiple wrapper scripts
+	// to be used by adding wrapperDesc instances to `wrappers`.
+	// However, only the first one is called in the command line.
+	// The other scripts should be called from the first wrapper script.
+	type wrapperDesc struct {
+		name string
+		data digest.Data
+	}
+	var wrappers []wrapperDesc
+
 	args := buildArgs(ctx, cmdConfig, argv0, r.gomaReq)
 
 	pathType := cmdConfig.GetCmdDescriptor().GetSetup().GetPathType()
 	switch pathType {
 	case cmdpb.CmdDescriptor_POSIX:
+		var d digest.Data
 		err = cwdAgnosticReq(ctx, cmdConfig, r.filepath, r.gomaReq.Arg, r.gomaReq.Env)
 		if err != nil {
 			logger.Infof("non cwd agnostic: %v", err)
-			data = digest.Bytes("wrapper-script", []byte(wrapperScript))
+			d = digest.Bytes("wrapper-script", []byte(wrapperScript))
 			envs = append(envs, fmt.Sprintf("INPUT_ROOT_DIR=%s", r.tree.RootDir()))
 			envs = append(envs, r.gomaReq.Env...)
 			r.addPlatformProperty(ctx, "dockerSiblingContainers", "true")
 		} else {
 			logger.Infof("cwd agnostic")
-			data = digest.Bytes("cwd-agnostic-wrapper-script", []byte(cwdAgnosticWrapperScript))
+			d = digest.Bytes("cwd-agnostic-wrapper-script", []byte(cwdAgnosticWrapperScript))
 			for _, e := range r.gomaReq.Env {
 				if strings.HasPrefix(e, "PWD=") {
 					// PWD is usually absolute path.
@@ -608,36 +623,61 @@
 				envs = append(envs, e)
 			}
 		}
-		wrapperName = "run.sh"
+		wrappers = []wrapperDesc{
+			{
+				name: "run.sh",
+				data: d,
+			},
+		}
 
 	case cmdpb.CmdDescriptor_WINDOWS:
-		wrapperName, data, err = wrapperForWindows(ctx)
+		wn, data, err := wrapperForWindows(ctx)
+		if err != nil {
+			return err
+		}
+		wrappers = []wrapperDesc{
+			{
+				name: wn,
+				data: data,
+			},
+		}
+
+	default:
+		return fmt.Errorf("bad path type: %v", pathType)
+	}
+
+	// Only the first one is called in the command line via storing
+	// `wrapperPath` in `r.args` later.
+	wrapperPath := ""
+	for i, w := range wrappers {
+		wp, err := rootRel(r.filepath, w.name, r.gomaReq.GetCwd(), r.tree.RootDir())
 		if err != nil {
 			return err
 		}
 
-	default:
-		return fmt.Errorf("Bad path type: %v", pathType)
+		logger.Infof("wrapper (%d) %s => %v", i, wp, w.data.Digest())
+		r.tree.Set(merkletree.Entry{
+			Name:         wp,
+			Data:         w.data,
+			IsExecutable: true,
+		})
+		if wrapperPath == "" {
+			wrapperPath = wp
+		}
 	}
 
-	wrapperPath, err := rootRel(r.filepath, wrapperName, r.gomaReq.GetCwd(), r.tree.RootDir())
-	if err != nil {
-		return err
-	}
-
-	logger.Infof("wrapper %s => %v", wrapperPath, data.Digest())
-	r.tree.Set(merkletree.Entry{
-		Name:         wrapperPath,
-		Data:         data,
-		IsExecutable: true,
-	})
-
 	r.envs = envs
 
-	// if run.sh exists in cwd, `wrapper` is resolved as run.sh. However,
-	// it cannot be callable. It should be like ./run.sh
-	if wrapperPath == "run.sh" {
-		wrapperPath = "./run.sh"
+	// if a wrapper exists in cwd, `wrapper` does not have a directory name.
+	// It cannot be callable on POSIX because POSIX do not contain "." in
+	// its PATH.  Although "." is included in PATH on Windows, there can be
+	// a risk unexpected scripts with the same name would be called.
+	// Let's avoid the situation with explicitly specifying the directory
+	// name i.e. ".".
+	if r.filepath.Base(wrapperPath) == wrapperPath {
+		// Since Join omit "." and this is only the case Join must not
+		// omit ".", we need to join by ourselves here.
+		wrapperPath = "." + r.filepath.PathSep() + wrapperPath
 	}
 	r.args = append([]string{wrapperPath}, args...)
 	return nil
diff --git a/remoteexec/fake_cluster_for_test.go b/remoteexec/fake_cluster_for_test.go
index 1e8f49e..fa7803e 100644
--- a/remoteexec/fake_cluster_for_test.go
+++ b/remoteexec/fake_cluster_for_test.go
@@ -15,7 +15,7 @@
 	"testing"
 	"time"
 
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 
 	"github.com/golang/protobuf/proto"
 	"google.golang.org/grpc"
diff --git a/remoteexec/fake_rbe_for_test.go b/remoteexec/fake_rbe_for_test.go
index 555f2a7..af95f4a 100644
--- a/remoteexec/fake_rbe_for_test.go
+++ b/remoteexec/fake_rbe_for_test.go
@@ -15,8 +15,8 @@
 	"strings"
 	"sync"
 
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
-	sempb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/semver"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
+	sempb "github.com/bazelbuild/remote-apis/build/bazel/semver"
 
 	"github.com/golang/protobuf/proto"
 	"github.com/golang/protobuf/ptypes"
diff --git a/remoteexec/fake_rbe_test.go b/remoteexec/fake_rbe_test.go
index 1f547c7..325a621 100644
--- a/remoteexec/fake_rbe_test.go
+++ b/remoteexec/fake_rbe_test.go
@@ -15,7 +15,7 @@
 	"testing"
 	"time"
 
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 
 	"github.com/golang/protobuf/proto"
 	"github.com/google/go-cmp/cmp"
diff --git a/remoteexec/gomaoutput.go b/remoteexec/gomaoutput.go
index 81eb070..cd177b9 100644
--- a/remoteexec/gomaoutput.go
+++ b/remoteexec/gomaoutput.go
@@ -12,7 +12,7 @@
 	"io"
 	"os"
 
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 
 	"github.com/golang/protobuf/proto"
 	"go.opencensus.io/trace"
diff --git a/remoteexec/gomaoutput_test.go b/remoteexec/gomaoutput_test.go
index 69a8260..4dc4681 100644
--- a/remoteexec/gomaoutput_test.go
+++ b/remoteexec/gomaoutput_test.go
@@ -9,7 +9,7 @@
 	"path"
 	"testing"
 
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 
 	"github.com/golang/protobuf/proto"
 	"github.com/google/go-cmp/cmp"
diff --git a/remoteexec/inputroot.go b/remoteexec/inputroot.go
index ac72955..1130fc4 100644
--- a/remoteexec/inputroot.go
+++ b/remoteexec/inputroot.go
@@ -28,7 +28,7 @@
 
 func commonDir(filepath clientFilePath, paths []string) string {
 	if len(paths) == 0 {
-		return "/"
+		return ""
 	}
 	path := filepath.SplitElem(paths[0])
 	for _, p := range paths[1:] {
@@ -73,24 +73,59 @@
 	return paths, nil
 }
 
-func inputRootDir(filepath clientFilePath, paths []string) (string, error) {
-	root := commonDir(filepath, paths)
-	err := checkInputRootDir(filepath, root)
-	if err != nil {
-		return "", err
-	}
-	return root, nil
-}
-
-func checkInputRootDir(filepath clientFilePath, dir string) error {
+// validCommonDir takes a path `dir` generated by commonDir() and returns
+// true if it represents a valid common path.
+func validCommonDir(filepath clientFilePath, dir string) bool {
 	if dir == "" {
-		return errors.New("no common paths in inputs")
+		return false
 	}
 	switch filepath.(type) {
 	case posixpath.FilePath:
 		if dir == "/" {
-			return errors.New("no common paths in inputs")
+			return false
 		}
+	case winpath.FilePath:
+		// TODO: check for win path.
+		return true
+
+	default:
+		// unknown filepath?
+		return true
+	}
+
+	return true
+}
+
+// needOverlay returns true if overlayfs is needed to run the task with
+// given common `dir`
+func needOverlay(filepath clientFilePath, dir string) bool {
+	return !validCommonDir(filepath, dir)
+}
+
+// getPathsWithNoCommonDir returns two or more paths from the input paths that
+// don't have a common dir above the root directory. If there is a common dir,
+// then returns an empty array. Does not guarantee any kind of order.
+func getPathsWithNoCommonDir(filepath clientFilePath, paths []string) []string {
+	if len(paths) < 2 {
+		return nil
+	}
+
+	p0 := paths[0]
+	// If there are any pairs of paths in `paths` that have no common directories,
+	// then there should be a mismatch between paths[0] and paths[i] for some i > 0.
+	for _, p1 := range paths[1:] {
+		pair := []string{p0, p1}
+		dir := commonDir(filepath, pair)
+		if !validCommonDir(filepath, dir) {
+			return pair
+		}
+	}
+	return nil
+}
+
+func checkInputRootDir(filepath clientFilePath, dir string) error {
+	switch filepath.(type) {
+	case posixpath.FilePath:
 		// if dir covers these paths, command (e.g. clang) won't
 		// work because required *.so etc would not be accessible.
 		for _, p := range []string{
@@ -114,6 +149,33 @@
 	}
 }
 
+// inputRootDir returns common root of paths.
+// If second return value is true, overlayfs must be used.  It become true only
+// if `allowOverlay` is true and common input root is "/".
+func inputRootDir(filepath clientFilePath, paths []string, allowOverlay bool) (string, bool, error) {
+	root := commonDir(filepath, paths)
+	if needOverlay(filepath, root) && allowOverlay {
+		switch filepath.(type) {
+		// TODO: support non-posix platform
+		case posixpath.FilePath:
+			err := verifyPathsForOverlay(paths)
+			if err != nil {
+				return "", false, err
+			}
+			return "/", true, nil
+		}
+	}
+	if !validCommonDir(filepath, root) {
+		pair := getPathsWithNoCommonDir(filepath, paths)
+		return "", false, fmt.Errorf("no common paths in inputs: %v", pair)
+	}
+	err := checkInputRootDir(filepath, root)
+	if err != nil {
+		return "", false, err
+	}
+	return root, false, nil
+}
+
 var errOutOfRoot = errors.New("out of root")
 
 // rootRel returns relative path from rootDir for fname,
@@ -147,3 +209,42 @@
 	}
 	return relname, nil
 }
+
+// hasPrefixDir returns true if p has prefix as a directory name.
+// Note: it is case sensitive.
+// TODO: support non-posix platforms.
+func hasPrefixDir(p, prefix string) bool {
+	prefix = strings.TrimRight(prefix, "/")
+	if !strings.HasPrefix(p, prefix) {
+		return false
+	}
+	if len(p) == len(prefix) {
+		return true
+	}
+	return p[len(prefix)] == '/'
+}
+
+// verifyPathsForOverlay verifies paths won't overwrite files including libs
+// used by docker or internal work directory.
+// It returns nil for success, and error for failure.
+// TODO: support non-posix platforms.
+func verifyPathsForOverlay(paths []string) error {
+	blacklist := []string{
+		// for docker
+		"/bin",
+		"/sbin",
+		"/lib",
+		"/lib64",
+		"/dev",
+		// for internal work directory.
+		"/workdir",
+	}
+	for _, p := range paths {
+		for _, b := range blacklist {
+			if hasPrefixDir(p, b) {
+				return fmt.Errorf("%s contains blacklisted dir: %s", p, b)
+			}
+		}
+	}
+	return nil
+}
diff --git a/remoteexec/inputroot_test.go b/remoteexec/inputroot_test.go
index c415ba7..9821526 100644
--- a/remoteexec/inputroot_test.go
+++ b/remoteexec/inputroot_test.go
@@ -5,6 +5,7 @@
 package remoteexec
 
 import (
+	"reflect"
 	"testing"
 
 	"github.com/golang/protobuf/proto"
@@ -13,14 +14,90 @@
 	gomapb "go.chromium.org/goma/server/proto/api"
 )
 
+func TestGetPathsWithNoCommonDir(t *testing.T) {
+	for _, tc := range []struct {
+		desc  string
+		paths []string
+		want  []string
+	}{
+		{
+			desc: "empty",
+			// paths: nil,
+			// want:  nil,
+		},
+		{
+			desc:  "single",
+			paths: []string{"/foo"},
+			// want:  nil,
+		},
+		{
+			desc: "has common dir",
+			paths: []string{
+				"/foo/bar1",
+				"/foo/local/bar2",
+				"/foo/bar3",
+			},
+			// want: nil,
+		},
+		{
+			desc: "no common dir #0",
+			paths: []string{
+				"/foo",
+				"/goo/local/baz",
+				"/goo/",
+				"/foo/local/bar2",
+				"/foo/bar3",
+			},
+			want: []string{
+				"/foo",
+				"/goo/local/baz",
+			},
+		},
+		{
+			desc: "no common dir #1",
+			paths: []string{
+				"/foo/local/bar2",
+				"/foo",
+				"/goo/",
+				"/goo/local/baz",
+				"/foo/bar3",
+			},
+			want: []string{
+				"/foo/local/bar2",
+				"/goo/",
+			},
+		},
+		{
+			desc: "no common dir #2",
+			paths: []string{
+				"/goo",
+				"/bar",
+				"/baz/",
+				"/foo",
+			},
+			want: []string{
+				"/goo",
+				"/bar",
+			},
+		},
+	} {
+		got := getPathsWithNoCommonDir(posixpath.FilePath{}, tc.paths)
+		if !reflect.DeepEqual(got, tc.want) {
+			t.Errorf("test case %s: getPathsWithNoCommonDir(paths=%v)=%v; want %v", tc.desc, tc.paths, got, tc.want)
+		}
+	}
+}
+
 func TestInputRootDir(t *testing.T) {
 	for _, tc := range []struct {
-		desc        string
-		req         *gomapb.ExecReq
-		argv0       string
-		want        string
-		wantPathErr bool
-		wantRootErr bool
+		desc         string
+		req          *gomapb.ExecReq
+		argv0        string
+		allowOverlay bool
+		want         string
+		wantOverlay  bool
+		wantPathErr  bool
+		wantRootErr  bool
 	}{
 		{
 			desc: "basic",
@@ -174,6 +251,21 @@
 			argv0:       "../../third_party/llvm-build/Release+Asserts/bin/clang++",
 			wantRootErr: true,
 		},
+		{
+			desc: "wantOverlay for /usr",
+			req: &gomapb.ExecReq{
+				Cwd: proto.String("/home/foo/src/out/Release"),
+				Input: []*gomapb.ExecReq_Input{
+					&gomapb.ExecReq_Input{
+						Filename: proto.String("/usr/include/config.h"),
+					},
+				},
+			},
+			argv0:        "../../third_party/llvm-build/Release+Asserts/bin/clang++",
+			want:         "/",
+			allowOverlay: true,
+			wantOverlay:  true,
+		},
 	} {
 		t.Logf("test case: %s", tc.desc)
 		paths, err := inputPaths(posixpath.FilePath{}, tc.req, tc.argv0)
@@ -186,15 +278,15 @@
 		if err != nil {
 			t.Errorf("inputPaths(req, %q)=%v, %v; want nil error", tc.argv0, paths, err)
 		}
-		got, err := inputRootDir(posixpath.FilePath{}, paths)
+		got, overlay, err := inputRootDir(posixpath.FilePath{}, paths, tc.allowOverlay)
 		if tc.wantRootErr {
 			if err == nil {
-				t.Errorf("inputRootDir(files)=%v, nil; want err", got)
+				t.Errorf("inputRootDir(files)=%v, %t, nil; want err", got, overlay)
 			}
 			continue
 		}
-		if err != nil || got != tc.want {
-			t.Errorf("inputRootDir(files)=%v, %v; want %v, nil", got, err, tc.want)
+		if err != nil || got != tc.want || overlay != tc.wantOverlay {
+			t.Errorf("inputRootDir(files)=%v, %t, %v; want %v, %t, nil", got, overlay, err, tc.want, tc.wantOverlay)
 		}
 	}
 }
@@ -272,3 +364,122 @@
 		}
 	}
 }
+
+func TestHasPrefixDir(t *testing.T) {
+	for _, tc := range []struct {
+		p, prefix string
+		want      bool
+	}{
+		{
+			p:      "/home/foo/bar",
+			prefix: "/home/foo",
+			want:   true,
+		},
+		{
+			p:      "/home/foo",
+			prefix: "/home/foo",
+			want:   true,
+		},
+		{
+			p:      "/home/foo/",
+			prefix: "/home/foo",
+			want:   true,
+		},
+		// hasPrefixDir trim "/" in `prefix`
+		{
+			p:      "/home/foo",
+			prefix: "/home/foo////////////////",
+			want:   true,
+		},
+		{
+			p:      "/foo",
+			prefix: "/bar",
+			want:   false,
+		},
+		{
+			p:      "/foo/bar",
+			prefix: "/bar",
+			want:   false,
+		},
+		{
+			p:      "/foo",
+			prefix: "/bar/baz",
+			want:   false,
+		},
+		{
+			p:      "/foo",
+			prefix: "/foo/bar",
+			want:   false,
+		},
+		{
+			p:      "/home/foobar",
+			prefix: "/home/foo",
+			want:   false,
+		},
+
+		{
+			p:      "home/foo",
+			prefix: "home/foo",
+			want:   true,
+		},
+		{
+			p:      "home/foo/bar",
+			prefix: "home/foo",
+			want:   true,
+		},
+	} {
+		got := hasPrefixDir(tc.p, tc.prefix)
+		if got != tc.want {
+			t.Errorf("hasPrefixDir(%s,%s) = %t; want %t", tc.p, tc.prefix, got, tc.want)
+		}
+	}
+}
+
+func TestVerifyPathsForOverlay(t *testing.T) {
+	for _, tc := range []struct {
+		paths     []string
+		wantError bool
+	}{
+		{
+			paths:     []string{"/home/foo/"},
+			wantError: false,
+		},
+		{
+			paths:     []string{"/bin/sh"},
+			wantError: true,
+		},
+		{
+			paths:     []string{"/sbin/shutdown"},
+			wantError: true,
+		},
+		{
+			paths:     []string{"/lib/libc.so.6"},
+			wantError: true,
+		},
+		{
+			paths:     []string{"/lib64/ld-linux-x86-64.so.2"},
+			wantError: true,
+		},
+		{
+			paths:     []string{"/dev/urandom"},
+			wantError: true,
+		},
+		{
+			paths:     []string{"/workdir"},
+			wantError: true,
+		},
+		// has non-blacklist and blacklist.
+		{
+			paths:     []string{"/home", "/workdir"},
+			wantError: true,
+		},
+	} {
+		err := verifyPathsForOverlay(tc.paths)
+		if err == nil && tc.wantError {
+			t.Errorf("verifyPathsForOverlay(%q) = nil; want error", tc.paths)
+		}
+		if err != nil && !tc.wantError {
+			t.Errorf("verifyPathsForOverlay(%q) = %v; want nil", tc.paths, err)
+		}
+	}
+}
diff --git a/remoteexec/merkletree/merkletree.go b/remoteexec/merkletree/merkletree.go
index 3911715..773ef6d 100644
--- a/remoteexec/merkletree/merkletree.go
+++ b/remoteexec/merkletree/merkletree.go
@@ -18,7 +18,7 @@
 	"go.chromium.org/goma/server/log"
 	"go.chromium.org/goma/server/remoteexec/digest"
 
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 )
 
 // MerkleTree represents a merkle tree.
diff --git a/remoteexec/merkletree/merkletree_test.go b/remoteexec/merkletree/merkletree_test.go
index 50b42df..0dde61a 100644
--- a/remoteexec/merkletree/merkletree_test.go
+++ b/remoteexec/merkletree/merkletree_test.go
@@ -12,7 +12,7 @@
 	"strings"
 	"testing"
 
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 
 	"github.com/golang/protobuf/proto"
 
