diff --git a/integration/.gitignore b/integration/.gitignore index f0e18f9d974..c3e9225fbd7 100644 --- a/integration/.gitignore +++ b/integration/.gitignore @@ -20,4 +20,4 @@ cmd/nodes2way-cli/nodes2way-cli cmd/trafficproxy-cli/*_flows.csv cmd/trafficproxy-cli/*_incidents.csv cmd/historicalspeed-timezone-builder/*mapping.csv -cmd/osrm-traffic-updater/testdata/target.csv \ No newline at end of file +cmd/osrm-traffic-updater/testdata/target*.csv diff --git a/integration/cmd/osrm-traffic-updater/osrm_traffic_updater.go b/integration/cmd/osrm-traffic-updater/osrm_traffic_updater.go index c278a665d4c..c63486e5514 100644 --- a/integration/cmd/osrm-traffic-updater/osrm_traffic_updater.go +++ b/integration/cmd/osrm-traffic-updater/osrm_traffic_updater.go @@ -38,6 +38,8 @@ func main() { isFlowDoneChan := make(chan bool, 1) wayid2speed := make(map[int64]int) + segmentsOfWay := make(map[int64][]*trafficproxy.SegmentedFlow) + go func() { trafficData, err := trafficproxyclient.GetFlowsIncidents(nil) if err != nil { @@ -45,8 +47,7 @@ func main() { isFlowDoneChan <- false return } - - trafficData2map(*trafficData, wayid2speed) + trafficData2map(*trafficData, wayid2speed, segmentsOfWay) isFlowDoneChan <- true }() @@ -60,7 +61,7 @@ func main() { if isFlowDone { var ds dumperStatistic ds.Init(TASKNUM) - dumpSpeedTable4Customize(wayid2speed, sources, flags.csvFile, &ds) + dumpSpeedTable4Customize(wayid2speed, segmentsOfWay, sources, flags.csvFile, &ds) ds.Output() } } @@ -83,7 +84,7 @@ loop: return isFlowDone } -func trafficData2map(trafficData trafficproxy.TrafficResponse, m map[int64]int) { +func trafficData2map(trafficData trafficproxy.TrafficResponse, m map[int64]int, s map[int64][]*trafficproxy.SegmentedFlow) { startTime := time.Now() defer func() { log.Printf("Processing time for building traffic map takes %f seconds\n", time.Now().Sub(startTime).Seconds()) @@ -102,6 +103,7 @@ func trafficData2map(trafficData trafficproxy.TrafficResponse, m map[int64]int) wayid := flow.Flow.WayID m[wayid] = int(flow.Flow.Speed) + s[wayid] = flow.Flow.SegmentedFlow if wayid > 0 { fwdCnt++ diff --git a/integration/cmd/osrm-traffic-updater/speed_table_dumper.go b/integration/cmd/osrm-traffic-updater/speed_table_dumper.go index 8145fc1c57d..6a1be2ed693 100644 --- a/integration/cmd/osrm-traffic-updater/speed_table_dumper.go +++ b/integration/cmd/osrm-traffic-updater/speed_table_dumper.go @@ -4,17 +4,20 @@ import ( "bufio" "fmt" "log" + "math" "os" "strconv" "strings" "sync" "time" + + "github.com/Telenav/osrm-backend/integration/traffic/livetraffic/trafficproxy" ) var tasksWg sync.WaitGroup var dumpFinishedWg sync.WaitGroup -func dumpSpeedTable4Customize(wayid2speed map[int64]int, sources [TASKNUM]chan string, +func dumpSpeedTable4Customize(wayid2speed map[int64]int, segmentsOfWay map[int64][]*trafficproxy.SegmentedFlow, sources [TASKNUM]chan string, outputPath string, ds *dumperStatistic) { startTime := time.Now() @@ -23,7 +26,7 @@ func dumpSpeedTable4Customize(wayid2speed map[int64]int, sources [TASKNUM]chan s } sink := make(chan string) - startTasks(wayid2speed, sources, sink, ds) + startTasks(wayid2speed, segmentsOfWay, sources, sink, ds) startDump(outputPath, sink) wait4AllTasksFinished(sink, ds) @@ -31,11 +34,11 @@ func dumpSpeedTable4Customize(wayid2speed map[int64]int, sources [TASKNUM]chan s fmt.Printf("Processing time for dumpSpeedTable4Customize takes %f seconds\n", endTime.Sub(startTime).Seconds()) } -func startTasks(wayid2speed map[int64]int, sources [TASKNUM]chan string, +func startTasks(wayid2speed map[int64]int, segmentsOfWay map[int64][]*trafficproxy.SegmentedFlow, sources [TASKNUM]chan string, sink chan<- string, ds *dumperStatistic) { tasksWg.Add(TASKNUM) for i := 0; i < TASKNUM; i++ { - go task(wayid2speed, sources[i], sink, ds) + go task(wayid2speed, segmentsOfWay, sources[i], sink, ds) } } @@ -51,13 +54,15 @@ func wait4AllTasksFinished(sink chan string, ds *dumperStatistic) { dumpFinishedWg.Wait() } -func task(wayid2speed map[int64]int, source <-chan string, sink chan<- string, ds *dumperStatistic) { +func task(wayid2speed map[int64]int, segmentsOfWay map[int64][]*trafficproxy.SegmentedFlow, source <-chan string, sink chan<- string, ds *dumperStatistic) { var wayCnt, nodeCnt, fwdRecordCnt, bwdRecordCnt, wayMatched, nodeMatched, fwdTrafficMatched, bwdTrafficMatched uint64 var err error for str := range source { elements := strings.Split(str, ",") wayCnt += 1 - nodeCnt += (uint64)(len(elements) - 1) + nodesInWayCnt := (uint64)(len(elements) - 1) + nodeCnt += nodesInWayCnt + if len(elements) < 3 { continue } @@ -71,6 +76,20 @@ func task(wayid2speed map[int64]int, source <-chan string, sink chan<- string, d speedFwd, okFwd := wayid2speed[(int64)(wayid)] speedBwd, okBwd := wayid2speed[(int64)(-wayid)] + speedsFwd := make([]int, nodesInWayCnt) + speedsBwd := make([]int, nodesInWayCnt) + + for i := range elements[1:] { + speedsFwd[i] = speedFwd + speedsBwd[i] = speedBwd + } + + segmentsFwd := segmentsOfWay[(int64)(wayid)] + segmentsBwd := segmentsOfWay[(int64)(-wayid)] + + getSpeedOfSegments(segmentsFwd, speedsFwd, nodesInWayCnt) + getSpeedOfSegments(segmentsBwd, speedsBwd, nodesInWayCnt) + if okFwd || okBwd { var nodes []string = elements[1:] wayMatched += 1 @@ -94,11 +113,11 @@ func task(wayid2speed map[int64]int, source <-chan string, sink chan<- string, d } if okFwd { fwdRecordCnt += 1 - sink <- generateSingleRecord(n1, n2, speedFwd, true) + sink <- generateSingleRecord(n1, n2, speedsFwd[i], true) } if okBwd { bwdRecordCnt += 1 - sink <- generateSingleRecord(n1, n2, speedBwd, false) + sink <- generateSingleRecord(n1, n2, speedsBwd[i], false) } } @@ -109,6 +128,17 @@ func task(wayid2speed map[int64]int, source <-chan string, sink chan<- string, d tasksWg.Done() } +func getSpeedOfSegments(segments []*trafficproxy.SegmentedFlow, speeds []int, nodesCnt uint64) { + for _, segment := range segments { + indexOfBegin := int(math.Floor(float64(nodesCnt) * float64(segment.Begin) / 100)) + indexOfEnd := int(math.Floor(float64(nodesCnt) * float64(segment.End) / 100)) + + for i := indexOfBegin; i < indexOfEnd; i++ { + speeds[i] = int(segment.Speed) + } + } +} + // format // if dir = true, means traffic for forward, generate: from, to, speed // if dir = false, means this speed is for backward flow, generate: to, from, speed diff --git a/integration/cmd/osrm-traffic-updater/speed_table_dumper_test.go b/integration/cmd/osrm-traffic-updater/speed_table_dumper_test.go index 27094f9b1cf..6b344ea787d 100644 --- a/integration/cmd/osrm-traffic-updater/speed_table_dumper_test.go +++ b/integration/cmd/osrm-traffic-updater/speed_table_dumper_test.go @@ -11,6 +11,8 @@ import ( "strconv" "strings" "testing" + + "github.com/Telenav/osrm-backend/integration/traffic/livetraffic/trafficproxy" ) func TestSpeedTableDumper1(t *testing.T) { @@ -23,16 +25,41 @@ func TestSpeedTableDumper1(t *testing.T) { // construct mock traffic wayid2speed := make(map[int64]int) + segmentsOfWay := make(map[int64][]*trafficproxy.SegmentedFlow) loadMockTrafficFlow2Map(wayid2speed) var ds dumperStatistic ds.Init(TASKNUM) - dumpSpeedTable4Customize(wayid2speed, sources, "./testdata/target.csv", &ds) + dumpSpeedTable4Customize(wayid2speed, segmentsOfWay, sources, "./testdata/target.csv", &ds) compareFileContentUnstable("./testdata/target.csv", "./testdata/expect.csv", t) validateStatistic(&ds, t) } +func TestSpeedTableDumper2(t *testing.T) { + // load result into sources + var sources [TASKNUM]chan string + for i := range sources { + sources[i] = make(chan string, 10000) + } + go loadWay2NodeidsTable("./testdata/id-mapping-segment.csv.snappy", sources) + + // construct mock traffic + wayid2speed := make(map[int64]int) + wayid2speed[733690162] = 60 + wayid2speed[-733689924] = 60 + + segmentsOfWay := make(map[int64][]*trafficproxy.SegmentedFlow) + loadMockTrafficFlowSegment2Map(segmentsOfWay) + + var ds dumperStatistic + ds.Init(TASKNUM) + dumpSpeedTable4Customize(wayid2speed, segmentsOfWay, sources, "./testdata/target-segment.csv", &ds) + + compareFileContentUnstable("./testdata/target-segment.csv", "./testdata/expect-segment.csv", t) + // validateStatistic(&ds, t) +} + func TestGenerateSingleRecord1(t *testing.T) { str := generateSingleRecord(12345, 54321, 33, true) if strings.Compare(str, "12345,54321,33\n") != 0 { @@ -62,6 +89,11 @@ func loadMockTrafficFlow2Map(wayid2speed map[int64]int) { wayid2speed[-24418344] = 59 } +func loadMockTrafficFlowSegment2Map(segmentsOfWay map[int64][]*trafficproxy.SegmentedFlow) { + segmentsOfWay[733690162] = []*trafficproxy.SegmentedFlow{{Speed: 25, Begin: 25, End: 75}} + segmentsOfWay[-733689924] = []*trafficproxy.SegmentedFlow{{Speed: 25, Begin: 10, End: 50}} +} + type tNodePair struct { f, t uint64 } diff --git a/integration/cmd/osrm-traffic-updater/testdata/expect-segment.csv b/integration/cmd/osrm-traffic-updater/testdata/expect-segment.csv new file mode 100755 index 00000000000..ee8143a76da --- /dev/null +++ b/integration/cmd/osrm-traffic-updater/testdata/expect-segment.csv @@ -0,0 +1,11 @@ +1253042677,6871726226,25 +6871775001,1253042677,25 +6871775003,6871775001,60 +6871726248,6871775003,60 +6871726238,6871744979,60 +6871744979,6871744978,60 +6871744978,6871744977,25 +6871744977,6871744976,25 +6871744976,6871744975,25 +6871744975,6871744974,25 +6871744974,6871744973,60 diff --git a/integration/cmd/osrm-traffic-updater/testdata/id-mapping-segment.csv b/integration/cmd/osrm-traffic-updater/testdata/id-mapping-segment.csv new file mode 100755 index 00000000000..c0036c7e83b --- /dev/null +++ b/integration/cmd/osrm-traffic-updater/testdata/id-mapping-segment.csv @@ -0,0 +1,2 @@ +733690162,6871726238,6871744979,6871744978,6871744977,6871744976,6871744975,6871744974,6871744973 +733689924,6871726226,1253042677,6871775001,6871775003,6871726248 diff --git a/integration/cmd/osrm-traffic-updater/testdata/id-mapping-segment.csv.snappy b/integration/cmd/osrm-traffic-updater/testdata/id-mapping-segment.csv.snappy new file mode 100755 index 00000000000..f7a549ab7d6 Binary files /dev/null and b/integration/cmd/osrm-traffic-updater/testdata/id-mapping-segment.csv.snappy differ diff --git a/integration/traffic/livetraffic/trafficproxy/csv_string_test.go b/integration/traffic/livetraffic/trafficproxy/csv_string_test.go index 4a4f74d4cfa..83fd7d0429d 100644 --- a/integration/traffic/livetraffic/trafficproxy/csv_string_test.go +++ b/integration/traffic/livetraffic/trafficproxy/csv_string_test.go @@ -10,14 +10,14 @@ func TestFlowCSVString(t *testing.T) { humanFriendlyCSVString string }{ { - Flow{WayID: 829733412, Speed: 20.280001, TrafficLevel: TrafficLevel_FREE_FLOW, Timestamp: 1579419488000}, - "829733412,20.280001,7,1579419488000", - "829733412,20.280001,FREE_FLOW,1579419488000", + Flow{WayID: 829733412, Speed: 20.280001, TrafficLevel: TrafficLevel_FREE_FLOW, Timestamp: 1579419488000, SegmentedFlow: []*SegmentedFlow{{Speed: 25, Begin: 25, End: 75}}}, + "829733412,20.280001,7,1579419488000,[speed:25 begin:25 end:75 ]", + "829733412,20.280001,FREE_FLOW,1579419488000,[speed:25 begin:25 end:75 ]", }, { - Flow{WayID: -129639168, Speed: 31.389999, TrafficLevel: TrafficLevel_FREE_FLOW, Timestamp: 1579419488000}, - "-129639168,31.389999,7,1579419488000", - "-129639168,31.389999,FREE_FLOW,1579419488000", + Flow{WayID: -129639168, Speed: 31.389999, TrafficLevel: TrafficLevel_FREE_FLOW, Timestamp: 1579419488000, SegmentedFlow: []*SegmentedFlow{}}, + "-129639168,31.389999,7,1579419488000,[]", + "-129639168,31.389999,FREE_FLOW,1579419488000,[]", }, } diff --git a/integration/traffic/livetraffic/trafficproxy/flow_extension.go b/integration/traffic/livetraffic/trafficproxy/flow_extension.go index 16715bb7a7c..5bb52c95546 100644 --- a/integration/traffic/livetraffic/trafficproxy/flow_extension.go +++ b/integration/traffic/livetraffic/trafficproxy/flow_extension.go @@ -12,11 +12,11 @@ func (f *Flow) IsBlocking() bool { // CSVString represents Flow as defined CSV format. // I.e. 'wayID,Speed,TrafficLevel,Timestamp' func (f *Flow) CSVString() string { - return fmt.Sprintf("%d,%f,%d,%d", f.WayID, f.Speed, f.TrafficLevel, f.Timestamp) + return fmt.Sprintf("%d,%f,%d,%d,%v", f.WayID, f.Speed, f.TrafficLevel, f.Timestamp, f.SegmentedFlow) } // HumanFriendlyCSVString represents Flow as defined CSV format, but prefer human friendly string instead of integer. // I.e. 'wayID,Speed,TrafficLevel,Timestamp' func (f *Flow) HumanFriendlyCSVString() string { - return fmt.Sprintf("%d,%f,%s,%d", f.WayID, f.Speed, f.TrafficLevel, f.Timestamp) + return fmt.Sprintf("%d,%f,%s,%d,%v", f.WayID, f.Speed, f.TrafficLevel, f.Timestamp, f.SegmentedFlow) } diff --git a/integration/traffic/livetraffic/trafficproxy/trafficproxy.pb.go b/integration/traffic/livetraffic/trafficproxy/trafficproxy.pb.go index 13f01dadced..a21bf55c279 100644 --- a/integration/traffic/livetraffic/trafficproxy/trafficproxy.pb.go +++ b/integration/traffic/livetraffic/trafficproxy/trafficproxy.pb.go @@ -651,21 +651,85 @@ func (m *FlowResponse) GetTrasctionID() string { return "" } -type Flow struct { - WayID int64 `protobuf:"zigzag64,1,opt,name=wayID,proto3" json:"wayID,omitempty"` - Speed float32 `protobuf:"fixed32,2,opt,name=speed,proto3" json:"speed,omitempty"` - TrafficLevel TrafficLevel `protobuf:"varint,3,opt,name=trafficLevel,proto3,enum=trafficproxy.TrafficLevel" json:"trafficLevel,omitempty"` - Timestamp int64 `protobuf:"varint,4,opt,name=timestamp,proto3" json:"timestamp,omitempty"` +type SegmentedFlow struct { + Speed float32 `protobuf:"fixed32,1,opt,name=speed,proto3" json:"speed,omitempty"` + TrafficLevel TrafficLevel `protobuf:"varint,2,opt,name=trafficLevel,proto3,enum=trafficproxy.TrafficLevel" json:"trafficLevel,omitempty"` + Begin int32 `protobuf:"varint,3,opt,name=begin,proto3" json:"begin,omitempty"` + End int32 `protobuf:"varint,4,opt,name=end,proto3" json:"end,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } +func (m *SegmentedFlow) Reset() { *m = SegmentedFlow{} } +func (m *SegmentedFlow) String() string { return proto.CompactTextString(m) } +func (*SegmentedFlow) ProtoMessage() {} +func (*SegmentedFlow) Descriptor() ([]byte, []int) { + return fileDescriptor_9c857d02e32d0eb6, []int{7} +} + +func (m *SegmentedFlow) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SegmentedFlow.Unmarshal(m, b) +} +func (m *SegmentedFlow) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SegmentedFlow.Marshal(b, m, deterministic) +} +func (m *SegmentedFlow) XXX_Merge(src proto.Message) { + xxx_messageInfo_SegmentedFlow.Merge(m, src) +} +func (m *SegmentedFlow) XXX_Size() int { + return xxx_messageInfo_SegmentedFlow.Size(m) +} +func (m *SegmentedFlow) XXX_DiscardUnknown() { + xxx_messageInfo_SegmentedFlow.DiscardUnknown(m) +} + +var xxx_messageInfo_SegmentedFlow proto.InternalMessageInfo + +func (m *SegmentedFlow) GetSpeed() float32 { + if m != nil { + return m.Speed + } + return 0 +} + +func (m *SegmentedFlow) GetTrafficLevel() TrafficLevel { + if m != nil { + return m.TrafficLevel + } + return TrafficLevel_NO_LEVELS +} + +func (m *SegmentedFlow) GetBegin() int32 { + if m != nil { + return m.Begin + } + return 0 +} + +func (m *SegmentedFlow) GetEnd() int32 { + if m != nil { + return m.End + } + return 0 +} + +type Flow struct { + WayID int64 `protobuf:"zigzag64,1,opt,name=wayID,proto3" json:"wayID,omitempty"` + Speed float32 `protobuf:"fixed32,2,opt,name=speed,proto3" json:"speed,omitempty"` + TrafficLevel TrafficLevel `protobuf:"varint,3,opt,name=trafficLevel,proto3,enum=trafficproxy.TrafficLevel" json:"trafficLevel,omitempty"` + Timestamp int64 `protobuf:"varint,4,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + SegmentedFlow []*SegmentedFlow `protobuf:"bytes,5,rep,name=segmentedFlow,proto3" json:"segmentedFlow,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + func (m *Flow) Reset() { *m = Flow{} } func (m *Flow) String() string { return proto.CompactTextString(m) } func (*Flow) ProtoMessage() {} func (*Flow) Descriptor() ([]byte, []int) { - return fileDescriptor_9c857d02e32d0eb6, []int{7} + return fileDescriptor_9c857d02e32d0eb6, []int{8} } func (m *Flow) XXX_Unmarshal(b []byte) error { @@ -714,6 +778,13 @@ func (m *Flow) GetTimestamp() int64 { return 0 } +func (m *Flow) GetSegmentedFlow() []*SegmentedFlow { + if m != nil { + return m.SegmentedFlow + } + return nil +} + type IncidentResponse struct { Incident *Incident `protobuf:"bytes,1,opt,name=incident,proto3" json:"incident,omitempty"` Action Action `protobuf:"varint,2,opt,name=action,proto3,enum=trafficproxy.Action" json:"action,omitempty"` @@ -727,7 +798,7 @@ func (m *IncidentResponse) Reset() { *m = IncidentResponse{} } func (m *IncidentResponse) String() string { return proto.CompactTextString(m) } func (*IncidentResponse) ProtoMessage() {} func (*IncidentResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_9c857d02e32d0eb6, []int{8} + return fileDescriptor_9c857d02e32d0eb6, []int{9} } func (m *IncidentResponse) XXX_Unmarshal(b []byte) error { @@ -792,7 +863,7 @@ func (m *Incident) Reset() { *m = Incident{} } func (m *Incident) String() string { return proto.CompactTextString(m) } func (*Incident) ProtoMessage() {} func (*Incident) Descriptor() ([]byte, []int) { - return fileDescriptor_9c857d02e32d0eb6, []int{9} + return fileDescriptor_9c857d02e32d0eb6, []int{10} } func (m *Incident) XXX_Unmarshal(b []byte) error { @@ -916,7 +987,7 @@ func (m *Location) Reset() { *m = Location{} } func (m *Location) String() string { return proto.CompactTextString(m) } func (*Location) ProtoMessage() {} func (*Location) Descriptor() ([]byte, []int) { - return fileDescriptor_9c857d02e32d0eb6, []int{10} + return fileDescriptor_9c857d02e32d0eb6, []int{11} } func (m *Location) XXX_Unmarshal(b []byte) error { @@ -965,6 +1036,7 @@ func init() { proto.RegisterType((*TrafficResponse)(nil), "trafficproxy.TrafficResponse") proto.RegisterType((*TrafficSource)(nil), "trafficproxy.TrafficSource") proto.RegisterType((*FlowResponse)(nil), "trafficproxy.FlowResponse") + proto.RegisterType((*SegmentedFlow)(nil), "trafficproxy.SegmentedFlow") proto.RegisterType((*Flow)(nil), "trafficproxy.Flow") proto.RegisterType((*IncidentResponse)(nil), "trafficproxy.IncidentResponse") proto.RegisterType((*Incident)(nil), "trafficproxy.Incident") @@ -974,81 +1046,85 @@ func init() { func init() { proto.RegisterFile("trafficproxy.proto", fileDescriptor_9c857d02e32d0eb6) } var fileDescriptor_9c857d02e32d0eb6 = []byte{ - // 1169 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0xdd, 0x8e, 0xdb, 0x44, - 0x1b, 0x8e, 0x37, 0xff, 0x6f, 0x7e, 0x76, 0x76, 0xbe, 0xfd, 0xaa, 0xb0, 0x2c, 0x25, 0x8a, 0x44, - 0x15, 0x45, 0xd5, 0x0a, 0x05, 0x0e, 0x90, 0x90, 0x10, 0x8e, 0x3d, 0x6d, 0xdc, 0xba, 0x76, 0x3a, - 0x76, 0xba, 0x88, 0x03, 0x22, 0x37, 0x99, 0x54, 0x16, 0x49, 0x1c, 0x6c, 0xef, 0xb6, 0xcb, 0x05, - 0x70, 0x0c, 0x27, 0x9c, 0x73, 0x2d, 0xdc, 0x00, 0x17, 0xc0, 0x5d, 0x70, 0xc2, 0x21, 0x9a, 0xb1, - 0x9d, 0xd8, 0x89, 0xb7, 0xe2, 0x80, 0xb3, 0xbc, 0xcf, 0xfb, 0xcc, 0xf3, 0xfe, 0xce, 0xc4, 0x80, - 0x43, 0xdf, 0x59, 0x2e, 0xdd, 0xf9, 0xd6, 0xf7, 0xde, 0xdd, 0x5d, 0x6d, 0x7d, 0x2f, 0xf4, 0x70, - 0x33, 0x8d, 0xf5, 0xfe, 0x2c, 0x42, 0xdb, 0x8e, 0x00, 0xca, 0x7e, 0xb8, 0x61, 0x41, 0x88, 0x65, - 0x68, 0xc5, 0x14, 0xcb, 0xbb, 0xf1, 0xe7, 0xac, 0x23, 0x75, 0xa5, 0x7e, 0x63, 0xf8, 0xe1, 0x55, - 0x46, 0xcc, 0x4e, 0x53, 0x68, 0xf6, 0x04, 0xfe, 0x12, 0x1a, 0x31, 0x60, 0xdf, 0x6d, 0x59, 0xe7, - 0xa4, 0x5b, 0xec, 0xb7, 0x87, 0x1f, 0xe4, 0x0a, 0x70, 0x02, 0x4d, 0xb3, 0xb1, 0x09, 0x67, 0xb1, - 0x29, 0xaf, 0x56, 0x71, 0x52, 0x9d, 0xa2, 0xc8, 0xe1, 0xe3, 0x5c, 0x89, 0x3d, 0x6d, 0x5c, 0xa0, - 0xc7, 0x67, 0xf1, 0x37, 0x70, 0x1e, 0x83, 0xd7, 0xce, 0x9d, 0xa6, 0x06, 0x89, 0x66, 0x49, 0x68, - 0xf6, 0x72, 0x35, 0x33, 0xcc, 0x71, 0x81, 0xe6, 0x2a, 0xe0, 0x2d, 0x5c, 0x26, 0x85, 0x87, 0x3e, - 0x73, 0xd6, 0xee, 0xe6, 0x8d, 0xca, 0x56, 0xa1, 0x93, 0x44, 0x28, 0x8b, 0x08, 0x83, 0xfc, 0xce, - 0xe5, 0x9d, 0x18, 0x17, 0xe8, 0x7b, 0x15, 0xf1, 0x25, 0xd4, 0x43, 0x77, 0xcd, 0x82, 0xd0, 0x59, - 0x6f, 0x3b, 0x95, 0xae, 0xd4, 0x2f, 0xd2, 0x3d, 0x30, 0x3a, 0x85, 0x96, 0x1f, 0x11, 0x67, 0xde, - 0x86, 0x79, 0xcb, 0xde, 0xff, 0xe0, 0xec, 0xa8, 0x49, 0xbd, 0x2b, 0x38, 0xcf, 0xab, 0x12, 0x3f, - 0x80, 0xca, 0x5b, 0x01, 0x74, 0xa4, 0x6e, 0xb1, 0x8f, 0x69, 0x6c, 0xf5, 0x7e, 0x97, 0xe0, 0xf2, - 0x7d, 0x49, 0xe3, 0xef, 0xa0, 0x15, 0x24, 0x0e, 0x7a, 0xb3, 0x4a, 0x36, 0xe6, 0x8b, 0x7f, 0x5f, - 0xf7, 0x95, 0x95, 0x3e, 0x4f, 0xb3, 0x72, 0x17, 0x0a, 0xb4, 0x32, 0x7e, 0xdc, 0x81, 0xea, 0xda, - 0x79, 0x67, 0xb9, 0x3f, 0x46, 0xa1, 0xca, 0x34, 0x31, 0x63, 0x8f, 0xed, 0xae, 0xf9, 0xd6, 0x25, - 0x1e, 0x6e, 0xf6, 0x7e, 0x93, 0xe0, 0x74, 0xb7, 0xe9, 0xc1, 0xd6, 0xdb, 0x04, 0x0c, 0x7f, 0x0d, - 0xad, 0xe5, 0xca, 0x7b, 0x9b, 0xd8, 0x51, 0xe1, 0x8d, 0xe1, 0x45, 0x36, 0xf1, 0x27, 0x29, 0x0a, - 0xcd, 0x1e, 0xc0, 0x3a, 0x9c, 0xb9, 0x9b, 0xb9, 0xbb, 0x60, 0x9b, 0x70, 0xaf, 0x72, 0x22, 0x54, - 0x1e, 0x66, 0x55, 0xb4, 0x03, 0x1a, 0x3d, 0x3e, 0xd8, 0xfb, 0x45, 0x82, 0x56, 0xe6, 0x62, 0xf1, - 0x99, 0xf8, 0xec, 0x8d, 0xeb, 0x6d, 0x44, 0xa1, 0x75, 0x1a, 0x5b, 0xb8, 0x0f, 0xa7, 0xb1, 0xfa, - 0xc4, 0xf7, 0x6e, 0xdd, 0x05, 0xf3, 0x45, 0xbd, 0x75, 0x7a, 0x08, 0xe3, 0x2e, 0x34, 0xd6, 0xce, - 0x76, 0xc7, 0x2a, 0x0a, 0x56, 0x1a, 0xe2, 0x3b, 0x15, 0xdc, 0xbc, 0x8e, 0xc3, 0x94, 0xba, 0xc5, - 0x7e, 0x9d, 0xee, 0x81, 0xde, 0x4f, 0x12, 0x34, 0xd3, 0x1d, 0xc0, 0x8f, 0xa0, 0xc4, 0x7b, 0x10, - 0x0f, 0x19, 0xe7, 0xf4, 0x4a, 0xf8, 0xf1, 0x63, 0xa8, 0x38, 0xf3, 0x90, 0x6b, 0xf2, 0xcc, 0xda, - 0xc3, 0xf3, 0x2c, 0x53, 0x16, 0x3e, 0x1a, 0x73, 0x78, 0x9a, 0xa1, 0xef, 0x04, 0xc2, 0xd0, 0xd4, - 0x24, 0xcd, 0x14, 0xd4, 0xfb, 0x59, 0x82, 0x12, 0x97, 0xc7, 0xe7, 0x50, 0x16, 0x9b, 0x29, 0x32, - 0xc0, 0x34, 0x32, 0x38, 0x1a, 0x6c, 0x19, 0x5b, 0x88, 0x68, 0x27, 0x34, 0x32, 0xf0, 0x57, 0x90, - 0xbc, 0x77, 0x3a, 0xbb, 0x65, 0x2b, 0xa1, 0xdb, 0x3e, 0x1c, 0xb0, 0x9d, 0x62, 0xd0, 0x0c, 0x3f, - 0x7b, 0xdf, 0x4a, 0x07, 0xf7, 0xad, 0xf7, 0xab, 0x04, 0xe8, 0x70, 0xae, 0x78, 0x08, 0xb5, 0x64, - 0xb2, 0x71, 0x8f, 0x1e, 0xdc, 0xb3, 0x09, 0x3b, 0xde, 0x7f, 0xde, 0xab, 0x3f, 0x4a, 0x50, 0x4b, - 0xc2, 0xe0, 0x87, 0x00, 0x49, 0xa0, 0xb8, 0x69, 0x75, 0x9a, 0x42, 0xf0, 0x23, 0x68, 0x3b, 0xcb, - 0x25, 0x9b, 0x87, 0x6c, 0x11, 0x3d, 0x08, 0x62, 0x81, 0x31, 0x3d, 0x40, 0x79, 0x2f, 0x93, 0x53, - 0xe2, 0x59, 0xcf, 0xed, 0xa5, 0x96, 0x62, 0xd0, 0x0c, 0x1f, 0x3f, 0x03, 0x94, 0xd8, 0x16, 0xbb, - 0x65, 0xbe, 0x1b, 0xde, 0x89, 0x96, 0xb6, 0xef, 0xbb, 0x2a, 0x09, 0x8b, 0x1e, 0x9d, 0xc3, 0xa3, - 0xbd, 0x96, 0xee, 0xcd, 0x1d, 0xd1, 0xba, 0x72, 0x5e, 0xb3, 0x13, 0x2f, 0x3d, 0xe2, 0xf3, 0x36, - 0x2e, 0x58, 0x30, 0xf7, 0xdd, 0xad, 0x38, 0x5e, 0x89, 0xda, 0x98, 0x82, 0xf0, 0x00, 0xd0, 0xd2, - 0xf5, 0x83, 0x50, 0xf1, 0xbd, 0x20, 0xe0, 0x4f, 0x10, 0x0b, 0x3b, 0x55, 0x41, 0x3b, 0xc2, 0xf1, - 0x63, 0x38, 0x0b, 0xd8, 0xdc, 0xdb, 0x2c, 0xd2, 0xe4, 0x9a, 0x20, 0x1f, 0x3b, 0xf8, 0x4c, 0x02, - 0xf1, 0xcb, 0x70, 0xd6, 0xac, 0x53, 0x8f, 0x66, 0xb2, 0x47, 0xf8, 0xde, 0xb1, 0x5b, 0xb6, 0x09, - 0x15, 0x6f, 0xc1, 0x3a, 0x20, 0x5e, 0xb2, 0x3d, 0x80, 0x3f, 0x87, 0xff, 0x3b, 0x2b, 0xe6, 0x87, - 0x0a, 0xe1, 0xd0, 0xcb, 0x1b, 0x67, 0x13, 0xba, 0x4b, 0x97, 0xf9, 0x9d, 0x86, 0x60, 0xe6, 0x3b, - 0xc5, 0x1e, 0x04, 0xa3, 0x95, 0x37, 0xff, 0xde, 0xdd, 0xbc, 0xe9, 0x34, 0xbb, 0x52, 0xbf, 0x46, - 0x53, 0x48, 0x76, 0xd7, 0x5b, 0x87, 0xbb, 0x7e, 0x05, 0xb5, 0x5d, 0xe7, 0x10, 0x14, 0x57, 0x4e, - 0xb4, 0xdd, 0x12, 0xe5, 0x3f, 0x05, 0x12, 0x6f, 0x2f, 0x47, 0xbc, 0xcd, 0xe0, 0x13, 0x68, 0xa4, - 0xfe, 0xe2, 0x71, 0x0d, 0x4a, 0x4f, 0x74, 0xf3, 0x1a, 0x15, 0x70, 0x13, 0x6a, 0x9a, 0xa1, 0x68, - 0x2a, 0x31, 0x6c, 0x24, 0x0d, 0x16, 0xd0, 0x4c, 0x5f, 0x3f, 0xdc, 0x82, 0xba, 0x61, 0xce, 0x74, - 0xf2, 0x8a, 0xe8, 0x16, 0x2a, 0x60, 0x80, 0x8a, 0xa2, 0x9b, 0x16, 0x51, 0x91, 0xc4, 0x5d, 0x8a, - 0x69, 0x3c, 0x25, 0x96, 0x4d, 0x54, 0x54, 0xc4, 0x6d, 0x00, 0x4b, 0x37, 0xaf, 0x67, 0xd6, 0x84, - 0x10, 0x15, 0x95, 0xb9, 0xfb, 0x09, 0x25, 0x64, 0x26, 0xc2, 0x54, 0x71, 0x03, 0xaa, 0x53, 0xe3, - 0xb9, 0x61, 0x5e, 0x1b, 0x08, 0x06, 0x5d, 0xa8, 0x44, 0x77, 0x88, 0x0b, 0x4e, 0x27, 0xaa, 0x6c, - 0x93, 0x48, 0x5c, 0x25, 0x3a, 0xb1, 0x09, 0x92, 0x06, 0x7f, 0x49, 0xd0, 0x4c, 0xef, 0x2e, 0x4f, - 0x53, 0x56, 0xe2, 0x34, 0x0b, 0x3c, 0x58, 0x1c, 0x5b, 0x33, 0x0d, 0x24, 0x61, 0x04, 0x4d, 0xc5, - 0x34, 0x2c, 0x9b, 0x4e, 0x15, 0x81, 0x9c, 0xe0, 0x73, 0x40, 0xaa, 0x66, 0xc9, 0x23, 0x9d, 0xa8, - 0xb3, 0x57, 0x64, 0xac, 0x29, 0x3a, 0x41, 0x45, 0x5c, 0x87, 0x32, 0x79, 0xc5, 0x25, 0x4a, 0xf8, - 0x0c, 0x5a, 0x2f, 0x34, 0x4b, 0x21, 0xba, 0x2e, 0x1b, 0xc4, 0x9c, 0x5a, 0xa8, 0xcc, 0xa1, 0x89, - 0x2e, 0x1b, 0x06, 0x51, 0x67, 0x11, 0xab, 0x82, 0x4f, 0xa1, 0x41, 0x4d, 0x59, 0x9d, 0x8d, 0xe5, - 0x6f, 0x65, 0xaa, 0xa2, 0x2a, 0xbe, 0x80, 0x07, 0x96, 0x32, 0x26, 0xea, 0x94, 0x0b, 0x67, 0x62, - 0xd6, 0x78, 0x8d, 0xd7, 0x44, 0xb6, 0xc7, 0x84, 0xa2, 0x3a, 0xaf, 0x66, 0x62, 0xea, 0x9a, 0x42, - 0x10, 0xf0, 0xf4, 0x84, 0x0a, 0xef, 0xdd, 0x94, 0x12, 0xd4, 0xe0, 0xe9, 0x45, 0x88, 0x69, 0xd8, - 0x54, 0x8e, 0x04, 0x9a, 0x03, 0x6b, 0xff, 0x7e, 0xed, 0xae, 0x56, 0x03, 0xaa, 0x23, 0xdd, 0x54, - 0x9e, 0x13, 0x1a, 0x0d, 0x4b, 0xa1, 0x9a, 0xad, 0x29, 0xb2, 0x8e, 0x24, 0x5e, 0xcd, 0x0b, 0xf9, - 0x99, 0x49, 0xd1, 0x89, 0xf8, 0xa9, 0x19, 0x26, 0x8d, 0x06, 0xc1, 0xe7, 0xa0, 0xbd, 0x98, 0xc8, - 0x8a, 0x8d, 0x4a, 0xc3, 0xf9, 0xee, 0x93, 0xd2, 0x62, 0xfe, 0xad, 0x3b, 0x67, 0xf8, 0x25, 0xb4, - 0x9f, 0xb2, 0x30, 0x06, 0x55, 0x27, 0x74, 0xf0, 0x65, 0xee, 0x0b, 0x1c, 0x7f, 0x0d, 0x5c, 0x7c, - 0x74, 0x8f, 0x37, 0x7a, 0x61, 0x7b, 0x85, 0x4f, 0xa5, 0x51, 0xf1, 0x6f, 0x49, 0x7a, 0x5d, 0x11, - 0x9f, 0xb4, 0x9f, 0xfd, 0x13, 0x00, 0x00, 0xff, 0xff, 0xfa, 0x02, 0x4d, 0xaa, 0xe8, 0x0a, 0x00, - 0x00, + // 1236 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0xcd, 0x6e, 0xdb, 0xc6, + 0x16, 0x16, 0x4d, 0x49, 0x96, 0x8e, 0x7e, 0x3c, 0x9e, 0xeb, 0x1b, 0xe8, 0xfa, 0xfa, 0xe6, 0x0a, + 0x04, 0x1a, 0x08, 0x42, 0x60, 0x14, 0x6e, 0x17, 0x05, 0x0a, 0x14, 0xa5, 0xc9, 0x49, 0xc4, 0x84, + 0x21, 0x9d, 0x21, 0x1d, 0x17, 0x5d, 0x54, 0x60, 0xa4, 0x91, 0x41, 0x54, 0x22, 0x55, 0x92, 0x76, + 0xe2, 0x3e, 0x40, 0x77, 0x5d, 0x74, 0xd3, 0x7d, 0x9f, 0xa5, 0x2f, 0x50, 0xa0, 0xdb, 0xbe, 0x45, + 0x37, 0x5d, 0x16, 0x33, 0x24, 0x2d, 0x52, 0x62, 0x82, 0x16, 0xe8, 0x4e, 0xe7, 0x3b, 0xdf, 0x7c, + 0xe7, 0xcc, 0xf9, 0x19, 0x11, 0x70, 0x12, 0x79, 0x8b, 0x85, 0x3f, 0x5b, 0x47, 0xe1, 0xdb, 0xbb, + 0xd3, 0x75, 0x14, 0x26, 0x21, 0xee, 0x16, 0x31, 0xe5, 0x37, 0x19, 0xfa, 0x6e, 0x0a, 0x50, 0xf6, + 0xcd, 0x0d, 0x8b, 0x13, 0xac, 0x42, 0x2f, 0xa3, 0x38, 0xe1, 0x4d, 0x34, 0x63, 0x03, 0x69, 0x28, + 0x8d, 0x3a, 0x67, 0xff, 0x3d, 0x2d, 0x89, 0xb9, 0x45, 0x0a, 0x2d, 0x9f, 0xc0, 0x9f, 0x42, 0x27, + 0x03, 0xdc, 0xbb, 0x35, 0x1b, 0xec, 0x0d, 0xe5, 0x51, 0xff, 0xec, 0x3f, 0x95, 0x02, 0x9c, 0x40, + 0x8b, 0x6c, 0x6c, 0xc3, 0x61, 0x66, 0xaa, 0xcb, 0x65, 0x96, 0xd4, 0x40, 0x16, 0x39, 0xfc, 0xbf, + 0x52, 0x62, 0x43, 0x9b, 0xd4, 0xe8, 0xee, 0x59, 0xfc, 0x05, 0x1c, 0x65, 0xe0, 0x95, 0x77, 0x67, + 0xe8, 0x71, 0xae, 0x59, 0x17, 0x9a, 0x4a, 0xa5, 0x66, 0x89, 0x39, 0xa9, 0xd1, 0x4a, 0x05, 0xbc, + 0x86, 0x93, 0xfc, 0xe2, 0x49, 0xc4, 0xbc, 0x95, 0x1f, 0x5c, 0xeb, 0x6c, 0x99, 0x78, 0x79, 0x84, + 0x86, 0x88, 0x30, 0xae, 0xae, 0x5c, 0xd5, 0x89, 0x49, 0x8d, 0xbe, 0x57, 0x11, 0x9f, 0x40, 0x3b, + 0xf1, 0x57, 0x2c, 0x4e, 0xbc, 0xd5, 0x7a, 0xd0, 0x1c, 0x4a, 0x23, 0x99, 0x6e, 0x80, 0xf3, 0x03, + 0xe8, 0x45, 0x29, 0x71, 0x1a, 0x06, 0x2c, 0x5c, 0x28, 0xff, 0x82, 0xc3, 0x9d, 0x22, 0x29, 0xa7, + 0x70, 0x54, 0x75, 0x4b, 0xfc, 0x00, 0x9a, 0x6f, 0x04, 0x30, 0x90, 0x86, 0xf2, 0x08, 0xd3, 0xcc, + 0x52, 0x7e, 0x96, 0xe0, 0xe4, 0x7d, 0x49, 0xe3, 0xaf, 0xa0, 0x17, 0xe7, 0x0e, 0x7a, 0xb3, 0xcc, + 0x27, 0xe6, 0x93, 0xbf, 0x7e, 0xef, 0x53, 0xa7, 0x78, 0x9e, 0x96, 0xe5, 0x8e, 0x35, 0xe8, 0x95, + 0xfc, 0x78, 0x00, 0xfb, 0x2b, 0xef, 0xad, 0xe3, 0x7f, 0x9b, 0x86, 0x6a, 0xd0, 0xdc, 0xcc, 0x3c, + 0xae, 0xbf, 0xe2, 0x53, 0x97, 0x7b, 0xb8, 0xa9, 0xfc, 0x24, 0xc1, 0xc1, 0xfd, 0xa4, 0xc7, 0xeb, + 0x30, 0x88, 0x19, 0xfe, 0x1c, 0x7a, 0x8b, 0x65, 0xf8, 0x26, 0xb7, 0xd3, 0x8b, 0x77, 0xce, 0x8e, + 0xcb, 0x89, 0x3f, 0x29, 0x50, 0x68, 0xf9, 0x00, 0x36, 0xe1, 0xd0, 0x0f, 0x66, 0xfe, 0x9c, 0x05, + 0xc9, 0x46, 0x65, 0x4f, 0xa8, 0x3c, 0x2c, 0xab, 0x18, 0x5b, 0x34, 0xba, 0x7b, 0x50, 0xf9, 0x41, + 0x82, 0x5e, 0x69, 0xb1, 0x78, 0x4f, 0x22, 0x76, 0xed, 0x87, 0x81, 0xb8, 0x68, 0x9b, 0x66, 0x16, + 0x1e, 0xc1, 0x41, 0xa6, 0x7e, 0x11, 0x85, 0xb7, 0xfe, 0x9c, 0x45, 0xe2, 0xbe, 0x6d, 0xba, 0x0d, + 0xe3, 0x21, 0x74, 0x56, 0xde, 0xfa, 0x9e, 0x25, 0x0b, 0x56, 0x11, 0xe2, 0x33, 0x15, 0xdf, 0xbc, + 0xce, 0xc2, 0xd4, 0x87, 0xf2, 0xa8, 0x4d, 0x37, 0x80, 0xf2, 0x9d, 0x04, 0xdd, 0x62, 0x05, 0xf0, + 0x23, 0xa8, 0xf3, 0x1a, 0x64, 0x4d, 0xc6, 0x15, 0xb5, 0x12, 0x7e, 0xfc, 0x18, 0x9a, 0xde, 0x2c, + 0xe1, 0x9a, 0x3c, 0xb3, 0xfe, 0xd9, 0x51, 0x99, 0xa9, 0x0a, 0x1f, 0xcd, 0x38, 0x3c, 0xcd, 0x24, + 0xf2, 0x62, 0x61, 0x18, 0x7a, 0x9e, 0x66, 0x01, 0x52, 0xbe, 0x97, 0xa0, 0xe7, 0xb0, 0xeb, 0x15, + 0x0b, 0x12, 0x36, 0xe7, 0x71, 0xf0, 0x11, 0x34, 0xe2, 0x35, 0x63, 0x73, 0x91, 0xca, 0x1e, 0x4d, + 0x0d, 0xfc, 0x19, 0xe4, 0x4f, 0x9c, 0xc9, 0x6e, 0xd9, 0x32, 0x8b, 0x7e, 0x5c, 0x39, 0x8c, 0x82, + 0x41, 0x4b, 0x7c, 0xae, 0xfa, 0x9a, 0x5d, 0xfb, 0x81, 0xc8, 0xa1, 0x41, 0x53, 0x03, 0x23, 0x90, + 0x59, 0x30, 0x17, 0x6f, 0x46, 0x83, 0xf2, 0x9f, 0xca, 0xaf, 0x12, 0xd4, 0xf3, 0x34, 0xc4, 0xa6, + 0x88, 0x34, 0x30, 0x4d, 0x8d, 0x4d, 0x72, 0x7b, 0xef, 0x4b, 0x4e, 0xfe, 0x9b, 0xc9, 0x95, 0xf6, + 0xbf, 0xbe, 0xb5, 0xff, 0xfc, 0xe9, 0x8e, 0x8b, 0x15, 0x1a, 0x34, 0xc4, 0x24, 0x6e, 0x3d, 0xdd, + 0xa5, 0x22, 0xd2, 0xf2, 0x09, 0xe5, 0x47, 0x09, 0xd0, 0xf6, 0xa8, 0xe2, 0x33, 0x68, 0xe5, 0xc3, + 0x9a, 0xb5, 0xfd, 0xc1, 0x3b, 0x86, 0xfb, 0x9e, 0xf7, 0x8f, 0xb7, 0xff, 0x97, 0x3a, 0xb4, 0xf2, + 0x30, 0xf8, 0x21, 0x40, 0x1e, 0x28, 0xab, 0x7b, 0x9b, 0x16, 0x10, 0xfc, 0x08, 0xfa, 0xde, 0x62, + 0xc1, 0x66, 0x09, 0x9b, 0xa7, 0x6f, 0x9c, 0xd8, 0x49, 0x4c, 0xb7, 0x50, 0xde, 0x8e, 0xfc, 0x94, + 0xf8, 0xa7, 0xaa, 0x6c, 0x87, 0x51, 0x60, 0xd0, 0x12, 0x1f, 0x3f, 0x03, 0x94, 0xdb, 0x0e, 0xbb, + 0x65, 0x91, 0x9f, 0xdc, 0x89, 0xae, 0xf4, 0xdf, 0xb5, 0xfd, 0x39, 0x8b, 0xee, 0x9c, 0xc3, 0xe7, + 0x1b, 0x2d, 0x33, 0x9c, 0x79, 0xa2, 0x74, 0x8d, 0xaa, 0x62, 0xe7, 0x5e, 0xba, 0xc3, 0xe7, 0x65, + 0x9c, 0xb3, 0x78, 0x16, 0xf9, 0x6b, 0x71, 0xbc, 0x99, 0x96, 0xb1, 0x00, 0xe1, 0x31, 0xa0, 0x85, + 0x1f, 0xc5, 0x89, 0x16, 0x85, 0x71, 0xcc, 0x5f, 0x55, 0x96, 0x0c, 0xf6, 0x05, 0x6d, 0x07, 0xc7, + 0x8f, 0xe1, 0x30, 0x66, 0xb3, 0x30, 0x98, 0x17, 0xc9, 0x2d, 0x41, 0xde, 0x75, 0xf0, 0x9e, 0xc4, + 0xe2, 0x97, 0xe5, 0xad, 0xd8, 0xa0, 0x9d, 0xf6, 0x64, 0x83, 0xf0, 0xd1, 0x65, 0xb7, 0x2c, 0x48, + 0xb4, 0x70, 0xce, 0x06, 0x20, 0xf6, 0x68, 0x03, 0xe0, 0x8f, 0xe1, 0xdf, 0xde, 0x92, 0x45, 0x89, + 0x46, 0x38, 0xf4, 0xf2, 0xc6, 0x0b, 0x12, 0x7f, 0xe1, 0xb3, 0x68, 0xd0, 0x11, 0xcc, 0x6a, 0xa7, + 0x98, 0x83, 0xf8, 0x7c, 0x19, 0xce, 0xbe, 0xf6, 0x83, 0xeb, 0x41, 0x77, 0x28, 0x8d, 0x5a, 0xb4, + 0x80, 0x94, 0xd7, 0xa5, 0xb7, 0xb5, 0x2e, 0xca, 0x29, 0xb4, 0xee, 0x2b, 0x87, 0x40, 0x5e, 0x7a, + 0xe9, 0x74, 0x4b, 0x94, 0xff, 0x14, 0x48, 0x36, 0xbd, 0x1c, 0x09, 0x83, 0xf1, 0x07, 0xd0, 0x29, + 0x7c, 0xb5, 0xe0, 0x16, 0xd4, 0x9f, 0x98, 0xf6, 0x15, 0xaa, 0xe1, 0x2e, 0xb4, 0x0c, 0x4b, 0x33, + 0x74, 0x62, 0xb9, 0x48, 0x1a, 0xcf, 0xa1, 0x5b, 0xdc, 0x60, 0xdc, 0x83, 0xb6, 0x65, 0x4f, 0x4d, + 0xf2, 0x8a, 0x98, 0x0e, 0xaa, 0x61, 0x80, 0xa6, 0x66, 0xda, 0x0e, 0xd1, 0x91, 0xc4, 0x5d, 0x9a, + 0x6d, 0x3d, 0x25, 0x8e, 0x4b, 0x74, 0x24, 0xe3, 0x3e, 0x80, 0x63, 0xda, 0x57, 0x53, 0xe7, 0x82, + 0x10, 0x1d, 0x35, 0xb8, 0xfb, 0x09, 0x25, 0x64, 0x2a, 0xc2, 0xec, 0xe3, 0x0e, 0xec, 0x5f, 0x5a, + 0xcf, 0x2d, 0xfb, 0xca, 0x42, 0x30, 0x1e, 0x42, 0x33, 0xdd, 0x21, 0x2e, 0x78, 0x79, 0xa1, 0xab, + 0x2e, 0x49, 0xc5, 0x75, 0x62, 0x12, 0x97, 0x20, 0x69, 0xfc, 0xbb, 0x04, 0xdd, 0xe2, 0xec, 0xf2, + 0x34, 0x55, 0x2d, 0x4b, 0xb3, 0xc6, 0x83, 0x65, 0xb1, 0x0d, 0xdb, 0x42, 0x12, 0x46, 0xd0, 0xd5, + 0x6c, 0xcb, 0x71, 0xe9, 0xa5, 0x26, 0x90, 0x3d, 0x7c, 0x04, 0x48, 0x37, 0x1c, 0xf5, 0xdc, 0x24, + 0xfa, 0xf4, 0x15, 0x99, 0x18, 0x9a, 0x49, 0x90, 0x8c, 0xdb, 0xd0, 0x20, 0xaf, 0xb8, 0x44, 0x1d, + 0x1f, 0x42, 0xef, 0x85, 0xe1, 0x68, 0xc4, 0x34, 0x55, 0x8b, 0xd8, 0x97, 0x0e, 0x6a, 0x70, 0xe8, + 0xc2, 0x54, 0x2d, 0x8b, 0xe8, 0xd3, 0x94, 0xd5, 0xc4, 0x07, 0xd0, 0xa1, 0xb6, 0xaa, 0x4f, 0x27, + 0xea, 0x97, 0x2a, 0xd5, 0xd1, 0x3e, 0x3e, 0x86, 0x07, 0x8e, 0x36, 0x21, 0xfa, 0x25, 0x17, 0x2e, + 0xc5, 0x6c, 0xf1, 0x3b, 0x5e, 0x11, 0xd5, 0x9d, 0x10, 0x8a, 0xda, 0xfc, 0x36, 0x17, 0xb6, 0x69, + 0x68, 0x04, 0x01, 0x4f, 0x4f, 0xa8, 0xf0, 0xda, 0x5d, 0x52, 0x82, 0x3a, 0x3c, 0xbd, 0x14, 0xb1, + 0x2d, 0x97, 0xaa, 0xa9, 0x40, 0x77, 0xec, 0x6c, 0xde, 0xaf, 0xfb, 0xd5, 0xea, 0xc0, 0xfe, 0xb9, + 0x69, 0x6b, 0xcf, 0x09, 0x4d, 0x9b, 0xa5, 0x51, 0xc3, 0x35, 0x34, 0xd5, 0x44, 0x12, 0xbf, 0xcd, + 0x0b, 0xf5, 0x99, 0x4d, 0xd1, 0x9e, 0xf8, 0x69, 0x58, 0x36, 0x4d, 0x1b, 0xc1, 0xfb, 0x60, 0xbc, + 0xb8, 0x50, 0x35, 0x17, 0xd5, 0xcf, 0x66, 0xf7, 0x5f, 0xc9, 0x0e, 0x8b, 0x6e, 0xfd, 0x19, 0xc3, + 0x2f, 0xa1, 0xff, 0x94, 0x25, 0x19, 0xa8, 0x7b, 0x89, 0x87, 0x4f, 0x2a, 0x1f, 0xf1, 0xec, 0x03, + 0xe7, 0xf8, 0x7f, 0xef, 0xf0, 0xa6, 0x2f, 0xac, 0x52, 0xfb, 0x50, 0x3a, 0x97, 0xff, 0x90, 0xa4, + 0xd7, 0x4d, 0xf1, 0x95, 0xfe, 0xd1, 0x9f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x77, 0x47, 0xa2, 0x59, + 0xbb, 0x0b, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/integration/trafficproxy.proto b/integration/trafficproxy.proto index 8f5cefa6311..19087b9fca1 100644 --- a/integration/trafficproxy.proto +++ b/integration/trafficproxy.proto @@ -62,11 +62,19 @@ message FlowResponse { string trasctionID = 3; // unique ID for tracking the Flow from provider to end user } +message SegmentedFlow { + float speed = 1; // unit: meter per second. always >= 0 + TrafficLevel trafficLevel = 2; // `trafficLevel==CLOSED` means blocking Flow + int32 begin = 3; // begin offset percentage, range [0,100) + int32 end = 4; // end offset percentage, range (0, 100], end > begin +} + message Flow { sint64 wayID = 1; // positive means forward, negative means backward float speed = 2; // unit: meter per second. always >= 0 TrafficLevel trafficLevel = 3; // `trafficLevel==CLOSED` means blocking Flow int64 timestamp = 4; // received timestamp from provider, number of milliseconds since the Epoch + repeated SegmentedFlow segmentedFlow = 5; // optional segmented flow, leave empty if no partial flow on the way. } enum TrafficLevel { @@ -132,4 +140,4 @@ enum IncidentSeverity { message Location { double lat = 1; double lon = 2; -} \ No newline at end of file +}