Work in progress - initial skeleton of gopackagesdriver (#2173)

* reads a driverRequest on stdin and writes a driverResponse
* invokes bazel with given command line arguments and build flags.
* requests an output group and aspect (but neither exist yet)
* parses bazel's build event binary proto file to find where outputs
  are written for each target.
diff --git a/go/tools/gopackagesdriver/BUILD.bazel b/go/tools/gopackagesdriver/BUILD.bazel
new file mode 100644
index 0000000..1efe6fd
--- /dev/null
+++ b/go/tools/gopackagesdriver/BUILD.bazel
@@ -0,0 +1,12 @@
+load("@io_bazel_rules_go//go:def.bzl", "go_binary")
+
+go_binary(
+    name = "gopackagesdriver",
+    srcs = ["gopackagesdriver.go"],
+    visibility = ["//visibility:public"],
+    deps = [
+        "//go/tools/gopackagesdriver/proto/build_event_stream:go_default_library",
+        "@com_github_golang_protobuf//proto:go_default_library",
+        "@org_golang_x_tools//go/packages:go_default_library",
+    ],
+)
diff --git a/go/tools/gopackagesdriver/gopackagesdriver.go b/go/tools/gopackagesdriver/gopackagesdriver.go
new file mode 100644
index 0000000..bd4d03b
--- /dev/null
+++ b/go/tools/gopackagesdriver/gopackagesdriver.go
@@ -0,0 +1,241 @@
+// Copyright 2019 The Bazel Authors. All rights reserved.
+//
+// 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.
+
+// gopackagesdriver collects metadata, syntax, and type information for
+// Go packages built with bazel. It implements the driver interface for
+// golang.org/x/tools/go/packages. When gopackagesdriver is installed
+// in PATH, tools like gopls written with golang.org/x/tools/go/packages,
+// work in bazel workspaces.
+package main
+
+import (
+	"encoding/json"
+	"errors"
+	"flag"
+	"fmt"
+	"go/types"
+	"io/ioutil"
+	"log"
+	"os"
+	"os/exec"
+	"sort"
+
+	bespb "github.com/bazelbuild/rules_go/go/tools/gopackagesdriver/proto/build_event_stream"
+	"github.com/golang/protobuf/proto"
+	"golang.org/x/tools/go/packages"
+)
+
+func main() {
+	log.SetPrefix("gopackagesdriver: ")
+	log.SetFlags(0)
+	if err := run(os.Args[1:]); err != nil {
+		log.Fatal(err)
+	}
+}
+
+// driverRequest is a JSON object sent by golang.org/x/tools/go/packages
+// on stdin. Keep in sync.
+type driverRequest struct {
+	Command    string            `json:"command"`
+	Mode       packages.LoadMode `json:"mode"`
+	Env        []string          `json:"env"`
+	BuildFlags []string          `json:"build_flags"`
+	Tests      bool              `json:"tests"`
+	Overlay    map[string][]byte `json:"overlay"`
+}
+
+// driverResponse is a JSON object sent by this program to
+// golang.org/x/tools/go/packages on stdout. Keep in sync.
+type driverResponse struct {
+	// Sizes, if not nil, is the types.Sizes to use when type checking.
+	Sizes *types.StdSizes
+
+	// Roots is the set of package IDs that make up the root packages.
+	// We have to encode this separately because when we encode a single package
+	// we cannot know if it is one of the roots as that requires knowledge of the
+	// graph it is part of.
+	Roots []string `json:",omitempty"`
+
+	// Packages is the full set of packages in the graph.
+	// The packages are not connected into a graph.
+	// The Imports if populated will be stubs that only have their ID set.
+	// Imports will be connected and then type and syntax information added in a
+	// later pass (see refine).
+	Packages []*packages.Package
+}
+
+func run(args []string) error {
+	// Parse command line arguments and driver request sent on stdin.
+	fs := flag.NewFlagSet("gopackagesdriver", flag.ExitOnError)
+	if err := fs.Parse(args); err != nil {
+		return err
+	}
+	targets := fs.Args()
+	if len(targets) == 0 {
+		return errors.New("no targets specified")
+	}
+
+	reqData, err := ioutil.ReadAll(os.Stdin)
+	if err != nil {
+		return err
+	}
+	var req driverRequest
+	if err := json.Unmarshal(reqData, &req); err != nil {
+		return fmt.Errorf("could not unmarshal driver request: %v", err)
+	}
+
+	// Build package data files using bazel. We use one of several aspects
+	// (depending on what mode we're in). The aspect produces .json and source
+	// files in an output group. Each .json file contains a serialized
+	// *packages.Package object.
+	outputGroup := "gopackagesdriver_data"
+	aspect := "gopackagesdriver_todo"
+
+	// We ask bazel to write build event protos to a binary file, which
+	// we read to find the output files.
+	eventFile, err := ioutil.TempFile("", "gopackagesdriver-bazel-bep-*.bin")
+	if err != nil {
+		return err
+	}
+	eventFileName := eventFile.Name()
+	defer func() {
+		if eventFile != nil {
+			eventFile.Close()
+		}
+		os.Remove(eventFileName)
+	}()
+
+	cmd := exec.Command("bazel", "build")
+	cmd.Args = append(cmd.Args, "--aspects="+aspect)
+	cmd.Args = append(cmd.Args, "--output_groups="+outputGroup)
+	cmd.Args = append(cmd.Args, "--build_event_binary_file="+eventFile.Name())
+	cmd.Args = append(cmd.Args, req.BuildFlags...)
+	cmd.Args = append(cmd.Args, "--")
+	for _, target := range targets {
+		cmd.Args = append(cmd.Args, target)
+	}
+	cmd.Stdout = os.Stderr // sic
+	cmd.Stderr = os.Stderr
+	if err := cmd.Run(); err != nil {
+		return fmt.Errorf("error running bazel: %v", err)
+	}
+
+	eventData, err := ioutil.ReadAll(eventFile)
+	if err != nil {
+		return fmt.Errorf("could not read bazel build event file: %v", err)
+	}
+	eventFile.Close()
+
+	var rootSets []string
+	setToFiles := make(map[string][]string)
+	setToSets := make(map[string][]string)
+	pbuf := proto.NewBuffer(eventData)
+	var event bespb.BuildEvent
+	for !event.GetLastMessage() {
+		if err := pbuf.DecodeMessage(&event); err != nil {
+			return err
+		}
+
+		if id := event.GetId().GetTargetCompleted(); id != nil {
+			completed := event.GetCompleted()
+			if !completed.GetSuccess() {
+				return fmt.Errorf("%s: target did not build successfully", id.GetLabel())
+			}
+			for _, g := range completed.GetOutputGroup() {
+				for _, s := range g.GetFileSets() {
+					if setId := s.GetId(); setId != "" {
+						rootSets = append(rootSets, setId)
+					}
+				}
+			}
+		}
+
+		if id := event.GetId().GetNamedSet(); id != nil {
+			files := event.GetNamedSetOfFiles().GetFiles()
+			fileNames := make([]string, len(files))
+			for i, f := range files {
+				fileNames[i] = f.GetName()
+			}
+			setToFiles[id.GetId()] = fileNames
+			sets := event.GetNamedSetOfFiles().GetFileSets()
+			setIds := make([]string, len(sets))
+			for i, s := range sets {
+				setIds[i] = s.GetId()
+			}
+			setToSets[id.GetId()] = setIds
+			continue
+		}
+	}
+
+	var visit func(string, map[string]bool, map[string]bool)
+	visit = func(setId string, files map[string]bool, visited map[string]bool) {
+		if visited[setId] {
+			return
+		}
+		visited[setId] = true
+		for _, f := range setToFiles[setId] {
+			files[f] = true
+		}
+		for _, s := range setToSets[setId] {
+			visit(s, files, visited)
+		}
+	}
+
+	files := make(map[string]bool)
+	for _, s := range rootSets {
+		visit(s, files, map[string]bool{})
+	}
+	sortedFiles := make([]string, 0, len(files))
+	for f := range files {
+		sortedFiles = append(sortedFiles, f)
+	}
+	sort.Strings(sortedFiles)
+
+	// Load data files referenced on the command line.
+	pkgs := make(map[string]*packages.Package)
+	roots := make(map[string]bool)
+	for _, target := range targets {
+		panic(fmt.Sprintf("json processing not implemented: %s", target))
+	}
+
+	sortedRoots := make([]string, 0, len(roots))
+	for root := range roots {
+		sortedRoots = append(sortedRoots, root)
+	}
+	sort.Strings(sortedRoots)
+
+	sortedPkgs := make([]*packages.Package, 0, len(pkgs))
+	for _, pkg := range pkgs {
+		sortedPkgs = append(sortedPkgs, pkg)
+	}
+	sort.Slice(sortedPkgs, func(i, j int) bool {
+		return sortedPkgs[i].ID < sortedPkgs[j].ID
+	})
+
+	resp := driverResponse{
+		Sizes:    nil, // TODO
+		Roots:    sortedRoots,
+		Packages: sortedPkgs,
+	}
+	respData, err := json.Marshal(resp)
+	if err != nil {
+		return fmt.Errorf("could not marshal driver response: %v", err)
+	}
+	_, err = os.Stdout.Write(respData)
+	if err != nil {
+		return err
+	}
+
+	return errors.New("not implemented")
+}
diff --git a/go/tools/gopackagesdriver/proto/build_event_stream.proto b/go/tools/gopackagesdriver/proto/build_event_stream.proto
new file mode 100644
index 0000000..5941665
--- /dev/null
+++ b/go/tools/gopackagesdriver/proto/build_event_stream.proto
@@ -0,0 +1,699 @@
+// Copyright 2016 The Bazel Authors. All rights reserved.
+//
+// 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_event_stream;
+
+option java_package = "com.google.devtools.build.lib.buildeventstream";
+option java_outer_classname = "BuildEventStreamProtos";
+
+import "src/main/protobuf/invocation_policy.proto";
+import "src/main/protobuf/command_line.proto";
+
+// Identifier for a build event. It is deliberately structured to also provide
+// information about which build target etc the event is related to.
+//
+// Events are chained via the event id as follows: each event has an id and a
+// set of ids of children events such that apart from the initial event each
+// event has an id that is mentioned as child id in an earlier event and a build
+// invocation is complete if and only if all direct and indirect children of the
+// initial event have been posted.
+message BuildEventId {
+  // Generic identifier for a build event. This is the default type of
+  // BuildEventId, but should not be used outside testing; nevertheless,
+  // tools should handle build events with this kind of id gracefully.
+  message UnknownBuildEventId {
+    string details = 1;
+  }
+
+  // Identifier of an event reporting progress. Those events are also used to
+  // chain in events that come early.
+  message ProgressId {
+    // Unique identifier. No assumption should be made about how the ids are
+    // assigned; the only meaningful operation on this field is test for
+    // equality.
+    int32 opaque_count = 1;
+  }
+
+  // Identifier of an event indicating the beginning of a build; this will
+  // normally be the first event.
+  message BuildStartedId {
+  }
+
+  // Identifier on an event indicating the original commandline received by
+  // the bazel server.
+  message UnstructuredCommandLineId {
+  }
+
+  // Identifier on an event describing the commandline received by Bazel.
+  message StructuredCommandLineId {
+    // A title for this command line value, as there may be multiple.
+    // For example, a single invocation may wish to report both the literal and
+    // canonical command lines, and this label would be used to differentiate
+    // between both versions.
+    string command_line_label = 1;
+  }
+
+  // Identifier of an event indicating the workspace status.
+  message WorkspaceStatusId {
+  }
+
+  // Identifier on an event reporting on the options included in the command
+  // line, both explicitly and implicitly.
+  message OptionsParsedId {
+  }
+
+  // Identifier of an event reporting that an external resource was fetched
+  // from.
+  message FetchId {
+    // The external resource that was fetched from.
+    string url = 1;
+  }
+
+  // Identifier of an event indicating that a target pattern has been expanded
+  // further.
+  // Messages of this shape are also used to describe parts of a pattern that
+  // have been skipped for some reason, if the actual expansion was still
+  // carried out (e.g., if keep_going is set). In this case, the
+  // pattern_skipped choice in the id field is to be made.
+  message PatternExpandedId {
+    repeated string pattern = 1;
+  }
+
+  // Identifier of an event indicating that a target has been expanded by
+  // identifying for which configurations it should be build.
+  message TargetConfiguredId {
+    string label = 1;
+
+    // If not empty, the id refers to the expansion of the target for a given
+    // aspect.
+    string aspect = 2;
+  }
+
+  // Identifier of an event introducing a named set of files (usually artifacts)
+  // to be referred to in later messages.
+  message NamedSetOfFilesId {
+    // Identifier of the file set; this is an opaque string valid only for the
+    // particular instance of the event stream.
+    string id = 1;
+  }
+
+  // Identifier of an event introducing a configuration.
+  message ConfigurationId {
+    // Identifier of the configuration; users of the protocol should not make
+    // any assumptions about it having any structure, or equality of the
+    // identifier between different streams.
+    string id = 1;
+  }
+
+  // Identifier of an event indicating that a target was built completely; this
+  // does not include running the test if the target is a test target.
+  message TargetCompletedId {
+    string label = 1;
+
+    // The configuration for which the target was built.
+    ConfigurationId configuration = 3;
+
+    // If not empty, the id refers to the completion of the target for a given
+    // aspect.
+    string aspect = 2;
+  }
+
+  // Identifier of an event reporting that an action was completed (not all
+  // actions are reported, only the ones that can be considered important;
+  // this includes all failed actions).
+  message ActionCompletedId {
+    string primary_output = 1;
+    // Optional, the label of the owner of the action, for reference.
+    string label = 2;
+    // Optional, the id of the configuration of the action owner.
+    ConfigurationId configuration = 3;
+  }
+
+  // Identifier of an event reporting an event associated with an unconfigured
+  // label. Usually, this indicates a failure due to a missing input file. In
+  // any case, it will report some form of error (i.e., the payload will be an
+  // Aborted event); there are no regular events using this identifier. The
+  // purpose of those events is to serve as the root cause of a failed target.
+  message UnconfiguredLabelId {
+    string label = 1;
+  }
+
+  // Identifier of an event reporting an event associated with a configured
+  // label, usually a visibility error. In any case, an event with such an
+  // id will always report some form of error (i.e., the payload will be an
+  // Aborted event); there are no regular events using this identifier.
+  message ConfiguredLabelId {
+    string label = 1;
+    ConfigurationId configuration = 2;
+  }
+
+  // Identifier of an event reporting on an individual test run. The label
+  // identifies the test that is reported about, the remaining fields are
+  // in such a way as to uniquely identify the action within a build. In fact,
+  // attempts for the same test, run, shard triple are counted sequentially,
+  // starting with 1.
+  message TestResultId {
+    string label = 1;
+    ConfigurationId configuration = 5;
+    int32 run = 2;
+    int32 shard = 3;
+    int32 attempt = 4;
+  }
+
+  // Identifier of an event reporting the summary of a test.
+  message TestSummaryId {
+    string label = 1;
+    ConfigurationId configuration = 2;
+  }
+
+  // Identifier of the BuildFinished event, indicating the end of a build.
+  message BuildFinishedId {
+  }
+
+  // Identifier of an event providing additional logs/statistics after
+  // completion of the build.
+  message BuildToolLogsId {
+  }
+
+  // Identifier of an event providing build metrics after completion
+  // of the build.
+  message BuildMetricsId {
+  }
+
+  oneof id {
+    UnknownBuildEventId unknown = 1;
+    ProgressId progress = 2;
+    BuildStartedId started = 3;
+    UnstructuredCommandLineId unstructured_command_line = 11;
+    StructuredCommandLineId structured_command_line = 18;
+    WorkspaceStatusId workspace_status = 14;
+    OptionsParsedId options_parsed = 12;
+    FetchId fetch = 17;
+    ConfigurationId configuration = 15;
+    TargetConfiguredId target_configured = 16;
+    PatternExpandedId pattern = 4;
+    PatternExpandedId pattern_skipped = 10;
+    NamedSetOfFilesId named_set = 13;
+    TargetCompletedId target_completed = 5;
+    ActionCompletedId action_completed = 6;
+    UnconfiguredLabelId unconfigured_label = 19;
+    ConfiguredLabelId configured_label = 21;
+    TestResultId test_result = 8;
+    TestSummaryId test_summary = 7;
+    BuildFinishedId build_finished = 9;
+    BuildToolLogsId build_tool_logs = 20;
+    BuildMetricsId build_metrics = 22;
+  }
+}
+
+// Payload of an event summarizing the progress of the build so far. Those
+// events are also used to be parents of events where the more logical parent
+// event cannot be posted yet as the needed information is not yet complete.
+message Progress {
+  // The next chunk of stdout that bazel produced since the last progress event
+  // or the beginning of the build.
+  string stdout = 1;
+
+  // The next chunk of stderr that bazel produced since the last progress event
+  // or the beginning of the build.
+  string stderr = 2;
+}
+
+// Payload of an event indicating that an expected event will not come, as
+// the build is aborted prematurely for some reason.
+message Aborted {
+  enum AbortReason {
+    UNKNOWN = 0;
+
+    // The user requested the build to be aborted (e.g., by hitting Ctl-C).
+    USER_INTERRUPTED = 1;
+
+    // The user requested that no analysis be performed.
+    NO_ANALYZE = 8;
+
+    // The user requested that no build be carried out.
+    NO_BUILD = 9;
+
+    // The build or target was aborted as a timeout was exceeded.
+    TIME_OUT = 2;
+
+    // The build or target was aborted as some remote environment (e.g., for
+    // remote execution of actions) was not available in the expected way.
+    REMOTE_ENVIRONMENT_FAILURE = 3;
+
+    // Failure due to reasons entirely internal to the build tool, e.g.,
+    // running out of memory.
+    INTERNAL = 4;
+
+    // A Failure occurred in the loading phase of a target.
+    LOADING_FAILURE = 5;
+
+    // A Failure occurred in the analysis phase of a target.
+    ANALYSIS_FAILURE = 6;
+
+    // Target build was skipped (e.g. due to incompatible CPU constraints).
+    SKIPPED = 7;
+  }
+  AbortReason reason = 1;
+
+  // A human readable description with more details about there reason, where
+  // available and useful.
+  string description = 2;
+}
+
+// Payload of an event indicating the beginning of a new build. Usually, events
+// of those type start a new build-event stream. The target pattern requested
+// to be build is contained in one of the announced child events; it is an
+// invariant that precisely one of the announced child events has a non-empty
+// target pattern.
+message BuildStarted {
+  string uuid = 1;
+
+  // Start of the build in ms since the epoch.
+  // TODO(buchgr): Use google.protobuf.TimeStamp once bazel's protoc supports
+  // it.
+  int64 start_time_millis = 2;
+
+  // Version of the build tool that is running.
+  string build_tool_version = 3;
+
+  // A human-readable description of all the non-default option settings
+  string options_description = 4;
+
+  // The name of the command that the user invoked.
+  string command = 5;
+
+  // The working directory from which the build tool was invoked.
+  string working_directory = 6;
+
+  // The directory of the workspace.
+  string workspace_directory = 7;
+
+  // The process ID of the Bazel server.
+  int64 server_pid = 8;
+}
+
+// Payload of an event reporting the command-line of the invocation as
+// originally received by the server. Note that this is not the command-line
+// given by the user, as the client adds information about the invocation,
+// like name and relevant entries of rc-files and client environment variables.
+// However, it does contain enough information to reproduce the build
+// invocation.
+message UnstructuredCommandLine {
+  repeated string args = 1;
+}
+
+// Payload of an event reporting on the parsed options, grouped in various ways.
+message OptionsParsed {
+  repeated string startup_options = 1;
+  repeated string explicit_startup_options = 2;
+  repeated string cmd_line = 3;
+  repeated string explicit_cmd_line = 4;
+  blaze.invocation_policy.InvocationPolicy invocation_policy = 5;
+  string tool_tag = 6;
+}
+
+// Payload of an event indicating that an external resource was fetched. This
+// event will only occur in streams where an actual fetch happened, not in ones
+// where a cached copy of the entity to be fetched was used.
+message Fetch {
+  bool success = 1;
+}
+
+// Payload of an event reporting the workspace status. Key-value pairs can be
+// provided by specifying the workspace_status_command to an executable that
+// returns one key-value pair per line of output (key and value separated by a
+// space).
+message WorkspaceStatus {
+  message Item {
+    string key = 1;
+    string value = 2;
+  }
+  repeated Item item = 1;
+}
+
+// Payload of an event reporting details of a given configuration.
+message Configuration {
+  string mnemonic = 1;
+  string platform_name = 2;
+  string cpu = 3;
+  map<string, string> make_variable = 4;
+}
+
+// Payload of the event indicating the expansion of a target pattern.
+// The main information is in the chaining part: the id will contain the
+// target pattern that was expanded and the children id will contain the
+// target or target pattern it was expanded to.
+message PatternExpanded {
+}
+
+// Enumeration type characterizing the size of a test, as specified by the
+// test rule.
+enum TestSize {
+  UNKNOWN = 0;
+  SMALL = 1;
+  MEDIUM = 2;
+  LARGE = 3;
+  ENORMOUS = 4;
+}
+
+// Payload of the event indicating that the configurations for a target have
+// been identified. As with pattern expansion the main information is in the
+// chaining part: the id will contain the target that was configured and the
+// children id will contain the configured targets it was configured to.
+message TargetConfigured {
+  // The kind of target (e.g.,  e.g. "cc_library rule", "source file",
+  // "generated file") where the completion is reported.
+  string target_kind = 1;
+
+  // The size of the test, if the target is a test target. Unset otherwise.
+  TestSize test_size = 2;
+
+  // List of all tags associated with this target (for all possible
+  // configurations).
+  repeated string tag = 3;
+}
+
+message File {
+  // identifier indicating the nature of the file (e.g., "stdout", "stderr")
+  string name = 1;
+
+  oneof file {
+    // A location where the contents of the file can be found. The string is
+    // encoded according to RFC2396.
+    string uri = 2;
+    // The contents of the file, if they are guaranteed to be short.
+    bytes contents = 3;
+  }
+}
+
+// Payload of a message to describe a set of files, usually build artifacts, to
+// be referred to later by their name. In this way, files that occur identically
+// as outputs of several targets have to be named only once.
+message NamedSetOfFiles {
+  // Files that belong to this named set of files.
+  repeated File files = 1;
+
+  // Other named sets whose members also belong to this set.
+  repeated BuildEventId.NamedSetOfFilesId file_sets = 2;
+}
+
+// Payload of the event indicating the completion of an action. The main purpose
+// of posting those events is to provide details on the root cause for a target
+// failing; however, consumers of the build-event protocol must not assume
+// that only failed actions are posted.
+message ActionExecuted {
+  bool success = 1;
+
+  // The mnemonic of the action that was executed
+  string type = 8;
+
+  // The exit code of the action, if it is available.
+  int32 exit_code = 2;
+
+  // Location where to find the standard output of the action
+  // (e.g., a file path).
+  File stdout = 3;
+
+  // Location where to find the standard error of the action
+  // (e.g., a file path).
+  File stderr = 4;
+
+  // Deprecated. This field is now present on ActionCompletedId.
+  string label = 5 [deprecated = true];
+
+  // Deprecated. This field is now present on ActionCompletedId.
+  BuildEventId.ConfigurationId configuration = 7 [deprecated = true];
+
+  // Primary output; only provided for successful actions.
+  File primary_output = 6;
+
+  // The command-line of the action, if the action is a command.
+  repeated string command_line = 9;
+}
+
+// Collection of all output files belonging to that output group.
+message OutputGroup {
+  // Ids of fields that have been removed.
+  reserved 2;
+
+  // Name of the output group
+  string name = 1;
+
+  // List of file sets that belong to this output group as well.
+  repeated BuildEventId.NamedSetOfFilesId file_sets = 3;
+}
+
+// Payload of the event indicating the completion of a target. The target is
+// specified in the id. If the target failed the root causes are provided as
+// children events.
+message TargetComplete {
+  bool success = 1;
+
+  // The kind of target (e.g.,  e.g. "cc_library rule", "source file",
+  // "generated file") where the completion is reported.
+  // Deprecated: use the target_kind field in TargetConfigured instead.
+  string target_kind = 5 [deprecated = true];
+
+  // The size of the test, if the target is a test target. Unset otherwise.
+  // Deprecated: use the test_size field in TargetConfigured instead.
+  TestSize test_size = 6 [deprecated = true];
+
+  // The output files are arranged by their output group. If an output file
+  // is part of multiple output groups, it appears once in each output
+  // group.
+  repeated OutputGroup output_group = 2;
+
+  // Temporarily, also report the important outputs directly. This is only to
+  // allow existing clients help transition to the deduplicated representation;
+  // new clients should not use it.
+  repeated File important_output = 4 [deprecated = true];
+
+  // List of tags associated with this configured target.
+  repeated string tag = 3;
+
+  // The timeout specified for test actions under this configured target.
+  int64 test_timeout_seconds = 7;
+}
+
+enum TestStatus {
+  NO_STATUS = 0;
+  PASSED = 1;
+  FLAKY = 2;
+  TIMEOUT = 3;
+  FAILED = 4;
+  INCOMPLETE = 5;
+  REMOTE_FAILURE = 6;
+  FAILED_TO_BUILD = 7;
+  TOOL_HALTED_BEFORE_TESTING = 8;
+};
+
+// Payload on events reporting about individual test action.
+message TestResult {
+  reserved 1;
+
+  // The status of this test.
+  TestStatus status = 5;
+
+  // Additional details about the status of the test. This is intended for
+  // user display and must not be parsed.
+  string status_details = 9;
+
+  // True, if the reported attempt is taken from the tool's local cache.
+  bool cached_locally = 4;
+
+  // Time in milliseconds since the epoch at which the test attempt was started.
+  // Note: for cached test results, this is time can be before the start of the
+  // build.
+  int64 test_attempt_start_millis_epoch = 6;
+
+  // Time the test took to run. For locally cached results, this is the time
+  // the cached invocation took when it was invoked.
+  int64 test_attempt_duration_millis = 3;
+
+  // Files (logs, test.xml, undeclared outputs, etc) generated by that test
+  // action.
+  repeated File test_action_output = 2;
+
+  // Warnings generated by that test action.
+  repeated string warning = 7;
+
+  // Message providing optional meta data on the execution of the test action,
+  // if available.
+  message ExecutionInfo {
+    // Deprecated, use TargetComplete.test_timeout_seconds instead.
+    int32 timeout_seconds = 1 [deprecated = true];
+
+    // Name of the strategy to execute this test action (e.g., "local",
+    // "remote")
+    string strategy = 2;
+
+    // True, if the reported attempt was a cache hit in a remote cache.
+    bool cached_remotely = 6;
+
+    // The exit code of the test action.
+    int32 exit_code = 7;
+
+    // The hostname of the machine where the test action was executed (in case
+    // of remote execution), if known.
+    string hostname = 3;
+
+    // Represents a hierarchical timing breakdown of an activity.
+    // The top level time should be the total time of the activity.
+    // Invariant: time_millis >= sum of time_millis of all direct children.
+    message TimingBreakdown {
+      repeated TimingBreakdown child = 1;
+      string name = 2;
+      int64 time_millis = 3;
+    }
+    TimingBreakdown timing_breakdown = 4;
+
+    message ResourceUsage {
+      string name = 1;
+      int64 value = 2;
+    }
+    repeated ResourceUsage resource_usage = 5;
+  }
+  ExecutionInfo execution_info = 8;
+}
+
+// Payload of the event summarizing a test.
+// TODO(aehlig): extend event with additional information as soon as we known
+// which additional information we need for test summaries.
+message TestSummary {
+  // Wrapper around BlazeTestStatus to support importing that enum to proto3.
+  // Overall status of test, accumulated over all runs, shards, and attempts.
+  TestStatus overall_status = 5;
+
+  // Total number of runs
+  int32 total_run_count = 1;
+
+  // Path to logs of passed runs.
+  repeated File passed = 3;
+
+  // Path to logs of failed runs;
+  repeated File failed = 4;
+
+  // Total number of cached test actions
+  int32 total_num_cached = 6;
+}
+
+// Event indicating the end of a build.
+message BuildFinished {
+  // Exit code of a build. The possible values correspond to the predefined
+  // codes in bazel's lib.ExitCode class, as well as any custom exit code a
+  // module might define. The predefined exit codes are subject to change (but
+  // rarely do) and are not part of the public API.
+  //
+  // A build was successful iff ExitCode.code equals 0.
+  message ExitCode {
+    // The name of the exit code.
+    string name = 1;
+
+    // The exit code.
+    int32 code = 2;
+  }
+
+  // If the build succeeded or failed.
+  bool overall_success = 1 [deprecated = true];
+
+  // The overall status of the build. A build was successful iff
+  // ExitCode.code equals 0.
+  ExitCode exit_code = 3;
+
+  // Time in milliseconds since the epoch.
+  // TODO(buchgr): Use google.protobuf.Timestamp once bazel's protoc supports
+  // it.
+  int64 finish_time_millis = 2;
+}
+
+message BuildMetrics {
+  message ActionSummary {
+    // The total number of actions created and registered during the build.
+    // This includes unused actions that were constructed but
+    // not executed during this build.
+    int64 actions_created = 1;
+
+    // The total number of actions executed during the build.
+    // This includes any remote cache hits, but excludes
+    // local action cache hits.
+    int64 actions_executed = 2;
+  }
+  ActionSummary action_summary = 1;
+
+  message MemoryMetrics {
+    // Size of the JVM heap post build in bytes. This is only collected if
+    // --bep_publish_used_heap_size_post_build is set,
+    // since it forces a full GC.
+    int64 used_heap_size_post_build = 1;
+  }
+  MemoryMetrics memory_metrics = 2;
+
+  message TargetMetrics {
+    // Number of targets loaded during this build.
+    int64 targets_loaded = 1;
+
+    // Number of targets configured during this build. This can
+    // be greater than targets_loaded if the same target is configured
+    // multiple times.
+    int64 targets_configured = 2;
+  }
+  TargetMetrics target_metrics = 3;
+
+  message PackageMetrics {
+    // Number of BUILD files (aka packages) loaded during this build.
+    int64 packages_loaded = 1;
+  }
+  PackageMetrics package_metrics = 4;
+}
+
+// Event providing additional statistics/logs after completion of the build.
+message BuildToolLogs {
+  repeated File log = 1;
+}
+
+// Message describing a build event. Events will have an identifier that
+// is unique within a given build invocation; they also announce follow-up
+// events as children. More details, which are specific to the kind of event
+// that is observed, is provided in the payload. More options for the payload
+// might be added in the future.
+message BuildEvent {
+  reserved 11, 19;
+  BuildEventId id = 1;
+  repeated BuildEventId children = 2;
+  bool last_message = 20;
+  oneof payload {
+    Progress progress = 3;
+    Aborted aborted = 4;
+    BuildStarted started = 5;
+    UnstructuredCommandLine unstructured_command_line = 12;
+    command_line.CommandLine structured_command_line = 22;
+    OptionsParsed options_parsed = 13;
+    WorkspaceStatus workspace_status = 16;
+    Fetch fetch = 21;
+    Configuration configuration = 17;
+    PatternExpanded expanded = 6;
+    TargetConfigured configured = 18;
+    ActionExecuted action = 7;
+    NamedSetOfFiles named_set_of_files = 15;
+    TargetComplete completed = 8;
+    TestResult test_result = 10;
+    TestSummary test_summary = 9;
+    BuildFinished finished = 14;
+    BuildToolLogs build_tool_logs = 23;
+    BuildMetrics build_metrics = 24;
+  };
+}
diff --git a/go/tools/gopackagesdriver/proto/build_event_stream/BUILD.bazel b/go/tools/gopackagesdriver/proto/build_event_stream/BUILD.bazel
new file mode 100644
index 0000000..633ca78
--- /dev/null
+++ b/go/tools/gopackagesdriver/proto/build_event_stream/BUILD.bazel
@@ -0,0 +1,13 @@
+load("@io_bazel_rules_go//go:def.bzl", "go_library")
+
+go_library(
+    name = "go_default_library",
+    srcs = ["build_event_stream.pb.go"],
+    importpath = "github.com/bazelbuild/rules_go/go/tools/gopackagesdriver/proto/build_event_stream",
+    visibility = ["//visibility:public"],
+    deps = [
+        "//go/tools/gopackagesdriver/proto/command_line:go_default_library",
+        "//go/tools/gopackagesdriver/proto/invocation_policy:go_default_library",
+        "@com_github_golang_protobuf//proto:go_default_library",
+    ],
+)
diff --git a/go/tools/gopackagesdriver/proto/build_event_stream/build_event_stream.pb.go b/go/tools/gopackagesdriver/proto/build_event_stream/build_event_stream.pb.go
new file mode 100644
index 0000000..8ad7ba5
--- /dev/null
+++ b/go/tools/gopackagesdriver/proto/build_event_stream/build_event_stream.pb.go
@@ -0,0 +1,3971 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: build_event_stream.proto
+
+package build_event_stream
+
+import (
+	fmt "fmt"
+	command_line "github.com/bazelbuild/rules_go/go/tools/gopackagesdriver/proto/command_line"
+	invocation_policy "github.com/bazelbuild/rules_go/go/tools/gopackagesdriver/proto/invocation_policy"
+	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
+
+// Enumeration type characterizing the size of a test, as specified by the
+// test rule.
+type TestSize int32
+
+const (
+	TestSize_UNKNOWN  TestSize = 0
+	TestSize_SMALL    TestSize = 1
+	TestSize_MEDIUM   TestSize = 2
+	TestSize_LARGE    TestSize = 3
+	TestSize_ENORMOUS TestSize = 4
+)
+
+var TestSize_name = map[int32]string{
+	0: "UNKNOWN",
+	1: "SMALL",
+	2: "MEDIUM",
+	3: "LARGE",
+	4: "ENORMOUS",
+}
+
+var TestSize_value = map[string]int32{
+	"UNKNOWN":  0,
+	"SMALL":    1,
+	"MEDIUM":   2,
+	"LARGE":    3,
+	"ENORMOUS": 4,
+}
+
+func (x TestSize) String() string {
+	return proto.EnumName(TestSize_name, int32(x))
+}
+
+func (TestSize) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{0}
+}
+
+type TestStatus int32
+
+const (
+	TestStatus_NO_STATUS                  TestStatus = 0
+	TestStatus_PASSED                     TestStatus = 1
+	TestStatus_FLAKY                      TestStatus = 2
+	TestStatus_TIMEOUT                    TestStatus = 3
+	TestStatus_FAILED                     TestStatus = 4
+	TestStatus_INCOMPLETE                 TestStatus = 5
+	TestStatus_REMOTE_FAILURE             TestStatus = 6
+	TestStatus_FAILED_TO_BUILD            TestStatus = 7
+	TestStatus_TOOL_HALTED_BEFORE_TESTING TestStatus = 8
+)
+
+var TestStatus_name = map[int32]string{
+	0: "NO_STATUS",
+	1: "PASSED",
+	2: "FLAKY",
+	3: "TIMEOUT",
+	4: "FAILED",
+	5: "INCOMPLETE",
+	6: "REMOTE_FAILURE",
+	7: "FAILED_TO_BUILD",
+	8: "TOOL_HALTED_BEFORE_TESTING",
+}
+
+var TestStatus_value = map[string]int32{
+	"NO_STATUS":                  0,
+	"PASSED":                     1,
+	"FLAKY":                      2,
+	"TIMEOUT":                    3,
+	"FAILED":                     4,
+	"INCOMPLETE":                 5,
+	"REMOTE_FAILURE":             6,
+	"FAILED_TO_BUILD":            7,
+	"TOOL_HALTED_BEFORE_TESTING": 8,
+}
+
+func (x TestStatus) String() string {
+	return proto.EnumName(TestStatus_name, int32(x))
+}
+
+func (TestStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{1}
+}
+
+type Aborted_AbortReason int32
+
+const (
+	Aborted_UNKNOWN Aborted_AbortReason = 0
+	// The user requested the build to be aborted (e.g., by hitting Ctl-C).
+	Aborted_USER_INTERRUPTED Aborted_AbortReason = 1
+	// The user requested that no analysis be performed.
+	Aborted_NO_ANALYZE Aborted_AbortReason = 8
+	// The user requested that no build be carried out.
+	Aborted_NO_BUILD Aborted_AbortReason = 9
+	// The build or target was aborted as a timeout was exceeded.
+	Aborted_TIME_OUT Aborted_AbortReason = 2
+	// The build or target was aborted as some remote environment (e.g., for
+	// remote execution of actions) was not available in the expected way.
+	Aborted_REMOTE_ENVIRONMENT_FAILURE Aborted_AbortReason = 3
+	// Failure due to reasons entirely internal to the build tool, e.g.,
+	// running out of memory.
+	Aborted_INTERNAL Aborted_AbortReason = 4
+	// A Failure occurred in the loading phase of a target.
+	Aborted_LOADING_FAILURE Aborted_AbortReason = 5
+	// A Failure occurred in the analysis phase of a target.
+	Aborted_ANALYSIS_FAILURE Aborted_AbortReason = 6
+	// Target build was skipped (e.g. due to incompatible CPU constraints).
+	Aborted_SKIPPED Aborted_AbortReason = 7
+)
+
+var Aborted_AbortReason_name = map[int32]string{
+	0: "UNKNOWN",
+	1: "USER_INTERRUPTED",
+	8: "NO_ANALYZE",
+	9: "NO_BUILD",
+	2: "TIME_OUT",
+	3: "REMOTE_ENVIRONMENT_FAILURE",
+	4: "INTERNAL",
+	5: "LOADING_FAILURE",
+	6: "ANALYSIS_FAILURE",
+	7: "SKIPPED",
+}
+
+var Aborted_AbortReason_value = map[string]int32{
+	"UNKNOWN":                    0,
+	"USER_INTERRUPTED":           1,
+	"NO_ANALYZE":                 8,
+	"NO_BUILD":                   9,
+	"TIME_OUT":                   2,
+	"REMOTE_ENVIRONMENT_FAILURE": 3,
+	"INTERNAL":                   4,
+	"LOADING_FAILURE":            5,
+	"ANALYSIS_FAILURE":           6,
+	"SKIPPED":                    7,
+}
+
+func (x Aborted_AbortReason) String() string {
+	return proto.EnumName(Aborted_AbortReason_name, int32(x))
+}
+
+func (Aborted_AbortReason) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{2, 0}
+}
+
+// Identifier for a build event. It is deliberately structured to also provide
+// information about which build target etc the event is related to.
+//
+// Events are chained via the event id as follows: each event has an id and a
+// set of ids of children events such that apart from the initial event each
+// event has an id that is mentioned as child id in an earlier event and a build
+// invocation is complete if and only if all direct and indirect children of the
+// initial event have been posted.
+type BuildEventId struct {
+	// Types that are valid to be assigned to Id:
+	//	*BuildEventId_Unknown
+	//	*BuildEventId_Progress
+	//	*BuildEventId_Started
+	//	*BuildEventId_UnstructuredCommandLine
+	//	*BuildEventId_StructuredCommandLine
+	//	*BuildEventId_WorkspaceStatus
+	//	*BuildEventId_OptionsParsed
+	//	*BuildEventId_Fetch
+	//	*BuildEventId_Configuration
+	//	*BuildEventId_TargetConfigured
+	//	*BuildEventId_Pattern
+	//	*BuildEventId_PatternSkipped
+	//	*BuildEventId_NamedSet
+	//	*BuildEventId_TargetCompleted
+	//	*BuildEventId_ActionCompleted
+	//	*BuildEventId_UnconfiguredLabel
+	//	*BuildEventId_ConfiguredLabel
+	//	*BuildEventId_TestResult
+	//	*BuildEventId_TestSummary
+	//	*BuildEventId_BuildFinished
+	//	*BuildEventId_BuildToolLogs
+	//	*BuildEventId_BuildMetrics
+	Id                   isBuildEventId_Id `protobuf_oneof:"id"`
+	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
+	XXX_unrecognized     []byte            `json:"-"`
+	XXX_sizecache        int32             `json:"-"`
+}
+
+func (m *BuildEventId) Reset()         { *m = BuildEventId{} }
+func (m *BuildEventId) String() string { return proto.CompactTextString(m) }
+func (*BuildEventId) ProtoMessage()    {}
+func (*BuildEventId) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{0}
+}
+
+func (m *BuildEventId) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BuildEventId.Unmarshal(m, b)
+}
+func (m *BuildEventId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BuildEventId.Marshal(b, m, deterministic)
+}
+func (m *BuildEventId) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BuildEventId.Merge(m, src)
+}
+func (m *BuildEventId) XXX_Size() int {
+	return xxx_messageInfo_BuildEventId.Size(m)
+}
+func (m *BuildEventId) XXX_DiscardUnknown() {
+	xxx_messageInfo_BuildEventId.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BuildEventId proto.InternalMessageInfo
+
+type isBuildEventId_Id interface {
+	isBuildEventId_Id()
+}
+
+type BuildEventId_Unknown struct {
+	Unknown *BuildEventId_UnknownBuildEventId `protobuf:"bytes,1,opt,name=unknown,proto3,oneof"`
+}
+
+type BuildEventId_Progress struct {
+	Progress *BuildEventId_ProgressId `protobuf:"bytes,2,opt,name=progress,proto3,oneof"`
+}
+
+type BuildEventId_Started struct {
+	Started *BuildEventId_BuildStartedId `protobuf:"bytes,3,opt,name=started,proto3,oneof"`
+}
+
+type BuildEventId_UnstructuredCommandLine struct {
+	UnstructuredCommandLine *BuildEventId_UnstructuredCommandLineId `protobuf:"bytes,11,opt,name=unstructured_command_line,json=unstructuredCommandLine,proto3,oneof"`
+}
+
+type BuildEventId_StructuredCommandLine struct {
+	StructuredCommandLine *BuildEventId_StructuredCommandLineId `protobuf:"bytes,18,opt,name=structured_command_line,json=structuredCommandLine,proto3,oneof"`
+}
+
+type BuildEventId_WorkspaceStatus struct {
+	WorkspaceStatus *BuildEventId_WorkspaceStatusId `protobuf:"bytes,14,opt,name=workspace_status,json=workspaceStatus,proto3,oneof"`
+}
+
+type BuildEventId_OptionsParsed struct {
+	OptionsParsed *BuildEventId_OptionsParsedId `protobuf:"bytes,12,opt,name=options_parsed,json=optionsParsed,proto3,oneof"`
+}
+
+type BuildEventId_Fetch struct {
+	Fetch *BuildEventId_FetchId `protobuf:"bytes,17,opt,name=fetch,proto3,oneof"`
+}
+
+type BuildEventId_Configuration struct {
+	Configuration *BuildEventId_ConfigurationId `protobuf:"bytes,15,opt,name=configuration,proto3,oneof"`
+}
+
+type BuildEventId_TargetConfigured struct {
+	TargetConfigured *BuildEventId_TargetConfiguredId `protobuf:"bytes,16,opt,name=target_configured,json=targetConfigured,proto3,oneof"`
+}
+
+type BuildEventId_Pattern struct {
+	Pattern *BuildEventId_PatternExpandedId `protobuf:"bytes,4,opt,name=pattern,proto3,oneof"`
+}
+
+type BuildEventId_PatternSkipped struct {
+	PatternSkipped *BuildEventId_PatternExpandedId `protobuf:"bytes,10,opt,name=pattern_skipped,json=patternSkipped,proto3,oneof"`
+}
+
+type BuildEventId_NamedSet struct {
+	NamedSet *BuildEventId_NamedSetOfFilesId `protobuf:"bytes,13,opt,name=named_set,json=namedSet,proto3,oneof"`
+}
+
+type BuildEventId_TargetCompleted struct {
+	TargetCompleted *BuildEventId_TargetCompletedId `protobuf:"bytes,5,opt,name=target_completed,json=targetCompleted,proto3,oneof"`
+}
+
+type BuildEventId_ActionCompleted struct {
+	ActionCompleted *BuildEventId_ActionCompletedId `protobuf:"bytes,6,opt,name=action_completed,json=actionCompleted,proto3,oneof"`
+}
+
+type BuildEventId_UnconfiguredLabel struct {
+	UnconfiguredLabel *BuildEventId_UnconfiguredLabelId `protobuf:"bytes,19,opt,name=unconfigured_label,json=unconfiguredLabel,proto3,oneof"`
+}
+
+type BuildEventId_ConfiguredLabel struct {
+	ConfiguredLabel *BuildEventId_ConfiguredLabelId `protobuf:"bytes,21,opt,name=configured_label,json=configuredLabel,proto3,oneof"`
+}
+
+type BuildEventId_TestResult struct {
+	TestResult *BuildEventId_TestResultId `protobuf:"bytes,8,opt,name=test_result,json=testResult,proto3,oneof"`
+}
+
+type BuildEventId_TestSummary struct {
+	TestSummary *BuildEventId_TestSummaryId `protobuf:"bytes,7,opt,name=test_summary,json=testSummary,proto3,oneof"`
+}
+
+type BuildEventId_BuildFinished struct {
+	BuildFinished *BuildEventId_BuildFinishedId `protobuf:"bytes,9,opt,name=build_finished,json=buildFinished,proto3,oneof"`
+}
+
+type BuildEventId_BuildToolLogs struct {
+	BuildToolLogs *BuildEventId_BuildToolLogsId `protobuf:"bytes,20,opt,name=build_tool_logs,json=buildToolLogs,proto3,oneof"`
+}
+
+type BuildEventId_BuildMetrics struct {
+	BuildMetrics *BuildEventId_BuildMetricsId `protobuf:"bytes,22,opt,name=build_metrics,json=buildMetrics,proto3,oneof"`
+}
+
+func (*BuildEventId_Unknown) isBuildEventId_Id() {}
+
+func (*BuildEventId_Progress) isBuildEventId_Id() {}
+
+func (*BuildEventId_Started) isBuildEventId_Id() {}
+
+func (*BuildEventId_UnstructuredCommandLine) isBuildEventId_Id() {}
+
+func (*BuildEventId_StructuredCommandLine) isBuildEventId_Id() {}
+
+func (*BuildEventId_WorkspaceStatus) isBuildEventId_Id() {}
+
+func (*BuildEventId_OptionsParsed) isBuildEventId_Id() {}
+
+func (*BuildEventId_Fetch) isBuildEventId_Id() {}
+
+func (*BuildEventId_Configuration) isBuildEventId_Id() {}
+
+func (*BuildEventId_TargetConfigured) isBuildEventId_Id() {}
+
+func (*BuildEventId_Pattern) isBuildEventId_Id() {}
+
+func (*BuildEventId_PatternSkipped) isBuildEventId_Id() {}
+
+func (*BuildEventId_NamedSet) isBuildEventId_Id() {}
+
+func (*BuildEventId_TargetCompleted) isBuildEventId_Id() {}
+
+func (*BuildEventId_ActionCompleted) isBuildEventId_Id() {}
+
+func (*BuildEventId_UnconfiguredLabel) isBuildEventId_Id() {}
+
+func (*BuildEventId_ConfiguredLabel) isBuildEventId_Id() {}
+
+func (*BuildEventId_TestResult) isBuildEventId_Id() {}
+
+func (*BuildEventId_TestSummary) isBuildEventId_Id() {}
+
+func (*BuildEventId_BuildFinished) isBuildEventId_Id() {}
+
+func (*BuildEventId_BuildToolLogs) isBuildEventId_Id() {}
+
+func (*BuildEventId_BuildMetrics) isBuildEventId_Id() {}
+
+func (m *BuildEventId) GetId() isBuildEventId_Id {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *BuildEventId) GetUnknown() *BuildEventId_UnknownBuildEventId {
+	if x, ok := m.GetId().(*BuildEventId_Unknown); ok {
+		return x.Unknown
+	}
+	return nil
+}
+
+func (m *BuildEventId) GetProgress() *BuildEventId_ProgressId {
+	if x, ok := m.GetId().(*BuildEventId_Progress); ok {
+		return x.Progress
+	}
+	return nil
+}
+
+func (m *BuildEventId) GetStarted() *BuildEventId_BuildStartedId {
+	if x, ok := m.GetId().(*BuildEventId_Started); ok {
+		return x.Started
+	}
+	return nil
+}
+
+func (m *BuildEventId) GetUnstructuredCommandLine() *BuildEventId_UnstructuredCommandLineId {
+	if x, ok := m.GetId().(*BuildEventId_UnstructuredCommandLine); ok {
+		return x.UnstructuredCommandLine
+	}
+	return nil
+}
+
+func (m *BuildEventId) GetStructuredCommandLine() *BuildEventId_StructuredCommandLineId {
+	if x, ok := m.GetId().(*BuildEventId_StructuredCommandLine); ok {
+		return x.StructuredCommandLine
+	}
+	return nil
+}
+
+func (m *BuildEventId) GetWorkspaceStatus() *BuildEventId_WorkspaceStatusId {
+	if x, ok := m.GetId().(*BuildEventId_WorkspaceStatus); ok {
+		return x.WorkspaceStatus
+	}
+	return nil
+}
+
+func (m *BuildEventId) GetOptionsParsed() *BuildEventId_OptionsParsedId {
+	if x, ok := m.GetId().(*BuildEventId_OptionsParsed); ok {
+		return x.OptionsParsed
+	}
+	return nil
+}
+
+func (m *BuildEventId) GetFetch() *BuildEventId_FetchId {
+	if x, ok := m.GetId().(*BuildEventId_Fetch); ok {
+		return x.Fetch
+	}
+	return nil
+}
+
+func (m *BuildEventId) GetConfiguration() *BuildEventId_ConfigurationId {
+	if x, ok := m.GetId().(*BuildEventId_Configuration); ok {
+		return x.Configuration
+	}
+	return nil
+}
+
+func (m *BuildEventId) GetTargetConfigured() *BuildEventId_TargetConfiguredId {
+	if x, ok := m.GetId().(*BuildEventId_TargetConfigured); ok {
+		return x.TargetConfigured
+	}
+	return nil
+}
+
+func (m *BuildEventId) GetPattern() *BuildEventId_PatternExpandedId {
+	if x, ok := m.GetId().(*BuildEventId_Pattern); ok {
+		return x.Pattern
+	}
+	return nil
+}
+
+func (m *BuildEventId) GetPatternSkipped() *BuildEventId_PatternExpandedId {
+	if x, ok := m.GetId().(*BuildEventId_PatternSkipped); ok {
+		return x.PatternSkipped
+	}
+	return nil
+}
+
+func (m *BuildEventId) GetNamedSet() *BuildEventId_NamedSetOfFilesId {
+	if x, ok := m.GetId().(*BuildEventId_NamedSet); ok {
+		return x.NamedSet
+	}
+	return nil
+}
+
+func (m *BuildEventId) GetTargetCompleted() *BuildEventId_TargetCompletedId {
+	if x, ok := m.GetId().(*BuildEventId_TargetCompleted); ok {
+		return x.TargetCompleted
+	}
+	return nil
+}
+
+func (m *BuildEventId) GetActionCompleted() *BuildEventId_ActionCompletedId {
+	if x, ok := m.GetId().(*BuildEventId_ActionCompleted); ok {
+		return x.ActionCompleted
+	}
+	return nil
+}
+
+func (m *BuildEventId) GetUnconfiguredLabel() *BuildEventId_UnconfiguredLabelId {
+	if x, ok := m.GetId().(*BuildEventId_UnconfiguredLabel); ok {
+		return x.UnconfiguredLabel
+	}
+	return nil
+}
+
+func (m *BuildEventId) GetConfiguredLabel() *BuildEventId_ConfiguredLabelId {
+	if x, ok := m.GetId().(*BuildEventId_ConfiguredLabel); ok {
+		return x.ConfiguredLabel
+	}
+	return nil
+}
+
+func (m *BuildEventId) GetTestResult() *BuildEventId_TestResultId {
+	if x, ok := m.GetId().(*BuildEventId_TestResult); ok {
+		return x.TestResult
+	}
+	return nil
+}
+
+func (m *BuildEventId) GetTestSummary() *BuildEventId_TestSummaryId {
+	if x, ok := m.GetId().(*BuildEventId_TestSummary); ok {
+		return x.TestSummary
+	}
+	return nil
+}
+
+func (m *BuildEventId) GetBuildFinished() *BuildEventId_BuildFinishedId {
+	if x, ok := m.GetId().(*BuildEventId_BuildFinished); ok {
+		return x.BuildFinished
+	}
+	return nil
+}
+
+func (m *BuildEventId) GetBuildToolLogs() *BuildEventId_BuildToolLogsId {
+	if x, ok := m.GetId().(*BuildEventId_BuildToolLogs); ok {
+		return x.BuildToolLogs
+	}
+	return nil
+}
+
+func (m *BuildEventId) GetBuildMetrics() *BuildEventId_BuildMetricsId {
+	if x, ok := m.GetId().(*BuildEventId_BuildMetrics); ok {
+		return x.BuildMetrics
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*BuildEventId) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*BuildEventId_Unknown)(nil),
+		(*BuildEventId_Progress)(nil),
+		(*BuildEventId_Started)(nil),
+		(*BuildEventId_UnstructuredCommandLine)(nil),
+		(*BuildEventId_StructuredCommandLine)(nil),
+		(*BuildEventId_WorkspaceStatus)(nil),
+		(*BuildEventId_OptionsParsed)(nil),
+		(*BuildEventId_Fetch)(nil),
+		(*BuildEventId_Configuration)(nil),
+		(*BuildEventId_TargetConfigured)(nil),
+		(*BuildEventId_Pattern)(nil),
+		(*BuildEventId_PatternSkipped)(nil),
+		(*BuildEventId_NamedSet)(nil),
+		(*BuildEventId_TargetCompleted)(nil),
+		(*BuildEventId_ActionCompleted)(nil),
+		(*BuildEventId_UnconfiguredLabel)(nil),
+		(*BuildEventId_ConfiguredLabel)(nil),
+		(*BuildEventId_TestResult)(nil),
+		(*BuildEventId_TestSummary)(nil),
+		(*BuildEventId_BuildFinished)(nil),
+		(*BuildEventId_BuildToolLogs)(nil),
+		(*BuildEventId_BuildMetrics)(nil),
+	}
+}
+
+// Generic identifier for a build event. This is the default type of
+// BuildEventId, but should not be used outside testing; nevertheless,
+// tools should handle build events with this kind of id gracefully.
+type BuildEventId_UnknownBuildEventId struct {
+	Details              string   `protobuf:"bytes,1,opt,name=details,proto3" json:"details,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BuildEventId_UnknownBuildEventId) Reset()         { *m = BuildEventId_UnknownBuildEventId{} }
+func (m *BuildEventId_UnknownBuildEventId) String() string { return proto.CompactTextString(m) }
+func (*BuildEventId_UnknownBuildEventId) ProtoMessage()    {}
+func (*BuildEventId_UnknownBuildEventId) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{0, 0}
+}
+
+func (m *BuildEventId_UnknownBuildEventId) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BuildEventId_UnknownBuildEventId.Unmarshal(m, b)
+}
+func (m *BuildEventId_UnknownBuildEventId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BuildEventId_UnknownBuildEventId.Marshal(b, m, deterministic)
+}
+func (m *BuildEventId_UnknownBuildEventId) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BuildEventId_UnknownBuildEventId.Merge(m, src)
+}
+func (m *BuildEventId_UnknownBuildEventId) XXX_Size() int {
+	return xxx_messageInfo_BuildEventId_UnknownBuildEventId.Size(m)
+}
+func (m *BuildEventId_UnknownBuildEventId) XXX_DiscardUnknown() {
+	xxx_messageInfo_BuildEventId_UnknownBuildEventId.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BuildEventId_UnknownBuildEventId proto.InternalMessageInfo
+
+func (m *BuildEventId_UnknownBuildEventId) GetDetails() string {
+	if m != nil {
+		return m.Details
+	}
+	return ""
+}
+
+// Identifier of an event reporting progress. Those events are also used to
+// chain in events that come early.
+type BuildEventId_ProgressId struct {
+	// Unique identifier. No assumption should be made about how the ids are
+	// assigned; the only meaningful operation on this field is test for
+	// equality.
+	OpaqueCount          int32    `protobuf:"varint,1,opt,name=opaque_count,json=opaqueCount,proto3" json:"opaque_count,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BuildEventId_ProgressId) Reset()         { *m = BuildEventId_ProgressId{} }
+func (m *BuildEventId_ProgressId) String() string { return proto.CompactTextString(m) }
+func (*BuildEventId_ProgressId) ProtoMessage()    {}
+func (*BuildEventId_ProgressId) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{0, 1}
+}
+
+func (m *BuildEventId_ProgressId) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BuildEventId_ProgressId.Unmarshal(m, b)
+}
+func (m *BuildEventId_ProgressId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BuildEventId_ProgressId.Marshal(b, m, deterministic)
+}
+func (m *BuildEventId_ProgressId) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BuildEventId_ProgressId.Merge(m, src)
+}
+func (m *BuildEventId_ProgressId) XXX_Size() int {
+	return xxx_messageInfo_BuildEventId_ProgressId.Size(m)
+}
+func (m *BuildEventId_ProgressId) XXX_DiscardUnknown() {
+	xxx_messageInfo_BuildEventId_ProgressId.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BuildEventId_ProgressId proto.InternalMessageInfo
+
+func (m *BuildEventId_ProgressId) GetOpaqueCount() int32 {
+	if m != nil {
+		return m.OpaqueCount
+	}
+	return 0
+}
+
+// Identifier of an event indicating the beginning of a build; this will
+// normally be the first event.
+type BuildEventId_BuildStartedId struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BuildEventId_BuildStartedId) Reset()         { *m = BuildEventId_BuildStartedId{} }
+func (m *BuildEventId_BuildStartedId) String() string { return proto.CompactTextString(m) }
+func (*BuildEventId_BuildStartedId) ProtoMessage()    {}
+func (*BuildEventId_BuildStartedId) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{0, 2}
+}
+
+func (m *BuildEventId_BuildStartedId) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BuildEventId_BuildStartedId.Unmarshal(m, b)
+}
+func (m *BuildEventId_BuildStartedId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BuildEventId_BuildStartedId.Marshal(b, m, deterministic)
+}
+func (m *BuildEventId_BuildStartedId) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BuildEventId_BuildStartedId.Merge(m, src)
+}
+func (m *BuildEventId_BuildStartedId) XXX_Size() int {
+	return xxx_messageInfo_BuildEventId_BuildStartedId.Size(m)
+}
+func (m *BuildEventId_BuildStartedId) XXX_DiscardUnknown() {
+	xxx_messageInfo_BuildEventId_BuildStartedId.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BuildEventId_BuildStartedId proto.InternalMessageInfo
+
+// Identifier on an event indicating the original commandline received by
+// the bazel server.
+type BuildEventId_UnstructuredCommandLineId struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BuildEventId_UnstructuredCommandLineId) Reset() {
+	*m = BuildEventId_UnstructuredCommandLineId{}
+}
+func (m *BuildEventId_UnstructuredCommandLineId) String() string { return proto.CompactTextString(m) }
+func (*BuildEventId_UnstructuredCommandLineId) ProtoMessage()    {}
+func (*BuildEventId_UnstructuredCommandLineId) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{0, 3}
+}
+
+func (m *BuildEventId_UnstructuredCommandLineId) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BuildEventId_UnstructuredCommandLineId.Unmarshal(m, b)
+}
+func (m *BuildEventId_UnstructuredCommandLineId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BuildEventId_UnstructuredCommandLineId.Marshal(b, m, deterministic)
+}
+func (m *BuildEventId_UnstructuredCommandLineId) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BuildEventId_UnstructuredCommandLineId.Merge(m, src)
+}
+func (m *BuildEventId_UnstructuredCommandLineId) XXX_Size() int {
+	return xxx_messageInfo_BuildEventId_UnstructuredCommandLineId.Size(m)
+}
+func (m *BuildEventId_UnstructuredCommandLineId) XXX_DiscardUnknown() {
+	xxx_messageInfo_BuildEventId_UnstructuredCommandLineId.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BuildEventId_UnstructuredCommandLineId proto.InternalMessageInfo
+
+// Identifier on an event describing the commandline received by Bazel.
+type BuildEventId_StructuredCommandLineId struct {
+	// A title for this command line value, as there may be multiple.
+	// For example, a single invocation may wish to report both the literal and
+	// canonical command lines, and this label would be used to differentiate
+	// between both versions.
+	CommandLineLabel     string   `protobuf:"bytes,1,opt,name=command_line_label,json=commandLineLabel,proto3" json:"command_line_label,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BuildEventId_StructuredCommandLineId) Reset()         { *m = BuildEventId_StructuredCommandLineId{} }
+func (m *BuildEventId_StructuredCommandLineId) String() string { return proto.CompactTextString(m) }
+func (*BuildEventId_StructuredCommandLineId) ProtoMessage()    {}
+func (*BuildEventId_StructuredCommandLineId) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{0, 4}
+}
+
+func (m *BuildEventId_StructuredCommandLineId) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BuildEventId_StructuredCommandLineId.Unmarshal(m, b)
+}
+func (m *BuildEventId_StructuredCommandLineId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BuildEventId_StructuredCommandLineId.Marshal(b, m, deterministic)
+}
+func (m *BuildEventId_StructuredCommandLineId) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BuildEventId_StructuredCommandLineId.Merge(m, src)
+}
+func (m *BuildEventId_StructuredCommandLineId) XXX_Size() int {
+	return xxx_messageInfo_BuildEventId_StructuredCommandLineId.Size(m)
+}
+func (m *BuildEventId_StructuredCommandLineId) XXX_DiscardUnknown() {
+	xxx_messageInfo_BuildEventId_StructuredCommandLineId.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BuildEventId_StructuredCommandLineId proto.InternalMessageInfo
+
+func (m *BuildEventId_StructuredCommandLineId) GetCommandLineLabel() string {
+	if m != nil {
+		return m.CommandLineLabel
+	}
+	return ""
+}
+
+// Identifier of an event indicating the workspace status.
+type BuildEventId_WorkspaceStatusId struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BuildEventId_WorkspaceStatusId) Reset()         { *m = BuildEventId_WorkspaceStatusId{} }
+func (m *BuildEventId_WorkspaceStatusId) String() string { return proto.CompactTextString(m) }
+func (*BuildEventId_WorkspaceStatusId) ProtoMessage()    {}
+func (*BuildEventId_WorkspaceStatusId) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{0, 5}
+}
+
+func (m *BuildEventId_WorkspaceStatusId) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BuildEventId_WorkspaceStatusId.Unmarshal(m, b)
+}
+func (m *BuildEventId_WorkspaceStatusId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BuildEventId_WorkspaceStatusId.Marshal(b, m, deterministic)
+}
+func (m *BuildEventId_WorkspaceStatusId) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BuildEventId_WorkspaceStatusId.Merge(m, src)
+}
+func (m *BuildEventId_WorkspaceStatusId) XXX_Size() int {
+	return xxx_messageInfo_BuildEventId_WorkspaceStatusId.Size(m)
+}
+func (m *BuildEventId_WorkspaceStatusId) XXX_DiscardUnknown() {
+	xxx_messageInfo_BuildEventId_WorkspaceStatusId.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BuildEventId_WorkspaceStatusId proto.InternalMessageInfo
+
+// Identifier on an event reporting on the options included in the command
+// line, both explicitly and implicitly.
+type BuildEventId_OptionsParsedId struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BuildEventId_OptionsParsedId) Reset()         { *m = BuildEventId_OptionsParsedId{} }
+func (m *BuildEventId_OptionsParsedId) String() string { return proto.CompactTextString(m) }
+func (*BuildEventId_OptionsParsedId) ProtoMessage()    {}
+func (*BuildEventId_OptionsParsedId) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{0, 6}
+}
+
+func (m *BuildEventId_OptionsParsedId) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BuildEventId_OptionsParsedId.Unmarshal(m, b)
+}
+func (m *BuildEventId_OptionsParsedId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BuildEventId_OptionsParsedId.Marshal(b, m, deterministic)
+}
+func (m *BuildEventId_OptionsParsedId) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BuildEventId_OptionsParsedId.Merge(m, src)
+}
+func (m *BuildEventId_OptionsParsedId) XXX_Size() int {
+	return xxx_messageInfo_BuildEventId_OptionsParsedId.Size(m)
+}
+func (m *BuildEventId_OptionsParsedId) XXX_DiscardUnknown() {
+	xxx_messageInfo_BuildEventId_OptionsParsedId.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BuildEventId_OptionsParsedId proto.InternalMessageInfo
+
+// Identifier of an event reporting that an external resource was fetched
+// from.
+type BuildEventId_FetchId struct {
+	// The external resource that was fetched from.
+	Url                  string   `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BuildEventId_FetchId) Reset()         { *m = BuildEventId_FetchId{} }
+func (m *BuildEventId_FetchId) String() string { return proto.CompactTextString(m) }
+func (*BuildEventId_FetchId) ProtoMessage()    {}
+func (*BuildEventId_FetchId) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{0, 7}
+}
+
+func (m *BuildEventId_FetchId) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BuildEventId_FetchId.Unmarshal(m, b)
+}
+func (m *BuildEventId_FetchId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BuildEventId_FetchId.Marshal(b, m, deterministic)
+}
+func (m *BuildEventId_FetchId) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BuildEventId_FetchId.Merge(m, src)
+}
+func (m *BuildEventId_FetchId) XXX_Size() int {
+	return xxx_messageInfo_BuildEventId_FetchId.Size(m)
+}
+func (m *BuildEventId_FetchId) XXX_DiscardUnknown() {
+	xxx_messageInfo_BuildEventId_FetchId.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BuildEventId_FetchId proto.InternalMessageInfo
+
+func (m *BuildEventId_FetchId) GetUrl() string {
+	if m != nil {
+		return m.Url
+	}
+	return ""
+}
+
+// Identifier of an event indicating that a target pattern has been expanded
+// further.
+// Messages of this shape are also used to describe parts of a pattern that
+// have been skipped for some reason, if the actual expansion was still
+// carried out (e.g., if keep_going is set). In this case, the
+// pattern_skipped choice in the id field is to be made.
+type BuildEventId_PatternExpandedId struct {
+	Pattern              []string `protobuf:"bytes,1,rep,name=pattern,proto3" json:"pattern,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BuildEventId_PatternExpandedId) Reset()         { *m = BuildEventId_PatternExpandedId{} }
+func (m *BuildEventId_PatternExpandedId) String() string { return proto.CompactTextString(m) }
+func (*BuildEventId_PatternExpandedId) ProtoMessage()    {}
+func (*BuildEventId_PatternExpandedId) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{0, 8}
+}
+
+func (m *BuildEventId_PatternExpandedId) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BuildEventId_PatternExpandedId.Unmarshal(m, b)
+}
+func (m *BuildEventId_PatternExpandedId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BuildEventId_PatternExpandedId.Marshal(b, m, deterministic)
+}
+func (m *BuildEventId_PatternExpandedId) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BuildEventId_PatternExpandedId.Merge(m, src)
+}
+func (m *BuildEventId_PatternExpandedId) XXX_Size() int {
+	return xxx_messageInfo_BuildEventId_PatternExpandedId.Size(m)
+}
+func (m *BuildEventId_PatternExpandedId) XXX_DiscardUnknown() {
+	xxx_messageInfo_BuildEventId_PatternExpandedId.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BuildEventId_PatternExpandedId proto.InternalMessageInfo
+
+func (m *BuildEventId_PatternExpandedId) GetPattern() []string {
+	if m != nil {
+		return m.Pattern
+	}
+	return nil
+}
+
+// Identifier of an event indicating that a target has been expanded by
+// identifying for which configurations it should be build.
+type BuildEventId_TargetConfiguredId struct {
+	Label string `protobuf:"bytes,1,opt,name=label,proto3" json:"label,omitempty"`
+	// If not empty, the id refers to the expansion of the target for a given
+	// aspect.
+	Aspect               string   `protobuf:"bytes,2,opt,name=aspect,proto3" json:"aspect,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BuildEventId_TargetConfiguredId) Reset()         { *m = BuildEventId_TargetConfiguredId{} }
+func (m *BuildEventId_TargetConfiguredId) String() string { return proto.CompactTextString(m) }
+func (*BuildEventId_TargetConfiguredId) ProtoMessage()    {}
+func (*BuildEventId_TargetConfiguredId) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{0, 9}
+}
+
+func (m *BuildEventId_TargetConfiguredId) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BuildEventId_TargetConfiguredId.Unmarshal(m, b)
+}
+func (m *BuildEventId_TargetConfiguredId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BuildEventId_TargetConfiguredId.Marshal(b, m, deterministic)
+}
+func (m *BuildEventId_TargetConfiguredId) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BuildEventId_TargetConfiguredId.Merge(m, src)
+}
+func (m *BuildEventId_TargetConfiguredId) XXX_Size() int {
+	return xxx_messageInfo_BuildEventId_TargetConfiguredId.Size(m)
+}
+func (m *BuildEventId_TargetConfiguredId) XXX_DiscardUnknown() {
+	xxx_messageInfo_BuildEventId_TargetConfiguredId.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BuildEventId_TargetConfiguredId proto.InternalMessageInfo
+
+func (m *BuildEventId_TargetConfiguredId) GetLabel() string {
+	if m != nil {
+		return m.Label
+	}
+	return ""
+}
+
+func (m *BuildEventId_TargetConfiguredId) GetAspect() string {
+	if m != nil {
+		return m.Aspect
+	}
+	return ""
+}
+
+// Identifier of an event introducing a named set of files (usually artifacts)
+// to be referred to in later messages.
+type BuildEventId_NamedSetOfFilesId struct {
+	// Identifier of the file set; this is an opaque string valid only for the
+	// particular instance of the event stream.
+	Id                   string   `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BuildEventId_NamedSetOfFilesId) Reset()         { *m = BuildEventId_NamedSetOfFilesId{} }
+func (m *BuildEventId_NamedSetOfFilesId) String() string { return proto.CompactTextString(m) }
+func (*BuildEventId_NamedSetOfFilesId) ProtoMessage()    {}
+func (*BuildEventId_NamedSetOfFilesId) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{0, 10}
+}
+
+func (m *BuildEventId_NamedSetOfFilesId) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BuildEventId_NamedSetOfFilesId.Unmarshal(m, b)
+}
+func (m *BuildEventId_NamedSetOfFilesId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BuildEventId_NamedSetOfFilesId.Marshal(b, m, deterministic)
+}
+func (m *BuildEventId_NamedSetOfFilesId) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BuildEventId_NamedSetOfFilesId.Merge(m, src)
+}
+func (m *BuildEventId_NamedSetOfFilesId) XXX_Size() int {
+	return xxx_messageInfo_BuildEventId_NamedSetOfFilesId.Size(m)
+}
+func (m *BuildEventId_NamedSetOfFilesId) XXX_DiscardUnknown() {
+	xxx_messageInfo_BuildEventId_NamedSetOfFilesId.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BuildEventId_NamedSetOfFilesId proto.InternalMessageInfo
+
+func (m *BuildEventId_NamedSetOfFilesId) GetId() string {
+	if m != nil {
+		return m.Id
+	}
+	return ""
+}
+
+// Identifier of an event introducing a configuration.
+type BuildEventId_ConfigurationId struct {
+	// Identifier of the configuration; users of the protocol should not make
+	// any assumptions about it having any structure, or equality of the
+	// identifier between different streams.
+	Id                   string   `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BuildEventId_ConfigurationId) Reset()         { *m = BuildEventId_ConfigurationId{} }
+func (m *BuildEventId_ConfigurationId) String() string { return proto.CompactTextString(m) }
+func (*BuildEventId_ConfigurationId) ProtoMessage()    {}
+func (*BuildEventId_ConfigurationId) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{0, 11}
+}
+
+func (m *BuildEventId_ConfigurationId) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BuildEventId_ConfigurationId.Unmarshal(m, b)
+}
+func (m *BuildEventId_ConfigurationId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BuildEventId_ConfigurationId.Marshal(b, m, deterministic)
+}
+func (m *BuildEventId_ConfigurationId) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BuildEventId_ConfigurationId.Merge(m, src)
+}
+func (m *BuildEventId_ConfigurationId) XXX_Size() int {
+	return xxx_messageInfo_BuildEventId_ConfigurationId.Size(m)
+}
+func (m *BuildEventId_ConfigurationId) XXX_DiscardUnknown() {
+	xxx_messageInfo_BuildEventId_ConfigurationId.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BuildEventId_ConfigurationId proto.InternalMessageInfo
+
+func (m *BuildEventId_ConfigurationId) GetId() string {
+	if m != nil {
+		return m.Id
+	}
+	return ""
+}
+
+// Identifier of an event indicating that a target was built completely; this
+// does not include running the test if the target is a test target.
+type BuildEventId_TargetCompletedId struct {
+	Label string `protobuf:"bytes,1,opt,name=label,proto3" json:"label,omitempty"`
+	// The configuration for which the target was built.
+	Configuration *BuildEventId_ConfigurationId `protobuf:"bytes,3,opt,name=configuration,proto3" json:"configuration,omitempty"`
+	// If not empty, the id refers to the completion of the target for a given
+	// aspect.
+	Aspect               string   `protobuf:"bytes,2,opt,name=aspect,proto3" json:"aspect,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BuildEventId_TargetCompletedId) Reset()         { *m = BuildEventId_TargetCompletedId{} }
+func (m *BuildEventId_TargetCompletedId) String() string { return proto.CompactTextString(m) }
+func (*BuildEventId_TargetCompletedId) ProtoMessage()    {}
+func (*BuildEventId_TargetCompletedId) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{0, 12}
+}
+
+func (m *BuildEventId_TargetCompletedId) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BuildEventId_TargetCompletedId.Unmarshal(m, b)
+}
+func (m *BuildEventId_TargetCompletedId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BuildEventId_TargetCompletedId.Marshal(b, m, deterministic)
+}
+func (m *BuildEventId_TargetCompletedId) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BuildEventId_TargetCompletedId.Merge(m, src)
+}
+func (m *BuildEventId_TargetCompletedId) XXX_Size() int {
+	return xxx_messageInfo_BuildEventId_TargetCompletedId.Size(m)
+}
+func (m *BuildEventId_TargetCompletedId) XXX_DiscardUnknown() {
+	xxx_messageInfo_BuildEventId_TargetCompletedId.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BuildEventId_TargetCompletedId proto.InternalMessageInfo
+
+func (m *BuildEventId_TargetCompletedId) GetLabel() string {
+	if m != nil {
+		return m.Label
+	}
+	return ""
+}
+
+func (m *BuildEventId_TargetCompletedId) GetConfiguration() *BuildEventId_ConfigurationId {
+	if m != nil {
+		return m.Configuration
+	}
+	return nil
+}
+
+func (m *BuildEventId_TargetCompletedId) GetAspect() string {
+	if m != nil {
+		return m.Aspect
+	}
+	return ""
+}
+
+// Identifier of an event reporting that an action was completed (not all
+// actions are reported, only the ones that can be considered important;
+// this includes all failed actions).
+type BuildEventId_ActionCompletedId struct {
+	PrimaryOutput string `protobuf:"bytes,1,opt,name=primary_output,json=primaryOutput,proto3" json:"primary_output,omitempty"`
+	// Optional, the label of the owner of the action, for reference.
+	Label string `protobuf:"bytes,2,opt,name=label,proto3" json:"label,omitempty"`
+	// Optional, the id of the configuration of the action owner.
+	Configuration        *BuildEventId_ConfigurationId `protobuf:"bytes,3,opt,name=configuration,proto3" json:"configuration,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
+	XXX_unrecognized     []byte                        `json:"-"`
+	XXX_sizecache        int32                         `json:"-"`
+}
+
+func (m *BuildEventId_ActionCompletedId) Reset()         { *m = BuildEventId_ActionCompletedId{} }
+func (m *BuildEventId_ActionCompletedId) String() string { return proto.CompactTextString(m) }
+func (*BuildEventId_ActionCompletedId) ProtoMessage()    {}
+func (*BuildEventId_ActionCompletedId) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{0, 13}
+}
+
+func (m *BuildEventId_ActionCompletedId) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BuildEventId_ActionCompletedId.Unmarshal(m, b)
+}
+func (m *BuildEventId_ActionCompletedId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BuildEventId_ActionCompletedId.Marshal(b, m, deterministic)
+}
+func (m *BuildEventId_ActionCompletedId) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BuildEventId_ActionCompletedId.Merge(m, src)
+}
+func (m *BuildEventId_ActionCompletedId) XXX_Size() int {
+	return xxx_messageInfo_BuildEventId_ActionCompletedId.Size(m)
+}
+func (m *BuildEventId_ActionCompletedId) XXX_DiscardUnknown() {
+	xxx_messageInfo_BuildEventId_ActionCompletedId.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BuildEventId_ActionCompletedId proto.InternalMessageInfo
+
+func (m *BuildEventId_ActionCompletedId) GetPrimaryOutput() string {
+	if m != nil {
+		return m.PrimaryOutput
+	}
+	return ""
+}
+
+func (m *BuildEventId_ActionCompletedId) GetLabel() string {
+	if m != nil {
+		return m.Label
+	}
+	return ""
+}
+
+func (m *BuildEventId_ActionCompletedId) GetConfiguration() *BuildEventId_ConfigurationId {
+	if m != nil {
+		return m.Configuration
+	}
+	return nil
+}
+
+// Identifier of an event reporting an event associated with an unconfigured
+// label. Usually, this indicates a failure due to a missing input file. In
+// any case, it will report some form of error (i.e., the payload will be an
+// Aborted event); there are no regular events using this identifier. The
+// purpose of those events is to serve as the root cause of a failed target.
+type BuildEventId_UnconfiguredLabelId struct {
+	Label                string   `protobuf:"bytes,1,opt,name=label,proto3" json:"label,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BuildEventId_UnconfiguredLabelId) Reset()         { *m = BuildEventId_UnconfiguredLabelId{} }
+func (m *BuildEventId_UnconfiguredLabelId) String() string { return proto.CompactTextString(m) }
+func (*BuildEventId_UnconfiguredLabelId) ProtoMessage()    {}
+func (*BuildEventId_UnconfiguredLabelId) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{0, 14}
+}
+
+func (m *BuildEventId_UnconfiguredLabelId) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BuildEventId_UnconfiguredLabelId.Unmarshal(m, b)
+}
+func (m *BuildEventId_UnconfiguredLabelId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BuildEventId_UnconfiguredLabelId.Marshal(b, m, deterministic)
+}
+func (m *BuildEventId_UnconfiguredLabelId) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BuildEventId_UnconfiguredLabelId.Merge(m, src)
+}
+func (m *BuildEventId_UnconfiguredLabelId) XXX_Size() int {
+	return xxx_messageInfo_BuildEventId_UnconfiguredLabelId.Size(m)
+}
+func (m *BuildEventId_UnconfiguredLabelId) XXX_DiscardUnknown() {
+	xxx_messageInfo_BuildEventId_UnconfiguredLabelId.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BuildEventId_UnconfiguredLabelId proto.InternalMessageInfo
+
+func (m *BuildEventId_UnconfiguredLabelId) GetLabel() string {
+	if m != nil {
+		return m.Label
+	}
+	return ""
+}
+
+// Identifier of an event reporting an event associated with a configured
+// label, usually a visibility error. In any case, an event with such an
+// id will always report some form of error (i.e., the payload will be an
+// Aborted event); there are no regular events using this identifier.
+type BuildEventId_ConfiguredLabelId struct {
+	Label                string                        `protobuf:"bytes,1,opt,name=label,proto3" json:"label,omitempty"`
+	Configuration        *BuildEventId_ConfigurationId `protobuf:"bytes,2,opt,name=configuration,proto3" json:"configuration,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
+	XXX_unrecognized     []byte                        `json:"-"`
+	XXX_sizecache        int32                         `json:"-"`
+}
+
+func (m *BuildEventId_ConfiguredLabelId) Reset()         { *m = BuildEventId_ConfiguredLabelId{} }
+func (m *BuildEventId_ConfiguredLabelId) String() string { return proto.CompactTextString(m) }
+func (*BuildEventId_ConfiguredLabelId) ProtoMessage()    {}
+func (*BuildEventId_ConfiguredLabelId) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{0, 15}
+}
+
+func (m *BuildEventId_ConfiguredLabelId) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BuildEventId_ConfiguredLabelId.Unmarshal(m, b)
+}
+func (m *BuildEventId_ConfiguredLabelId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BuildEventId_ConfiguredLabelId.Marshal(b, m, deterministic)
+}
+func (m *BuildEventId_ConfiguredLabelId) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BuildEventId_ConfiguredLabelId.Merge(m, src)
+}
+func (m *BuildEventId_ConfiguredLabelId) XXX_Size() int {
+	return xxx_messageInfo_BuildEventId_ConfiguredLabelId.Size(m)
+}
+func (m *BuildEventId_ConfiguredLabelId) XXX_DiscardUnknown() {
+	xxx_messageInfo_BuildEventId_ConfiguredLabelId.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BuildEventId_ConfiguredLabelId proto.InternalMessageInfo
+
+func (m *BuildEventId_ConfiguredLabelId) GetLabel() string {
+	if m != nil {
+		return m.Label
+	}
+	return ""
+}
+
+func (m *BuildEventId_ConfiguredLabelId) GetConfiguration() *BuildEventId_ConfigurationId {
+	if m != nil {
+		return m.Configuration
+	}
+	return nil
+}
+
+// Identifier of an event reporting on an individual test run. The label
+// identifies the test that is reported about, the remaining fields are
+// in such a way as to uniquely identify the action within a build. In fact,
+// attempts for the same test, run, shard triple are counted sequentially,
+// starting with 1.
+type BuildEventId_TestResultId struct {
+	Label                string                        `protobuf:"bytes,1,opt,name=label,proto3" json:"label,omitempty"`
+	Configuration        *BuildEventId_ConfigurationId `protobuf:"bytes,5,opt,name=configuration,proto3" json:"configuration,omitempty"`
+	Run                  int32                         `protobuf:"varint,2,opt,name=run,proto3" json:"run,omitempty"`
+	Shard                int32                         `protobuf:"varint,3,opt,name=shard,proto3" json:"shard,omitempty"`
+	Attempt              int32                         `protobuf:"varint,4,opt,name=attempt,proto3" json:"attempt,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
+	XXX_unrecognized     []byte                        `json:"-"`
+	XXX_sizecache        int32                         `json:"-"`
+}
+
+func (m *BuildEventId_TestResultId) Reset()         { *m = BuildEventId_TestResultId{} }
+func (m *BuildEventId_TestResultId) String() string { return proto.CompactTextString(m) }
+func (*BuildEventId_TestResultId) ProtoMessage()    {}
+func (*BuildEventId_TestResultId) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{0, 16}
+}
+
+func (m *BuildEventId_TestResultId) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BuildEventId_TestResultId.Unmarshal(m, b)
+}
+func (m *BuildEventId_TestResultId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BuildEventId_TestResultId.Marshal(b, m, deterministic)
+}
+func (m *BuildEventId_TestResultId) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BuildEventId_TestResultId.Merge(m, src)
+}
+func (m *BuildEventId_TestResultId) XXX_Size() int {
+	return xxx_messageInfo_BuildEventId_TestResultId.Size(m)
+}
+func (m *BuildEventId_TestResultId) XXX_DiscardUnknown() {
+	xxx_messageInfo_BuildEventId_TestResultId.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BuildEventId_TestResultId proto.InternalMessageInfo
+
+func (m *BuildEventId_TestResultId) GetLabel() string {
+	if m != nil {
+		return m.Label
+	}
+	return ""
+}
+
+func (m *BuildEventId_TestResultId) GetConfiguration() *BuildEventId_ConfigurationId {
+	if m != nil {
+		return m.Configuration
+	}
+	return nil
+}
+
+func (m *BuildEventId_TestResultId) GetRun() int32 {
+	if m != nil {
+		return m.Run
+	}
+	return 0
+}
+
+func (m *BuildEventId_TestResultId) GetShard() int32 {
+	if m != nil {
+		return m.Shard
+	}
+	return 0
+}
+
+func (m *BuildEventId_TestResultId) GetAttempt() int32 {
+	if m != nil {
+		return m.Attempt
+	}
+	return 0
+}
+
+// Identifier of an event reporting the summary of a test.
+type BuildEventId_TestSummaryId struct {
+	Label                string                        `protobuf:"bytes,1,opt,name=label,proto3" json:"label,omitempty"`
+	Configuration        *BuildEventId_ConfigurationId `protobuf:"bytes,2,opt,name=configuration,proto3" json:"configuration,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
+	XXX_unrecognized     []byte                        `json:"-"`
+	XXX_sizecache        int32                         `json:"-"`
+}
+
+func (m *BuildEventId_TestSummaryId) Reset()         { *m = BuildEventId_TestSummaryId{} }
+func (m *BuildEventId_TestSummaryId) String() string { return proto.CompactTextString(m) }
+func (*BuildEventId_TestSummaryId) ProtoMessage()    {}
+func (*BuildEventId_TestSummaryId) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{0, 17}
+}
+
+func (m *BuildEventId_TestSummaryId) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BuildEventId_TestSummaryId.Unmarshal(m, b)
+}
+func (m *BuildEventId_TestSummaryId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BuildEventId_TestSummaryId.Marshal(b, m, deterministic)
+}
+func (m *BuildEventId_TestSummaryId) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BuildEventId_TestSummaryId.Merge(m, src)
+}
+func (m *BuildEventId_TestSummaryId) XXX_Size() int {
+	return xxx_messageInfo_BuildEventId_TestSummaryId.Size(m)
+}
+func (m *BuildEventId_TestSummaryId) XXX_DiscardUnknown() {
+	xxx_messageInfo_BuildEventId_TestSummaryId.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BuildEventId_TestSummaryId proto.InternalMessageInfo
+
+func (m *BuildEventId_TestSummaryId) GetLabel() string {
+	if m != nil {
+		return m.Label
+	}
+	return ""
+}
+
+func (m *BuildEventId_TestSummaryId) GetConfiguration() *BuildEventId_ConfigurationId {
+	if m != nil {
+		return m.Configuration
+	}
+	return nil
+}
+
+// Identifier of the BuildFinished event, indicating the end of a build.
+type BuildEventId_BuildFinishedId struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BuildEventId_BuildFinishedId) Reset()         { *m = BuildEventId_BuildFinishedId{} }
+func (m *BuildEventId_BuildFinishedId) String() string { return proto.CompactTextString(m) }
+func (*BuildEventId_BuildFinishedId) ProtoMessage()    {}
+func (*BuildEventId_BuildFinishedId) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{0, 18}
+}
+
+func (m *BuildEventId_BuildFinishedId) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BuildEventId_BuildFinishedId.Unmarshal(m, b)
+}
+func (m *BuildEventId_BuildFinishedId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BuildEventId_BuildFinishedId.Marshal(b, m, deterministic)
+}
+func (m *BuildEventId_BuildFinishedId) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BuildEventId_BuildFinishedId.Merge(m, src)
+}
+func (m *BuildEventId_BuildFinishedId) XXX_Size() int {
+	return xxx_messageInfo_BuildEventId_BuildFinishedId.Size(m)
+}
+func (m *BuildEventId_BuildFinishedId) XXX_DiscardUnknown() {
+	xxx_messageInfo_BuildEventId_BuildFinishedId.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BuildEventId_BuildFinishedId proto.InternalMessageInfo
+
+// Identifier of an event providing additional logs/statistics after
+// completion of the build.
+type BuildEventId_BuildToolLogsId struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BuildEventId_BuildToolLogsId) Reset()         { *m = BuildEventId_BuildToolLogsId{} }
+func (m *BuildEventId_BuildToolLogsId) String() string { return proto.CompactTextString(m) }
+func (*BuildEventId_BuildToolLogsId) ProtoMessage()    {}
+func (*BuildEventId_BuildToolLogsId) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{0, 19}
+}
+
+func (m *BuildEventId_BuildToolLogsId) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BuildEventId_BuildToolLogsId.Unmarshal(m, b)
+}
+func (m *BuildEventId_BuildToolLogsId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BuildEventId_BuildToolLogsId.Marshal(b, m, deterministic)
+}
+func (m *BuildEventId_BuildToolLogsId) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BuildEventId_BuildToolLogsId.Merge(m, src)
+}
+func (m *BuildEventId_BuildToolLogsId) XXX_Size() int {
+	return xxx_messageInfo_BuildEventId_BuildToolLogsId.Size(m)
+}
+func (m *BuildEventId_BuildToolLogsId) XXX_DiscardUnknown() {
+	xxx_messageInfo_BuildEventId_BuildToolLogsId.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BuildEventId_BuildToolLogsId proto.InternalMessageInfo
+
+// Identifier of an event providing build metrics after completion
+// of the build.
+type BuildEventId_BuildMetricsId struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BuildEventId_BuildMetricsId) Reset()         { *m = BuildEventId_BuildMetricsId{} }
+func (m *BuildEventId_BuildMetricsId) String() string { return proto.CompactTextString(m) }
+func (*BuildEventId_BuildMetricsId) ProtoMessage()    {}
+func (*BuildEventId_BuildMetricsId) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{0, 20}
+}
+
+func (m *BuildEventId_BuildMetricsId) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BuildEventId_BuildMetricsId.Unmarshal(m, b)
+}
+func (m *BuildEventId_BuildMetricsId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BuildEventId_BuildMetricsId.Marshal(b, m, deterministic)
+}
+func (m *BuildEventId_BuildMetricsId) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BuildEventId_BuildMetricsId.Merge(m, src)
+}
+func (m *BuildEventId_BuildMetricsId) XXX_Size() int {
+	return xxx_messageInfo_BuildEventId_BuildMetricsId.Size(m)
+}
+func (m *BuildEventId_BuildMetricsId) XXX_DiscardUnknown() {
+	xxx_messageInfo_BuildEventId_BuildMetricsId.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BuildEventId_BuildMetricsId proto.InternalMessageInfo
+
+// Payload of an event summarizing the progress of the build so far. Those
+// events are also used to be parents of events where the more logical parent
+// event cannot be posted yet as the needed information is not yet complete.
+type Progress struct {
+	// The next chunk of stdout that bazel produced since the last progress event
+	// or the beginning of the build.
+	Stdout string `protobuf:"bytes,1,opt,name=stdout,proto3" json:"stdout,omitempty"`
+	// The next chunk of stderr that bazel produced since the last progress event
+	// or the beginning of the build.
+	Stderr               string   `protobuf:"bytes,2,opt,name=stderr,proto3" json:"stderr,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *Progress) Reset()         { *m = Progress{} }
+func (m *Progress) String() string { return proto.CompactTextString(m) }
+func (*Progress) ProtoMessage()    {}
+func (*Progress) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{1}
+}
+
+func (m *Progress) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Progress.Unmarshal(m, b)
+}
+func (m *Progress) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Progress.Marshal(b, m, deterministic)
+}
+func (m *Progress) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Progress.Merge(m, src)
+}
+func (m *Progress) XXX_Size() int {
+	return xxx_messageInfo_Progress.Size(m)
+}
+func (m *Progress) XXX_DiscardUnknown() {
+	xxx_messageInfo_Progress.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Progress proto.InternalMessageInfo
+
+func (m *Progress) GetStdout() string {
+	if m != nil {
+		return m.Stdout
+	}
+	return ""
+}
+
+func (m *Progress) GetStderr() string {
+	if m != nil {
+		return m.Stderr
+	}
+	return ""
+}
+
+// Payload of an event indicating that an expected event will not come, as
+// the build is aborted prematurely for some reason.
+type Aborted struct {
+	Reason Aborted_AbortReason `protobuf:"varint,1,opt,name=reason,proto3,enum=build_event_stream.Aborted_AbortReason" json:"reason,omitempty"`
+	// A human readable description with more details about there reason, where
+	// available and useful.
+	Description          string   `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *Aborted) Reset()         { *m = Aborted{} }
+func (m *Aborted) String() string { return proto.CompactTextString(m) }
+func (*Aborted) ProtoMessage()    {}
+func (*Aborted) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{2}
+}
+
+func (m *Aborted) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Aborted.Unmarshal(m, b)
+}
+func (m *Aborted) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Aborted.Marshal(b, m, deterministic)
+}
+func (m *Aborted) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Aborted.Merge(m, src)
+}
+func (m *Aborted) XXX_Size() int {
+	return xxx_messageInfo_Aborted.Size(m)
+}
+func (m *Aborted) XXX_DiscardUnknown() {
+	xxx_messageInfo_Aborted.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Aborted proto.InternalMessageInfo
+
+func (m *Aborted) GetReason() Aborted_AbortReason {
+	if m != nil {
+		return m.Reason
+	}
+	return Aborted_UNKNOWN
+}
+
+func (m *Aborted) GetDescription() string {
+	if m != nil {
+		return m.Description
+	}
+	return ""
+}
+
+// Payload of an event indicating the beginning of a new build. Usually, events
+// of those type start a new build-event stream. The target pattern requested
+// to be build is contained in one of the announced child events; it is an
+// invariant that precisely one of the announced child events has a non-empty
+// target pattern.
+type BuildStarted struct {
+	Uuid string `protobuf:"bytes,1,opt,name=uuid,proto3" json:"uuid,omitempty"`
+	// Start of the build in ms since the epoch.
+	// TODO(buchgr): Use google.protobuf.TimeStamp once bazel's protoc supports
+	// it.
+	StartTimeMillis int64 `protobuf:"varint,2,opt,name=start_time_millis,json=startTimeMillis,proto3" json:"start_time_millis,omitempty"`
+	// Version of the build tool that is running.
+	BuildToolVersion string `protobuf:"bytes,3,opt,name=build_tool_version,json=buildToolVersion,proto3" json:"build_tool_version,omitempty"`
+	// A human-readable description of all the non-default option settings
+	OptionsDescription string `protobuf:"bytes,4,opt,name=options_description,json=optionsDescription,proto3" json:"options_description,omitempty"`
+	// The name of the command that the user invoked.
+	Command string `protobuf:"bytes,5,opt,name=command,proto3" json:"command,omitempty"`
+	// The working directory from which the build tool was invoked.
+	WorkingDirectory string `protobuf:"bytes,6,opt,name=working_directory,json=workingDirectory,proto3" json:"working_directory,omitempty"`
+	// The directory of the workspace.
+	WorkspaceDirectory string `protobuf:"bytes,7,opt,name=workspace_directory,json=workspaceDirectory,proto3" json:"workspace_directory,omitempty"`
+	// The process ID of the Bazel server.
+	ServerPid            int64    `protobuf:"varint,8,opt,name=server_pid,json=serverPid,proto3" json:"server_pid,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BuildStarted) Reset()         { *m = BuildStarted{} }
+func (m *BuildStarted) String() string { return proto.CompactTextString(m) }
+func (*BuildStarted) ProtoMessage()    {}
+func (*BuildStarted) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{3}
+}
+
+func (m *BuildStarted) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BuildStarted.Unmarshal(m, b)
+}
+func (m *BuildStarted) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BuildStarted.Marshal(b, m, deterministic)
+}
+func (m *BuildStarted) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BuildStarted.Merge(m, src)
+}
+func (m *BuildStarted) XXX_Size() int {
+	return xxx_messageInfo_BuildStarted.Size(m)
+}
+func (m *BuildStarted) XXX_DiscardUnknown() {
+	xxx_messageInfo_BuildStarted.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BuildStarted proto.InternalMessageInfo
+
+func (m *BuildStarted) GetUuid() string {
+	if m != nil {
+		return m.Uuid
+	}
+	return ""
+}
+
+func (m *BuildStarted) GetStartTimeMillis() int64 {
+	if m != nil {
+		return m.StartTimeMillis
+	}
+	return 0
+}
+
+func (m *BuildStarted) GetBuildToolVersion() string {
+	if m != nil {
+		return m.BuildToolVersion
+	}
+	return ""
+}
+
+func (m *BuildStarted) GetOptionsDescription() string {
+	if m != nil {
+		return m.OptionsDescription
+	}
+	return ""
+}
+
+func (m *BuildStarted) GetCommand() string {
+	if m != nil {
+		return m.Command
+	}
+	return ""
+}
+
+func (m *BuildStarted) GetWorkingDirectory() string {
+	if m != nil {
+		return m.WorkingDirectory
+	}
+	return ""
+}
+
+func (m *BuildStarted) GetWorkspaceDirectory() string {
+	if m != nil {
+		return m.WorkspaceDirectory
+	}
+	return ""
+}
+
+func (m *BuildStarted) GetServerPid() int64 {
+	if m != nil {
+		return m.ServerPid
+	}
+	return 0
+}
+
+// Payload of an event reporting the command-line of the invocation as
+// originally received by the server. Note that this is not the command-line
+// given by the user, as the client adds information about the invocation,
+// like name and relevant entries of rc-files and client environment variables.
+// However, it does contain enough information to reproduce the build
+// invocation.
+type UnstructuredCommandLine struct {
+	Args                 []string `protobuf:"bytes,1,rep,name=args,proto3" json:"args,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *UnstructuredCommandLine) Reset()         { *m = UnstructuredCommandLine{} }
+func (m *UnstructuredCommandLine) String() string { return proto.CompactTextString(m) }
+func (*UnstructuredCommandLine) ProtoMessage()    {}
+func (*UnstructuredCommandLine) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{4}
+}
+
+func (m *UnstructuredCommandLine) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UnstructuredCommandLine.Unmarshal(m, b)
+}
+func (m *UnstructuredCommandLine) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UnstructuredCommandLine.Marshal(b, m, deterministic)
+}
+func (m *UnstructuredCommandLine) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UnstructuredCommandLine.Merge(m, src)
+}
+func (m *UnstructuredCommandLine) XXX_Size() int {
+	return xxx_messageInfo_UnstructuredCommandLine.Size(m)
+}
+func (m *UnstructuredCommandLine) XXX_DiscardUnknown() {
+	xxx_messageInfo_UnstructuredCommandLine.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UnstructuredCommandLine proto.InternalMessageInfo
+
+func (m *UnstructuredCommandLine) GetArgs() []string {
+	if m != nil {
+		return m.Args
+	}
+	return nil
+}
+
+// Payload of an event reporting on the parsed options, grouped in various ways.
+type OptionsParsed struct {
+	StartupOptions         []string                            `protobuf:"bytes,1,rep,name=startup_options,json=startupOptions,proto3" json:"startup_options,omitempty"`
+	ExplicitStartupOptions []string                            `protobuf:"bytes,2,rep,name=explicit_startup_options,json=explicitStartupOptions,proto3" json:"explicit_startup_options,omitempty"`
+	CmdLine                []string                            `protobuf:"bytes,3,rep,name=cmd_line,json=cmdLine,proto3" json:"cmd_line,omitempty"`
+	ExplicitCmdLine        []string                            `protobuf:"bytes,4,rep,name=explicit_cmd_line,json=explicitCmdLine,proto3" json:"explicit_cmd_line,omitempty"`
+	InvocationPolicy       *invocation_policy.InvocationPolicy `protobuf:"bytes,5,opt,name=invocation_policy,json=invocationPolicy,proto3" json:"invocation_policy,omitempty"`
+	ToolTag                string                              `protobuf:"bytes,6,opt,name=tool_tag,json=toolTag,proto3" json:"tool_tag,omitempty"`
+	XXX_NoUnkeyedLiteral   struct{}                            `json:"-"`
+	XXX_unrecognized       []byte                              `json:"-"`
+	XXX_sizecache          int32                               `json:"-"`
+}
+
+func (m *OptionsParsed) Reset()         { *m = OptionsParsed{} }
+func (m *OptionsParsed) String() string { return proto.CompactTextString(m) }
+func (*OptionsParsed) ProtoMessage()    {}
+func (*OptionsParsed) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{5}
+}
+
+func (m *OptionsParsed) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_OptionsParsed.Unmarshal(m, b)
+}
+func (m *OptionsParsed) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_OptionsParsed.Marshal(b, m, deterministic)
+}
+func (m *OptionsParsed) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_OptionsParsed.Merge(m, src)
+}
+func (m *OptionsParsed) XXX_Size() int {
+	return xxx_messageInfo_OptionsParsed.Size(m)
+}
+func (m *OptionsParsed) XXX_DiscardUnknown() {
+	xxx_messageInfo_OptionsParsed.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_OptionsParsed proto.InternalMessageInfo
+
+func (m *OptionsParsed) GetStartupOptions() []string {
+	if m != nil {
+		return m.StartupOptions
+	}
+	return nil
+}
+
+func (m *OptionsParsed) GetExplicitStartupOptions() []string {
+	if m != nil {
+		return m.ExplicitStartupOptions
+	}
+	return nil
+}
+
+func (m *OptionsParsed) GetCmdLine() []string {
+	if m != nil {
+		return m.CmdLine
+	}
+	return nil
+}
+
+func (m *OptionsParsed) GetExplicitCmdLine() []string {
+	if m != nil {
+		return m.ExplicitCmdLine
+	}
+	return nil
+}
+
+func (m *OptionsParsed) GetInvocationPolicy() *invocation_policy.InvocationPolicy {
+	if m != nil {
+		return m.InvocationPolicy
+	}
+	return nil
+}
+
+func (m *OptionsParsed) GetToolTag() string {
+	if m != nil {
+		return m.ToolTag
+	}
+	return ""
+}
+
+// Payload of an event indicating that an external resource was fetched. This
+// event will only occur in streams where an actual fetch happened, not in ones
+// where a cached copy of the entity to be fetched was used.
+type Fetch struct {
+	Success              bool     `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *Fetch) Reset()         { *m = Fetch{} }
+func (m *Fetch) String() string { return proto.CompactTextString(m) }
+func (*Fetch) ProtoMessage()    {}
+func (*Fetch) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{6}
+}
+
+func (m *Fetch) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Fetch.Unmarshal(m, b)
+}
+func (m *Fetch) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Fetch.Marshal(b, m, deterministic)
+}
+func (m *Fetch) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Fetch.Merge(m, src)
+}
+func (m *Fetch) XXX_Size() int {
+	return xxx_messageInfo_Fetch.Size(m)
+}
+func (m *Fetch) XXX_DiscardUnknown() {
+	xxx_messageInfo_Fetch.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Fetch proto.InternalMessageInfo
+
+func (m *Fetch) GetSuccess() bool {
+	if m != nil {
+		return m.Success
+	}
+	return false
+}
+
+// Payload of an event reporting the workspace status. Key-value pairs can be
+// provided by specifying the workspace_status_command to an executable that
+// returns one key-value pair per line of output (key and value separated by a
+// space).
+type WorkspaceStatus struct {
+	Item                 []*WorkspaceStatus_Item `protobuf:"bytes,1,rep,name=item,proto3" json:"item,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
+	XXX_unrecognized     []byte                  `json:"-"`
+	XXX_sizecache        int32                   `json:"-"`
+}
+
+func (m *WorkspaceStatus) Reset()         { *m = WorkspaceStatus{} }
+func (m *WorkspaceStatus) String() string { return proto.CompactTextString(m) }
+func (*WorkspaceStatus) ProtoMessage()    {}
+func (*WorkspaceStatus) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{7}
+}
+
+func (m *WorkspaceStatus) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_WorkspaceStatus.Unmarshal(m, b)
+}
+func (m *WorkspaceStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_WorkspaceStatus.Marshal(b, m, deterministic)
+}
+func (m *WorkspaceStatus) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_WorkspaceStatus.Merge(m, src)
+}
+func (m *WorkspaceStatus) XXX_Size() int {
+	return xxx_messageInfo_WorkspaceStatus.Size(m)
+}
+func (m *WorkspaceStatus) XXX_DiscardUnknown() {
+	xxx_messageInfo_WorkspaceStatus.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_WorkspaceStatus proto.InternalMessageInfo
+
+func (m *WorkspaceStatus) GetItem() []*WorkspaceStatus_Item {
+	if m != nil {
+		return m.Item
+	}
+	return nil
+}
+
+type WorkspaceStatus_Item struct {
+	Key                  string   `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
+	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 *WorkspaceStatus_Item) Reset()         { *m = WorkspaceStatus_Item{} }
+func (m *WorkspaceStatus_Item) String() string { return proto.CompactTextString(m) }
+func (*WorkspaceStatus_Item) ProtoMessage()    {}
+func (*WorkspaceStatus_Item) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{7, 0}
+}
+
+func (m *WorkspaceStatus_Item) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_WorkspaceStatus_Item.Unmarshal(m, b)
+}
+func (m *WorkspaceStatus_Item) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_WorkspaceStatus_Item.Marshal(b, m, deterministic)
+}
+func (m *WorkspaceStatus_Item) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_WorkspaceStatus_Item.Merge(m, src)
+}
+func (m *WorkspaceStatus_Item) XXX_Size() int {
+	return xxx_messageInfo_WorkspaceStatus_Item.Size(m)
+}
+func (m *WorkspaceStatus_Item) XXX_DiscardUnknown() {
+	xxx_messageInfo_WorkspaceStatus_Item.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_WorkspaceStatus_Item proto.InternalMessageInfo
+
+func (m *WorkspaceStatus_Item) GetKey() string {
+	if m != nil {
+		return m.Key
+	}
+	return ""
+}
+
+func (m *WorkspaceStatus_Item) GetValue() string {
+	if m != nil {
+		return m.Value
+	}
+	return ""
+}
+
+// Payload of an event reporting details of a given configuration.
+type Configuration struct {
+	Mnemonic             string            `protobuf:"bytes,1,opt,name=mnemonic,proto3" json:"mnemonic,omitempty"`
+	PlatformName         string            `protobuf:"bytes,2,opt,name=platform_name,json=platformName,proto3" json:"platform_name,omitempty"`
+	Cpu                  string            `protobuf:"bytes,3,opt,name=cpu,proto3" json:"cpu,omitempty"`
+	MakeVariable         map[string]string `protobuf:"bytes,4,rep,name=make_variable,json=makeVariable,proto3" json:"make_variable,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
+	XXX_unrecognized     []byte            `json:"-"`
+	XXX_sizecache        int32             `json:"-"`
+}
+
+func (m *Configuration) Reset()         { *m = Configuration{} }
+func (m *Configuration) String() string { return proto.CompactTextString(m) }
+func (*Configuration) ProtoMessage()    {}
+func (*Configuration) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{8}
+}
+
+func (m *Configuration) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Configuration.Unmarshal(m, b)
+}
+func (m *Configuration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Configuration.Marshal(b, m, deterministic)
+}
+func (m *Configuration) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Configuration.Merge(m, src)
+}
+func (m *Configuration) XXX_Size() int {
+	return xxx_messageInfo_Configuration.Size(m)
+}
+func (m *Configuration) XXX_DiscardUnknown() {
+	xxx_messageInfo_Configuration.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Configuration proto.InternalMessageInfo
+
+func (m *Configuration) GetMnemonic() string {
+	if m != nil {
+		return m.Mnemonic
+	}
+	return ""
+}
+
+func (m *Configuration) GetPlatformName() string {
+	if m != nil {
+		return m.PlatformName
+	}
+	return ""
+}
+
+func (m *Configuration) GetCpu() string {
+	if m != nil {
+		return m.Cpu
+	}
+	return ""
+}
+
+func (m *Configuration) GetMakeVariable() map[string]string {
+	if m != nil {
+		return m.MakeVariable
+	}
+	return nil
+}
+
+// Payload of the event indicating the expansion of a target pattern.
+// The main information is in the chaining part: the id will contain the
+// target pattern that was expanded and the children id will contain the
+// target or target pattern it was expanded to.
+type PatternExpanded struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *PatternExpanded) Reset()         { *m = PatternExpanded{} }
+func (m *PatternExpanded) String() string { return proto.CompactTextString(m) }
+func (*PatternExpanded) ProtoMessage()    {}
+func (*PatternExpanded) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{9}
+}
+
+func (m *PatternExpanded) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PatternExpanded.Unmarshal(m, b)
+}
+func (m *PatternExpanded) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PatternExpanded.Marshal(b, m, deterministic)
+}
+func (m *PatternExpanded) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PatternExpanded.Merge(m, src)
+}
+func (m *PatternExpanded) XXX_Size() int {
+	return xxx_messageInfo_PatternExpanded.Size(m)
+}
+func (m *PatternExpanded) XXX_DiscardUnknown() {
+	xxx_messageInfo_PatternExpanded.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PatternExpanded proto.InternalMessageInfo
+
+// Payload of the event indicating that the configurations for a target have
+// been identified. As with pattern expansion the main information is in the
+// chaining part: the id will contain the target that was configured and the
+// children id will contain the configured targets it was configured to.
+type TargetConfigured struct {
+	// The kind of target (e.g.,  e.g. "cc_library rule", "source file",
+	// "generated file") where the completion is reported.
+	TargetKind string `protobuf:"bytes,1,opt,name=target_kind,json=targetKind,proto3" json:"target_kind,omitempty"`
+	// The size of the test, if the target is a test target. Unset otherwise.
+	TestSize TestSize `protobuf:"varint,2,opt,name=test_size,json=testSize,proto3,enum=build_event_stream.TestSize" json:"test_size,omitempty"`
+	// List of all tags associated with this target (for all possible
+	// configurations).
+	Tag                  []string `protobuf:"bytes,3,rep,name=tag,proto3" json:"tag,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *TargetConfigured) Reset()         { *m = TargetConfigured{} }
+func (m *TargetConfigured) String() string { return proto.CompactTextString(m) }
+func (*TargetConfigured) ProtoMessage()    {}
+func (*TargetConfigured) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{10}
+}
+
+func (m *TargetConfigured) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TargetConfigured.Unmarshal(m, b)
+}
+func (m *TargetConfigured) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TargetConfigured.Marshal(b, m, deterministic)
+}
+func (m *TargetConfigured) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TargetConfigured.Merge(m, src)
+}
+func (m *TargetConfigured) XXX_Size() int {
+	return xxx_messageInfo_TargetConfigured.Size(m)
+}
+func (m *TargetConfigured) XXX_DiscardUnknown() {
+	xxx_messageInfo_TargetConfigured.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TargetConfigured proto.InternalMessageInfo
+
+func (m *TargetConfigured) GetTargetKind() string {
+	if m != nil {
+		return m.TargetKind
+	}
+	return ""
+}
+
+func (m *TargetConfigured) GetTestSize() TestSize {
+	if m != nil {
+		return m.TestSize
+	}
+	return TestSize_UNKNOWN
+}
+
+func (m *TargetConfigured) GetTag() []string {
+	if m != nil {
+		return m.Tag
+	}
+	return nil
+}
+
+type File struct {
+	// identifier indicating the nature of the file (e.g., "stdout", "stderr")
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	// Types that are valid to be assigned to File:
+	//	*File_Uri
+	//	*File_Contents
+	File                 isFile_File `protobuf_oneof:"file"`
+	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
+	XXX_unrecognized     []byte      `json:"-"`
+	XXX_sizecache        int32       `json:"-"`
+}
+
+func (m *File) Reset()         { *m = File{} }
+func (m *File) String() string { return proto.CompactTextString(m) }
+func (*File) ProtoMessage()    {}
+func (*File) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{11}
+}
+
+func (m *File) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_File.Unmarshal(m, b)
+}
+func (m *File) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_File.Marshal(b, m, deterministic)
+}
+func (m *File) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_File.Merge(m, src)
+}
+func (m *File) XXX_Size() int {
+	return xxx_messageInfo_File.Size(m)
+}
+func (m *File) XXX_DiscardUnknown() {
+	xxx_messageInfo_File.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_File proto.InternalMessageInfo
+
+func (m *File) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+type isFile_File interface {
+	isFile_File()
+}
+
+type File_Uri struct {
+	Uri string `protobuf:"bytes,2,opt,name=uri,proto3,oneof"`
+}
+
+type File_Contents struct {
+	Contents []byte `protobuf:"bytes,3,opt,name=contents,proto3,oneof"`
+}
+
+func (*File_Uri) isFile_File() {}
+
+func (*File_Contents) isFile_File() {}
+
+func (m *File) GetFile() isFile_File {
+	if m != nil {
+		return m.File
+	}
+	return nil
+}
+
+func (m *File) GetUri() string {
+	if x, ok := m.GetFile().(*File_Uri); ok {
+		return x.Uri
+	}
+	return ""
+}
+
+func (m *File) GetContents() []byte {
+	if x, ok := m.GetFile().(*File_Contents); ok {
+		return x.Contents
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*File) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*File_Uri)(nil),
+		(*File_Contents)(nil),
+	}
+}
+
+// Payload of a message to describe a set of files, usually build artifacts, to
+// be referred to later by their name. In this way, files that occur identically
+// as outputs of several targets have to be named only once.
+type NamedSetOfFiles struct {
+	// Files that belong to this named set of files.
+	Files []*File `protobuf:"bytes,1,rep,name=files,proto3" json:"files,omitempty"`
+	// Other named sets whose members also belong to this set.
+	FileSets             []*BuildEventId_NamedSetOfFilesId `protobuf:"bytes,2,rep,name=file_sets,json=fileSets,proto3" json:"file_sets,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                          `json:"-"`
+	XXX_unrecognized     []byte                            `json:"-"`
+	XXX_sizecache        int32                             `json:"-"`
+}
+
+func (m *NamedSetOfFiles) Reset()         { *m = NamedSetOfFiles{} }
+func (m *NamedSetOfFiles) String() string { return proto.CompactTextString(m) }
+func (*NamedSetOfFiles) ProtoMessage()    {}
+func (*NamedSetOfFiles) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{12}
+}
+
+func (m *NamedSetOfFiles) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_NamedSetOfFiles.Unmarshal(m, b)
+}
+func (m *NamedSetOfFiles) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_NamedSetOfFiles.Marshal(b, m, deterministic)
+}
+func (m *NamedSetOfFiles) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_NamedSetOfFiles.Merge(m, src)
+}
+func (m *NamedSetOfFiles) XXX_Size() int {
+	return xxx_messageInfo_NamedSetOfFiles.Size(m)
+}
+func (m *NamedSetOfFiles) XXX_DiscardUnknown() {
+	xxx_messageInfo_NamedSetOfFiles.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_NamedSetOfFiles proto.InternalMessageInfo
+
+func (m *NamedSetOfFiles) GetFiles() []*File {
+	if m != nil {
+		return m.Files
+	}
+	return nil
+}
+
+func (m *NamedSetOfFiles) GetFileSets() []*BuildEventId_NamedSetOfFilesId {
+	if m != nil {
+		return m.FileSets
+	}
+	return nil
+}
+
+// Payload of the event indicating the completion of an action. The main purpose
+// of posting those events is to provide details on the root cause for a target
+// failing; however, consumers of the build-event protocol must not assume
+// that only failed actions are posted.
+type ActionExecuted struct {
+	Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"`
+	// The mnemonic of the action that was executed
+	Type string `protobuf:"bytes,8,opt,name=type,proto3" json:"type,omitempty"`
+	// The exit code of the action, if it is available.
+	ExitCode int32 `protobuf:"varint,2,opt,name=exit_code,json=exitCode,proto3" json:"exit_code,omitempty"`
+	// Location where to find the standard output of the action
+	// (e.g., a file path).
+	Stdout *File `protobuf:"bytes,3,opt,name=stdout,proto3" json:"stdout,omitempty"`
+	// Location where to find the standard error of the action
+	// (e.g., a file path).
+	Stderr *File `protobuf:"bytes,4,opt,name=stderr,proto3" json:"stderr,omitempty"`
+	// Deprecated. This field is now present on ActionCompletedId.
+	Label string `protobuf:"bytes,5,opt,name=label,proto3" json:"label,omitempty"` // Deprecated: Do not use.
+	// Deprecated. This field is now present on ActionCompletedId.
+	Configuration *BuildEventId_ConfigurationId `protobuf:"bytes,7,opt,name=configuration,proto3" json:"configuration,omitempty"` // Deprecated: Do not use.
+	// Primary output; only provided for successful actions.
+	PrimaryOutput *File `protobuf:"bytes,6,opt,name=primary_output,json=primaryOutput,proto3" json:"primary_output,omitempty"`
+	// The command-line of the action, if the action is a command.
+	CommandLine          []string `protobuf:"bytes,9,rep,name=command_line,json=commandLine,proto3" json:"command_line,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ActionExecuted) Reset()         { *m = ActionExecuted{} }
+func (m *ActionExecuted) String() string { return proto.CompactTextString(m) }
+func (*ActionExecuted) ProtoMessage()    {}
+func (*ActionExecuted) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{13}
+}
+
+func (m *ActionExecuted) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ActionExecuted.Unmarshal(m, b)
+}
+func (m *ActionExecuted) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ActionExecuted.Marshal(b, m, deterministic)
+}
+func (m *ActionExecuted) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ActionExecuted.Merge(m, src)
+}
+func (m *ActionExecuted) XXX_Size() int {
+	return xxx_messageInfo_ActionExecuted.Size(m)
+}
+func (m *ActionExecuted) XXX_DiscardUnknown() {
+	xxx_messageInfo_ActionExecuted.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ActionExecuted proto.InternalMessageInfo
+
+func (m *ActionExecuted) GetSuccess() bool {
+	if m != nil {
+		return m.Success
+	}
+	return false
+}
+
+func (m *ActionExecuted) GetType() string {
+	if m != nil {
+		return m.Type
+	}
+	return ""
+}
+
+func (m *ActionExecuted) GetExitCode() int32 {
+	if m != nil {
+		return m.ExitCode
+	}
+	return 0
+}
+
+func (m *ActionExecuted) GetStdout() *File {
+	if m != nil {
+		return m.Stdout
+	}
+	return nil
+}
+
+func (m *ActionExecuted) GetStderr() *File {
+	if m != nil {
+		return m.Stderr
+	}
+	return nil
+}
+
+// Deprecated: Do not use.
+func (m *ActionExecuted) GetLabel() string {
+	if m != nil {
+		return m.Label
+	}
+	return ""
+}
+
+// Deprecated: Do not use.
+func (m *ActionExecuted) GetConfiguration() *BuildEventId_ConfigurationId {
+	if m != nil {
+		return m.Configuration
+	}
+	return nil
+}
+
+func (m *ActionExecuted) GetPrimaryOutput() *File {
+	if m != nil {
+		return m.PrimaryOutput
+	}
+	return nil
+}
+
+func (m *ActionExecuted) GetCommandLine() []string {
+	if m != nil {
+		return m.CommandLine
+	}
+	return nil
+}
+
+// Collection of all output files belonging to that output group.
+type OutputGroup struct {
+	// Name of the output group
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	// List of file sets that belong to this output group as well.
+	FileSets             []*BuildEventId_NamedSetOfFilesId `protobuf:"bytes,3,rep,name=file_sets,json=fileSets,proto3" json:"file_sets,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                          `json:"-"`
+	XXX_unrecognized     []byte                            `json:"-"`
+	XXX_sizecache        int32                             `json:"-"`
+}
+
+func (m *OutputGroup) Reset()         { *m = OutputGroup{} }
+func (m *OutputGroup) String() string { return proto.CompactTextString(m) }
+func (*OutputGroup) ProtoMessage()    {}
+func (*OutputGroup) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{14}
+}
+
+func (m *OutputGroup) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_OutputGroup.Unmarshal(m, b)
+}
+func (m *OutputGroup) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_OutputGroup.Marshal(b, m, deterministic)
+}
+func (m *OutputGroup) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_OutputGroup.Merge(m, src)
+}
+func (m *OutputGroup) XXX_Size() int {
+	return xxx_messageInfo_OutputGroup.Size(m)
+}
+func (m *OutputGroup) XXX_DiscardUnknown() {
+	xxx_messageInfo_OutputGroup.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_OutputGroup proto.InternalMessageInfo
+
+func (m *OutputGroup) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func (m *OutputGroup) GetFileSets() []*BuildEventId_NamedSetOfFilesId {
+	if m != nil {
+		return m.FileSets
+	}
+	return nil
+}
+
+// Payload of the event indicating the completion of a target. The target is
+// specified in the id. If the target failed the root causes are provided as
+// children events.
+type TargetComplete struct {
+	Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"`
+	// The kind of target (e.g.,  e.g. "cc_library rule", "source file",
+	// "generated file") where the completion is reported.
+	// Deprecated: use the target_kind field in TargetConfigured instead.
+	TargetKind string `protobuf:"bytes,5,opt,name=target_kind,json=targetKind,proto3" json:"target_kind,omitempty"` // Deprecated: Do not use.
+	// The size of the test, if the target is a test target. Unset otherwise.
+	// Deprecated: use the test_size field in TargetConfigured instead.
+	TestSize TestSize `protobuf:"varint,6,opt,name=test_size,json=testSize,proto3,enum=build_event_stream.TestSize" json:"test_size,omitempty"` // Deprecated: Do not use.
+	// The output files are arranged by their output group. If an output file
+	// is part of multiple output groups, it appears once in each output
+	// group.
+	OutputGroup []*OutputGroup `protobuf:"bytes,2,rep,name=output_group,json=outputGroup,proto3" json:"output_group,omitempty"`
+	// Temporarily, also report the important outputs directly. This is only to
+	// allow existing clients help transition to the deduplicated representation;
+	// new clients should not use it.
+	ImportantOutput []*File `protobuf:"bytes,4,rep,name=important_output,json=importantOutput,proto3" json:"important_output,omitempty"` // Deprecated: Do not use.
+	// List of tags associated with this configured target.
+	Tag []string `protobuf:"bytes,3,rep,name=tag,proto3" json:"tag,omitempty"`
+	// The timeout specified for test actions under this configured target.
+	TestTimeoutSeconds   int64    `protobuf:"varint,7,opt,name=test_timeout_seconds,json=testTimeoutSeconds,proto3" json:"test_timeout_seconds,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *TargetComplete) Reset()         { *m = TargetComplete{} }
+func (m *TargetComplete) String() string { return proto.CompactTextString(m) }
+func (*TargetComplete) ProtoMessage()    {}
+func (*TargetComplete) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{15}
+}
+
+func (m *TargetComplete) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TargetComplete.Unmarshal(m, b)
+}
+func (m *TargetComplete) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TargetComplete.Marshal(b, m, deterministic)
+}
+func (m *TargetComplete) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TargetComplete.Merge(m, src)
+}
+func (m *TargetComplete) XXX_Size() int {
+	return xxx_messageInfo_TargetComplete.Size(m)
+}
+func (m *TargetComplete) XXX_DiscardUnknown() {
+	xxx_messageInfo_TargetComplete.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TargetComplete proto.InternalMessageInfo
+
+func (m *TargetComplete) GetSuccess() bool {
+	if m != nil {
+		return m.Success
+	}
+	return false
+}
+
+// Deprecated: Do not use.
+func (m *TargetComplete) GetTargetKind() string {
+	if m != nil {
+		return m.TargetKind
+	}
+	return ""
+}
+
+// Deprecated: Do not use.
+func (m *TargetComplete) GetTestSize() TestSize {
+	if m != nil {
+		return m.TestSize
+	}
+	return TestSize_UNKNOWN
+}
+
+func (m *TargetComplete) GetOutputGroup() []*OutputGroup {
+	if m != nil {
+		return m.OutputGroup
+	}
+	return nil
+}
+
+// Deprecated: Do not use.
+func (m *TargetComplete) GetImportantOutput() []*File {
+	if m != nil {
+		return m.ImportantOutput
+	}
+	return nil
+}
+
+func (m *TargetComplete) GetTag() []string {
+	if m != nil {
+		return m.Tag
+	}
+	return nil
+}
+
+func (m *TargetComplete) GetTestTimeoutSeconds() int64 {
+	if m != nil {
+		return m.TestTimeoutSeconds
+	}
+	return 0
+}
+
+// Payload on events reporting about individual test action.
+type TestResult struct {
+	// The status of this test.
+	Status TestStatus `protobuf:"varint,5,opt,name=status,proto3,enum=build_event_stream.TestStatus" json:"status,omitempty"`
+	// Additional details about the status of the test. This is intended for
+	// user display and must not be parsed.
+	StatusDetails string `protobuf:"bytes,9,opt,name=status_details,json=statusDetails,proto3" json:"status_details,omitempty"`
+	// True, if the reported attempt is taken from the tool's local cache.
+	CachedLocally bool `protobuf:"varint,4,opt,name=cached_locally,json=cachedLocally,proto3" json:"cached_locally,omitempty"`
+	// Time in milliseconds since the epoch at which the test attempt was started.
+	// Note: for cached test results, this is time can be before the start of the
+	// build.
+	TestAttemptStartMillisEpoch int64 `protobuf:"varint,6,opt,name=test_attempt_start_millis_epoch,json=testAttemptStartMillisEpoch,proto3" json:"test_attempt_start_millis_epoch,omitempty"`
+	// Time the test took to run. For locally cached results, this is the time
+	// the cached invocation took when it was invoked.
+	TestAttemptDurationMillis int64 `protobuf:"varint,3,opt,name=test_attempt_duration_millis,json=testAttemptDurationMillis,proto3" json:"test_attempt_duration_millis,omitempty"`
+	// Files (logs, test.xml, undeclared outputs, etc) generated by that test
+	// action.
+	TestActionOutput []*File `protobuf:"bytes,2,rep,name=test_action_output,json=testActionOutput,proto3" json:"test_action_output,omitempty"`
+	// Warnings generated by that test action.
+	Warning              []string                  `protobuf:"bytes,7,rep,name=warning,proto3" json:"warning,omitempty"`
+	ExecutionInfo        *TestResult_ExecutionInfo `protobuf:"bytes,8,opt,name=execution_info,json=executionInfo,proto3" json:"execution_info,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
+	XXX_unrecognized     []byte                    `json:"-"`
+	XXX_sizecache        int32                     `json:"-"`
+}
+
+func (m *TestResult) Reset()         { *m = TestResult{} }
+func (m *TestResult) String() string { return proto.CompactTextString(m) }
+func (*TestResult) ProtoMessage()    {}
+func (*TestResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{16}
+}
+
+func (m *TestResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TestResult.Unmarshal(m, b)
+}
+func (m *TestResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TestResult.Marshal(b, m, deterministic)
+}
+func (m *TestResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TestResult.Merge(m, src)
+}
+func (m *TestResult) XXX_Size() int {
+	return xxx_messageInfo_TestResult.Size(m)
+}
+func (m *TestResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_TestResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TestResult proto.InternalMessageInfo
+
+func (m *TestResult) GetStatus() TestStatus {
+	if m != nil {
+		return m.Status
+	}
+	return TestStatus_NO_STATUS
+}
+
+func (m *TestResult) GetStatusDetails() string {
+	if m != nil {
+		return m.StatusDetails
+	}
+	return ""
+}
+
+func (m *TestResult) GetCachedLocally() bool {
+	if m != nil {
+		return m.CachedLocally
+	}
+	return false
+}
+
+func (m *TestResult) GetTestAttemptStartMillisEpoch() int64 {
+	if m != nil {
+		return m.TestAttemptStartMillisEpoch
+	}
+	return 0
+}
+
+func (m *TestResult) GetTestAttemptDurationMillis() int64 {
+	if m != nil {
+		return m.TestAttemptDurationMillis
+	}
+	return 0
+}
+
+func (m *TestResult) GetTestActionOutput() []*File {
+	if m != nil {
+		return m.TestActionOutput
+	}
+	return nil
+}
+
+func (m *TestResult) GetWarning() []string {
+	if m != nil {
+		return m.Warning
+	}
+	return nil
+}
+
+func (m *TestResult) GetExecutionInfo() *TestResult_ExecutionInfo {
+	if m != nil {
+		return m.ExecutionInfo
+	}
+	return nil
+}
+
+// Message providing optional meta data on the execution of the test action,
+// if available.
+type TestResult_ExecutionInfo struct {
+	// Deprecated, use TargetComplete.test_timeout_seconds instead.
+	TimeoutSeconds int32 `protobuf:"varint,1,opt,name=timeout_seconds,json=timeoutSeconds,proto3" json:"timeout_seconds,omitempty"` // Deprecated: Do not use.
+	// Name of the strategy to execute this test action (e.g., "local",
+	// "remote")
+	Strategy string `protobuf:"bytes,2,opt,name=strategy,proto3" json:"strategy,omitempty"`
+	// True, if the reported attempt was a cache hit in a remote cache.
+	CachedRemotely bool `protobuf:"varint,6,opt,name=cached_remotely,json=cachedRemotely,proto3" json:"cached_remotely,omitempty"`
+	// The exit code of the test action.
+	ExitCode int32 `protobuf:"varint,7,opt,name=exit_code,json=exitCode,proto3" json:"exit_code,omitempty"`
+	// The hostname of the machine where the test action was executed (in case
+	// of remote execution), if known.
+	Hostname             string                                    `protobuf:"bytes,3,opt,name=hostname,proto3" json:"hostname,omitempty"`
+	TimingBreakdown      *TestResult_ExecutionInfo_TimingBreakdown `protobuf:"bytes,4,opt,name=timing_breakdown,json=timingBreakdown,proto3" json:"timing_breakdown,omitempty"`
+	ResourceUsage        []*TestResult_ExecutionInfo_ResourceUsage `protobuf:"bytes,5,rep,name=resource_usage,json=resourceUsage,proto3" json:"resource_usage,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                  `json:"-"`
+	XXX_unrecognized     []byte                                    `json:"-"`
+	XXX_sizecache        int32                                     `json:"-"`
+}
+
+func (m *TestResult_ExecutionInfo) Reset()         { *m = TestResult_ExecutionInfo{} }
+func (m *TestResult_ExecutionInfo) String() string { return proto.CompactTextString(m) }
+func (*TestResult_ExecutionInfo) ProtoMessage()    {}
+func (*TestResult_ExecutionInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{16, 0}
+}
+
+func (m *TestResult_ExecutionInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TestResult_ExecutionInfo.Unmarshal(m, b)
+}
+func (m *TestResult_ExecutionInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TestResult_ExecutionInfo.Marshal(b, m, deterministic)
+}
+func (m *TestResult_ExecutionInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TestResult_ExecutionInfo.Merge(m, src)
+}
+func (m *TestResult_ExecutionInfo) XXX_Size() int {
+	return xxx_messageInfo_TestResult_ExecutionInfo.Size(m)
+}
+func (m *TestResult_ExecutionInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_TestResult_ExecutionInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TestResult_ExecutionInfo proto.InternalMessageInfo
+
+// Deprecated: Do not use.
+func (m *TestResult_ExecutionInfo) GetTimeoutSeconds() int32 {
+	if m != nil {
+		return m.TimeoutSeconds
+	}
+	return 0
+}
+
+func (m *TestResult_ExecutionInfo) GetStrategy() string {
+	if m != nil {
+		return m.Strategy
+	}
+	return ""
+}
+
+func (m *TestResult_ExecutionInfo) GetCachedRemotely() bool {
+	if m != nil {
+		return m.CachedRemotely
+	}
+	return false
+}
+
+func (m *TestResult_ExecutionInfo) GetExitCode() int32 {
+	if m != nil {
+		return m.ExitCode
+	}
+	return 0
+}
+
+func (m *TestResult_ExecutionInfo) GetHostname() string {
+	if m != nil {
+		return m.Hostname
+	}
+	return ""
+}
+
+func (m *TestResult_ExecutionInfo) GetTimingBreakdown() *TestResult_ExecutionInfo_TimingBreakdown {
+	if m != nil {
+		return m.TimingBreakdown
+	}
+	return nil
+}
+
+func (m *TestResult_ExecutionInfo) GetResourceUsage() []*TestResult_ExecutionInfo_ResourceUsage {
+	if m != nil {
+		return m.ResourceUsage
+	}
+	return nil
+}
+
+// Represents a hierarchical timing breakdown of an activity.
+// The top level time should be the total time of the activity.
+// Invariant: time_millis >= sum of time_millis of all direct children.
+type TestResult_ExecutionInfo_TimingBreakdown struct {
+	Child                []*TestResult_ExecutionInfo_TimingBreakdown `protobuf:"bytes,1,rep,name=child,proto3" json:"child,omitempty"`
+	Name                 string                                      `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
+	TimeMillis           int64                                       `protobuf:"varint,3,opt,name=time_millis,json=timeMillis,proto3" json:"time_millis,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                    `json:"-"`
+	XXX_unrecognized     []byte                                      `json:"-"`
+	XXX_sizecache        int32                                       `json:"-"`
+}
+
+func (m *TestResult_ExecutionInfo_TimingBreakdown) Reset() {
+	*m = TestResult_ExecutionInfo_TimingBreakdown{}
+}
+func (m *TestResult_ExecutionInfo_TimingBreakdown) String() string { return proto.CompactTextString(m) }
+func (*TestResult_ExecutionInfo_TimingBreakdown) ProtoMessage()    {}
+func (*TestResult_ExecutionInfo_TimingBreakdown) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{16, 0, 0}
+}
+
+func (m *TestResult_ExecutionInfo_TimingBreakdown) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TestResult_ExecutionInfo_TimingBreakdown.Unmarshal(m, b)
+}
+func (m *TestResult_ExecutionInfo_TimingBreakdown) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TestResult_ExecutionInfo_TimingBreakdown.Marshal(b, m, deterministic)
+}
+func (m *TestResult_ExecutionInfo_TimingBreakdown) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TestResult_ExecutionInfo_TimingBreakdown.Merge(m, src)
+}
+func (m *TestResult_ExecutionInfo_TimingBreakdown) XXX_Size() int {
+	return xxx_messageInfo_TestResult_ExecutionInfo_TimingBreakdown.Size(m)
+}
+func (m *TestResult_ExecutionInfo_TimingBreakdown) XXX_DiscardUnknown() {
+	xxx_messageInfo_TestResult_ExecutionInfo_TimingBreakdown.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TestResult_ExecutionInfo_TimingBreakdown proto.InternalMessageInfo
+
+func (m *TestResult_ExecutionInfo_TimingBreakdown) GetChild() []*TestResult_ExecutionInfo_TimingBreakdown {
+	if m != nil {
+		return m.Child
+	}
+	return nil
+}
+
+func (m *TestResult_ExecutionInfo_TimingBreakdown) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func (m *TestResult_ExecutionInfo_TimingBreakdown) GetTimeMillis() int64 {
+	if m != nil {
+		return m.TimeMillis
+	}
+	return 0
+}
+
+type TestResult_ExecutionInfo_ResourceUsage struct {
+	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	Value                int64    `protobuf:"varint,2,opt,name=value,proto3" json:"value,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *TestResult_ExecutionInfo_ResourceUsage) Reset() {
+	*m = TestResult_ExecutionInfo_ResourceUsage{}
+}
+func (m *TestResult_ExecutionInfo_ResourceUsage) String() string { return proto.CompactTextString(m) }
+func (*TestResult_ExecutionInfo_ResourceUsage) ProtoMessage()    {}
+func (*TestResult_ExecutionInfo_ResourceUsage) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{16, 0, 1}
+}
+
+func (m *TestResult_ExecutionInfo_ResourceUsage) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TestResult_ExecutionInfo_ResourceUsage.Unmarshal(m, b)
+}
+func (m *TestResult_ExecutionInfo_ResourceUsage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TestResult_ExecutionInfo_ResourceUsage.Marshal(b, m, deterministic)
+}
+func (m *TestResult_ExecutionInfo_ResourceUsage) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TestResult_ExecutionInfo_ResourceUsage.Merge(m, src)
+}
+func (m *TestResult_ExecutionInfo_ResourceUsage) XXX_Size() int {
+	return xxx_messageInfo_TestResult_ExecutionInfo_ResourceUsage.Size(m)
+}
+func (m *TestResult_ExecutionInfo_ResourceUsage) XXX_DiscardUnknown() {
+	xxx_messageInfo_TestResult_ExecutionInfo_ResourceUsage.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TestResult_ExecutionInfo_ResourceUsage proto.InternalMessageInfo
+
+func (m *TestResult_ExecutionInfo_ResourceUsage) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func (m *TestResult_ExecutionInfo_ResourceUsage) GetValue() int64 {
+	if m != nil {
+		return m.Value
+	}
+	return 0
+}
+
+// Payload of the event summarizing a test.
+// TODO(aehlig): extend event with additional information as soon as we known
+// which additional information we need for test summaries.
+type TestSummary struct {
+	// Wrapper around BlazeTestStatus to support importing that enum to proto3.
+	// Overall status of test, accumulated over all runs, shards, and attempts.
+	OverallStatus TestStatus `protobuf:"varint,5,opt,name=overall_status,json=overallStatus,proto3,enum=build_event_stream.TestStatus" json:"overall_status,omitempty"`
+	// Total number of runs
+	TotalRunCount int32 `protobuf:"varint,1,opt,name=total_run_count,json=totalRunCount,proto3" json:"total_run_count,omitempty"`
+	// Path to logs of passed runs.
+	Passed []*File `protobuf:"bytes,3,rep,name=passed,proto3" json:"passed,omitempty"`
+	// Path to logs of failed runs;
+	Failed []*File `protobuf:"bytes,4,rep,name=failed,proto3" json:"failed,omitempty"`
+	// Total number of cached test actions
+	TotalNumCached       int32    `protobuf:"varint,6,opt,name=total_num_cached,json=totalNumCached,proto3" json:"total_num_cached,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *TestSummary) Reset()         { *m = TestSummary{} }
+func (m *TestSummary) String() string { return proto.CompactTextString(m) }
+func (*TestSummary) ProtoMessage()    {}
+func (*TestSummary) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{17}
+}
+
+func (m *TestSummary) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TestSummary.Unmarshal(m, b)
+}
+func (m *TestSummary) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TestSummary.Marshal(b, m, deterministic)
+}
+func (m *TestSummary) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TestSummary.Merge(m, src)
+}
+func (m *TestSummary) XXX_Size() int {
+	return xxx_messageInfo_TestSummary.Size(m)
+}
+func (m *TestSummary) XXX_DiscardUnknown() {
+	xxx_messageInfo_TestSummary.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TestSummary proto.InternalMessageInfo
+
+func (m *TestSummary) GetOverallStatus() TestStatus {
+	if m != nil {
+		return m.OverallStatus
+	}
+	return TestStatus_NO_STATUS
+}
+
+func (m *TestSummary) GetTotalRunCount() int32 {
+	if m != nil {
+		return m.TotalRunCount
+	}
+	return 0
+}
+
+func (m *TestSummary) GetPassed() []*File {
+	if m != nil {
+		return m.Passed
+	}
+	return nil
+}
+
+func (m *TestSummary) GetFailed() []*File {
+	if m != nil {
+		return m.Failed
+	}
+	return nil
+}
+
+func (m *TestSummary) GetTotalNumCached() int32 {
+	if m != nil {
+		return m.TotalNumCached
+	}
+	return 0
+}
+
+// Event indicating the end of a build.
+type BuildFinished struct {
+	// If the build succeeded or failed.
+	OverallSuccess bool `protobuf:"varint,1,opt,name=overall_success,json=overallSuccess,proto3" json:"overall_success,omitempty"` // Deprecated: Do not use.
+	// The overall status of the build. A build was successful iff
+	// ExitCode.code equals 0.
+	ExitCode *BuildFinished_ExitCode `protobuf:"bytes,3,opt,name=exit_code,json=exitCode,proto3" json:"exit_code,omitempty"`
+	// Time in milliseconds since the epoch.
+	// TODO(buchgr): Use google.protobuf.Timestamp once bazel's protoc supports
+	// it.
+	FinishTimeMillis     int64    `protobuf:"varint,2,opt,name=finish_time_millis,json=finishTimeMillis,proto3" json:"finish_time_millis,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BuildFinished) Reset()         { *m = BuildFinished{} }
+func (m *BuildFinished) String() string { return proto.CompactTextString(m) }
+func (*BuildFinished) ProtoMessage()    {}
+func (*BuildFinished) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{18}
+}
+
+func (m *BuildFinished) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BuildFinished.Unmarshal(m, b)
+}
+func (m *BuildFinished) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BuildFinished.Marshal(b, m, deterministic)
+}
+func (m *BuildFinished) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BuildFinished.Merge(m, src)
+}
+func (m *BuildFinished) XXX_Size() int {
+	return xxx_messageInfo_BuildFinished.Size(m)
+}
+func (m *BuildFinished) XXX_DiscardUnknown() {
+	xxx_messageInfo_BuildFinished.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BuildFinished proto.InternalMessageInfo
+
+// Deprecated: Do not use.
+func (m *BuildFinished) GetOverallSuccess() bool {
+	if m != nil {
+		return m.OverallSuccess
+	}
+	return false
+}
+
+func (m *BuildFinished) GetExitCode() *BuildFinished_ExitCode {
+	if m != nil {
+		return m.ExitCode
+	}
+	return nil
+}
+
+func (m *BuildFinished) GetFinishTimeMillis() int64 {
+	if m != nil {
+		return m.FinishTimeMillis
+	}
+	return 0
+}
+
+// Exit code of a build. The possible values correspond to the predefined
+// codes in bazel's lib.ExitCode class, as well as any custom exit code a
+// module might define. The predefined exit codes are subject to change (but
+// rarely do) and are not part of the public API.
+//
+// A build was successful iff ExitCode.code equals 0.
+type BuildFinished_ExitCode struct {
+	// The name of the exit code.
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	// The exit code.
+	Code                 int32    `protobuf:"varint,2,opt,name=code,proto3" json:"code,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BuildFinished_ExitCode) Reset()         { *m = BuildFinished_ExitCode{} }
+func (m *BuildFinished_ExitCode) String() string { return proto.CompactTextString(m) }
+func (*BuildFinished_ExitCode) ProtoMessage()    {}
+func (*BuildFinished_ExitCode) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{18, 0}
+}
+
+func (m *BuildFinished_ExitCode) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BuildFinished_ExitCode.Unmarshal(m, b)
+}
+func (m *BuildFinished_ExitCode) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BuildFinished_ExitCode.Marshal(b, m, deterministic)
+}
+func (m *BuildFinished_ExitCode) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BuildFinished_ExitCode.Merge(m, src)
+}
+func (m *BuildFinished_ExitCode) XXX_Size() int {
+	return xxx_messageInfo_BuildFinished_ExitCode.Size(m)
+}
+func (m *BuildFinished_ExitCode) XXX_DiscardUnknown() {
+	xxx_messageInfo_BuildFinished_ExitCode.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BuildFinished_ExitCode proto.InternalMessageInfo
+
+func (m *BuildFinished_ExitCode) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func (m *BuildFinished_ExitCode) GetCode() int32 {
+	if m != nil {
+		return m.Code
+	}
+	return 0
+}
+
+type BuildMetrics struct {
+	ActionSummary        *BuildMetrics_ActionSummary  `protobuf:"bytes,1,opt,name=action_summary,json=actionSummary,proto3" json:"action_summary,omitempty"`
+	MemoryMetrics        *BuildMetrics_MemoryMetrics  `protobuf:"bytes,2,opt,name=memory_metrics,json=memoryMetrics,proto3" json:"memory_metrics,omitempty"`
+	TargetMetrics        *BuildMetrics_TargetMetrics  `protobuf:"bytes,3,opt,name=target_metrics,json=targetMetrics,proto3" json:"target_metrics,omitempty"`
+	PackageMetrics       *BuildMetrics_PackageMetrics `protobuf:"bytes,4,opt,name=package_metrics,json=packageMetrics,proto3" json:"package_metrics,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                     `json:"-"`
+	XXX_unrecognized     []byte                       `json:"-"`
+	XXX_sizecache        int32                        `json:"-"`
+}
+
+func (m *BuildMetrics) Reset()         { *m = BuildMetrics{} }
+func (m *BuildMetrics) String() string { return proto.CompactTextString(m) }
+func (*BuildMetrics) ProtoMessage()    {}
+func (*BuildMetrics) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{19}
+}
+
+func (m *BuildMetrics) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BuildMetrics.Unmarshal(m, b)
+}
+func (m *BuildMetrics) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BuildMetrics.Marshal(b, m, deterministic)
+}
+func (m *BuildMetrics) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BuildMetrics.Merge(m, src)
+}
+func (m *BuildMetrics) XXX_Size() int {
+	return xxx_messageInfo_BuildMetrics.Size(m)
+}
+func (m *BuildMetrics) XXX_DiscardUnknown() {
+	xxx_messageInfo_BuildMetrics.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BuildMetrics proto.InternalMessageInfo
+
+func (m *BuildMetrics) GetActionSummary() *BuildMetrics_ActionSummary {
+	if m != nil {
+		return m.ActionSummary
+	}
+	return nil
+}
+
+func (m *BuildMetrics) GetMemoryMetrics() *BuildMetrics_MemoryMetrics {
+	if m != nil {
+		return m.MemoryMetrics
+	}
+	return nil
+}
+
+func (m *BuildMetrics) GetTargetMetrics() *BuildMetrics_TargetMetrics {
+	if m != nil {
+		return m.TargetMetrics
+	}
+	return nil
+}
+
+func (m *BuildMetrics) GetPackageMetrics() *BuildMetrics_PackageMetrics {
+	if m != nil {
+		return m.PackageMetrics
+	}
+	return nil
+}
+
+type BuildMetrics_ActionSummary struct {
+	// The total number of actions created and registered during the build.
+	// This includes unused actions that were constructed but
+	// not executed during this build.
+	ActionsCreated int64 `protobuf:"varint,1,opt,name=actions_created,json=actionsCreated,proto3" json:"actions_created,omitempty"`
+	// The total number of actions executed during the build.
+	// This includes any remote cache hits, but excludes
+	// local action cache hits.
+	ActionsExecuted      int64    `protobuf:"varint,2,opt,name=actions_executed,json=actionsExecuted,proto3" json:"actions_executed,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BuildMetrics_ActionSummary) Reset()         { *m = BuildMetrics_ActionSummary{} }
+func (m *BuildMetrics_ActionSummary) String() string { return proto.CompactTextString(m) }
+func (*BuildMetrics_ActionSummary) ProtoMessage()    {}
+func (*BuildMetrics_ActionSummary) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{19, 0}
+}
+
+func (m *BuildMetrics_ActionSummary) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BuildMetrics_ActionSummary.Unmarshal(m, b)
+}
+func (m *BuildMetrics_ActionSummary) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BuildMetrics_ActionSummary.Marshal(b, m, deterministic)
+}
+func (m *BuildMetrics_ActionSummary) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BuildMetrics_ActionSummary.Merge(m, src)
+}
+func (m *BuildMetrics_ActionSummary) XXX_Size() int {
+	return xxx_messageInfo_BuildMetrics_ActionSummary.Size(m)
+}
+func (m *BuildMetrics_ActionSummary) XXX_DiscardUnknown() {
+	xxx_messageInfo_BuildMetrics_ActionSummary.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BuildMetrics_ActionSummary proto.InternalMessageInfo
+
+func (m *BuildMetrics_ActionSummary) GetActionsCreated() int64 {
+	if m != nil {
+		return m.ActionsCreated
+	}
+	return 0
+}
+
+func (m *BuildMetrics_ActionSummary) GetActionsExecuted() int64 {
+	if m != nil {
+		return m.ActionsExecuted
+	}
+	return 0
+}
+
+type BuildMetrics_MemoryMetrics struct {
+	// Size of the JVM heap post build in bytes. This is only collected if
+	// --bep_publish_used_heap_size_post_build is set,
+	// since it forces a full GC.
+	UsedHeapSizePostBuild int64    `protobuf:"varint,1,opt,name=used_heap_size_post_build,json=usedHeapSizePostBuild,proto3" json:"used_heap_size_post_build,omitempty"`
+	XXX_NoUnkeyedLiteral  struct{} `json:"-"`
+	XXX_unrecognized      []byte   `json:"-"`
+	XXX_sizecache         int32    `json:"-"`
+}
+
+func (m *BuildMetrics_MemoryMetrics) Reset()         { *m = BuildMetrics_MemoryMetrics{} }
+func (m *BuildMetrics_MemoryMetrics) String() string { return proto.CompactTextString(m) }
+func (*BuildMetrics_MemoryMetrics) ProtoMessage()    {}
+func (*BuildMetrics_MemoryMetrics) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{19, 1}
+}
+
+func (m *BuildMetrics_MemoryMetrics) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BuildMetrics_MemoryMetrics.Unmarshal(m, b)
+}
+func (m *BuildMetrics_MemoryMetrics) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BuildMetrics_MemoryMetrics.Marshal(b, m, deterministic)
+}
+func (m *BuildMetrics_MemoryMetrics) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BuildMetrics_MemoryMetrics.Merge(m, src)
+}
+func (m *BuildMetrics_MemoryMetrics) XXX_Size() int {
+	return xxx_messageInfo_BuildMetrics_MemoryMetrics.Size(m)
+}
+func (m *BuildMetrics_MemoryMetrics) XXX_DiscardUnknown() {
+	xxx_messageInfo_BuildMetrics_MemoryMetrics.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BuildMetrics_MemoryMetrics proto.InternalMessageInfo
+
+func (m *BuildMetrics_MemoryMetrics) GetUsedHeapSizePostBuild() int64 {
+	if m != nil {
+		return m.UsedHeapSizePostBuild
+	}
+	return 0
+}
+
+type BuildMetrics_TargetMetrics struct {
+	// Number of targets loaded during this build.
+	TargetsLoaded int64 `protobuf:"varint,1,opt,name=targets_loaded,json=targetsLoaded,proto3" json:"targets_loaded,omitempty"`
+	// Number of targets configured during this build. This can
+	// be greater than targets_loaded if the same target is configured
+	// multiple times.
+	TargetsConfigured    int64    `protobuf:"varint,2,opt,name=targets_configured,json=targetsConfigured,proto3" json:"targets_configured,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BuildMetrics_TargetMetrics) Reset()         { *m = BuildMetrics_TargetMetrics{} }
+func (m *BuildMetrics_TargetMetrics) String() string { return proto.CompactTextString(m) }
+func (*BuildMetrics_TargetMetrics) ProtoMessage()    {}
+func (*BuildMetrics_TargetMetrics) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{19, 2}
+}
+
+func (m *BuildMetrics_TargetMetrics) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BuildMetrics_TargetMetrics.Unmarshal(m, b)
+}
+func (m *BuildMetrics_TargetMetrics) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BuildMetrics_TargetMetrics.Marshal(b, m, deterministic)
+}
+func (m *BuildMetrics_TargetMetrics) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BuildMetrics_TargetMetrics.Merge(m, src)
+}
+func (m *BuildMetrics_TargetMetrics) XXX_Size() int {
+	return xxx_messageInfo_BuildMetrics_TargetMetrics.Size(m)
+}
+func (m *BuildMetrics_TargetMetrics) XXX_DiscardUnknown() {
+	xxx_messageInfo_BuildMetrics_TargetMetrics.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BuildMetrics_TargetMetrics proto.InternalMessageInfo
+
+func (m *BuildMetrics_TargetMetrics) GetTargetsLoaded() int64 {
+	if m != nil {
+		return m.TargetsLoaded
+	}
+	return 0
+}
+
+func (m *BuildMetrics_TargetMetrics) GetTargetsConfigured() int64 {
+	if m != nil {
+		return m.TargetsConfigured
+	}
+	return 0
+}
+
+type BuildMetrics_PackageMetrics struct {
+	// Number of BUILD files (aka packages) loaded during this build.
+	PackagesLoaded       int64    `protobuf:"varint,1,opt,name=packages_loaded,json=packagesLoaded,proto3" json:"packages_loaded,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BuildMetrics_PackageMetrics) Reset()         { *m = BuildMetrics_PackageMetrics{} }
+func (m *BuildMetrics_PackageMetrics) String() string { return proto.CompactTextString(m) }
+func (*BuildMetrics_PackageMetrics) ProtoMessage()    {}
+func (*BuildMetrics_PackageMetrics) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{19, 3}
+}
+
+func (m *BuildMetrics_PackageMetrics) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BuildMetrics_PackageMetrics.Unmarshal(m, b)
+}
+func (m *BuildMetrics_PackageMetrics) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BuildMetrics_PackageMetrics.Marshal(b, m, deterministic)
+}
+func (m *BuildMetrics_PackageMetrics) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BuildMetrics_PackageMetrics.Merge(m, src)
+}
+func (m *BuildMetrics_PackageMetrics) XXX_Size() int {
+	return xxx_messageInfo_BuildMetrics_PackageMetrics.Size(m)
+}
+func (m *BuildMetrics_PackageMetrics) XXX_DiscardUnknown() {
+	xxx_messageInfo_BuildMetrics_PackageMetrics.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BuildMetrics_PackageMetrics proto.InternalMessageInfo
+
+func (m *BuildMetrics_PackageMetrics) GetPackagesLoaded() int64 {
+	if m != nil {
+		return m.PackagesLoaded
+	}
+	return 0
+}
+
+// Event providing additional statistics/logs after completion of the build.
+type BuildToolLogs struct {
+	Log                  []*File  `protobuf:"bytes,1,rep,name=log,proto3" json:"log,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BuildToolLogs) Reset()         { *m = BuildToolLogs{} }
+func (m *BuildToolLogs) String() string { return proto.CompactTextString(m) }
+func (*BuildToolLogs) ProtoMessage()    {}
+func (*BuildToolLogs) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{20}
+}
+
+func (m *BuildToolLogs) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BuildToolLogs.Unmarshal(m, b)
+}
+func (m *BuildToolLogs) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BuildToolLogs.Marshal(b, m, deterministic)
+}
+func (m *BuildToolLogs) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BuildToolLogs.Merge(m, src)
+}
+func (m *BuildToolLogs) XXX_Size() int {
+	return xxx_messageInfo_BuildToolLogs.Size(m)
+}
+func (m *BuildToolLogs) XXX_DiscardUnknown() {
+	xxx_messageInfo_BuildToolLogs.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BuildToolLogs proto.InternalMessageInfo
+
+func (m *BuildToolLogs) GetLog() []*File {
+	if m != nil {
+		return m.Log
+	}
+	return nil
+}
+
+// Message describing a build event. Events will have an identifier that
+// is unique within a given build invocation; they also announce follow-up
+// events as children. More details, which are specific to the kind of event
+// that is observed, is provided in the payload. More options for the payload
+// might be added in the future.
+type BuildEvent struct {
+	Id          *BuildEventId   `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+	Children    []*BuildEventId `protobuf:"bytes,2,rep,name=children,proto3" json:"children,omitempty"`
+	LastMessage bool            `protobuf:"varint,20,opt,name=last_message,json=lastMessage,proto3" json:"last_message,omitempty"`
+	// Types that are valid to be assigned to Payload:
+	//	*BuildEvent_Progress
+	//	*BuildEvent_Aborted
+	//	*BuildEvent_Started
+	//	*BuildEvent_UnstructuredCommandLine
+	//	*BuildEvent_StructuredCommandLine
+	//	*BuildEvent_OptionsParsed
+	//	*BuildEvent_WorkspaceStatus
+	//	*BuildEvent_Fetch
+	//	*BuildEvent_Configuration
+	//	*BuildEvent_Expanded
+	//	*BuildEvent_Configured
+	//	*BuildEvent_Action
+	//	*BuildEvent_NamedSetOfFiles
+	//	*BuildEvent_Completed
+	//	*BuildEvent_TestResult
+	//	*BuildEvent_TestSummary
+	//	*BuildEvent_Finished
+	//	*BuildEvent_BuildToolLogs
+	//	*BuildEvent_BuildMetrics
+	Payload              isBuildEvent_Payload `protobuf_oneof:"payload"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *BuildEvent) Reset()         { *m = BuildEvent{} }
+func (m *BuildEvent) String() string { return proto.CompactTextString(m) }
+func (*BuildEvent) ProtoMessage()    {}
+func (*BuildEvent) Descriptor() ([]byte, []int) {
+	return fileDescriptor_817c6a9aafd47c5b, []int{21}
+}
+
+func (m *BuildEvent) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BuildEvent.Unmarshal(m, b)
+}
+func (m *BuildEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BuildEvent.Marshal(b, m, deterministic)
+}
+func (m *BuildEvent) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BuildEvent.Merge(m, src)
+}
+func (m *BuildEvent) XXX_Size() int {
+	return xxx_messageInfo_BuildEvent.Size(m)
+}
+func (m *BuildEvent) XXX_DiscardUnknown() {
+	xxx_messageInfo_BuildEvent.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BuildEvent proto.InternalMessageInfo
+
+func (m *BuildEvent) GetId() *BuildEventId {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *BuildEvent) GetChildren() []*BuildEventId {
+	if m != nil {
+		return m.Children
+	}
+	return nil
+}
+
+func (m *BuildEvent) GetLastMessage() bool {
+	if m != nil {
+		return m.LastMessage
+	}
+	return false
+}
+
+type isBuildEvent_Payload interface {
+	isBuildEvent_Payload()
+}
+
+type BuildEvent_Progress struct {
+	Progress *Progress `protobuf:"bytes,3,opt,name=progress,proto3,oneof"`
+}
+
+type BuildEvent_Aborted struct {
+	Aborted *Aborted `protobuf:"bytes,4,opt,name=aborted,proto3,oneof"`
+}
+
+type BuildEvent_Started struct {
+	Started *BuildStarted `protobuf:"bytes,5,opt,name=started,proto3,oneof"`
+}
+
+type BuildEvent_UnstructuredCommandLine struct {
+	UnstructuredCommandLine *UnstructuredCommandLine `protobuf:"bytes,12,opt,name=unstructured_command_line,json=unstructuredCommandLine,proto3,oneof"`
+}
+
+type BuildEvent_StructuredCommandLine struct {
+	StructuredCommandLine *command_line.CommandLine `protobuf:"bytes,22,opt,name=structured_command_line,json=structuredCommandLine,proto3,oneof"`
+}
+
+type BuildEvent_OptionsParsed struct {
+	OptionsParsed *OptionsParsed `protobuf:"bytes,13,opt,name=options_parsed,json=optionsParsed,proto3,oneof"`
+}
+
+type BuildEvent_WorkspaceStatus struct {
+	WorkspaceStatus *WorkspaceStatus `protobuf:"bytes,16,opt,name=workspace_status,json=workspaceStatus,proto3,oneof"`
+}
+
+type BuildEvent_Fetch struct {
+	Fetch *Fetch `protobuf:"bytes,21,opt,name=fetch,proto3,oneof"`
+}
+
+type BuildEvent_Configuration struct {
+	Configuration *Configuration `protobuf:"bytes,17,opt,name=configuration,proto3,oneof"`
+}
+
+type BuildEvent_Expanded struct {
+	Expanded *PatternExpanded `protobuf:"bytes,6,opt,name=expanded,proto3,oneof"`
+}
+
+type BuildEvent_Configured struct {
+	Configured *TargetConfigured `protobuf:"bytes,18,opt,name=configured,proto3,oneof"`
+}
+
+type BuildEvent_Action struct {
+	Action *ActionExecuted `protobuf:"bytes,7,opt,name=action,proto3,oneof"`
+}
+
+type BuildEvent_NamedSetOfFiles struct {
+	NamedSetOfFiles *NamedSetOfFiles `protobuf:"bytes,15,opt,name=named_set_of_files,json=namedSetOfFiles,proto3,oneof"`
+}
+
+type BuildEvent_Completed struct {
+	Completed *TargetComplete `protobuf:"bytes,8,opt,name=completed,proto3,oneof"`
+}
+
+type BuildEvent_TestResult struct {
+	TestResult *TestResult `protobuf:"bytes,10,opt,name=test_result,json=testResult,proto3,oneof"`
+}
+
+type BuildEvent_TestSummary struct {
+	TestSummary *TestSummary `protobuf:"bytes,9,opt,name=test_summary,json=testSummary,proto3,oneof"`
+}
+
+type BuildEvent_Finished struct {
+	Finished *BuildFinished `protobuf:"bytes,14,opt,name=finished,proto3,oneof"`
+}
+
+type BuildEvent_BuildToolLogs struct {
+	BuildToolLogs *BuildToolLogs `protobuf:"bytes,23,opt,name=build_tool_logs,json=buildToolLogs,proto3,oneof"`
+}
+
+type BuildEvent_BuildMetrics struct {
+	BuildMetrics *BuildMetrics `protobuf:"bytes,24,opt,name=build_metrics,json=buildMetrics,proto3,oneof"`
+}
+
+func (*BuildEvent_Progress) isBuildEvent_Payload() {}
+
+func (*BuildEvent_Aborted) isBuildEvent_Payload() {}
+
+func (*BuildEvent_Started) isBuildEvent_Payload() {}
+
+func (*BuildEvent_UnstructuredCommandLine) isBuildEvent_Payload() {}
+
+func (*BuildEvent_StructuredCommandLine) isBuildEvent_Payload() {}
+
+func (*BuildEvent_OptionsParsed) isBuildEvent_Payload() {}
+
+func (*BuildEvent_WorkspaceStatus) isBuildEvent_Payload() {}
+
+func (*BuildEvent_Fetch) isBuildEvent_Payload() {}
+
+func (*BuildEvent_Configuration) isBuildEvent_Payload() {}
+
+func (*BuildEvent_Expanded) isBuildEvent_Payload() {}
+
+func (*BuildEvent_Configured) isBuildEvent_Payload() {}
+
+func (*BuildEvent_Action) isBuildEvent_Payload() {}
+
+func (*BuildEvent_NamedSetOfFiles) isBuildEvent_Payload() {}
+
+func (*BuildEvent_Completed) isBuildEvent_Payload() {}
+
+func (*BuildEvent_TestResult) isBuildEvent_Payload() {}
+
+func (*BuildEvent_TestSummary) isBuildEvent_Payload() {}
+
+func (*BuildEvent_Finished) isBuildEvent_Payload() {}
+
+func (*BuildEvent_BuildToolLogs) isBuildEvent_Payload() {}
+
+func (*BuildEvent_BuildMetrics) isBuildEvent_Payload() {}
+
+func (m *BuildEvent) GetPayload() isBuildEvent_Payload {
+	if m != nil {
+		return m.Payload
+	}
+	return nil
+}
+
+func (m *BuildEvent) GetProgress() *Progress {
+	if x, ok := m.GetPayload().(*BuildEvent_Progress); ok {
+		return x.Progress
+	}
+	return nil
+}
+
+func (m *BuildEvent) GetAborted() *Aborted {
+	if x, ok := m.GetPayload().(*BuildEvent_Aborted); ok {
+		return x.Aborted
+	}
+	return nil
+}
+
+func (m *BuildEvent) GetStarted() *BuildStarted {
+	if x, ok := m.GetPayload().(*BuildEvent_Started); ok {
+		return x.Started
+	}
+	return nil
+}
+
+func (m *BuildEvent) GetUnstructuredCommandLine() *UnstructuredCommandLine {
+	if x, ok := m.GetPayload().(*BuildEvent_UnstructuredCommandLine); ok {
+		return x.UnstructuredCommandLine
+	}
+	return nil
+}
+
+func (m *BuildEvent) GetStructuredCommandLine() *command_line.CommandLine {
+	if x, ok := m.GetPayload().(*BuildEvent_StructuredCommandLine); ok {
+		return x.StructuredCommandLine
+	}
+	return nil
+}
+
+func (m *BuildEvent) GetOptionsParsed() *OptionsParsed {
+	if x, ok := m.GetPayload().(*BuildEvent_OptionsParsed); ok {
+		return x.OptionsParsed
+	}
+	return nil
+}
+
+func (m *BuildEvent) GetWorkspaceStatus() *WorkspaceStatus {
+	if x, ok := m.GetPayload().(*BuildEvent_WorkspaceStatus); ok {
+		return x.WorkspaceStatus
+	}
+	return nil
+}
+
+func (m *BuildEvent) GetFetch() *Fetch {
+	if x, ok := m.GetPayload().(*BuildEvent_Fetch); ok {
+		return x.Fetch
+	}
+	return nil
+}
+
+func (m *BuildEvent) GetConfiguration() *Configuration {
+	if x, ok := m.GetPayload().(*BuildEvent_Configuration); ok {
+		return x.Configuration
+	}
+	return nil
+}
+
+func (m *BuildEvent) GetExpanded() *PatternExpanded {
+	if x, ok := m.GetPayload().(*BuildEvent_Expanded); ok {
+		return x.Expanded
+	}
+	return nil
+}
+
+func (m *BuildEvent) GetConfigured() *TargetConfigured {
+	if x, ok := m.GetPayload().(*BuildEvent_Configured); ok {
+		return x.Configured
+	}
+	return nil
+}
+
+func (m *BuildEvent) GetAction() *ActionExecuted {
+	if x, ok := m.GetPayload().(*BuildEvent_Action); ok {
+		return x.Action
+	}
+	return nil
+}
+
+func (m *BuildEvent) GetNamedSetOfFiles() *NamedSetOfFiles {
+	if x, ok := m.GetPayload().(*BuildEvent_NamedSetOfFiles); ok {
+		return x.NamedSetOfFiles
+	}
+	return nil
+}
+
+func (m *BuildEvent) GetCompleted() *TargetComplete {
+	if x, ok := m.GetPayload().(*BuildEvent_Completed); ok {
+		return x.Completed
+	}
+	return nil
+}
+
+func (m *BuildEvent) GetTestResult() *TestResult {
+	if x, ok := m.GetPayload().(*BuildEvent_TestResult); ok {
+		return x.TestResult
+	}
+	return nil
+}
+
+func (m *BuildEvent) GetTestSummary() *TestSummary {
+	if x, ok := m.GetPayload().(*BuildEvent_TestSummary); ok {
+		return x.TestSummary
+	}
+	return nil
+}
+
+func (m *BuildEvent) GetFinished() *BuildFinished {
+	if x, ok := m.GetPayload().(*BuildEvent_Finished); ok {
+		return x.Finished
+	}
+	return nil
+}
+
+func (m *BuildEvent) GetBuildToolLogs() *BuildToolLogs {
+	if x, ok := m.GetPayload().(*BuildEvent_BuildToolLogs); ok {
+		return x.BuildToolLogs
+	}
+	return nil
+}
+
+func (m *BuildEvent) GetBuildMetrics() *BuildMetrics {
+	if x, ok := m.GetPayload().(*BuildEvent_BuildMetrics); ok {
+		return x.BuildMetrics
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*BuildEvent) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*BuildEvent_Progress)(nil),
+		(*BuildEvent_Aborted)(nil),
+		(*BuildEvent_Started)(nil),
+		(*BuildEvent_UnstructuredCommandLine)(nil),
+		(*BuildEvent_StructuredCommandLine)(nil),
+		(*BuildEvent_OptionsParsed)(nil),
+		(*BuildEvent_WorkspaceStatus)(nil),
+		(*BuildEvent_Fetch)(nil),
+		(*BuildEvent_Configuration)(nil),
+		(*BuildEvent_Expanded)(nil),
+		(*BuildEvent_Configured)(nil),
+		(*BuildEvent_Action)(nil),
+		(*BuildEvent_NamedSetOfFiles)(nil),
+		(*BuildEvent_Completed)(nil),
+		(*BuildEvent_TestResult)(nil),
+		(*BuildEvent_TestSummary)(nil),
+		(*BuildEvent_Finished)(nil),
+		(*BuildEvent_BuildToolLogs)(nil),
+		(*BuildEvent_BuildMetrics)(nil),
+	}
+}
+
+func init() {
+	proto.RegisterEnum("build_event_stream.TestSize", TestSize_name, TestSize_value)
+	proto.RegisterEnum("build_event_stream.TestStatus", TestStatus_name, TestStatus_value)
+	proto.RegisterEnum("build_event_stream.Aborted_AbortReason", Aborted_AbortReason_name, Aborted_AbortReason_value)
+	proto.RegisterType((*BuildEventId)(nil), "build_event_stream.BuildEventId")
+	proto.RegisterType((*BuildEventId_UnknownBuildEventId)(nil), "build_event_stream.BuildEventId.UnknownBuildEventId")
+	proto.RegisterType((*BuildEventId_ProgressId)(nil), "build_event_stream.BuildEventId.ProgressId")
+	proto.RegisterType((*BuildEventId_BuildStartedId)(nil), "build_event_stream.BuildEventId.BuildStartedId")
+	proto.RegisterType((*BuildEventId_UnstructuredCommandLineId)(nil), "build_event_stream.BuildEventId.UnstructuredCommandLineId")
+	proto.RegisterType((*BuildEventId_StructuredCommandLineId)(nil), "build_event_stream.BuildEventId.StructuredCommandLineId")
+	proto.RegisterType((*BuildEventId_WorkspaceStatusId)(nil), "build_event_stream.BuildEventId.WorkspaceStatusId")
+	proto.RegisterType((*BuildEventId_OptionsParsedId)(nil), "build_event_stream.BuildEventId.OptionsParsedId")
+	proto.RegisterType((*BuildEventId_FetchId)(nil), "build_event_stream.BuildEventId.FetchId")
+	proto.RegisterType((*BuildEventId_PatternExpandedId)(nil), "build_event_stream.BuildEventId.PatternExpandedId")
+	proto.RegisterType((*BuildEventId_TargetConfiguredId)(nil), "build_event_stream.BuildEventId.TargetConfiguredId")
+	proto.RegisterType((*BuildEventId_NamedSetOfFilesId)(nil), "build_event_stream.BuildEventId.NamedSetOfFilesId")
+	proto.RegisterType((*BuildEventId_ConfigurationId)(nil), "build_event_stream.BuildEventId.ConfigurationId")
+	proto.RegisterType((*BuildEventId_TargetCompletedId)(nil), "build_event_stream.BuildEventId.TargetCompletedId")
+	proto.RegisterType((*BuildEventId_ActionCompletedId)(nil), "build_event_stream.BuildEventId.ActionCompletedId")
+	proto.RegisterType((*BuildEventId_UnconfiguredLabelId)(nil), "build_event_stream.BuildEventId.UnconfiguredLabelId")
+	proto.RegisterType((*BuildEventId_ConfiguredLabelId)(nil), "build_event_stream.BuildEventId.ConfiguredLabelId")
+	proto.RegisterType((*BuildEventId_TestResultId)(nil), "build_event_stream.BuildEventId.TestResultId")
+	proto.RegisterType((*BuildEventId_TestSummaryId)(nil), "build_event_stream.BuildEventId.TestSummaryId")
+	proto.RegisterType((*BuildEventId_BuildFinishedId)(nil), "build_event_stream.BuildEventId.BuildFinishedId")
+	proto.RegisterType((*BuildEventId_BuildToolLogsId)(nil), "build_event_stream.BuildEventId.BuildToolLogsId")
+	proto.RegisterType((*BuildEventId_BuildMetricsId)(nil), "build_event_stream.BuildEventId.BuildMetricsId")
+	proto.RegisterType((*Progress)(nil), "build_event_stream.Progress")
+	proto.RegisterType((*Aborted)(nil), "build_event_stream.Aborted")
+	proto.RegisterType((*BuildStarted)(nil), "build_event_stream.BuildStarted")
+	proto.RegisterType((*UnstructuredCommandLine)(nil), "build_event_stream.UnstructuredCommandLine")
+	proto.RegisterType((*OptionsParsed)(nil), "build_event_stream.OptionsParsed")
+	proto.RegisterType((*Fetch)(nil), "build_event_stream.Fetch")
+	proto.RegisterType((*WorkspaceStatus)(nil), "build_event_stream.WorkspaceStatus")
+	proto.RegisterType((*WorkspaceStatus_Item)(nil), "build_event_stream.WorkspaceStatus.Item")
+	proto.RegisterType((*Configuration)(nil), "build_event_stream.Configuration")
+	proto.RegisterMapType((map[string]string)(nil), "build_event_stream.Configuration.MakeVariableEntry")
+	proto.RegisterType((*PatternExpanded)(nil), "build_event_stream.PatternExpanded")
+	proto.RegisterType((*TargetConfigured)(nil), "build_event_stream.TargetConfigured")
+	proto.RegisterType((*File)(nil), "build_event_stream.File")
+	proto.RegisterType((*NamedSetOfFiles)(nil), "build_event_stream.NamedSetOfFiles")
+	proto.RegisterType((*ActionExecuted)(nil), "build_event_stream.ActionExecuted")
+	proto.RegisterType((*OutputGroup)(nil), "build_event_stream.OutputGroup")
+	proto.RegisterType((*TargetComplete)(nil), "build_event_stream.TargetComplete")
+	proto.RegisterType((*TestResult)(nil), "build_event_stream.TestResult")
+	proto.RegisterType((*TestResult_ExecutionInfo)(nil), "build_event_stream.TestResult.ExecutionInfo")
+	proto.RegisterType((*TestResult_ExecutionInfo_TimingBreakdown)(nil), "build_event_stream.TestResult.ExecutionInfo.TimingBreakdown")
+	proto.RegisterType((*TestResult_ExecutionInfo_ResourceUsage)(nil), "build_event_stream.TestResult.ExecutionInfo.ResourceUsage")
+	proto.RegisterType((*TestSummary)(nil), "build_event_stream.TestSummary")
+	proto.RegisterType((*BuildFinished)(nil), "build_event_stream.BuildFinished")
+	proto.RegisterType((*BuildFinished_ExitCode)(nil), "build_event_stream.BuildFinished.ExitCode")
+	proto.RegisterType((*BuildMetrics)(nil), "build_event_stream.BuildMetrics")
+	proto.RegisterType((*BuildMetrics_ActionSummary)(nil), "build_event_stream.BuildMetrics.ActionSummary")
+	proto.RegisterType((*BuildMetrics_MemoryMetrics)(nil), "build_event_stream.BuildMetrics.MemoryMetrics")
+	proto.RegisterType((*BuildMetrics_TargetMetrics)(nil), "build_event_stream.BuildMetrics.TargetMetrics")
+	proto.RegisterType((*BuildMetrics_PackageMetrics)(nil), "build_event_stream.BuildMetrics.PackageMetrics")
+	proto.RegisterType((*BuildToolLogs)(nil), "build_event_stream.BuildToolLogs")
+	proto.RegisterType((*BuildEvent)(nil), "build_event_stream.BuildEvent")
+}
+
+func init() { proto.RegisterFile("build_event_stream.proto", fileDescriptor_817c6a9aafd47c5b) }
+
+var fileDescriptor_817c6a9aafd47c5b = []byte{
+	// 3414 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x5a, 0xcd, 0x8f, 0xdb, 0x48,
+	0x76, 0x6f, 0x7d, 0xb5, 0xa4, 0xd7, 0x2d, 0x89, 0x2a, 0x7f, 0xc9, 0xf4, 0xc4, 0x1f, 0xf2, 0x24,
+	0x33, 0x63, 0x8f, 0x65, 0xc7, 0x13, 0x24, 0x1e, 0xc7, 0x81, 0xa3, 0xee, 0x56, 0x77, 0xcb, 0x56,
+	0x4b, 0x0a, 0xa5, 0xf6, 0x7c, 0x00, 0x01, 0xc1, 0x26, 0xab, 0xd5, 0x44, 0x53, 0x24, 0x43, 0x16,
+	0xdb, 0xee, 0x01, 0x82, 0x24, 0x97, 0x1c, 0x72, 0xcc, 0x6d, 0x72, 0xce, 0x21, 0x87, 0x5c, 0x16,
+	0x58, 0x60, 0x6f, 0xbb, 0xc0, 0x62, 0xff, 0x8e, 0xdd, 0xe3, 0xfe, 0x15, 0x0b, 0x2c, 0xea, 0x83,
+	0x14, 0x49, 0x49, 0x96, 0x3c, 0x33, 0x98, 0x93, 0x54, 0x8f, 0xef, 0xfd, 0xaa, 0xea, 0xd5, 0xab,
+	0xf7, 0x51, 0x55, 0xd0, 0x38, 0x09, 0x4c, 0xcb, 0x50, 0xf1, 0x05, 0xb6, 0x89, 0xea, 0x13, 0x0f,
+	0x6b, 0xd3, 0x96, 0xeb, 0x39, 0xc4, 0x41, 0x68, 0xfe, 0x8b, 0xfc, 0x99, 0xef, 0xe9, 0x8f, 0xa7,
+	0x9a, 0x69, 0x3f, 0x66, 0x3c, 0x27, 0xc1, 0xe9, 0x63, 0xd3, 0xbe, 0x70, 0x74, 0x8d, 0x98, 0x8e,
+	0xad, 0xba, 0x8e, 0x65, 0xea, 0x97, 0x5c, 0x5c, 0xfe, 0x78, 0x9e, 0x55, 0x77, 0xa6, 0x53, 0xcd,
+	0x36, 0x54, 0xcb, 0xb4, 0x31, 0xe7, 0x6a, 0xfe, 0x52, 0x86, 0xed, 0x1d, 0xda, 0x4f, 0x87, 0x76,
+	0xd3, 0x35, 0xd0, 0x10, 0x8a, 0x81, 0x7d, 0x6e, 0x3b, 0x6f, 0xed, 0x46, 0xe6, 0x6e, 0xe6, 0xd3,
+	0xad, 0xa7, 0x7f, 0xd3, 0x5a, 0x30, 0xc2, 0xb8, 0x48, 0xeb, 0x98, 0xf3, 0xc7, 0x69, 0x87, 0x1b,
+	0x4a, 0x08, 0x83, 0xba, 0x50, 0x72, 0x3d, 0x67, 0xe2, 0x61, 0xdf, 0x6f, 0x64, 0x19, 0xe4, 0xc3,
+	0x95, 0x90, 0x43, 0x21, 0xc0, 0x90, 0x22, 0x71, 0xf4, 0x1a, 0x8a, 0x3e, 0xd1, 0x3c, 0x82, 0x8d,
+	0x46, 0x8e, 0x21, 0x3d, 0x5e, 0x89, 0xc4, 0x1a, 0x23, 0x2e, 0xc4, 0xc7, 0x25, 0x10, 0xd0, 0x3b,
+	0xb8, 0x19, 0xd8, 0x3e, 0xf1, 0x02, 0x9d, 0x04, 0x1e, 0x36, 0xd4, 0xb8, 0x76, 0x1a, 0x5b, 0x0c,
+	0xfe, 0xf9, 0x1a, 0x73, 0x9f, 0x21, 0xec, 0x72, 0x80, 0x9e, 0x69, 0x63, 0xd6, 0xd3, 0x8d, 0x60,
+	0xf1, 0x47, 0xe4, 0xc1, 0x8d, 0x65, 0xfd, 0x22, 0xd6, 0xef, 0xb3, 0x95, 0xfd, 0x8e, 0x96, 0xf6,
+	0x7a, 0x6d, 0x71, 0x9f, 0x2a, 0x48, 0x6f, 0x1d, 0xef, 0xdc, 0x77, 0x35, 0x1d, 0xab, 0x3e, 0xd1,
+	0x48, 0xe0, 0x37, 0xaa, 0xac, 0xb3, 0xa7, 0x2b, 0x3b, 0xfb, 0x2a, 0x14, 0x1c, 0x31, 0x39, 0xd6,
+	0x4d, 0xed, 0x6d, 0x92, 0x88, 0xbe, 0x81, 0xaa, 0xe3, 0x52, 0x33, 0xf4, 0x55, 0x57, 0xf3, 0x7c,
+	0x6c, 0x34, 0xb6, 0x19, 0xfc, 0x93, 0x95, 0xf0, 0x03, 0x2e, 0x36, 0x64, 0x52, 0x0c, 0xbc, 0xe2,
+	0xc4, 0x49, 0xe8, 0x1f, 0xa1, 0x70, 0x8a, 0x89, 0x7e, 0xd6, 0xa8, 0x33, 0xc4, 0x4f, 0x57, 0x22,
+	0xee, 0x53, 0x6e, 0x86, 0xc4, 0x05, 0xd1, 0xd7, 0x50, 0xd1, 0x1d, 0xfb, 0xd4, 0x9c, 0x04, 0x1e,
+	0xdb, 0x2a, 0x8d, 0xda, 0x9a, 0x63, 0xdb, 0x8d, 0x4b, 0xf1, 0xb1, 0x25, 0x80, 0xd0, 0x09, 0xd4,
+	0x89, 0xe6, 0x4d, 0x30, 0x51, 0x43, 0x3a, 0x36, 0x1a, 0x12, 0x43, 0xff, 0x62, 0x25, 0xfa, 0x98,
+	0x49, 0xee, 0x46, 0x82, 0xac, 0x03, 0x89, 0xa4, 0xa8, 0xa8, 0x0f, 0x45, 0x57, 0x23, 0x04, 0x7b,
+	0x76, 0x23, 0xbf, 0xe6, 0x92, 0x0d, 0x39, 0x7f, 0xe7, 0x9d, 0xab, 0xd9, 0x46, 0x68, 0xf9, 0x02,
+	0x04, 0xfd, 0x33, 0xd4, 0xc4, 0x5f, 0xd5, 0x3f, 0x37, 0x5d, 0x17, 0x1b, 0x0d, 0xf8, 0x11, 0xb8,
+	0x55, 0x01, 0x36, 0xe2, 0x58, 0xe8, 0x9f, 0xa0, 0x6c, 0x6b, 0x53, 0x6c, 0xa8, 0x3e, 0x26, 0x8d,
+	0xca, 0x9a, 0xc0, 0x7d, 0x2a, 0x31, 0xc2, 0x64, 0x70, 0xba, 0x6f, 0x5a, 0x58, 0x6c, 0x7c, 0x5b,
+	0x10, 0xa9, 0xf5, 0x46, 0x5a, 0x9e, 0xba, 0x16, 0xa6, 0x1e, 0xa0, 0xb0, 0x26, 0x72, 0xa8, 0x64,
+	0x21, 0xc7, 0xad, 0x97, 0x24, 0x89, 0xb4, 0x03, 0x4d, 0x67, 0x4e, 0x74, 0xd6, 0xc1, 0xe6, 0x9a,
+	0x1d, 0xb4, 0x99, 0x60, 0xaa, 0x03, 0x2d, 0x49, 0x44, 0x18, 0x50, 0x60, 0xcf, 0x4c, 0x44, 0xb5,
+	0xb4, 0x13, 0x6c, 0x35, 0xae, 0xac, 0xed, 0x62, 0x67, 0xa2, 0x3d, 0x2a, 0xc9, 0x3a, 0xa9, 0x07,
+	0x69, 0x32, 0x9d, 0xc7, 0x5c, 0x27, 0xd7, 0xd6, 0x9c, 0xc7, 0xee, 0x82, 0x2e, 0x6a, 0xe9, 0x0e,
+	0x86, 0xb0, 0x45, 0xb0, 0x4f, 0x54, 0x0f, 0xfb, 0x81, 0x45, 0x1a, 0x25, 0x86, 0xfd, 0x68, 0xf5,
+	0x22, 0x60, 0x9f, 0x28, 0x4c, 0x84, 0xc1, 0x02, 0x89, 0xda, 0x68, 0x04, 0xdb, 0x0c, 0xd1, 0x0f,
+	0xa6, 0x53, 0xcd, 0xbb, 0x6c, 0x14, 0x19, 0x64, 0x6b, 0x2d, 0xc8, 0x11, 0x97, 0x61, 0x98, 0x6c,
+	0x5c, 0x82, 0x40, 0xbd, 0x11, 0x97, 0x3f, 0x35, 0x6d, 0xd3, 0x3f, 0xc3, 0x46, 0xa3, 0xbc, 0xe6,
+	0x8e, 0x67, 0x8d, 0x7d, 0x21, 0xc5, 0x77, 0xfc, 0x49, 0x9c, 0x84, 0xbe, 0x85, 0x1a, 0xc7, 0x20,
+	0x8e, 0x63, 0xa9, 0x96, 0x33, 0xf1, 0x1b, 0x57, 0x3f, 0x04, 0x7b, 0xec, 0x38, 0x56, 0xcf, 0x99,
+	0xf8, 0x31, 0xec, 0x90, 0x84, 0xde, 0x00, 0x27, 0xa8, 0x53, 0x4c, 0x3c, 0x53, 0xf7, 0x1b, 0xd7,
+	0x3f, 0x24, 0xcc, 0x1d, 0x71, 0x21, 0x06, 0xbc, 0x7d, 0x12, 0xa3, 0xc8, 0x8f, 0xe1, 0xca, 0x82,
+	0x28, 0x8d, 0x1a, 0x50, 0x34, 0x30, 0xd1, 0x4c, 0xcb, 0x67, 0xc1, 0xbe, 0xac, 0x84, 0x4d, 0xf9,
+	0x31, 0xc0, 0x2c, 0x06, 0xa3, 0x7b, 0xb0, 0xed, 0xb8, 0xda, 0xbf, 0x04, 0x58, 0xd5, 0x9d, 0xc0,
+	0x26, 0x8c, 0xb9, 0xa0, 0x6c, 0x71, 0xda, 0x2e, 0x25, 0xc9, 0x12, 0x54, 0x93, 0xa1, 0x56, 0xbe,
+	0x05, 0x37, 0x97, 0x46, 0x47, 0xf9, 0x00, 0x6e, 0x2c, 0x09, 0x61, 0xe8, 0x73, 0x40, 0xf1, 0x90,
+	0x28, 0x8c, 0x98, 0x8f, 0x4f, 0xd2, 0x67, 0xac, 0xcc, 0x1e, 0xe5, 0x2b, 0x50, 0x9f, 0x0b, 0x4f,
+	0x72, 0x1d, 0x6a, 0xa9, 0xa0, 0x22, 0xdf, 0x82, 0xa2, 0x88, 0x0a, 0x48, 0x82, 0x5c, 0xe0, 0x85,
+	0x88, 0xf4, 0xaf, 0xfc, 0x08, 0xea, 0x73, 0x8e, 0x8d, 0x2a, 0x27, 0xf4, 0xba, 0x99, 0xbb, 0x39,
+	0xaa, 0x1c, 0xd1, 0x94, 0x77, 0x00, 0xcd, 0x7b, 0x6e, 0x74, 0x15, 0x0a, 0xf1, 0xa1, 0xf2, 0x06,
+	0xba, 0x0e, 0x9b, 0x9a, 0xef, 0x62, 0x9d, 0xb0, 0xdc, 0xa7, 0xac, 0x88, 0x96, 0x7c, 0x1f, 0xea,
+	0x73, 0x2e, 0x0f, 0x55, 0x21, 0x6b, 0x1a, 0x42, 0x3e, 0x6b, 0x1a, 0xf2, 0x3d, 0xa8, 0xa5, 0x02,
+	0xd0, 0x1c, 0xcb, 0xf7, 0x19, 0xa8, 0xcf, 0x79, 0xb8, 0x25, 0x63, 0x79, 0x93, 0x8e, 0x82, 0xb9,
+	0x1f, 0x16, 0x05, 0xd3, 0x31, 0x70, 0xd9, 0x1c, 0xff, 0x2f, 0x03, 0xf5, 0x39, 0xe7, 0x88, 0xfe,
+	0x12, 0xaa, 0xae, 0x67, 0xd2, 0x5d, 0xaa, 0x3a, 0x01, 0x71, 0x03, 0x22, 0x06, 0x59, 0x11, 0xd4,
+	0x01, 0x23, 0xce, 0xa6, 0x90, 0xfd, 0x19, 0xa6, 0x20, 0x3f, 0xa4, 0x1b, 0x64, 0xce, 0xc7, 0x2e,
+	0xd6, 0xa3, 0xfc, 0x1f, 0x19, 0xa8, 0xef, 0xae, 0xc7, 0x3b, 0x3f, 0xe0, 0xec, 0x4f, 0x33, 0xe0,
+	0x5f, 0x67, 0x60, 0x3b, 0xee, 0x54, 0xd7, 0xed, 0xbe, 0xf0, 0xd3, 0x2c, 0xb9, 0x04, 0x39, 0x2f,
+	0xe0, 0x93, 0x29, 0x28, 0xf4, 0x2f, 0xed, 0xdf, 0x3f, 0xd3, 0x3c, 0x9e, 0x99, 0x17, 0x14, 0xde,
+	0xa0, 0x9b, 0x88, 0x6e, 0x9a, 0xa9, 0x4b, 0x58, 0xea, 0x52, 0x50, 0xc2, 0xa6, 0xfc, 0xaf, 0x50,
+	0x49, 0x78, 0xf0, 0x9f, 0x59, 0x7f, 0x75, 0xa8, 0xa5, 0x3c, 0x7d, 0x44, 0x9a, 0x39, 0xe8, 0xc8,
+	0xab, 0x45, 0x9e, 0x75, 0x27, 0x4f, 0xf7, 0x5f, 0xf3, 0x39, 0x94, 0x42, 0xf7, 0x48, 0xad, 0xdf,
+	0x27, 0x86, 0x13, 0xd9, 0xb1, 0x68, 0x09, 0x3a, 0xf6, 0xbc, 0x70, 0x57, 0xf0, 0x56, 0xf3, 0x17,
+	0x59, 0x28, 0xb6, 0x4f, 0x1c, 0x56, 0x83, 0xbc, 0x84, 0x4d, 0x0f, 0x6b, 0xbe, 0xc3, 0x8b, 0xad,
+	0xea, 0xd3, 0x4f, 0x16, 0x4d, 0x4b, 0x30, 0xf3, 0x5f, 0x85, 0xb1, 0x2b, 0x42, 0x0c, 0xdd, 0x85,
+	0x2d, 0x03, 0xfb, 0xba, 0x67, 0xba, 0x91, 0x72, 0xca, 0x4a, 0x9c, 0xd4, 0xfc, 0x6d, 0x06, 0xb6,
+	0x62, 0x92, 0x68, 0x0b, 0x8a, 0xc7, 0xfd, 0xd7, 0xfd, 0xc1, 0x57, 0x7d, 0x69, 0x03, 0x5d, 0x05,
+	0xe9, 0x78, 0xd4, 0x51, 0xd4, 0x6e, 0x7f, 0xdc, 0x51, 0x94, 0xe3, 0xe1, 0xb8, 0xb3, 0x27, 0x65,
+	0x50, 0x15, 0xa0, 0x3f, 0x50, 0xdb, 0xfd, 0x76, 0xef, 0x9b, 0x6f, 0x3b, 0x52, 0x09, 0x6d, 0x43,
+	0xa9, 0x3f, 0x50, 0x77, 0x8e, 0xbb, 0xbd, 0x3d, 0xa9, 0x4c, 0x5b, 0xe3, 0xee, 0x51, 0x47, 0x1d,
+	0x1c, 0x8f, 0xa5, 0x2c, 0xba, 0x0d, 0xb2, 0xd2, 0x39, 0x1a, 0x8c, 0x3b, 0x6a, 0xa7, 0xff, 0xa6,
+	0xab, 0x0c, 0xfa, 0x47, 0x9d, 0xfe, 0x58, 0xdd, 0x6f, 0x77, 0x7b, 0xc7, 0x4a, 0x47, 0xca, 0x51,
+	0x6e, 0x06, 0xde, 0x6f, 0xf7, 0xa4, 0x3c, 0xba, 0x02, 0xb5, 0xde, 0xa0, 0xbd, 0xd7, 0xed, 0x1f,
+	0x44, 0x2c, 0x05, 0x3a, 0x08, 0xd6, 0xd7, 0xa8, 0x3b, 0x8a, 0xa8, 0x9b, 0x74, 0x9c, 0xa3, 0xd7,
+	0xdd, 0xe1, 0xb0, 0xb3, 0x27, 0x15, 0x9b, 0xbf, 0xcb, 0x8a, 0x32, 0x55, 0x84, 0x17, 0x84, 0x20,
+	0x1f, 0x04, 0x91, 0x23, 0x64, 0xff, 0xd1, 0x03, 0xa8, 0xb3, 0xda, 0x4e, 0x25, 0xe6, 0x14, 0xab,
+	0x53, 0xd3, 0xb2, 0x4c, 0x5e, 0x71, 0xe6, 0x94, 0x1a, 0xfb, 0x30, 0x36, 0xa7, 0xf8, 0x88, 0x91,
+	0x69, 0x90, 0x89, 0x05, 0xf1, 0x0b, 0xec, 0xf9, 0xa1, 0x33, 0x29, 0x2b, 0x52, 0x14, 0x93, 0xdf,
+	0x70, 0x3a, 0x7a, 0x0c, 0x57, 0xc2, 0xda, 0x26, 0xae, 0xed, 0x3c, 0x63, 0x47, 0xe2, 0xd3, 0xde,
+	0xec, 0x0b, 0x35, 0x7b, 0x11, 0xa9, 0xd8, 0x86, 0x2b, 0x2b, 0x61, 0x13, 0x3d, 0x84, 0x3a, 0xad,
+	0x9c, 0x4c, 0x7b, 0xa2, 0x1a, 0xa6, 0x87, 0x75, 0xe2, 0x78, 0x97, 0x2c, 0xd3, 0x2c, 0x2b, 0x92,
+	0xf8, 0xb0, 0x17, 0xd2, 0x69, 0xbf, 0xb3, 0xa2, 0x6d, 0xc6, 0x5e, 0xe4, 0xfd, 0x46, 0x9f, 0x66,
+	0x02, 0x7f, 0x01, 0xe0, 0x63, 0xef, 0x02, 0x7b, 0xaa, 0x6b, 0x1a, 0x2c, 0x39, 0xcb, 0x29, 0x65,
+	0x4e, 0x19, 0x9a, 0x46, 0xf3, 0x11, 0xdc, 0x58, 0x12, 0x92, 0xa9, 0x42, 0x35, 0x6f, 0xe2, 0x8b,
+	0x50, 0xc7, 0xfe, 0x37, 0xff, 0x3f, 0x0b, 0x95, 0x44, 0x1c, 0x45, 0x9f, 0x00, 0xd7, 0x64, 0xe0,
+	0xaa, 0x62, 0xd6, 0x42, 0xa0, 0x2a, 0xc8, 0x82, 0x1d, 0x3d, 0x83, 0x06, 0x7e, 0xe7, 0x5a, 0xa6,
+	0x6e, 0x52, 0x33, 0x4e, 0x4a, 0x64, 0x99, 0xc4, 0xf5, 0xf0, 0xfb, 0x28, 0x29, 0x79, 0x13, 0x4a,
+	0xfa, 0x54, 0x54, 0xc3, 0x39, 0x1e, 0x77, 0xf5, 0x29, 0x1f, 0xe3, 0x03, 0xa8, 0x47, 0xa0, 0x11,
+	0x4f, 0x9e, 0xf1, 0xd4, 0xc2, 0x0f, 0xbb, 0x82, 0xf7, 0x0d, 0xd4, 0xe7, 0x4e, 0x46, 0x84, 0xf3,
+	0xfb, 0xac, 0x75, 0x62, 0x69, 0xdf, 0xe1, 0xd6, 0xfc, 0xc9, 0x49, 0x37, 0xa2, 0x0c, 0x19, 0x41,
+	0x91, 0xcc, 0x14, 0x85, 0x0e, 0x8f, 0x99, 0x0c, 0xd1, 0x26, 0x62, 0xd9, 0x8a, 0xb4, 0x3d, 0xd6,
+	0x26, 0xcd, 0x7b, 0x50, 0x60, 0x29, 0x06, 0x5d, 0x7d, 0x3f, 0xd0, 0x75, 0xec, 0xf3, 0xb4, 0xaa,
+	0xa4, 0x84, 0xcd, 0xe6, 0xbf, 0x41, 0x2d, 0x95, 0xad, 0xa0, 0x17, 0x90, 0x37, 0x09, 0x9e, 0x32,
+	0x3d, 0x2e, 0xa9, 0x6d, 0x53, 0x22, 0xad, 0x2e, 0xc1, 0x53, 0x85, 0x49, 0xc9, 0x2d, 0xc8, 0xd3,
+	0x16, 0xf5, 0xc7, 0xe7, 0xf8, 0x32, 0xcc, 0x69, 0xce, 0xf1, 0x25, 0x75, 0xa7, 0x17, 0x9a, 0x15,
+	0xe0, 0x30, 0x7e, 0xb2, 0x46, 0xf3, 0x4f, 0x19, 0xa8, 0x24, 0x3c, 0x23, 0x92, 0xa1, 0x34, 0xb5,
+	0xf1, 0xd4, 0xb1, 0x4d, 0x5d, 0x88, 0x47, 0x6d, 0x74, 0x1f, 0x2a, 0xae, 0xa5, 0x91, 0x53, 0xc7,
+	0x9b, 0xaa, 0xb4, 0x16, 0x13, 0x58, 0xdb, 0x21, 0x91, 0x66, 0x30, 0xb4, 0x6b, 0xdd, 0x0d, 0xc4,
+	0xde, 0xa1, 0x7f, 0x69, 0xb5, 0x3d, 0xd5, 0xce, 0xb1, 0x7a, 0xa1, 0x79, 0xa6, 0x76, 0x62, 0xf1,
+	0x35, 0x5a, 0x52, 0x0f, 0x27, 0x06, 0xd3, 0x3a, 0xd2, 0xce, 0xf1, 0x1b, 0x21, 0xd5, 0xb1, 0x89,
+	0x77, 0xa9, 0x6c, 0x4f, 0x63, 0x24, 0xf9, 0x25, 0xd4, 0xe7, 0x58, 0xd6, 0x9d, 0xfb, 0xf3, 0xec,
+	0xb3, 0x4c, 0xb3, 0x0e, 0xb5, 0x54, 0xa6, 0xd7, 0xfc, 0xf7, 0x0c, 0x48, 0xe9, 0x74, 0x0e, 0xdd,
+	0x81, 0x2d, 0x51, 0x70, 0x9e, 0x9b, 0x76, 0xe8, 0x66, 0x80, 0x93, 0x5e, 0x9b, 0xb6, 0x81, 0xbe,
+	0x84, 0x32, 0xaf, 0x5a, 0xcc, 0xef, 0x78, 0x37, 0xd5, 0xa7, 0x1f, 0x2d, 0x9a, 0x1f, 0x8b, 0x71,
+	0xe6, 0x77, 0x58, 0x29, 0x11, 0xf1, 0x8f, 0x8e, 0x97, 0x5a, 0x0f, 0x37, 0x6e, 0xfa, 0xb7, 0x39,
+	0x86, 0x3c, 0x4d, 0x01, 0xe9, 0x26, 0x64, 0x6a, 0x16, 0x5e, 0x8d, 0xfe, 0x47, 0x88, 0x66, 0xab,
+	0x26, 0x9f, 0xc9, 0xe1, 0x06, 0xcd, 0x57, 0x4d, 0xf4, 0x11, 0x94, 0x74, 0xc7, 0x26, 0xd8, 0x26,
+	0x3e, 0xd3, 0xfb, 0x36, 0x2d, 0x96, 0x43, 0xca, 0xce, 0x26, 0xe4, 0x4f, 0x4d, 0x0b, 0x37, 0xff,
+	0x3b, 0x03, 0xb5, 0x54, 0x8e, 0x89, 0x5a, 0x50, 0xa0, 0xdf, 0x7c, 0x61, 0x6e, 0x8d, 0x45, 0x43,
+	0xa6, 0x9c, 0x0a, 0x67, 0x43, 0x03, 0x28, 0xd3, 0x3f, 0xb4, 0x94, 0xe7, 0x1b, 0xf7, 0x07, 0xd5,
+	0xf2, 0x4a, 0x89, 0x82, 0x8c, 0x30, 0xf1, 0x9b, 0xdf, 0xe7, 0xa0, 0xca, 0x73, 0xc2, 0xce, 0x3b,
+	0xac, 0x07, 0xd4, 0x97, 0x2f, 0xdd, 0x2e, 0x54, 0x1f, 0xe4, 0xd2, 0xc5, 0xcc, 0x91, 0x95, 0x15,
+	0xf6, 0x1f, 0xdd, 0x82, 0x32, 0x7e, 0x47, 0x1d, 0x80, 0x63, 0x60, 0x91, 0x7f, 0x94, 0x28, 0x61,
+	0xd7, 0x31, 0x30, 0x7a, 0x12, 0xc5, 0x62, 0x9e, 0x17, 0x2e, 0x9f, 0x5f, 0x18, 0xa5, 0x9f, 0x44,
+	0x51, 0x3a, 0xbf, 0x86, 0x04, 0xf6, 0x3c, 0xd4, 0x08, 0xf3, 0x14, 0xe6, 0xd9, 0x77, 0xb2, 0x8d,
+	0x4c, 0x98, 0xab, 0x7c, 0x9b, 0xce, 0x55, 0x8a, 0x3f, 0x2c, 0x57, 0x61, 0x98, 0xa9, 0x84, 0xeb,
+	0xe5, 0x5c, 0xd6, 0xbc, 0xb9, 0x62, 0xbc, 0xa9, 0x7c, 0xfa, 0x1e, 0x6c, 0x27, 0x4e, 0x1a, 0xcb,
+	0xcc, 0xfc, 0xb6, 0x62, 0x05, 0x55, 0xf3, 0x1d, 0x6c, 0x71, 0xe6, 0x03, 0xcf, 0x09, 0xdc, 0x85,
+	0xd6, 0x98, 0xb0, 0x87, 0xdc, 0x8f, 0xb7, 0x87, 0x57, 0xf9, 0x52, 0x56, 0xca, 0x35, 0xff, 0x90,
+	0x85, 0x6a, 0xb2, 0x8a, 0x79, 0x8f, 0x55, 0xdc, 0x4f, 0xee, 0xcd, 0xd9, 0x32, 0xc4, 0xf7, 0xe7,
+	0x3f, 0xc4, 0xf7, 0xe7, 0xe6, 0xea, 0xfd, 0xc9, 0x00, 0x66, 0x7b, 0x74, 0x07, 0xb6, 0xb9, 0x9a,
+	0xd5, 0x09, 0xd5, 0x85, 0x30, 0xfd, 0x3b, 0x8b, 0x10, 0x62, 0x2a, 0x53, 0xb6, 0x9c, 0x98, 0xfe,
+	0x0e, 0x40, 0x32, 0xa7, 0xae, 0xe3, 0x11, 0xcd, 0x26, 0xe1, 0xa2, 0xe5, 0xdf, 0xbf, 0xed, 0xd8,
+	0x28, 0x6a, 0x91, 0x94, 0x58, 0xba, 0x39, 0x87, 0x81, 0x9e, 0xc0, 0x55, 0x36, 0x3b, 0x9a, 0xe9,
+	0x38, 0x01, 0x51, 0x7d, 0xac, 0x3b, 0xb6, 0xe1, 0x33, 0x83, 0xcb, 0x29, 0x88, 0x7e, 0x1b, 0xf3,
+	0x4f, 0x23, 0xfe, 0xa5, 0xf9, 0xab, 0x12, 0xc0, 0xac, 0x5e, 0x40, 0x7f, 0x4b, 0xcd, 0x9e, 0x1d,
+	0x02, 0x17, 0x98, 0x6e, 0x6e, 0x2f, 0xd5, 0x0d, 0xe3, 0x52, 0x04, 0x37, 0x2d, 0xde, 0xf8, 0x3f,
+	0x35, 0x3c, 0x38, 0x28, 0xf3, 0xe2, 0x8d, 0x53, 0xf7, 0x38, 0x91, 0xb2, 0xe9, 0x9a, 0x7e, 0x86,
+	0x0d, 0xd5, 0x72, 0x74, 0xcd, 0xb2, 0x2e, 0xd9, 0xee, 0x2a, 0x29, 0x15, 0x4e, 0xed, 0x71, 0x22,
+	0xda, 0x83, 0x3b, 0x6c, 0x1a, 0xa2, 0x26, 0xe0, 0x99, 0x82, 0xc8, 0xdc, 0x54, 0xec, 0x3a, 0xfa,
+	0x19, 0x5b, 0xba, 0x9c, 0x72, 0x8b, 0xb2, 0xb5, 0x39, 0x17, 0xcb, 0x17, 0x78, 0x1a, 0xd7, 0xa1,
+	0x2c, 0xe8, 0x25, 0x7c, 0x94, 0x40, 0x31, 0xc4, 0x9e, 0x09, 0x53, 0xc0, 0x1c, 0x83, 0xb8, 0x19,
+	0x83, 0xd8, 0x13, 0x1c, 0x22, 0x19, 0xdc, 0x07, 0xc4, 0x01, 0xf8, 0x09, 0xa0, 0x58, 0xaa, 0xec,
+	0x0a, 0x0f, 0x29, 0x31, 0x40, 0x26, 0x22, 0xd6, 0xa9, 0x01, 0xc5, 0xb7, 0x9a, 0x67, 0x9b, 0xf6,
+	0xa4, 0x51, 0xe4, 0x99, 0x8b, 0x68, 0xa2, 0x11, 0x54, 0x31, 0x73, 0x77, 0x14, 0xdf, 0xb4, 0x4f,
+	0x1d, 0x71, 0x70, 0xf6, 0xf9, 0x32, 0xb5, 0xf3, 0x65, 0x6a, 0x75, 0x42, 0xa1, 0xae, 0x7d, 0xea,
+	0x28, 0x15, 0x1c, 0x6f, 0xca, 0xbf, 0xcf, 0x43, 0x25, 0xc1, 0x80, 0x1e, 0x42, 0x2d, 0x6d, 0x11,
+	0xec, 0xa8, 0x86, 0x99, 0x55, 0x95, 0x24, 0x2c, 0x82, 0x06, 0x7e, 0x9f, 0x78, 0x1a, 0xc1, 0x93,
+	0x4b, 0x11, 0x27, 0xa3, 0x36, 0xcd, 0xf3, 0xc4, 0xfa, 0x79, 0x78, 0xea, 0x10, 0x6c, 0xf1, 0x1c,
+	0xb5, 0xa4, 0x88, 0x65, 0x55, 0x04, 0x35, 0xe9, 0x8d, 0x8b, 0x29, 0x6f, 0x2c, 0x43, 0xe9, 0xcc,
+	0xf1, 0x09, 0x73, 0x22, 0x3c, 0x3d, 0x88, 0xda, 0x68, 0x02, 0x12, 0x31, 0xa7, 0x34, 0x0d, 0x3e,
+	0xf1, 0xb0, 0x76, 0x6e, 0x38, 0x6f, 0xc3, 0xc3, 0xed, 0x17, 0x1f, 0xa2, 0x93, 0xd6, 0x98, 0x81,
+	0xec, 0x84, 0x18, 0x4a, 0x8d, 0x24, 0x09, 0x48, 0x83, 0xaa, 0x87, 0x7d, 0x27, 0xf0, 0x74, 0xac,
+	0x06, 0xbe, 0x36, 0xc1, 0x8d, 0x02, 0x5b, 0xd8, 0xe7, 0x1f, 0xd4, 0x8d, 0x22, 0x20, 0x8e, 0x29,
+	0x82, 0x52, 0xf1, 0xe2, 0x4d, 0xf9, 0x7f, 0x32, 0x50, 0x4b, 0x8d, 0x03, 0x29, 0x50, 0xd0, 0xcf,
+	0x4c, 0xcb, 0x10, 0x81, 0xf6, 0xc7, 0x4d, 0x8a, 0x43, 0x45, 0x0e, 0x39, 0x1b, 0x73, 0xc8, 0x34,
+	0x51, 0x89, 0x95, 0x3b, 0xdc, 0xd6, 0x81, 0x44, 0x95, 0x8e, 0xfc, 0x25, 0x54, 0x12, 0x83, 0x5f,
+	0xe8, 0xd6, 0x13, 0x09, 0x53, 0x4e, 0x24, 0x4c, 0xaf, 0xf2, 0xa5, 0x8c, 0x94, 0x6d, 0xfe, 0x57,
+	0x16, 0xb6, 0x62, 0x95, 0x3a, 0xea, 0x40, 0xd5, 0xb9, 0xc0, 0x9e, 0x66, 0x59, 0xea, 0x07, 0xb9,
+	0x90, 0x8a, 0x90, 0x12, 0x79, 0xef, 0x5f, 0x41, 0x8d, 0x38, 0x44, 0xb3, 0x54, 0x2f, 0xb0, 0x13,
+	0xc7, 0x8a, 0x15, 0x46, 0x56, 0x02, 0x9b, 0x1d, 0x2c, 0xd2, 0x00, 0xed, 0x6a, 0xbe, 0xcf, 0xae,
+	0xfc, 0xde, 0xbf, 0x21, 0x05, 0x1f, 0x95, 0x38, 0xd5, 0x4c, 0x0b, 0x1b, 0xab, 0xbc, 0xad, 0x22,
+	0xf8, 0xd0, 0xa7, 0x20, 0xf1, 0xb1, 0xd8, 0xc1, 0x54, 0xe5, 0x16, 0xce, 0xec, 0xbd, 0xa0, 0x54,
+	0x19, 0xbd, 0x1f, 0x4c, 0x77, 0x19, 0xb5, 0xf9, 0xc7, 0x0c, 0x54, 0x12, 0xe7, 0x06, 0x74, 0xcf,
+	0x45, 0xea, 0x88, 0xc7, 0x2b, 0xbe, 0xe7, 0xc2, 0x39, 0x8b, 0xd0, 0x75, 0x10, 0xdf, 0x2e, 0x3c,
+	0x45, 0x79, 0xb0, 0x34, 0x7c, 0x86, 0x5d, 0xb4, 0x3a, 0x62, 0x43, 0xc5, 0xb6, 0xd6, 0xe7, 0x80,
+	0xf8, 0xc9, 0xf6, 0x82, 0x62, 0x57, 0xe2, 0x5f, 0x66, 0xd5, 0xae, 0xfc, 0x14, 0x4a, 0x21, 0xc6,
+	0x92, 0x1c, 0x33, 0x1f, 0x4b, 0xa7, 0xd8, 0xff, 0xe6, 0x6f, 0x0a, 0xa2, 0xe4, 0x16, 0x67, 0x1f,
+	0xe8, 0x18, 0xaa, 0xc2, 0x41, 0x86, 0x27, 0xf5, 0x99, 0x15, 0x27, 0xf5, 0x42, 0x52, 0x5c, 0x90,
+	0x08, 0xfb, 0x51, 0x2a, 0x5a, 0xbc, 0x49, 0x61, 0xa7, 0x78, 0xea, 0x78, 0x97, 0xd1, 0x99, 0x77,
+	0x76, 0x4d, 0xd8, 0x23, 0x26, 0x26, 0x5a, 0x4a, 0x65, 0x1a, 0x6f, 0x52, 0x58, 0x91, 0x24, 0x84,
+	0xb0, 0xb9, 0x35, 0x61, 0x79, 0x1e, 0x12, 0xc1, 0x92, 0x78, 0x13, 0x7d, 0x0d, 0x35, 0x57, 0xd3,
+	0xcf, 0xb5, 0x09, 0x8e, 0x70, 0xf3, 0x2b, 0x8e, 0xe8, 0x43, 0xdc, 0x21, 0x97, 0x0b, 0x81, 0xab,
+	0x6e, 0xa2, 0x2d, 0xeb, 0x50, 0x49, 0xe8, 0x89, 0xfa, 0x60, 0xae, 0x29, 0x5f, 0xd5, 0x3d, 0xac,
+	0x11, 0xcc, 0xcb, 0x90, 0x9c, 0x22, 0x96, 0xc1, 0xdf, 0xe5, 0x54, 0xf4, 0x59, 0x78, 0x77, 0xe5,
+	0xab, 0x58, 0xe4, 0xd4, 0xe1, 0xb1, 0x87, 0xa0, 0x87, 0xa9, 0xb6, 0xdc, 0x85, 0x4a, 0x42, 0x6b,
+	0xe8, 0x19, 0xdc, 0x0c, 0x7c, 0x6c, 0xa8, 0x67, 0x58, 0x73, 0x59, 0xae, 0xa4, 0xba, 0x8e, 0x4f,
+	0x54, 0x36, 0x17, 0xd1, 0xdd, 0x35, 0xca, 0x70, 0x88, 0x35, 0x97, 0x26, 0x46, 0x43, 0xc7, 0x27,
+	0x6c, 0x56, 0x32, 0x86, 0x4a, 0x42, 0x53, 0x34, 0xe6, 0x73, 0x5d, 0xf9, 0xaa, 0xe5, 0x68, 0x46,
+	0x34, 0x5c, 0xa1, 0x41, 0xbf, 0xc7, 0x88, 0xe8, 0x11, 0xa0, 0x90, 0x2d, 0x76, 0x63, 0xca, 0xc7,
+	0x2b, 0xae, 0x52, 0xfd, 0x59, 0x21, 0x26, 0x7f, 0x09, 0xd5, 0xa4, 0xe2, 0xa8, 0x5e, 0x84, 0xea,
+	0x52, 0x1d, 0x85, 0x1a, 0x15, 0x3d, 0x35, 0xff, 0x5e, 0x6c, 0xd5, 0xe8, 0x76, 0xe5, 0x01, 0xe4,
+	0x2c, 0x67, 0xb2, 0xb2, 0xf4, 0xa1, 0x4c, 0xcd, 0xff, 0xdc, 0x06, 0x98, 0x25, 0xb1, 0xe8, 0x49,
+	0x74, 0xec, 0xbe, 0xf5, 0xf4, 0xee, 0xaa, 0x84, 0x57, 0xc9, 0x9a, 0x06, 0x7a, 0x01, 0x25, 0xe6,
+	0xb5, 0x3d, 0x6c, 0x8b, 0x54, 0x62, 0xb5, 0x5c, 0x24, 0x41, 0xb3, 0x75, 0x4b, 0xf3, 0xa9, 0xf1,
+	0xfa, 0x2c, 0x66, 0x5d, 0x65, 0xd1, 0x77, 0x8b, 0xd2, 0x8e, 0x38, 0x09, 0x3d, 0x8f, 0xbd, 0xab,
+	0xe0, 0xb6, 0xbd, 0x30, 0xc1, 0x0d, 0xcf, 0x29, 0x13, 0x0f, 0x29, 0xfe, 0x0e, 0x8a, 0x1a, 0x3f,
+	0x55, 0x14, 0xe6, 0x7b, 0xeb, 0x3d, 0x07, 0x8f, 0x87, 0x1b, 0x4a, 0xc8, 0x8d, 0x5e, 0xcc, 0x5e,
+	0x60, 0x14, 0x56, 0x28, 0x43, 0x1c, 0xd5, 0xc5, 0x9f, 0x5c, 0x98, 0xef, 0x7b, 0x72, 0xb1, 0xbd,
+	0xfc, 0x6d, 0xc8, 0x92, 0x43, 0xab, 0xf7, 0xbd, 0xb1, 0x18, 0x2d, 0x7f, 0x63, 0xc1, 0xef, 0xd4,
+	0x6e, 0xb6, 0x12, 0xcf, 0x61, 0x92, 0xb0, 0x4b, 0x1e, 0x51, 0xbc, 0x9a, 0x7b, 0xe3, 0xc0, 0xaf,
+	0xb7, 0xef, 0x2d, 0xac, 0x0b, 0xe2, 0x27, 0x67, 0xf3, 0x8f, 0x1a, 0x86, 0x0b, 0x1e, 0x64, 0xf0,
+	0x77, 0x03, 0xf7, 0xd7, 0x38, 0x03, 0x5a, 0xf4, 0x02, 0xe3, 0xaf, 0xc3, 0x67, 0x12, 0xd7, 0xc4,
+	0x04, 0x17, 0x19, 0x38, 0x65, 0x98, 0xbd, 0x8b, 0xe8, 0xa6, 0x2b, 0xd6, 0xfa, 0xf2, 0xf9, 0x24,
+	0x8a, 0xd4, 0xf9, 0x87, 0x10, 0x6d, 0x28, 0x61, 0x71, 0xa4, 0x22, 0x4a, 0xd3, 0x85, 0xf3, 0x48,
+	0x9d, 0xbe, 0x50, 0xab, 0x0c, 0xc5, 0xd0, 0x3e, 0x40, 0xcc, 0x25, 0xf0, 0xa7, 0x30, 0x1f, 0x2f,
+	0xcc, 0x2a, 0x52, 0xc7, 0x35, 0x87, 0x1b, 0x4a, 0x4c, 0x12, 0xbd, 0x80, 0x4d, 0xee, 0xf8, 0x44,
+	0x01, 0xde, 0x5c, 0x68, 0xdc, 0x89, 0x43, 0x88, 0xc3, 0x0d, 0x45, 0xc8, 0x20, 0x05, 0x50, 0xf4,
+	0x7c, 0x41, 0x75, 0x4e, 0x55, 0x7e, 0x5e, 0x52, 0x5b, 0x3e, 0xa5, 0x54, 0x79, 0x4b, 0x97, 0xc6,
+	0x4e, 0x1d, 0xbb, 0xec, 0x40, 0x79, 0xf6, 0xae, 0xa0, 0xb4, 0x7c, 0x50, 0xc9, 0x1a, 0xf8, 0x70,
+	0x43, 0x99, 0x89, 0xa1, 0x76, 0xf2, 0xe6, 0x9d, 0xbf, 0xd8, 0xb8, 0xfd, 0xfe, 0xbc, 0x32, 0x75,
+	0xd5, 0xbe, 0x97, 0xba, 0x6a, 0xe7, 0x77, 0xe2, 0x77, 0x96, 0x26, 0x6e, 0x9c, 0x2d, 0x7d, 0xb7,
+	0xfe, 0x12, 0x4a, 0xd1, 0xad, 0x7a, 0x75, 0xb9, 0xbd, 0x24, 0x72, 0x18, 0xba, 0xce, 0xa1, 0x10,
+	0x7a, 0x3d, 0x7f, 0x83, 0x7e, 0x63, 0x05, 0x4e, 0xe8, 0xc3, 0xe7, 0xaf, 0xcc, 0x0f, 0xd2, 0x57,
+	0xe6, 0x8d, 0x15, 0x7e, 0x49, 0xc4, 0x91, 0xf4, 0x1d, 0xf9, 0x4e, 0x19, 0x8a, 0xae, 0x76, 0x49,
+	0x23, 0xca, 0xab, 0x7c, 0x69, 0x4b, 0xda, 0x7e, 0x95, 0x2f, 0x5d, 0x91, 0xae, 0x3e, 0x38, 0x80,
+	0x52, 0x78, 0x46, 0x90, 0xbc, 0x3b, 0x29, 0x43, 0x61, 0x74, 0xd4, 0xee, 0xf5, 0xa4, 0x0c, 0x02,
+	0xd8, 0x3c, 0xea, 0xec, 0x75, 0x8f, 0x8f, 0xa4, 0x2c, 0x25, 0xf7, 0xda, 0xca, 0x81, 0xb8, 0xfb,
+	0xe8, 0xf4, 0x07, 0xca, 0xd1, 0xe0, 0x78, 0x24, 0xe5, 0x1f, 0xfc, 0x6f, 0x86, 0x57, 0xe0, 0x62,
+	0xb7, 0x56, 0xa0, 0xdc, 0x1f, 0xa8, 0xa3, 0x71, 0x7b, 0x7c, 0x3c, 0x92, 0x36, 0x28, 0xc4, 0xb0,
+	0x3d, 0x1a, 0xb1, 0xfb, 0x97, 0x32, 0x14, 0xf6, 0x7b, 0xed, 0xd7, 0xdf, 0x48, 0x59, 0xda, 0xe3,
+	0xb8, 0x7b, 0xd4, 0x19, 0x1c, 0x8f, 0xa5, 0x1c, 0xe5, 0xd9, 0x6f, 0x77, 0x7b, 0x9d, 0x3d, 0x29,
+	0x8f, 0xaa, 0x00, 0xdd, 0xfe, 0xee, 0xe0, 0x68, 0xd8, 0xeb, 0x8c, 0x3b, 0x52, 0x01, 0x21, 0xa8,
+	0x8a, 0x7b, 0x98, 0xd9, 0x15, 0xca, 0x15, 0xa8, 0x71, 0x7e, 0x75, 0x1c, 0x5e, 0xdf, 0x14, 0xd1,
+	0x6d, 0x90, 0xc7, 0x83, 0x41, 0x4f, 0x3d, 0x6c, 0xf7, 0xc6, 0x9d, 0x3d, 0x75, 0xa7, 0xb3, 0x3f,
+	0x50, 0x3a, 0xea, 0xb8, 0x33, 0x1a, 0x77, 0xfb, 0x07, 0x52, 0x69, 0xe7, 0x10, 0xa8, 0x63, 0x6c,
+	0x4d, 0x1c, 0x67, 0x62, 0xe1, 0x96, 0x81, 0x2f, 0xe8, 0x22, 0xf9, 0x5c, 0x9b, 0x2d, 0xcb, 0x3c,
+	0xe1, 0xff, 0x98, 0x5a, 0xb9, 0x56, 0x77, 0xae, 0xcf, 0x62, 0xd8, 0x88, 0x51, 0x86, 0x9e, 0x43,
+	0x1c, 0xff, 0x64, 0x93, 0x3d, 0x31, 0xfc, 0xe2, 0xcf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x49, 0x2f,
+	0x5b, 0xda, 0xe3, 0x28, 0x00, 0x00,
+}
diff --git a/go/tools/gopackagesdriver/proto/command_line/BUILD.bazel b/go/tools/gopackagesdriver/proto/command_line/BUILD.bazel
new file mode 100644
index 0000000..cfcfc5d
--- /dev/null
+++ b/go/tools/gopackagesdriver/proto/command_line/BUILD.bazel
@@ -0,0 +1,12 @@
+load("@io_bazel_rules_go//go:def.bzl", "go_library")
+
+go_library(
+    name = "go_default_library",
+    srcs = ["command_line.pb.go"],
+    importpath = "github.com/bazelbuild/rules_go/go/tools/gopackagesdriver/proto/command_line",
+    visibility = ["//visibility:public"],
+    deps = [
+        "//go/tools/gopackagesdriver/proto/option_filters:go_default_library",
+        "@com_github_golang_protobuf//proto:go_default_library",
+    ],
+)
diff --git a/go/tools/gopackagesdriver/proto/command_line/command_line.pb.go b/go/tools/gopackagesdriver/proto/command_line/command_line.pb.go
new file mode 100644
index 0000000..16eed62
--- /dev/null
+++ b/go/tools/gopackagesdriver/proto/command_line/command_line.pb.go
@@ -0,0 +1,391 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: src/main/protobuf/command_line.proto
+
+package command_line
+
+import (
+	fmt "fmt"
+	option_filters "github.com/bazelbuild/rules_go/go/tools/gopackagesdriver/proto/option_filters"
+	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
+
+// Representation of a Bazel command line.
+type CommandLine struct {
+	// A title for this command line value, to differentiate it from others.
+	// In particular, a single invocation may wish to report both the literal and
+	// canonical command lines, and this label would be used to differentiate
+	// between both versions. This is a string for flexibility.
+	CommandLineLabel string `protobuf:"bytes,1,opt,name=command_line_label,json=commandLineLabel,proto3" json:"command_line_label,omitempty"`
+	// A Bazel command line is made of distinct parts. For example,
+	//    `bazel --nomaster_bazelrc test --nocache_test_results //foo:aTest`
+	// has the executable "bazel", a startup flag, a command "test", a command
+	// flag, and a test target. There could be many more flags and targets, or
+	// none (`bazel info` for example), but the basic structure is there. The
+	// command line should be broken down into these logical sections here.
+	Sections             []*CommandLineSection `protobuf:"bytes,2,rep,name=sections,proto3" json:"sections,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *CommandLine) Reset()         { *m = CommandLine{} }
+func (m *CommandLine) String() string { return proto.CompactTextString(m) }
+func (*CommandLine) ProtoMessage()    {}
+func (*CommandLine) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a6c030aeb09bb06d, []int{0}
+}
+
+func (m *CommandLine) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CommandLine.Unmarshal(m, b)
+}
+func (m *CommandLine) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CommandLine.Marshal(b, m, deterministic)
+}
+func (m *CommandLine) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CommandLine.Merge(m, src)
+}
+func (m *CommandLine) XXX_Size() int {
+	return xxx_messageInfo_CommandLine.Size(m)
+}
+func (m *CommandLine) XXX_DiscardUnknown() {
+	xxx_messageInfo_CommandLine.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CommandLine proto.InternalMessageInfo
+
+func (m *CommandLine) GetCommandLineLabel() string {
+	if m != nil {
+		return m.CommandLineLabel
+	}
+	return ""
+}
+
+func (m *CommandLine) GetSections() []*CommandLineSection {
+	if m != nil {
+		return m.Sections
+	}
+	return nil
+}
+
+// A section of the Bazel command line.
+type CommandLineSection struct {
+	// The name of this section, such as "startup_option" or "command".
+	SectionLabel string `protobuf:"bytes,1,opt,name=section_label,json=sectionLabel,proto3" json:"section_label,omitempty"`
+	// Types that are valid to be assigned to SectionType:
+	//	*CommandLineSection_ChunkList
+	//	*CommandLineSection_OptionList
+	SectionType          isCommandLineSection_SectionType `protobuf_oneof:"section_type"`
+	XXX_NoUnkeyedLiteral struct{}                         `json:"-"`
+	XXX_unrecognized     []byte                           `json:"-"`
+	XXX_sizecache        int32                            `json:"-"`
+}
+
+func (m *CommandLineSection) Reset()         { *m = CommandLineSection{} }
+func (m *CommandLineSection) String() string { return proto.CompactTextString(m) }
+func (*CommandLineSection) ProtoMessage()    {}
+func (*CommandLineSection) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a6c030aeb09bb06d, []int{1}
+}
+
+func (m *CommandLineSection) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CommandLineSection.Unmarshal(m, b)
+}
+func (m *CommandLineSection) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CommandLineSection.Marshal(b, m, deterministic)
+}
+func (m *CommandLineSection) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CommandLineSection.Merge(m, src)
+}
+func (m *CommandLineSection) XXX_Size() int {
+	return xxx_messageInfo_CommandLineSection.Size(m)
+}
+func (m *CommandLineSection) XXX_DiscardUnknown() {
+	xxx_messageInfo_CommandLineSection.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CommandLineSection proto.InternalMessageInfo
+
+func (m *CommandLineSection) GetSectionLabel() string {
+	if m != nil {
+		return m.SectionLabel
+	}
+	return ""
+}
+
+type isCommandLineSection_SectionType interface {
+	isCommandLineSection_SectionType()
+}
+
+type CommandLineSection_ChunkList struct {
+	ChunkList *ChunkList `protobuf:"bytes,2,opt,name=chunk_list,json=chunkList,proto3,oneof"`
+}
+
+type CommandLineSection_OptionList struct {
+	OptionList *OptionList `protobuf:"bytes,3,opt,name=option_list,json=optionList,proto3,oneof"`
+}
+
+func (*CommandLineSection_ChunkList) isCommandLineSection_SectionType() {}
+
+func (*CommandLineSection_OptionList) isCommandLineSection_SectionType() {}
+
+func (m *CommandLineSection) GetSectionType() isCommandLineSection_SectionType {
+	if m != nil {
+		return m.SectionType
+	}
+	return nil
+}
+
+func (m *CommandLineSection) GetChunkList() *ChunkList {
+	if x, ok := m.GetSectionType().(*CommandLineSection_ChunkList); ok {
+		return x.ChunkList
+	}
+	return nil
+}
+
+func (m *CommandLineSection) GetOptionList() *OptionList {
+	if x, ok := m.GetSectionType().(*CommandLineSection_OptionList); ok {
+		return x.OptionList
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*CommandLineSection) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*CommandLineSection_ChunkList)(nil),
+		(*CommandLineSection_OptionList)(nil),
+	}
+}
+
+// Wrapper to allow a list of strings in the "oneof" section_type.
+type ChunkList struct {
+	Chunk                []string `protobuf:"bytes,1,rep,name=chunk,proto3" json:"chunk,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ChunkList) Reset()         { *m = ChunkList{} }
+func (m *ChunkList) String() string { return proto.CompactTextString(m) }
+func (*ChunkList) ProtoMessage()    {}
+func (*ChunkList) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a6c030aeb09bb06d, []int{2}
+}
+
+func (m *ChunkList) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ChunkList.Unmarshal(m, b)
+}
+func (m *ChunkList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ChunkList.Marshal(b, m, deterministic)
+}
+func (m *ChunkList) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ChunkList.Merge(m, src)
+}
+func (m *ChunkList) XXX_Size() int {
+	return xxx_messageInfo_ChunkList.Size(m)
+}
+func (m *ChunkList) XXX_DiscardUnknown() {
+	xxx_messageInfo_ChunkList.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ChunkList proto.InternalMessageInfo
+
+func (m *ChunkList) GetChunk() []string {
+	if m != nil {
+		return m.Chunk
+	}
+	return nil
+}
+
+// Wrapper to allow a list of options in the "oneof" section_type.
+type OptionList struct {
+	Option               []*Option `protobuf:"bytes,1,rep,name=option,proto3" json:"option,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
+	XXX_unrecognized     []byte    `json:"-"`
+	XXX_sizecache        int32     `json:"-"`
+}
+
+func (m *OptionList) Reset()         { *m = OptionList{} }
+func (m *OptionList) String() string { return proto.CompactTextString(m) }
+func (*OptionList) ProtoMessage()    {}
+func (*OptionList) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a6c030aeb09bb06d, []int{3}
+}
+
+func (m *OptionList) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_OptionList.Unmarshal(m, b)
+}
+func (m *OptionList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_OptionList.Marshal(b, m, deterministic)
+}
+func (m *OptionList) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_OptionList.Merge(m, src)
+}
+func (m *OptionList) XXX_Size() int {
+	return xxx_messageInfo_OptionList.Size(m)
+}
+func (m *OptionList) XXX_DiscardUnknown() {
+	xxx_messageInfo_OptionList.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_OptionList proto.InternalMessageInfo
+
+func (m *OptionList) GetOption() []*Option {
+	if m != nil {
+		return m.Option
+	}
+	return nil
+}
+
+// A single command line option.
+//
+// This represents the option itself, but does not take into account the type of
+// option or how the parser interpreted it. If this option is part of a command
+// line that represents the actual input that Bazel received, it would, for
+// example, include expansion flags as they are. However, if this option
+// represents the canonical form of the command line, with the values as Bazel
+// understands them, then the expansion flag, which has no value, would not
+// appear, and the flags it expands to would.
+type Option struct {
+	// How the option looks with the option and its value combined. Depending on
+	// the purpose of this command line report, this could be the canonical
+	// form, or the way that the flag was set.
+	//
+	// Some examples: this might be `--foo=bar` form, or `--foo bar` with a space;
+	// for boolean flags, `--nobaz` is accepted on top of `--baz=false` and other
+	// negating values, or for a positive value, the unqualified `--baz` form
+	// is also accepted. This could also be a short `-b`, if the flag has an
+	// abbreviated form.
+	CombinedForm string `protobuf:"bytes,1,opt,name=combined_form,json=combinedForm,proto3" json:"combined_form,omitempty"`
+	// The canonical name of the option, without the preceding dashes.
+	OptionName string `protobuf:"bytes,2,opt,name=option_name,json=optionName,proto3" json:"option_name,omitempty"`
+	// The value of the flag, or unset for flags that do not take values.
+	// Especially for boolean flags, this should be in canonical form, the
+	// combined_form field above gives room for showing the flag as it was set
+	// if that is preferred.
+	OptionValue string `protobuf:"bytes,3,opt,name=option_value,json=optionValue,proto3" json:"option_value,omitempty"`
+	// This flag's tagged effects. See OptionEffectTag's java documentation for
+	// details.
+	EffectTags []option_filters.OptionEffectTag `protobuf:"varint,4,rep,packed,name=effect_tags,json=effectTags,proto3,enum=options.OptionEffectTag" json:"effect_tags,omitempty"`
+	// Metadata about the flag. See OptionMetadataTag's java documentation for
+	// details.
+	MetadataTags         []option_filters.OptionMetadataTag `protobuf:"varint,5,rep,packed,name=metadata_tags,json=metadataTags,proto3,enum=options.OptionMetadataTag" json:"metadata_tags,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                           `json:"-"`
+	XXX_unrecognized     []byte                             `json:"-"`
+	XXX_sizecache        int32                              `json:"-"`
+}
+
+func (m *Option) Reset()         { *m = Option{} }
+func (m *Option) String() string { return proto.CompactTextString(m) }
+func (*Option) ProtoMessage()    {}
+func (*Option) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a6c030aeb09bb06d, []int{4}
+}
+
+func (m *Option) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Option.Unmarshal(m, b)
+}
+func (m *Option) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Option.Marshal(b, m, deterministic)
+}
+func (m *Option) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Option.Merge(m, src)
+}
+func (m *Option) XXX_Size() int {
+	return xxx_messageInfo_Option.Size(m)
+}
+func (m *Option) XXX_DiscardUnknown() {
+	xxx_messageInfo_Option.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Option proto.InternalMessageInfo
+
+func (m *Option) GetCombinedForm() string {
+	if m != nil {
+		return m.CombinedForm
+	}
+	return ""
+}
+
+func (m *Option) GetOptionName() string {
+	if m != nil {
+		return m.OptionName
+	}
+	return ""
+}
+
+func (m *Option) GetOptionValue() string {
+	if m != nil {
+		return m.OptionValue
+	}
+	return ""
+}
+
+func (m *Option) GetEffectTags() []option_filters.OptionEffectTag {
+	if m != nil {
+		return m.EffectTags
+	}
+	return nil
+}
+
+func (m *Option) GetMetadataTags() []option_filters.OptionMetadataTag {
+	if m != nil {
+		return m.MetadataTags
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*CommandLine)(nil), "command_line.CommandLine")
+	proto.RegisterType((*CommandLineSection)(nil), "command_line.CommandLineSection")
+	proto.RegisterType((*ChunkList)(nil), "command_line.ChunkList")
+	proto.RegisterType((*OptionList)(nil), "command_line.OptionList")
+	proto.RegisterType((*Option)(nil), "command_line.Option")
+}
+
+func init() {
+	proto.RegisterFile("src/main/protobuf/command_line.proto", fileDescriptor_a6c030aeb09bb06d)
+}
+
+var fileDescriptor_a6c030aeb09bb06d = []byte{
+	// 432 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x92, 0xdf, 0x6a, 0xd4, 0x40,
+	0x14, 0xc6, 0x4d, 0xd7, 0x2e, 0xe6, 0x64, 0x5b, 0x64, 0x28, 0x18, 0x7a, 0x63, 0x1a, 0x45, 0x02,
+	0xd6, 0x59, 0x58, 0x6f, 0xfc, 0x07, 0x42, 0x45, 0xf1, 0x62, 0x55, 0x88, 0xe2, 0x6d, 0x98, 0x4c,
+	0x26, 0xeb, 0xe0, 0xfc, 0x59, 0x32, 0x93, 0x42, 0xdf, 0xce, 0x17, 0xf2, 0x1d, 0x24, 0x33, 0x93,
+	0xec, 0x6e, 0xeb, 0x55, 0x72, 0xbe, 0x7c, 0xbf, 0xf3, 0x9d, 0x73, 0x08, 0x3c, 0x35, 0x1d, 0x5d,
+	0x4a, 0xc2, 0xd5, 0x72, 0xdb, 0x69, 0xab, 0xeb, 0xbe, 0x5d, 0x52, 0x2d, 0x25, 0x51, 0x4d, 0x25,
+	0xb8, 0x62, 0xd8, 0xa9, 0x68, 0xb1, 0xaf, 0x9d, 0x3f, 0xbb, 0xcb, 0xe8, 0xad, 0xe5, 0x5a, 0x55,
+	0x2d, 0x17, 0x96, 0x75, 0xc6, 0x53, 0xf9, 0x0d, 0x24, 0x1f, 0x3c, 0xb7, 0xe6, 0x8a, 0xa1, 0x4b,
+	0x40, 0xfb, 0x6d, 0x2a, 0x41, 0x6a, 0x26, 0xd2, 0x28, 0x8b, 0x8a, 0xb8, 0x7c, 0x48, 0x77, 0xc6,
+	0xf5, 0xa0, 0xa3, 0x77, 0xf0, 0xc0, 0x30, 0x3a, 0x74, 0x35, 0xe9, 0x51, 0x36, 0x2b, 0x92, 0x55,
+	0x86, 0x0f, 0x26, 0xdb, 0x6b, 0xfd, 0xdd, 0x1b, 0xcb, 0x89, 0xc8, 0xff, 0x44, 0x80, 0xee, 0x1a,
+	0xd0, 0x13, 0x38, 0x09, 0x96, 0x83, 0xf4, 0x45, 0x10, 0x7d, 0xf2, 0x2b, 0x00, 0xfa, 0xab, 0x57,
+	0xbf, 0x2b, 0xc1, 0x8d, 0x4d, 0x8f, 0xb2, 0xa8, 0x48, 0x56, 0x8f, 0x6e, 0x65, 0x0f, 0xdf, 0xd7,
+	0xdc, 0xd8, 0xcf, 0xf7, 0xca, 0x98, 0x8e, 0x05, 0x7a, 0x0b, 0x49, 0x38, 0x84, 0x43, 0x67, 0x0e,
+	0x4d, 0x0f, 0xd1, 0x6f, 0xce, 0x10, 0x58, 0xd0, 0x53, 0x75, 0x75, 0x0a, 0xe3, 0x18, 0x95, 0xbd,
+	0xd9, 0xb2, 0xfc, 0x02, 0xe2, 0x29, 0x06, 0x9d, 0xc1, 0xb1, 0x8b, 0x49, 0xa3, 0x6c, 0x56, 0xc4,
+	0xa5, 0x2f, 0xf2, 0x37, 0x00, 0xbb, 0x76, 0xe8, 0x12, 0xe6, 0xbe, 0x9d, 0x33, 0x25, 0xab, 0xb3,
+	0xff, 0x05, 0x97, 0xc1, 0x93, 0xff, 0x8d, 0x60, 0xee, 0xa5, 0xe1, 0x2a, 0x54, 0xcb, 0x9a, 0x2b,
+	0xd6, 0x54, 0xad, 0xee, 0xe4, 0x78, 0x95, 0x51, 0xfc, 0xa4, 0x3b, 0x89, 0x1e, 0x4f, 0xbb, 0x29,
+	0x22, 0x99, 0x3b, 0x4b, 0x3c, 0xce, 0xff, 0x95, 0x48, 0x86, 0x2e, 0x60, 0x11, 0x0c, 0xd7, 0x44,
+	0xf4, 0xcc, 0x6d, 0x1f, 0x97, 0x01, 0xfa, 0x39, 0x48, 0xe8, 0x35, 0x24, 0xac, 0x6d, 0x19, 0xb5,
+	0x95, 0x25, 0x1b, 0x93, 0xde, 0xcf, 0x66, 0xc5, 0xe9, 0x2a, 0xc5, 0xde, 0x62, 0xc2, 0x84, 0x1f,
+	0x9d, 0xe3, 0x07, 0xd9, 0x94, 0xc0, 0xc6, 0x57, 0x83, 0xde, 0xc3, 0x89, 0x64, 0x96, 0x34, 0xc4,
+	0x12, 0x0f, 0x1f, 0x3b, 0xf8, 0xfc, 0x16, 0xfc, 0x25, 0x78, 0x06, 0x7c, 0x21, 0x77, 0x85, 0xb9,
+	0x7a, 0x01, 0xcf, 0xa9, 0x96, 0x78, 0xa3, 0xf5, 0x46, 0x30, 0xdc, 0xb0, 0x6b, 0xab, 0xb5, 0x30,
+	0xb8, 0xee, 0xb9, 0x68, 0xb0, 0xe0, 0x35, 0xee, 0x7a, 0x65, 0xb9, 0x0c, 0x7f, 0x7c, 0x3d, 0x77,
+	0x8f, 0x97, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0xae, 0x90, 0x2a, 0x02, 0x20, 0x03, 0x00, 0x00,
+}
diff --git a/go/tools/gopackagesdriver/proto/genproto.sh b/go/tools/gopackagesdriver/proto/genproto.sh
new file mode 100755
index 0000000..74ff8f4
--- /dev/null
+++ b/go/tools/gopackagesdriver/proto/genproto.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+set -euo pipefail
+cd "$(dirname "$0")"
+M=Msrc/main/protobuf/invocation_policy.proto=github.com/bazelbuild/rules_go/go/tools/gopackagesdriver/proto/invocation_policy
+M=$M,Msrc/main/protobuf/command_line.proto=github.com/bazelbuild/rules_go/go/tools/gopackagesdriver/proto/command_line
+M=$M,Msrc/main/protobuf/option_filters.proto=github.com/bazelbuild/rules_go/go/tools/gopackagesdriver/proto/option_filters
+protos=(
+  build_event_stream.proto
+  src/main/protobuf/invocation_policy.proto
+  src/main/protobuf/command_line.proto
+  src/main/protobuf/option_filters.proto
+)
+
+for proto in "${protos[@]}"; do
+  protoc --go_out="${M}:." "$proto"
+  mv "$(dirname "$proto")/$(basename "$proto" .proto).pb.go" "$(basename "$proto" .proto)"
+done
diff --git a/go/tools/gopackagesdriver/proto/invocation_policy/BUILD.bazel b/go/tools/gopackagesdriver/proto/invocation_policy/BUILD.bazel
new file mode 100644
index 0000000..be15d61
--- /dev/null
+++ b/go/tools/gopackagesdriver/proto/invocation_policy/BUILD.bazel
@@ -0,0 +1,9 @@
+load("@io_bazel_rules_go//go:def.bzl", "go_library")
+
+go_library(
+    name = "go_default_library",
+    srcs = ["invocation_policy.pb.go"],
+    importpath = "github.com/bazelbuild/rules_go/go/tools/gopackagesdriver/proto/invocation_policy",
+    visibility = ["//visibility:public"],
+    deps = ["@com_github_golang_protobuf//proto:go_default_library"],
+)
diff --git a/go/tools/gopackagesdriver/proto/invocation_policy/invocation_policy.pb.go b/go/tools/gopackagesdriver/proto/invocation_policy/invocation_policy.pb.go
new file mode 100644
index 0000000..62b17fd
--- /dev/null
+++ b/go/tools/gopackagesdriver/proto/invocation_policy/invocation_policy.pb.go
@@ -0,0 +1,576 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: src/main/protobuf/invocation_policy.proto
+
+package blaze_invocation_policy
+
+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 --invocation_policy flag takes a base64-encoded binary-serialized or text
+// formatted InvocationPolicy message.
+type InvocationPolicy struct {
+	// Order matters.
+	// After expanding policies on expansion flags or flags with implicit
+	// requirements, only the final policy on a specific flag will be enforced
+	// onto the user's command line.
+	FlagPolicies         []*FlagPolicy `protobuf:"bytes,1,rep,name=flag_policies,json=flagPolicies" json:"flag_policies,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
+	XXX_unrecognized     []byte        `json:"-"`
+	XXX_sizecache        int32         `json:"-"`
+}
+
+func (m *InvocationPolicy) Reset()         { *m = InvocationPolicy{} }
+func (m *InvocationPolicy) String() string { return proto.CompactTextString(m) }
+func (*InvocationPolicy) ProtoMessage()    {}
+func (*InvocationPolicy) Descriptor() ([]byte, []int) {
+	return fileDescriptor_e130ca0062eb2b66, []int{0}
+}
+
+func (m *InvocationPolicy) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_InvocationPolicy.Unmarshal(m, b)
+}
+func (m *InvocationPolicy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_InvocationPolicy.Marshal(b, m, deterministic)
+}
+func (m *InvocationPolicy) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_InvocationPolicy.Merge(m, src)
+}
+func (m *InvocationPolicy) XXX_Size() int {
+	return xxx_messageInfo_InvocationPolicy.Size(m)
+}
+func (m *InvocationPolicy) XXX_DiscardUnknown() {
+	xxx_messageInfo_InvocationPolicy.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_InvocationPolicy proto.InternalMessageInfo
+
+func (m *InvocationPolicy) GetFlagPolicies() []*FlagPolicy {
+	if m != nil {
+		return m.FlagPolicies
+	}
+	return nil
+}
+
+// A policy for controlling the value of a flag.
+type FlagPolicy struct {
+	// The name of the flag to enforce this policy on.
+	//
+	// Note that this should be the full name of the flag, not the abbreviated
+	// name of the flag. If the user specifies the abbreviated name of a flag,
+	// that flag will be matched using its full name.
+	//
+	// The "no" prefix will not be parsed, so for boolean flags, use
+	// the flag's full name and explicitly set it to true or false.
+	FlagName *string `protobuf:"bytes,1,opt,name=flag_name,json=flagName" json:"flag_name,omitempty"`
+	// If set, this flag policy is applied only if one of the given commands or a
+	// command that inherits from one of the given commands is being run. For
+	// instance, if "build" is one of the commands here, then this policy will
+	// apply to any command that inherits from build, such as info, coverage, or
+	// test. If empty, this flag policy is applied for all commands. This allows
+	// the policy setter to add all policies to the proto without having to
+	// determine which Bazel command the user is actually running. Additionally,
+	// Bazel allows multiple flags to be defined by the same name, and the
+	// specific flag definition is determined by the command.
+	Commands []string `protobuf:"bytes,2,rep,name=commands" json:"commands,omitempty"`
+	// Types that are valid to be assigned to Operation:
+	//	*FlagPolicy_SetValue
+	//	*FlagPolicy_UseDefault
+	//	*FlagPolicy_DisallowValues
+	//	*FlagPolicy_AllowValues
+	Operation            isFlagPolicy_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
+	XXX_unrecognized     []byte                 `json:"-"`
+	XXX_sizecache        int32                  `json:"-"`
+}
+
+func (m *FlagPolicy) Reset()         { *m = FlagPolicy{} }
+func (m *FlagPolicy) String() string { return proto.CompactTextString(m) }
+func (*FlagPolicy) ProtoMessage()    {}
+func (*FlagPolicy) Descriptor() ([]byte, []int) {
+	return fileDescriptor_e130ca0062eb2b66, []int{1}
+}
+
+func (m *FlagPolicy) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FlagPolicy.Unmarshal(m, b)
+}
+func (m *FlagPolicy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FlagPolicy.Marshal(b, m, deterministic)
+}
+func (m *FlagPolicy) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FlagPolicy.Merge(m, src)
+}
+func (m *FlagPolicy) XXX_Size() int {
+	return xxx_messageInfo_FlagPolicy.Size(m)
+}
+func (m *FlagPolicy) XXX_DiscardUnknown() {
+	xxx_messageInfo_FlagPolicy.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FlagPolicy proto.InternalMessageInfo
+
+func (m *FlagPolicy) GetFlagName() string {
+	if m != nil && m.FlagName != nil {
+		return *m.FlagName
+	}
+	return ""
+}
+
+func (m *FlagPolicy) GetCommands() []string {
+	if m != nil {
+		return m.Commands
+	}
+	return nil
+}
+
+type isFlagPolicy_Operation interface {
+	isFlagPolicy_Operation()
+}
+
+type FlagPolicy_SetValue struct {
+	SetValue *SetValue `protobuf:"bytes,3,opt,name=set_value,json=setValue,oneof"`
+}
+
+type FlagPolicy_UseDefault struct {
+	UseDefault *UseDefault `protobuf:"bytes,4,opt,name=use_default,json=useDefault,oneof"`
+}
+
+type FlagPolicy_DisallowValues struct {
+	DisallowValues *DisallowValues `protobuf:"bytes,5,opt,name=disallow_values,json=disallowValues,oneof"`
+}
+
+type FlagPolicy_AllowValues struct {
+	AllowValues *AllowValues `protobuf:"bytes,6,opt,name=allow_values,json=allowValues,oneof"`
+}
+
+func (*FlagPolicy_SetValue) isFlagPolicy_Operation() {}
+
+func (*FlagPolicy_UseDefault) isFlagPolicy_Operation() {}
+
+func (*FlagPolicy_DisallowValues) isFlagPolicy_Operation() {}
+
+func (*FlagPolicy_AllowValues) isFlagPolicy_Operation() {}
+
+func (m *FlagPolicy) GetOperation() isFlagPolicy_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *FlagPolicy) GetSetValue() *SetValue {
+	if x, ok := m.GetOperation().(*FlagPolicy_SetValue); ok {
+		return x.SetValue
+	}
+	return nil
+}
+
+func (m *FlagPolicy) GetUseDefault() *UseDefault {
+	if x, ok := m.GetOperation().(*FlagPolicy_UseDefault); ok {
+		return x.UseDefault
+	}
+	return nil
+}
+
+func (m *FlagPolicy) GetDisallowValues() *DisallowValues {
+	if x, ok := m.GetOperation().(*FlagPolicy_DisallowValues); ok {
+		return x.DisallowValues
+	}
+	return nil
+}
+
+func (m *FlagPolicy) GetAllowValues() *AllowValues {
+	if x, ok := m.GetOperation().(*FlagPolicy_AllowValues); ok {
+		return x.AllowValues
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*FlagPolicy) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*FlagPolicy_SetValue)(nil),
+		(*FlagPolicy_UseDefault)(nil),
+		(*FlagPolicy_DisallowValues)(nil),
+		(*FlagPolicy_AllowValues)(nil),
+	}
+}
+
+type SetValue struct {
+	// Use this value for the specified flag, overriding any default or user-set
+	// value (unless append is set to true for repeatable flags).
+	//
+	// This field is repeated for repeatable flags. It is an error to set
+	// multiple values for a flag that is not actually a repeatable flag.
+	// This requires at least 1 value, if even the empty string.
+	//
+	// If the flag allows multiple values, all of its values are replaced with the
+	// value or values from the policy (i.e., no diffing or merging is performed),
+	// unless the append field (see below) is set to true.
+	//
+	// Note that some flags are tricky. For example, some flags look like boolean
+	// flags, but are actually Void expansion flags that expand into other flags.
+	// The Bazel flag parser will accept "--void_flag=false", but because
+	// the flag is Void, the "=false" is ignored. It can get even trickier, like
+	// "--novoid_flag" which is also an expansion flag with the type Void whose
+	// name is explicitly "novoid_flag" and which expands into other flags that
+	// are the opposite of "--void_flag". For expansion flags, it's best to
+	// explicitly override the flags they expand into.
+	//
+	// Other flags may be differently tricky: A flag could have a converter that
+	// converts some string to a list of values, but that flag may not itself have
+	// allowMultiple set to true.
+	//
+	// An example is "--test_tag_filters": this flag sets its converter to
+	// CommaSeparatedOptionListConverter, but does not set allowMultiple to true.
+	// So "--test_tag_filters=foo,bar" results in ["foo", "bar"], however
+	// "--test_tag_filters=foo --test_tag_filters=bar" results in just ["bar"]
+	// since the 2nd value overrides the 1st.
+	//
+	// Similarly, "--test_tag_filters=foo,bar --test_tag_filters=baz,qux" results
+	// in ["baz", "qux"]. For flags like these, the policy should specify
+	// "foo,bar" instead of separately specifying "foo" and "bar" so that the
+	// converter is appropriately invoked.
+	//
+	// Note that the opposite is not necessarily
+	// true: for a flag that specifies allowMultiple=true, "--flag=foo,bar"
+	// may fail to parse or result in an unexpected value.
+	FlagValue []string `protobuf:"bytes,1,rep,name=flag_value,json=flagValue" json:"flag_value,omitempty"`
+	// Whether to allow this policy to be overridden by user-specified values.
+	// When set, if the user specified a value for this flag, use the value
+	// from the user, otherwise use the value specified in this policy.
+	Overridable *bool `protobuf:"varint,2,opt,name=overridable" json:"overridable,omitempty"`
+	// If true, and if the flag named in the policy is a repeatable flag, then
+	// the values listed in flag_value do not replace all the user-set or default
+	// values of the flag, but instead append to them. If the flag is not
+	// repeatable, then this has no effect.
+	Append               *bool    `protobuf:"varint,3,opt,name=append" json:"append,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *SetValue) Reset()         { *m = SetValue{} }
+func (m *SetValue) String() string { return proto.CompactTextString(m) }
+func (*SetValue) ProtoMessage()    {}
+func (*SetValue) Descriptor() ([]byte, []int) {
+	return fileDescriptor_e130ca0062eb2b66, []int{2}
+}
+
+func (m *SetValue) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SetValue.Unmarshal(m, b)
+}
+func (m *SetValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SetValue.Marshal(b, m, deterministic)
+}
+func (m *SetValue) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SetValue.Merge(m, src)
+}
+func (m *SetValue) XXX_Size() int {
+	return xxx_messageInfo_SetValue.Size(m)
+}
+func (m *SetValue) XXX_DiscardUnknown() {
+	xxx_messageInfo_SetValue.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SetValue proto.InternalMessageInfo
+
+func (m *SetValue) GetFlagValue() []string {
+	if m != nil {
+		return m.FlagValue
+	}
+	return nil
+}
+
+func (m *SetValue) GetOverridable() bool {
+	if m != nil && m.Overridable != nil {
+		return *m.Overridable
+	}
+	return false
+}
+
+func (m *SetValue) GetAppend() bool {
+	if m != nil && m.Append != nil {
+		return *m.Append
+	}
+	return false
+}
+
+type UseDefault struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *UseDefault) Reset()         { *m = UseDefault{} }
+func (m *UseDefault) String() string { return proto.CompactTextString(m) }
+func (*UseDefault) ProtoMessage()    {}
+func (*UseDefault) Descriptor() ([]byte, []int) {
+	return fileDescriptor_e130ca0062eb2b66, []int{3}
+}
+
+func (m *UseDefault) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UseDefault.Unmarshal(m, b)
+}
+func (m *UseDefault) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UseDefault.Marshal(b, m, deterministic)
+}
+func (m *UseDefault) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UseDefault.Merge(m, src)
+}
+func (m *UseDefault) XXX_Size() int {
+	return xxx_messageInfo_UseDefault.Size(m)
+}
+func (m *UseDefault) XXX_DiscardUnknown() {
+	xxx_messageInfo_UseDefault.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UseDefault proto.InternalMessageInfo
+
+type DisallowValues struct {
+	// It is an error for the user to use any of these values (that is, the Bazel
+	// command will fail), unless new_value or use_default is set.
+	//
+	// For repeatable flags, if any one of the values in the flag matches a value
+	// in the list of disallowed values, an error is thrown.
+	//
+	// Care must be taken for flags with complicated converters. For example,
+	// it's possible for a repeated flag to be of type List<List<T>>, so that
+	// "--foo=a,b --foo=c,d" results in foo=[["a","b"], ["c", "d"]]. In this case,
+	// it is not possible to disallow just "b", nor will ["b", "a"] match, nor
+	// will ["b", "c"] (but ["a", "b"] will still match).
+	DisallowedValues []string `protobuf:"bytes,1,rep,name=disallowed_values,json=disallowedValues" json:"disallowed_values,omitempty"`
+	// Types that are valid to be assigned to ReplacementValue:
+	//	*DisallowValues_NewValue
+	//	*DisallowValues_UseDefault
+	ReplacementValue     isDisallowValues_ReplacementValue `protobuf_oneof:"replacement_value"`
+	XXX_NoUnkeyedLiteral struct{}                          `json:"-"`
+	XXX_unrecognized     []byte                            `json:"-"`
+	XXX_sizecache        int32                             `json:"-"`
+}
+
+func (m *DisallowValues) Reset()         { *m = DisallowValues{} }
+func (m *DisallowValues) String() string { return proto.CompactTextString(m) }
+func (*DisallowValues) ProtoMessage()    {}
+func (*DisallowValues) Descriptor() ([]byte, []int) {
+	return fileDescriptor_e130ca0062eb2b66, []int{4}
+}
+
+func (m *DisallowValues) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DisallowValues.Unmarshal(m, b)
+}
+func (m *DisallowValues) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DisallowValues.Marshal(b, m, deterministic)
+}
+func (m *DisallowValues) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DisallowValues.Merge(m, src)
+}
+func (m *DisallowValues) XXX_Size() int {
+	return xxx_messageInfo_DisallowValues.Size(m)
+}
+func (m *DisallowValues) XXX_DiscardUnknown() {
+	xxx_messageInfo_DisallowValues.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DisallowValues proto.InternalMessageInfo
+
+func (m *DisallowValues) GetDisallowedValues() []string {
+	if m != nil {
+		return m.DisallowedValues
+	}
+	return nil
+}
+
+type isDisallowValues_ReplacementValue interface {
+	isDisallowValues_ReplacementValue()
+}
+
+type DisallowValues_NewValue struct {
+	NewValue string `protobuf:"bytes,3,opt,name=new_value,json=newValue,oneof"`
+}
+
+type DisallowValues_UseDefault struct {
+	UseDefault *UseDefault `protobuf:"bytes,4,opt,name=use_default,json=useDefault,oneof"`
+}
+
+func (*DisallowValues_NewValue) isDisallowValues_ReplacementValue() {}
+
+func (*DisallowValues_UseDefault) isDisallowValues_ReplacementValue() {}
+
+func (m *DisallowValues) GetReplacementValue() isDisallowValues_ReplacementValue {
+	if m != nil {
+		return m.ReplacementValue
+	}
+	return nil
+}
+
+func (m *DisallowValues) GetNewValue() string {
+	if x, ok := m.GetReplacementValue().(*DisallowValues_NewValue); ok {
+		return x.NewValue
+	}
+	return ""
+}
+
+func (m *DisallowValues) GetUseDefault() *UseDefault {
+	if x, ok := m.GetReplacementValue().(*DisallowValues_UseDefault); ok {
+		return x.UseDefault
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*DisallowValues) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*DisallowValues_NewValue)(nil),
+		(*DisallowValues_UseDefault)(nil),
+	}
+}
+
+type AllowValues struct {
+	// It is an error for the user to use any value not in this list, unless
+	// new_value or use_default is set.
+	AllowedValues []string `protobuf:"bytes,1,rep,name=allowed_values,json=allowedValues" json:"allowed_values,omitempty"`
+	// Types that are valid to be assigned to ReplacementValue:
+	//	*AllowValues_NewValue
+	//	*AllowValues_UseDefault
+	ReplacementValue     isAllowValues_ReplacementValue `protobuf_oneof:"replacement_value"`
+	XXX_NoUnkeyedLiteral struct{}                       `json:"-"`
+	XXX_unrecognized     []byte                         `json:"-"`
+	XXX_sizecache        int32                          `json:"-"`
+}
+
+func (m *AllowValues) Reset()         { *m = AllowValues{} }
+func (m *AllowValues) String() string { return proto.CompactTextString(m) }
+func (*AllowValues) ProtoMessage()    {}
+func (*AllowValues) Descriptor() ([]byte, []int) {
+	return fileDescriptor_e130ca0062eb2b66, []int{5}
+}
+
+func (m *AllowValues) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AllowValues.Unmarshal(m, b)
+}
+func (m *AllowValues) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AllowValues.Marshal(b, m, deterministic)
+}
+func (m *AllowValues) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AllowValues.Merge(m, src)
+}
+func (m *AllowValues) XXX_Size() int {
+	return xxx_messageInfo_AllowValues.Size(m)
+}
+func (m *AllowValues) XXX_DiscardUnknown() {
+	xxx_messageInfo_AllowValues.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AllowValues proto.InternalMessageInfo
+
+func (m *AllowValues) GetAllowedValues() []string {
+	if m != nil {
+		return m.AllowedValues
+	}
+	return nil
+}
+
+type isAllowValues_ReplacementValue interface {
+	isAllowValues_ReplacementValue()
+}
+
+type AllowValues_NewValue struct {
+	NewValue string `protobuf:"bytes,3,opt,name=new_value,json=newValue,oneof"`
+}
+
+type AllowValues_UseDefault struct {
+	UseDefault *UseDefault `protobuf:"bytes,4,opt,name=use_default,json=useDefault,oneof"`
+}
+
+func (*AllowValues_NewValue) isAllowValues_ReplacementValue() {}
+
+func (*AllowValues_UseDefault) isAllowValues_ReplacementValue() {}
+
+func (m *AllowValues) GetReplacementValue() isAllowValues_ReplacementValue {
+	if m != nil {
+		return m.ReplacementValue
+	}
+	return nil
+}
+
+func (m *AllowValues) GetNewValue() string {
+	if x, ok := m.GetReplacementValue().(*AllowValues_NewValue); ok {
+		return x.NewValue
+	}
+	return ""
+}
+
+func (m *AllowValues) GetUseDefault() *UseDefault {
+	if x, ok := m.GetReplacementValue().(*AllowValues_UseDefault); ok {
+		return x.UseDefault
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*AllowValues) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*AllowValues_NewValue)(nil),
+		(*AllowValues_UseDefault)(nil),
+	}
+}
+
+func init() {
+	proto.RegisterType((*InvocationPolicy)(nil), "blaze.invocation_policy.InvocationPolicy")
+	proto.RegisterType((*FlagPolicy)(nil), "blaze.invocation_policy.FlagPolicy")
+	proto.RegisterType((*SetValue)(nil), "blaze.invocation_policy.SetValue")
+	proto.RegisterType((*UseDefault)(nil), "blaze.invocation_policy.UseDefault")
+	proto.RegisterType((*DisallowValues)(nil), "blaze.invocation_policy.DisallowValues")
+	proto.RegisterType((*AllowValues)(nil), "blaze.invocation_policy.AllowValues")
+}
+
+func init() {
+	proto.RegisterFile("src/main/protobuf/invocation_policy.proto", fileDescriptor_e130ca0062eb2b66)
+}
+
+var fileDescriptor_e130ca0062eb2b66 = []byte{
+	// 463 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x54, 0xd1, 0x8a, 0xd3, 0x40,
+	0x14, 0x6d, 0xda, 0x75, 0x49, 0x6e, 0xba, 0xb5, 0x3b, 0x82, 0x06, 0x65, 0x21, 0x46, 0xc5, 0xca,
+	0xe2, 0x14, 0xf6, 0x0b, 0xb4, 0x2c, 0x4b, 0xd7, 0x07, 0x91, 0x88, 0x3e, 0x09, 0x65, 0x92, 0xb9,
+	0x2d, 0x03, 0x93, 0x99, 0x90, 0x49, 0x5a, 0xf4, 0xc3, 0x7c, 0xf5, 0xc3, 0x7c, 0x91, 0x4e, 0x92,
+	0x6d, 0x83, 0xe6, 0xcd, 0x87, 0x7d, 0x9b, 0x7b, 0xce, 0xe9, 0xe1, 0xdc, 0x73, 0x4b, 0xe0, 0x8d,
+	0x29, 0xd2, 0x79, 0xc6, 0x84, 0x9a, 0xe7, 0x85, 0x2e, 0x75, 0x52, 0xad, 0xe7, 0x42, 0x6d, 0x75,
+	0xca, 0x4a, 0xa1, 0xd5, 0x2a, 0xd7, 0x52, 0xa4, 0xdf, 0xa9, 0xa5, 0xc8, 0x93, 0x44, 0xb2, 0x1f,
+	0x48, 0xff, 0xa2, 0xa3, 0x6f, 0x30, 0xbd, 0xbd, 0x03, 0x3f, 0x59, 0x8c, 0x2c, 0xe1, 0x6c, 0x2d,
+	0xd9, 0xa6, 0x96, 0x08, 0x34, 0x81, 0x13, 0x8e, 0x66, 0xfe, 0xd5, 0x0b, 0xda, 0x63, 0x42, 0x6f,
+	0x24, 0xdb, 0xd4, 0xbf, 0x8d, 0xc7, 0xeb, 0xf6, 0x2d, 0xd0, 0x44, 0xbf, 0x87, 0x00, 0x07, 0x92,
+	0x3c, 0x03, 0xcf, 0x1a, 0x2b, 0x96, 0x61, 0xe0, 0x84, 0xce, 0xcc, 0x8b, 0xdd, 0x3d, 0xf0, 0x91,
+	0x65, 0x48, 0x9e, 0x82, 0x9b, 0xea, 0x2c, 0x63, 0x8a, 0x9b, 0x60, 0x18, 0x8e, 0xf6, 0x5c, 0x3b,
+	0x93, 0x77, 0xe0, 0x19, 0x2c, 0x57, 0x5b, 0x26, 0x2b, 0x0c, 0x46, 0xa1, 0x33, 0xf3, 0xaf, 0x9e,
+	0xf7, 0xa6, 0xf9, 0x8c, 0xe5, 0xd7, 0xbd, 0x70, 0x39, 0x88, 0x5d, 0xd3, 0xbc, 0xc9, 0x0d, 0xf8,
+	0x95, 0xc1, 0x15, 0xc7, 0x35, 0xab, 0x64, 0x19, 0x9c, 0x58, 0x8f, 0xfe, 0x8d, 0xbe, 0x18, 0xbc,
+	0xae, 0xa5, 0xcb, 0x41, 0x0c, 0xd5, 0xdd, 0x44, 0x62, 0x78, 0xc8, 0x85, 0x61, 0x52, 0xea, 0x5d,
+	0x1d, 0xc7, 0x04, 0x0f, 0xac, 0xd7, 0xeb, 0x5e, 0xaf, 0xeb, 0x46, 0x6f, 0x83, 0x98, 0xe5, 0x20,
+	0x9e, 0xf0, 0x0e, 0x42, 0x6e, 0x61, 0xdc, 0x31, 0x3c, 0xb5, 0x86, 0x2f, 0x7b, 0x0d, 0xdf, 0x77,
+	0xdc, 0xfc, 0x23, 0xab, 0x85, 0x0f, 0x9e, 0xce, 0xb1, 0xb0, 0xf2, 0x28, 0x05, 0xb7, 0xed, 0x82,
+	0x5c, 0x00, 0xd8, 0xea, 0xeb, 0x0a, 0x1d, 0xdb, 0xaf, 0x3d, 0x46, 0x4d, 0x87, 0xe0, 0xeb, 0x2d,
+	0x16, 0x85, 0xe0, 0x2c, 0x91, 0x18, 0x0c, 0x43, 0x67, 0xe6, 0xc6, 0xc7, 0x10, 0x79, 0x0c, 0xa7,
+	0x2c, 0xcf, 0x51, 0x71, 0xdb, 0xbf, 0x1b, 0x37, 0x53, 0x34, 0x06, 0x38, 0x94, 0x15, 0xfd, 0x72,
+	0x60, 0xd2, 0xdd, 0x97, 0x5c, 0xc2, 0x79, 0xbb, 0x2f, 0xf2, 0x76, 0xc5, 0x3a, 0xc0, 0xf4, 0x40,
+	0x34, 0xe2, 0x0b, 0xf0, 0x14, 0xee, 0x8e, 0x0e, 0xed, 0xed, 0xaf, 0xa8, 0x70, 0xf7, 0x5f, 0xaf,
+	0xb8, 0x78, 0x04, 0xe7, 0x05, 0xe6, 0x92, 0xa5, 0x98, 0xa1, 0x6a, 0xfe, 0x57, 0x1f, 0x4e, 0xdc,
+	0xe1, 0x74, 0x14, 0xfd, 0x74, 0xc0, 0x3f, 0x2a, 0x98, 0xbc, 0x82, 0xc9, 0x3f, 0xb3, 0x9f, 0xdd,
+	0xb3, 0xe0, 0x8b, 0xb7, 0x70, 0x99, 0xea, 0x8c, 0x6e, 0xb4, 0xde, 0x48, 0xa4, 0x1c, 0xb7, 0xa5,
+	0xd6, 0xd2, 0xd0, 0xa4, 0x12, 0x92, 0x53, 0x29, 0x12, 0x5a, 0x54, 0xaa, 0x14, 0x19, 0xd6, 0x5f,
+	0x84, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x3e, 0x89, 0xdf, 0xe8, 0x3d, 0x04, 0x00, 0x00,
+}
diff --git a/go/tools/gopackagesdriver/proto/option_filters/BUILD.bazel b/go/tools/gopackagesdriver/proto/option_filters/BUILD.bazel
new file mode 100644
index 0000000..8ab785c
--- /dev/null
+++ b/go/tools/gopackagesdriver/proto/option_filters/BUILD.bazel
@@ -0,0 +1,9 @@
+load("@io_bazel_rules_go//go:def.bzl", "go_library")
+
+go_library(
+    name = "go_default_library",
+    srcs = ["option_filters.pb.go"],
+    importpath = "github.com/bazelbuild/rules_go/go/tools/gopackagesdriver/proto/option_filters",
+    visibility = ["//visibility:public"],
+    deps = ["@com_github_golang_protobuf//proto:go_default_library"],
+)
diff --git a/go/tools/gopackagesdriver/proto/option_filters/option_filters.pb.go b/go/tools/gopackagesdriver/proto/option_filters/option_filters.pb.go
new file mode 100644
index 0000000..4bfbcf8
--- /dev/null
+++ b/go/tools/gopackagesdriver/proto/option_filters/option_filters.pb.go
@@ -0,0 +1,169 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: src/main/protobuf/option_filters.proto
+
+package options
+
+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
+
+// Docs in java enum.
+type OptionEffectTag int32
+
+const (
+	// This option's effect or intent is unknown.
+	OptionEffectTag_UNKNOWN OptionEffectTag = 0
+	// This flag has literally no effect.
+	OptionEffectTag_NO_OP                               OptionEffectTag = 1
+	OptionEffectTag_LOSES_INCREMENTAL_STATE             OptionEffectTag = 2
+	OptionEffectTag_CHANGES_INPUTS                      OptionEffectTag = 3
+	OptionEffectTag_AFFECTS_OUTPUTS                     OptionEffectTag = 4
+	OptionEffectTag_BUILD_FILE_SEMANTICS                OptionEffectTag = 5
+	OptionEffectTag_BAZEL_INTERNAL_CONFIGURATION        OptionEffectTag = 6
+	OptionEffectTag_LOADING_AND_ANALYSIS                OptionEffectTag = 7
+	OptionEffectTag_EXECUTION                           OptionEffectTag = 8
+	OptionEffectTag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS OptionEffectTag = 9
+	OptionEffectTag_EAGERNESS_TO_EXIT                   OptionEffectTag = 10
+	OptionEffectTag_BAZEL_MONITORING                    OptionEffectTag = 11
+	OptionEffectTag_TERMINAL_OUTPUT                     OptionEffectTag = 12
+	OptionEffectTag_ACTION_COMMAND_LINES                OptionEffectTag = 13
+	OptionEffectTag_TEST_RUNNER                         OptionEffectTag = 14
+)
+
+var OptionEffectTag_name = map[int32]string{
+	0:  "UNKNOWN",
+	1:  "NO_OP",
+	2:  "LOSES_INCREMENTAL_STATE",
+	3:  "CHANGES_INPUTS",
+	4:  "AFFECTS_OUTPUTS",
+	5:  "BUILD_FILE_SEMANTICS",
+	6:  "BAZEL_INTERNAL_CONFIGURATION",
+	7:  "LOADING_AND_ANALYSIS",
+	8:  "EXECUTION",
+	9:  "HOST_MACHINE_RESOURCE_OPTIMIZATIONS",
+	10: "EAGERNESS_TO_EXIT",
+	11: "BAZEL_MONITORING",
+	12: "TERMINAL_OUTPUT",
+	13: "ACTION_COMMAND_LINES",
+	14: "TEST_RUNNER",
+}
+
+var OptionEffectTag_value = map[string]int32{
+	"UNKNOWN":                             0,
+	"NO_OP":                               1,
+	"LOSES_INCREMENTAL_STATE":             2,
+	"CHANGES_INPUTS":                      3,
+	"AFFECTS_OUTPUTS":                     4,
+	"BUILD_FILE_SEMANTICS":                5,
+	"BAZEL_INTERNAL_CONFIGURATION":        6,
+	"LOADING_AND_ANALYSIS":                7,
+	"EXECUTION":                           8,
+	"HOST_MACHINE_RESOURCE_OPTIMIZATIONS": 9,
+	"EAGERNESS_TO_EXIT":                   10,
+	"BAZEL_MONITORING":                    11,
+	"TERMINAL_OUTPUT":                     12,
+	"ACTION_COMMAND_LINES":                13,
+	"TEST_RUNNER":                         14,
+}
+
+func (x OptionEffectTag) String() string {
+	return proto.EnumName(OptionEffectTag_name, int32(x))
+}
+
+func (OptionEffectTag) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_e648ce9e05f40d06, []int{0}
+}
+
+// Docs in java enum.
+type OptionMetadataTag int32
+
+const (
+	OptionMetadataTag_EXPERIMENTAL                          OptionMetadataTag = 0
+	OptionMetadataTag_INCOMPATIBLE_CHANGE                   OptionMetadataTag = 1
+	OptionMetadataTag_DEPRECATED                            OptionMetadataTag = 2
+	OptionMetadataTag_HIDDEN                                OptionMetadataTag = 3
+	OptionMetadataTag_INTERNAL                              OptionMetadataTag = 4
+	OptionMetadataTag_TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES OptionMetadataTag = 5
+)
+
+var OptionMetadataTag_name = map[int32]string{
+	0: "EXPERIMENTAL",
+	1: "INCOMPATIBLE_CHANGE",
+	2: "DEPRECATED",
+	3: "HIDDEN",
+	4: "INTERNAL",
+	5: "TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES",
+}
+
+var OptionMetadataTag_value = map[string]int32{
+	"EXPERIMENTAL":                          0,
+	"INCOMPATIBLE_CHANGE":                   1,
+	"DEPRECATED":                            2,
+	"HIDDEN":                                3,
+	"INTERNAL":                              4,
+	"TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES": 5,
+}
+
+func (x OptionMetadataTag) String() string {
+	return proto.EnumName(OptionMetadataTag_name, int32(x))
+}
+
+func (OptionMetadataTag) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_e648ce9e05f40d06, []int{1}
+}
+
+func init() {
+	proto.RegisterEnum("options.OptionEffectTag", OptionEffectTag_name, OptionEffectTag_value)
+	proto.RegisterEnum("options.OptionMetadataTag", OptionMetadataTag_name, OptionMetadataTag_value)
+}
+
+func init() {
+	proto.RegisterFile("src/main/protobuf/option_filters.proto", fileDescriptor_e648ce9e05f40d06)
+}
+
+var fileDescriptor_e648ce9e05f40d06 = []byte{
+	// 472 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x92, 0xcd, 0x6e, 0x1a, 0x31,
+	0x14, 0x85, 0x13, 0x12, 0x20, 0x5c, 0x08, 0x38, 0x4e, 0xaa, 0x54, 0x6a, 0x17, 0x95, 0xaa, 0xfe,
+	0xb1, 0x80, 0x45, 0x9f, 0xc0, 0x78, 0x2e, 0x83, 0xd5, 0x99, 0xeb, 0x91, 0xed, 0x51, 0x49, 0x36,
+	0x16, 0x21, 0x80, 0x90, 0x00, 0x47, 0x30, 0xed, 0x8b, 0xf4, 0x2d, 0xfb, 0x14, 0xd5, 0xcc, 0xb4,
+	0xab, 0xae, 0x6c, 0x1d, 0xfb, 0x1e, 0x9d, 0xfb, 0xe9, 0xc0, 0xc7, 0xd3, 0x71, 0x39, 0xde, 0x2f,
+	0xb6, 0x87, 0xf1, 0xcb, 0x31, 0x14, 0xe1, 0xe9, 0xc7, 0x7a, 0x1c, 0x5e, 0x8a, 0x6d, 0x38, 0xf8,
+	0xf5, 0x76, 0x57, 0xac, 0x8e, 0xa7, 0x51, 0xa5, 0xf3, 0x76, 0xad, 0x9e, 0x86, 0xbf, 0x1b, 0x30,
+	0xd0, 0xd5, 0x1d, 0xd7, 0xeb, 0xd5, 0xb2, 0x70, 0x8b, 0x0d, 0xef, 0x42, 0x3b, 0xa7, 0x6f, 0xa4,
+	0xbf, 0x13, 0x3b, 0xe3, 0x1d, 0x68, 0x92, 0xf6, 0x3a, 0x63, 0xe7, 0xfc, 0x0d, 0xdc, 0x27, 0xda,
+	0xa2, 0xf5, 0x8a, 0xa4, 0xc1, 0x14, 0xc9, 0x89, 0xc4, 0x5b, 0x27, 0x1c, 0xb2, 0x06, 0xe7, 0xd0,
+	0x97, 0x33, 0x41, 0x71, 0xf5, 0x9c, 0xe5, 0xce, 0xb2, 0x0b, 0x7e, 0x0b, 0x03, 0x31, 0x9d, 0xa2,
+	0x74, 0xd6, 0xeb, 0xdc, 0x55, 0xe2, 0x25, 0x7f, 0x0d, 0x77, 0x93, 0x5c, 0x25, 0x91, 0x9f, 0xaa,
+	0x04, 0xbd, 0xc5, 0x54, 0x90, 0x53, 0xd2, 0xb2, 0x26, 0x7f, 0x07, 0x6f, 0x27, 0xe2, 0x11, 0x13,
+	0xaf, 0xc8, 0xa1, 0x21, 0x91, 0x78, 0xa9, 0x69, 0xaa, 0xe2, 0xdc, 0x08, 0xa7, 0x34, 0xb1, 0x56,
+	0x39, 0x9b, 0x68, 0x11, 0x29, 0x8a, 0xbd, 0xa0, 0xc8, 0x0b, 0x12, 0xc9, 0x83, 0x55, 0x96, 0xb5,
+	0xf9, 0x35, 0x74, 0x70, 0x8e, 0x32, 0xaf, 0x3e, 0x5e, 0xf1, 0x4f, 0xf0, 0x7e, 0xa6, 0xad, 0xf3,
+	0xa9, 0x90, 0x33, 0x45, 0xe8, 0x0d, 0x5a, 0x9d, 0x1b, 0x89, 0x5e, 0x67, 0x4e, 0xa5, 0xea, 0xb1,
+	0x32, 0xb4, 0xac, 0xc3, 0x5f, 0xc1, 0x0d, 0x8a, 0x18, 0x0d, 0xa1, 0xb5, 0xde, 0x69, 0x8f, 0x73,
+	0xe5, 0x18, 0xf0, 0x3b, 0x60, 0x75, 0x94, 0x54, 0x93, 0x72, 0xda, 0x28, 0x8a, 0x59, 0xb7, 0xdc,
+	0xc7, 0xa1, 0x49, 0x55, 0x19, 0xad, 0x5e, 0x88, 0xf5, 0xca, 0x4c, 0x42, 0x96, 0x76, 0x5e, 0xea,
+	0x34, 0x2d, 0x63, 0x25, 0x8a, 0xd0, 0xb2, 0x6b, 0x3e, 0x80, 0xae, 0x43, 0xeb, 0xbc, 0xc9, 0x89,
+	0xd0, 0xb0, 0xfe, 0xf0, 0xd7, 0x39, 0xdc, 0xd4, 0xb0, 0xd3, 0x55, 0xb1, 0x78, 0x5e, 0x14, 0x8b,
+	0x12, 0x37, 0x83, 0x1e, 0xce, 0x33, 0x34, 0xaa, 0x26, 0xca, 0xce, 0xf8, 0x3d, 0xdc, 0x2a, 0x92,
+	0x3a, 0xcd, 0x84, 0x53, 0x93, 0x04, 0x7d, 0x0d, 0x96, 0x9d, 0xf3, 0x3e, 0x40, 0x84, 0x99, 0x41,
+	0x29, 0x1c, 0x46, 0xac, 0xc1, 0x01, 0x5a, 0x33, 0x15, 0x45, 0x48, 0xec, 0x82, 0xf7, 0xe0, 0xea,
+	0x1f, 0x37, 0x76, 0xc9, 0xbf, 0xc0, 0x07, 0x67, 0x54, 0x1c, 0xa3, 0xc1, 0xc8, 0x4f, 0x1e, 0xbc,
+	0x48, 0x4a, 0xac, 0xff, 0x79, 0x5a, 0xd6, 0x9c, 0x0c, 0xe1, 0xf3, 0x32, 0xec, 0x47, 0x9b, 0x10,
+	0x36, 0xbb, 0xd5, 0xe8, 0x79, 0xf5, 0xb3, 0x08, 0x61, 0x77, 0x1a, 0x2d, 0xc3, 0x7e, 0x1f, 0x0e,
+	0xa3, 0xbf, 0x45, 0xa9, 0x7b, 0xf3, 0xd4, 0xaa, 0x8e, 0xaf, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff,
+	0x08, 0x59, 0xf7, 0x7f, 0x68, 0x02, 0x00, 0x00,
+}
diff --git a/go/tools/gopackagesdriver/proto/src/main/protobuf/command_line.proto b/go/tools/gopackagesdriver/proto/src/main/protobuf/command_line.proto
new file mode 100644
index 0000000..d5fa6ac
--- /dev/null
+++ b/go/tools/gopackagesdriver/proto/src/main/protobuf/command_line.proto
@@ -0,0 +1,102 @@
+// Copyright 2017 The Bazel Authors. All rights reserved.
+//
+// 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 command_line;
+
+// option java_api_version = 2;
+option java_package = "com.google.devtools.build.lib.runtime.proto";
+
+import "src/main/protobuf/option_filters.proto";
+
+// Representation of a Bazel command line.
+message CommandLine {
+  // A title for this command line value, to differentiate it from others.
+  // In particular, a single invocation may wish to report both the literal and
+  // canonical command lines, and this label would be used to differentiate
+  // between both versions. This is a string for flexibility.
+  string command_line_label = 1;
+
+  // A Bazel command line is made of distinct parts. For example,
+  //    `bazel --nomaster_bazelrc test --nocache_test_results //foo:aTest`
+  // has the executable "bazel", a startup flag, a command "test", a command
+  // flag, and a test target. There could be many more flags and targets, or
+  // none (`bazel info` for example), but the basic structure is there. The
+  // command line should be broken down into these logical sections here.
+  repeated CommandLineSection sections = 2;
+}
+
+// A section of the Bazel command line.
+message CommandLineSection {
+  // The name of this section, such as "startup_option" or "command".
+  string section_label = 1;
+
+  oneof section_type {
+    // Sections with non-options, such as the list of targets or the command,
+    // should use simple string chunks.
+    ChunkList chunk_list = 2;
+
+    // Startup and command options are lists of options and belong here.
+    OptionList option_list = 3;
+  }
+}
+
+// Wrapper to allow a list of strings in the "oneof" section_type.
+message ChunkList {
+  repeated string chunk = 1;
+}
+
+// Wrapper to allow a list of options in the "oneof" section_type.
+message OptionList {
+  repeated Option option = 1;
+}
+
+// A single command line option.
+//
+// This represents the option itself, but does not take into account the type of
+// option or how the parser interpreted it. If this option is part of a command
+// line that represents the actual input that Bazel received, it would, for
+// example, include expansion flags as they are. However, if this option
+// represents the canonical form of the command line, with the values as Bazel
+// understands them, then the expansion flag, which has no value, would not
+// appear, and the flags it expands to would.
+message Option {
+  // How the option looks with the option and its value combined. Depending on
+  // the purpose of this command line report, this could be the canonical
+  // form, or the way that the flag was set.
+  //
+  // Some examples: this might be `--foo=bar` form, or `--foo bar` with a space;
+  // for boolean flags, `--nobaz` is accepted on top of `--baz=false` and other
+  // negating values, or for a positive value, the unqualified `--baz` form
+  // is also accepted. This could also be a short `-b`, if the flag has an
+  // abbreviated form.
+  string combined_form = 1;
+
+  // The canonical name of the option, without the preceding dashes.
+  string option_name = 2;
+
+  // The value of the flag, or unset for flags that do not take values.
+  // Especially for boolean flags, this should be in canonical form, the
+  // combined_form field above gives room for showing the flag as it was set
+  // if that is preferred.
+  string option_value = 3;
+
+  // This flag's tagged effects. See OptionEffectTag's java documentation for
+  // details.
+  repeated options.OptionEffectTag effect_tags = 4;
+
+  // Metadata about the flag. See OptionMetadataTag's java documentation for
+  // details.
+  repeated options.OptionMetadataTag metadata_tags = 5;
+}
diff --git a/go/tools/gopackagesdriver/proto/src/main/protobuf/invocation_policy.proto b/go/tools/gopackagesdriver/proto/src/main/protobuf/invocation_policy.proto
new file mode 100644
index 0000000..53572ac
--- /dev/null
+++ b/go/tools/gopackagesdriver/proto/src/main/protobuf/invocation_policy.proto
@@ -0,0 +1,190 @@
+// Copyright 2015 The Bazel Authors. All rights reserved.
+//
+// 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 = "proto2";
+package blaze.invocation_policy;
+
+// option java_api_version = 2;
+option java_package = "com.google.devtools.build.lib.runtime.proto";
+
+// The --invocation_policy flag takes a base64-encoded binary-serialized or text
+// formatted InvocationPolicy message.
+message InvocationPolicy {
+  // Order matters.
+  // After expanding policies on expansion flags or flags with implicit
+  // requirements, only the final policy on a specific flag will be enforced
+  // onto the user's command line.
+  repeated FlagPolicy flag_policies = 1;
+}
+
+// A policy for controlling the value of a flag.
+message FlagPolicy {
+  // The name of the flag to enforce this policy on.
+  //
+  // Note that this should be the full name of the flag, not the abbreviated
+  // name of the flag. If the user specifies the abbreviated name of a flag,
+  // that flag will be matched using its full name.
+  //
+  // The "no" prefix will not be parsed, so for boolean flags, use
+  // the flag's full name and explicitly set it to true or false.
+  optional string flag_name = 1;
+
+  // If set, this flag policy is applied only if one of the given commands or a
+  // command that inherits from one of the given commands is being run. For
+  // instance, if "build" is one of the commands here, then this policy will
+  // apply to any command that inherits from build, such as info, coverage, or
+  // test. If empty, this flag policy is applied for all commands. This allows
+  // the policy setter to add all policies to the proto without having to
+  // determine which Bazel command the user is actually running. Additionally,
+  // Bazel allows multiple flags to be defined by the same name, and the
+  // specific flag definition is determined by the command.
+  repeated string commands = 2;
+
+  oneof operation {
+    SetValue set_value = 3;
+    UseDefault use_default = 4;
+    DisallowValues disallow_values = 5;
+    AllowValues allow_values = 6;
+  }
+}
+
+message SetValue {
+  // Use this value for the specified flag, overriding any default or user-set
+  // value (unless append is set to true for repeatable flags).
+  //
+  // This field is repeated for repeatable flags. It is an error to set
+  // multiple values for a flag that is not actually a repeatable flag.
+  // This requires at least 1 value, if even the empty string.
+  //
+  // If the flag allows multiple values, all of its values are replaced with the
+  // value or values from the policy (i.e., no diffing or merging is performed),
+  // unless the append field (see below) is set to true.
+  //
+  // Note that some flags are tricky. For example, some flags look like boolean
+  // flags, but are actually Void expansion flags that expand into other flags.
+  // The Bazel flag parser will accept "--void_flag=false", but because
+  // the flag is Void, the "=false" is ignored. It can get even trickier, like
+  // "--novoid_flag" which is also an expansion flag with the type Void whose
+  // name is explicitly "novoid_flag" and which expands into other flags that
+  // are the opposite of "--void_flag". For expansion flags, it's best to
+  // explicitly override the flags they expand into.
+  //
+  // Other flags may be differently tricky: A flag could have a converter that
+  // converts some string to a list of values, but that flag may not itself have
+  // allowMultiple set to true.
+  //
+  // An example is "--test_tag_filters": this flag sets its converter to
+  // CommaSeparatedOptionListConverter, but does not set allowMultiple to true.
+  // So "--test_tag_filters=foo,bar" results in ["foo", "bar"], however
+  // "--test_tag_filters=foo --test_tag_filters=bar" results in just ["bar"]
+  // since the 2nd value overrides the 1st.
+  //
+  // Similarly, "--test_tag_filters=foo,bar --test_tag_filters=baz,qux" results
+  // in ["baz", "qux"]. For flags like these, the policy should specify
+  // "foo,bar" instead of separately specifying "foo" and "bar" so that the
+  // converter is appropriately invoked.
+  //
+  // Note that the opposite is not necessarily
+  // true: for a flag that specifies allowMultiple=true, "--flag=foo,bar"
+  // may fail to parse or result in an unexpected value.
+  repeated string flag_value = 1;
+
+  // Whether to allow this policy to be overridden by user-specified values.
+  // When set, if the user specified a value for this flag, use the value
+  // from the user, otherwise use the value specified in this policy.
+  optional bool overridable = 2;
+
+  // If true, and if the flag named in the policy is a repeatable flag, then
+  // the values listed in flag_value do not replace all the user-set or default
+  // values of the flag, but instead append to them. If the flag is not
+  // repeatable, then this has no effect.
+  optional bool append = 3;
+}
+
+message UseDefault {
+  // Use the default value of the flag, as defined by Bazel (or equivalently, do
+  // not allow the user to set this flag).
+  //
+  // Note on implementation: UseDefault sets the default by clearing the flag,
+  // so that when the value is requested and no flag is found, the flag parser
+  // returns the default. This is mostly relevant for expansion flags: it will
+  // erase user values in *all* flags that the expansion flag expands to. Only
+  // use this on expansion flags if this is acceptable behavior. Since the last
+  // policy wins, later policies on this same flag will still remove the
+  // expanded UseDefault, so there is a way around, but it's really best not to
+  // use this on expansion flags at all.
+}
+
+message DisallowValues {
+  // Obsolete new_default_value field.
+  reserved 2;
+
+  // It is an error for the user to use any of these values (that is, the Bazel
+  // command will fail), unless new_value or use_default is set.
+  //
+  // For repeatable flags, if any one of the values in the flag matches a value
+  // in the list of disallowed values, an error is thrown.
+  //
+  // Care must be taken for flags with complicated converters. For example,
+  // it's possible for a repeated flag to be of type List<List<T>>, so that
+  // "--foo=a,b --foo=c,d" results in foo=[["a","b"], ["c", "d"]]. In this case,
+  // it is not possible to disallow just "b", nor will ["b", "a"] match, nor
+  // will ["b", "c"] (but ["a", "b"] will still match).
+  repeated string disallowed_values = 1;
+
+  oneof replacement_value {
+    // If set and if the value of the flag is disallowed (including the default
+    // value of the flag if the user doesn't specify a value), use this value as
+    // the value of the flag instead of raising an error. This does not apply to
+    // repeatable flags and is ignored if the flag is a repeatable flag.
+    string new_value = 3;
+
+    // If set and if the value of the flag is disallowed, use the default value
+    // of the flag instead of raising an error. Unlike new_value, this works for
+    // repeatable flags, but note that the default value for repeatable flags is
+    // always empty.
+    //
+    // Note that it is an error to disallow the default value of the flag and
+    // to set use_default, unless the flag is a repeatable flag where the
+    // default value is always the empty list.
+    UseDefault use_default = 4;
+  }
+}
+
+message AllowValues {
+  // Obsolete new_default_value field.
+  reserved 2;
+
+  // It is an error for the user to use any value not in this list, unless
+  // new_value or use_default is set.
+  repeated string allowed_values = 1;
+
+  oneof replacement_value {
+    // If set and if the value of the flag is disallowed (including the default
+    // value of the flag if the user doesn't specify a value), use this value as
+    // the value of the flag instead of raising an error. This does not apply to
+    // repeatable flags and is ignored if the flag is a repeatable flag.
+    string new_value = 3;
+
+    // If set and if the value of the flag is disallowed, use the default value
+    // of the flag instead of raising an error. Unlike new_value, this works for
+    // repeatable flags, but note that the default value for repeatable flags is
+    // always empty.
+    //
+    // Note that it is an error to disallow the default value of the flag and
+    // to set use_default, unless the flag is a repeatable flag where the
+    // default value is always the empty list.
+    UseDefault use_default = 4;
+  }
+}
diff --git a/go/tools/gopackagesdriver/proto/src/main/protobuf/option_filters.proto b/go/tools/gopackagesdriver/proto/src/main/protobuf/option_filters.proto
new file mode 100644
index 0000000..782620d
--- /dev/null
+++ b/go/tools/gopackagesdriver/proto/src/main/protobuf/option_filters.proto
@@ -0,0 +1,56 @@
+// Copyright 2017 The Bazel Authors. All rights reserved.
+//
+// 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 options;
+
+// option java_api_version = 2;
+option java_package = "com.google.devtools.common.options.proto";
+
+// IMPORTANT NOTE: These two enums must be kept in sync with their Java
+// equivalents in src/main/java/com/google/devtools/common/options.
+// Changing this proto has specific compatibility requirements, please see the
+// Java documentation for details.
+
+// Docs in java enum.
+enum OptionEffectTag {
+  // This option's effect or intent is unknown.
+  UNKNOWN = 0;
+
+  // This flag has literally no effect.
+  NO_OP = 1;
+
+  LOSES_INCREMENTAL_STATE = 2;
+  CHANGES_INPUTS = 3;
+  AFFECTS_OUTPUTS = 4;
+  BUILD_FILE_SEMANTICS = 5;
+  BAZEL_INTERNAL_CONFIGURATION = 6;
+  LOADING_AND_ANALYSIS = 7;
+  EXECUTION = 8;
+  HOST_MACHINE_RESOURCE_OPTIMIZATIONS = 9;
+  EAGERNESS_TO_EXIT = 10;
+  BAZEL_MONITORING = 11;
+  TERMINAL_OUTPUT = 12;
+  ACTION_COMMAND_LINES = 13;
+  TEST_RUNNER = 14;
+}
+
+// Docs in java enum.
+enum OptionMetadataTag {
+  EXPERIMENTAL = 0;
+  INCOMPATIBLE_CHANGE = 1;
+  DEPRECATED = 2;
+  HIDDEN = 3;
+  INTERNAL = 4;
+  TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES = 5;
+}