Repository: kythe/kythe
Pull request #5242 (2022-03-23 17:35:44)

feat(api): support filtering xrefs by their enclosing files


Patch:
diff --git a/kythe/go/services/cli/commands_xrefs.go b/kythe/go/services/cli/commands_xrefs.go
index 2bf3368fc..c5f908a64 100644
--- a/kythe/go/services/cli/commands_xrefs.go
+++ b/kythe/go/services/cli/commands_xrefs.go
@@ -51,6 +51,8 @@ type xrefsCommand struct {
 	relatedNodes    bool
 	nodeDefinitions bool
 	anchorText      bool
+
+	excludeGenerated bool
 }
 
 func (xrefsCommand) Name() string     { return "xrefs" }
@@ -67,6 +69,7 @@ func (c *xrefsCommand) SetFlags(flag *flag.FlagSet) {
 	flag.Var(&c.buildConfigs, "build_config", "CSV set of build configs with which to filter file decorations")
 	flag.BoolVar(&c.nodeDefinitions, "node_definitions", false, "Whether to request definition locations for related nodes")
 	flag.BoolVar(&c.anchorText, "anchor_text", false, "Whether to request text for anchors")
+	flag.BoolVar(&c.excludeGenerated, "exclude_generated", false, "Whether to exclude anchors with non-empty roots")
 
 	flag.StringVar(&c.pageToken, "page_token", "", "CrossReferences page token")
 	flag.IntVar(&c.pageSize, "page_size", 0, "Maximum number of cross-references returned (0 lets the service use a sensible default)")
@@ -80,11 +83,19 @@ func (c xrefsCommand) Run(ctx context.Context, flag *flag.FlagSet, api API) erro
 
 		AnchorText:      c.anchorText,
 		NodeDefinitions: c.nodeDefinitions,
+
+		CorpusPathFilters: &xpb.CorpusPathFilters{},
 	}
 	if c.workspaceURI != "" {
 		req.Workspace = &xpb.Workspace{Uri: c.workspaceURI}
 		req.PatchAgainstWorkspace = true
 	}
+	if c.excludeGenerated {
+		req.CorpusPathFilters.Filter = append(req.CorpusPathFilters.Filter, &xpb.CorpusPathFilter{
+			Type: xpb.CorpusPathFilter_EXCLUDE,
+			Root: ".+",
+		})
+	}
 	if c.relatedNodes {
 		req.Filter = []string{facts.NodeKind, facts.Subkind}
 		if len(c.nodeFilters) > 0 && (len(c.nodeFilters) != 1 || c.nodeFilters[0] != "") {
diff --git a/kythe/go/serving/xrefs/BUILD b/kythe/go/serving/xrefs/BUILD
index 28157ec2b..fab8adede 100644
--- a/kythe/go/serving/xrefs/BUILD
+++ b/kythe/go/serving/xrefs/BUILD
@@ -7,6 +7,7 @@ go_library(
     srcs = [
         "columnar.go",
         "xrefs.go",
+        "xrefs_filter.go",
     ],
     deps = [
         "//kythe/go/services/xrefs",
@@ -47,6 +48,7 @@ go_test(
     deps = [
         "//kythe/go/test/testutil",
         "//kythe/go/util/compare",
+        "@org_golang_google_protobuf//encoding/prototext:go_default_library",
         "@org_golang_x_text//encoding:go_default_library",
         "@org_golang_x_text//encoding/unicode:go_default_library",
         "@org_golang_x_text//transform:go_default_library",
diff --git a/kythe/go/serving/xrefs/xrefs.go b/kythe/go/serving/xrefs/xrefs.go
index 2ec6f02e3..e15e5d2ed 100644
--- a/kythe/go/serving/xrefs/xrefs.go
+++ b/kythe/go/serving/xrefs/xrefs.go
@@ -609,6 +609,19 @@ func (t *Table) CrossReferences(ctx context.Context, req *xpb.CrossReferencesReq
 		return nil, err
 	}
 
+	filter, err := compileCorpusPathFilters(req.GetCorpusPathFilters())
+	if err != nil {
+		return nil, status.Errorf(codes.InvalidArgument, "invalid corpus_path_filters %s: %v", strings.ReplaceAll(req.GetCorpusPathFilters().String(), "\n", " "), err)
+	}
+
+	getFilteredPage := func(ctx context.Context, pageKey string) (*srvpb.PagedCrossReferences_Page, int, error) {
+		p, err := t.crossReferencesPage(ctx, pageKey)
+		if err != nil {
+			return nil, 0, err
+		}
+		return p, filter.FilterGroup(p.GetGroup()), nil
+	}
+
 	stats := refStats{
 		max: int(req.PageSize),
 
@@ -762,6 +775,7 @@ func (t *Table) CrossReferences(ctx context.Context, req *xpb.CrossReferencesReq
 				continue
 			}
 
+			filter.FilterGroup(grp)
 			switch {
 			case xrefs.IsDefKind(req.DefinitionKind, grp.Kind, cr.Incomplete):
 				reply.Total.Definitions += int64(len(grp.Anchor))
@@ -810,28 +824,31 @@ func (t *Table) CrossReferences(ctx context.Context, req *xpb.CrossReferencesReq
 			case xrefs.IsDefKind(req.DefinitionKind, idx.Kind, cr.Incomplete):
 				reply.Total.Definitions += int64(idx.Count)
 				if wantMoreCrossRefs && !stats.skipPage(idx) {
-					p, err := t.crossReferencesPage(ctx, idx.PageKey)
+					p, filtered, err := getFilteredPage(ctx, idx.PageKey)
 					if err != nil {
 						return nil, fmt.Errorf("internal error: error retrieving cross-references page %v: %v", idx.PageKey, err)
 					}
+					reply.Total.Definitions -= int64(filtered) // update counts to reflect filtering
 					stats.addAnchors(&crs.Definition, p.Group)
 				}
 			case xrefs.IsDeclKind(req.DeclarationKind, idx.Kind, cr.Incomplete):
 				reply.Total.Declarations += int64(idx.Count)
 				if wantMoreCrossRefs && !stats.skipPage(idx) {
-					p, err := t.crossReferencesPage(ctx, idx.PageKey)
+					p, filtered, err := getFilteredPage(ctx, idx.PageKey)
 					if err != nil {
 						return nil, fmt.Errorf("internal error: error retrieving cross-references page %v: %v", idx.PageKey, err)
 					}
+					reply.Total.Declarations -= int64(filtered) // update counts to reflect filtering
 					stats.addAnchors(&crs.Declaration, p.Group)
 				}
 			case xrefs.IsRefKind(req.ReferenceKind, idx.Kind):
 				reply.Total.References += int64(idx.Count)
 				if wantMoreCrossRefs && !stats.skipPage(idx) {
-					p, err := t.crossReferencesPage(ctx, idx.PageKey)
+					p, filtered, err := getFilteredPage(ctx, idx.PageKey)
 					if err != nil {
 						return nil, fmt.Errorf("internal error: error retrieving cross-references page %v: %v", idx.PageKey, err)
 					}
+					reply.Total.References -= int64(filtered) // update counts to reflect filtering
 					stats.addAnchors(&crs.Reference, p.Group)
 				}
 			case xrefs.IsRelatedNodeKind(nil, idx.Kind):
@@ -840,10 +857,12 @@ func (t *Table) CrossReferences(ctx context.Context, req *xpb.CrossReferencesReq
 				if len(req.Filter) > 0 && xrefs.IsRelatedNodeKind(relatedKinds, idx.Kind) {
 					reply.Total.RelatedNodesByRelation[idx.Kind] += int64(idx.Count)
 					if wantMoreCrossRefs && !stats.skipPage(idx) {
-						p, err = t.crossReferencesPage(ctx, idx.PageKey)
+						var filtered int
+						p, filtered, err = getFilteredPage(ctx, idx.PageKey)
 						if err != nil {
 							return nil, fmt.Errorf("internal error: error retrieving cross-references page: %v", idx.PageKey)
 						}
+						reply.Total.RelatedNodesByRelation[idx.Kind] -= int64(filtered) // update counts to reflect filtering
 						stats.addRelatedNodes(crs, p.Group)
 					}
 				}
@@ -865,10 +884,11 @@ func (t *Table) CrossReferences(ctx context.Context, req *xpb.CrossReferencesReq
 			case xrefs.IsCallerKind(req.CallerKind, idx.Kind):
 				reply.Total.Callers += int64(idx.Count)
 				if wantMoreCrossRefs && !stats.skipPage(idx) {
-					p, err := t.crossReferencesPage(ctx, idx.PageKey)
+					p, filtered, err := getFilteredPage(ctx, idx.PageKey)
 					if err != nil {
 						return nil, fmt.Errorf("internal error: error retrieving cross-references page: %v", idx.PageKey)
 					}
+					reply.Total.Callers -= int64(filtered) // update counts to reflect filtering
 					stats.addCallers(crs, p.Group)
 				}
 			}
diff --git a/kythe/go/serving/xrefs/xrefs_filter.go b/kythe/go/serving/xrefs/xrefs_filter.go
new file mode 100644
index 000000000..6de90585f
--- /dev/null
+++ b/kythe/go/serving/xrefs/xrefs_filter.go
@@ -0,0 +1,164 @@
+/*
+ * Copyright 2022 The Kythe 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.
+ */
+
+package xrefs
+
+import (
+	"regexp"
+
+	"kythe.io/kythe/go/util/kytheuri"
+
+	cpb "kythe.io/kythe/proto/common_go_proto"
+	srvpb "kythe.io/kythe/proto/serving_go_proto"
+	xpb "kythe.io/kythe/proto/xref_go_proto"
+)
+
+func compileCorpusPathFilters(fs *xpb.CorpusPathFilters) (*corpusPathFilter, error) {
+	if len(fs.GetFilter()) == 0 {
+		return nil, nil
+	}
+	f := &corpusPathFilter{}
+	for _, filter := range fs.GetFilter() {
+		p, err := compileCorpusPathFilter(filter)
+		if err != nil {
+			return nil, err
+		}
+		f.pattern = append(f.pattern, p)
+	}
+	return f, nil
+}
+
+func compileCorpusPathFilter(f *xpb.CorpusPathFilter) (*corpusPathPattern, error) {
+	p := &corpusPathPattern{}
+	if f.GetType() == xpb.CorpusPathFilter_EXCLUDE {
+		p.inverse = true
+	}
+	var err error
+	if corpus := f.GetCorpus(); corpus != "" {
+		p.corpus, err = regexp.Compile(corpus)
+		if err != nil {
+			return nil, err
+		}
+	}
+	if root := f.GetRoot(); root != "" {
+		p.root, err = regexp.Compile(root)
+		if err != nil {
+			return nil, err
+		}
+	}
+	if path := f.GetPath(); path != "" {
+		p.path, err = regexp.Compile(path)
+		if err != nil {
+			return nil, err
+		}
+	}
+	return p, nil
+}
+
+type corpusPathPattern struct {
+	corpus, root, path *regexp.Regexp
+
+	inverse bool
+}
+
+func (p *corpusPathPattern) Allow(c *cpb.CorpusPath) bool {
+	return p.inverse != ((p.corpus == nil || p.corpus.MatchString(c.GetCorpus())) &&
+		(p.root == nil || p.root.MatchString(c.GetRoot())) &&
+		(p.path == nil || p.path.MatchString(c.GetPath())))
+}
+
+type corpusPathFilter struct {
+	pattern []*corpusPathPattern
+}
+
+func (f *corpusPathFilter) Allow(c *cpb.CorpusPath) bool {
+	if f == nil || c == nil {
+		return true
+	}
+
+	for _, p := range f.pattern {
+		if !p.Allow(c) {
+			return false
+		}
+	}
+	return true
+}
+
+func (f *corpusPathFilter) AllowExpandedAnchor(a *srvpb.ExpandedAnchor) bool {
+	if f == nil || a == nil {
+		return true
+	}
+	return f.AllowTicket(a.GetTicket())
+}
+
+func (f *corpusPathFilter) AllowTicket(ticket string) bool {
+	if f == nil || ticket == "" {
+		return true
+	}
+	cp, _ := kytheuri.ParseCorpusPath(ticket)
+	return f.Allow(cp)
+}
+
+func (f *corpusPathFilter) FilterGroup(grp *srvpb.PagedCrossReferences_Group) (filtered int) {
+	if f == nil {
+		return 0
+	}
+
+	var n int
+	grp.Anchor, n = f.filterAnchors(grp.GetAnchor())
+	filtered += n
+	grp.RelatedNode, n = f.filterRelatedNodes(grp.GetRelatedNode())
+	filtered += n
+	grp.Caller, n = f.filterCallers(grp.GetCaller())
+	filtered += n
+	return
+}
+
+func (f *corpusPathFilter) filterAnchors(as []*srvpb.ExpandedAnchor) ([]*srvpb.ExpandedAnchor, int) {
+	var j int
+	for i, a := range as {
+		if !f.AllowExpandedAnchor(a) {
+			continue
+		}
+		as[j] = as[i]
+		j++
+	}
+	return as[:j], len(as) - j
+}
+
+func (f *corpusPathFilter) filterCallers(cs []*srvpb.PagedCrossReferences_Caller) ([]*srvpb.PagedCrossReferences_Caller, int) {
+	var j int
+	for i, c := range cs {
+		if !f.AllowExpandedAnchor(c.GetCaller()) {
+			continue
+		}
+		cs[j] = cs[i]
+		j++
+	}
+	return cs[:j], len(cs) - j
+}
+
+func (f *corpusPathFilter) filterRelatedNodes(rs []*srvpb.PagedCrossReferences_RelatedNode) ([]*srvpb.PagedCrossReferences_RelatedNode, int) {
+	var j int
+	for i, r := range rs {
+		if def := r.GetNode().GetDefinitionLocation().GetTicket(); (def != "" && !f.AllowTicket(def)) || (def == "" && !f.AllowTicket(r.GetNode().GetTicket())) {
+			continue
+		}
+		rs[j] = rs[i]
+		j++
+	}
+	return rs[:j], len(rs) - j
+}
diff --git a/kythe/go/util/kytheuri/uri.go b/kythe/go/util/kytheuri/uri.go
index 15870b832..012f639b9 100644
--- a/kythe/go/util/kytheuri/uri.go
+++ b/kythe/go/util/kytheuri/uri.go
@@ -56,6 +56,18 @@ func (u *URI) VName() *spb.VName {
 	}
 }
 
+// CorpusPath returns the CorpusPath components of the URI.
+func (u *URI) CorpusPath() *cpb.CorpusPath {
+	if u == nil {
+		return new(cpb.CorpusPath)
+	}
+	return &cpb.CorpusPath{
+		Corpus: u.Corpus,
+		Root:   u.Root,
+		Path:   cleanPath(u.Path),
+	}
+}
+
 // String renders the Kythe URI into the standard URI string format.
 //
 // The resulting string is in canonical ordering, so if the URI was created by
@@ -155,7 +167,7 @@ func FromVName(v *spb.VName) *URI {
 	}
 }
 
-// FromCorpusPath returns a Kythe URI for the given Kythe VName protobuf message.
+// FromCorpusPath returns a Kythe URI for the given Kythe CorpusPath protobuf message.
 func FromCorpusPath(cp *cpb.CorpusPath) *URI {
 	if cp == nil {
 		return &URI{}
@@ -270,6 +282,15 @@ func Parse(s string) (*URI, error) {
 	return decode(&r.URI, make([]byte, len(s)))
 }
 
+// ParseCorpusPath parses a Kythe URI and returns its CorpusPath components.
+func ParseCorpusPath(s string) (*cpb.CorpusPath, error) {
+	u, err := Parse(s)
+	if err != nil {
+		return nil, err
+	}
+	return u.CorpusPath(), nil
+}
+
 // decode decodes u in-place using buf as an intermediate buffer.  The caller
 // must ensure len(buf) is sufficient to hold the longest field.  Preallocation
 // reduces allocation for unescaping and saves ~200 ns/op in benchmarks.
diff --git a/kythe/proto/xref.proto b/kythe/proto/xref.proto
index 51d737a1e..1dd2d2333 100644
--- a/kythe/proto/xref.proto
+++ b/kythe/proto/xref.proto
@@ -430,10 +430,35 @@ message CrossReferencesRequest {
   // Whether to patch spans against the given Workspace.
   bool patch_against_workspace = 18;
 
+  // Set of filters to apply to each xref's parent file.
+  CorpusPathFilters corpus_path_filters = 19;
+
   reserved 4;
   reserved 100;
 }
 
+message CorpusPathFilters {
+  repeated CorpusPathFilter filter = 1;
+}
+
+// A filter for CorpusPaths.  The filter matches if each component pattern
+// matches (an empty pattern implies no filtering on that component).
+message CorpusPathFilter {
+  enum Type {
+    DEFAULT = 0;
+    INCLUDE_ONLY = 1;
+    EXCLUDE = 2;
+  }
+  Type type = 1;
+
+  // Corpus pattern to match against.
+  string corpus = 2;
+  // Root pattern to match against.
+  string root = 3;
+  // Path pattern to match against.
+  string path = 4;
+}
+
 // TODO(schroederc): eliminate duplicate serving.ExpandedAnchor message
 // defintion
 
diff --git a/kythe/proto/xref_go_proto/xref.pb.go b/kythe/proto/xref_go_proto/xref.pb.go
index d76cb6805..86dd92823 100644
--- a/kythe/proto/xref_go_proto/xref.pb.go
+++ b/kythe/proto/xref_go_proto/xref.pb.go
@@ -453,6 +453,55 @@ func (CrossReferencesRequest_TotalsQuality) EnumDescriptor() ([]byte, []int) {
 	return file_kythe_proto_xref_proto_rawDescGZIP(), []int{4, 4}
 }
 
+type CorpusPathFilter_Type int32
+
+const (
+	CorpusPathFilter_DEFAULT      CorpusPathFilter_Type = 0
+	CorpusPathFilter_INCLUDE_ONLY CorpusPathFilter_Type = 1
+	CorpusPathFilter_EXCLUDE      CorpusPathFilter_Type = 2
+)
+
+// Enum value maps for CorpusPathFilter_Type.
+var (
+	CorpusPathFilter_Type_name = map[int32]string{
+		0: "DEFAULT",
+		1: "INCLUDE_ONLY",
+		2: "EXCLUDE",
+	}
+	CorpusPathFilter_Type_value = map[string]int32{
+		"DEFAULT":      0,
+		"INCLUDE_ONLY": 1,
+		"EXCLUDE":      2,
+	}
+)
+
+func (x CorpusPathFilter_Type) Enum() *CorpusPathFilter_Type {
+	p := new(CorpusPathFilter_Type)
+	*p = x
+	return p
+}
+
+func (x CorpusPathFilter_Type) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (CorpusPathFilter_Type) Descriptor() protoreflect.EnumDescriptor {
+	return file_kythe_proto_xref_proto_enumTypes[9].Descriptor()
+}
+
+func (CorpusPathFilter_Type) Type() protoreflect.EnumType {
+	return &file_kythe_proto_xref_proto_enumTypes[9]
+}
+
+func (x CorpusPathFilter_Type) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use CorpusPathFilter_Type.Descriptor instead.
+func (CorpusPathFilter_Type) EnumDescriptor() ([]byte, []int) {
+	return file_kythe_proto_xref_proto_rawDescGZIP(), []int{6, 0}
+}
+
 type Location struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -870,6 +919,7 @@ type CrossReferencesRequest struct {
 	BuildConfig           []string                               `protobuf:"bytes,15,rep,name=build_config,json=buildConfig,proto3" json:"build_config,omitempty"`
 	Workspace             *Workspace                             `protobuf:"bytes,17,opt,name=workspace,proto3" json:"workspace,omitempty"`
 	PatchAgainstWorkspace bool                                   `protobuf:"varint,18,opt,name=patch_against_workspace,json=patchAgainstWorkspace,proto3" json:"patch_against_workspace,omitempty"`
+	CorpusPathFilters     *CorpusPathFilters                     `protobuf:"bytes,19,opt,name=corpus_path_filters,json=corpusPathFilters,proto3" json:"corpus_path_filters,omitempty"`
 }
 
 func (x *CrossReferencesRequest) Reset() {
@@ -1016,6 +1066,131 @@ func (x *CrossReferencesRequest) GetPatchAgainstWorkspace() bool {
 	return false
 }
 
+func (x *CrossReferencesRequest) GetCorpusPathFilters() *CorpusPathFilters {
+	if x != nil {
+		return x.CorpusPathFilters
+	}
+	return nil
+}
+
+type CorpusPathFilters struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Filter []*CorpusPathFilter `protobuf:"bytes,1,rep,name=filter,proto3" json:"filter,omitempty"`
+}
+
+func (x *CorpusPathFilters) Reset() {
+	*x = CorpusPathFilters{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_kythe_proto_xref_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CorpusPathFilters) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CorpusPathFilters) ProtoMessage() {}
+
+func (x *CorpusPathFilters) ProtoReflect() protoreflect.Message {
+	mi := &file_kythe_proto_xref_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use CorpusPathFilters.ProtoReflect.Descriptor instead.
+func (*CorpusPathFilters) Descriptor() ([]byte, []int) {
+	return file_kythe_proto_xref_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *CorpusPathFilters) GetFilter() []*CorpusPathFilter {
+	if x != nil {
+		return x.Filter
+	}
+	return nil
+}
+
+type CorpusPathFilter struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Type   CorpusPathFilter_Type `protobuf:"varint,1,opt,name=type,proto3,enum=kythe.proto.CorpusPathFilter_Type" json:"type,omitempty"`
+	Corpus string                `protobuf:"bytes,2,opt,name=corpus,proto3" json:"corpus,omitempty"`
+	Root   string                `protobuf:"bytes,3,opt,name=root,proto3" json:"root,omitempty"`
+	Path   string                `protobuf:"bytes,4,opt,name=path,proto3" json:"path,omitempty"`
+}
+
+func (x *CorpusPathFilter) Reset() {
+	*x = CorpusPathFilter{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_kythe_proto_xref_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CorpusPathFilter) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CorpusPathFilter) ProtoMessage() {}
+
+func (x *CorpusPathFilter) ProtoReflect() protoreflect.Message {
+	mi := &file_kythe_proto_xref_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use CorpusPathFilter.ProtoReflect.Descriptor instead.
+func (*CorpusPathFilter) Descriptor() ([]byte, []int) {
+	return file_kythe_proto_xref_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *CorpusPathFilter) GetType() CorpusPathFilter_Type {
+	if x != nil {
+		return x.Type
+	}
+	return CorpusPathFilter_DEFAULT
+}
+
+func (x *CorpusPathFilter) GetCorpus() string {
+	if x != nil {
+		return x.Corpus
+	}
+	return ""
+}
+
+func (x *CorpusPathFilter) GetRoot() string {
+	if x != nil {
+		return x.Root
+	}
+	return ""
+}
+
+func (x *CorpusPathFilter) GetPath() string {
+	if x != nil {
+		return x.Path
+	}
+	return ""
+}
+
 type Anchor struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -1035,7 +1210,7 @@ type Anchor struct {
 func (x *Anchor) Reset() {
 	*x = Anchor{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_kythe_proto_xref_proto_msgTypes[5]
+		mi := &file_kythe_proto_xref_proto_msgTypes[7]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1048,7 +1223,7 @@ func (x *Anchor) String() string {
 func (*Anchor) ProtoMessage() {}
 
 func (x *Anchor) ProtoReflect() protoreflect.Message {
-	mi := &file_kythe_proto_xref_proto_msgTypes[5]
+	mi := &file_kythe_proto_xref_proto_msgTypes[7]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1061,7 +1236,7 @@ func (x *Anchor) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use Anchor.ProtoReflect.Descriptor instead.
 func (*Anchor) Descriptor() ([]byte, []int) {
-	return file_kythe_proto_xref_proto_rawDescGZIP(), []int{5}
+	return file_kythe_proto_xref_proto_rawDescGZIP(), []int{7}
 }
 
 func (x *Anchor) GetTicket() string {
@@ -1139,7 +1314,7 @@ type Printable struct {
 func (x *Printable) Reset() {
 	*x = Printable{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_kythe_proto_xref_proto_msgTypes[6]
+		mi := &file_kythe_proto_xref_proto_msgTypes[8]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1152,7 +1327,7 @@ func (x *Printable) String() string {
 func (*Printable) ProtoMessage() {}
 
 func (x *Printable) ProtoReflect() protoreflect.Message {
-	mi := &file_kythe_proto_xref_proto_msgTypes[6]
+	mi := &file_kythe_proto_xref_proto_msgTypes[8]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1165,7 +1340,7 @@ func (x *Printable) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use Printable.ProtoReflect.Descriptor instead.
 func (*Printable) Descriptor() ([]byte, []int) {
-	return file_kythe_proto_xref_proto_rawDescGZIP(), []int{6}
+	return file_kythe_proto_xref_proto_rawDescGZIP(), []int{8}
 }
 
 func (x *Printable) GetRawText() string {
@@ -1198,7 +1373,7 @@ type CrossReferencesReply struct {
 func (x *CrossReferencesReply) Reset() {
 	*x = CrossReferencesReply{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_kythe_proto_xref_proto_msgTypes[7]
+		mi := &file_kythe_proto_xref_proto_msgTypes[9]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1211,7 +1386,7 @@ func (x *CrossReferencesReply) String() string {
 func (*CrossReferencesReply) ProtoMessage() {}
 
 func (x *CrossReferencesReply) ProtoReflect() protoreflect.Message {
-	mi := &file_kythe_proto_xref_proto_msgTypes[7]
+	mi := &file_kythe_proto_xref_proto_msgTypes[9]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1224,7 +1399,7 @@ func (x *CrossReferencesReply) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use CrossReferencesReply.ProtoReflect.Descriptor instead.
 func (*CrossReferencesReply) Descriptor() ([]byte, []int) {
-	return file_kythe_proto_xref_proto_rawDescGZIP(), []int{7}
+	return file_kythe_proto_xref_proto_rawDescGZIP(), []int{9}
 }
 
 func (x *CrossReferencesReply) GetTotal() *CrossReferencesReply_Total {
@@ -1282,7 +1457,7 @@ type DocumentationRequest struct {
 func (x *DocumentationRequest) Reset() {
 	*x = DocumentationRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_kythe_proto_xref_proto_msgTypes[8]
+		mi := &file_kythe_proto_xref_proto_msgTypes[10]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1295,7 +1470,7 @@ func (x *DocumentationRequest) String() string {
 func (*DocumentationRequest) ProtoMessage() {}
 
 func (x *DocumentationRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_kythe_proto_xref_proto_msgTypes[8]
+	mi := &file_kythe_proto_xref_proto_msgTypes[10]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1308,7 +1483,7 @@ func (x *DocumentationRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use DocumentationRequest.ProtoReflect.Descriptor instead.
 func (*DocumentationRequest) Descriptor() ([]byte, []int) {
-	return file_kythe_proto_xref_proto_rawDescGZIP(), []int{8}
+	return file_kythe_proto_xref_proto_rawDescGZIP(), []int{10}
 }
 
 func (x *DocumentationRequest) GetTicket() []string {
@@ -1346,7 +1521,7 @@ type DocumentationReply struct {
 func (x *DocumentationReply) Reset() {
 	*x = DocumentationReply{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_kythe_proto_xref_proto_msgTypes[9]
+		mi := &file_kythe_proto_xref_proto_msgTypes[11]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1359,7 +1534,7 @@ func (x *DocumentationReply) String() string {
 func (*DocumentationReply) ProtoMessage() {}
 
 func (x *DocumentationReply) ProtoReflect() protoreflect.Message {
-	mi := &file_kythe_proto_xref_proto_msgTypes[9]
+	mi := &file_kythe_proto_xref_proto_msgTypes[11]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1372,7 +1547,7 @@ func (x *DocumentationReply) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use DocumentationReply.ProtoReflect.Descriptor instead.
 func (*DocumentationReply) Descriptor() ([]byte, []int) {
-	return file_kythe_proto_xref_proto_rawDescGZIP(), []int{9}
+	return file_kythe_proto_xref_proto_rawDescGZIP(), []int{11}
 }
 
 func (x *DocumentationReply) GetDocument() []*DocumentationReply_Document {
@@ -1414,7 +1589,7 @@ type Workspace struct {
 func (x *Workspace) Reset() {
 	*x = Workspace{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_kythe_proto_xref_proto_msgTypes[10]
+		mi := &file_kythe_proto_xref_proto_msgTypes[12]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1427,7 +1602,7 @@ func (x *Workspace) String() string {
 func (*Workspace) ProtoMessage() {}
 
 func (x *Workspace) ProtoReflect() protoreflect.Message {
-	mi := &file_kythe_proto_xref_proto_msgTypes[10]
+	mi := &file_kythe_proto_xref_proto_msgTypes[12]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1440,7 +1615,7 @@ func (x *Workspace) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use Workspace.ProtoReflect.Descriptor instead.
 func (*Workspace) Descriptor() ([]byte, []int) {
-	return file_kythe_proto_xref_proto_rawDescGZIP(), []int{10}
+	return file_kythe_proto_xref_proto_rawDescGZIP(), []int{12}
 }
 
 func (x *Workspace) GetUri() string {
@@ -1467,7 +1642,7 @@ type DecorationsReply_Reference struct {
 func (x *DecorationsReply_Reference) Reset() {
 	*x = DecorationsReply_Reference{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_kythe_proto_xref_proto_msgTypes[11]
+		mi := &file_kythe_proto_xref_proto_msgTypes[13]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1480,7 +1655,7 @@ func (x *DecorationsReply_Reference) String() string {
 func (*DecorationsReply_Reference) ProtoMessage() {}
 
 func (x *DecorationsReply_Reference) ProtoReflect() protoreflect.Message {
-	mi := &file_kythe_proto_xref_proto_msgTypes[11]
+	mi := &file_kythe_proto_xref_proto_msgTypes[13]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1559,7 +1734,7 @@ type DecorationsReply_Override struct {
 func (x *DecorationsReply_Override) Reset() {
 	*x = DecorationsReply_Override{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_kythe_proto_xref_proto_msgTypes[12]
+		mi := &file_kythe_proto_xref_proto_msgTypes[14]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1572,7 +1747,7 @@ func (x *DecorationsReply_Override) String() string {
 func (*DecorationsReply_Override) ProtoMessage() {}
 
 func (x *DecorationsReply_Override) ProtoReflect() protoreflect.Message {
-	mi := &file_kythe_proto_xref_proto_msgTypes[12]
+	mi := &file_kythe_proto_xref_proto_msgTypes[14]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1627,7 +1802,7 @@ type DecorationsReply_Overrides struct {
 func (x *DecorationsReply_Overrides) Reset() {
 	*x = DecorationsReply_Overrides{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_kythe_proto_xref_proto_msgTypes[13]
+		mi := &file_kythe_proto_xref_proto_msgTypes[15]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1640,7 +1815,7 @@ func (x *DecorationsReply_Overrides) String() string {
 func (*DecorationsReply_Overrides) ProtoMessage() {}
 
 func (x *DecorationsReply_Overrides) ProtoReflect() protoreflect.Message {
-	mi := &file_kythe_proto_xref_proto_msgTypes[13]
+	mi := &file_kythe_proto_xref_proto_msgTypes[15]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1676,7 +1851,7 @@ type CrossReferencesReply_RelatedNode struct {
 func (x *CrossReferencesReply_RelatedNode) Reset() {
 	*x = CrossReferencesReply_RelatedNode{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_kythe_proto_xref_proto_msgTypes[17]
+		mi := &file_kythe_proto_xref_proto_msgTypes[19]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1689,7 +1864,7 @@ func (x *CrossReferencesReply_RelatedNode) String() string {
 func (*CrossReferencesReply_RelatedNode) ProtoMessage() {}
 
 func (x *CrossReferencesReply_RelatedNode) ProtoReflect() protoreflect.Message {
-	mi := &file_kythe_proto_xref_proto_msgTypes[17]
+	mi := &file_kythe_proto_xref_proto_msgTypes[19]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1702,7 +1877,7 @@ func (x *CrossReferencesReply_RelatedNode) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use CrossReferencesReply_RelatedNode.ProtoReflect.Descriptor instead.
 func (*CrossReferencesReply_RelatedNode) Descriptor() ([]byte, []int) {
-	return file_kythe_proto_xref_proto_rawDescGZIP(), []int{7, 0}
+	return file_kythe_proto_xref_proto_rawDescGZIP(), []int{9, 0}
 }
 
 func (x *CrossReferencesReply_RelatedNode) GetTicket() string {
@@ -1740,7 +1915,7 @@ type CrossReferencesReply_RelatedAnchor struct {
 func (x *CrossReferencesReply_RelatedAnchor) Reset() {
 	*x = CrossReferencesReply_RelatedAnchor{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_kythe_proto_xref_proto_msgTypes[18]
+		mi := &file_kythe_proto_xref_proto_msgTypes[20]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1753,7 +1928,7 @@ func (x *CrossReferencesReply_RelatedAnchor) String() string {
 func (*CrossReferencesReply_RelatedAnchor) ProtoMessage() {}
 
 func (x *CrossReferencesReply_RelatedAnchor) ProtoReflect() protoreflect.Message {
-	mi := &file_kythe_proto_xref_proto_msgTypes[18]
+	mi := &file_kythe_proto_xref_proto_msgTypes[20]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1766,7 +1941,7 @@ func (x *CrossReferencesReply_RelatedAnchor) ProtoReflect() protoreflect.Message
 
 // Deprecated: Use CrossReferencesReply_RelatedAnchor.ProtoReflect.Descriptor instead.
 func (*CrossReferencesReply_RelatedAnchor) Descriptor() ([]byte, []int) {
-	return file_kythe_proto_xref_proto_rawDescGZIP(), []int{7, 1}
+	return file_kythe_proto_xref_proto_rawDescGZIP(), []int{9, 1}
 }
 
 func (x *CrossReferencesReply_RelatedAnchor) GetAnchor() *Anchor {
@@ -1814,7 +1989,7 @@ type CrossReferencesReply_CrossReferenceSet struct {
 func (x *CrossReferencesReply_CrossReferenceSet) Reset() {
 	*x = CrossReferencesReply_CrossReferenceSet{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_kythe_proto_xref_proto_msgTypes[19]
+		mi := &file_kythe_proto_xref_proto_msgTypes[21]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1827,7 +2002,7 @@ func (x *CrossReferencesReply_CrossReferenceSet) String() string {
 func (*CrossReferencesReply_CrossReferenceSet) ProtoMessage() {}
 
 func (x *CrossReferencesReply_CrossReferenceSet) ProtoReflect() protoreflect.Message {
-	mi := &file_kythe_proto_xref_proto_msgTypes[19]
+	mi := &file_kythe_proto_xref_proto_msgTypes[21]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1840,7 +2015,7 @@ func (x *CrossReferencesReply_CrossReferenceSet) ProtoReflect() protoreflect.Mes
 
 // Deprecated: Use CrossReferencesReply_CrossReferenceSet.ProtoReflect.Descriptor instead.
 func (*CrossReferencesReply_CrossReferenceSet) Descriptor() ([]byte, []int) {
-	return file_kythe_proto_xref_proto_rawDescGZIP(), []int{7, 2}
+	return file_kythe_proto_xref_proto_rawDescGZIP(), []int{9, 2}
 }
 
 func (x *CrossReferencesReply_CrossReferenceSet) GetTicket() string {
@@ -1908,7 +2083,7 @@ type CrossReferencesReply_Total struct {
 func (x *CrossReferencesReply_Total) Reset() {
 	*x = CrossReferencesReply_Total{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_kythe_proto_xref_proto_msgTypes[20]
+		mi := &file_kythe_proto_xref_proto_msgTypes[22]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1921,7 +2096,7 @@ func (x *CrossReferencesReply_Total) String() string {
 func (*CrossReferencesReply_Total) ProtoMessage() {}
 
 func (x *CrossReferencesReply_Total) ProtoReflect() protoreflect.Message {
-	mi := &file_kythe_proto_xref_proto_msgTypes[20]
+	mi := &file_kythe_proto_xref_proto_msgTypes[22]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1934,7 +2109,7 @@ func (x *CrossReferencesReply_Total) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use CrossReferencesReply_Total.ProtoReflect.Descriptor instead.
 func (*CrossReferencesReply_Total) Descriptor() ([]byte, []int) {
-	return file_kythe_proto_xref_proto_rawDescGZIP(), []int{7, 3}
+	return file_kythe_proto_xref_proto_rawDescGZIP(), []int{9, 3}
 }
 
 func (x *CrossReferencesReply_Total) GetDefinitions() int64 {
@@ -1993,7 +2168,7 @@ type DocumentationReply_Document struct {
 func (x *DocumentationReply_Document) Reset() {
 	*x = DocumentationReply_Document{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_kythe_proto_xref_proto_msgTypes[25]
+		mi := &file_kythe_proto_xref_proto_msgTypes[27]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2006,7 +2181,7 @@ func (x *DocumentationReply_Document) String() string {
 func (*DocumentationReply_Document) ProtoMessage() {}
 
 func (x *DocumentationReply_Document) ProtoReflect() protoreflect.Message {
-	mi := &file_kythe_proto_xref_proto_msgTypes[25]
+	mi := &file_kythe_proto_xref_proto_msgTypes[27]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2019,7 +2194,7 @@ func (x *DocumentationReply_Document) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use DocumentationReply_Document.ProtoReflect.Descriptor instead.
 func (*DocumentationReply_Document) Descriptor() ([]byte, []int) {
-	return file_kythe_proto_xref_proto_rawDescGZIP(), []int{9, 0}
+	return file_kythe_proto_xref_proto_rawDescGZIP(), []int{11, 0}
 }
 
 func (x *DocumentationReply_Document) GetTicket() string {
@@ -2215,7 +2390,7 @@ var file_kythe_proto_xref_proto_rawDesc = []byte{
 	0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
 	0x6f, 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70,
 	0x6c, 0x79, 0x2e, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x52, 0x05, 0x76, 0x61,
-	0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0xbd, 0x0a,
+	0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x8d, 0x0b,
 	0x0a, 0x16, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
 	0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x69, 0x63, 0x6b,
 	0x65, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74,
@@ -2272,7 +2447,12 @@ var file_kythe_proto_xref_proto_rawDesc = []byte{
 	0x0a, 0x17, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x61, 0x67, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x5f,
 	0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52,
 	0x15, 0x70, 0x61, 0x74, 0x63, 0x68, 0x41, 0x67, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x57, 0x6f, 0x72,
-	0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x68, 0x0a, 0x0e, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69,
+	0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x4e, 0x0a, 0x13, 0x63, 0x6f, 0x72, 0x70, 0x75, 0x73,
+	0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x13, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x2e, 0x43, 0x6f, 0x72, 0x70, 0x75, 0x73, 0x50, 0x61, 0x74, 0x68, 0x46, 0x69, 0x6c, 0x74,
+	0x65, 0x72, 0x73, 0x52, 0x11, 0x63, 0x6f, 0x72, 0x70, 0x75, 0x73, 0x50, 0x61, 0x74, 0x68, 0x46,
+	0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x22, 0x68, 0x0a, 0x0e, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69,
 	0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x0e, 0x4e, 0x4f, 0x5f, 0x44,
 	0x45, 0x46, 0x49, 0x4e, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f,
 	0x41, 0x4c, 0x4c, 0x5f, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x10,
@@ -2299,232 +2479,249 @@ var file_kythe_proto_xref_proto_rawDesc = []byte{
 	0x41, 0x4c, 0x53, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x52, 0x45, 0x43, 0x49, 0x53, 0x45,
 	0x5f, 0x54, 0x4f, 0x54, 0x41, 0x4c, 0x53, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x41, 0x50, 0x50,
 	0x52, 0x4f, 0x58, 0x49, 0x4d, 0x41, 0x54, 0x45, 0x5f, 0x54, 0x4f, 0x54, 0x41, 0x4c, 0x53, 0x10,
-	0x02, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x64, 0x10, 0x65, 0x22, 0xbc, 0x02,
-	0x0a, 0x06, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x69, 0x63, 0x6b,
-	0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74,
-	0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
-	0x6b, 0x69, 0x6e, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x03,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x04,
-	0x73, 0x70, 0x61, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6b, 0x79, 0x74,
-	0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e,
-	0x53, 0x70, 0x61, 0x6e, 0x52, 0x04, 0x73, 0x70, 0x61, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65,
-	0x78, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x12, 0x18,
-	0x0a, 0x07, 0x73, 0x6e, 0x69, 0x70, 0x70, 0x65, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x07, 0x73, 0x6e, 0x69, 0x70, 0x70, 0x65, 0x74, 0x12, 0x3b, 0x0a, 0x0c, 0x73, 0x6e, 0x69, 0x70,
-	0x70, 0x65, 0x74, 0x5f, 0x73, 0x70, 0x61, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18,
-	0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d,
-	0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x70, 0x61, 0x6e, 0x52, 0x0b, 0x73, 0x6e, 0x69, 0x70, 0x70, 0x65,
-	0x74, 0x53, 0x70, 0x61, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x63,
-	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x62, 0x75, 0x69,
-	0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69,
-	0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69,
-	0x73, 0x69, 0x6f, 0x6e, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06,
-	0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x4a, 0x04, 0x08, 0x09, 0x10, 0x0a, 0x22, 0x54, 0x0a, 0x09,
-	0x50, 0x72, 0x69, 0x6e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x61, 0x77,
-	0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x61, 0x77,
-	0x54, 0x65, 0x78, 0x74, 0x12, 0x2c, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x02, 0x20, 0x03,
-	0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4c, 0x69, 0x6e, 0x6b, 0x52, 0x04, 0x6c, 0x69,
-	0x6e, 0x6b, 0x22, 0x99, 0x0f, 0x0a, 0x14, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x52, 0x65, 0x66, 0x65,
-	0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3d, 0x0a, 0x05, 0x74,
-	0x6f, 0x74, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6b, 0x79, 0x74,
-	0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x52, 0x65,
-	0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x54, 0x6f,
-	0x74, 0x61, 0x6c, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x61, 0x0a, 0x10, 0x63, 0x72,
-	0x6f, 0x73, 0x73, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x01,
-	0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,
-	0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x52, 0x65, 0x66,
-	0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x63, 0x72,
-	0x6f, 0x73, 0x73, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x42, 0x0a,
-	0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6b,
-	0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73,
-	0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e,
-	0x4e, 0x6f, 0x64, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65,
-	0x73, 0x12, 0x6d, 0x0a, 0x14, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
-	0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32,
-	0x3a, 0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x72,
-	0x6f, 0x73, 0x73, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70,
-	0x6c, 0x79, 0x2e, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x63,
-	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x64, 0x65, 0x66,
-	0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
-	0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f,
-	0x6b, 0x65, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50,
-	0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x75, 0x69, 0x6c,
-	0x64, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x75, 0x69, 0x6c,
-	0x64, 0x49, 0x64, 0x1a, 0x64, 0x0a, 0x0b, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x4e, 0x6f,
-	0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65,
-	0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x0c, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x69, 0x6e, 0x64, 0x12,
-	0x18, 0x0a, 0x07, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05,
-	0x52, 0x07, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x1a, 0xca, 0x01, 0x0a, 0x0d, 0x52, 0x65,
-	0x6c, 0x61, 0x74, 0x65, 0x64, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x12, 0x2b, 0x0a, 0x06, 0x61,
-	0x6e, 0x63, 0x68, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6b, 0x79,
-	0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72,
-	0x52, 0x06, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x12, 0x45, 0x0a, 0x0d, 0x6d, 0x61, 0x72, 0x6b,
-	0x65, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32,
-	0x20, 0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f,
-	0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x53, 0x6f, 0x75, 0x72, 0x63,
-	0x65, 0x52, 0x0c, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12,
-	0x27, 0x0a, 0x04, 0x73, 0x69, 0x74, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e,
-	0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x6e, 0x63, 0x68,
-	0x6f, 0x72, 0x52, 0x04, 0x73, 0x69, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x69, 0x63, 0x6b,
-	0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74,
-	0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x1a, 0x8c, 0x04, 0x0a, 0x11, 0x43, 0x72, 0x6f, 0x73, 0x73,
-	0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x53, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06,
-	0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x69,
-	0x63, 0x6b, 0x65, 0x74, 0x12, 0x45, 0x0a, 0x0d, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x5f, 0x73,
-	0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6b, 0x79,
+	0x02, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x64, 0x10, 0x65, 0x22, 0x4a, 0x0a,
+	0x11, 0x43, 0x6f, 0x72, 0x70, 0x75, 0x73, 0x50, 0x61, 0x74, 0x68, 0x46, 0x69, 0x6c, 0x74, 0x65,
+	0x72, 0x73, 0x12, 0x35, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x03,
+	0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x2e, 0x43, 0x6f, 0x72, 0x70, 0x75, 0x73, 0x50, 0x61, 0x74, 0x68, 0x46, 0x69, 0x6c, 0x74, 0x65,
+	0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0xbe, 0x01, 0x0a, 0x10, 0x43, 0x6f,
+	0x72, 0x70, 0x75, 0x73, 0x50, 0x61, 0x74, 0x68, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x36,
+	0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6b,
+	0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x6f, 0x72, 0x70, 0x75,
+	0x73, 0x50, 0x61, 0x74, 0x68, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65,
+	0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x72, 0x70, 0x75, 0x73,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x6f, 0x72, 0x70, 0x75, 0x73, 0x12, 0x12,
+	0x0a, 0x04, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f,
+	0x6f, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x32, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b,
+	0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x49,
+	0x4e, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x01, 0x12, 0x0b, 0x0a,
+	0x07, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, 0x02, 0x22, 0xbc, 0x02, 0x0a, 0x06, 0x41,
+	0x6e, 0x63, 0x68, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x12, 0x0a,
+	0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e,
+	0x64, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x04, 0x73, 0x70, 0x61,
+	0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x70, 0x61,
+	0x6e, 0x52, 0x04, 0x73, 0x70, 0x61, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18,
+	0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73,
+	0x6e, 0x69, 0x70, 0x70, 0x65, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x6e,
+	0x69, 0x70, 0x70, 0x65, 0x74, 0x12, 0x3b, 0x0a, 0x0c, 0x73, 0x6e, 0x69, 0x70, 0x70, 0x65, 0x74,
+	0x5f, 0x73, 0x70, 0x61, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6b, 0x79,
 	0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,
-	0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0c, 0x6d,
-	0x61, 0x72, 0x6b, 0x65, 0x64, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x4f, 0x0a, 0x0a, 0x64,
-	0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32,
-	0x2f, 0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x72,
-	0x6f, 0x73, 0x73, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70,
-	0x6c, 0x79, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72,
-	0x52, 0x0a, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x51, 0x0a, 0x0b,
-	0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x03, 0x28,
-	0x0b, 0x32, 0x2f, 0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
+	0x2e, 0x53, 0x70, 0x61, 0x6e, 0x52, 0x0b, 0x73, 0x6e, 0x69, 0x70, 0x70, 0x65, 0x74, 0x53, 0x70,
+	0x61, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66,
+	0x69, 0x67, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x43,
+	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f,
+	0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f,
+	0x6e, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x4a, 0x04, 0x08,
+	0x08, 0x10, 0x09, 0x4a, 0x04, 0x08, 0x09, 0x10, 0x0a, 0x22, 0x54, 0x0a, 0x09, 0x50, 0x72, 0x69,
+	0x6e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x65,
+	0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x61, 0x77, 0x54, 0x65, 0x78,
+	0x74, 0x12, 0x2c, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32,
+	0x18, 0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f,
+	0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4c, 0x69, 0x6e, 0x6b, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x22,
+	0x99, 0x0f, 0x0a, 0x14, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e,
+	0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3d, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61,
+	0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x52, 0x65, 0x66, 0x65, 0x72,
+	0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x54, 0x6f, 0x74, 0x61, 0x6c,
+	0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x61, 0x0a, 0x10, 0x63, 0x72, 0x6f, 0x73, 0x73,
+	0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
+	0x0b, 0x32, 0x36, 0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
 	0x43, 0x72, 0x6f, 0x73, 0x73, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52,
-	0x65, 0x70, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x41, 0x6e, 0x63, 0x68,
-	0x6f, 0x72, 0x52, 0x0b, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12,
-	0x4d, 0x0a, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x03,
-	0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73,
-	0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x41, 0x6e, 0x63,
-	0x68, 0x6f, 0x72, 0x52, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x47,
-	0x0a, 0x06, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f,
+	0x65, 0x70, 0x6c, 0x79, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65,
+	0x6e, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x63, 0x72, 0x6f, 0x73, 0x73,
+	0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x05, 0x6e, 0x6f,
+	0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6b, 0x79, 0x74, 0x68,
+	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x52, 0x65, 0x66,
+	0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x4e, 0x6f, 0x64,
+	0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x6d,
+	0x0a, 0x14, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x6f, 0x63,
+	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6b,
+	0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73,
+	0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e,
+	0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69,
+	0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69,
+	0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a,
+	0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e,
+	0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65,
+	0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69,
+	0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64,
+	0x1a, 0x64, 0x0a, 0x0b, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x12,
+	0x16, 0x0a, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6c, 0x61, 0x74,
+	0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c,
+	0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07,
+	0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6f,
+	0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x1a, 0xca, 0x01, 0x0a, 0x0d, 0x52, 0x65, 0x6c, 0x61, 0x74,
+	0x65, 0x64, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x12, 0x2b, 0x0a, 0x06, 0x61, 0x6e, 0x63, 0x68,
+	0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x52, 0x06, 0x61,
+	0x6e, 0x63, 0x68, 0x6f, 0x72, 0x12, 0x45, 0x0a, 0x0d, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x5f,
+	0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6b,
+	0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,
+	0x6e, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0c,
+	0x6d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x27, 0x0a, 0x04,
+	0x73, 0x69, 0x74, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6b, 0x79, 0x74,
+	0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x52,
+	0x04, 0x73, 0x69, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x18,
+	0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x4a, 0x04, 0x08,
+	0x02, 0x10, 0x03, 0x1a, 0x8c, 0x04, 0x0a, 0x11, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x52, 0x65, 0x66,
+	0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x53, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x69, 0x63,
+	0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65,
+	0x74, 0x12, 0x45, 0x0a, 0x0d, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72,
+	0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x61,
+	0x72, 0x6b, 0x65, 0x64, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0c, 0x6d, 0x61, 0x72, 0x6b,
+	0x65, 0x64, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x4f, 0x0a, 0x0a, 0x64, 0x65, 0x66, 0x69,
+	0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6b,
+	0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73,
+	0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e,
+	0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x52, 0x0a, 0x64,
+	0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x51, 0x0a, 0x0b, 0x64, 0x65, 0x63,
+	0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f,
 	0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x72, 0x6f,
 	0x73, 0x73, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c,
 	0x79, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x52,
-	0x06, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x12, 0x50, 0x0a, 0x0c, 0x72, 0x65, 0x6c, 0x61, 0x74,
-	0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e,
-	0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x72, 0x6f, 0x73,
-	0x73, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79,
-	0x2e, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x0b, 0x72, 0x65,
-	0x6c, 0x61, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a,
-	0x04, 0x08, 0x07, 0x10, 0x08, 0x1a, 0xf8, 0x02, 0x0a, 0x05, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12,
-	0x20, 0x0a, 0x0b, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e,
-	0x73, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
-	0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61,
-	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e,
-	0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72,
-	0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e,
-	0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x64, 0x6f,
-	0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x63,
-	0x61, 0x6c, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x63, 0x61,
-	0x6c, 0x6c, 0x65, 0x72, 0x73, 0x12, 0x7e, 0x0a, 0x19, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64,
-	0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69,
-	0x6f, 0x6e, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65,
-	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x52, 0x65, 0x66, 0x65,
-	0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x54, 0x6f, 0x74, 0x61,
-	0x6c, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x42, 0x79,
-	0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x16, 0x72,
+	0x0b, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4d, 0x0a, 0x09,
+	0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32,
+	0x2f, 0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x72,
+	0x6f, 0x73, 0x73, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70,
+	0x6c, 0x79, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72,
+	0x52, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x47, 0x0a, 0x06, 0x63,
+	0x61, 0x6c, 0x6c, 0x65, 0x72, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6b, 0x79,
+	0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x52,
+	0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x52,
+	0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x52, 0x06, 0x63, 0x61,
+	0x6c, 0x6c, 0x65, 0x72, 0x12, 0x50, 0x0a, 0x0c, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x5f,
+	0x6e, 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x6b, 0x79, 0x74,
+	0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x52, 0x65,
+	0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x52, 0x65,
+	0x6c, 0x61, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x0b, 0x72, 0x65, 0x6c, 0x61, 0x74,
+	0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x07,
+	0x10, 0x08, 0x1a, 0xf8, 0x02, 0x0a, 0x05, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x20, 0x0a, 0x0b,
+	0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x03, 0x52, 0x0b, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x22,
+	0x0a, 0x0c, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f,
+	0x6e, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,
+	0x65, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74,
+	0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x64, 0x6f, 0x63, 0x75, 0x6d,
+	0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x61, 0x6c, 0x6c,
+	0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x63, 0x61, 0x6c, 0x6c, 0x65,
+	0x72, 0x73, 0x12, 0x7e, 0x0a, 0x19, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x6f,
+	0x64, 0x65, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18,
+	0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e,
+	0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x2e, 0x52,
 	0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x42, 0x79, 0x52, 0x65, 0x6c,
-	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x49, 0x0a, 0x1b, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64,
-	0x4e, 0x6f, 0x64, 0x65, 0x73, 0x42, 0x79, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45,
+	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x16, 0x72, 0x65, 0x6c, 0x61,
+	0x74, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x42, 0x79, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69,
+	0x6f, 0x6e, 0x1a, 0x49, 0x0a, 0x1b, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x64,
+	0x65, 0x73, 0x42, 0x79, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x74, 0x72,
+	0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03,
+	0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x77, 0x0a,
+	0x14, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73,
+	0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x49, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65,
+	0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x52,
+	0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x53, 0x65, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c,
+	0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x56, 0x0a, 0x0a, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x45,
 	0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18,
-	0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01,
-	0x1a, 0x77, 0x0a, 0x14, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e,
-	0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x49, 0x0a, 0x05, 0x76, 0x61,
-	0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x6b, 0x79, 0x74, 0x68,
-	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x52, 0x65, 0x66,
-	0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x43, 0x72, 0x6f,
-	0x73, 0x73, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x53, 0x65, 0x74, 0x52, 0x05,
-	0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x56, 0x0a, 0x0a, 0x4e, 0x6f, 0x64,
-	0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x32, 0x0a, 0x05, 0x76, 0x61, 0x6c,
-	0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65,
-	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4e, 0x6f,
-	0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38,
-	0x01, 0x1a, 0x5b, 0x0a, 0x18, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4c,
-	0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a,
-	0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12,
-	0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13,
-	0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x6e, 0x63,
-	0x68, 0x6f, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x71,
-	0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74,
-	0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x16,
-	0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06,
-	0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x29, 0x0a, 0x10, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64,
-	0x65, 0x5f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08,
-	0x52, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65,
-	0x6e, 0x22, 0xd5, 0x05, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74,
-	0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x44, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75,
-	0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6b, 0x79, 0x74,
+	0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x32, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x49,
+	0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5b,
+	0x0a, 0x18, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x63, 0x61,
+	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65,
+	0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05,
+	0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6b, 0x79,
+	0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72,
+	0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x71, 0x0a, 0x14, 0x44,
+	0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20,
+	0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x66,
+	0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c,
+	0x74, 0x65, 0x72, 0x12, 0x29, 0x0a, 0x10, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x63,
+	0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69,
+	0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0xd5,
+	0x05, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+	0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x44, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e,
+	0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74,
+	0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e,
+	0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x40, 0x0a, 0x05, 0x6e,
+	0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6b, 0x79, 0x74,
 	0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e,
-	0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x44, 0x6f, 0x63, 0x75,
-	0x6d, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x40,
-	0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e,
-	0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x6f, 0x63, 0x75,
-	0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x4e,
-	0x6f, 0x64, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73,
-	0x12, 0x6b, 0x0a, 0x14, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c,
-	0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38,
-	0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x6f, 0x63,
-	0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e,
-	0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69,
-	0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69,
-	0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x19, 0x0a,
-	0x08, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x07, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x1a, 0xf9, 0x01, 0x0a, 0x08, 0x44, 0x6f, 0x63,
-	0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x2a, 0x0a,
-	0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6b, 0x79,
-	0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x61,
-	0x62, 0x6c, 0x65, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x12, 0x45, 0x0a, 0x0d, 0x6d, 0x61, 0x72,
-	0x6b, 0x65, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b,
-	0x32, 0x20, 0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63,
-	0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x53, 0x6f, 0x75, 0x72,
-	0x63, 0x65, 0x52, 0x0c, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65,
-	0x12, 0x44, 0x0a, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x03,
-	0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65,
-	0x70, 0x6c, 0x79, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x63, 0x68,
-	0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x04,
-	0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x4a, 0x04,
-	0x08, 0x07, 0x10, 0x08, 0x1a, 0x56, 0x0a, 0x0a, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x45, 0x6e, 0x74,
-	0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x03, 0x6b, 0x65, 0x79, 0x12, 0x32, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20,
-	0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66,
-	0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5b, 0x0a, 0x18,
-	0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69,
-	0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61,
-	0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6b, 0x79, 0x74, 0x68,
-	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x52, 0x05,
-	0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1d, 0x0a, 0x09, 0x57, 0x6f, 0x72,
-	0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x69, 0x2a, 0x25, 0x0a, 0x0c, 0x53, 0x6e, 0x69, 0x70,
-	0x70, 0x65, 0x74, 0x73, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45,
-	0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x01, 0x32,
-	0x92, 0x02, 0x0a, 0x0b, 0x58, 0x52, 0x65, 0x66, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12,
-	0x4f, 0x0a, 0x0b, 0x44, 0x65, 0x63, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f,
-	0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x65, 0x63,
-	0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
-	0x1d, 0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x65,
-	0x63, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00,
-	0x12, 0x5b, 0x0a, 0x0f, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e,
-	0x63, 0x65, 0x73, 0x12, 0x23, 0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
-	0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65,
-	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x52, 0x65, 0x66, 0x65,
-	0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x55, 0x0a,
-	0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21,
+	0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x4e, 0x6f, 0x64, 0x65,
+	0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x6b, 0x0a,
+	0x14, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x6f, 0x63, 0x61,
+	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6b, 0x79,
+	0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65,
+	0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x44, 0x65, 0x66,
+	0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+	0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f,
+	0x6e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x75,
+	0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x75,
+	0x69, 0x6c, 0x64, 0x49, 0x64, 0x1a, 0xf9, 0x01, 0x0a, 0x08, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65,
+	0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x2a, 0x0a, 0x04, 0x74, 0x65,
+	0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x61, 0x62, 0x6c, 0x65,
+	0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x12, 0x45, 0x0a, 0x0d, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x64,
+	0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e,
+	0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d,
+	0x6f, 0x6e, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52,
+	0x0c, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x44, 0x0a,
+	0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32,
+	0x28, 0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x6f,
+	0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79,
+	0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64,
+	0x72, 0x65, 0x6e, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a,
+	0x04, 0x08, 0x05, 0x10, 0x06, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x4a, 0x04, 0x08, 0x07, 0x10,
+	0x08, 0x1a, 0x56, 0x0a, 0x0a, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12,
+	0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65,
+	0x79, 0x12, 0x32, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x1c, 0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63,
+	0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05,
+	0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5b, 0x0a, 0x18, 0x44, 0x65, 0x66,
+	0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+	0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c,
+	0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1d, 0x0a, 0x09, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70,
+	0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x03, 0x75, 0x72, 0x69, 0x2a, 0x25, 0x0a, 0x0c, 0x53, 0x6e, 0x69, 0x70, 0x70, 0x65, 0x74,
+	0x73, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12,
+	0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x01, 0x32, 0x92, 0x02, 0x0a,
+	0x0b, 0x58, 0x52, 0x65, 0x66, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4f, 0x0a, 0x0b,
+	0x44, 0x65, 0x63, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x2e, 0x6b, 0x79,
+	0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x72, 0x61,
+	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6b,
+	0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x72,
+	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5b, 0x0a,
+	0x0f, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73,
+	0x12, 0x23, 0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43,
+	0x72, 0x6f, 0x73, 0x73, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e,
+	0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0d, 0x44, 0x6f,
+	0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x6b, 0x79,
+	0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65,
+	0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f,
 	0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x6f, 0x63,
-	0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
-	0x74, 0x1a, 0x1f, 0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
-	0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70,
-	0x6c, 0x79, 0x22, 0x00, 0x42, 0x32, 0x0a, 0x1f, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
-	0x6c, 0x65, 0x2e, 0x64, 0x65, 0x76, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2e, 0x6b, 0x79, 0x74, 0x68,
-	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x0d, 0x78, 0x72, 0x65, 0x66, 0x5f,
-	0x67, 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22,
+	0x00, 0x42, 0x32, 0x0a, 0x1f, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+	0x64, 0x65, 0x76, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2e, 0x6b, 0x79, 0x74, 0x68, 0x65, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x0d, 0x78, 0x72, 0x65, 0x66, 0x5f, 0x67, 0x6f, 0x5f,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -2539,8 +2736,8 @@ func file_kythe_proto_xref_proto_rawDescGZIP() []byte {
 	return file_kythe_proto_xref_proto_rawDescData
 }
 
-var file_kythe_proto_xref_proto_enumTypes = make([]protoimpl.EnumInfo, 9)
-var file_kythe_proto_xref_proto_msgTypes = make([]protoimpl.MessageInfo, 28)
+var file_kythe_proto_xref_proto_enumTypes = make([]protoimpl.EnumInfo, 10)
+var file_kythe_proto_xref_proto_msgTypes = make([]protoimpl.MessageInfo, 30)
 var file_kythe_proto_xref_proto_goTypes = []interface{}{
 	(SnippetsKind)(0),                              // 0: kythe.proto.SnippetsKind
 	(Location_Kind)(0),                             // 1: kythe.proto.Location.Kind
@@ -2551,109 +2748,115 @@ var file_kythe_proto_xref_proto_goTypes = []interface{}{
 	(CrossReferencesRequest_ReferenceKind)(0),      // 6: kythe.proto.CrossReferencesRequest.ReferenceKind
 	(CrossReferencesRequest_CallerKind)(0),         // 7: kythe.proto.CrossReferencesRequest.CallerKind
 	(CrossReferencesRequest_TotalsQuality)(0),      // 8: kythe.proto.CrossReferencesRequest.TotalsQuality
-	(*Location)(nil),                               // 9: kythe.proto.Location
-	(*DecorationsRequest)(nil),                     // 10: kythe.proto.DecorationsRequest
-	(*File)(nil),                                   // 11: kythe.proto.File
-	(*DecorationsReply)(nil),                       // 12: kythe.proto.DecorationsReply
-	(*CrossReferencesRequest)(nil),                 // 13: kythe.proto.CrossReferencesRequest
-	(*Anchor)(nil),                                 // 14: kythe.proto.Anchor
-	(*Printable)(nil),                              // 15: kythe.proto.Printable
-	(*CrossReferencesReply)(nil),                   // 16: kythe.proto.CrossReferencesReply
-	(*DocumentationRequest)(nil),                   // 17: kythe.proto.DocumentationRequest
-	(*DocumentationReply)(nil),                     // 18: kythe.proto.DocumentationReply
-	(*Workspace)(nil),                              // 19: kythe.proto.Workspace
-	(*DecorationsReply_Reference)(nil),             // 20: kythe.proto.DecorationsReply.Reference
-	(*DecorationsReply_Override)(nil),              // 21: kythe.proto.DecorationsReply.Override
-	(*DecorationsReply_Overrides)(nil),             // 22: kythe.proto.DecorationsReply.Overrides
-	nil,                                            // 23: kythe.proto.DecorationsReply.NodesEntry
-	nil,                                            // 24: kythe.proto.DecorationsReply.DefinitionLocationsEntry
-	nil,                                            // 25: kythe.proto.DecorationsReply.ExtendsOverridesEntry
-	(*CrossReferencesReply_RelatedNode)(nil),       // 26: kythe.proto.CrossReferencesReply.RelatedNode
-	(*CrossReferencesReply_RelatedAnchor)(nil),     // 27: kythe.proto.CrossReferencesReply.RelatedAnchor
-	(*CrossReferencesReply_CrossReferenceSet)(nil), // 28: kythe.proto.CrossReferencesReply.CrossReferenceSet
-	(*CrossReferencesReply_Total)(nil),             // 29: kythe.proto.CrossReferencesReply.Total
-	nil,                                            // 30: kythe.proto.CrossReferencesReply.CrossReferencesEntry
-	nil,                                            // 31: kythe.proto.CrossReferencesReply.NodesEntry
-	nil,                                            // 32: kythe.proto.CrossReferencesReply.DefinitionLocationsEntry
-	nil,                                            // 33: kythe.proto.CrossReferencesReply.Total.RelatedNodesByRelationEntry
-	(*DocumentationReply_Document)(nil),            // 34: kythe.proto.DocumentationReply.Document
-	nil,                                            // 35: kythe.proto.DocumentationReply.NodesEntry
-	nil,                                            // 36: kythe.proto.DocumentationReply.DefinitionLocationsEntry
-	(*common_go_proto.Span)(nil),                   // 37: kythe.proto.common.Span
-	(*common_go_proto.CorpusPath)(nil),             // 38: kythe.proto.common.CorpusPath
-	(*common_go_proto.Diagnostic)(nil),             // 39: kythe.proto.common.Diagnostic
-	(*common_go_proto.Link)(nil),                   // 40: kythe.proto.common.Link
-	(*common_go_proto.MarkedSource)(nil),           // 41: kythe.proto.common.MarkedSource
-	(*common_go_proto.NodeInfo)(nil),               // 42: kythe.proto.common.NodeInfo
+	(CorpusPathFilter_Type)(0),                     // 9: kythe.proto.CorpusPathFilter.Type
+	(*Location)(nil),                               // 10: kythe.proto.Location
+	(*DecorationsRequest)(nil),                     // 11: kythe.proto.DecorationsRequest
+	(*File)(nil),                                   // 12: kythe.proto.File
+	(*DecorationsReply)(nil),                       // 13: kythe.proto.DecorationsReply
+	(*CrossReferencesRequest)(nil),                 // 14: kythe.proto.CrossReferencesRequest
+	(*CorpusPathFilters)(nil),                      // 15: kythe.proto.CorpusPathFilters
+	(*CorpusPathFilter)(nil),                       // 16: kythe.proto.CorpusPathFilter
+	(*Anchor)(nil),                                 // 17: kythe.proto.Anchor
+	(*Printable)(nil),                              // 18: kythe.proto.Printable
+	(*CrossReferencesReply)(nil),                   // 19: kythe.proto.CrossReferencesReply
+	(*DocumentationRequest)(nil),                   // 20: kythe.proto.DocumentationRequest
+	(*DocumentationReply)(nil),                     // 21: kythe.proto.DocumentationReply
+	(*Workspace)(nil),                              // 22: kythe.proto.Workspace
+	(*DecorationsReply_Reference)(nil),             // 23: kythe.proto.DecorationsReply.Reference
+	(*DecorationsReply_Override)(nil),              // 24: kythe.proto.DecorationsReply.Override
+	(*DecorationsReply_Overrides)(nil),             // 25: kythe.proto.DecorationsReply.Overrides
+	nil,                                            // 26: kythe.proto.DecorationsReply.NodesEntry
+	nil,                                            // 27: kythe.proto.DecorationsReply.DefinitionLocationsEntry
+	nil,                                            // 28: kythe.proto.DecorationsReply.ExtendsOverridesEntry
+	(*CrossReferencesReply_RelatedNode)(nil),       // 29: kythe.proto.CrossReferencesReply.RelatedNode
+	(*CrossReferencesReply_RelatedAnchor)(nil),     // 30: kythe.proto.CrossReferencesReply.RelatedAnchor
+	(*CrossReferencesReply_CrossReferenceSet)(nil), // 31: kythe.proto.CrossReferencesReply.CrossReferenceSet
+	(*CrossReferencesReply_Total)(nil),             // 32: kythe.proto.CrossReferencesReply.Total
+	nil,                                            // 33: kythe.proto.CrossReferencesReply.CrossReferencesEntry
+	nil,                                            // 34: kythe.proto.CrossReferencesReply.NodesEntry
+	nil,                                            // 35: kythe.proto.CrossReferencesReply.DefinitionLocationsEntry
+	nil,                                            // 36: kythe.proto.CrossReferencesReply.Total.RelatedNodesByRelationEntry
+	(*DocumentationReply_Document)(nil),            // 37: kythe.proto.DocumentationReply.Document
+	nil,                                            // 38: kythe.proto.DocumentationReply.NodesEntry
+	nil,                                            // 39: kythe.proto.DocumentationReply.DefinitionLocationsEntry
+	(*common_go_proto.Span)(nil),                   // 40: kythe.proto.common.Span
+	(*common_go_proto.CorpusPath)(nil),             // 41: kythe.proto.common.CorpusPath
+	(*common_go_proto.Diagnostic)(nil),             // 42: kythe.proto.common.Diagnostic
+	(*common_go_proto.Link)(nil),                   // 43: kythe.proto.common.Link
+	(*common_go_proto.MarkedSource)(nil),           // 44: kythe.proto.common.MarkedSource
+	(*common_go_proto.NodeInfo)(nil),               // 45: kythe.proto.common.NodeInfo
 }
 var file_kythe_proto_xref_proto_depIdxs = []int32{
 	1,  // 0: kythe.proto.Location.kind:type_name -> kythe.proto.Location.Kind
-	37, // 1: kythe.proto.Location.span:type_name -> kythe.proto.common.Span
-	9,  // 2: kythe.proto.DecorationsRequest.location:type_name -> kythe.proto.Location
+	40, // 1: kythe.proto.Location.span:type_name -> kythe.proto.common.Span
+	10, // 2: kythe.proto.DecorationsRequest.location:type_name -> kythe.proto.Location
 	2,  // 3: kythe.proto.DecorationsRequest.span_kind:type_name -> kythe.proto.DecorationsRequest.SpanKind
 	0,  // 4: kythe.proto.DecorationsRequest.snippets:type_name -> kythe.proto.SnippetsKind
-	19, // 5: kythe.proto.DecorationsRequest.workspace:type_name -> kythe.proto.Workspace
-	38, // 6: kythe.proto.File.corpus_path:type_name -> kythe.proto.common.CorpusPath
-	9,  // 7: kythe.proto.DecorationsReply.location:type_name -> kythe.proto.Location
-	20, // 8: kythe.proto.DecorationsReply.reference:type_name -> kythe.proto.DecorationsReply.Reference
-	39, // 9: kythe.proto.DecorationsReply.diagnostic:type_name -> kythe.proto.common.Diagnostic
-	11, // 10: kythe.proto.DecorationsReply.generated_by_file:type_name -> kythe.proto.File
-	23, // 11: kythe.proto.DecorationsReply.nodes:type_name -> kythe.proto.DecorationsReply.NodesEntry
-	24, // 12: kythe.proto.DecorationsReply.definition_locations:type_name -> kythe.proto.DecorationsReply.DefinitionLocationsEntry
-	25, // 13: kythe.proto.DecorationsReply.extends_overrides:type_name -> kythe.proto.DecorationsReply.ExtendsOverridesEntry
+	22, // 5: kythe.proto.DecorationsRequest.workspace:type_name -> kythe.proto.Workspace
+	41, // 6: kythe.proto.File.corpus_path:type_name -> kythe.proto.common.CorpusPath
+	10, // 7: kythe.proto.DecorationsReply.location:type_name -> kythe.proto.Location
+	23, // 8: kythe.proto.DecorationsReply.reference:type_name -> kythe.proto.DecorationsReply.Reference
+	42, // 9: kythe.proto.DecorationsReply.diagnostic:type_name -> kythe.proto.common.Diagnostic
+	12, // 10: kythe.proto.DecorationsReply.generated_by_file:type_name -> kythe.proto.File
+	26, // 11: kythe.proto.DecorationsReply.nodes:type_name -> kythe.proto.DecorationsReply.NodesEntry
+	27, // 12: kythe.proto.DecorationsReply.definition_locations:type_name -> kythe.proto.DecorationsReply.DefinitionLocationsEntry
+	28, // 13: kythe.proto.DecorationsReply.extends_overrides:type_name -> kythe.proto.DecorationsReply.ExtendsOverridesEntry
 	4,  // 14: kythe.proto.CrossReferencesRequest.definition_kind:type_name -> kythe.proto.CrossReferencesRequest.DefinitionKind
 	5,  // 15: kythe.proto.CrossReferencesRequest.declaration_kind:type_name -> kythe.proto.CrossReferencesRequest.DeclarationKind
 	6,  // 16: kythe.proto.CrossReferencesRequest.reference_kind:type_name -> kythe.proto.CrossReferencesRequest.ReferenceKind
 	7,  // 17: kythe.proto.CrossReferencesRequest.caller_kind:type_name -> kythe.proto.CrossReferencesRequest.CallerKind
 	8,  // 18: kythe.proto.CrossReferencesRequest.totals_quality:type_name -> kythe.proto.CrossReferencesRequest.TotalsQuality
 	0,  // 19: kythe.proto.CrossReferencesRequest.snippets:type_name -> kythe.proto.SnippetsKind
-	19, // 20: kythe.proto.CrossReferencesRequest.workspace:type_name -> kythe.proto.Workspace
-	37, // 21: kythe.proto.Anchor.span:type_name -> kythe.proto.common.Span
-	37, // 22: kythe.proto.Anchor.snippet_span:type_name -> kythe.proto.common.Span
-	40, // 23: kythe.proto.Printable.link:type_name -> kythe.proto.common.Link
-	29, // 24: kythe.proto.CrossReferencesReply.total:type_name -> kythe.proto.CrossReferencesReply.Total
-	30, // 25: kythe.proto.CrossReferencesReply.cross_references:type_name -> kythe.proto.CrossReferencesReply.CrossReferencesEntry
-	31, // 26: kythe.proto.CrossReferencesReply.nodes:type_name -> kythe.proto.CrossReferencesReply.NodesEntry
-	32, // 27: kythe.proto.CrossReferencesReply.definition_locations:type_name -> kythe.proto.CrossReferencesReply.DefinitionLocationsEntry
-	34, // 28: kythe.proto.DocumentationReply.document:type_name -> kythe.proto.DocumentationReply.Document
-	35, // 29: kythe.proto.DocumentationReply.nodes:type_name -> kythe.proto.DocumentationReply.NodesEntry
-	36, // 30: kythe.proto.DocumentationReply.definition_locations:type_name -> kythe.proto.DocumentationReply.DefinitionLocationsEntry
-	37, // 31: kythe.proto.DecorationsReply.Reference.span:type_name -> kythe.proto.common.Span
-	3,  // 32: kythe.proto.DecorationsReply.Override.kind:type_name -> kythe.proto.DecorationsReply.Override.Kind
-	41, // 33: kythe.proto.DecorationsReply.Override.marked_source:type_name -> kythe.proto.common.MarkedSource
-	21, // 34: kythe.proto.DecorationsReply.Overrides.override:type_name -> kythe.proto.DecorationsReply.Override
-	42, // 35: kythe.proto.DecorationsReply.NodesEntry.value:type_name -> kythe.proto.common.NodeInfo
-	14, // 36: kythe.proto.DecorationsReply.DefinitionLocationsEntry.value:type_name -> kythe.proto.Anchor
-	22, // 37: kythe.proto.DecorationsReply.ExtendsOverridesEntry.value:type_name -> kythe.proto.DecorationsReply.Overrides
-	14, // 38: kythe.proto.CrossReferencesReply.RelatedAnchor.anchor:type_name -> kythe.proto.Anchor
-	41, // 39: kythe.proto.CrossReferencesReply.RelatedAnchor.marked_source:type_name -> kythe.proto.common.MarkedSource
-	14, // 40: kythe.proto.CrossReferencesReply.RelatedAnchor.site:type_name -> kythe.proto.Anchor
-	41, // 41: kythe.proto.CrossReferencesReply.CrossReferenceSet.marked_source:type_name -> kythe.proto.common.MarkedSource
-	27, // 42: kythe.proto.CrossReferencesReply.CrossReferenceSet.definition:type_name -> kythe.proto.CrossReferencesReply.RelatedAnchor
-	27, // 43: kythe.proto.CrossReferencesReply.CrossReferenceSet.declaration:type_name -> kythe.proto.CrossReferencesReply.RelatedAnchor
-	27, // 44: kythe.proto.CrossReferencesReply.CrossReferenceSet.reference:type_name -> kythe.proto.CrossReferencesReply.RelatedAnchor
-	27, // 45: kythe.proto.CrossReferencesReply.CrossReferenceSet.caller:type_name -> kythe.proto.CrossReferencesReply.RelatedAnchor
-	26, // 46: kythe.proto.CrossReferencesReply.CrossReferenceSet.related_node:type_name -> kythe.proto.CrossReferencesReply.RelatedNode
-	33, // 47: kythe.proto.CrossReferencesReply.Total.related_nodes_by_relation:type_name -> kythe.proto.CrossReferencesReply.Total.RelatedNodesByRelationEntry
-	28, // 48: kythe.proto.CrossReferencesReply.CrossReferencesEntry.value:type_name -> kythe.proto.CrossReferencesReply.CrossReferenceSet
-	42, // 49: kythe.proto.CrossReferencesReply.NodesEntry.value:type_name -> kythe.proto.common.NodeInfo
-	14, // 50: kythe.proto.CrossReferencesReply.DefinitionLocationsEntry.value:type_name -> kythe.proto.Anchor
-	15, // 51: kythe.proto.DocumentationReply.Document.text:type_name -> kythe.proto.Printable
-	41, // 52: kythe.proto.DocumentationReply.Document.marked_source:type_name -> kythe.proto.common.MarkedSource
-	34, // 53: kythe.proto.DocumentationReply.Document.children:type_name -> kythe.proto.DocumentationReply.Document
-	42, // 54: kythe.proto.DocumentationReply.NodesEntry.value:type_name -> kythe.proto.common.NodeInfo
-	14, // 55: kythe.proto.DocumentationReply.DefinitionLocationsEntry.value:type_name -> kythe.proto.Anchor
-	10, // 56: kythe.proto.XRefService.Decorations:input_type -> kythe.proto.DecorationsRequest
-	13, // 57: kythe.proto.XRefService.CrossReferences:input_type -> kythe.proto.CrossReferencesRequest
-	17, // 58: kythe.proto.XRefService.Documentation:input_type -> kythe.proto.DocumentationRequest
-	12, // 59: kythe.proto.XRefService.Decorations:output_type -> kythe.proto.DecorationsReply
-	16, // 60: kythe.proto.XRefService.CrossReferences:output_type -> kythe.proto.CrossReferencesReply
-	18, // 61: kythe.proto.XRefService.Documentation:output_type -> kythe.proto.DocumentationReply
-	59, // [59:62] is the sub-list for method output_type
-	56, // [56:59] is the sub-list for method input_type
-	56, // [56:56] is the sub-list for extension type_name
-	56, // [56:56] is the sub-list for extension extendee
-	0,  // [0:56] is the sub-list for field type_name
+	22, // 20: kythe.proto.CrossReferencesRequest.workspace:type_name -> kythe.proto.Workspace
+	15, // 21: kythe.proto.CrossReferencesRequest.corpus_path_filters:type_name -> kythe.proto.CorpusPathFilters
+	16, // 22: kythe.proto.CorpusPathFilters.filter:type_name -> kythe.proto.CorpusPathFilter
+	9,  // 23: kythe.proto.CorpusPathFilter.type:type_name -> kythe.proto.CorpusPathFilter.Type
+	40, // 24: kythe.proto.Anchor.span:type_name -> kythe.proto.common.Span
+	40, // 25: kythe.proto.Anchor.snippet_span:type_name -> kythe.proto.common.Span
+	43, // 26: kythe.proto.Printable.link:type_name -> kythe.proto.common.Link
+	32, // 27: kythe.proto.CrossReferencesReply.total:type_name -> kythe.proto.CrossReferencesReply.Total
+	33, // 28: kythe.proto.CrossReferencesReply.cross_references:type_name -> kythe.proto.CrossReferencesReply.CrossReferencesEntry
+	34, // 29: kythe.proto.CrossReferencesReply.nodes:type_name -> kythe.proto.CrossReferencesReply.NodesEntry
+	35, // 30: kythe.proto.CrossReferencesReply.definition_locations:type_name -> kythe.proto.CrossReferencesReply.DefinitionLocationsEntry
+	37, // 31: kythe.proto.DocumentationReply.document:type_name -> kythe.proto.DocumentationReply.Document
+	38, // 32: kythe.proto.DocumentationReply.nodes:type_name -> kythe.proto.DocumentationReply.NodesEntry
+	39, // 33: kythe.proto.DocumentationReply.definition_locations:type_name -> kythe.proto.DocumentationReply.DefinitionLocationsEntry
+	40, // 34: kythe.proto.DecorationsReply.Reference.span:type_name -> kythe.proto.common.Span
+	3,  // 35: kythe.proto.DecorationsReply.Override.kind:type_name -> kythe.proto.DecorationsReply.Override.Kind
+	44, // 36: kythe.proto.DecorationsReply.Override.marked_source:type_name -> kythe.proto.common.MarkedSource
+	24, // 37: kythe.proto.DecorationsReply.Overrides.override:type_name -> kythe.proto.DecorationsReply.Override
+	45, // 38: kythe.proto.DecorationsReply.NodesEntry.value:type_name -> kythe.proto.common.NodeInfo
+	17, // 39: kythe.proto.DecorationsReply.DefinitionLocationsEntry.value:type_name -> kythe.proto.Anchor
+	25, // 40: kythe.proto.DecorationsReply.ExtendsOverridesEntry.value:type_name -> kythe.proto.DecorationsReply.Overrides
+	17, // 41: kythe.proto.CrossReferencesReply.RelatedAnchor.anchor:type_name -> kythe.proto.Anchor
+	44, // 42: kythe.proto.CrossReferencesReply.RelatedAnchor.marked_source:type_name -> kythe.proto.common.MarkedSource
+	17, // 43: kythe.proto.CrossReferencesReply.RelatedAnchor.site:type_name -> kythe.proto.Anchor
+	44, // 44: kythe.proto.CrossReferencesReply.CrossReferenceSet.marked_source:type_name -> kythe.proto.common.MarkedSource
+	30, // 45: kythe.proto.CrossReferencesReply.CrossReferenceSet.definition:type_name -> kythe.proto.CrossReferencesReply.RelatedAnchor
+	30, // 46: kythe.proto.CrossReferencesReply.CrossReferenceSet.declaration:type_name -> kythe.proto.CrossReferencesReply.RelatedAnchor
+	30, // 47: kythe.proto.CrossReferencesReply.CrossReferenceSet.reference:type_name -> kythe.proto.CrossReferencesReply.RelatedAnchor
+	30, // 48: kythe.proto.CrossReferencesReply.CrossReferenceSet.caller:type_name -> kythe.proto.CrossReferencesReply.RelatedAnchor
+	29, // 49: kythe.proto.CrossReferencesReply.CrossReferenceSet.related_node:type_name -> kythe.proto.CrossReferencesReply.RelatedNode
+	36, // 50: kythe.proto.CrossReferencesReply.Total.related_nodes_by_relation:type_name -> kythe.proto.CrossReferencesReply.Total.RelatedNodesByRelationEntry
+	31, // 51: kythe.proto.CrossReferencesReply.CrossReferencesEntry.value:type_name -> kythe.proto.CrossReferencesReply.CrossReferenceSet
+	45, // 52: kythe.proto.CrossReferencesReply.NodesEntry.value:type_name -> kythe.proto.common.NodeInfo
+	17, // 53: kythe.proto.CrossReferencesReply.DefinitionLocationsEntry.value:type_name -> kythe.proto.Anchor
+	18, // 54: kythe.proto.DocumentationReply.Document.text:type_name -> kythe.proto.Printable
+	44, // 55: kythe.proto.DocumentationReply.Document.marked_source:type_name -> kythe.proto.common.MarkedSource
+	37, // 56: kythe.proto.DocumentationReply.Document.children:type_name -> kythe.proto.DocumentationReply.Document
+	45, // 57: kythe.proto.DocumentationReply.NodesEntry.value:type_name -> kythe.proto.common.NodeInfo
+	17, // 58: kythe.proto.DocumentationReply.DefinitionLocationsEntry.value:type_name -> kythe.proto.Anchor
+	11, // 59: kythe.proto.XRefService.Decorations:input_type -> kythe.proto.DecorationsRequest
+	14, // 60: kythe.proto.XRefService.CrossReferences:input_type -> kythe.proto.CrossReferencesRequest
+	20, // 61: kythe.proto.XRefService.Documentation:input_type -> kythe.proto.DocumentationRequest
+	13, // 62: kythe.proto.XRefService.Decorations:output_type -> kythe.proto.DecorationsReply
+	19, // 63: kythe.proto.XRefService.CrossReferences:output_type -> kythe.proto.CrossReferencesReply
+	21, // 64: kythe.proto.XRefService.Documentation:output_type -> kythe.proto.DocumentationReply
+	62, // [62:65] is the sub-list for method output_type
+	59, // [59:62] is the sub-list for method input_type
+	59, // [59:59] is the sub-list for extension type_name
+	59, // [59:59] is the sub-list for extension extendee
+	0,  // [0:59] is the sub-list for field type_name
 }
 
 func init() { file_kythe_proto_xref_proto_init() }
@@ -2723,7 +2926,7 @@ func file_kythe_proto_xref_proto_init() {
 			}
 		}
 		file_kythe_proto_xref_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Anchor); i {
+			switch v := v.(*CorpusPathFilters); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2735,7 +2938,7 @@ func file_kythe_proto_xref_proto_init() {
 			}
 		}
 		file_kythe_proto_xref_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Printable); i {
+			switch v := v.(*CorpusPathFilter); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2747,7 +2950,7 @@ func file_kythe_proto_xref_proto_init() {
 			}
 		}
 		file_kythe_proto_xref_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*CrossReferencesReply); i {
+			switch v := v.(*Anchor); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2759,7 +2962,7 @@ func file_kythe_proto_xref_proto_init() {
 			}
 		}
 		file_kythe_proto_xref_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*DocumentationRequest); i {
+			switch v := v.(*Printable); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2771,7 +2974,7 @@ func file_kythe_proto_xref_proto_init() {
 			}
 		}
 		file_kythe_proto_xref_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*DocumentationReply); i {
+			switch v := v.(*CrossReferencesReply); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2783,7 +2986,7 @@ func file_kythe_proto_xref_proto_init() {
 			}
 		}
 		file_kythe_proto_xref_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Workspace); i {
+			switch v := v.(*DocumentationRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2795,7 +2998,7 @@ func file_kythe_proto_xref_proto_init() {
 			}
 		}
 		file_kythe_proto_xref_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*DecorationsReply_Reference); i {
+			switch v := v.(*DocumentationReply); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2807,7 +3010,7 @@ func file_kythe_proto_xref_proto_init() {
 			}
 		}
 		file_kythe_proto_xref_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*DecorationsReply_Override); i {
+			switch v := v.(*Workspace); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2819,6 +3022,30 @@ func file_kythe_proto_xref_proto_init() {
 			}
 		}
 		file_kythe_proto_xref_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DecorationsReply_Reference); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_kythe_proto_xref_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DecorationsReply_Override); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_kythe_proto_xref_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*DecorationsReply_Overrides); i {
 			case 0:
 				return &v.state
@@ -2830,7 +3057,7 @@ func file_kythe_proto_xref_proto_init() {
 				return nil
 			}
 		}
-		file_kythe_proto_xref_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
+		file_kythe_proto_xref_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*CrossReferencesReply_RelatedNode); i {
 			case 0:
 				return &v.state
@@ -2842,7 +3069,7 @@ func file_kythe_proto_xref_proto_init() {
 				return nil
 			}
 		}
-		file_kythe_proto_xref_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
+		file_kythe_proto_xref_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*CrossReferencesReply_RelatedAnchor); i {
 			case 0:
 				return &v.state
@@ -2854,7 +3081,7 @@ func file_kythe_proto_xref_proto_init() {
 				return nil
 			}
 		}
-		file_kythe_proto_xref_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
+		file_kythe_proto_xref_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*CrossReferencesReply_CrossReferenceSet); i {
 			case 0:
 				return &v.state
@@ -2866,7 +3093,7 @@ func file_kythe_proto_xref_proto_init() {
 				return nil
 			}
 		}
-		file_kythe_proto_xref_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
+		file_kythe_proto_xref_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*CrossReferencesReply_Total); i {
 			case 0:
 				return &v.state
@@ -2878,7 +3105,7 @@ func file_kythe_proto_xref_proto_init() {
 				return nil
 			}
 		}
-		file_kythe_proto_xref_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
+		file_kythe_proto_xref_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*DocumentationReply_Document); i {
 			case 0:
 				return &v.state
@@ -2896,8 +3123,8 @@ func file_kythe_proto_xref_proto_init() {
 		File: protoimpl.DescBuilder{
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_kythe_proto_xref_proto_rawDesc,
-			NumEnums:      9,
-			NumMessages:   28,
+			NumEnums:      10,
+			NumMessages:   30,
 			NumExtensions: 0,
 			NumServices:   1,
 		},


Test patch:
diff --git a/kythe/go/serving/xrefs/xrefs_test.go b/kythe/go/serving/xrefs/xrefs_test.go
index 10985dbc2..8c1a4cd27 100644
--- a/kythe/go/serving/xrefs/xrefs_test.go
+++ b/kythe/go/serving/xrefs/xrefs_test.go
@@ -20,6 +20,7 @@ import (
 	"bytes"
 	"context"
 	"sort"
+	"strconv"
 	"testing"
 
 	"kythe.io/kythe/go/services/xrefs"
@@ -32,6 +33,7 @@ import (
 	"golang.org/x/text/encoding"
 	"golang.org/x/text/encoding/unicode"
 	"golang.org/x/text/transform"
+	"google.golang.org/protobuf/encoding/prototext"
 	"google.golang.org/protobuf/proto"
 
 	cpb "kythe.io/kythe/proto/common_go_proto"
@@ -1536,6 +1538,112 @@ func TestCrossReferencesPatching(t *testing.T) {
 	}
 }
 
+func TestCrossReferencesFiltering(t *testing.T) {
+	ticket := "kythe://someCorpus?lang=otpl#signature"
+
+	st := tbl.Construct(t)
+	reply, err := st.CrossReferences(ctx, &xpb.CrossReferencesRequest{
+		Ticket:         []string{ticket},
+		DefinitionKind: xpb.CrossReferencesRequest_BINDING_DEFINITIONS,
+		ReferenceKind:  xpb.CrossReferencesRequest_ALL_REFERENCES,
+		Snippets:       xpb.SnippetsKind_DEFAULT,
+
+		CorpusPathFilters: mustParseFilters(`
+filter: {
+  type: INCLUDE_ONLY
+	corpus: "^c$"
+}
+		`),
+	})
+	testutil.Fatalf(t, "CrossReferencesRequest error: %v", err)
+
+	expected := &xpb.CrossReferencesReply_CrossReferenceSet{
+		Ticket: ticket,
+
+		Reference: []*xpb.CrossReferencesReply_RelatedAnchor{{Anchor: &xpb.Anchor{
+			Ticket: "kythe://c?lang=otpl?path=/a/path#51-55",
+			Kind:   "/kythe/edge/ref",
+			Parent: "kythe://c?path=/a/path",
+
+			Span: &cpb.Span{
+				Start: &cpb.Point{
+					ByteOffset:   51,
+					LineNumber:   4,
+					ColumnOffset: 15,
+				},
+				End: &cpb.Point{
+					ByteOffset:   55,
+					LineNumber:   5,
+					ColumnOffset: 2,
+				},
+			},
+
+			SnippetSpan: &cpb.Span{
+				Start: &cpb.Point{
+					ByteOffset: 36,
+					LineNumber: 4,
+				},
+				End: &cpb.Point{
+					ByteOffset:   52,
+					LineNumber:   4,
+					ColumnOffset: 16,
+				},
+			},
+			Snippet: "some random text",
+		}}},
+
+		Definition: []*xpb.CrossReferencesReply_RelatedAnchor{{Anchor: &xpb.Anchor{
+			Ticket:      "kythe://c?lang=otpl?path=/a/path#27-33",
+			Kind:        "/kythe/edge/defines/binding",
+			Parent:      "kythe://c?path=/a/path",
+			BuildConfig: "testConfig",
+
+			Span: &cpb.Span{
+				Start: &cpb.Point{
+					ByteOffset:   27,
+					LineNumber:   2,
+					ColumnOffset: 10,
+				},
+				End: &cpb.Point{
+					ByteOffset:   33,
+					LineNumber:   3,
+					ColumnOffset: 5,
+				},
+			},
+
+			SnippetSpan: &cpb.Span{
+				Start: &cpb.Point{
+					ByteOffset: 17,
+					LineNumber: 2,
+				},
+				End: &cpb.Point{
+					ByteOffset:   27,
+					LineNumber:   2,
+					ColumnOffset: 10,
+				},
+			},
+			Snippet: "here and  ",
+		}}},
+	}
+
+	if err := testutil.DeepEqual(&xpb.CrossReferencesReply_Total{
+		Definitions: 1,
+		References:  1,
+	}, reply.Total); err != nil {
+		t.Error(err)
+	}
+
+	xr := reply.CrossReferences[ticket]
+	if xr == nil {
+		t.Fatalf("Missing expected CrossReferences; found: %s", reply)
+	}
+	sort.Sort(byOffset(xr.Reference))
+
+	if diff := compare.ProtoDiff(expected, xr); diff != "" {
+		t.Fatalf("(-expected; +found):\n%s", diff)
+	}
+}
+
 func TestCrossReferences_BuildConfigRefs(t *testing.T) {
 	ticket := "kythe://someCorpus?lang=otpl#signature"
 
@@ -2388,6 +2496,61 @@ func TestDocumentationIndirection(t *testing.T) {
 	}
 }
 
+func TestCorpusPathFilters(t *testing.T) {
+	tests := []struct {
+		filters *xpb.CorpusPathFilters
+
+		includes, excludes []string
+	}{
+		{mustParseFilters(`filter: { type: INCLUDE_ONLY corpus: "^kythe3" }`),
+			[]string{cps("kythe3", "", ""), cps("kythe3//branch", "", "")},
+			[]string{cps("other", "", ""), cps("other", "kythe3", "kythe3")}},
+		{mustParseFilters(`filter: { type: EXCLUDE root: ".+" }`),
+			[]string{cps("kythe3", "", ""), cps("kythe3//branch", "", ""), cps("oss", "", "any/path")},
+			[]string{cps("kythe3", "genfiles", ""), cps("other", "bin", "some/path")}},
+		{mustParseFilters(`filter: { type: INCLUDE_ONLY corpus: "^kythe3" root: "genfiles" }`),
+			[]string{cps("kythe3", "genfiles", ""), cps("kythe3//branch", "genfiles", "")},
+			[]string{cps("kythe2", "genfiles", ""), cps("kythe3", "bin", "path"), cps("other", "bin", "some/path")}},
+		{mustParseFilters(`filter: { type: INCLUDE_ONLY corpus: "kythe" } filter: { type: INCLUDE_ONLY corpus: "2|3" }`),
+			[]string{cps("kythe3", "genfiles", "path"), cps("kythe2", "", "blah")},
+			[]string{cps("kythe4", "", ""), cps("kythe", "kythe2", "kythe3")}},
+		{mustParseFilters(`filter: { type: EXCLUDE root: ".+" } filter: { type: INCLUDE_ONLY corpus: "^kythe3"}`),
+			[]string{cps("kythe3", "", "any/path"), cps("kythe3//branch", "", "some/path")},
+			[]string{cps("kythe3", "genfiles", "any/path"), cps("kythe3//branch", "bin", "some/path")}},
+	}
+
+	for i, test := range tests {
+		t.Run(strconv.Itoa(i), func(t *testing.T) {
+			f, err := compileCorpusPathFilters(test.filters)
+			testutil.Fatalf(t, "Error: %v", err)
+
+			for _, include := range test.includes {
+				if !f.AllowTicket(include) {
+					t.Errorf("Expected %q to be included but it wasn't", include)
+				}
+			}
+			for _, exclude := range test.excludes {
+				if f.AllowTicket(exclude) {
+					t.Errorf("Expected %q to be excluded but it wasn't", exclude)
+				}
+			}
+		})
+	}
+}
+
+func cps(corpus, root, path string) string {
+	u := &kytheuri.URI{Corpus: corpus, Root: root, Path: path}
+	return u.String()
+}
+
+func mustParseFilters(msg string) *xpb.CorpusPathFilters {
+	var f xpb.CorpusPathFilters
+	if err := prototext.Unmarshal([]byte(msg), &f); err != nil {
+		panic(err)
+	}
+	return &f
+}
+
 // byOffset implements the sort.Interface for *xpb.CrossReferencesReply_RelatedAnchors.
 type byOffset []*xpb.CrossReferencesReply_RelatedAnchor