Merge pull request #281 from mlaventure/use-protobuf-timestamp
Use protobuf timestamp
This commit is contained in:
commit
6dd2f1c422
17 changed files with 1212 additions and 175 deletions
|
@ -17,6 +17,7 @@ import (
|
||||||
"github.com/docker/containerd/api/grpc/types"
|
"github.com/docker/containerd/api/grpc/types"
|
||||||
"github.com/docker/containerd/runtime"
|
"github.com/docker/containerd/runtime"
|
||||||
"github.com/docker/containerd/supervisor"
|
"github.com/docker/containerd/supervisor"
|
||||||
|
"github.com/golang/protobuf/ptypes"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -310,16 +311,24 @@ func (s *apiServer) UpdateProcess(ctx context.Context, r *types.UpdateProcessReq
|
||||||
|
|
||||||
func (s *apiServer) Events(r *types.EventsRequest, stream types.API_EventsServer) error {
|
func (s *apiServer) Events(r *types.EventsRequest, stream types.API_EventsServer) error {
|
||||||
t := time.Time{}
|
t := time.Time{}
|
||||||
if r.Timestamp != 0 {
|
if r.Timestamp != nil {
|
||||||
t = time.Unix(int64(r.Timestamp), 0)
|
from, err := ptypes.Timestamp(r.Timestamp)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
t = from
|
||||||
}
|
}
|
||||||
events := s.sv.Events(t)
|
events := s.sv.Events(t)
|
||||||
defer s.sv.Unsubscribe(events)
|
defer s.sv.Unsubscribe(events)
|
||||||
for e := range events {
|
for e := range events {
|
||||||
|
tsp, err := ptypes.TimestampProto(e.Timestamp)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
if err := stream.Send(&types.Event{
|
if err := stream.Send(&types.Event{
|
||||||
Id: e.ID,
|
Id: e.ID,
|
||||||
Type: e.Type,
|
Type: e.Type,
|
||||||
Timestamp: uint64(e.Timestamp.Unix()),
|
Timestamp: tsp,
|
||||||
Pid: e.PID,
|
Pid: e.PID,
|
||||||
Status: uint32(e.Status),
|
Status: uint32(e.Status),
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
|
@ -330,8 +339,9 @@ func (s *apiServer) Events(r *types.EventsRequest, stream types.API_EventsServer
|
||||||
}
|
}
|
||||||
|
|
||||||
func convertToPb(st *runtime.Stat) *types.StatsResponse {
|
func convertToPb(st *runtime.Stat) *types.StatsResponse {
|
||||||
|
tsp, _ := ptypes.TimestampProto(st.Timestamp)
|
||||||
pbSt := &types.StatsResponse{
|
pbSt := &types.StatsResponse{
|
||||||
Timestamp: uint64(st.Timestamp.Unix()),
|
Timestamp: tsp,
|
||||||
CgroupStats: &types.CgroupStats{},
|
CgroupStats: &types.CgroupStats{},
|
||||||
}
|
}
|
||||||
systemUsage, _ := getSystemCPUUsage()
|
systemUsage, _ := getSystemCPUUsage()
|
||||||
|
|
|
@ -58,6 +58,7 @@ package types
|
||||||
import proto "github.com/golang/protobuf/proto"
|
import proto "github.com/golang/protobuf/proto"
|
||||||
import fmt "fmt"
|
import fmt "fmt"
|
||||||
import math "math"
|
import math "math"
|
||||||
|
import google_protobuf "github.com/golang/protobuf/ptypes/timestamp"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
context "golang.org/x/net/context"
|
context "golang.org/x/net/context"
|
||||||
|
@ -480,7 +481,8 @@ func (*UpdateContainerResponse) ProtoMessage() {}
|
||||||
func (*UpdateContainerResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{27} }
|
func (*UpdateContainerResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{27} }
|
||||||
|
|
||||||
type EventsRequest struct {
|
type EventsRequest struct {
|
||||||
Timestamp uint64 `protobuf:"varint,1,opt,name=timestamp" json:"timestamp,omitempty"`
|
// Tag 1 is deprecated (old uint64 timestamp)
|
||||||
|
Timestamp *google_protobuf.Timestamp `protobuf:"bytes,2,opt,name=timestamp" json:"timestamp,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *EventsRequest) Reset() { *m = EventsRequest{} }
|
func (m *EventsRequest) Reset() { *m = EventsRequest{} }
|
||||||
|
@ -488,12 +490,20 @@ func (m *EventsRequest) String() string { return proto.CompactTextStr
|
||||||
func (*EventsRequest) ProtoMessage() {}
|
func (*EventsRequest) ProtoMessage() {}
|
||||||
func (*EventsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28} }
|
func (*EventsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28} }
|
||||||
|
|
||||||
|
func (m *EventsRequest) GetTimestamp() *google_protobuf.Timestamp {
|
||||||
|
if m != nil {
|
||||||
|
return m.Timestamp
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
type Event struct {
|
type Event struct {
|
||||||
Type string `protobuf:"bytes,1,opt,name=type" json:"type,omitempty"`
|
Type string `protobuf:"bytes,1,opt,name=type" json:"type,omitempty"`
|
||||||
Id string `protobuf:"bytes,2,opt,name=id" json:"id,omitempty"`
|
Id string `protobuf:"bytes,2,opt,name=id" json:"id,omitempty"`
|
||||||
Status uint32 `protobuf:"varint,3,opt,name=status" json:"status,omitempty"`
|
Status uint32 `protobuf:"varint,3,opt,name=status" json:"status,omitempty"`
|
||||||
Pid string `protobuf:"bytes,4,opt,name=pid" json:"pid,omitempty"`
|
Pid string `protobuf:"bytes,4,opt,name=pid" json:"pid,omitempty"`
|
||||||
Timestamp uint64 `protobuf:"varint,5,opt,name=timestamp" json:"timestamp,omitempty"`
|
// Tag 5 is deprecated (old uint64 timestamp)
|
||||||
|
Timestamp *google_protobuf.Timestamp `protobuf:"bytes,6,opt,name=timestamp" json:"timestamp,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Event) Reset() { *m = Event{} }
|
func (m *Event) Reset() { *m = Event{} }
|
||||||
|
@ -501,6 +511,13 @@ func (m *Event) String() string { return proto.CompactTextString(m) }
|
||||||
func (*Event) ProtoMessage() {}
|
func (*Event) ProtoMessage() {}
|
||||||
func (*Event) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{29} }
|
func (*Event) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{29} }
|
||||||
|
|
||||||
|
func (m *Event) GetTimestamp() *google_protobuf.Timestamp {
|
||||||
|
if m != nil {
|
||||||
|
return m.Timestamp
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
type NetworkStats struct {
|
type NetworkStats struct {
|
||||||
Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
|
Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
|
||||||
RxBytes uint64 `protobuf:"varint,2,opt,name=rx_bytes,json=rxBytes" json:"rx_bytes,omitempty"`
|
RxBytes uint64 `protobuf:"varint,2,opt,name=rx_bytes,json=rxBytes" json:"rx_bytes,omitempty"`
|
||||||
|
@ -776,7 +793,8 @@ func (m *CgroupStats) GetPidsStats() *PidsStats {
|
||||||
type StatsResponse struct {
|
type StatsResponse struct {
|
||||||
NetworkStats []*NetworkStats `protobuf:"bytes,1,rep,name=network_stats,json=networkStats" json:"network_stats,omitempty"`
|
NetworkStats []*NetworkStats `protobuf:"bytes,1,rep,name=network_stats,json=networkStats" json:"network_stats,omitempty"`
|
||||||
CgroupStats *CgroupStats `protobuf:"bytes,2,opt,name=cgroup_stats,json=cgroupStats" json:"cgroup_stats,omitempty"`
|
CgroupStats *CgroupStats `protobuf:"bytes,2,opt,name=cgroup_stats,json=cgroupStats" json:"cgroup_stats,omitempty"`
|
||||||
Timestamp uint64 `protobuf:"varint,3,opt,name=timestamp" json:"timestamp,omitempty"`
|
// Tag 3 is deprecated (old uint64 timestamp)
|
||||||
|
Timestamp *google_protobuf.Timestamp `protobuf:"bytes,4,opt,name=timestamp" json:"timestamp,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *StatsResponse) Reset() { *m = StatsResponse{} }
|
func (m *StatsResponse) Reset() { *m = StatsResponse{} }
|
||||||
|
@ -798,6 +816,13 @@ func (m *StatsResponse) GetCgroupStats() *CgroupStats {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *StatsResponse) GetTimestamp() *google_protobuf.Timestamp {
|
||||||
|
if m != nil {
|
||||||
|
return m.Timestamp
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
type StatsRequest struct {
|
type StatsRequest struct {
|
||||||
Id string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"`
|
Id string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"`
|
||||||
}
|
}
|
||||||
|
@ -1316,153 +1341,155 @@ var _API_serviceDesc = grpc.ServiceDesc{
|
||||||
}
|
}
|
||||||
|
|
||||||
var fileDescriptor0 = []byte{
|
var fileDescriptor0 = []byte{
|
||||||
// 2361 bytes of a gzipped FileDescriptorProto
|
// 2396 bytes of a gzipped FileDescriptorProto
|
||||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xec, 0x59, 0xcd, 0x73, 0x1b, 0x4b,
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xec, 0x59, 0x4b, 0x93, 0x1b, 0x49,
|
||||||
0x11, 0x8f, 0xbe, 0xad, 0xd6, 0x87, 0xed, 0x8d, 0x3f, 0x14, 0xbd, 0x97, 0xbc, 0xb0, 0xf5, 0x80,
|
0xf1, 0xb7, 0x1e, 0xa3, 0x19, 0xa5, 0x1e, 0x33, 0xd3, 0x1e, 0x8f, 0x65, 0xed, 0xfa, 0xf1, 0xef,
|
||||||
0x00, 0x0f, 0x13, 0x94, 0xf7, 0x8a, 0x14, 0x54, 0x51, 0x95, 0xd8, 0xe1, 0x11, 0x5e, 0x1c, 0x94,
|
0xd8, 0x3f, 0x18, 0xd8, 0x90, 0x8d, 0xbc, 0x1b, 0x38, 0x20, 0x82, 0x08, 0x7b, 0x6c, 0x16, 0xb3,
|
||||||
0xb5, 0xcd, 0x3b, 0xaa, 0xd6, 0xab, 0x89, 0xb4, 0x58, 0xda, 0xdd, 0xec, 0x8e, 0x6c, 0xf9, 0xc2,
|
0x1e, 0x23, 0xf7, 0xcc, 0xb0, 0x47, 0x45, 0x8f, 0x54, 0x96, 0x9a, 0x91, 0xba, 0x7b, 0xbb, 0x4b,
|
||||||
0x81, 0x03, 0xdc, 0x38, 0x53, 0x05, 0xc5, 0x85, 0x1b, 0x77, 0x0e, 0xfc, 0x05, 0x54, 0xf1, 0x87,
|
0x33, 0x9a, 0x0b, 0x07, 0x0e, 0x70, 0x83, 0x2b, 0x11, 0x70, 0xe3, 0xc6, 0x9d, 0x03, 0x7c, 0x01,
|
||||||
0x70, 0xe3, 0xce, 0x91, 0x9e, 0x9e, 0xd9, 0xd9, 0x59, 0x7d, 0xd8, 0xe1, 0x40, 0x71, 0x79, 0x17,
|
0x22, 0xf8, 0x20, 0xdc, 0xb8, 0x73, 0x24, 0x2b, 0xeb, 0xd1, 0xd5, 0x7a, 0xcc, 0xd8, 0x07, 0x82,
|
||||||
0xd5, 0xf4, 0x6f, 0x7a, 0xba, 0x7b, 0xba, 0x7b, 0x7a, 0x7a, 0x47, 0x50, 0x77, 0x23, 0xff, 0x20,
|
0x0b, 0x17, 0x45, 0xe5, 0xaf, 0xb2, 0x32, 0xb3, 0xb2, 0x32, 0xb3, 0xb2, 0x4b, 0x50, 0xf5, 0xe3,
|
||||||
0x8a, 0x43, 0x1e, 0x5a, 0x15, 0x7e, 0x1d, 0xb1, 0xc4, 0xbe, 0x07, 0xfb, 0x9f, 0x33, 0x7e, 0xc2,
|
0xa0, 0x13, 0x27, 0x11, 0x8f, 0x9c, 0x0d, 0x7e, 0x19, 0xb3, 0xb4, 0x7d, 0x7f, 0x14, 0x45, 0xa3,
|
||||||
0xe2, 0x4b, 0x16, 0xff, 0x82, 0xc5, 0x89, 0x1f, 0x06, 0x0e, 0x7b, 0x37, 0x63, 0x09, 0xb7, 0xe7,
|
0x09, 0x7b, 0x44, 0xe0, 0xe9, 0xec, 0xdd, 0x23, 0x1e, 0x4c, 0x59, 0xca, 0xfd, 0x69, 0x2c, 0xf9,
|
||||||
0xd0, 0x59, 0x9e, 0x4a, 0xa2, 0x30, 0x48, 0x98, 0xb5, 0x03, 0x95, 0xa9, 0xfb, 0xcb, 0x30, 0xee,
|
0xdc, 0x3b, 0x70, 0xfb, 0x0b, 0xc6, 0x8f, 0x58, 0x72, 0xce, 0x92, 0x9f, 0xb1, 0x24, 0x0d, 0xa2,
|
||||||
0x14, 0x1e, 0x16, 0x1e, 0xb5, 0x1c, 0x49, 0x10, 0xea, 0x07, 0x88, 0x16, 0x15, 0x2a, 0x08, 0x81,
|
0xd0, 0x63, 0x5f, 0xcf, 0x90, 0xc7, 0x9d, 0x43, 0x6b, 0x79, 0x2a, 0x8d, 0xa3, 0x30, 0x65, 0xce,
|
||||||
0x46, 0x2e, 0xf7, 0xc6, 0x9d, 0x92, 0x44, 0x89, 0xb0, 0xba, 0xb0, 0x11, 0xb3, 0x4b, 0x5f, 0x48,
|
0x1e, 0x6c, 0x4c, 0xfd, 0x9f, 0x47, 0x49, 0xab, 0xf0, 0xa0, 0xf0, 0xb0, 0xe1, 0x49, 0x82, 0xd0,
|
||||||
0xed, 0x94, 0x71, 0xa2, 0xee, 0x68, 0xda, 0xfe, 0x4d, 0x01, 0x76, 0xce, 0xa2, 0xa1, 0xcb, 0x59,
|
0x20, 0x44, 0xb4, 0xa8, 0x50, 0x41, 0x08, 0x34, 0xf6, 0xf9, 0x60, 0xdc, 0x2a, 0x49, 0x94, 0x08,
|
||||||
0x3f, 0x0e, 0x3d, 0x96, 0x24, 0xca, 0x24, 0xab, 0x0d, 0x45, 0x7f, 0x48, 0x3a, 0xeb, 0x0e, 0x8e,
|
0xa7, 0x0d, 0x5b, 0x09, 0x3b, 0x0f, 0x84, 0xd4, 0x56, 0x19, 0x27, 0xaa, 0x9e, 0xa1, 0xdd, 0x5f,
|
||||||
0xac, 0x2d, 0x28, 0x45, 0x08, 0x14, 0x09, 0x10, 0x43, 0xeb, 0x01, 0x80, 0x37, 0x09, 0x13, 0x76,
|
0x15, 0x60, 0xef, 0x24, 0x1e, 0xfa, 0x9c, 0xf5, 0x92, 0x68, 0xc0, 0xd2, 0x54, 0x99, 0xe4, 0x34,
|
||||||
0xc2, 0x87, 0x7e, 0x40, 0x1a, 0x37, 0x1c, 0x03, 0x11, 0xc6, 0x5c, 0xf9, 0x43, 0x3e, 0x26, 0x9d,
|
0xa1, 0x18, 0x0c, 0x49, 0x67, 0xd5, 0xc3, 0x91, 0xb3, 0x03, 0xa5, 0x18, 0x81, 0x22, 0x01, 0x62,
|
||||||
0x68, 0x0c, 0x11, 0xd6, 0x1e, 0x54, 0xc7, 0xcc, 0x1f, 0x8d, 0x79, 0xa7, 0x42, 0xb0, 0xa2, 0xec,
|
0xe8, 0xdc, 0x03, 0x18, 0x4c, 0xa2, 0x94, 0x1d, 0xf1, 0x61, 0x10, 0x92, 0xc6, 0x2d, 0xcf, 0x42,
|
||||||
0x7d, 0xd8, 0x5d, 0xb0, 0x43, 0xee, 0xdf, 0xfe, 0x47, 0x11, 0xf6, 0x0e, 0x63, 0x86, 0x33, 0x87,
|
0x84, 0x31, 0x17, 0xc1, 0x90, 0x8f, 0x49, 0x27, 0x1a, 0x43, 0x84, 0xb3, 0x0f, 0x95, 0x31, 0x0b,
|
||||||
0x61, 0xc0, 0x5d, 0x3f, 0x60, 0xf1, 0x3a, 0x1b, 0xd1, 0xa2, 0xf3, 0x59, 0x30, 0x9c, 0xb0, 0xbe,
|
0x46, 0x63, 0xde, 0xda, 0x20, 0x58, 0x51, 0xee, 0x6d, 0xb8, 0xb5, 0x60, 0x87, 0xdc, 0xbf, 0xfb,
|
||||||
0x8b, 0x6a, 0xa5, 0xa9, 0x06, 0x42, 0x16, 0x8f, 0x99, 0x77, 0x11, 0x85, 0x7e, 0xc0, 0xc9, 0x62,
|
0xf7, 0x22, 0xec, 0x1f, 0x24, 0x0c, 0x67, 0x0e, 0xa2, 0x90, 0xfb, 0x41, 0xc8, 0x92, 0x75, 0x36,
|
||||||
0x9c, 0xcf, 0x10, 0x61, 0x71, 0x42, 0x9b, 0x91, 0x5e, 0x92, 0x84, 0xb0, 0x18, 0x07, 0xe1, 0x4c,
|
0xa2, 0x45, 0xa7, 0xb3, 0x70, 0x38, 0x61, 0x3d, 0x1f, 0xd5, 0x4a, 0x53, 0x2d, 0x84, 0x2c, 0x1e,
|
||||||
0x5a, 0x5c, 0x77, 0x14, 0xa5, 0x70, 0x16, 0xc7, 0x9d, 0xaa, 0xc6, 0x91, 0x12, 0xf8, 0xc4, 0x3d,
|
0xb3, 0xc1, 0x59, 0x1c, 0x05, 0x21, 0x27, 0x8b, 0x71, 0x3e, 0x43, 0x84, 0xc5, 0x29, 0x6d, 0x46,
|
||||||
0x67, 0x93, 0xa4, 0x53, 0x7b, 0x58, 0x12, 0xb8, 0xa4, 0xac, 0x87, 0xd0, 0x08, 0xc2, 0xbe, 0x7f,
|
0x7a, 0x49, 0x12, 0xc2, 0x62, 0x1c, 0x44, 0x33, 0x69, 0x71, 0xd5, 0x53, 0x94, 0xc2, 0x59, 0x92,
|
||||||
0x19, 0x72, 0x27, 0x0c, 0x79, 0x67, 0x83, 0x1c, 0x66, 0x42, 0x56, 0x07, 0x6a, 0xf1, 0x2c, 0xe0,
|
0xb4, 0x2a, 0x06, 0x47, 0x4a, 0xe0, 0x13, 0xff, 0x94, 0x4d, 0xd2, 0xd6, 0xe6, 0x83, 0x92, 0xc0,
|
||||||
0xfe, 0x94, 0x75, 0xea, 0x24, 0x32, 0x25, 0xc5, 0x5a, 0x35, 0x7c, 0x16, 0x8f, 0x92, 0x0e, 0x90,
|
0x25, 0xe5, 0x3c, 0x80, 0x5a, 0x18, 0xf5, 0x82, 0xf3, 0x88, 0x7b, 0x51, 0xc4, 0x5b, 0x5b, 0xe4,
|
||||||
0x60, 0x13, 0xb2, 0x3e, 0x86, 0x56, 0xb6, 0x93, 0x23, 0x3f, 0xee, 0x34, 0x48, 0x42, 0x1e, 0xb4,
|
0x30, 0x1b, 0x72, 0x5a, 0xb0, 0x99, 0xcc, 0x42, 0x11, 0x37, 0xad, 0x2a, 0x89, 0xd4, 0xa4, 0x58,
|
||||||
0x5f, 0xc2, 0xfe, 0x92, 0x2f, 0x55, 0x9e, 0x1d, 0x40, 0xdd, 0x4b, 0x41, 0xf2, 0x69, 0xa3, 0xb7,
|
0xab, 0x86, 0xcf, 0x92, 0x51, 0xda, 0x02, 0x12, 0x6c, 0x43, 0xce, 0x27, 0xd0, 0xc8, 0x76, 0xf2,
|
||||||
0x75, 0x40, 0x99, 0x7b, 0x90, 0x31, 0x67, 0x2c, 0x28, 0xaa, 0x75, 0xe2, 0x8f, 0x02, 0x77, 0xf2,
|
0x22, 0x48, 0x5a, 0x35, 0x92, 0x90, 0x07, 0xdd, 0x57, 0x70, 0x7b, 0xc9, 0x97, 0x2a, 0xce, 0x3a,
|
||||||
0xfe, 0x19, 0x23, 0x3c, 0x46, 0x4b, 0x54, 0x7e, 0x2a, 0xca, 0xde, 0x82, 0x76, 0x2a, 0x4a, 0x05,
|
0x50, 0x1d, 0x68, 0x90, 0x7c, 0x5a, 0xeb, 0xee, 0x74, 0x28, 0xb4, 0x3b, 0x19, 0x73, 0xc6, 0x82,
|
||||||
0xfd, 0xaf, 0x25, 0xd8, 0x7e, 0x36, 0x1c, 0xde, 0x92, 0x93, 0x98, 0xd8, 0x9c, 0xc5, 0x98, 0xfa,
|
0xa2, 0x1a, 0x47, 0xc1, 0x28, 0xf4, 0x27, 0xef, 0x1f, 0x31, 0xc2, 0x63, 0xb4, 0x44, 0xc5, 0xa7,
|
||||||
0x28, 0xb1, 0x48, 0xee, 0xd4, 0xb4, 0xf5, 0x11, 0x94, 0x67, 0x09, 0xee, 0xa4, 0x44, 0x3b, 0x69,
|
0xa2, 0xdc, 0x1d, 0x68, 0x6a, 0x51, 0xea, 0xd0, 0xff, 0x5c, 0x82, 0xdd, 0x67, 0xc3, 0xe1, 0x35,
|
||||||
0xa8, 0x9d, 0x9c, 0x21, 0xe4, 0xd0, 0x84, 0x65, 0x41, 0xd9, 0x15, 0xbe, 0x2c, 0x93, 0x2f, 0x69,
|
0x31, 0x89, 0x81, 0xcd, 0x59, 0x82, 0xa1, 0x8f, 0x12, 0x8b, 0xe4, 0x4e, 0x43, 0x3b, 0xf7, 0xa1,
|
||||||
0x2c, 0x4c, 0x66, 0xc1, 0x25, 0xc6, 0x59, 0x40, 0x62, 0x28, 0x10, 0xef, 0x6a, 0xa8, 0x22, 0x2c,
|
0x3c, 0x4b, 0x71, 0x27, 0x25, 0xda, 0x49, 0x4d, 0xed, 0xe4, 0x04, 0x21, 0x8f, 0x26, 0x1c, 0x07,
|
||||||
0x86, 0xe9, 0xb6, 0x6a, 0xd9, 0xb6, 0x74, 0xda, 0x6c, 0xac, 0x4e, 0x9b, 0xfa, 0x9a, 0xb4, 0x81,
|
0xca, 0xbe, 0xf0, 0x65, 0x99, 0x7c, 0x49, 0x63, 0x61, 0x32, 0x0b, 0xcf, 0xf1, 0x9c, 0x05, 0x24,
|
||||||
0x5c, 0xda, 0xd8, 0xd0, 0xf4, 0xdc, 0xc8, 0x3d, 0xf7, 0x27, 0x3e, 0xf7, 0x59, 0x82, 0xf1, 0x13,
|
0x86, 0x02, 0x19, 0x5c, 0x0c, 0xd5, 0x09, 0x8b, 0xa1, 0xde, 0xd6, 0x66, 0xb6, 0x2d, 0x13, 0x36,
|
||||||
0x46, 0xe4, 0x30, 0xeb, 0x11, 0x6c, 0xba, 0x51, 0xe4, 0xc6, 0xd3, 0x30, 0x46, 0xd7, 0xbc, 0xf5,
|
0x5b, 0xab, 0xc3, 0xa6, 0xba, 0x26, 0x6c, 0x20, 0x17, 0x36, 0x2e, 0xd4, 0x07, 0x7e, 0xec, 0x9f,
|
||||||
0x27, 0xac, 0xd3, 0x24, 0x21, 0x8b, 0xb0, 0x90, 0x96, 0xb0, 0x89, 0x1f, 0xcc, 0xe6, 0xaf, 0x44,
|
0x06, 0x93, 0x80, 0x07, 0x2c, 0xc5, 0xf3, 0x13, 0x46, 0xe4, 0x30, 0xe7, 0x21, 0x6c, 0xfb, 0x71,
|
||||||
0xf6, 0x75, 0x5a, 0xc4, 0x96, 0xc3, 0x84, 0xb4, 0x20, 0x7c, 0xcd, 0xae, 0xfa, 0xb1, 0x7f, 0x89,
|
0xec, 0x27, 0xd3, 0x28, 0x41, 0xd7, 0xbc, 0x0b, 0x26, 0xac, 0x55, 0x27, 0x21, 0x8b, 0xb0, 0x90,
|
||||||
0x6b, 0x46, 0xa8, 0xb4, 0x4d, 0x5e, 0x5c, 0x84, 0xad, 0x6f, 0x62, 0x62, 0x4e, 0xfc, 0xa9, 0xcf,
|
0x96, 0xb2, 0x49, 0x10, 0xce, 0xe6, 0xaf, 0x45, 0xf4, 0xb5, 0x1a, 0xc4, 0x96, 0xc3, 0x84, 0xb4,
|
||||||
0x93, 0xce, 0x26, 0x9a, 0xd5, 0xe8, 0xb5, 0x94, 0x3f, 0x1d, 0x42, 0x9d, 0x74, 0xd6, 0x3e, 0x82,
|
0x30, 0x7a, 0xc3, 0x2e, 0x7a, 0x49, 0x70, 0x8e, 0x6b, 0x46, 0xa8, 0xb4, 0x49, 0x5e, 0x5c, 0x84,
|
||||||
0xaa, 0x84, 0x84, 0x7b, 0x05, 0x8b, 0x8a, 0x16, 0x8d, 0x05, 0x96, 0x84, 0x6f, 0x39, 0xc5, 0xaa,
|
0x9d, 0x6f, 0x62, 0x60, 0x4e, 0x82, 0x69, 0xc0, 0xd3, 0xd6, 0x36, 0x9a, 0x55, 0xeb, 0x36, 0x94,
|
||||||
0xec, 0xd0, 0x58, 0x60, 0x63, 0x37, 0x1e, 0x52, 0x9c, 0x10, 0x13, 0x63, 0xdb, 0x81, 0xb2, 0x08,
|
0x3f, 0x3d, 0x42, 0x3d, 0x3d, 0xeb, 0xbe, 0x80, 0x8a, 0x84, 0x84, 0x7b, 0x05, 0x8b, 0x3a, 0x2d,
|
||||||
0x94, 0x70, 0xf5, 0x4c, 0x05, 0xbc, 0xe5, 0x88, 0xa1, 0x40, 0x46, 0x2a, 0xa7, 0x10, 0xc1, 0xa1,
|
0x1a, 0x0b, 0x2c, 0x8d, 0xde, 0x71, 0x3a, 0xab, 0xb2, 0x47, 0x63, 0x81, 0x8d, 0xfd, 0x64, 0x48,
|
||||||
0xf5, 0x0d, 0x68, 0xbb, 0xc3, 0x21, 0xba, 0x27, 0xc4, 0xa8, 0x7f, 0xee, 0x0f, 0x13, 0x94, 0x54,
|
0xe7, 0x84, 0x98, 0x18, 0xbb, 0x1e, 0x94, 0xc5, 0x41, 0x09, 0x57, 0xcf, 0xd4, 0x81, 0x37, 0x3c,
|
||||||
0xc2, 0xc9, 0x05, 0xd4, 0xde, 0x01, 0xcb, 0x4c, 0x28, 0x95, 0x67, 0xbf, 0x2e, 0xe8, 0x03, 0xa1,
|
0x31, 0x14, 0xc8, 0x48, 0xc5, 0x14, 0x22, 0x38, 0x74, 0xbe, 0x01, 0x4d, 0x7f, 0x38, 0x44, 0xf7,
|
||||||
0xcf, 0xc9, 0xba, 0x6c, 0xfb, 0x7e, 0xae, 0x7a, 0x14, 0x29, 0xaf, 0xb6, 0xd3, 0x13, 0x92, 0xad,
|
0x44, 0x78, 0xea, 0x5f, 0x04, 0xc3, 0x14, 0x25, 0x95, 0x70, 0x72, 0x01, 0x75, 0xf7, 0xc0, 0xb1,
|
||||||
0x36, 0x0b, 0xca, 0xd2, 0xa1, 0x2c, 0xad, 0x3a, 0x94, 0x5d, 0xe8, 0x2c, 0xdb, 0xa0, 0x0c, 0xf4,
|
0x03, 0x4a, 0xc5, 0xd9, 0x2f, 0x0b, 0x26, 0x21, 0x4c, 0x9e, 0xac, 0x8b, 0xb6, 0xef, 0xe6, 0xaa,
|
||||||
0x60, 0xff, 0x88, 0x4d, 0xd8, 0xfb, 0xd8, 0x87, 0x9e, 0x0c, 0x5c, 0x2c, 0x1d, 0xf2, 0xc0, 0xd1,
|
0x47, 0x91, 0xe2, 0x6a, 0x57, 0x67, 0x48, 0xb6, 0xda, 0x2e, 0x28, 0x4b, 0x49, 0x59, 0x5a, 0x95,
|
||||||
0xf8, 0xfd, 0x0d, 0x58, 0x56, 0xa2, 0x0c, 0x38, 0x86, 0xdd, 0x57, 0x7e, 0xc2, 0x6f, 0x57, 0xbf,
|
0x94, 0x6d, 0x68, 0x2d, 0xdb, 0xa0, 0x0c, 0x1c, 0xc0, 0xed, 0x17, 0x6c, 0xc2, 0xde, 0xc7, 0x3e,
|
||||||
0xa4, 0xaa, 0xb8, 0x4a, 0xd5, 0xef, 0x0b, 0x00, 0x99, 0x2c, 0x6d, 0x73, 0xc1, 0xb0, 0x19, 0x31,
|
0xf4, 0x64, 0xe8, 0x63, 0xe9, 0x90, 0x09, 0x47, 0xe3, 0xf7, 0x37, 0x60, 0x59, 0x89, 0x32, 0xe0,
|
||||||
0x36, 0xf7, 0xb9, 0x3a, 0xd1, 0x34, 0x16, 0x71, 0xe7, 0x5e, 0xa4, 0x2e, 0x19, 0x31, 0x14, 0x15,
|
0x10, 0x6e, 0xbd, 0x0e, 0x52, 0x7e, 0xbd, 0xfa, 0x25, 0x55, 0xc5, 0x55, 0xaa, 0x7e, 0x57, 0x00,
|
||||||
0x71, 0x16, 0xf8, 0xf3, 0x93, 0xd0, 0xbb, 0x60, 0x3c, 0xa1, 0x8a, 0x8d, 0xd5, 0xd4, 0x80, 0xe8,
|
0xc8, 0x64, 0x19, 0x9b, 0x0b, 0x96, 0xcd, 0x88, 0xb1, 0x79, 0xc0, 0x55, 0x46, 0xd3, 0x58, 0x9c,
|
||||||
0x58, 0x8e, 0xd9, 0x64, 0x42, 0x65, 0x7b, 0xc3, 0x91, 0x84, 0xa8, 0xb1, 0x6c, 0x1a, 0xf1, 0xeb,
|
0x3b, 0x1f, 0xc4, 0xea, 0x92, 0x11, 0x43, 0x51, 0x11, 0x67, 0x61, 0x30, 0x3f, 0x8a, 0x06, 0x67,
|
||||||
0xd7, 0x27, 0x78, 0xa8, 0xc5, 0x09, 0x4b, 0x49, 0xdc, 0xe9, 0xde, 0xe2, 0x4e, 0x55, 0x69, 0x7c,
|
0x8c, 0xa7, 0x54, 0xb1, 0xb1, 0x9a, 0x5a, 0x10, 0xa5, 0xe5, 0x98, 0x4d, 0x26, 0x54, 0xb6, 0xb7,
|
||||||
0x02, 0x8d, 0x6c, 0x17, 0x09, 0x1a, 0x5b, 0x5a, 0x1d, 0x7a, 0x93, 0xcb, 0x7e, 0x00, 0xcd, 0x13,
|
0x3c, 0x49, 0x88, 0x1a, 0xcb, 0xa6, 0x31, 0xbf, 0x7c, 0x73, 0x84, 0x49, 0x2d, 0x32, 0x4c, 0x93,
|
||||||
0x8e, 0x41, 0x5d, 0xe3, 0x2f, 0xfb, 0x11, 0xb4, 0x75, 0x5d, 0x25, 0x46, 0x59, 0x19, 0x5c, 0x3e,
|
0xb8, 0xd3, 0xfd, 0xc5, 0x9d, 0xaa, 0xd2, 0xf8, 0x04, 0x6a, 0xd9, 0x2e, 0x52, 0x34, 0xb6, 0xb4,
|
||||||
0x4b, 0x14, 0x97, 0xa2, 0xec, 0xbf, 0x95, 0xa0, 0xa6, 0x12, 0x37, 0xad, 0x3e, 0x85, 0xac, 0xfa,
|
0xfa, 0xe8, 0x6d, 0x2e, 0xf7, 0x1e, 0xd4, 0x8f, 0x38, 0x1e, 0xea, 0x1a, 0x7f, 0xb9, 0x0f, 0xa1,
|
||||||
0xfc, 0x5f, 0x8a, 0xe0, 0x87, 0x50, 0x4f, 0xae, 0x13, 0xce, 0xa6, 0x7d, 0x55, 0x0a, 0x5b, 0x4e,
|
0x69, 0xea, 0x2a, 0x31, 0xca, 0xca, 0xe0, 0xf3, 0x59, 0xaa, 0xb8, 0x14, 0xe5, 0xfe, 0xa5, 0x04,
|
||||||
0x06, 0x7c, 0x55, 0x10, 0xb3, 0x82, 0xf8, 0xf7, 0x02, 0xd4, 0x75, 0x98, 0xff, 0xeb, 0x86, 0xe5,
|
0x9b, 0x2a, 0x70, 0x75, 0xf5, 0x29, 0x64, 0xd5, 0xe7, 0xbf, 0x52, 0x04, 0x3f, 0x86, 0x6a, 0x7a,
|
||||||
0x13, 0xa8, 0x47, 0x32, 0xf0, 0x4c, 0xd6, 0xb5, 0x46, 0xaf, 0xad, 0x14, 0xa5, 0x95, 0x2c, 0x63,
|
0x99, 0x72, 0x36, 0xed, 0xa9, 0x52, 0xd8, 0xf0, 0x32, 0xe0, 0x7f, 0x05, 0x31, 0x2b, 0x88, 0x7f,
|
||||||
0x30, 0xf2, 0xa7, 0x6c, 0xe6, 0x8f, 0xd1, 0x90, 0x54, 0x72, 0x0d, 0x09, 0x06, 0x3f, 0x12, 0x05,
|
0x2b, 0x40, 0xd5, 0x1c, 0xf3, 0x07, 0x37, 0x2c, 0x9f, 0x42, 0x35, 0x96, 0x07, 0xcf, 0x64, 0x5d,
|
||||||
0xb3, 0x4a, 0x05, 0x93, 0xc6, 0x66, 0x0b, 0x52, 0xcb, 0xb5, 0x20, 0xf6, 0x67, 0x50, 0x3b, 0x76,
|
0xab, 0x75, 0x9b, 0x4a, 0x91, 0xae, 0x64, 0x19, 0x83, 0x15, 0x3f, 0x65, 0x3b, 0x7e, 0xac, 0x86,
|
||||||
0xbd, 0x31, 0xee, 0x43, 0x2c, 0xf4, 0x22, 0x95, 0xa6, 0xb8, 0x50, 0x8c, 0x85, 0x92, 0x29, 0x43,
|
0x64, 0x23, 0xd7, 0x90, 0xe0, 0xe1, 0xc7, 0xa2, 0x60, 0x56, 0xa8, 0x60, 0xd2, 0xd8, 0x6e, 0x41,
|
||||||
0x7f, 0x5f, 0xab, 0xea, 0xae, 0x28, 0xfb, 0x02, 0xdb, 0x04, 0x79, 0x0c, 0xd4, 0x61, 0x7a, 0x8c,
|
0x36, 0x73, 0x2d, 0x88, 0xfb, 0x39, 0x6c, 0x1e, 0xfa, 0x83, 0x31, 0xee, 0x43, 0x2c, 0x1c, 0xc4,
|
||||||
0x65, 0x34, 0x75, 0x48, 0x7a, 0x96, 0x96, 0x1b, 0x0d, 0x83, 0x07, 0xc3, 0x52, 0x9b, 0x4a, 0xcd,
|
0x2a, 0x4c, 0x71, 0xa1, 0x18, 0x0b, 0x25, 0x53, 0x86, 0xfe, 0xbe, 0x54, 0xd5, 0x5d, 0x51, 0xee,
|
||||||
0xaa, 0xea, 0xa6, 0x3e, 0x50, 0xf6, 0x38, 0xe9, 0xb4, 0xfd, 0xdb, 0x02, 0xec, 0xc9, 0x2e, 0xf2,
|
0x19, 0xb6, 0x09, 0x32, 0x0d, 0x54, 0x32, 0x3d, 0xc6, 0x32, 0xaa, 0x1d, 0xa2, 0x73, 0x69, 0xb9,
|
||||||
0xd6, 0x5e, 0x71, 0x75, 0x77, 0x22, 0xdd, 0x57, 0xca, 0xb9, 0xef, 0x09, 0xd4, 0x63, 0x96, 0x84,
|
0xd1, 0xb0, 0x78, 0xf0, 0x58, 0x36, 0xa7, 0x52, 0xb3, 0xaa, 0xba, 0xda, 0x07, 0xca, 0x1e, 0x4f,
|
||||||
0xb3, 0x18, 0xdd, 0x4c, 0x9e, 0x6d, 0xf4, 0x76, 0xd3, 0x93, 0x44, 0xba, 0x1c, 0x35, 0xeb, 0x64,
|
0x4f, 0xbb, 0xbf, 0x2e, 0xc0, 0xbe, 0xec, 0x22, 0xaf, 0xed, 0x15, 0x57, 0x77, 0x27, 0xd2, 0x7d,
|
||||||
0x7c, 0xf6, 0x1f, 0x4b, 0xd0, 0xce, 0xcf, 0x8a, 0x8a, 0x75, 0x3e, 0xb9, 0xf0, 0xc3, 0x2f, 0x65,
|
0xa5, 0x9c, 0xfb, 0x9e, 0x40, 0x35, 0x61, 0x69, 0x34, 0x4b, 0xd0, 0xcd, 0xe4, 0xd9, 0x5a, 0xf7,
|
||||||
0xfb, 0x5b, 0x20, 0x37, 0x99, 0x90, 0x38, 0x55, 0xe8, 0xcb, 0x13, 0xbc, 0x03, 0x51, 0x93, 0x74,
|
0x96, 0xce, 0x24, 0xd2, 0xe5, 0xa9, 0x59, 0x2f, 0xe3, 0x73, 0xff, 0x50, 0x82, 0x66, 0x7e, 0x56,
|
||||||
0x63, 0x06, 0xa8, 0xd9, 0x3e, 0x8b, 0xfd, 0x30, 0xbd, 0x2e, 0x33, 0x40, 0x94, 0x01, 0x24, 0xde,
|
0x54, 0xac, 0xd3, 0xc9, 0x59, 0x10, 0x7d, 0x25, 0xdb, 0xdf, 0x02, 0xb9, 0xc9, 0x86, 0x44, 0x56,
|
||||||
0xcc, 0x42, 0xee, 0x92, 0x91, 0x65, 0x47, 0xd3, 0xd4, 0xf7, 0x62, 0x8c, 0x18, 0x3f, 0x14, 0x51,
|
0xa1, 0x2f, 0x8f, 0xf0, 0x0e, 0x44, 0x4d, 0xd2, 0x8d, 0x19, 0xa0, 0x66, 0x7b, 0x2c, 0x09, 0x22,
|
||||||
0xab, 0xa8, 0xbe, 0x57, 0x23, 0xd9, 0xfc, 0x31, 0x9b, 0x26, 0xea, 0x98, 0x1b, 0x88, 0xb0, 0x5c,
|
0x7d, 0x5d, 0x66, 0x80, 0x28, 0x03, 0x48, 0xbc, 0x9d, 0x45, 0xdc, 0x27, 0x23, 0xcb, 0x9e, 0xa1,
|
||||||
0x46, 0xf3, 0x95, 0x48, 0x6a, 0x4a, 0x0c, 0xb4, 0xdc, 0x80, 0x84, 0x04, 0x49, 0x9e, 0x5c, 0xb9,
|
0xa9, 0xef, 0xc5, 0x33, 0x62, 0xfc, 0x40, 0x9c, 0xda, 0x86, 0xea, 0x7b, 0x0d, 0x92, 0xcd, 0x1f,
|
||||||
0x11, 0x1d, 0xfb, 0xb2, 0x63, 0x20, 0x98, 0xc8, 0xdb, 0x92, 0x42, 0x6f, 0xe0, 0x57, 0x8e, 0x2b,
|
0xb2, 0x69, 0xaa, 0xd2, 0xdc, 0x42, 0x84, 0xe5, 0xf2, 0x34, 0x5f, 0x8b, 0xa0, 0xa6, 0xc0, 0x40,
|
||||||
0x2e, 0x66, 0x2a, 0x03, 0x65, 0x67, 0x79, 0x42, 0x70, 0x5f, 0xb0, 0x38, 0x60, 0x93, 0x63, 0x43,
|
0xcb, 0x2d, 0x48, 0x48, 0x90, 0xe4, 0xd1, 0x85, 0x1f, 0x53, 0xda, 0x97, 0x3d, 0x0b, 0xc1, 0x40,
|
||||||
0x2b, 0x48, 0xee, 0xa5, 0x09, 0xab, 0x07, 0x3b, 0x12, 0x3c, 0x3d, 0xec, 0x9b, 0x0b, 0x1a, 0xb4,
|
0xde, 0x95, 0x14, 0x7a, 0x03, 0xbf, 0x72, 0x7c, 0x71, 0x31, 0x53, 0x19, 0x28, 0x7b, 0xcb, 0x13,
|
||||||
0x60, 0xe5, 0x9c, 0xf8, 0x16, 0x5b, 0xca, 0x13, 0x75, 0xe1, 0x7d, 0x17, 0x5a, 0x2f, 0x2e, 0x19,
|
0x82, 0xfb, 0x8c, 0x25, 0x21, 0x9b, 0x1c, 0x5a, 0x5a, 0x41, 0x72, 0x2f, 0x4d, 0x38, 0x5d, 0xd8,
|
||||||
0x56, 0xf0, 0x34, 0x73, 0xd0, 0xef, 0xe2, 0x00, 0x60, 0x36, 0x4c, 0x23, 0x15, 0xb5, 0x0c, 0xb0,
|
0x93, 0xe0, 0xf1, 0x41, 0xcf, 0x5e, 0x50, 0xa3, 0x05, 0x2b, 0xe7, 0xc4, 0xb7, 0xd8, 0x52, 0x9c,
|
||||||
0x13, 0xa8, 0x10, 0xfb, 0xca, 0x86, 0x47, 0x26, 0x5d, 0x51, 0x27, 0x5d, 0x3e, 0xc5, 0x5a, 0x3a,
|
0xa8, 0x0b, 0x0f, 0xfb, 0xda, 0x97, 0xe7, 0x0c, 0x2b, 0xb8, 0x8e, 0x9c, 0xa7, 0x50, 0x35, 0x9f,
|
||||||
0xc5, 0x54, 0x32, 0x96, 0xb3, 0x64, 0xcc, 0x29, 0xad, 0x2c, 0x2a, 0xfd, 0x5d, 0x11, 0x9a, 0xaf,
|
0x72, 0x2a, 0x00, 0xdb, 0x1d, 0xf9, 0xb1, 0xd7, 0xd1, 0x1f, 0x7b, 0x9d, 0x63, 0xcd, 0xe1, 0x65,
|
||||||
0x19, 0xbf, 0x0a, 0xe3, 0x0b, 0x71, 0xb8, 0x92, 0x95, 0xf7, 0xe8, 0x3d, 0xfc, 0xec, 0x9b, 0x0f,
|
0xcc, 0xee, 0x6f, 0x0b, 0xb0, 0x41, 0xb2, 0x56, 0x76, 0x43, 0x32, 0x22, 0x8b, 0x26, 0x22, 0xf3,
|
||||||
0xce, 0xaf, 0xb9, 0x4e, 0xa6, 0x5a, 0x3c, 0x7f, 0x2e, 0x48, 0xeb, 0x3e, 0x00, 0x4e, 0xf5, 0x5d,
|
0xf1, 0xd7, 0x30, 0xf1, 0xa7, 0x22, 0xb5, 0x9c, 0x45, 0x6a, 0xce, 0xa2, 0xca, 0x87, 0x58, 0xf4,
|
||||||
0x79, 0x77, 0xaa, 0x5c, 0x8a, 0xe7, 0x0a, 0xb0, 0x3e, 0x80, 0xba, 0x33, 0x1f, 0x60, 0x0d, 0x0e,
|
0x9b, 0x22, 0xd4, 0xdf, 0x30, 0x7e, 0x11, 0x25, 0x67, 0x22, 0x2b, 0xd3, 0x95, 0x17, 0xf0, 0x1d,
|
||||||
0xe3, 0x24, 0x4d, 0xa6, 0x78, 0xfe, 0x82, 0x68, 0xb1, 0x16, 0x27, 0x87, 0x71, 0x18, 0x45, 0x6c,
|
0xfc, 0x5e, 0x9c, 0xf7, 0x4f, 0x2f, 0xb9, 0x89, 0xc2, 0xcd, 0x64, 0xfe, 0x5c, 0x90, 0xce, 0x5d,
|
||||||
0x98, 0x9a, 0x16, 0xcf, 0x8f, 0x24, 0x20, 0xb4, 0x9e, 0xa6, 0x5a, 0xab, 0x52, 0x2b, 0xcf, 0xb4,
|
0x00, 0x9c, 0xea, 0xf9, 0xf2, 0xd2, 0x55, 0x41, 0x98, 0xcc, 0x15, 0xe0, 0x7c, 0x04, 0x55, 0x6f,
|
||||||
0xe2, 0x54, 0xa4, 0xb4, 0xd6, 0xd4, 0xa6, 0x4c, 0xad, 0xa7, 0x5a, 0xab, 0x4c, 0xa1, 0x0d, 0x6e,
|
0xde, 0xc7, 0xe2, 0x1d, 0x25, 0xa9, 0x8e, 0xc2, 0x64, 0xfe, 0x92, 0x68, 0xb1, 0x16, 0x27, 0x87,
|
||||||
0x68, 0x3d, 0xcd, 0xb4, 0xd6, 0xd3, 0xb5, 0x4a, 0xab, 0xfd, 0x97, 0x02, 0x6c, 0x60, 0x2a, 0x9f,
|
0x49, 0x14, 0xc7, 0x6c, 0x48, 0x51, 0x48, 0x6b, 0x5f, 0x48, 0x40, 0x68, 0x3d, 0xd6, 0x5a, 0x2b,
|
||||||
0x25, 0xee, 0x88, 0xe1, 0xad, 0xd7, 0xe0, 0x98, 0xf6, 0x93, 0xc1, 0x4c, 0x90, 0x2a, 0x64, 0x40,
|
0x52, 0x2b, 0xcf, 0xb4, 0xe2, 0x54, 0xac, 0xb4, 0xca, 0xf0, 0xab, 0x72, 0x5b, 0xeb, 0xb1, 0xd1,
|
||||||
0x90, 0x64, 0xf8, 0x1a, 0x34, 0x23, 0x16, 0x63, 0x82, 0x2b, 0x8e, 0x22, 0x16, 0x21, 0x4c, 0x68,
|
0x2a, 0x63, 0x6f, 0x8b, 0x5b, 0x5a, 0x8f, 0x33, 0xad, 0x55, 0xbd, 0x56, 0x69, 0x75, 0xff, 0x54,
|
||||||
0x89, 0x49, 0x96, 0x03, 0xb8, 0x4b, 0x73, 0x03, 0x3f, 0x18, 0xc8, 0x0c, 0x9a, 0x86, 0x43, 0xa6,
|
0x80, 0x2d, 0xcc, 0x81, 0x93, 0xd4, 0x1f, 0x31, 0xbc, 0x2e, 0x6b, 0x1c, 0xf3, 0x65, 0xd2, 0x9f,
|
||||||
0x5c, 0xb5, 0x4d, 0x53, 0x2f, 0x83, 0x2f, 0xf4, 0x84, 0xf5, 0x6d, 0xd8, 0xd6, 0xfc, 0xe2, 0x66,
|
0x09, 0x52, 0x65, 0x28, 0x10, 0x24, 0x19, 0xfe, 0x0f, 0xea, 0x31, 0x4b, 0x30, 0x33, 0x14, 0x47,
|
||||||
0x25, 0x6e, 0xe9, 0xba, 0x4d, 0xc5, 0x7d, 0xa6, 0x60, 0xfb, 0x57, 0xd0, 0x3e, 0x1d, 0xc7, 0x21,
|
0x11, 0xab, 0x17, 0x66, 0x82, 0xc4, 0x24, 0x4b, 0x07, 0x6e, 0xd2, 0x5c, 0x3f, 0x08, 0xfb, 0x32,
|
||||||
0xe7, 0x78, 0xf5, 0x8c, 0x8e, 0x5c, 0x3c, 0xa0, 0x58, 0x75, 0x23, 0x3a, 0xc6, 0x89, 0xb2, 0x36,
|
0xf4, 0xa6, 0xd1, 0x90, 0x29, 0x57, 0xed, 0xd2, 0xd4, 0xab, 0xf0, 0x4b, 0x33, 0xe1, 0x7c, 0x1b,
|
||||||
0x25, 0xad, 0xef, 0xc0, 0x36, 0x97, 0xbc, 0x6c, 0x38, 0x48, 0x79, 0x64, 0x34, 0xb7, 0xf4, 0x44,
|
0x76, 0x0d, 0xbf, 0xb8, 0x92, 0x89, 0x5b, 0xba, 0x6e, 0x5b, 0x71, 0x9f, 0x28, 0xd8, 0xfd, 0x05,
|
||||||
0x5f, 0x31, 0x7f, 0x1d, 0xda, 0x19, 0x33, 0xd5, 0x70, 0x69, 0x6f, 0x4b, 0xa3, 0xa7, 0xa2, 0x92,
|
0x34, 0x8f, 0xc7, 0x78, 0xbe, 0x1c, 0xef, 0xac, 0xd1, 0x0b, 0x1f, 0x33, 0x1b, 0xcb, 0x75, 0x4c,
|
||||||
0xff, 0x41, 0x3a, 0x4b, 0x66, 0xce, 0x27, 0x54, 0x55, 0x0c, 0x57, 0x35, 0x7a, 0x9b, 0x69, 0x35,
|
0xf9, 0x9f, 0x2a, 0x6b, 0x35, 0xe9, 0x7c, 0x07, 0x76, 0xb9, 0xe4, 0x65, 0xc3, 0xbe, 0xe6, 0x91,
|
||||||
0x56, 0xce, 0xa0, 0x4a, 0x22, 0xdd, 0xf2, 0x63, 0xd8, 0xe4, 0xda, 0xf4, 0x01, 0x1e, 0x20, 0x57,
|
0xa7, 0xb9, 0x63, 0x26, 0x7a, 0x8a, 0xf9, 0xff, 0xa1, 0x99, 0x31, 0x53, 0xf1, 0x97, 0xf6, 0x36,
|
||||||
0x95, 0xe4, 0xb4, 0x22, 0xe6, 0x37, 0xe6, 0xb4, 0x79, 0x7e, 0xa3, 0xe8, 0x79, 0xd9, 0x26, 0x28,
|
0x0c, 0x2a, 0xa2, 0xc9, 0xfd, 0xbd, 0x74, 0x96, 0x8c, 0x9c, 0x4f, 0xa9, 0x1c, 0x59, 0xae, 0xaa,
|
||||||
0x85, 0xd2, 0xbe, 0x86, 0xc4, 0x48, 0x85, 0xfd, 0x23, 0xa8, 0x63, 0x0f, 0x91, 0x48, 0xeb, 0xd0,
|
0x75, 0xb7, 0x75, 0x19, 0x57, 0xce, 0xa0, 0x12, 0x24, 0xdd, 0xf2, 0x43, 0xd8, 0xe6, 0xc6, 0xf4,
|
||||||
0x31, 0xde, 0x2c, 0x8e, 0xf1, 0x7c, 0xa5, 0x8e, 0x51, 0xa4, 0xe8, 0x31, 0xe8, 0x8a, 0x55, 0xce,
|
0x3e, 0x66, 0x9e, 0xaf, 0x52, 0x49, 0x97, 0xd2, 0xfc, 0xc6, 0xbc, 0x26, 0xcf, 0x6f, 0x14, 0x3d,
|
||||||
0x90, 0x84, 0x1d, 0x02, 0xc8, 0x63, 0x4e, 0xda, 0x90, 0xc7, 0x4c, 0x01, 0x49, 0x88, 0x3c, 0x9b,
|
0x2f, 0xfb, 0x0b, 0xa5, 0x50, 0xda, 0x57, 0x93, 0x18, 0xa9, 0x70, 0x7f, 0x00, 0x55, 0x6c, 0x3e,
|
||||||
0xba, 0x73, 0x1d, 0x7a, 0xca, 0x33, 0x04, 0xe4, 0x06, 0x51, 0xe1, 0x5b, 0xd7, 0x9f, 0x78, 0xea,
|
0x52, 0x69, 0x1d, 0x3a, 0x66, 0x30, 0x4b, 0x12, 0xcc, 0x3d, 0xed, 0x18, 0x45, 0x8a, 0xe6, 0x84,
|
||||||
0x7d, 0x00, 0x15, 0x2a, 0x32, 0x53, 0x58, 0x36, 0x15, 0xfe, 0xb9, 0x08, 0x0d, 0xa9, 0x51, 0x1a,
|
0xee, 0x66, 0xe5, 0x0c, 0x49, 0xb8, 0x11, 0x80, 0xac, 0x0f, 0xa4, 0x0d, 0x79, 0xec, 0x10, 0x90,
|
||||||
0x8c, 0x5c, 0x1e, 0x5e, 0x46, 0x5a, 0x25, 0x11, 0xd8, 0x2e, 0x54, 0x32, 0x75, 0x59, 0xeb, 0x98,
|
0x84, 0x88, 0xb3, 0xa9, 0x3f, 0x37, 0x47, 0x4f, 0x71, 0x86, 0x80, 0xdc, 0x20, 0x2a, 0x7c, 0xe7,
|
||||||
0x99, 0x9a, 0xda, 0x86, 0x97, 0x63, 0x82, 0xf5, 0xd2, 0xf0, 0xce, 0x4a, 0xee, 0xba, 0x60, 0x92,
|
0x07, 0x93, 0x81, 0x7a, 0x58, 0x40, 0x85, 0x8a, 0xcc, 0x14, 0x96, 0x6d, 0x85, 0x7f, 0x2c, 0x42,
|
||||||
0x06, 0x7f, 0x0a, 0x4d, 0x99, 0x9f, 0x6a, 0x4d, 0x79, 0xdd, 0x9a, 0x86, 0x64, 0x93, 0xab, 0x9e,
|
0x4d, 0x6a, 0x94, 0x06, 0x23, 0xd7, 0x00, 0x6f, 0x31, 0xa3, 0x92, 0x08, 0xec, 0x33, 0x36, 0x32,
|
||||||
0x88, 0x0e, 0x0d, 0xed, 0xa5, 0x8e, 0xa0, 0xd1, 0xbb, 0x9f, 0x63, 0xa7, 0x9d, 0x1c, 0xd0, 0xef,
|
0x75, 0x59, 0xcf, 0x99, 0x99, 0xaa, 0x6d, 0xc3, 0x5b, 0x35, 0xc5, 0x42, 0x6b, 0x79, 0x67, 0x25,
|
||||||
0x8b, 0x80, 0x63, 0x69, 0x96, 0xbc, 0xdd, 0xa7, 0x00, 0x19, 0x28, 0x6a, 0xd6, 0x05, 0xbb, 0x4e,
|
0x77, 0x55, 0x30, 0x49, 0x83, 0x3f, 0x83, 0xba, 0x8c, 0x4f, 0xb5, 0xa6, 0xbc, 0x6e, 0x4d, 0x4d,
|
||||||
0x3b, 0x51, 0x1c, 0x8a, 0xbd, 0x5f, 0xba, 0x93, 0x59, 0xea, 0x54, 0x49, 0xfc, 0xb0, 0xf8, 0xb4,
|
0xb2, 0xc9, 0x55, 0x4f, 0x44, 0x6b, 0x87, 0xf6, 0x52, 0x2b, 0x51, 0xeb, 0xde, 0xcd, 0xb1, 0xd3,
|
||||||
0x80, 0x5f, 0x31, 0x9b, 0xcf, 0xc5, 0x3d, 0x67, 0x2c, 0xcf, 0x3d, 0x6b, 0x95, 0x57, 0x3e, 0x6b,
|
0x4e, 0x3a, 0xf4, 0xfb, 0x32, 0xe4, 0x58, 0xd3, 0x25, 0x6f, 0xfb, 0x29, 0x40, 0x06, 0x8a, 0x7a,
|
||||||
0x95, 0xd3, 0x67, 0x2d, 0x2c, 0xa3, 0x61, 0xa4, 0x6e, 0x65, 0x1c, 0x65, 0x8a, 0xca, 0x86, 0x22,
|
0x76, 0xc6, 0x2e, 0x75, 0x0b, 0x8b, 0x43, 0xb1, 0xf7, 0x73, 0x7f, 0x32, 0xd3, 0x4e, 0x95, 0xc4,
|
||||||
0xfb, 0x9f, 0x65, 0x80, 0x4c, 0x8b, 0x75, 0x02, 0x5d, 0x3f, 0x1c, 0x88, 0x4b, 0xc5, 0xf7, 0x98,
|
0xf7, 0x8b, 0x4f, 0x0b, 0xf8, 0xf9, 0xb3, 0xfd, 0x5c, 0x5c, 0x90, 0xd6, 0xf2, 0xdc, 0x7b, 0x58,
|
||||||
0x2c, 0x48, 0x83, 0x98, 0x61, 0xfa, 0x24, 0xfe, 0x25, 0x53, 0x7d, 0xc7, 0x9e, 0xda, 0xf7, 0x82,
|
0x79, 0xe5, 0x7b, 0x58, 0x59, 0xbf, 0x87, 0x61, 0x89, 0x8d, 0x62, 0x75, 0x9d, 0xe3, 0x28, 0x53,
|
||||||
0x71, 0xce, 0x3e, 0x52, 0x72, 0x21, 0x55, 0x2e, 0x27, 0x5d, 0x66, 0xfd, 0x0c, 0x76, 0x33, 0xa1,
|
0x54, 0xb6, 0x14, 0xb9, 0xff, 0x28, 0x03, 0x64, 0x5a, 0x9c, 0x23, 0x68, 0x07, 0x51, 0x5f, 0xdc,
|
||||||
0x43, 0x43, 0x5e, 0xf1, 0x46, 0x79, 0x77, 0xb5, 0xbc, 0x61, 0x26, 0xeb, 0x27, 0x80, 0xf0, 0x00,
|
0x46, 0xc1, 0x80, 0xc9, 0x82, 0xd4, 0x4f, 0x18, 0x86, 0x4f, 0x1a, 0x9c, 0x33, 0xd5, 0xb0, 0xec,
|
||||||
0xef, 0x98, 0x59, 0x4e, 0x52, 0xe9, 0x46, 0x49, 0xdb, 0x7e, 0xf8, 0x86, 0x56, 0x64, 0x72, 0xde,
|
0xab, 0x7d, 0x2f, 0x18, 0xe7, 0xdd, 0x46, 0x4a, 0x2e, 0xa4, 0xca, 0xe5, 0xe9, 0x65, 0xce, 0x4f,
|
||||||
0xc0, 0x3d, 0x63, 0xa3, 0xe2, 0xd8, 0x1b, 0xd2, 0xca, 0x37, 0x4a, 0xdb, 0xd3, 0x76, 0x89, 0xc2,
|
0xe0, 0x56, 0x26, 0x74, 0x68, 0xc9, 0x2b, 0x5e, 0x29, 0xef, 0xa6, 0x91, 0x37, 0xcc, 0x64, 0xfd,
|
||||||
0x90, 0x89, 0xfc, 0x02, 0x70, 0x66, 0x70, 0xe5, 0xfa, 0x7c, 0x51, 0x5e, 0xe5, 0xb6, 0x7d, 0x7e,
|
0x08, 0x10, 0xee, 0xe3, 0xe5, 0x34, 0xcb, 0x49, 0x2a, 0x5d, 0x29, 0x69, 0x37, 0x88, 0xde, 0xd2,
|
||||||
0x89, 0x8b, 0xf2, 0xc2, 0xe4, 0x3e, 0xa7, 0x2c, 0x1e, 0xe5, 0xf6, 0x59, 0xbd, 0x6d, 0x9f, 0xc7,
|
0x8a, 0x4c, 0xce, 0x5b, 0xb8, 0x63, 0x6d, 0x54, 0xa4, 0xbd, 0x25, 0xad, 0x7c, 0xa5, 0xb4, 0x7d,
|
||||||
0xb4, 0x22, 0x93, 0xf3, 0x1c, 0x10, 0x5c, 0xb4, 0xa7, 0x76, 0xa3, 0x94, 0x4d, 0x3f, 0xcc, 0xdb,
|
0x63, 0x97, 0x28, 0x0c, 0x99, 0xc8, 0x2f, 0x01, 0x67, 0xfa, 0x17, 0x7e, 0xc0, 0x17, 0xe5, 0x6d,
|
||||||
0x72, 0x08, 0xdb, 0x09, 0xf3, 0x38, 0xde, 0x28, 0x86, 0x8c, 0x8d, 0x1b, 0x65, 0x6c, 0xa9, 0x05,
|
0x5c, 0xb7, 0xcf, 0xaf, 0x70, 0x51, 0x5e, 0x98, 0xdc, 0xe7, 0x94, 0x25, 0xa3, 0xdc, 0x3e, 0x2b,
|
||||||
0x5a, 0x88, 0xfd, 0x0e, 0x9a, 0x3f, 0x9d, 0x8d, 0x18, 0x9f, 0x9c, 0xeb, 0x33, 0xff, 0xbf, 0x2e,
|
0xd7, 0xed, 0xf3, 0x90, 0x56, 0x64, 0x72, 0x9e, 0x03, 0x82, 0x8b, 0xf6, 0x6c, 0x5e, 0x29, 0x65,
|
||||||
0x33, 0xff, 0xc6, 0x32, 0x73, 0x38, 0x8a, 0xc3, 0x59, 0x94, 0xab, 0xda, 0xf2, 0x0c, 0x2f, 0x55,
|
0x3b, 0x88, 0xf2, 0xb6, 0x1c, 0xc0, 0x6e, 0xca, 0x06, 0x1c, 0x6f, 0x14, 0x4b, 0xc6, 0xd6, 0x95,
|
||||||
0x6d, 0xe2, 0xa1, 0xaa, 0x2d, 0xb9, 0x3f, 0x83, 0xa6, 0x6c, 0xb2, 0xd4, 0x02, 0x59, 0x85, 0xac,
|
0x32, 0x76, 0xd4, 0x02, 0x23, 0xc4, 0xfd, 0x1a, 0xea, 0x3f, 0x9e, 0x8d, 0x18, 0x9f, 0x9c, 0x9a,
|
||||||
0xe5, 0x43, 0x9f, 0x36, 0x75, 0x72, 0x59, 0x4f, 0x35, 0xac, 0x6a, 0x55, 0xbe, 0x1a, 0x65, 0x6e,
|
0x9c, 0xff, 0x4f, 0x97, 0x99, 0x7f, 0x61, 0x99, 0x39, 0x18, 0x25, 0xd1, 0x2c, 0xce, 0x55, 0x6d,
|
||||||
0xc2, 0x2f, 0x96, 0xec, 0xd4, 0xbd, 0x84, 0xd6, 0x58, 0xfa, 0x46, 0xad, 0x92, 0x09, 0xf8, 0x71,
|
0x99, 0xc3, 0x4b, 0x55, 0x9b, 0x78, 0xa8, 0x6a, 0x4b, 0xee, 0xcf, 0xa1, 0x2e, 0xbb, 0x33, 0xb5,
|
||||||
0x6a, 0x5c, 0xb6, 0x87, 0x03, 0xd3, 0x87, 0xd2, 0xd5, 0xcd, 0xb1, 0xe9, 0xd6, 0xef, 0x01, 0x88,
|
0x40, 0x56, 0x21, 0x67, 0x39, 0xe9, 0x75, 0x37, 0x28, 0x97, 0x75, 0x55, 0xa7, 0xab, 0x56, 0xe5,
|
||||||
0x4f, 0x92, 0x41, 0x5a, 0xa8, 0xcc, 0x17, 0x49, 0x7d, 0x43, 0xe0, 0xf7, 0x4f, 0x3a, 0xec, 0x9e,
|
0xab, 0x51, 0xe6, 0x26, 0xfc, 0xd4, 0xc9, 0xb2, 0x0e, 0xdb, 0xae, 0xb1, 0xf4, 0x8d, 0x5a, 0x25,
|
||||||
0xc2, 0xf6, 0x92, 0xcc, 0x15, 0x65, 0xea, 0x5b, 0x66, 0x99, 0x6a, 0xf4, 0xee, 0x2a, 0x91, 0xe6,
|
0x03, 0xf0, 0x13, 0x6d, 0x5c, 0xb6, 0x87, 0x8e, 0xed, 0x43, 0xe9, 0xea, 0xfa, 0xd8, 0x76, 0xeb,
|
||||||
0x52, 0xb3, 0x76, 0xfd, 0xa9, 0x20, 0xbf, 0x60, 0xf4, 0xa3, 0x91, 0xf5, 0x14, 0x5a, 0x81, 0x6c,
|
0x23, 0x00, 0xf1, 0x2d, 0xd3, 0xd7, 0x85, 0xca, 0x7e, 0xca, 0x34, 0x37, 0x04, 0x7e, 0x38, 0xe9,
|
||||||
0xbe, 0x74, 0x00, 0x4a, 0x86, 0x20, 0xb3, 0x31, 0x73, 0x9a, 0x81, 0xd9, 0xa6, 0x61, 0x20, 0x3c,
|
0x61, 0xfb, 0x18, 0x76, 0x97, 0x64, 0xae, 0x28, 0x53, 0xdf, 0xb2, 0xcb, 0x54, 0xad, 0x7b, 0x53,
|
||||||
0xf2, 0xc0, 0xca, 0x40, 0x18, 0xce, 0x71, 0x1a, 0x9e, 0x11, 0xed, 0x5c, 0x33, 0x58, 0x5a, 0x6c,
|
0x89, 0xb4, 0x97, 0xda, 0xb5, 0xeb, 0xaf, 0x05, 0xf9, 0xe9, 0x63, 0x5e, 0x9b, 0xb0, 0x6f, 0x6b,
|
||||||
0x06, 0xd5, 0x43, 0xc3, 0xba, 0x57, 0xd2, 0xde, 0xbf, 0xaa, 0x50, 0x7a, 0xd6, 0x7f, 0x69, 0x9d,
|
0x84, 0xb2, 0xf9, 0x32, 0x07, 0x50, 0xb2, 0x04, 0xd9, 0x8d, 0x99, 0x57, 0x0f, 0xed, 0x36, 0x0d,
|
||||||
0xc1, 0xd6, 0xe2, 0x9f, 0x0c, 0xd6, 0x03, 0xa5, 0x7a, 0xcd, 0x1f, 0x13, 0xdd, 0x8f, 0xd6, 0xce,
|
0x0f, 0x62, 0x40, 0x1e, 0x58, 0x79, 0x10, 0x96, 0x73, 0xbc, 0xda, 0xc0, 0x3a, 0xed, 0x5c, 0xa3,
|
||||||
0xab, 0x6e, 0xf9, 0x8e, 0xe5, 0xc0, 0xe6, 0xc2, 0x93, 0xb2, 0x95, 0x5e, 0x27, 0xab, 0x9f, 0xed,
|
0x58, 0xfe, 0x90, 0x46, 0x51, 0xbd, 0x5e, 0xac, 0x7b, 0x7a, 0xed, 0xfe, 0xb3, 0x02, 0xa5, 0x67,
|
||||||
0xbb, 0x0f, 0xd6, 0x4d, 0x9b, 0x32, 0x17, 0xda, 0x73, 0x2d, 0x73, 0xf5, 0xe7, 0x9d, 0x96, 0xb9,
|
0xbd, 0x57, 0xce, 0x09, 0xec, 0x2c, 0xfe, 0x73, 0xe1, 0xdc, 0x53, 0x66, 0xad, 0xf9, 0xb7, 0xa3,
|
||||||
0xae, 0xab, 0xbf, 0x63, 0xfd, 0x00, 0xaa, 0xf2, 0x91, 0xd9, 0xda, 0x51, 0xbc, 0xb9, 0xe7, 0xeb,
|
0x7d, 0x7f, 0xed, 0xbc, 0x6a, 0xc1, 0x6f, 0x38, 0x1e, 0x6c, 0x2f, 0xbc, 0x53, 0x3b, 0xfa, 0xaa,
|
||||||
0xee, 0xee, 0x02, 0xaa, 0x17, 0xbe, 0x82, 0x56, 0xee, 0x9f, 0x09, 0xeb, 0x83, 0x9c, 0xae, 0xfc,
|
0x59, 0xfd, 0x5f, 0x40, 0xfb, 0xde, 0xba, 0x69, 0x5b, 0xe6, 0x42, 0xcf, 0x6f, 0x64, 0xae, 0xfe,
|
||||||
0x1b, 0x75, 0xf7, 0xc3, 0xd5, 0x93, 0x5a, 0xda, 0x21, 0x40, 0xf6, 0x0e, 0x69, 0x75, 0x14, 0xf7,
|
0x66, 0x34, 0x32, 0xd7, 0x7d, 0x2a, 0xdc, 0x70, 0xbe, 0x07, 0x15, 0xf9, 0x72, 0xed, 0xec, 0x29,
|
||||||
0xd2, 0x5b, 0x77, 0xf7, 0xde, 0x8a, 0x19, 0x2d, 0x04, 0x43, 0xb9, 0xf8, 0x62, 0x68, 0x2d, 0x78,
|
0xde, 0xdc, 0x9b, 0x78, 0xfb, 0xd6, 0x02, 0x6a, 0x16, 0xbe, 0x86, 0x46, 0xee, 0xef, 0x0e, 0xe7,
|
||||||
0x75, 0xf1, 0xbd, 0x4e, 0x87, 0x72, 0xed, 0x53, 0x23, 0x89, 0x5d, 0x7c, 0x07, 0xd4, 0x62, 0xd7,
|
0xa3, 0x9c, 0xae, 0xfc, 0xc3, 0x77, 0xfb, 0xe3, 0xd5, 0x93, 0x46, 0xda, 0x01, 0x40, 0xf6, 0xb8,
|
||||||
0xbc, 0x42, 0x6a, 0xb1, 0x6b, 0x1f, 0x10, 0xef, 0x58, 0x3f, 0x87, 0x76, 0xfe, 0x61, 0xcd, 0x4a,
|
0xe9, 0xb4, 0x14, 0xf7, 0xd2, 0x03, 0x7a, 0xfb, 0xce, 0x8a, 0x19, 0x23, 0x04, 0x8f, 0x72, 0xf1,
|
||||||
0x9d, 0xb4, 0xf2, 0x65, 0xb1, 0x7b, 0x7f, 0xcd, 0xac, 0x16, 0xf8, 0x29, 0x54, 0xe4, 0x8b, 0x59,
|
0x19, 0xd2, 0x59, 0xf0, 0xea, 0xe2, 0x23, 0xa0, 0x39, 0xca, 0xb5, 0xef, 0x97, 0x24, 0x76, 0xf1,
|
||||||
0x7a, 0xe4, 0xcc, 0x87, 0xb6, 0xee, 0x4e, 0x1e, 0xd4, 0xab, 0x1e, 0x43, 0x55, 0x7e, 0xd8, 0xe9,
|
0x71, 0xd1, 0x88, 0x5d, 0xf3, 0xb4, 0x69, 0xc4, 0xae, 0x7d, 0x95, 0xbc, 0xe1, 0xfc, 0x14, 0x9a,
|
||||||
0x04, 0xc8, 0x7d, 0xe7, 0x75, 0x9b, 0x26, 0x6a, 0xdf, 0x79, 0x5c, 0x48, 0xf5, 0x24, 0x39, 0x3d,
|
0xf9, 0xd7, 0x3a, 0x47, 0x3b, 0x69, 0xe5, 0x73, 0x65, 0xfb, 0xee, 0x9a, 0x59, 0x23, 0xf0, 0x33,
|
||||||
0xc9, 0x2a, 0x3d, 0x46, 0x70, 0xce, 0xab, 0xf4, 0xaf, 0xdf, 0x93, 0xff, 0x04, 0x00, 0x00, 0xff,
|
0xd8, 0x90, 0xcf, 0x70, 0x3a, 0x1d, 0xed, 0xd7, 0xbb, 0xf6, 0x5e, 0x1e, 0x34, 0xab, 0x1e, 0x43,
|
||||||
0xff, 0xbf, 0xea, 0xc8, 0x11, 0x02, 0x1c, 0x00, 0x00,
|
0x45, 0x7e, 0x2d, 0x9a, 0x00, 0xc8, 0x7d, 0x3c, 0xb6, 0xeb, 0x36, 0xea, 0xde, 0x78, 0x5c, 0xd0,
|
||||||
|
0x7a, 0xd2, 0x9c, 0x9e, 0x74, 0x95, 0x1e, 0xeb, 0x70, 0x4e, 0x2b, 0x94, 0xae, 0x4f, 0xfe, 0x1d,
|
||||||
|
0x00, 0x00, 0xff, 0xff, 0x88, 0xb3, 0x22, 0x9b, 0x78, 0x1c, 0x00, 0x00,
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,8 @@ syntax = "proto3";
|
||||||
|
|
||||||
package types;
|
package types;
|
||||||
|
|
||||||
|
import "google/protobuf/timestamp.proto";
|
||||||
|
|
||||||
service API {
|
service API {
|
||||||
rpc GetServerVersion(GetServerVersionRequest) returns (GetServerVersionResponse) {}
|
rpc GetServerVersion(GetServerVersionRequest) returns (GetServerVersionResponse) {}
|
||||||
rpc CreateContainer(CreateContainerRequest) returns (CreateContainerResponse) {}
|
rpc CreateContainer(CreateContainerRequest) returns (CreateContainerResponse) {}
|
||||||
|
@ -207,7 +209,8 @@ message UpdateContainerResponse {
|
||||||
}
|
}
|
||||||
|
|
||||||
message EventsRequest {
|
message EventsRequest {
|
||||||
uint64 timestamp = 1;
|
// Tag 1 is deprecated (old uint64 timestamp)
|
||||||
|
google.protobuf.Timestamp timestamp = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
message Event {
|
message Event {
|
||||||
|
@ -215,7 +218,8 @@ message Event {
|
||||||
string id = 2;
|
string id = 2;
|
||||||
uint32 status = 3;
|
uint32 status = 3;
|
||||||
string pid = 4;
|
string pid = 4;
|
||||||
uint64 timestamp = 5;
|
// Tag 5 is deprecated (old uint64 timestamp)
|
||||||
|
google.protobuf.Timestamp timestamp = 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
message NetworkStats {
|
message NetworkStats {
|
||||||
|
@ -305,7 +309,8 @@ message CgroupStats {
|
||||||
message StatsResponse {
|
message StatsResponse {
|
||||||
repeated NetworkStats network_stats = 1;
|
repeated NetworkStats network_stats = 1;
|
||||||
CgroupStats cgroup_stats = 2;
|
CgroupStats cgroup_stats = 2;
|
||||||
uint64 timestamp = 3;
|
// Tag 3 is deprecated (old uint64 timestamp)
|
||||||
|
google.protobuf.Timestamp timestamp = 4;
|
||||||
};
|
};
|
||||||
|
|
||||||
message StatsRequest {
|
message StatsRequest {
|
||||||
|
|
|
@ -20,6 +20,7 @@ import (
|
||||||
"github.com/docker/containerd/api/grpc/types"
|
"github.com/docker/containerd/api/grpc/types"
|
||||||
"github.com/docker/containerd/specs"
|
"github.com/docker/containerd/specs"
|
||||||
"github.com/docker/docker/pkg/term"
|
"github.com/docker/docker/pkg/term"
|
||||||
|
"github.com/golang/protobuf/ptypes"
|
||||||
netcontext "golang.org/x/net/context"
|
netcontext "golang.org/x/net/context"
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
"google.golang.org/grpc/grpclog"
|
"google.golang.org/grpc/grpclog"
|
||||||
|
@ -650,7 +651,7 @@ var updateCommand = cli.Command{
|
||||||
}
|
}
|
||||||
|
|
||||||
func waitForExit(c types.APIClient, events types.API_EventsClient, id, pid string, closer func()) {
|
func waitForExit(c types.APIClient, events types.API_EventsClient, id, pid string, closer func()) {
|
||||||
timestamp := uint64(time.Now().Unix())
|
timestamp := time.Now()
|
||||||
for {
|
for {
|
||||||
e, err := events.Recv()
|
e, err := events.Recv()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -659,10 +660,16 @@ func waitForExit(c types.APIClient, events types.API_EventsClient, id, pid strin
|
||||||
os.Exit(128 + int(syscall.SIGHUP))
|
os.Exit(128 + int(syscall.SIGHUP))
|
||||||
}
|
}
|
||||||
time.Sleep(1 * time.Second)
|
time.Sleep(1 * time.Second)
|
||||||
events, _ = c.Events(netcontext.Background(), &types.EventsRequest{Timestamp: timestamp})
|
tsp, err := ptypes.TimestampProto(timestamp)
|
||||||
|
if err != nil {
|
||||||
|
closer()
|
||||||
|
fmt.Fprintf(os.Stderr, "%s", err.Error())
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
events, _ = c.Events(netcontext.Background(), &types.EventsRequest{Timestamp: tsp})
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
timestamp = e.Timestamp
|
timestamp, err = ptypes.Timestamp(e.Timestamp)
|
||||||
if e.Id == id && e.Type == "exit" && e.Pid == pid {
|
if e.Id == id && e.Type == "exit" && e.Pid == pid {
|
||||||
closer()
|
closer()
|
||||||
os.Exit(int(e.Status))
|
os.Exit(int(e.Status))
|
||||||
|
|
|
@ -8,6 +8,7 @@ import (
|
||||||
|
|
||||||
"github.com/codegangsta/cli"
|
"github.com/codegangsta/cli"
|
||||||
"github.com/docker/containerd/api/grpc/types"
|
"github.com/docker/containerd/api/grpc/types"
|
||||||
|
"github.com/golang/protobuf/ptypes"
|
||||||
netcontext "golang.org/x/net/context"
|
netcontext "golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -22,7 +23,7 @@ var eventsCommand = cli.Command{
|
||||||
},
|
},
|
||||||
Action: func(context *cli.Context) {
|
Action: func(context *cli.Context) {
|
||||||
var (
|
var (
|
||||||
t int64
|
t = time.Time{}
|
||||||
c = getClient(context)
|
c = getClient(context)
|
||||||
)
|
)
|
||||||
if ts := context.String("timestamp"); ts != "" {
|
if ts := context.String("timestamp"); ts != "" {
|
||||||
|
@ -30,15 +31,19 @@ var eventsCommand = cli.Command{
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fatal(err.Error(), 1)
|
fatal(err.Error(), 1)
|
||||||
}
|
}
|
||||||
t = from.Unix()
|
t = from
|
||||||
|
}
|
||||||
|
tsp, err := ptypes.TimestampProto(t)
|
||||||
|
if err != nil {
|
||||||
|
fatal(err.Error(), 1)
|
||||||
}
|
}
|
||||||
events, err := c.Events(netcontext.Background(), &types.EventsRequest{
|
events, err := c.Events(netcontext.Background(), &types.EventsRequest{
|
||||||
Timestamp: uint64(t),
|
Timestamp: tsp,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fatal(err.Error(), 1)
|
fatal(err.Error(), 1)
|
||||||
}
|
}
|
||||||
w := tabwriter.NewWriter(os.Stdout, 20, 1, 3, ' ', 0)
|
w := tabwriter.NewWriter(os.Stdout, 31, 1, 1, ' ', 0)
|
||||||
fmt.Fprint(w, "TIME\tTYPE\tID\tPID\tSTATUS\n")
|
fmt.Fprint(w, "TIME\tTYPE\tID\tPID\tSTATUS\n")
|
||||||
w.Flush()
|
w.Flush()
|
||||||
for {
|
for {
|
||||||
|
@ -46,7 +51,12 @@ var eventsCommand = cli.Command{
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fatal(err.Error(), 1)
|
fatal(err.Error(), 1)
|
||||||
}
|
}
|
||||||
fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%d\n", time.Unix(int64(e.Timestamp), 0).Format(time.RFC3339Nano), e.Type, e.Id, e.Pid, e.Status)
|
t, err := ptypes.Timestamp(e.Timestamp)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintf(os.Stderr, "Unable to convert timestamp")
|
||||||
|
t = time.Time{}
|
||||||
|
}
|
||||||
|
fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%d\n", t.Format(time.RFC3339Nano), e.Type, e.Id, e.Pid, e.Status)
|
||||||
w.Flush()
|
w.Flush()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -21,6 +21,7 @@ import (
|
||||||
"github.com/docker/containerd/api/grpc/types"
|
"github.com/docker/containerd/api/grpc/types"
|
||||||
utils "github.com/docker/containerd/testutils"
|
utils "github.com/docker/containerd/testutils"
|
||||||
"github.com/go-check/check"
|
"github.com/go-check/check"
|
||||||
|
"github.com/golang/protobuf/ptypes/timestamp"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Test(t *testing.T) {
|
func Test(t *testing.T) {
|
||||||
|
@ -28,7 +29,7 @@ func Test(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
check.Suite(&ContainerdSuite{lastEventTs: uint64(time.Now().Unix())})
|
check.Suite(&ContainerdSuite{})
|
||||||
}
|
}
|
||||||
|
|
||||||
type ContainerdSuite struct {
|
type ContainerdSuite struct {
|
||||||
|
@ -42,7 +43,7 @@ type ContainerdSuite struct {
|
||||||
grpcClient types.APIClient
|
grpcClient types.APIClient
|
||||||
eventFiltersMutex sync.Mutex
|
eventFiltersMutex sync.Mutex
|
||||||
eventFilters map[string]func(event *types.Event)
|
eventFilters map[string]func(event *types.Event)
|
||||||
lastEventTs uint64
|
lastEventTs *timestamp.Timestamp
|
||||||
}
|
}
|
||||||
|
|
||||||
// getClient returns a connection to the Suite containerd
|
// getClient returns a connection to the Suite containerd
|
||||||
|
|
|
@ -251,8 +251,8 @@ func (c *container) Delete() error {
|
||||||
|
|
||||||
args := c.runtimeArgs
|
args := c.runtimeArgs
|
||||||
args = append(args, "delete", c.id)
|
args = append(args, "delete", c.id)
|
||||||
if derr := exec.Command(c.runtime, args...).Run(); err == nil {
|
if b, derr := exec.Command(c.runtime, args...).CombinedOutput(); err != nil {
|
||||||
err = derr
|
err = fmt.Errorf("%s: %q", derr, string(b))
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
110
vendor/src/github.com/golang/protobuf/ptypes/any/any.pb.go
vendored
Normal file
110
vendor/src/github.com/golang/protobuf/ptypes/any/any.pb.go
vendored
Normal file
|
@ -0,0 +1,110 @@
|
||||||
|
// Code generated by protoc-gen-go.
|
||||||
|
// source: github.com/golang/protobuf/types/any/any.proto
|
||||||
|
// DO NOT EDIT!
|
||||||
|
|
||||||
|
/*
|
||||||
|
Package any is a generated protocol buffer package.
|
||||||
|
|
||||||
|
It is generated from these files:
|
||||||
|
github.com/golang/protobuf/types/any/any.proto
|
||||||
|
|
||||||
|
It has these top-level messages:
|
||||||
|
Any
|
||||||
|
*/
|
||||||
|
package any
|
||||||
|
|
||||||
|
import proto "github.com/golang/protobuf/proto"
|
||||||
|
import fmt "fmt"
|
||||||
|
import math "math"
|
||||||
|
|
||||||
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
|
var _ = proto.Marshal
|
||||||
|
var _ = fmt.Errorf
|
||||||
|
var _ = math.Inf
|
||||||
|
|
||||||
|
// This is a compile-time assertion to ensure that this generated file
|
||||||
|
// is compatible with the proto package it is being compiled against.
|
||||||
|
const _ = proto.ProtoPackageIsVersion1
|
||||||
|
|
||||||
|
// `Any` contains an arbitrary serialized message along with a URL
|
||||||
|
// that describes the type of the serialized message.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// JSON
|
||||||
|
// ====
|
||||||
|
// The JSON representation of an `Any` value uses the regular
|
||||||
|
// representation of the deserialized, embedded message, with an
|
||||||
|
// additional field `@type` which contains the type URL. Example:
|
||||||
|
//
|
||||||
|
// package google.profile;
|
||||||
|
// message Person {
|
||||||
|
// string first_name = 1;
|
||||||
|
// string last_name = 2;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// {
|
||||||
|
// "@type": "type.googleapis.com/google.profile.Person",
|
||||||
|
// "firstName": <string>,
|
||||||
|
// "lastName": <string>
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// If the embedded message type is well-known and has a custom JSON
|
||||||
|
// representation, that representation will be embedded adding a field
|
||||||
|
// `value` which holds the custom JSON in addition to the `@type`
|
||||||
|
// field. Example (for message [google.protobuf.Duration][]):
|
||||||
|
//
|
||||||
|
// {
|
||||||
|
// "@type": "type.googleapis.com/google.protobuf.Duration",
|
||||||
|
// "value": "1.212s"
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
type Any struct {
|
||||||
|
// A URL/resource name whose content describes the type of the
|
||||||
|
// serialized message.
|
||||||
|
//
|
||||||
|
// For URLs which use the schema `http`, `https`, or no schema, the
|
||||||
|
// following restrictions and interpretations apply:
|
||||||
|
//
|
||||||
|
// * If no schema is provided, `https` is assumed.
|
||||||
|
// * The last segment of the URL's path must represent the fully
|
||||||
|
// qualified name of the type (as in `path/google.protobuf.Duration`).
|
||||||
|
// * An HTTP GET on the URL must yield a [google.protobuf.Type][]
|
||||||
|
// value in binary format, or produce an error.
|
||||||
|
// * Applications are allowed to cache lookup results based on the
|
||||||
|
// URL, or have them precompiled into a binary to avoid any
|
||||||
|
// lookup. Therefore, binary compatibility needs to be preserved
|
||||||
|
// on changes to types. (Use versioned type names to manage
|
||||||
|
// breaking changes.)
|
||||||
|
//
|
||||||
|
// Schemas other than `http`, `https` (or the empty schema) might be
|
||||||
|
// used with implementation specific semantics.
|
||||||
|
//
|
||||||
|
TypeUrl string `protobuf:"bytes,1,opt,name=type_url,json=typeUrl" json:"type_url,omitempty"`
|
||||||
|
// Must be valid serialized data of the above specified type.
|
||||||
|
Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Any) Reset() { *m = Any{} }
|
||||||
|
func (m *Any) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*Any) ProtoMessage() {}
|
||||||
|
func (*Any) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
proto.RegisterType((*Any)(nil), "google.protobuf.Any")
|
||||||
|
}
|
||||||
|
|
||||||
|
var fileDescriptor0 = []byte{
|
||||||
|
// 183 bytes of a gzipped FileDescriptorProto
|
||||||
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0xd2, 0x4b, 0xcf, 0x2c, 0xc9,
|
||||||
|
0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xcf, 0xcf, 0x49, 0xcc, 0x4b, 0xd7, 0x2f, 0x28,
|
||||||
|
0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x2f, 0xa9, 0x2c, 0x48, 0x2d, 0xd6, 0x4f, 0xcc, 0xab,
|
||||||
|
0x04, 0x61, 0x3d, 0xb0, 0xb0, 0x10, 0x7f, 0x7a, 0x7e, 0x7e, 0x7a, 0x4e, 0xaa, 0x1e, 0x4c, 0x91,
|
||||||
|
0x92, 0x19, 0x17, 0xb3, 0x63, 0x5e, 0xa5, 0x90, 0x24, 0x17, 0x07, 0x48, 0x79, 0x7c, 0x69, 0x51,
|
||||||
|
0x8e, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0x67, 0x10, 0x3b, 0x88, 0x1f, 0x5a, 0x94, 0x23, 0x24, 0xc2,
|
||||||
|
0xc5, 0x5a, 0x96, 0x98, 0x53, 0x9a, 0x2a, 0xc1, 0x04, 0x14, 0xe7, 0x09, 0x82, 0x70, 0x9c, 0x02,
|
||||||
|
0xb8, 0x84, 0x81, 0x76, 0xea, 0xa1, 0x19, 0xe7, 0xc4, 0x01, 0x34, 0x2c, 0x00, 0xc4, 0x09, 0x60,
|
||||||
|
0x8c, 0x62, 0x06, 0x5a, 0xbb, 0x80, 0x91, 0x71, 0x11, 0x13, 0xb3, 0x7b, 0x80, 0xd3, 0x2a, 0x26,
|
||||||
|
0x39, 0x77, 0x88, 0xda, 0x00, 0xa8, 0x5a, 0xbd, 0xf0, 0xd4, 0x9c, 0x1c, 0xef, 0xbc, 0xfc, 0xf2,
|
||||||
|
0xbc, 0x10, 0x90, 0x43, 0x93, 0xd8, 0xc0, 0x86, 0x18, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0x69,
|
||||||
|
0x04, 0x7f, 0x3b, 0xd3, 0x00, 0x00, 0x00,
|
||||||
|
}
|
100
vendor/src/github.com/golang/protobuf/ptypes/any/any.proto
vendored
Normal file
100
vendor/src/github.com/golang/protobuf/ptypes/any/any.proto
vendored
Normal file
|
@ -0,0 +1,100 @@
|
||||||
|
// Protocol Buffers - Google's data interchange format
|
||||||
|
// Copyright 2008 Google Inc. All rights reserved.
|
||||||
|
// https://developers.google.com/protocol-buffers/
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are
|
||||||
|
// met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following disclaimer
|
||||||
|
// in the documentation and/or other materials provided with the
|
||||||
|
// distribution.
|
||||||
|
// * Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived from
|
||||||
|
// this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
package google.protobuf;
|
||||||
|
option go_package = "any";
|
||||||
|
|
||||||
|
option csharp_namespace = "Google.Protobuf.WellKnownTypes";
|
||||||
|
option java_package = "com.google.protobuf";
|
||||||
|
option java_outer_classname = "AnyProto";
|
||||||
|
option java_multiple_files = true;
|
||||||
|
option java_generate_equals_and_hash = true;
|
||||||
|
option objc_class_prefix = "GPB";
|
||||||
|
|
||||||
|
// `Any` contains an arbitrary serialized message along with a URL
|
||||||
|
// that describes the type of the serialized message.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// JSON
|
||||||
|
// ====
|
||||||
|
// The JSON representation of an `Any` value uses the regular
|
||||||
|
// representation of the deserialized, embedded message, with an
|
||||||
|
// additional field `@type` which contains the type URL. Example:
|
||||||
|
//
|
||||||
|
// package google.profile;
|
||||||
|
// message Person {
|
||||||
|
// string first_name = 1;
|
||||||
|
// string last_name = 2;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// {
|
||||||
|
// "@type": "type.googleapis.com/google.profile.Person",
|
||||||
|
// "firstName": <string>,
|
||||||
|
// "lastName": <string>
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// If the embedded message type is well-known and has a custom JSON
|
||||||
|
// representation, that representation will be embedded adding a field
|
||||||
|
// `value` which holds the custom JSON in addition to the `@type`
|
||||||
|
// field. Example (for message [google.protobuf.Duration][]):
|
||||||
|
//
|
||||||
|
// {
|
||||||
|
// "@type": "type.googleapis.com/google.protobuf.Duration",
|
||||||
|
// "value": "1.212s"
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
message Any {
|
||||||
|
// A URL/resource name whose content describes the type of the
|
||||||
|
// serialized message.
|
||||||
|
//
|
||||||
|
// For URLs which use the schema `http`, `https`, or no schema, the
|
||||||
|
// following restrictions and interpretations apply:
|
||||||
|
//
|
||||||
|
// * If no schema is provided, `https` is assumed.
|
||||||
|
// * The last segment of the URL's path must represent the fully
|
||||||
|
// qualified name of the type (as in `path/google.protobuf.Duration`).
|
||||||
|
// * An HTTP GET on the URL must yield a [google.protobuf.Type][]
|
||||||
|
// value in binary format, or produce an error.
|
||||||
|
// * Applications are allowed to cache lookup results based on the
|
||||||
|
// URL, or have them precompiled into a binary to avoid any
|
||||||
|
// lookup. Therefore, binary compatibility needs to be preserved
|
||||||
|
// on changes to types. (Use versioned type names to manage
|
||||||
|
// breaking changes.)
|
||||||
|
//
|
||||||
|
// Schemas other than `http`, `https` (or the empty schema) might be
|
||||||
|
// used with implementation specific semantics.
|
||||||
|
//
|
||||||
|
string type_url = 1;
|
||||||
|
|
||||||
|
// Must be valid serialized data of the above specified type.
|
||||||
|
bytes value = 2;
|
||||||
|
}
|
35
vendor/src/github.com/golang/protobuf/ptypes/doc.go
vendored
Normal file
35
vendor/src/github.com/golang/protobuf/ptypes/doc.go
vendored
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
// Go support for Protocol Buffers - Google's data interchange format
|
||||||
|
//
|
||||||
|
// Copyright 2016 The Go Authors. All rights reserved.
|
||||||
|
// https://github.com/golang/protobuf
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are
|
||||||
|
// met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following disclaimer
|
||||||
|
// in the documentation and/or other materials provided with the
|
||||||
|
// distribution.
|
||||||
|
// * Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived from
|
||||||
|
// this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
/*
|
||||||
|
Package ptypes contains code for interacting with well-known types.
|
||||||
|
*/
|
||||||
|
package ptypes
|
102
vendor/src/github.com/golang/protobuf/ptypes/duration.go
vendored
Normal file
102
vendor/src/github.com/golang/protobuf/ptypes/duration.go
vendored
Normal file
|
@ -0,0 +1,102 @@
|
||||||
|
// Go support for Protocol Buffers - Google's data interchange format
|
||||||
|
//
|
||||||
|
// Copyright 2016 The Go Authors. All rights reserved.
|
||||||
|
// https://github.com/golang/protobuf
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are
|
||||||
|
// met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following disclaimer
|
||||||
|
// in the documentation and/or other materials provided with the
|
||||||
|
// distribution.
|
||||||
|
// * Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived from
|
||||||
|
// this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
package ptypes
|
||||||
|
|
||||||
|
// This file implements conversions between google.protobuf.Duration
|
||||||
|
// and time.Duration.
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
durpb "github.com/golang/protobuf/ptypes/duration"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// Range of a durpb.Duration in seconds, as specified in
|
||||||
|
// google/protobuf/duration.proto. This is about 10,000 years in seconds.
|
||||||
|
maxSeconds = int64(10000 * 365.25 * 24 * 60 * 60)
|
||||||
|
minSeconds = -maxSeconds
|
||||||
|
)
|
||||||
|
|
||||||
|
// validateDuration determines whether the durpb.Duration is valid according to the
|
||||||
|
// definition in google/protobuf/duration.proto. A valid durpb.Duration
|
||||||
|
// may still be too large to fit into a time.Duration (the range of durpb.Duration
|
||||||
|
// is about 10,000 years, and the range of time.Duration is about 290).
|
||||||
|
func validateDuration(d *durpb.Duration) error {
|
||||||
|
if d == nil {
|
||||||
|
return errors.New("duration: nil Duration")
|
||||||
|
}
|
||||||
|
if d.Seconds < minSeconds || d.Seconds > maxSeconds {
|
||||||
|
return fmt.Errorf("duration: %v: seconds out of range", d)
|
||||||
|
}
|
||||||
|
if d.Nanos <= -1e9 || d.Nanos >= 1e9 {
|
||||||
|
return fmt.Errorf("duration: %v: nanos out of range", d)
|
||||||
|
}
|
||||||
|
// Seconds and Nanos must have the same sign, unless d.Nanos is zero.
|
||||||
|
if (d.Seconds < 0 && d.Nanos > 0) || (d.Seconds > 0 && d.Nanos < 0) {
|
||||||
|
return fmt.Errorf("duration: %v: seconds and nanos have different signs", d)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Duration converts a durpb.Duration to a time.Duration. Duration
|
||||||
|
// returns an error if the durpb.Duration is invalid or is too large to be
|
||||||
|
// represented in a time.Duration.
|
||||||
|
func Duration(p *durpb.Duration) (time.Duration, error) {
|
||||||
|
if err := validateDuration(p); err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
d := time.Duration(p.Seconds) * time.Second
|
||||||
|
if int64(d/time.Second) != p.Seconds {
|
||||||
|
return 0, fmt.Errorf("duration: %v is out of range for time.Duration", p)
|
||||||
|
}
|
||||||
|
if p.Nanos != 0 {
|
||||||
|
d += time.Duration(p.Nanos)
|
||||||
|
if (d < 0) != (p.Nanos < 0) {
|
||||||
|
return 0, fmt.Errorf("duration: %v is out of range for time.Duration", p)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return d, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DurationProto converts a time.Duration to a durpb.Duration.
|
||||||
|
func DurationProto(d time.Duration) *durpb.Duration {
|
||||||
|
nanos := d.Nanoseconds()
|
||||||
|
secs := nanos / 1e9
|
||||||
|
nanos -= secs * 1e9
|
||||||
|
return &durpb.Duration{
|
||||||
|
Seconds: secs,
|
||||||
|
Nanos: int32(nanos),
|
||||||
|
}
|
||||||
|
}
|
106
vendor/src/github.com/golang/protobuf/ptypes/duration/duration.pb.go
vendored
Normal file
106
vendor/src/github.com/golang/protobuf/ptypes/duration/duration.pb.go
vendored
Normal file
|
@ -0,0 +1,106 @@
|
||||||
|
// Code generated by protoc-gen-go.
|
||||||
|
// source: github.com/golang/protobuf/types/duration/duration.proto
|
||||||
|
// DO NOT EDIT!
|
||||||
|
|
||||||
|
/*
|
||||||
|
Package duration is a generated protocol buffer package.
|
||||||
|
|
||||||
|
It is generated from these files:
|
||||||
|
github.com/golang/protobuf/types/duration/duration.proto
|
||||||
|
|
||||||
|
It has these top-level messages:
|
||||||
|
Duration
|
||||||
|
*/
|
||||||
|
package duration
|
||||||
|
|
||||||
|
import proto "github.com/golang/protobuf/proto"
|
||||||
|
import fmt "fmt"
|
||||||
|
import math "math"
|
||||||
|
|
||||||
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
|
var _ = proto.Marshal
|
||||||
|
var _ = fmt.Errorf
|
||||||
|
var _ = math.Inf
|
||||||
|
|
||||||
|
// This is a compile-time assertion to ensure that this generated file
|
||||||
|
// is compatible with the proto package it is being compiled against.
|
||||||
|
const _ = proto.ProtoPackageIsVersion1
|
||||||
|
|
||||||
|
// A Duration represents a signed, fixed-length span of time represented
|
||||||
|
// as a count of seconds and fractions of seconds at nanosecond
|
||||||
|
// resolution. It is independent of any calendar and concepts like "day"
|
||||||
|
// or "month". It is related to Timestamp in that the difference between
|
||||||
|
// two Timestamp values is a Duration and it can be added or subtracted
|
||||||
|
// from a Timestamp. Range is approximately +-10,000 years.
|
||||||
|
//
|
||||||
|
// Example 1: Compute Duration from two Timestamps in pseudo code.
|
||||||
|
//
|
||||||
|
// Timestamp start = ...;
|
||||||
|
// Timestamp end = ...;
|
||||||
|
// Duration duration = ...;
|
||||||
|
//
|
||||||
|
// duration.seconds = end.seconds - start.seconds;
|
||||||
|
// duration.nanos = end.nanos - start.nanos;
|
||||||
|
//
|
||||||
|
// if (duration.seconds < 0 && duration.nanos > 0) {
|
||||||
|
// duration.seconds += 1;
|
||||||
|
// duration.nanos -= 1000000000;
|
||||||
|
// } else if (durations.seconds > 0 && duration.nanos < 0) {
|
||||||
|
// duration.seconds -= 1;
|
||||||
|
// duration.nanos += 1000000000;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// Example 2: Compute Timestamp from Timestamp + Duration in pseudo code.
|
||||||
|
//
|
||||||
|
// Timestamp start = ...;
|
||||||
|
// Duration duration = ...;
|
||||||
|
// Timestamp end = ...;
|
||||||
|
//
|
||||||
|
// end.seconds = start.seconds + duration.seconds;
|
||||||
|
// end.nanos = start.nanos + duration.nanos;
|
||||||
|
//
|
||||||
|
// if (end.nanos < 0) {
|
||||||
|
// end.seconds -= 1;
|
||||||
|
// end.nanos += 1000000000;
|
||||||
|
// } else if (end.nanos >= 1000000000) {
|
||||||
|
// end.seconds += 1;
|
||||||
|
// end.nanos -= 1000000000;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
type Duration struct {
|
||||||
|
// Signed seconds of the span of time. Must be from -315,576,000,000
|
||||||
|
// to +315,576,000,000 inclusive.
|
||||||
|
Seconds int64 `protobuf:"varint,1,opt,name=seconds" json:"seconds,omitempty"`
|
||||||
|
// Signed fractions of a second at nanosecond resolution of the span
|
||||||
|
// of time. Durations less than one second are represented with a 0
|
||||||
|
// `seconds` field and a positive or negative `nanos` field. For durations
|
||||||
|
// of one second or more, a non-zero value for the `nanos` field must be
|
||||||
|
// of the same sign as the `seconds` field. Must be from -999,999,999
|
||||||
|
// to +999,999,999 inclusive.
|
||||||
|
Nanos int32 `protobuf:"varint,2,opt,name=nanos" json:"nanos,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Duration) Reset() { *m = Duration{} }
|
||||||
|
func (m *Duration) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*Duration) ProtoMessage() {}
|
||||||
|
func (*Duration) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
proto.RegisterType((*Duration)(nil), "google.protobuf.Duration")
|
||||||
|
}
|
||||||
|
|
||||||
|
var fileDescriptor0 = []byte{
|
||||||
|
// 186 bytes of a gzipped FileDescriptorProto
|
||||||
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0xb2, 0x48, 0xcf, 0x2c, 0xc9,
|
||||||
|
0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xcf, 0xcf, 0x49, 0xcc, 0x4b, 0xd7, 0x2f, 0x28,
|
||||||
|
0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x2f, 0xa9, 0x2c, 0x48, 0x2d, 0xd6, 0x4f, 0x29, 0x2d,
|
||||||
|
0x4a, 0x2c, 0xc9, 0xcc, 0xcf, 0x83, 0x33, 0xf4, 0xc0, 0x0a, 0x84, 0xf8, 0xd3, 0xf3, 0xf3, 0xd3,
|
||||||
|
0x73, 0x52, 0xf5, 0x60, 0xca, 0x95, 0xac, 0xb8, 0x38, 0x5c, 0xa0, 0x4a, 0x84, 0x24, 0xb8, 0xd8,
|
||||||
|
0x8b, 0x53, 0x93, 0xf3, 0xf3, 0x52, 0x8a, 0x25, 0x18, 0x15, 0x18, 0x35, 0x98, 0x83, 0x60, 0x5c,
|
||||||
|
0x21, 0x11, 0x2e, 0xd6, 0xbc, 0xc4, 0xbc, 0xfc, 0x62, 0x09, 0x26, 0xa0, 0x38, 0x6b, 0x10, 0x84,
|
||||||
|
0xe3, 0x14, 0xc5, 0x25, 0x0c, 0x74, 0x81, 0x1e, 0x9a, 0x91, 0x4e, 0xbc, 0x30, 0x03, 0x03, 0x40,
|
||||||
|
0x22, 0x01, 0x8c, 0x51, 0x1c, 0x30, 0x47, 0x2c, 0x60, 0x64, 0x5c, 0xc4, 0xc4, 0xec, 0x1e, 0xe0,
|
||||||
|
0xb4, 0x8a, 0x49, 0xce, 0x1d, 0xa2, 0x2b, 0x00, 0xaa, 0x4b, 0x2f, 0x3c, 0x35, 0x27, 0xc7, 0x3b,
|
||||||
|
0x2f, 0xbf, 0x3c, 0x2f, 0x04, 0xe4, 0x81, 0x24, 0x36, 0xb0, 0x71, 0xc6, 0x80, 0x00, 0x00, 0x00,
|
||||||
|
0xff, 0xff, 0x04, 0x47, 0x33, 0x15, 0xeb, 0x00, 0x00, 0x00,
|
||||||
|
}
|
97
vendor/src/github.com/golang/protobuf/ptypes/duration/duration.proto
vendored
Normal file
97
vendor/src/github.com/golang/protobuf/ptypes/duration/duration.proto
vendored
Normal file
|
@ -0,0 +1,97 @@
|
||||||
|
// Protocol Buffers - Google's data interchange format
|
||||||
|
// Copyright 2008 Google Inc. All rights reserved.
|
||||||
|
// https://developers.google.com/protocol-buffers/
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are
|
||||||
|
// met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following disclaimer
|
||||||
|
// in the documentation and/or other materials provided with the
|
||||||
|
// distribution.
|
||||||
|
// * Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived from
|
||||||
|
// this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
package google.protobuf;
|
||||||
|
option go_package = "duration";
|
||||||
|
|
||||||
|
option csharp_namespace = "Google.Protobuf.WellKnownTypes";
|
||||||
|
option java_package = "com.google.protobuf";
|
||||||
|
option java_outer_classname = "DurationProto";
|
||||||
|
option java_multiple_files = true;
|
||||||
|
option java_generate_equals_and_hash = true;
|
||||||
|
option objc_class_prefix = "GPB";
|
||||||
|
|
||||||
|
// A Duration represents a signed, fixed-length span of time represented
|
||||||
|
// as a count of seconds and fractions of seconds at nanosecond
|
||||||
|
// resolution. It is independent of any calendar and concepts like "day"
|
||||||
|
// or "month". It is related to Timestamp in that the difference between
|
||||||
|
// two Timestamp values is a Duration and it can be added or subtracted
|
||||||
|
// from a Timestamp. Range is approximately +-10,000 years.
|
||||||
|
//
|
||||||
|
// Example 1: Compute Duration from two Timestamps in pseudo code.
|
||||||
|
//
|
||||||
|
// Timestamp start = ...;
|
||||||
|
// Timestamp end = ...;
|
||||||
|
// Duration duration = ...;
|
||||||
|
//
|
||||||
|
// duration.seconds = end.seconds - start.seconds;
|
||||||
|
// duration.nanos = end.nanos - start.nanos;
|
||||||
|
//
|
||||||
|
// if (duration.seconds < 0 && duration.nanos > 0) {
|
||||||
|
// duration.seconds += 1;
|
||||||
|
// duration.nanos -= 1000000000;
|
||||||
|
// } else if (durations.seconds > 0 && duration.nanos < 0) {
|
||||||
|
// duration.seconds -= 1;
|
||||||
|
// duration.nanos += 1000000000;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// Example 2: Compute Timestamp from Timestamp + Duration in pseudo code.
|
||||||
|
//
|
||||||
|
// Timestamp start = ...;
|
||||||
|
// Duration duration = ...;
|
||||||
|
// Timestamp end = ...;
|
||||||
|
//
|
||||||
|
// end.seconds = start.seconds + duration.seconds;
|
||||||
|
// end.nanos = start.nanos + duration.nanos;
|
||||||
|
//
|
||||||
|
// if (end.nanos < 0) {
|
||||||
|
// end.seconds -= 1;
|
||||||
|
// end.nanos += 1000000000;
|
||||||
|
// } else if (end.nanos >= 1000000000) {
|
||||||
|
// end.seconds += 1;
|
||||||
|
// end.nanos -= 1000000000;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
message Duration {
|
||||||
|
|
||||||
|
// Signed seconds of the span of time. Must be from -315,576,000,000
|
||||||
|
// to +315,576,000,000 inclusive.
|
||||||
|
int64 seconds = 1;
|
||||||
|
|
||||||
|
// Signed fractions of a second at nanosecond resolution of the span
|
||||||
|
// of time. Durations less than one second are represented with a 0
|
||||||
|
// `seconds` field and a positive or negative `nanos` field. For durations
|
||||||
|
// of one second or more, a non-zero value for the `nanos` field must be
|
||||||
|
// of the same sign as the `seconds` field. Must be from -999,999,999
|
||||||
|
// to +999,999,999 inclusive.
|
||||||
|
int32 nanos = 2;
|
||||||
|
}
|
72
vendor/src/github.com/golang/protobuf/ptypes/regen.sh
vendored
Executable file
72
vendor/src/github.com/golang/protobuf/ptypes/regen.sh
vendored
Executable file
|
@ -0,0 +1,72 @@
|
||||||
|
#!/bin/bash -e
|
||||||
|
#
|
||||||
|
# This script fetches and rebuilds the "well-known types" protocol buffers.
|
||||||
|
# To run this you will need protoc and goprotobuf installed;
|
||||||
|
# see https://github.com/golang/protobuf for instructions.
|
||||||
|
# You also need Go and Git installed.
|
||||||
|
|
||||||
|
PKG=github.com/golang/protobuf/types
|
||||||
|
UPSTREAM=https://github.com/google/protobuf
|
||||||
|
UPSTREAM_SUBDIR=src/google/protobuf
|
||||||
|
PROTO_FILES='
|
||||||
|
any.proto
|
||||||
|
duration.proto
|
||||||
|
empty.proto
|
||||||
|
struct.proto
|
||||||
|
timestamp.proto
|
||||||
|
wrappers.proto
|
||||||
|
'
|
||||||
|
|
||||||
|
function die() {
|
||||||
|
echo 1>&2 $*
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Sanity check that the right tools are accessible.
|
||||||
|
for tool in go git protoc protoc-gen-go; do
|
||||||
|
q=$(which $tool) || die "didn't find $tool"
|
||||||
|
echo 1>&2 "$tool: $q"
|
||||||
|
done
|
||||||
|
|
||||||
|
tmpdir=$(mktemp -d -t regen-wkt.XXXXXX)
|
||||||
|
trap 'rm -rf $tmpdir' EXIT
|
||||||
|
|
||||||
|
echo -n 1>&2 "finding package dir... "
|
||||||
|
pkgdir=$(go list -f '{{.Dir}}' $PKG)
|
||||||
|
echo 1>&2 $pkgdir
|
||||||
|
base=$(echo $pkgdir | sed "s,/$PKG\$,,")
|
||||||
|
echo 1>&2 "base: $base"
|
||||||
|
cd $base
|
||||||
|
|
||||||
|
echo 1>&2 "fetching latest protos... "
|
||||||
|
git clone -q $UPSTREAM $tmpdir
|
||||||
|
# Pass 1: build mapping from upstream filename to our filename.
|
||||||
|
declare -A filename_map
|
||||||
|
for f in $(cd $PKG && find * -name '*.proto'); do
|
||||||
|
echo -n 1>&2 "looking for latest version of $f... "
|
||||||
|
up=$(cd $tmpdir/$UPSTREAM_SUBDIR && find * -name $(basename $f) | grep -v /testdata/)
|
||||||
|
echo 1>&2 $up
|
||||||
|
if [ $(echo $up | wc -w) != "1" ]; then
|
||||||
|
die "not exactly one match"
|
||||||
|
fi
|
||||||
|
filename_map[$up]=$f
|
||||||
|
done
|
||||||
|
# Pass 2: copy files, making necessary adjustments.
|
||||||
|
for up in "${!filename_map[@]}"; do
|
||||||
|
f=${filename_map[$up]}
|
||||||
|
shortname=$(basename $f | sed 's,\.proto$,,')
|
||||||
|
cat $tmpdir/$UPSTREAM_SUBDIR/$up |
|
||||||
|
# Adjust proto package.
|
||||||
|
# TODO(dsymonds): Upstream the go_package option instead.
|
||||||
|
sed '/^package /a option go_package = "'${shortname}'";' |
|
||||||
|
# Unfortunately "package struct" doesn't work.
|
||||||
|
sed '/option go_package/s,"struct","structpb",' |
|
||||||
|
cat > $PKG/$f
|
||||||
|
done
|
||||||
|
|
||||||
|
# Run protoc once per package.
|
||||||
|
for dir in $(find $PKG -name '*.proto' | xargs dirname | sort | uniq); do
|
||||||
|
echo 1>&2 "* $dir"
|
||||||
|
protoc --go_out=. $dir/*.proto
|
||||||
|
done
|
||||||
|
echo 1>&2 "All OK"
|
125
vendor/src/github.com/golang/protobuf/ptypes/timestamp.go
vendored
Normal file
125
vendor/src/github.com/golang/protobuf/ptypes/timestamp.go
vendored
Normal file
|
@ -0,0 +1,125 @@
|
||||||
|
// Go support for Protocol Buffers - Google's data interchange format
|
||||||
|
//
|
||||||
|
// Copyright 2016 The Go Authors. All rights reserved.
|
||||||
|
// https://github.com/golang/protobuf
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are
|
||||||
|
// met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following disclaimer
|
||||||
|
// in the documentation and/or other materials provided with the
|
||||||
|
// distribution.
|
||||||
|
// * Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived from
|
||||||
|
// this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
package ptypes
|
||||||
|
|
||||||
|
// This file implements operations on google.protobuf.Timestamp.
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
tspb "github.com/golang/protobuf/ptypes/timestamp"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// Seconds field of the earliest valid Timestamp.
|
||||||
|
// This is time.Date(1, 1, 1, 0, 0, 0, 0, time.UTC).Unix().
|
||||||
|
minValidSeconds = -62135596800
|
||||||
|
// Seconds field just after the latest valid Timestamp.
|
||||||
|
// This is time.Date(10000, 1, 1, 0, 0, 0, 0, time.UTC).Unix().
|
||||||
|
maxValidSeconds = 253402300800
|
||||||
|
)
|
||||||
|
|
||||||
|
// validateTimestamp determines whether a Timestamp is valid.
|
||||||
|
// A valid timestamp represents a time in the range
|
||||||
|
// [0001-01-01, 10000-01-01) and has a Nanos field
|
||||||
|
// in the range [0, 1e9).
|
||||||
|
//
|
||||||
|
// If the Timestamp is valid, validateTimestamp returns nil.
|
||||||
|
// Otherwise, it returns an error that describes
|
||||||
|
// the problem.
|
||||||
|
//
|
||||||
|
// Every valid Timestamp can be represented by a time.Time, but the converse is not true.
|
||||||
|
func validateTimestamp(ts *tspb.Timestamp) error {
|
||||||
|
if ts == nil {
|
||||||
|
return errors.New("timestamp: nil Timestamp")
|
||||||
|
}
|
||||||
|
if ts.Seconds < minValidSeconds {
|
||||||
|
return fmt.Errorf("timestamp: %v before 0001-01-01", ts)
|
||||||
|
}
|
||||||
|
if ts.Seconds >= maxValidSeconds {
|
||||||
|
return fmt.Errorf("timestamp: %v after 10000-01-01", ts)
|
||||||
|
}
|
||||||
|
if ts.Nanos < 0 || ts.Nanos >= 1e9 {
|
||||||
|
return fmt.Errorf("timestamp: %v: nanos not in range [0, 1e9)", ts)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Timestamp converts a google.protobuf.Timestamp proto to a time.Time.
|
||||||
|
// It returns an error if the argument is invalid.
|
||||||
|
//
|
||||||
|
// Unlike most Go functions, if Timestamp returns an error, the first return value
|
||||||
|
// is not the zero time.Time. Instead, it is the value obtained from the
|
||||||
|
// time.Unix function when passed the contents of the Timestamp, in the UTC
|
||||||
|
// locale. This may or may not be a meaningful time; many invalid Timestamps
|
||||||
|
// do map to valid time.Times.
|
||||||
|
//
|
||||||
|
// A nil Timestamp returns an error. The first return value in that case is
|
||||||
|
// undefined.
|
||||||
|
func Timestamp(ts *tspb.Timestamp) (time.Time, error) {
|
||||||
|
// Don't return the zero value on error, because corresponds to a valid
|
||||||
|
// timestamp. Instead return whatever time.Unix gives us.
|
||||||
|
var t time.Time
|
||||||
|
if ts == nil {
|
||||||
|
t = time.Unix(0, 0).UTC() // treat nil like the empty Timestamp
|
||||||
|
} else {
|
||||||
|
t = time.Unix(ts.Seconds, int64(ts.Nanos)).UTC()
|
||||||
|
}
|
||||||
|
return t, validateTimestamp(ts)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TimestampProto converts the time.Time to a google.protobuf.Timestamp proto.
|
||||||
|
// It returns an error if the resulting Timestamp is invalid.
|
||||||
|
func TimestampProto(t time.Time) (*tspb.Timestamp, error) {
|
||||||
|
seconds := t.Unix()
|
||||||
|
nanos := int32(t.Sub(time.Unix(seconds, 0)))
|
||||||
|
ts := &tspb.Timestamp{
|
||||||
|
Seconds: seconds,
|
||||||
|
Nanos: nanos,
|
||||||
|
}
|
||||||
|
if err := validateTimestamp(ts); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return ts, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// TimestampString returns the RFC 3339 string for valid Timestamps. For invalid
|
||||||
|
// Timestamps, it returns an error message in parentheses.
|
||||||
|
func TimestampString(ts *tspb.Timestamp) string {
|
||||||
|
t, err := Timestamp(ts)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Sprintf("(%v)", err)
|
||||||
|
}
|
||||||
|
return t.Format(time.RFC3339Nano)
|
||||||
|
}
|
119
vendor/src/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go
vendored
Normal file
119
vendor/src/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go
vendored
Normal file
|
@ -0,0 +1,119 @@
|
||||||
|
// Code generated by protoc-gen-go.
|
||||||
|
// source: github.com/golang/protobuf/types/timestamp/timestamp.proto
|
||||||
|
// DO NOT EDIT!
|
||||||
|
|
||||||
|
/*
|
||||||
|
Package timestamp is a generated protocol buffer package.
|
||||||
|
|
||||||
|
It is generated from these files:
|
||||||
|
github.com/golang/protobuf/types/timestamp/timestamp.proto
|
||||||
|
|
||||||
|
It has these top-level messages:
|
||||||
|
Timestamp
|
||||||
|
*/
|
||||||
|
package timestamp
|
||||||
|
|
||||||
|
import proto "github.com/golang/protobuf/proto"
|
||||||
|
import fmt "fmt"
|
||||||
|
import math "math"
|
||||||
|
|
||||||
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
|
var _ = proto.Marshal
|
||||||
|
var _ = fmt.Errorf
|
||||||
|
var _ = math.Inf
|
||||||
|
|
||||||
|
// This is a compile-time assertion to ensure that this generated file
|
||||||
|
// is compatible with the proto package it is being compiled against.
|
||||||
|
const _ = proto.ProtoPackageIsVersion1
|
||||||
|
|
||||||
|
// A Timestamp represents a point in time independent of any time zone
|
||||||
|
// or calendar, represented as seconds and fractions of seconds at
|
||||||
|
// nanosecond resolution in UTC Epoch time. It is encoded using the
|
||||||
|
// Proleptic Gregorian Calendar which extends the Gregorian calendar
|
||||||
|
// backwards to year one. It is encoded assuming all minutes are 60
|
||||||
|
// seconds long, i.e. leap seconds are "smeared" so that no leap second
|
||||||
|
// table is needed for interpretation. Range is from
|
||||||
|
// 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z.
|
||||||
|
// By restricting to that range, we ensure that we can convert to
|
||||||
|
// and from RFC 3339 date strings.
|
||||||
|
// See [https://www.ietf.org/rfc/rfc3339.txt](https://www.ietf.org/rfc/rfc3339.txt).
|
||||||
|
//
|
||||||
|
// Example 1: Compute Timestamp from POSIX `time()`.
|
||||||
|
//
|
||||||
|
// Timestamp timestamp;
|
||||||
|
// timestamp.set_seconds(time(NULL));
|
||||||
|
// timestamp.set_nanos(0);
|
||||||
|
//
|
||||||
|
// Example 2: Compute Timestamp from POSIX `gettimeofday()`.
|
||||||
|
//
|
||||||
|
// struct timeval tv;
|
||||||
|
// gettimeofday(&tv, NULL);
|
||||||
|
//
|
||||||
|
// Timestamp timestamp;
|
||||||
|
// timestamp.set_seconds(tv.tv_sec);
|
||||||
|
// timestamp.set_nanos(tv.tv_usec * 1000);
|
||||||
|
//
|
||||||
|
// Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`.
|
||||||
|
//
|
||||||
|
// FILETIME ft;
|
||||||
|
// GetSystemTimeAsFileTime(&ft);
|
||||||
|
// UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime;
|
||||||
|
//
|
||||||
|
// // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z
|
||||||
|
// // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.
|
||||||
|
// Timestamp timestamp;
|
||||||
|
// timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));
|
||||||
|
// timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));
|
||||||
|
//
|
||||||
|
// Example 4: Compute Timestamp from Java `System.currentTimeMillis()`.
|
||||||
|
//
|
||||||
|
// long millis = System.currentTimeMillis();
|
||||||
|
//
|
||||||
|
// Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)
|
||||||
|
// .setNanos((int) ((millis % 1000) * 1000000)).build();
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Example 5: Compute Timestamp from current time in Python.
|
||||||
|
//
|
||||||
|
// now = time.time()
|
||||||
|
// seconds = int(now)
|
||||||
|
// nanos = int((now - seconds) * 10**9)
|
||||||
|
// timestamp = Timestamp(seconds=seconds, nanos=nanos)
|
||||||
|
//
|
||||||
|
//
|
||||||
|
type Timestamp struct {
|
||||||
|
// Represents seconds of UTC time since Unix epoch
|
||||||
|
// 1970-01-01T00:00:00Z. Must be from from 0001-01-01T00:00:00Z to
|
||||||
|
// 9999-12-31T23:59:59Z inclusive.
|
||||||
|
Seconds int64 `protobuf:"varint,1,opt,name=seconds" json:"seconds,omitempty"`
|
||||||
|
// Non-negative fractions of a second at nanosecond resolution. Negative
|
||||||
|
// second values with fractions must still have non-negative nanos values
|
||||||
|
// that count forward in time. Must be from 0 to 999,999,999
|
||||||
|
// inclusive.
|
||||||
|
Nanos int32 `protobuf:"varint,2,opt,name=nanos" json:"nanos,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Timestamp) Reset() { *m = Timestamp{} }
|
||||||
|
func (m *Timestamp) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*Timestamp) ProtoMessage() {}
|
||||||
|
func (*Timestamp) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
proto.RegisterType((*Timestamp)(nil), "google.protobuf.Timestamp")
|
||||||
|
}
|
||||||
|
|
||||||
|
var fileDescriptor0 = []byte{
|
||||||
|
// 190 bytes of a gzipped FileDescriptorProto
|
||||||
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0xb2, 0x4a, 0xcf, 0x2c, 0xc9,
|
||||||
|
0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xcf, 0xcf, 0x49, 0xcc, 0x4b, 0xd7, 0x2f, 0x28,
|
||||||
|
0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x2f, 0xa9, 0x2c, 0x48, 0x2d, 0xd6, 0x2f, 0xc9, 0xcc,
|
||||||
|
0x4d, 0x2d, 0x2e, 0x49, 0xcc, 0x2d, 0x40, 0xb0, 0xf4, 0xc0, 0x4a, 0x84, 0xf8, 0xd3, 0xf3, 0xf3,
|
||||||
|
0xd3, 0x73, 0x52, 0xf5, 0x60, 0x1a, 0x94, 0xac, 0xb9, 0x38, 0x43, 0x60, 0x6a, 0x84, 0x24, 0xb8,
|
||||||
|
0xd8, 0x8b, 0x53, 0x93, 0xf3, 0xf3, 0x52, 0x8a, 0x25, 0x18, 0x15, 0x18, 0x35, 0x98, 0x83, 0x60,
|
||||||
|
0x5c, 0x21, 0x11, 0x2e, 0xd6, 0xbc, 0xc4, 0xbc, 0xfc, 0x62, 0x09, 0x26, 0xa0, 0x38, 0x6b, 0x10,
|
||||||
|
0x84, 0xe3, 0x14, 0xcf, 0x25, 0x0c, 0x74, 0x84, 0x1e, 0x9a, 0x99, 0x4e, 0x7c, 0x70, 0x13, 0x03,
|
||||||
|
0x40, 0x42, 0x01, 0x8c, 0x51, 0x9c, 0x70, 0x77, 0x2c, 0x60, 0x64, 0xfc, 0xc1, 0xc8, 0xb8, 0x88,
|
||||||
|
0x89, 0xd9, 0x3d, 0xc0, 0x69, 0x15, 0x93, 0x9c, 0x3b, 0x44, 0x6b, 0x00, 0x54, 0xab, 0x5e, 0x78,
|
||||||
|
0x6a, 0x4e, 0x8e, 0x77, 0x5e, 0x7e, 0x79, 0x5e, 0x08, 0xc8, 0x23, 0x49, 0x6c, 0x60, 0x33, 0x8d,
|
||||||
|
0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0x5b, 0xdd, 0x30, 0x93, 0xf3, 0x00, 0x00, 0x00,
|
||||||
|
}
|
111
vendor/src/github.com/golang/protobuf/ptypes/timestamp/timestamp.proto
vendored
Normal file
111
vendor/src/github.com/golang/protobuf/ptypes/timestamp/timestamp.proto
vendored
Normal file
|
@ -0,0 +1,111 @@
|
||||||
|
// Protocol Buffers - Google's data interchange format
|
||||||
|
// Copyright 2008 Google Inc. All rights reserved.
|
||||||
|
// https://developers.google.com/protocol-buffers/
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are
|
||||||
|
// met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following disclaimer
|
||||||
|
// in the documentation and/or other materials provided with the
|
||||||
|
// distribution.
|
||||||
|
// * Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived from
|
||||||
|
// this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
package google.protobuf;
|
||||||
|
option go_package = "timestamp";
|
||||||
|
|
||||||
|
option csharp_namespace = "Google.Protobuf.WellKnownTypes";
|
||||||
|
option cc_enable_arenas = true;
|
||||||
|
option java_package = "com.google.protobuf";
|
||||||
|
option java_outer_classname = "TimestampProto";
|
||||||
|
option java_multiple_files = true;
|
||||||
|
option java_generate_equals_and_hash = true;
|
||||||
|
option objc_class_prefix = "GPB";
|
||||||
|
|
||||||
|
// A Timestamp represents a point in time independent of any time zone
|
||||||
|
// or calendar, represented as seconds and fractions of seconds at
|
||||||
|
// nanosecond resolution in UTC Epoch time. It is encoded using the
|
||||||
|
// Proleptic Gregorian Calendar which extends the Gregorian calendar
|
||||||
|
// backwards to year one. It is encoded assuming all minutes are 60
|
||||||
|
// seconds long, i.e. leap seconds are "smeared" so that no leap second
|
||||||
|
// table is needed for interpretation. Range is from
|
||||||
|
// 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z.
|
||||||
|
// By restricting to that range, we ensure that we can convert to
|
||||||
|
// and from RFC 3339 date strings.
|
||||||
|
// See [https://www.ietf.org/rfc/rfc3339.txt](https://www.ietf.org/rfc/rfc3339.txt).
|
||||||
|
//
|
||||||
|
// Example 1: Compute Timestamp from POSIX `time()`.
|
||||||
|
//
|
||||||
|
// Timestamp timestamp;
|
||||||
|
// timestamp.set_seconds(time(NULL));
|
||||||
|
// timestamp.set_nanos(0);
|
||||||
|
//
|
||||||
|
// Example 2: Compute Timestamp from POSIX `gettimeofday()`.
|
||||||
|
//
|
||||||
|
// struct timeval tv;
|
||||||
|
// gettimeofday(&tv, NULL);
|
||||||
|
//
|
||||||
|
// Timestamp timestamp;
|
||||||
|
// timestamp.set_seconds(tv.tv_sec);
|
||||||
|
// timestamp.set_nanos(tv.tv_usec * 1000);
|
||||||
|
//
|
||||||
|
// Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`.
|
||||||
|
//
|
||||||
|
// FILETIME ft;
|
||||||
|
// GetSystemTimeAsFileTime(&ft);
|
||||||
|
// UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime;
|
||||||
|
//
|
||||||
|
// // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z
|
||||||
|
// // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.
|
||||||
|
// Timestamp timestamp;
|
||||||
|
// timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));
|
||||||
|
// timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));
|
||||||
|
//
|
||||||
|
// Example 4: Compute Timestamp from Java `System.currentTimeMillis()`.
|
||||||
|
//
|
||||||
|
// long millis = System.currentTimeMillis();
|
||||||
|
//
|
||||||
|
// Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)
|
||||||
|
// .setNanos((int) ((millis % 1000) * 1000000)).build();
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Example 5: Compute Timestamp from current time in Python.
|
||||||
|
//
|
||||||
|
// now = time.time()
|
||||||
|
// seconds = int(now)
|
||||||
|
// nanos = int((now - seconds) * 10**9)
|
||||||
|
// timestamp = Timestamp(seconds=seconds, nanos=nanos)
|
||||||
|
//
|
||||||
|
//
|
||||||
|
message Timestamp {
|
||||||
|
|
||||||
|
// Represents seconds of UTC time since Unix epoch
|
||||||
|
// 1970-01-01T00:00:00Z. Must be from from 0001-01-01T00:00:00Z to
|
||||||
|
// 9999-12-31T23:59:59Z inclusive.
|
||||||
|
int64 seconds = 1;
|
||||||
|
|
||||||
|
// Non-negative fractions of a second at nanosecond resolution. Negative
|
||||||
|
// second values with fractions must still have non-negative nanos values
|
||||||
|
// that count forward in time. Must be from 0 to 999,999,999
|
||||||
|
// inclusive.
|
||||||
|
int32 nanos = 2;
|
||||||
|
}
|
Loading…
Reference in a new issue