Remove FrameSchema. Move Fields to the Frame struct.

This commit is contained in:
Travis Turner 2017-10-26 11:11:05 -05:00
parent deed9adfe4
commit cd8542ca30
No known key found for this signature in database
GPG key ID: 7F08008DFD9314C9
6 changed files with 174 additions and 394 deletions

232
frame.go
View file

@ -43,12 +43,10 @@ const (
// Frame represents a container for views.
type Frame struct {
mu sync.RWMutex
path string
index string
name string
timeQuantum TimeQuantum
schema *FrameSchema
mu sync.RWMutex
path string
index string
name string
views map[string]*View
@ -58,14 +56,14 @@ type Frame struct {
broadcaster Broadcaster
Stats StatsClient
// Frame settings.
// Frame options.
rowLabel string
cacheType string
inverseEnabled bool
cacheType string
cacheSize uint32
timeQuantum TimeQuantum
rangeEnabled bool
// Cache size for ranked frames
cacheSize uint32
fields []*Field
LogOutput io.Writer
}
@ -78,10 +76,9 @@ func NewFrame(path, index, name string) (*Frame, error) {
}
return &Frame{
path: path,
index: index,
name: name,
schema: &FrameSchema{},
path: path,
index: index,
name: name,
views: make(map[string]*View),
rowAttrStore: NewAttrStore(filepath.Join(path, ".data")),
@ -91,9 +88,11 @@ func NewFrame(path, index, name string) (*Frame, error) {
rowLabel: DefaultRowLabel,
inverseEnabled: DefaultInverseEnabled,
rangeEnabled: DefaultRangeEnabled,
cacheType: DefaultCacheType,
cacheSize: DefaultCacheSize,
//timeQuantum
rangeEnabled: DefaultRangeEnabled,
//fields
LogOutput: ioutil.Discard,
}, nil
@ -230,7 +229,7 @@ func (f *Frame) options() FrameOptions {
CacheType: f.cacheType,
CacheSize: f.cacheSize,
TimeQuantum: f.timeQuantum,
Fields: f.schema.Fields,
Fields: f.fields,
}
}
@ -244,8 +243,6 @@ func (f *Frame) Open() error {
if err := f.loadMeta(); err != nil {
return err
} else if err := f.loadSchema(); err != nil {
return err
}
if err := f.openViews(); err != nil {
@ -304,12 +301,13 @@ func (f *Frame) loadMeta() error {
// Read data from meta file.
buf, err := ioutil.ReadFile(filepath.Join(f.path, ".meta"))
if os.IsNotExist(err) {
f.timeQuantum = ""
f.rowLabel = DefaultRowLabel
f.cacheType = DefaultCacheType
f.inverseEnabled = DefaultInverseEnabled
f.rangeEnabled = DefaultRangeEnabled
f.cacheType = DefaultCacheType
f.cacheSize = DefaultCacheSize
f.timeQuantum = ""
f.rangeEnabled = DefaultRangeEnabled
//f.fields
return nil
} else if err != nil {
return err
@ -320,17 +318,16 @@ func (f *Frame) loadMeta() error {
}
// Copy metadata fields.
f.timeQuantum = TimeQuantum(pb.TimeQuantum)
f.rowLabel = pb.RowLabel
f.inverseEnabled = pb.InverseEnabled
f.rangeEnabled = pb.RangeEnabled
f.cacheSize = pb.CacheSize
// Copy cache type.
f.cacheType = pb.CacheType
if f.cacheType == "" {
f.cacheType = DefaultCacheType
}
f.cacheSize = pb.CacheSize
f.timeQuantum = TimeQuantum(pb.TimeQuantum)
f.rangeEnabled = pb.RangeEnabled
f.fields = decodeFields(pb.Fields)
return nil
}
@ -352,35 +349,6 @@ func (f *Frame) saveMeta() error {
return nil
}
// loadSchema reads the schema for the frame.
func (f *Frame) loadSchema() error {
buf, err := ioutil.ReadFile(filepath.Join(f.path, ".schema"))
if os.IsNotExist(err) {
f.schema = &FrameSchema{}
return nil
} else if err != nil {
return err
}
var pb internal.FrameSchema
if err := proto.Unmarshal(buf, &pb); err != nil {
return err
}
f.schema = decodeFrameSchema(&pb)
return nil
}
// saveSchema writes the current schema to disk.
func (f *Frame) saveSchema() error {
if buf, err := proto.Marshal(encodeFrameSchema(f.schema)); err != nil {
return err
} else if err := ioutil.WriteFile(filepath.Join(f.path, ".schema"), buf, 0666); err != nil {
return err
}
return nil
}
// Close closes the frame and its views.
func (f *Frame) Close() error {
f.mu.Lock()
@ -402,16 +370,11 @@ func (f *Frame) Close() error {
return nil
}
// Schema returns the frame's current schema.
func (f *Frame) Schema() *FrameSchema {
// Field returns a field by name.
func (f *Frame) Field(name string) *Field {
f.mu.RLock()
defer f.mu.RUnlock()
return f.schema
}
// Field returns a field from the schema by name.
func (f *Frame) Field(name string) *Field {
for _, field := range f.Schema().Fields {
for _, field := range f.fields {
if field.Name == name {
return field
}
@ -419,7 +382,24 @@ func (f *Frame) Field(name string) *Field {
return nil
}
// CreateField creates a new field on the schema.
// Fields returns the fields on the frame.
func (f *Frame) Fields() []*Field {
f.mu.RLock()
defer f.mu.RUnlock()
return f.fields
}
// HasField returns true if a field exists on the frame.
func (f *Frame) HasField(name string) bool {
for _, fld := range f.fields {
if fld.Name == name {
return true
}
}
return false
}
// CreateField creates a new field on the frame.
func (f *Frame) CreateField(field *Field) error {
f.mu.Lock()
defer f.mu.Unlock()
@ -429,18 +409,35 @@ func (f *Frame) CreateField(field *Field) error {
return ErrFrameFieldsNotAllowed
}
// Copy schema and append field.
schema := f.schema.Clone()
if err := schema.AddField(field); err != nil {
// Append field.
if err := f.addField(field); err != nil {
return err
}
f.schema = schema
f.saveSchema()
f.saveMeta()
return nil
}
// addField adds a single field to fields.
func (f *Frame) addField(field *Field) error {
if err := ValidateField(field); err != nil {
return err
} else if f.HasField(field.Name) {
return ErrFieldExists
}
// Add field to list.
f.fields = append(f.fields, field)
// Sort fields by name.
sort.Slice(f.fields, func(i, j int) bool {
return f.fields[i].Name < f.fields[j].Name
})
return nil
}
// GetFields returns a list of all the fields in the frame.
func (f *Frame) GetFields() (*FrameSchema, error) {
func (f *Frame) GetFields() ([]*Field, error) {
f.mu.RLock()
defer f.mu.RUnlock()
@ -449,12 +446,12 @@ func (f *Frame) GetFields() (*FrameSchema, error) {
return nil, ErrFrameFieldsNotAllowed
}
err := f.loadSchema()
err := f.loadMeta()
if err != nil {
return nil, err
}
return f.schema, nil
return f.fields, nil
}
// DeleteField deletes an existing field on the schema.
@ -467,12 +464,10 @@ func (f *Frame) DeleteField(name string) error {
return ErrFrameFieldsNotAllowed
}
// Copy schema and remove field.
schema := f.schema.Clone()
if err := schema.DeleteField(name); err != nil {
// Remove field.
if err := f.deleteField(name); err != nil {
return err
}
f.schema = schema
// Remove views.
viewName := ViewFieldPrefix + name
@ -489,6 +484,18 @@ func (f *Frame) DeleteField(name string) error {
return nil
}
// deleteField removes a single field from fields.
func (f *Frame) deleteField(name string) error {
for i, field := range f.fields {
if field.Name == name {
copy(f.fields[i:], f.fields[i+1:])
f.fields, f.fields[len(f.fields)-1] = f.fields[:len(f.fields)-1], nil
return nil
}
}
return ErrFieldNotFound
}
// TimeQuantum returns the time quantum for the frame.
func (f *Frame) TimeQuantum() TimeQuantum {
f.mu.Lock()
@ -1021,77 +1028,6 @@ func decodeFrameOptions(options *internal.FrameMeta) *FrameOptions {
}
}
// FrameSchema represents the list of fields on a frame.
type FrameSchema struct {
Fields []*Field
}
// Clone returns a copy of s.
func (s *FrameSchema) Clone() *FrameSchema {
other := &FrameSchema{Fields: make([]*Field, len(s.Fields))}
copy(other.Fields, s.Fields)
return other
}
// HasField returns true if a field exists on the schema.
func (s *FrameSchema) HasField(name string) bool {
for _, f := range s.Fields {
if f.Name == name {
return true
}
}
return false
}
// AddField adds a single field to the schema.
func (s *FrameSchema) AddField(field *Field) error {
if err := ValidateField(field); err != nil {
return err
} else if s.HasField(field.Name) {
return ErrFieldExists
}
// Add field to list.
s.Fields = append(s.Fields, field)
// Sort fields by name.
sort.Slice(s.Fields, func(i, j int) bool {
return s.Fields[i].Name < s.Fields[j].Name
})
return nil
}
// DeleteField removes a single field from the schema.
func (s *FrameSchema) DeleteField(name string) error {
for i, field := range s.Fields {
if field.Name == name {
copy(s.Fields[i:], s.Fields[i+1:])
s.Fields, s.Fields[len(s.Fields)-1] = s.Fields[:len(s.Fields)-1], nil
return nil
}
}
return ErrFieldNotFound
}
func encodeFrameSchema(schema *FrameSchema) *internal.FrameSchema {
if schema == nil {
return nil
}
return &internal.FrameSchema{
Fields: encodeFields(schema.Fields),
}
}
func decodeFrameSchema(schema *internal.FrameSchema) *FrameSchema {
if schema == nil {
return nil
}
return &FrameSchema{
Fields: decodeFields(schema.Fields),
}
}
// List of field data types.
const (
FieldTypeInt = "int"

View file

@ -861,7 +861,7 @@ func (h *Handler) handleGetFrameFields(w http.ResponseWriter, r *http.Request) {
return
}
schema, err := frame.GetFields()
fields, err := frame.GetFields()
if err == ErrFrameFieldsNotAllowed {
http.Error(w, err.Error(), http.StatusBadRequest)
return
@ -871,7 +871,7 @@ func (h *Handler) handleGetFrameFields(w http.ResponseWriter, r *http.Request) {
}
// Encode response.
if err := json.NewEncoder(w).Encode(getFrameFieldsResponse{Fields: schema.Fields}); err != nil {
if err := json.NewEncoder(w).Encode(getFrameFieldsResponse{Fields: fields}); err != nil {
h.logger().Printf("response encoding error: %s", err)
}
}

View file

@ -494,18 +494,12 @@ func (i *Index) createFrame(name string, opt FrameOptions) (*Frame, error) {
f.inverseEnabled = opt.InverseEnabled
f.rangeEnabled = opt.RangeEnabled
if err := f.saveMeta(); err != nil {
f.Close()
return nil, err
}
f.rangeEnabled = opt.RangeEnabled
// Set schema & save.
f.schema = &FrameSchema{
Fields: opt.Fields,
}
if err := f.saveSchema(); err != nil {
// Set fields.
f.fields = opt.Fields
if err := f.saveMeta(); err != nil {
f.Close()
return nil, err
}

View file

@ -106,25 +106,21 @@ func TestIndex_CreateFrame(t *testing.T) {
},
}); err != nil {
t.Fatal(err)
} else if !reflect.DeepEqual(f.Schema(), &pilosa.FrameSchema{
Fields: []*pilosa.Field{
{Name: "field0", Type: pilosa.FieldTypeInt, Min: 10, Max: 20},
{Name: "field1", Type: pilosa.FieldTypeInt, Min: 11, Max: 21},
},
} else if !reflect.DeepEqual(f.Fields(), []*pilosa.Field{
{Name: "field0", Type: pilosa.FieldTypeInt, Min: 10, Max: 20},
{Name: "field1", Type: pilosa.FieldTypeInt, Min: 11, Max: 21},
}) {
t.Fatalf("unexpected schema: %#v", f.Schema())
t.Fatalf("unexpected fields: %#v", f.Fields())
}
// Reopen the index & verify the fields are loaded.
if err := index.Reopen(); err != nil {
t.Fatal(err)
} else if f := index.Frame("f"); !reflect.DeepEqual(f.Schema(), &pilosa.FrameSchema{
Fields: []*pilosa.Field{
{Name: "field0", Type: pilosa.FieldTypeInt, Min: 10, Max: 20},
{Name: "field1", Type: pilosa.FieldTypeInt, Min: 11, Max: 21},
},
} else if f := index.Frame("f"); !reflect.DeepEqual(f.Fields(), []*pilosa.Field{
{Name: "field0", Type: pilosa.FieldTypeInt, Min: 10, Max: 20},
{Name: "field1", Type: pilosa.FieldTypeInt, Min: 11, Max: 21},
}) {
t.Fatalf("unexpected schema after reopen: %#v", f.Schema())
t.Fatalf("unexpected fields after reopen: %#v", f.Fields())
}
})

View file

@ -30,7 +30,6 @@
URI
NodeStatus
ClusterStatus
FrameSchema
Field
DeleteViewMessage
ResizeInstruction
@ -725,22 +724,6 @@ func (m *ClusterStatus) GetURISet() []*URI {
return nil
}
type FrameSchema struct {
Fields []*Field `protobuf:"bytes,1,rep,name=Fields" json:"Fields,omitempty"`
}
func (m *FrameSchema) Reset() { *m = FrameSchema{} }
func (m *FrameSchema) String() string { return proto.CompactTextString(m) }
func (*FrameSchema) ProtoMessage() {}
func (*FrameSchema) Descriptor() ([]byte, []int) { return fileDescriptorPrivate, []int{22} }
func (m *FrameSchema) GetFields() []*Field {
if m != nil {
return m.Fields
}
return nil
}
type Field struct {
Name string `protobuf:"bytes,1,opt,name=Name,proto3" json:"Name,omitempty"`
Type string `protobuf:"bytes,2,opt,name=Type,proto3" json:"Type,omitempty"`
@ -751,7 +734,7 @@ type Field struct {
func (m *Field) Reset() { *m = Field{} }
func (m *Field) String() string { return proto.CompactTextString(m) }
func (*Field) ProtoMessage() {}
func (*Field) Descriptor() ([]byte, []int) { return fileDescriptorPrivate, []int{23} }
func (*Field) Descriptor() ([]byte, []int) { return fileDescriptorPrivate, []int{22} }
func (m *Field) GetName() string {
if m != nil {
@ -790,7 +773,7 @@ type DeleteViewMessage struct {
func (m *DeleteViewMessage) Reset() { *m = DeleteViewMessage{} }
func (m *DeleteViewMessage) String() string { return proto.CompactTextString(m) }
func (*DeleteViewMessage) ProtoMessage() {}
func (*DeleteViewMessage) Descriptor() ([]byte, []int) { return fileDescriptorPrivate, []int{24} }
func (*DeleteViewMessage) Descriptor() ([]byte, []int) { return fileDescriptorPrivate, []int{23} }
func (m *DeleteViewMessage) GetIndex() string {
if m != nil {
@ -823,7 +806,7 @@ type ResizeInstruction struct {
func (m *ResizeInstruction) Reset() { *m = ResizeInstruction{} }
func (m *ResizeInstruction) String() string { return proto.CompactTextString(m) }
func (*ResizeInstruction) ProtoMessage() {}
func (*ResizeInstruction) Descriptor() ([]byte, []int) { return fileDescriptorPrivate, []int{25} }
func (*ResizeInstruction) Descriptor() ([]byte, []int) { return fileDescriptorPrivate, []int{24} }
func (m *ResizeInstruction) GetJobID() int64 {
if m != nil {
@ -864,7 +847,7 @@ type ResizeSource struct {
func (m *ResizeSource) Reset() { *m = ResizeSource{} }
func (m *ResizeSource) String() string { return proto.CompactTextString(m) }
func (*ResizeSource) ProtoMessage() {}
func (*ResizeSource) Descriptor() ([]byte, []int) { return fileDescriptorPrivate, []int{26} }
func (*ResizeSource) Descriptor() ([]byte, []int) { return fileDescriptorPrivate, []int{25} }
func (m *ResizeSource) GetURI() *URI {
if m != nil {
@ -910,7 +893,7 @@ func (m *ResizeInstructionComplete) Reset() { *m = ResizeInstructionComp
func (m *ResizeInstructionComplete) String() string { return proto.CompactTextString(m) }
func (*ResizeInstructionComplete) ProtoMessage() {}
func (*ResizeInstructionComplete) Descriptor() ([]byte, []int) {
return fileDescriptorPrivate, []int{27}
return fileDescriptorPrivate, []int{26}
}
func (m *ResizeInstructionComplete) GetJobID() int64 {
@ -934,7 +917,7 @@ type Topology struct {
func (m *Topology) Reset() { *m = Topology{} }
func (m *Topology) String() string { return proto.CompactTextString(m) }
func (*Topology) ProtoMessage() {}
func (*Topology) Descriptor() ([]byte, []int) { return fileDescriptorPrivate, []int{28} }
func (*Topology) Descriptor() ([]byte, []int) { return fileDescriptorPrivate, []int{27} }
func (m *Topology) GetURISet() []*URI {
if m != nil {
@ -966,7 +949,6 @@ func init() {
proto.RegisterType((*URI)(nil), "internal.URI")
proto.RegisterType((*NodeStatus)(nil), "internal.NodeStatus")
proto.RegisterType((*ClusterStatus)(nil), "internal.ClusterStatus")
proto.RegisterType((*FrameSchema)(nil), "internal.FrameSchema")
proto.RegisterType((*Field)(nil), "internal.Field")
proto.RegisterType((*DeleteViewMessage)(nil), "internal.DeleteViewMessage")
proto.RegisterType((*ResizeInstruction)(nil), "internal.ResizeInstruction")
@ -1887,36 +1869,6 @@ func (m *ClusterStatus) MarshalTo(dAtA []byte) (int, error) {
return i, nil
}
func (m *FrameSchema) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalTo(dAtA)
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *FrameSchema) MarshalTo(dAtA []byte) (int, error) {
var i int
_ = i
var l int
_ = l
if len(m.Fields) > 0 {
for _, msg := range m.Fields {
dAtA[i] = 0xa
i++
i = encodeVarintPrivate(dAtA, i, uint64(msg.Size()))
n, err := msg.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
i += n
}
}
return i, nil
}
func (m *Field) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
@ -2574,18 +2526,6 @@ func (m *ClusterStatus) Size() (n int) {
return n
}
func (m *FrameSchema) Size() (n int) {
var l int
_ = l
if len(m.Fields) > 0 {
for _, e := range m.Fields {
l = e.Size()
n += 1 + l + sovPrivate(uint64(l))
}
}
return n
}
func (m *Field) Size() (n int) {
var l int
_ = l
@ -5803,87 +5743,6 @@ func (m *ClusterStatus) Unmarshal(dAtA []byte) error {
}
return nil
}
func (m *FrameSchema) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowPrivate
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: FrameSchema: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: FrameSchema: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Fields", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowPrivate
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= (int(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthPrivate
}
postIndex := iNdEx + msglen
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.Fields = append(m.Fields, &Field{})
if err := m.Fields[len(m.Fields)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipPrivate(dAtA[iNdEx:])
if err != nil {
return err
}
if skippy < 0 {
return ErrInvalidLengthPrivate
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *Field) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
@ -6813,75 +6672,74 @@ var (
func init() { proto.RegisterFile("private.proto", fileDescriptorPrivate) }
var fileDescriptorPrivate = []byte{
// 1110 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0x4d, 0x6f, 0x23, 0x45,
0x13, 0x7e, 0xc7, 0x63, 0x3b, 0x76, 0x79, 0x9d, 0x38, 0xfd, 0x2e, 0x91, 0x13, 0x45, 0xde, 0xa8,
0x25, 0xd8, 0x10, 0x89, 0x00, 0x41, 0x5a, 0xf1, 0x75, 0x80, 0x8d, 0xb3, 0xca, 0xc0, 0x66, 0x59,
0xda, 0xc9, 0x72, 0x43, 0xea, 0xd8, 0x4d, 0x76, 0x94, 0xf1, 0xb4, 0x99, 0x69, 0x27, 0xf1, 0x1e,
0xb8, 0xc1, 0x3f, 0x40, 0x42, 0xe2, 0xc8, 0x99, 0xff, 0xc1, 0x91, 0x9f, 0x80, 0xc2, 0x85, 0x7f,
0x80, 0xc4, 0x09, 0x75, 0x75, 0xcf, 0x87, 0x3f, 0x43, 0x72, 0x9b, 0x7a, 0xba, 0xba, 0xea, 0xe9,
0xa7, 0xab, 0xca, 0x6d, 0xa8, 0x0f, 0x22, 0xff, 0x82, 0x2b, 0xb1, 0x3b, 0x88, 0xa4, 0x92, 0xa4,
0xe2, 0x87, 0x4a, 0x44, 0x21, 0x0f, 0xe8, 0x17, 0x50, 0xf5, 0xc2, 0x9e, 0xb8, 0x3a, 0x12, 0x8a,
0x93, 0x2d, 0xa8, 0xed, 0xcb, 0x60, 0xd8, 0x0f, 0x9f, 0xf2, 0x53, 0x11, 0x34, 0x9d, 0x2d, 0x67,
0xbb, 0xca, 0xf2, 0x90, 0xf6, 0x38, 0xf6, 0xfb, 0xe2, 0xcb, 0x21, 0x0f, 0xd5, 0xb0, 0xdf, 0x2c,
0x18, 0x8f, 0x1c, 0x44, 0xff, 0x71, 0xa0, 0xfa, 0x24, 0xe2, 0x7d, 0x81, 0x11, 0x37, 0xa0, 0xc2,
0xe4, 0x65, 0x3e, 0x5c, 0x6a, 0x93, 0x37, 0x60, 0xd9, 0x0b, 0x2f, 0x44, 0x14, 0x8b, 0x83, 0x90,
0x9f, 0x06, 0xa2, 0x87, 0xe1, 0x2a, 0x6c, 0x02, 0x25, 0x9b, 0x50, 0xdd, 0xe7, 0xdd, 0x97, 0xe2,
0x78, 0x34, 0x10, 0x4d, 0x17, 0x83, 0x64, 0x40, 0xba, 0xda, 0xf1, 0x5f, 0x89, 0x66, 0x71, 0xcb,
0xd9, 0xae, 0xb3, 0x0c, 0x98, 0xe4, 0x5b, 0x9a, 0xe2, 0x4b, 0x28, 0xdc, 0x63, 0x3c, 0x3c, 0x4b,
0x39, 0x94, 0x91, 0xc3, 0x18, 0x46, 0x1e, 0x42, 0xf9, 0x89, 0x2f, 0x82, 0x5e, 0xdc, 0x5c, 0xda,
0x72, 0xb7, 0x6b, 0x7b, 0x2b, 0xbb, 0x89, 0x7e, 0xbb, 0x88, 0x33, 0xbb, 0x4c, 0x29, 0x2c, 0x7b,
0xfd, 0x81, 0x8c, 0x14, 0x13, 0xf1, 0x40, 0x86, 0xb1, 0x20, 0x0d, 0x70, 0x0f, 0xa2, 0xc8, 0x9e,
0x5d, 0x7f, 0xd2, 0xef, 0xa0, 0xf1, 0x38, 0x90, 0xdd, 0xf3, 0x36, 0x57, 0x9c, 0x89, 0x6f, 0x87,
0x22, 0x56, 0xe4, 0x3e, 0x94, 0xf0, 0x16, 0xac, 0x9f, 0x31, 0x34, 0x8a, 0x4a, 0x5a, 0x99, 0x8d,
0xa1, 0x51, 0xdc, 0x8f, 0x52, 0x14, 0x99, 0x31, 0x34, 0xda, 0x09, 0xfc, 0xae, 0x91, 0xa0, 0xc8,
0x8c, 0x41, 0x08, 0x14, 0x5f, 0xf8, 0xe2, 0xd2, 0x9e, 0x1b, 0xbf, 0xa9, 0x07, 0xab, 0xb9, 0xfc,
0x96, 0xe6, 0x1a, 0x94, 0x99, 0xbc, 0xf4, 0xda, 0x71, 0xd3, 0xd9, 0x72, 0xb7, 0x8b, 0xcc, 0x5a,
0xa8, 0x2e, 0x5e, 0xbf, 0x5e, 0x2a, 0xe0, 0x52, 0x06, 0xd0, 0x75, 0x28, 0xa1, 0xd4, 0xfa, 0x94,
0xd9, 0x5e, 0xfd, 0x49, 0x7f, 0x76, 0x60, 0xf5, 0x88, 0x5f, 0x21, 0x8d, 0x38, 0x4d, 0x73, 0x08,
0xd5, 0x14, 0x44, 0xef, 0xda, 0xde, 0x4e, 0xa6, 0xe5, 0x94, 0x7f, 0x86, 0x1c, 0x84, 0x2a, 0x1a,
0xb1, 0x6c, 0xf3, 0xc6, 0xc7, 0xb0, 0x3c, 0xbe, 0xa8, 0x39, 0x9c, 0x8b, 0x51, 0xa2, 0xf4, 0xb9,
0x18, 0x69, 0x4d, 0x2e, 0x78, 0x30, 0x34, 0xfa, 0x15, 0x99, 0x31, 0x3e, 0x2c, 0xbc, 0xef, 0xd0,
0xaf, 0x81, 0xec, 0x47, 0x82, 0x2b, 0x81, 0x01, 0x8e, 0x44, 0x1c, 0xf3, 0x33, 0x31, 0xff, 0x16,
0x8c, 0xb2, 0x85, 0xbc, 0xb2, 0x9b, 0x50, 0xf5, 0x62, 0x5b, 0xa8, 0x78, 0x13, 0x15, 0x96, 0x01,
0x74, 0x07, 0x48, 0x5b, 0x04, 0x42, 0x09, 0xdb, 0x5b, 0x0b, 0xe2, 0xd3, 0x4e, 0xc2, 0xe5, 0x66,
0x5f, 0xf2, 0x10, 0x8a, 0xba, 0xad, 0x90, 0x4a, 0x6d, 0xef, 0xff, 0x99, 0x74, 0x69, 0x0f, 0x33,
0x74, 0xa0, 0x7e, 0x12, 0xd4, 0xb6, 0xe2, 0x0d, 0x07, 0x9c, 0x51, 0x66, 0x49, 0x2a, 0x77, 0x32,
0x55, 0xda, 0xdc, 0x36, 0xd5, 0x27, 0xc9, 0x59, 0xef, 0x9a, 0x8a, 0xb6, 0x2d, 0xaa, 0xcb, 0xf5,
0x99, 0x5e, 0x35, 0x7b, 0xf0, 0x7b, 0xfe, 0x91, 0x27, 0x79, 0xfc, 0xe5, 0xd8, 0x94, 0xb7, 0x0b,
0x33, 0xa1, 0x9c, 0x9e, 0x58, 0x49, 0x61, 0xd9, 0x0e, 0x4b, 0x6d, 0x9c, 0x03, 0x3a, 0x6b, 0xdc,
0x2c, 0x4e, 0xcd, 0x01, 0x8d, 0x33, 0xbb, 0xac, 0xdb, 0xc9, 0x16, 0x79, 0xc9, 0xb4, 0x93, 0xb1,
0xc8, 0x01, 0x34, 0xbc, 0x70, 0x30, 0x54, 0x6d, 0xf1, 0x8d, 0x1f, 0xfa, 0xca, 0x97, 0x61, 0xdc,
0x2c, 0x63, 0xa8, 0xf5, 0x3c, 0xa3, 0x31, 0x0f, 0x36, 0xb5, 0x85, 0xfe, 0xe0, 0xc0, 0xca, 0x04,
0x38, 0xe7, 0xd0, 0x09, 0xdf, 0xc2, 0x62, 0xbe, 0x8f, 0xd2, 0x01, 0xe7, 0xa2, 0x63, 0x6b, 0x2e,
0x9b, 0xf1, 0x79, 0xf7, 0x8b, 0x03, 0xf7, 0x67, 0x39, 0xcc, 0x64, 0xd3, 0x02, 0x78, 0x1e, 0xf9,
0x7d, 0x1e, 0x8d, 0x3e, 0x17, 0x23, 0x3b, 0xeb, 0x73, 0x08, 0xf9, 0x0a, 0xd6, 0x26, 0x62, 0x7d,
0xda, 0x35, 0x12, 0x19, 0x52, 0x0f, 0xe6, 0x92, 0x32, 0x7e, 0x6c, 0xce, 0x76, 0xfa, 0xb7, 0x03,
0xaf, 0xcd, 0x5c, 0xca, 0xea, 0xd1, 0xc9, 0x97, 0xfe, 0x0e, 0x34, 0x5e, 0xe8, 0x51, 0xd1, 0x16,
0xb1, 0xf2, 0x43, 0xae, 0x3d, 0x6d, 0xc1, 0x4e, 0xe1, 0xc4, 0x83, 0x0a, 0x62, 0x47, 0x7c, 0x60,
0x69, 0xbe, 0x75, 0x03, 0xcd, 0xdd, 0xc4, 0xdf, 0xcc, 0xb4, 0x74, 0xbb, 0x26, 0x83, 0x53, 0x37,
0x19, 0xe1, 0x68, 0x6c, 0x7c, 0x04, 0xf5, 0xb1, 0x0d, 0xb7, 0x9a, 0x73, 0x12, 0x36, 0x93, 0xd9,
0x32, 0xc6, 0x64, 0x71, 0x97, 0x7e, 0x00, 0x90, 0xb9, 0xda, 0x01, 0xb0, 0xa0, 0x3e, 0x73, 0xce,
0xf4, 0x10, 0x36, 0x93, 0xc1, 0x77, 0x8b, 0x84, 0x49, 0xb5, 0x14, 0xb2, 0x6a, 0xa1, 0x07, 0xe0,
0x9e, 0x30, 0x0f, 0x3b, 0xa9, 0xfb, 0x52, 0xa4, 0x57, 0x64, 0x2d, 0xbd, 0xe5, 0x50, 0xc6, 0x2a,
0xd9, 0xa2, 0xbf, 0x35, 0xf6, 0x5c, 0x46, 0x0a, 0x19, 0xd7, 0x19, 0x7e, 0xd3, 0x1f, 0x1d, 0x80,
0x67, 0xb2, 0x27, 0x3a, 0x8a, 0xab, 0x61, 0x4c, 0x1e, 0x60, 0x54, 0x8c, 0x55, 0xdb, 0xab, 0x67,
0x67, 0x3a, 0x61, 0x1e, 0xc3, 0x7c, 0x7a, 0xda, 0x2b, 0xae, 0xd2, 0x09, 0x85, 0x06, 0x79, 0x13,
0x96, 0x90, 0xa9, 0x48, 0x6a, 0x71, 0x65, 0x62, 0x80, 0xb0, 0x64, 0x9d, 0xbc, 0x0e, 0xe5, 0x13,
0xe6, 0x75, 0x84, 0xb2, 0x33, 0x62, 0x22, 0x89, 0x5d, 0xa4, 0x4f, 0xa1, 0xbe, 0x1f, 0x0c, 0x63,
0x25, 0x22, 0xcb, 0x2c, 0x4d, 0xec, 0xe4, 0x13, 0x67, 0xd1, 0x0a, 0x8b, 0xa2, 0x3d, 0x82, 0x1a,
0x96, 0x2e, 0x8a, 0xc3, 0x73, 0xef, 0x15, 0x67, 0xf1, 0x7b, 0xa5, 0x03, 0xa5, 0xf9, 0xfd, 0x4a,
0xa0, 0x88, 0x4f, 0x2e, 0x2b, 0x31, 0xbe, 0xb6, 0x1a, 0xe0, 0x1e, 0xf9, 0xa6, 0x26, 0x5c, 0xa6,
0x3f, 0x11, 0xe1, 0x57, 0x58, 0xb3, 0x1a, 0xe1, 0xfa, 0x07, 0x6d, 0xd5, 0xd4, 0x80, 0x7e, 0x6e,
0xdc, 0xe5, 0xa7, 0x27, 0x79, 0xb5, 0xb8, 0xb9, 0x57, 0xcb, 0xaf, 0x0e, 0xac, 0x32, 0x11, 0xfb,
0xaf, 0x84, 0x17, 0xc6, 0x2a, 0x1a, 0xa6, 0xfd, 0xfb, 0x99, 0x3c, 0xf5, 0xda, 0x18, 0xd5, 0x65,
0xc6, 0x48, 0x2e, 0xb9, 0x30, 0xf7, 0x92, 0xdf, 0xd6, 0xef, 0x5c, 0x19, 0xf5, 0x74, 0x13, 0xcb,
0xc8, 0x56, 0xf8, 0x84, 0x63, 0xde, 0x83, 0xbc, 0x03, 0x4b, 0x1d, 0x39, 0x8c, 0xba, 0xe9, 0xe4,
0x5f, 0xcb, 0x9c, 0x0d, 0x2b, 0xb3, 0xcc, 0x12, 0x37, 0xfa, 0xbd, 0x03, 0xf7, 0xf2, 0x2b, 0xff,
0xa9, 0xf2, 0x8c, 0x42, 0x85, 0x99, 0x0a, 0xb9, 0xb3, 0x14, 0x2a, 0x66, 0x0a, 0x65, 0xef, 0x94,
0x52, 0xee, 0x9d, 0x42, 0x19, 0xac, 0x4f, 0xc9, 0xb6, 0x2f, 0xfb, 0x03, 0x7d, 0x3f, 0x77, 0x94,
0x8f, 0xbe, 0x0b, 0x95, 0x63, 0x39, 0x90, 0x81, 0x3c, 0x1b, 0xe5, 0x0a, 0xd4, 0x59, 0x50, 0xa0,
0x8f, 0x1b, 0xbf, 0x5d, 0xb7, 0x9c, 0xdf, 0xaf, 0x5b, 0xce, 0x1f, 0xd7, 0x2d, 0xe7, 0xa7, 0x3f,
0x5b, 0xff, 0x3b, 0x2d, 0xe3, 0x3f, 0x91, 0xf7, 0xfe, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x7e, 0xc9,
0xe9, 0x9b, 0x9a, 0x0c, 0x00, 0x00,
// 1096 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0xcd, 0x6e, 0x23, 0x45,
0x10, 0x66, 0x3c, 0xb6, 0x63, 0x57, 0xd6, 0x89, 0xd3, 0x2c, 0x91, 0x13, 0x45, 0xde, 0xa8, 0x25,
0xd8, 0x10, 0x89, 0x00, 0x41, 0x42, 0xfc, 0x1d, 0x60, 0xe3, 0xac, 0x32, 0xb0, 0x59, 0x96, 0x76,
0xb2, 0xdc, 0x90, 0x3a, 0x4e, 0x93, 0x1d, 0x65, 0x3c, 0x6d, 0x66, 0xda, 0x49, 0xbc, 0x07, 0x6e,
0xf0, 0x06, 0x48, 0x48, 0x1c, 0x39, 0xf3, 0x1e, 0x1c, 0x79, 0x04, 0x14, 0x2e, 0xbc, 0x01, 0x12,
0x27, 0xd4, 0xd5, 0x3d, 0x3f, 0x1e, 0xff, 0x84, 0xe4, 0x36, 0xf5, 0x75, 0x75, 0xd5, 0xd7, 0x5f,
0x57, 0x95, 0xdb, 0xd0, 0x18, 0x44, 0xfe, 0x05, 0x57, 0x62, 0x67, 0x10, 0x49, 0x25, 0x49, 0xcd,
0x0f, 0x95, 0x88, 0x42, 0x1e, 0xd0, 0x2f, 0xa1, 0xee, 0x85, 0xa7, 0xe2, 0xea, 0x50, 0x28, 0x4e,
0x36, 0x61, 0x71, 0x4f, 0x06, 0xc3, 0x7e, 0xf8, 0x84, 0x9f, 0x88, 0xa0, 0xe5, 0x6c, 0x3a, 0x5b,
0x75, 0x96, 0x87, 0xb4, 0xc7, 0x91, 0xdf, 0x17, 0x5f, 0x0d, 0x79, 0xa8, 0x86, 0xfd, 0x56, 0xc9,
0x78, 0xe4, 0x20, 0xfa, 0xaf, 0x03, 0xf5, 0xc7, 0x11, 0xef, 0x0b, 0x8c, 0xb8, 0x0e, 0x35, 0x26,
0x2f, 0xf3, 0xe1, 0x52, 0x9b, 0xbc, 0x01, 0x4b, 0x5e, 0x78, 0x21, 0xa2, 0x58, 0xec, 0x87, 0xfc,
0x24, 0x10, 0xa7, 0x18, 0xae, 0xc6, 0x0a, 0x28, 0xd9, 0x80, 0xfa, 0x1e, 0xef, 0xbd, 0x10, 0x47,
0xa3, 0x81, 0x68, 0xb9, 0x18, 0x24, 0x03, 0xd2, 0xd5, 0xae, 0xff, 0x52, 0xb4, 0xca, 0x9b, 0xce,
0x56, 0x83, 0x65, 0x40, 0x91, 0x6f, 0x65, 0x82, 0x2f, 0xa1, 0x70, 0x8f, 0xf1, 0xf0, 0x2c, 0xe5,
0x50, 0x45, 0x0e, 0x63, 0x18, 0x79, 0x08, 0xd5, 0xc7, 0xbe, 0x08, 0x4e, 0xe3, 0xd6, 0xc2, 0xa6,
0xbb, 0xb5, 0xb8, 0xbb, 0xbc, 0x93, 0xe8, 0xb7, 0x83, 0x38, 0xb3, 0xcb, 0x94, 0xc2, 0x92, 0xd7,
0x1f, 0xc8, 0x48, 0x31, 0x11, 0x0f, 0x64, 0x18, 0x0b, 0xd2, 0x04, 0x77, 0x3f, 0x8a, 0xec, 0xd9,
0xf5, 0x27, 0xfd, 0x1e, 0x9a, 0x8f, 0x02, 0xd9, 0x3b, 0xef, 0x70, 0xc5, 0x99, 0xf8, 0x6e, 0x28,
0x62, 0x45, 0xee, 0x43, 0x05, 0x6f, 0xc1, 0xfa, 0x19, 0x43, 0xa3, 0xa8, 0xa4, 0x95, 0xd9, 0x18,
0x1a, 0xc5, 0xfd, 0x28, 0x45, 0x99, 0x19, 0x43, 0xa3, 0xdd, 0xc0, 0xef, 0x19, 0x09, 0xca, 0xcc,
0x18, 0x84, 0x40, 0xf9, 0xb9, 0x2f, 0x2e, 0xed, 0xb9, 0xf1, 0x9b, 0x7a, 0xb0, 0x92, 0xcb, 0x6f,
0x69, 0xae, 0x42, 0x95, 0xc9, 0x4b, 0xaf, 0x13, 0xb7, 0x9c, 0x4d, 0x77, 0xab, 0xcc, 0xac, 0x85,
0xea, 0xe2, 0xf5, 0xeb, 0xa5, 0x12, 0x2e, 0x65, 0x00, 0x5d, 0x83, 0x0a, 0x4a, 0xad, 0x4f, 0x99,
0xed, 0xd5, 0x9f, 0xf4, 0x17, 0x07, 0x56, 0x0e, 0xf9, 0x15, 0xd2, 0x88, 0xd3, 0x34, 0x07, 0x50,
0x4f, 0x41, 0xf4, 0x5e, 0xdc, 0xdd, 0xce, 0xb4, 0x9c, 0xf0, 0xcf, 0x90, 0xfd, 0x50, 0x45, 0x23,
0x96, 0x6d, 0x5e, 0xff, 0x04, 0x96, 0xc6, 0x17, 0x35, 0x87, 0x73, 0x31, 0x4a, 0x94, 0x3e, 0x17,
0x23, 0xad, 0xc9, 0x05, 0x0f, 0x86, 0x46, 0xbf, 0x32, 0x33, 0xc6, 0x47, 0xa5, 0x0f, 0x1c, 0xfa,
0x0d, 0x90, 0xbd, 0x48, 0x70, 0x25, 0x30, 0xc0, 0xa1, 0x88, 0x63, 0x7e, 0x26, 0x66, 0xdf, 0x82,
0x51, 0xb6, 0x94, 0x57, 0x76, 0x03, 0xea, 0x5e, 0x6c, 0x0b, 0x15, 0x6f, 0xa2, 0xc6, 0x32, 0x80,
0x6e, 0x03, 0xe9, 0x88, 0x40, 0x28, 0x61, 0x7b, 0x6b, 0x4e, 0x7c, 0xda, 0x4d, 0xb8, 0xdc, 0xec,
0x4b, 0x1e, 0x42, 0x59, 0xb7, 0x15, 0x52, 0x59, 0xdc, 0x7d, 0x35, 0x93, 0x2e, 0xed, 0x61, 0x86,
0x0e, 0xd4, 0x4f, 0x82, 0xda, 0x56, 0xbc, 0xe1, 0x80, 0x53, 0xca, 0x2c, 0x49, 0xe5, 0x16, 0x53,
0xa5, 0xcd, 0x6d, 0x53, 0x7d, 0x9a, 0x9c, 0xf5, 0xae, 0xa9, 0x68, 0xc7, 0xa2, 0xba, 0x5c, 0x9f,
0xea, 0x55, 0xb3, 0x07, 0xbf, 0x67, 0x1f, 0xb9, 0xc8, 0xe3, 0x6f, 0xc7, 0xa6, 0xbc, 0x5d, 0x98,
0x82, 0x72, 0x7a, 0x62, 0x25, 0x85, 0x65, 0x3b, 0x2c, 0xb5, 0x71, 0x0e, 0xe8, 0xac, 0x71, 0xab,
0x3c, 0x31, 0x07, 0x34, 0xce, 0xec, 0xb2, 0x6e, 0x27, 0x5b, 0xe4, 0x15, 0xd3, 0x4e, 0xc6, 0x22,
0xfb, 0xd0, 0xf4, 0xc2, 0xc1, 0x50, 0x75, 0xc4, 0xb7, 0x7e, 0xe8, 0x2b, 0x5f, 0x86, 0x71, 0xab,
0x8a, 0xa1, 0xd6, 0xf2, 0x8c, 0xc6, 0x3c, 0xd8, 0xc4, 0x16, 0xfa, 0xa3, 0x03, 0xcb, 0x05, 0x70,
0xc6, 0xa1, 0x13, 0xbe, 0xa5, 0xf9, 0x7c, 0xdf, 0x4f, 0x07, 0x9c, 0x8b, 0x8e, 0xed, 0x99, 0x6c,
0xc6, 0xe7, 0xdd, 0xaf, 0x0e, 0xdc, 0x9f, 0xe6, 0x30, 0x95, 0x4d, 0x1b, 0xe0, 0x59, 0xe4, 0xf7,
0x79, 0x34, 0xfa, 0x42, 0x8c, 0xec, 0xac, 0xcf, 0x21, 0xe4, 0x6b, 0x58, 0x2d, 0xc4, 0xfa, 0xac,
0x67, 0x24, 0x32, 0xa4, 0x1e, 0xcc, 0x24, 0x65, 0xfc, 0xd8, 0x8c, 0xed, 0xf4, 0x1f, 0x07, 0x5e,
0x9b, 0xba, 0x94, 0xd5, 0xa3, 0x93, 0x2f, 0xfd, 0x6d, 0x68, 0x3e, 0xd7, 0xa3, 0xa2, 0x23, 0x62,
0xe5, 0x87, 0x5c, 0x7b, 0xda, 0x82, 0x9d, 0xc0, 0x89, 0x07, 0x35, 0xc4, 0x0e, 0xf9, 0xc0, 0xd2,
0x7c, 0xeb, 0x06, 0x9a, 0x3b, 0x89, 0xbf, 0x99, 0x69, 0xe9, 0x76, 0x4d, 0x06, 0xa7, 0x6e, 0x32,
0xc2, 0xd1, 0x58, 0xff, 0x18, 0x1a, 0x63, 0x1b, 0x6e, 0x35, 0xe7, 0x24, 0x6c, 0x24, 0xb3, 0x65,
0x8c, 0xc9, 0xfc, 0x2e, 0xfd, 0x10, 0x20, 0x73, 0xb5, 0x03, 0x60, 0x4e, 0x7d, 0xe6, 0x9c, 0xe9,
0x01, 0x6c, 0x24, 0x83, 0xef, 0x16, 0x09, 0x93, 0x6a, 0x29, 0x65, 0xd5, 0x42, 0xf7, 0xc1, 0x3d,
0x66, 0x1e, 0x76, 0x52, 0xef, 0x85, 0x48, 0xaf, 0xc8, 0x5a, 0x7a, 0xcb, 0x81, 0x8c, 0x55, 0xb2,
0x45, 0x7f, 0x6b, 0xec, 0x99, 0x8c, 0x14, 0x32, 0x6e, 0x30, 0xfc, 0xa6, 0x3f, 0x39, 0x00, 0x4f,
0xe5, 0xa9, 0xe8, 0x2a, 0xae, 0x86, 0x31, 0x79, 0x80, 0x51, 0x31, 0xd6, 0xe2, 0x6e, 0x23, 0x3b,
0xd3, 0x31, 0xf3, 0x18, 0xe6, 0xd3, 0xd3, 0x5e, 0x71, 0x95, 0x4e, 0x28, 0x34, 0xc8, 0x9b, 0xb0,
0x80, 0x4c, 0x45, 0x52, 0x8b, 0xcb, 0x85, 0x01, 0xc2, 0x92, 0x75, 0xf2, 0x3a, 0x54, 0x8f, 0x99,
0xd7, 0x15, 0xca, 0xce, 0x88, 0x42, 0x12, 0xbb, 0x48, 0x9f, 0x40, 0x63, 0x2f, 0x18, 0xc6, 0x4a,
0x44, 0x96, 0x59, 0x9a, 0xd8, 0xc9, 0x27, 0xce, 0xa2, 0x95, 0xe6, 0x45, 0xeb, 0x42, 0x65, 0x76,
0xdf, 0x11, 0x28, 0xe3, 0xd3, 0xc9, 0x4a, 0x85, 0xaf, 0xa6, 0x26, 0xb8, 0x87, 0xbe, 0xb9, 0x5b,
0x97, 0xe9, 0x4f, 0x44, 0xf8, 0x15, 0xd6, 0x9e, 0x46, 0xb8, 0xfe, 0x61, 0x5a, 0x31, 0x77, 0xa9,
0x9f, 0x0d, 0x77, 0xf9, 0x09, 0x49, 0x5e, 0x1f, 0x6e, 0xee, 0xf5, 0xf1, 0x9b, 0x03, 0x2b, 0x4c,
0xc4, 0xfe, 0x4b, 0xe1, 0x85, 0xb1, 0x8a, 0x86, 0x69, 0x1f, 0x7e, 0x2e, 0x4f, 0xbc, 0x0e, 0x46,
0x75, 0x99, 0x31, 0x92, 0xcb, 0x2a, 0xcd, 0xbc, 0xac, 0xb7, 0xf5, 0x7b, 0x55, 0x46, 0xa7, 0xba,
0x19, 0x65, 0x64, 0x2b, 0xb5, 0xe0, 0x98, 0xf7, 0x20, 0xef, 0xc0, 0x42, 0x57, 0x0e, 0xa3, 0x5e,
0x3a, 0xc1, 0x57, 0x33, 0x67, 0xc3, 0xca, 0x2c, 0xb3, 0xc4, 0x8d, 0xfe, 0xe0, 0xc0, 0xbd, 0xfc,
0xca, 0xff, 0xaa, 0x20, 0xa3, 0x50, 0x69, 0xaa, 0x42, 0xee, 0x34, 0x85, 0xca, 0x99, 0x42, 0xd9,
0x7b, 0xa3, 0x92, 0x7b, 0x6f, 0x50, 0x06, 0x6b, 0x13, 0xb2, 0xed, 0xc9, 0xfe, 0x40, 0xdf, 0xcf,
0x1d, 0xe5, 0xa3, 0xef, 0x42, 0xed, 0x48, 0x0e, 0x64, 0x20, 0xcf, 0x46, 0xb9, 0x42, 0x73, 0xe6,
0x14, 0xda, 0xa3, 0xe6, 0xef, 0xd7, 0x6d, 0xe7, 0x8f, 0xeb, 0xb6, 0xf3, 0xe7, 0x75, 0xdb, 0xf9,
0xf9, 0xaf, 0xf6, 0x2b, 0x27, 0x55, 0xfc, 0x47, 0xf1, 0xde, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff,
0xd7, 0x59, 0xea, 0x61, 0x62, 0x0c, 0x00, 0x00,
}

View file

@ -130,10 +130,6 @@ message ClusterStatus {
repeated URI URISet = 2;
}
message FrameSchema {
repeated Field Fields = 1;
}
message Field {
string Name = 1;
string Type = 2;