From 0566b9a3455a8c19508529b931eba7659f61a293 Mon Sep 17 00:00:00 2001 From: Erik Sipsma Date: Thu, 3 Feb 2022 10:54:42 -0800 Subject: [PATCH] Add support for progress groups. This allows clients to specify that LLB states should be grouped in progress output under a custom name. Status updates for all vertexes in the group will show up under a single vertex in the output. The intended use cases are for Dockerfile COPY's that use MergeOp as a backend and for grouping some other internal vertexes during frontend builds. Signed-off-by: Erik Sipsma --- api/services/control/control.pb.go | 319 ++++++++----- api/services/control/control.proto | 1 + cache/manager.go | 1 + client/graph.go | 15 +- client/llb/state.go | 10 + client/solve.go | 15 +- control/control.go | 15 +- solver/jobs.go | 7 +- solver/llbsolver/ops/diff.go | 1 + solver/llbsolver/ops/merge.go | 1 + solver/llbsolver/vertex.go | 1 + solver/pb/ops.pb.go | 628 ++++++++++++++++++------- solver/pb/ops.proto | 7 + solver/types.go | 1 + source/containerimage/pull.go | 1 + util/progress/controller/controller.go | 20 +- util/progress/progressui/display.go | 86 ++++ 17 files changed, 794 insertions(+), 335 deletions(-) diff --git a/api/services/control/control.pb.go b/api/services/control/control.pb.go index 706606a6..939f2c2c 100644 --- a/api/services/control/control.pb.go +++ b/api/services/control/control.pb.go @@ -770,6 +770,7 @@ type Vertex struct { Started *time.Time `protobuf:"bytes,5,opt,name=started,proto3,stdtime" json:"started,omitempty"` Completed *time.Time `protobuf:"bytes,6,opt,name=completed,proto3,stdtime" json:"completed,omitempty"` Error string `protobuf:"bytes,7,opt,name=error,proto3" json:"error,omitempty"` + ProgressGroup *pb.ProgressGroup `protobuf:"bytes,8,opt,name=progressGroup,proto3" json:"progressGroup,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -843,6 +844,13 @@ func (m *Vertex) GetError() string { return "" } +func (m *Vertex) GetProgressGroup() *pb.ProgressGroup { + if m != nil { + return m.ProgressGroup + } + return nil +} + type VertexStatus struct { ID string `protobuf:"bytes,1,opt,name=ID,proto3" json:"ID,omitempty"` Vertex github_com_opencontainers_go_digest.Digest `protobuf:"bytes,2,opt,name=vertex,proto3,customtype=github.com/opencontainers/go-digest.Digest" json:"vertex"` @@ -1261,103 +1269,104 @@ func init() { func init() { proto.RegisterFile("control.proto", fileDescriptor_0c5120591600887d) } var fileDescriptor_0c5120591600887d = []byte{ - // 1521 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0x4b, 0x6f, 0xdb, 0xc6, - 0x16, 0x0e, 0x25, 0xeb, 0x75, 0x2c, 0x1b, 0xce, 0x24, 0x37, 0x20, 0x78, 0x71, 0x6d, 0x87, 0xc9, - 0x05, 0x84, 0x20, 0xa1, 0x1c, 0xb5, 0x29, 0x52, 0xf7, 0x81, 0x44, 0x56, 0x8a, 0x38, 0x88, 0xd1, - 0x74, 0x94, 0x34, 0x40, 0x16, 0x05, 0x28, 0x69, 0x24, 0x13, 0xa6, 0x38, 0xec, 0xcc, 0xd0, 0x89, - 0xfa, 0x03, 0xba, 0xee, 0xae, 0x3f, 0xa0, 0x8b, 0xae, 0xba, 0xee, 0x2f, 0x28, 0x90, 0x65, 0xd7, - 0x59, 0xb8, 0x45, 0xf6, 0x2d, 0xba, 0xec, 0xb2, 0x98, 0x07, 0x65, 0xca, 0x92, 0xfc, 0x4a, 0x57, - 0x9a, 0x33, 0x3c, 0xdf, 0xa7, 0xf3, 0x9c, 0x99, 0x03, 0x4b, 0x5d, 0x1a, 0x09, 0x46, 0x43, 0x2f, - 0x66, 0x54, 0x50, 0xb4, 0x32, 0xa4, 0x9d, 0x91, 0xd7, 0x49, 0x82, 0xb0, 0xb7, 0x17, 0x08, 0x6f, - 0xff, 0xb6, 0x73, 0x6b, 0x10, 0x88, 0xdd, 0xa4, 0xe3, 0x75, 0xe9, 0xb0, 0x3e, 0xa0, 0x03, 0x5a, - 0x57, 0x8a, 0x9d, 0xa4, 0xaf, 0x24, 0x25, 0xa8, 0x95, 0x26, 0x70, 0xd6, 0x06, 0x94, 0x0e, 0x42, - 0x72, 0xa8, 0x25, 0x82, 0x21, 0xe1, 0xc2, 0x1f, 0xc6, 0x46, 0xe1, 0x66, 0x86, 0x4f, 0xfe, 0x59, - 0x3d, 0xfd, 0xb3, 0x3a, 0xa7, 0xe1, 0x3e, 0x61, 0xf5, 0xb8, 0x53, 0xa7, 0x31, 0x37, 0xda, 0xf5, - 0xb9, 0xda, 0x7e, 0x1c, 0xd4, 0xc5, 0x28, 0x26, 0xbc, 0xfe, 0x92, 0xb2, 0x3d, 0xc2, 0x34, 0xc0, - 0xfd, 0xd6, 0x82, 0xea, 0x13, 0x96, 0x44, 0x04, 0x93, 0xaf, 0x13, 0xc2, 0x05, 0xba, 0x02, 0xc5, - 0x7e, 0x10, 0x0a, 0xc2, 0x6c, 0x6b, 0x3d, 0x5f, 0xab, 0x60, 0x23, 0xa1, 0x15, 0xc8, 0xfb, 0x61, - 0x68, 0xe7, 0xd6, 0xad, 0x5a, 0x19, 0xcb, 0x25, 0xaa, 0x41, 0x75, 0x8f, 0x90, 0xb8, 0x95, 0x30, - 0x5f, 0x04, 0x34, 0xb2, 0xf3, 0xeb, 0x56, 0x2d, 0xdf, 0x5c, 0x78, 0x7d, 0xb0, 0x66, 0xe1, 0x89, - 0x2f, 0xc8, 0x85, 0x8a, 0x94, 0x9b, 0x23, 0x41, 0xb8, 0xbd, 0x90, 0x51, 0x3b, 0xdc, 0x76, 0x6f, - 0xc0, 0x4a, 0x2b, 0xe0, 0x7b, 0xcf, 0xb8, 0x3f, 0x38, 0xc9, 0x16, 0xf7, 0x11, 0x5c, 0xcc, 0xe8, - 0xf2, 0x98, 0x46, 0x9c, 0xa0, 0x3b, 0x50, 0x64, 0xa4, 0x4b, 0x59, 0x4f, 0x29, 0x2f, 0x36, 0xfe, - 0xe7, 0x1d, 0xcd, 0x8d, 0x67, 0x00, 0x52, 0x09, 0x1b, 0x65, 0xf7, 0xfb, 0x3c, 0x2c, 0x66, 0xf6, - 0xd1, 0x32, 0xe4, 0xb6, 0x5b, 0xb6, 0xb5, 0x6e, 0xd5, 0x2a, 0x38, 0xb7, 0xdd, 0x42, 0x36, 0x94, - 0x76, 0x12, 0xe1, 0x77, 0x42, 0x62, 0x7c, 0x4f, 0x45, 0x74, 0x19, 0x0a, 0xdb, 0xd1, 0x33, 0x4e, - 0x94, 0xe3, 0x65, 0xac, 0x05, 0x84, 0x60, 0xa1, 0x1d, 0x7c, 0x43, 0xb4, 0x9b, 0x58, 0xad, 0x91, - 0x03, 0xc5, 0x27, 0x3e, 0x23, 0x91, 0xb0, 0x0b, 0x92, 0xb7, 0x99, 0xb3, 0x2d, 0x6c, 0x76, 0x50, - 0x13, 0x2a, 0x5b, 0x8c, 0xf8, 0x82, 0xf4, 0xee, 0x0b, 0xbb, 0xb8, 0x6e, 0xd5, 0x16, 0x1b, 0x8e, - 0xa7, 0x8b, 0xc2, 0x4b, 0x8b, 0xc2, 0x7b, 0x9a, 0x16, 0x45, 0xb3, 0xfc, 0xfa, 0x60, 0xed, 0xc2, - 0x77, 0xbf, 0xc9, 0xd8, 0x8d, 0x61, 0xe8, 0x1e, 0xc0, 0x63, 0x9f, 0x8b, 0x67, 0x5c, 0x91, 0x94, - 0x4e, 0x24, 0x59, 0x50, 0x04, 0x19, 0x0c, 0x5a, 0x05, 0x50, 0x41, 0xd8, 0xa2, 0x49, 0x24, 0xec, - 0xb2, 0xb2, 0x3d, 0xb3, 0x83, 0xd6, 0x61, 0xb1, 0x45, 0x78, 0x97, 0x05, 0xb1, 0x4a, 0x75, 0x45, - 0x85, 0x27, 0xbb, 0x25, 0x19, 0x74, 0x04, 0x9f, 0x8e, 0x62, 0x62, 0x83, 0x52, 0xc8, 0xec, 0xc8, - 0x5c, 0xb6, 0x77, 0x7d, 0x46, 0x7a, 0xf6, 0xa2, 0x0a, 0x97, 0x91, 0x64, 0x7c, 0x75, 0x24, 0xb8, - 0x5d, 0x55, 0x49, 0x4e, 0x45, 0xf7, 0x87, 0x22, 0x54, 0xdb, 0xb2, 0xc6, 0xd3, 0x72, 0x58, 0x81, - 0x3c, 0x26, 0x7d, 0x93, 0x1b, 0xb9, 0x44, 0x1e, 0x40, 0x8b, 0xf4, 0x83, 0x28, 0x50, 0x56, 0xe5, - 0x94, 0xe3, 0xcb, 0x5e, 0xdc, 0xf1, 0x0e, 0x77, 0x71, 0x46, 0x03, 0x39, 0x50, 0x7e, 0xf0, 0x2a, - 0xa6, 0x4c, 0x96, 0x54, 0x5e, 0xd1, 0x8c, 0x65, 0xf4, 0x1c, 0x96, 0xd2, 0xf5, 0x7d, 0x21, 0x98, - 0x2c, 0x54, 0x59, 0x46, 0xb7, 0xa7, 0xcb, 0x28, 0x6b, 0x94, 0x37, 0x81, 0x79, 0x10, 0x09, 0x36, - 0xc2, 0x93, 0x3c, 0xd2, 0xc3, 0x36, 0xe1, 0x5c, 0x5a, 0xa8, 0xd2, 0x8f, 0x53, 0x51, 0x9a, 0xf3, - 0x19, 0xa3, 0x91, 0x20, 0x51, 0x4f, 0xa5, 0xbe, 0x82, 0xc7, 0xb2, 0x34, 0x27, 0x5d, 0x6b, 0x73, - 0x4a, 0xa7, 0x32, 0x67, 0x02, 0x63, 0xcc, 0x99, 0xd8, 0x43, 0x9b, 0x50, 0xd8, 0xf2, 0xbb, 0xbb, - 0x44, 0x65, 0x79, 0xb1, 0xb1, 0x3a, 0x4d, 0xa8, 0x3e, 0x7f, 0xae, 0xd2, 0xca, 0x55, 0xa3, 0x5e, - 0xc0, 0x1a, 0x82, 0xbe, 0x82, 0xea, 0x83, 0x48, 0x04, 0x22, 0x24, 0x43, 0x95, 0xb1, 0x8a, 0xcc, - 0x58, 0x73, 0xf3, 0xcd, 0xc1, 0xda, 0x07, 0x73, 0x0f, 0x9e, 0x44, 0x04, 0x61, 0x9d, 0x64, 0x50, - 0x5e, 0x86, 0x02, 0x4f, 0xf0, 0xa1, 0x17, 0xb0, 0x9c, 0x1a, 0xbb, 0x1d, 0xc5, 0x89, 0xe0, 0x36, - 0x28, 0xaf, 0x1b, 0xa7, 0xf4, 0x5a, 0x83, 0xb4, 0xdb, 0x47, 0x98, 0x9c, 0x7b, 0x80, 0xa6, 0x73, - 0x25, 0x6b, 0x6a, 0x8f, 0x8c, 0xd2, 0x9a, 0xda, 0x23, 0x23, 0xd9, 0xd6, 0xfb, 0x7e, 0x98, 0xe8, - 0x76, 0xaf, 0x60, 0x2d, 0x6c, 0xe6, 0xee, 0x5a, 0x92, 0x61, 0x3a, 0xbc, 0x67, 0x62, 0xf8, 0x02, - 0x2e, 0xcd, 0x30, 0x75, 0x06, 0xc5, 0xf5, 0x2c, 0xc5, 0x74, 0x4d, 0x1f, 0x52, 0xba, 0x3f, 0xe5, - 0xa1, 0x9a, 0x4d, 0x18, 0xda, 0x80, 0x4b, 0xda, 0x4f, 0x4c, 0xfa, 0x2d, 0x12, 0x33, 0xd2, 0x95, - 0xa7, 0x84, 0x21, 0x9f, 0xf5, 0x09, 0x35, 0xe0, 0xf2, 0xf6, 0xd0, 0x6c, 0xf3, 0x0c, 0x24, 0xa7, - 0xfa, 0x71, 0xe6, 0x37, 0x44, 0xe1, 0x3f, 0x9a, 0x4a, 0x45, 0x22, 0x03, 0xca, 0xab, 0x84, 0x7d, - 0x78, 0x7c, 0x55, 0x79, 0x33, 0xb1, 0x3a, 0x6f, 0xb3, 0x79, 0xd1, 0x27, 0x50, 0xd2, 0x1f, 0xd2, - 0xc6, 0xbc, 0x76, 0xfc, 0x5f, 0x68, 0xb2, 0x14, 0x23, 0xe1, 0xda, 0x0f, 0x6e, 0x17, 0xce, 0x00, - 0x37, 0x18, 0xe7, 0x21, 0x38, 0xf3, 0x4d, 0x3e, 0x4b, 0x09, 0xb8, 0x3f, 0x5a, 0x70, 0x71, 0xea, - 0x8f, 0xe4, 0xad, 0xa1, 0xce, 0x4d, 0x4d, 0xa1, 0xd6, 0xa8, 0x05, 0x05, 0xdd, 0xf9, 0x39, 0x65, - 0xb0, 0x77, 0x0a, 0x83, 0xbd, 0x4c, 0xdb, 0x6b, 0xb0, 0x73, 0x17, 0xe0, 0x7c, 0xc5, 0xea, 0xfe, - 0x6c, 0xc1, 0x92, 0xe9, 0x32, 0x73, 0xc5, 0xfa, 0xb0, 0x92, 0xb6, 0x50, 0xba, 0x67, 0x2e, 0xdb, - 0x3b, 0x73, 0x1b, 0x54, 0xab, 0x79, 0x47, 0x71, 0xda, 0xc6, 0x29, 0x3a, 0x67, 0x2b, 0xad, 0xab, - 0x23, 0xaa, 0x67, 0xb2, 0xfc, 0x2a, 0x2c, 0xb5, 0x85, 0x2f, 0x12, 0x3e, 0xf7, 0xe6, 0x70, 0xff, - 0xb2, 0x60, 0x39, 0xd5, 0x31, 0xde, 0xbd, 0x0f, 0xe5, 0x7d, 0xc2, 0x04, 0x79, 0x45, 0xb8, 0xf1, - 0xca, 0x9e, 0xf6, 0xea, 0x4b, 0xa5, 0x81, 0xc7, 0x9a, 0x68, 0x13, 0xca, 0x5c, 0xf1, 0x90, 0x34, - 0x51, 0xab, 0xf3, 0x50, 0xe6, 0xff, 0xc6, 0xfa, 0xa8, 0x0e, 0x0b, 0x21, 0x1d, 0x70, 0xd3, 0x33, - 0xff, 0x9d, 0x87, 0x7b, 0x4c, 0x07, 0x58, 0x29, 0xa2, 0x8f, 0xa0, 0xfc, 0xd2, 0x67, 0x51, 0x10, - 0x0d, 0xd2, 0x2e, 0x58, 0x9b, 0x07, 0x7a, 0xae, 0xf5, 0xf0, 0x18, 0xe0, 0x1e, 0xe4, 0xa0, 0xa8, - 0xbf, 0xa1, 0x47, 0x50, 0xec, 0x05, 0x03, 0xc2, 0x85, 0x0e, 0x49, 0xb3, 0x21, 0x0f, 0xf9, 0x37, - 0x07, 0x6b, 0x37, 0x32, 0xa7, 0x38, 0x8d, 0x49, 0x24, 0x1f, 0xbb, 0x7e, 0x10, 0x11, 0xc6, 0xeb, - 0x03, 0x7a, 0x4b, 0x43, 0xbc, 0x96, 0xfa, 0xc1, 0x86, 0x41, 0x72, 0x05, 0xfa, 0xac, 0x56, 0xe7, - 0xc5, 0xf9, 0xb8, 0x34, 0x83, 0x6c, 0x83, 0xc8, 0x1f, 0x12, 0x73, 0x37, 0xab, 0xb5, 0x7c, 0x38, - 0x74, 0x65, 0x9d, 0xf7, 0xd4, 0x93, 0xaa, 0x8c, 0x8d, 0x84, 0x36, 0xa1, 0xc4, 0x85, 0xcf, 0xe4, - 0x99, 0x53, 0x38, 0xe5, 0x8b, 0x27, 0x05, 0xa0, 0x4f, 0xa1, 0xd2, 0xa5, 0xc3, 0x38, 0x24, 0x12, - 0x5d, 0x3c, 0x25, 0xfa, 0x10, 0x22, 0x4b, 0x8f, 0x30, 0x46, 0x99, 0x7a, 0x6b, 0x55, 0xb0, 0x16, - 0xdc, 0x3f, 0x73, 0x50, 0xcd, 0x66, 0x7a, 0xea, 0x2d, 0xf9, 0x08, 0x8a, 0xba, 0x6e, 0x74, 0xc9, - 0x9e, 0x2f, 0x54, 0x9a, 0x61, 0x66, 0xa8, 0x6c, 0x28, 0x75, 0x13, 0xa6, 0x1e, 0x9a, 0xfa, 0xf9, - 0x99, 0x8a, 0xd2, 0x60, 0x41, 0x85, 0x1f, 0xaa, 0x50, 0xe5, 0xb1, 0x16, 0xe4, 0xdb, 0x73, 0x3c, - 0x6e, 0x9c, 0xed, 0xed, 0x39, 0x86, 0x65, 0xd3, 0x50, 0x7a, 0xa7, 0x34, 0x94, 0xcf, 0x9c, 0x06, - 0xf7, 0x17, 0x0b, 0x2a, 0xe3, 0x16, 0xc9, 0x44, 0xd7, 0x7a, 0xe7, 0xe8, 0x4e, 0x44, 0x26, 0x77, - 0xbe, 0xc8, 0x5c, 0x81, 0x22, 0x17, 0x8c, 0xf8, 0x43, 0x3d, 0x19, 0x61, 0x23, 0xc9, 0xc3, 0x68, - 0xc8, 0x07, 0x2a, 0x43, 0x55, 0x2c, 0x97, 0xee, 0xdf, 0x16, 0x2c, 0x4d, 0x74, 0xed, 0xbf, 0xea, - 0xcb, 0x65, 0x28, 0x84, 0x64, 0x9f, 0xe8, 0xd9, 0x2d, 0x8f, 0xb5, 0x20, 0x77, 0xf9, 0x2e, 0x65, - 0x42, 0x19, 0x57, 0xc5, 0x5a, 0x90, 0x36, 0xf7, 0x88, 0xf0, 0x83, 0x50, 0x1d, 0x2f, 0x55, 0x6c, - 0x24, 0x69, 0x73, 0xc2, 0x42, 0xf3, 0x7e, 0x95, 0x4b, 0xe4, 0xc2, 0x42, 0x10, 0xf5, 0xa9, 0x29, - 0x1b, 0xf5, 0x40, 0x69, 0xd3, 0x84, 0x75, 0xc9, 0x76, 0xd4, 0xa7, 0x58, 0x7d, 0x43, 0x57, 0xa1, - 0xc8, 0xfc, 0x68, 0x40, 0xd2, 0xc7, 0x6b, 0x45, 0x6a, 0x61, 0xb9, 0x83, 0xcd, 0x07, 0xd7, 0x85, - 0xaa, 0x9a, 0xff, 0x76, 0x08, 0x97, 0xd3, 0x86, 0x2c, 0xeb, 0x9e, 0x2f, 0x7c, 0xe5, 0x76, 0x15, - 0xab, 0xb5, 0x7b, 0x13, 0xd0, 0xe3, 0x80, 0x8b, 0xe7, 0x6a, 0x6e, 0xe5, 0x27, 0x0d, 0x87, 0x6d, - 0xb8, 0x34, 0xa1, 0x6d, 0x4e, 0xf7, 0x8f, 0x8f, 0x8c, 0x87, 0xd7, 0xa7, 0x0f, 0x4e, 0x35, 0x1e, - 0x7b, 0x1a, 0x38, 0x39, 0x25, 0x36, 0xfe, 0xc8, 0x43, 0x69, 0x4b, 0x4f, 0xfe, 0xe8, 0x29, 0x54, - 0xc6, 0xd3, 0x27, 0x72, 0xa7, 0x69, 0x8e, 0x8e, 0xb1, 0xce, 0xb5, 0x63, 0x75, 0x8c, 0x7d, 0x0f, - 0xa1, 0xa0, 0xe6, 0x70, 0x34, 0xe3, 0xfa, 0xc8, 0x0e, 0xe8, 0xce, 0xf1, 0x73, 0xed, 0x86, 0x25, - 0x99, 0xd4, 0xdd, 0x3b, 0x8b, 0x29, 0xfb, 0x6a, 0x76, 0xd6, 0x4e, 0xb8, 0xb4, 0xd1, 0x0e, 0x14, - 0xcd, 0x49, 0x36, 0x4b, 0x35, 0x7b, 0xc3, 0x3a, 0xeb, 0xf3, 0x15, 0x34, 0xd9, 0x86, 0x85, 0x76, - 0xc6, 0x83, 0xd0, 0x2c, 0xd3, 0xb2, 0x65, 0xe0, 0x9c, 0xf0, 0xbd, 0x66, 0x6d, 0x58, 0xe8, 0x05, - 0x2c, 0x66, 0x12, 0x8d, 0x66, 0x24, 0x74, 0xba, 0x6a, 0x9c, 0xff, 0x9f, 0xa0, 0xa5, 0x8d, 0x6d, - 0x56, 0x5f, 0xbf, 0x5d, 0xb5, 0x7e, 0x7d, 0xbb, 0x6a, 0xfd, 0xfe, 0x76, 0xd5, 0xea, 0x14, 0x55, - 0xcb, 0xbf, 0xf7, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x8f, 0x2a, 0x40, 0x92, 0xfd, 0x11, 0x00, - 0x00, + // 1543 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x58, 0xcd, 0x6f, 0x1b, 0x45, + 0x14, 0xef, 0xda, 0xf1, 0xd7, 0x8b, 0x13, 0xa5, 0xd3, 0x52, 0xad, 0x16, 0x91, 0xa4, 0xdb, 0x22, + 0x45, 0x55, 0xbb, 0x4e, 0x03, 0x85, 0x12, 0x3e, 0xd4, 0x3a, 0x2e, 0x34, 0x55, 0x23, 0xca, 0xa4, + 0xa5, 0x52, 0x0f, 0x48, 0x6b, 0x7b, 0xbc, 0x59, 0x65, 0xbd, 0xb3, 0xcc, 0xcc, 0xa6, 0x35, 0x7f, + 0x00, 0x67, 0x6e, 0xfc, 0x01, 0x1c, 0x38, 0x71, 0xe6, 0x2f, 0x40, 0xea, 0x91, 0x73, 0x0f, 0x01, + 0xf5, 0x0e, 0xe2, 0xc8, 0x11, 0xcd, 0xc7, 0x3a, 0xeb, 0xd8, 0xce, 0x57, 0x39, 0x79, 0xde, 0xcc, + 0x7b, 0xbf, 0x7d, 0x9f, 0x33, 0xef, 0x19, 0xe6, 0x3a, 0x34, 0x16, 0x8c, 0x46, 0x5e, 0xc2, 0xa8, + 0xa0, 0x68, 0xa1, 0x4f, 0xdb, 0x03, 0xaf, 0x9d, 0x86, 0x51, 0x77, 0x37, 0x14, 0xde, 0xde, 0x4d, + 0xe7, 0x46, 0x10, 0x8a, 0x9d, 0xb4, 0xed, 0x75, 0x68, 0xbf, 0x11, 0xd0, 0x80, 0x36, 0x14, 0x63, + 0x3b, 0xed, 0x29, 0x4a, 0x11, 0x6a, 0xa5, 0x01, 0x9c, 0xa5, 0x80, 0xd2, 0x20, 0x22, 0x07, 0x5c, + 0x22, 0xec, 0x13, 0x2e, 0xfc, 0x7e, 0x62, 0x18, 0xae, 0xe7, 0xf0, 0xe4, 0xc7, 0x1a, 0xd9, 0xc7, + 0x1a, 0x9c, 0x46, 0x7b, 0x84, 0x35, 0x92, 0x76, 0x83, 0x26, 0xdc, 0x70, 0x37, 0xa6, 0x72, 0xfb, + 0x49, 0xd8, 0x10, 0x83, 0x84, 0xf0, 0xc6, 0x73, 0xca, 0x76, 0x09, 0xd3, 0x02, 0xee, 0xf7, 0x16, + 0xd4, 0x1f, 0xb1, 0x34, 0x26, 0x98, 0x7c, 0x9b, 0x12, 0x2e, 0xd0, 0x25, 0x28, 0xf7, 0xc2, 0x48, + 0x10, 0x66, 0x5b, 0xcb, 0xc5, 0x95, 0x1a, 0x36, 0x14, 0x5a, 0x80, 0xa2, 0x1f, 0x45, 0x76, 0x61, + 0xd9, 0x5a, 0xa9, 0x62, 0xb9, 0x44, 0x2b, 0x50, 0xdf, 0x25, 0x24, 0x69, 0xa5, 0xcc, 0x17, 0x21, + 0x8d, 0xed, 0xe2, 0xb2, 0xb5, 0x52, 0x6c, 0xce, 0xbc, 0xdc, 0x5f, 0xb2, 0xf0, 0xc8, 0x09, 0x72, + 0xa1, 0x26, 0xe9, 0xe6, 0x40, 0x10, 0x6e, 0xcf, 0xe4, 0xd8, 0x0e, 0xb6, 0xdd, 0x6b, 0xb0, 0xd0, + 0x0a, 0xf9, 0xee, 0x13, 0xee, 0x07, 0xc7, 0xe9, 0xe2, 0x3e, 0x80, 0xf3, 0x39, 0x5e, 0x9e, 0xd0, + 0x98, 0x13, 0x74, 0x0b, 0xca, 0x8c, 0x74, 0x28, 0xeb, 0x2a, 0xe6, 0xd9, 0xb5, 0x77, 0xbc, 0xc3, + 0xb1, 0xf1, 0x8c, 0x80, 0x64, 0xc2, 0x86, 0xd9, 0xfd, 0xb1, 0x08, 0xb3, 0xb9, 0x7d, 0x34, 0x0f, + 0x85, 0xcd, 0x96, 0x6d, 0x2d, 0x5b, 0x2b, 0x35, 0x5c, 0xd8, 0x6c, 0x21, 0x1b, 0x2a, 0x5b, 0xa9, + 0xf0, 0xdb, 0x11, 0x31, 0xb6, 0x67, 0x24, 0xba, 0x08, 0xa5, 0xcd, 0xf8, 0x09, 0x27, 0xca, 0xf0, + 0x2a, 0xd6, 0x04, 0x42, 0x30, 0xb3, 0x1d, 0x7e, 0x47, 0xb4, 0x99, 0x58, 0xad, 0x91, 0x03, 0xe5, + 0x47, 0x3e, 0x23, 0xb1, 0xb0, 0x4b, 0x12, 0xb7, 0x59, 0xb0, 0x2d, 0x6c, 0x76, 0x50, 0x13, 0x6a, + 0x1b, 0x8c, 0xf8, 0x82, 0x74, 0xef, 0x0a, 0xbb, 0xbc, 0x6c, 0xad, 0xcc, 0xae, 0x39, 0x9e, 0x4e, + 0x0a, 0x2f, 0x4b, 0x0a, 0xef, 0x71, 0x96, 0x14, 0xcd, 0xea, 0xcb, 0xfd, 0xa5, 0x73, 0x3f, 0xfc, + 0x21, 0x7d, 0x37, 0x14, 0x43, 0x77, 0x00, 0x1e, 0xfa, 0x5c, 0x3c, 0xe1, 0x0a, 0xa4, 0x72, 0x2c, + 0xc8, 0x8c, 0x02, 0xc8, 0xc9, 0xa0, 0x45, 0x00, 0xe5, 0x84, 0x0d, 0x9a, 0xc6, 0xc2, 0xae, 0x2a, + 0xdd, 0x73, 0x3b, 0x68, 0x19, 0x66, 0x5b, 0x84, 0x77, 0x58, 0x98, 0xa8, 0x50, 0xd7, 0x94, 0x7b, + 0xf2, 0x5b, 0x12, 0x41, 0x7b, 0xf0, 0xf1, 0x20, 0x21, 0x36, 0x28, 0x86, 0xdc, 0x8e, 0x8c, 0xe5, + 0xf6, 0x8e, 0xcf, 0x48, 0xd7, 0x9e, 0x55, 0xee, 0x32, 0x94, 0xf4, 0xaf, 0xf6, 0x04, 0xb7, 0xeb, + 0x2a, 0xc8, 0x19, 0xe9, 0xfe, 0x54, 0x86, 0xfa, 0xb6, 0xcc, 0xf1, 0x2c, 0x1d, 0x16, 0xa0, 0x88, + 0x49, 0xcf, 0xc4, 0x46, 0x2e, 0x91, 0x07, 0xd0, 0x22, 0xbd, 0x30, 0x0e, 0x95, 0x56, 0x05, 0x65, + 0xf8, 0xbc, 0x97, 0xb4, 0xbd, 0x83, 0x5d, 0x9c, 0xe3, 0x40, 0x0e, 0x54, 0xef, 0xbd, 0x48, 0x28, + 0x93, 0x29, 0x55, 0x54, 0x30, 0x43, 0x1a, 0x3d, 0x85, 0xb9, 0x6c, 0x7d, 0x57, 0x08, 0x26, 0x13, + 0x55, 0xa6, 0xd1, 0xcd, 0xf1, 0x34, 0xca, 0x2b, 0xe5, 0x8d, 0xc8, 0xdc, 0x8b, 0x05, 0x1b, 0xe0, + 0x51, 0x1c, 0x69, 0xe1, 0x36, 0xe1, 0x5c, 0x6a, 0xa8, 0xc2, 0x8f, 0x33, 0x52, 0xaa, 0xf3, 0x39, + 0xa3, 0xb1, 0x20, 0x71, 0x57, 0x85, 0xbe, 0x86, 0x87, 0xb4, 0x54, 0x27, 0x5b, 0x6b, 0x75, 0x2a, + 0x27, 0x52, 0x67, 0x44, 0xc6, 0xa8, 0x33, 0xb2, 0x87, 0xd6, 0xa1, 0xb4, 0xe1, 0x77, 0x76, 0x88, + 0x8a, 0xf2, 0xec, 0xda, 0xe2, 0x38, 0xa0, 0x3a, 0xfe, 0x52, 0x85, 0x95, 0xab, 0x42, 0x3d, 0x87, + 0xb5, 0x08, 0xfa, 0x06, 0xea, 0xf7, 0x62, 0x11, 0x8a, 0x88, 0xf4, 0x55, 0xc4, 0x6a, 0x32, 0x62, + 0xcd, 0xf5, 0x57, 0xfb, 0x4b, 0x1f, 0x4c, 0xbd, 0x78, 0x52, 0x11, 0x46, 0x0d, 0x92, 0x93, 0xf2, + 0x72, 0x10, 0x78, 0x04, 0x0f, 0x3d, 0x83, 0xf9, 0x4c, 0xd9, 0xcd, 0x38, 0x49, 0x05, 0xb7, 0x41, + 0x59, 0xbd, 0x76, 0x42, 0xab, 0xb5, 0x90, 0x36, 0xfb, 0x10, 0x92, 0x73, 0x07, 0xd0, 0x78, 0xac, + 0x64, 0x4e, 0xed, 0x92, 0x41, 0x96, 0x53, 0xbb, 0x64, 0x20, 0xcb, 0x7a, 0xcf, 0x8f, 0x52, 0x5d, + 0xee, 0x35, 0xac, 0x89, 0xf5, 0xc2, 0x6d, 0x4b, 0x22, 0x8c, 0xbb, 0xf7, 0x54, 0x08, 0x5f, 0xc1, + 0x85, 0x09, 0xaa, 0x4e, 0x80, 0xb8, 0x9a, 0x87, 0x18, 0xcf, 0xe9, 0x03, 0x48, 0xf7, 0x97, 0x22, + 0xd4, 0xf3, 0x01, 0x43, 0xab, 0x70, 0x41, 0xdb, 0x89, 0x49, 0xaf, 0x45, 0x12, 0x46, 0x3a, 0xf2, + 0x96, 0x30, 0xe0, 0x93, 0x8e, 0xd0, 0x1a, 0x5c, 0xdc, 0xec, 0x9b, 0x6d, 0x9e, 0x13, 0x29, 0xa8, + 0x7a, 0x9c, 0x78, 0x86, 0x28, 0xbc, 0xa5, 0xa1, 0x94, 0x27, 0x72, 0x42, 0x45, 0x15, 0xb0, 0x8f, + 0x8e, 0xce, 0x2a, 0x6f, 0xa2, 0xac, 0x8e, 0xdb, 0x64, 0x5c, 0xf4, 0x29, 0x54, 0xf4, 0x41, 0x56, + 0x98, 0x57, 0x8e, 0xfe, 0x84, 0x06, 0xcb, 0x64, 0xa4, 0xb8, 0xb6, 0x83, 0xdb, 0xa5, 0x53, 0x88, + 0x1b, 0x19, 0xe7, 0x3e, 0x38, 0xd3, 0x55, 0x3e, 0x4d, 0x0a, 0xb8, 0x3f, 0x5b, 0x70, 0x7e, 0xec, + 0x43, 0xf2, 0xd5, 0x50, 0xf7, 0xa6, 0x86, 0x50, 0x6b, 0xd4, 0x82, 0x92, 0xae, 0xfc, 0x82, 0x52, + 0xd8, 0x3b, 0x81, 0xc2, 0x5e, 0xae, 0xec, 0xb5, 0xb0, 0x73, 0x1b, 0xe0, 0x6c, 0xc9, 0xea, 0xfe, + 0x6a, 0xc1, 0x9c, 0xa9, 0x32, 0xf3, 0xc4, 0xfa, 0xb0, 0x90, 0x95, 0x50, 0xb6, 0x67, 0x1e, 0xdb, + 0x5b, 0x53, 0x0b, 0x54, 0xb3, 0x79, 0x87, 0xe5, 0xb4, 0x8e, 0x63, 0x70, 0xce, 0x46, 0x96, 0x57, + 0x87, 0x58, 0x4f, 0xa5, 0xf9, 0x65, 0x98, 0xdb, 0x16, 0xbe, 0x48, 0xf9, 0xd4, 0x97, 0xc3, 0xfd, + 0xc7, 0x82, 0xf9, 0x8c, 0xc7, 0x58, 0xf7, 0x3e, 0x54, 0xf7, 0x08, 0x13, 0xe4, 0x05, 0xe1, 0xc6, + 0x2a, 0x7b, 0xdc, 0xaa, 0xaf, 0x15, 0x07, 0x1e, 0x72, 0xa2, 0x75, 0xa8, 0x72, 0x85, 0x43, 0xb2, + 0x40, 0x2d, 0x4e, 0x93, 0x32, 0xdf, 0x1b, 0xf2, 0xa3, 0x06, 0xcc, 0x44, 0x34, 0xe0, 0xa6, 0x66, + 0xde, 0x9e, 0x26, 0xf7, 0x90, 0x06, 0x58, 0x31, 0xa2, 0x8f, 0xa1, 0xfa, 0xdc, 0x67, 0x71, 0x18, + 0x07, 0x59, 0x15, 0x2c, 0x4d, 0x13, 0x7a, 0xaa, 0xf9, 0xf0, 0x50, 0x40, 0x76, 0x3a, 0x65, 0x7d, + 0x86, 0x1e, 0x40, 0xb9, 0x1b, 0x06, 0x84, 0x0b, 0xed, 0x92, 0xe6, 0x9a, 0xbc, 0xe4, 0x5f, 0xed, + 0x2f, 0x5d, 0xcb, 0xdd, 0xe2, 0x34, 0x21, 0xb1, 0x6c, 0x76, 0xfd, 0x30, 0x26, 0x8c, 0x37, 0x02, + 0x7a, 0x43, 0x8b, 0x78, 0x2d, 0xf5, 0x83, 0x0d, 0x82, 0xc4, 0x0a, 0xf5, 0x5d, 0xad, 0xee, 0x8b, + 0xb3, 0x61, 0x69, 0x04, 0x59, 0x06, 0xb1, 0xdf, 0x27, 0xe6, 0x6d, 0x56, 0x6b, 0xd9, 0x38, 0x74, + 0x64, 0x9e, 0x77, 0x55, 0x4b, 0x55, 0xc5, 0x86, 0x42, 0xeb, 0x50, 0xe1, 0xc2, 0x67, 0xf2, 0xce, + 0x29, 0x9d, 0xb0, 0xe3, 0xc9, 0x04, 0xd0, 0x67, 0x50, 0xeb, 0xd0, 0x7e, 0x12, 0x11, 0x29, 0x5d, + 0x3e, 0xa1, 0xf4, 0x81, 0x88, 0x4c, 0x3d, 0xc2, 0x18, 0x65, 0xaa, 0xd7, 0xaa, 0x61, 0x4d, 0xa0, + 0x0f, 0x61, 0x2e, 0x61, 0x34, 0x60, 0x84, 0xf3, 0x2f, 0x18, 0x4d, 0x13, 0xf3, 0xc2, 0x9e, 0x97, + 0x97, 0xf7, 0xa3, 0xfc, 0x01, 0x1e, 0xe5, 0x73, 0xff, 0x2e, 0x40, 0x3d, 0x9f, 0x22, 0x63, 0x4d, + 0xe8, 0x03, 0x28, 0xeb, 0x84, 0xd3, 0xb9, 0x7e, 0x36, 0x1f, 0x6b, 0x84, 0x89, 0x3e, 0xb6, 0xa1, + 0xd2, 0x49, 0x99, 0xea, 0x50, 0x75, 0xdf, 0x9a, 0x91, 0xd2, 0x52, 0x41, 0x85, 0x1f, 0x29, 0x1f, + 0x17, 0xb1, 0x26, 0x64, 0xd3, 0x3a, 0x9c, 0x53, 0x4e, 0xd7, 0xb4, 0x0e, 0xc5, 0xf2, 0xf1, 0xab, + 0xbc, 0x51, 0xfc, 0xaa, 0xa7, 0x8e, 0x9f, 0xfb, 0x9b, 0x05, 0xb5, 0x61, 0x6d, 0xe5, 0xbc, 0x6b, + 0xbd, 0xb1, 0x77, 0x47, 0x3c, 0x53, 0x38, 0x9b, 0x67, 0x2e, 0x41, 0x99, 0x0b, 0x46, 0xfc, 0xbe, + 0x1e, 0xa9, 0xb0, 0xa1, 0xe4, 0x2d, 0xd6, 0xe7, 0x81, 0x8a, 0x50, 0x1d, 0xcb, 0xa5, 0xfb, 0xaf, + 0x05, 0x73, 0x23, 0xe5, 0xfe, 0xbf, 0xda, 0x72, 0x11, 0x4a, 0x11, 0xd9, 0x23, 0x7a, 0xe8, 0x2b, + 0x62, 0x4d, 0xc8, 0x5d, 0xbe, 0x43, 0x99, 0x50, 0xca, 0xd5, 0xb1, 0x26, 0xa4, 0xce, 0x5d, 0x22, + 0xfc, 0x30, 0x52, 0xf7, 0x52, 0x1d, 0x1b, 0x4a, 0xea, 0x9c, 0xb2, 0xc8, 0x34, 0xbe, 0x72, 0x89, + 0x5c, 0x98, 0x09, 0xe3, 0x1e, 0x35, 0x69, 0xa3, 0x3a, 0x9b, 0x6d, 0x9a, 0xb2, 0x0e, 0xd9, 0x8c, + 0x7b, 0x14, 0xab, 0x33, 0x74, 0x19, 0xca, 0xcc, 0x8f, 0x03, 0x92, 0x75, 0xbd, 0x35, 0xc9, 0x85, + 0xe5, 0x0e, 0x36, 0x07, 0xae, 0x0b, 0x75, 0x35, 0x38, 0x6e, 0x11, 0x2e, 0xc7, 0x14, 0x99, 0xd6, + 0x5d, 0x5f, 0xf8, 0xca, 0xec, 0x3a, 0x56, 0x6b, 0xf7, 0x3a, 0xa0, 0x87, 0x21, 0x17, 0x4f, 0xd5, + 0xc0, 0xcb, 0x8f, 0x9b, 0x2a, 0xb7, 0xe1, 0xc2, 0x08, 0xb7, 0x79, 0x16, 0x3e, 0x39, 0x34, 0x57, + 0x5e, 0x1d, 0xbf, 0x71, 0xd5, 0x5c, 0xed, 0x69, 0xc1, 0xd1, 0xf1, 0x72, 0xed, 0xaf, 0x22, 0x54, + 0x36, 0xf4, 0x5f, 0x06, 0xe8, 0x31, 0xd4, 0x86, 0x63, 0x2b, 0x72, 0xc7, 0x61, 0x0e, 0xcf, 0xbf, + 0xce, 0x95, 0x23, 0x79, 0x8c, 0x7e, 0xf7, 0xa1, 0xa4, 0x06, 0x78, 0x34, 0xe1, 0xdd, 0xc9, 0x4f, + 0xf6, 0xce, 0xd1, 0x03, 0xf1, 0xaa, 0x25, 0x91, 0xd4, 0xa3, 0x3d, 0x09, 0x29, 0xdf, 0x6e, 0x3b, + 0x4b, 0xc7, 0xbc, 0xf6, 0x68, 0x0b, 0xca, 0xe6, 0x26, 0x9b, 0xc4, 0x9a, 0x7f, 0x9a, 0x9d, 0xe5, + 0xe9, 0x0c, 0x1a, 0x6c, 0xd5, 0x42, 0x5b, 0xc3, 0x09, 0x6a, 0x92, 0x6a, 0xf9, 0x34, 0x70, 0x8e, + 0x39, 0x5f, 0xb1, 0x56, 0x2d, 0xf4, 0x0c, 0x66, 0x73, 0x81, 0x46, 0x13, 0x02, 0x3a, 0x9e, 0x35, + 0xce, 0xbb, 0xc7, 0x70, 0x69, 0x65, 0x9b, 0xf5, 0x97, 0xaf, 0x17, 0xad, 0xdf, 0x5f, 0x2f, 0x5a, + 0x7f, 0xbe, 0x5e, 0xb4, 0xda, 0x65, 0x55, 0xf2, 0xef, 0xfd, 0x17, 0x00, 0x00, 0xff, 0xff, 0x54, + 0x8e, 0x72, 0x11, 0x36, 0x12, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -2442,6 +2451,18 @@ func (m *Vertex) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.ProgressGroup != nil { + { + size, err := m.ProgressGroup.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintControl(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x42 + } if len(m.Error) > 0 { i -= len(m.Error) copy(dAtA[i:], m.Error) @@ -2450,23 +2471,23 @@ func (m *Vertex) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x3a } if m.Completed != nil { - n6, err6 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Completed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Completed):]) - if err6 != nil { - return 0, err6 - } - i -= n6 - i = encodeVarintControl(dAtA, i, uint64(n6)) - i-- - dAtA[i] = 0x32 - } - if m.Started != nil { - n7, err7 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Started, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Started):]) + n7, err7 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Completed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Completed):]) if err7 != nil { return 0, err7 } i -= n7 i = encodeVarintControl(dAtA, i, uint64(n7)) i-- + dAtA[i] = 0x32 + } + if m.Started != nil { + n8, err8 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Started, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Started):]) + if err8 != nil { + return 0, err8 + } + i -= n8 + i = encodeVarintControl(dAtA, i, uint64(n8)) + i-- dAtA[i] = 0x2a } if m.Cached { @@ -2530,31 +2551,31 @@ func (m *VertexStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.XXX_unrecognized) } if m.Completed != nil { - n8, err8 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Completed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Completed):]) - if err8 != nil { - return 0, err8 - } - i -= n8 - i = encodeVarintControl(dAtA, i, uint64(n8)) - i-- - dAtA[i] = 0x42 - } - if m.Started != nil { - n9, err9 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Started, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Started):]) + n9, err9 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Completed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Completed):]) if err9 != nil { return 0, err9 } i -= n9 i = encodeVarintControl(dAtA, i, uint64(n9)) i-- + dAtA[i] = 0x42 + } + if m.Started != nil { + n10, err10 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Started, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Started):]) + if err10 != nil { + return 0, err10 + } + i -= n10 + i = encodeVarintControl(dAtA, i, uint64(n10)) + i-- dAtA[i] = 0x3a } - n10, err10 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Timestamp, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Timestamp):]) - if err10 != nil { - return 0, err10 + n11, err11 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Timestamp, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Timestamp):]) + if err11 != nil { + return 0, err11 } - i -= n10 - i = encodeVarintControl(dAtA, i, uint64(n10)) + i -= n11 + i = encodeVarintControl(dAtA, i, uint64(n11)) i-- dAtA[i] = 0x32 if m.Total != 0 { @@ -2627,12 +2648,12 @@ func (m *VertexLog) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x18 } - n11, err11 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Timestamp, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Timestamp):]) - if err11 != nil { - return 0, err11 + n12, err12 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Timestamp, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Timestamp):]) + if err12 != nil { + return 0, err12 } - i -= n11 - i = encodeVarintControl(dAtA, i, uint64(n11)) + i -= n12 + i = encodeVarintControl(dAtA, i, uint64(n12)) i-- dAtA[i] = 0x12 if len(m.Vertex) > 0 { @@ -3215,6 +3236,10 @@ func (m *Vertex) Size() (n int) { if l > 0 { n += 1 + l + sovControl(uint64(l)) } + if m.ProgressGroup != nil { + l = m.ProgressGroup.Size() + n += 1 + l + sovControl(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -5954,6 +5979,42 @@ func (m *Vertex) Unmarshal(dAtA []byte) error { } m.Error = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ProgressGroup", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowControl + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthControl + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthControl + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ProgressGroup == nil { + m.ProgressGroup = &pb.ProgressGroup{} + } + if err := m.ProgressGroup.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipControl(dAtA[iNdEx:]) diff --git a/api/services/control/control.proto b/api/services/control/control.proto index 4f41352e..a468a293 100644 --- a/api/services/control/control.proto +++ b/api/services/control/control.proto @@ -115,6 +115,7 @@ message Vertex { google.protobuf.Timestamp started = 5 [(gogoproto.stdtime) = true ]; google.protobuf.Timestamp completed = 6 [(gogoproto.stdtime) = true ]; string error = 7; // typed errors? + pb.ProgressGroup progressGroup = 8; } message VertexStatus { diff --git a/cache/manager.go b/cache/manager.go index cadc32f1..512981d3 100644 --- a/cache/manager.go +++ b/cache/manager.go @@ -725,6 +725,7 @@ func (cm *cacheManager) createMergeRef(ctx context.Context, parents parentRefs, } if len(parents.mergeParents) == 1 { // merge of 1 thing is that thing + parents.mergeParents[0].progress = pg return parents.mergeParents[0], nil } diff --git a/client/graph.go b/client/graph.go index 6171e7db..aaa96f29 100644 --- a/client/graph.go +++ b/client/graph.go @@ -8,13 +8,14 @@ import ( ) type Vertex struct { - Digest digest.Digest - Inputs []digest.Digest - Name string - Started *time.Time - Completed *time.Time - Cached bool - Error string + Digest digest.Digest + Inputs []digest.Digest + Name string + Started *time.Time + Completed *time.Time + Cached bool + Error string + ProgressGroup *pb.ProgressGroup } type VertexStatus struct { diff --git a/client/llb/state.go b/client/llb/state.go index 3ff9d505..722affb5 100644 --- a/client/llb/state.go +++ b/client/llb/state.go @@ -505,6 +505,10 @@ func mergeMetadata(m1, m2 pb.OpMetadata) pb.OpMetadata { m1.Caps[k] = true } + if m2.ProgressGroup != nil { + m1.ProgressGroup = m2.ProgressGroup + } + return m1 } @@ -594,6 +598,12 @@ func LocalUniqueID(v string) ConstraintsOpt { }) } +func ProgressGroup(id, name string) ConstraintsOpt { + return constraintsOptFunc(func(c *Constraints) { + c.Metadata.ProgressGroup = &pb.ProgressGroup{Id: id, Name: name} + }) +} + var ( LinuxAmd64 = Platform(ocispecs.Platform{OS: "linux", Architecture: "amd64"}) LinuxArmhf = Platform(ocispecs.Platform{OS: "linux", Architecture: "arm", Variant: "v7"}) diff --git a/client/solve.go b/client/solve.go index f7b653d4..40a12c7a 100644 --- a/client/solve.go +++ b/client/solve.go @@ -263,13 +263,14 @@ func (c *Client) solve(ctx context.Context, def *llb.Definition, runGateway runG s := SolveStatus{} for _, v := range resp.Vertexes { s.Vertexes = append(s.Vertexes, &Vertex{ - Digest: v.Digest, - Inputs: v.Inputs, - Name: v.Name, - Started: v.Started, - Completed: v.Completed, - Error: v.Error, - Cached: v.Cached, + Digest: v.Digest, + Inputs: v.Inputs, + Name: v.Name, + Started: v.Started, + Completed: v.Completed, + Error: v.Error, + Cached: v.Cached, + ProgressGroup: v.ProgressGroup, }) } for _, v := range resp.Statuses { diff --git a/control/control.go b/control/control.go index c778e299..0d3e7976 100644 --- a/control/control.go +++ b/control/control.go @@ -338,13 +338,14 @@ func (c *Controller) Status(req *controlapi.StatusRequest, stream controlapi.Con sr := controlapi.StatusResponse{} for _, v := range ss.Vertexes { sr.Vertexes = append(sr.Vertexes, &controlapi.Vertex{ - Digest: v.Digest, - Inputs: v.Inputs, - Name: v.Name, - Started: v.Started, - Completed: v.Completed, - Error: v.Error, - Cached: v.Cached, + Digest: v.Digest, + Inputs: v.Inputs, + Name: v.Name, + Started: v.Started, + Completed: v.Completed, + Error: v.Error, + Cached: v.Cached, + ProgressGroup: v.ProgressGroup, }) } for _, v := range ss.Statuses { diff --git a/solver/jobs.go b/solver/jobs.go index a67b2b27..83f7e367 100644 --- a/solver/jobs.go +++ b/solver/jobs.go @@ -889,9 +889,10 @@ func initClientVertex(v Vertex) client.Vertex { inputDigests = append(inputDigests, inp.Vertex.Digest()) } return client.Vertex{ - Inputs: inputDigests, - Name: v.Name(), - Digest: v.Digest(), + Inputs: inputDigests, + Name: v.Name(), + Digest: v.Digest(), + ProgressGroup: v.Options().ProgressGroup, } } diff --git a/solver/llbsolver/ops/diff.go b/solver/llbsolver/ops/diff.go index a2f47b91..1a05f7a6 100644 --- a/solver/llbsolver/ops/diff.go +++ b/solver/llbsolver/ops/diff.go @@ -71,6 +71,7 @@ func (d *diffOp) CacheMap(ctx context.Context, group session.Group, index int) ( WriterFactory: progress.FromContext(ctx), Digest: d.vtx.Digest(), Name: d.vtx.Name(), + ProgressGroup: d.vtx.Options().ProgressGroup, } cm.Opts[cache.ProgressKey{}] = d.pg diff --git a/solver/llbsolver/ops/merge.go b/solver/llbsolver/ops/merge.go index aee4bee4..13bb60ba 100644 --- a/solver/llbsolver/ops/merge.go +++ b/solver/llbsolver/ops/merge.go @@ -63,6 +63,7 @@ func (m *mergeOp) CacheMap(ctx context.Context, group session.Group, index int) WriterFactory: progress.FromContext(ctx), Digest: m.vtx.Digest(), Name: m.vtx.Name(), + ProgressGroup: m.vtx.Options().ProgressGroup, } cm.Opts[cache.ProgressKey{}] = m.pg diff --git a/solver/llbsolver/vertex.go b/solver/llbsolver/vertex.go index 0c9460f9..4f36c2ed 100644 --- a/solver/llbsolver/vertex.go +++ b/solver/llbsolver/vertex.go @@ -162,6 +162,7 @@ func newVertex(dgst digest.Digest, op *pb.Op, opMeta *pb.OpMetadata, load func(d if opMeta.ExportCache != nil { opt.ExportCache = &opMeta.ExportCache.Value } + opt.ProgressGroup = opMeta.ProgressGroup } for _, fn := range opts { if err := fn(op, opMeta, &opt); err != nil { diff --git a/solver/pb/ops.pb.go b/solver/pb/ops.pb.go index c65e598a..cf79d7ee 100644 --- a/solver/pb/ops.pb.go +++ b/solver/pb/ops.pb.go @@ -1270,8 +1270,9 @@ type OpMetadata struct { Description map[string]string `protobuf:"bytes,2,rep,name=description,proto3" json:"description,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // index 3 reserved for WorkerConstraint in previous versions // WorkerConstraint worker_constraint = 3; - ExportCache *ExportCache `protobuf:"bytes,4,opt,name=export_cache,json=exportCache,proto3" json:"export_cache,omitempty"` - Caps map[github_com_moby_buildkit_util_apicaps.CapID]bool `protobuf:"bytes,5,rep,name=caps,proto3,castkey=github.com/moby/buildkit/util/apicaps.CapID" json:"caps" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` + ExportCache *ExportCache `protobuf:"bytes,4,opt,name=export_cache,json=exportCache,proto3" json:"export_cache,omitempty"` + Caps map[github_com_moby_buildkit_util_apicaps.CapID]bool `protobuf:"bytes,5,rep,name=caps,proto3,castkey=github.com/moby/buildkit/util/apicaps.CapID" json:"caps" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` + ProgressGroup *ProgressGroup `protobuf:"bytes,6,opt,name=progress_group,json=progressGroup,proto3" json:"progress_group,omitempty"` } func (m *OpMetadata) Reset() { *m = OpMetadata{} } @@ -1331,6 +1332,13 @@ func (m *OpMetadata) GetCaps() map[github_com_moby_buildkit_util_apicaps.CapID]b return nil } +func (m *OpMetadata) GetProgressGroup() *ProgressGroup { + if m != nil { + return m.ProgressGroup + } + return nil +} + // Source is a source mapping description for a file type Source struct { Locations map[string]*Locations `protobuf:"bytes,1,rep,name=locations,proto3" json:"locations,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` @@ -1665,6 +1673,54 @@ func (m *ExportCache) GetValue() bool { return false } +type ProgressGroup struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` +} + +func (m *ProgressGroup) Reset() { *m = ProgressGroup{} } +func (m *ProgressGroup) String() string { return proto.CompactTextString(m) } +func (*ProgressGroup) ProtoMessage() {} +func (*ProgressGroup) Descriptor() ([]byte, []int) { + return fileDescriptor_8de16154b2733812, []int{24} +} +func (m *ProgressGroup) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ProgressGroup) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ProgressGroup) XXX_Merge(src proto.Message) { + xxx_messageInfo_ProgressGroup.Merge(m, src) +} +func (m *ProgressGroup) XXX_Size() int { + return m.Size() +} +func (m *ProgressGroup) XXX_DiscardUnknown() { + xxx_messageInfo_ProgressGroup.DiscardUnknown(m) +} + +var xxx_messageInfo_ProgressGroup proto.InternalMessageInfo + +func (m *ProgressGroup) GetId() string { + if m != nil { + return m.Id + } + return "" +} + +func (m *ProgressGroup) GetName() string { + if m != nil { + return m.Name + } + return "" +} + type ProxyEnv struct { HttpProxy string `protobuf:"bytes,1,opt,name=http_proxy,json=httpProxy,proto3" json:"http_proxy,omitempty"` HttpsProxy string `protobuf:"bytes,2,opt,name=https_proxy,json=httpsProxy,proto3" json:"https_proxy,omitempty"` @@ -1677,7 +1733,7 @@ func (m *ProxyEnv) Reset() { *m = ProxyEnv{} } func (m *ProxyEnv) String() string { return proto.CompactTextString(m) } func (*ProxyEnv) ProtoMessage() {} func (*ProxyEnv) Descriptor() ([]byte, []int) { - return fileDescriptor_8de16154b2733812, []int{24} + return fileDescriptor_8de16154b2733812, []int{25} } func (m *ProxyEnv) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1746,7 +1802,7 @@ func (m *WorkerConstraints) Reset() { *m = WorkerConstraints{} } func (m *WorkerConstraints) String() string { return proto.CompactTextString(m) } func (*WorkerConstraints) ProtoMessage() {} func (*WorkerConstraints) Descriptor() ([]byte, []int) { - return fileDescriptor_8de16154b2733812, []int{25} + return fileDescriptor_8de16154b2733812, []int{26} } func (m *WorkerConstraints) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1793,7 +1849,7 @@ func (m *Definition) Reset() { *m = Definition{} } func (m *Definition) String() string { return proto.CompactTextString(m) } func (*Definition) ProtoMessage() {} func (*Definition) Descriptor() ([]byte, []int) { - return fileDescriptor_8de16154b2733812, []int{26} + return fileDescriptor_8de16154b2733812, []int{27} } func (m *Definition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1847,7 +1903,7 @@ func (m *FileOp) Reset() { *m = FileOp{} } func (m *FileOp) String() string { return proto.CompactTextString(m) } func (*FileOp) ProtoMessage() {} func (*FileOp) Descriptor() ([]byte, []int) { - return fileDescriptor_8de16154b2733812, []int{27} + return fileDescriptor_8de16154b2733812, []int{28} } func (m *FileOp) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1895,7 +1951,7 @@ func (m *FileAction) Reset() { *m = FileAction{} } func (m *FileAction) String() string { return proto.CompactTextString(m) } func (*FileAction) ProtoMessage() {} func (*FileAction) Descriptor() ([]byte, []int) { - return fileDescriptor_8de16154b2733812, []int{28} + return fileDescriptor_8de16154b2733812, []int{29} } func (m *FileAction) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2022,7 +2078,7 @@ func (m *FileActionCopy) Reset() { *m = FileActionCopy{} } func (m *FileActionCopy) String() string { return proto.CompactTextString(m) } func (*FileActionCopy) ProtoMessage() {} func (*FileActionCopy) Descriptor() ([]byte, []int) { - return fileDescriptor_8de16154b2733812, []int{29} + return fileDescriptor_8de16154b2733812, []int{30} } func (m *FileActionCopy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2155,7 +2211,7 @@ func (m *FileActionMkFile) Reset() { *m = FileActionMkFile{} } func (m *FileActionMkFile) String() string { return proto.CompactTextString(m) } func (*FileActionMkFile) ProtoMessage() {} func (*FileActionMkFile) Descriptor() ([]byte, []int) { - return fileDescriptor_8de16154b2733812, []int{30} + return fileDescriptor_8de16154b2733812, []int{31} } func (m *FileActionMkFile) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2232,7 +2288,7 @@ func (m *FileActionMkDir) Reset() { *m = FileActionMkDir{} } func (m *FileActionMkDir) String() string { return proto.CompactTextString(m) } func (*FileActionMkDir) ProtoMessage() {} func (*FileActionMkDir) Descriptor() ([]byte, []int) { - return fileDescriptor_8de16154b2733812, []int{31} + return fileDescriptor_8de16154b2733812, []int{32} } func (m *FileActionMkDir) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2305,7 +2361,7 @@ func (m *FileActionRm) Reset() { *m = FileActionRm{} } func (m *FileActionRm) String() string { return proto.CompactTextString(m) } func (*FileActionRm) ProtoMessage() {} func (*FileActionRm) Descriptor() ([]byte, []int) { - return fileDescriptor_8de16154b2733812, []int{32} + return fileDescriptor_8de16154b2733812, []int{33} } func (m *FileActionRm) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2360,7 +2416,7 @@ func (m *ChownOpt) Reset() { *m = ChownOpt{} } func (m *ChownOpt) String() string { return proto.CompactTextString(m) } func (*ChownOpt) ProtoMessage() {} func (*ChownOpt) Descriptor() ([]byte, []int) { - return fileDescriptor_8de16154b2733812, []int{33} + return fileDescriptor_8de16154b2733812, []int{34} } func (m *ChownOpt) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2410,7 +2466,7 @@ func (m *UserOpt) Reset() { *m = UserOpt{} } func (m *UserOpt) String() string { return proto.CompactTextString(m) } func (*UserOpt) ProtoMessage() {} func (*UserOpt) Descriptor() ([]byte, []int) { - return fileDescriptor_8de16154b2733812, []int{34} + return fileDescriptor_8de16154b2733812, []int{35} } func (m *UserOpt) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2489,7 +2545,7 @@ func (m *NamedUserOpt) Reset() { *m = NamedUserOpt{} } func (m *NamedUserOpt) String() string { return proto.CompactTextString(m) } func (*NamedUserOpt) ProtoMessage() {} func (*NamedUserOpt) Descriptor() ([]byte, []int) { - return fileDescriptor_8de16154b2733812, []int{35} + return fileDescriptor_8de16154b2733812, []int{36} } func (m *NamedUserOpt) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2529,7 +2585,7 @@ func (m *MergeInput) Reset() { *m = MergeInput{} } func (m *MergeInput) String() string { return proto.CompactTextString(m) } func (*MergeInput) ProtoMessage() {} func (*MergeInput) Descriptor() ([]byte, []int) { - return fileDescriptor_8de16154b2733812, []int{36} + return fileDescriptor_8de16154b2733812, []int{37} } func (m *MergeInput) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2562,7 +2618,7 @@ func (m *MergeOp) Reset() { *m = MergeOp{} } func (m *MergeOp) String() string { return proto.CompactTextString(m) } func (*MergeOp) ProtoMessage() {} func (*MergeOp) Descriptor() ([]byte, []int) { - return fileDescriptor_8de16154b2733812, []int{37} + return fileDescriptor_8de16154b2733812, []int{38} } func (m *MergeOp) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2602,7 +2658,7 @@ func (m *LowerDiffInput) Reset() { *m = LowerDiffInput{} } func (m *LowerDiffInput) String() string { return proto.CompactTextString(m) } func (*LowerDiffInput) ProtoMessage() {} func (*LowerDiffInput) Descriptor() ([]byte, []int) { - return fileDescriptor_8de16154b2733812, []int{38} + return fileDescriptor_8de16154b2733812, []int{39} } func (m *LowerDiffInput) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2635,7 +2691,7 @@ func (m *UpperDiffInput) Reset() { *m = UpperDiffInput{} } func (m *UpperDiffInput) String() string { return proto.CompactTextString(m) } func (*UpperDiffInput) ProtoMessage() {} func (*UpperDiffInput) Descriptor() ([]byte, []int) { - return fileDescriptor_8de16154b2733812, []int{39} + return fileDescriptor_8de16154b2733812, []int{40} } func (m *UpperDiffInput) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2669,7 +2725,7 @@ func (m *DiffOp) Reset() { *m = DiffOp{} } func (m *DiffOp) String() string { return proto.CompactTextString(m) } func (*DiffOp) ProtoMessage() {} func (*DiffOp) Descriptor() ([]byte, []int) { - return fileDescriptor_8de16154b2733812, []int{40} + return fileDescriptor_8de16154b2733812, []int{41} } func (m *DiffOp) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2743,6 +2799,7 @@ func init() { proto.RegisterType((*Range)(nil), "pb.Range") proto.RegisterType((*Position)(nil), "pb.Position") proto.RegisterType((*ExportCache)(nil), "pb.ExportCache") + proto.RegisterType((*ProgressGroup)(nil), "pb.ProgressGroup") proto.RegisterType((*ProxyEnv)(nil), "pb.ProxyEnv") proto.RegisterType((*WorkerConstraints)(nil), "pb.WorkerConstraints") proto.RegisterType((*Definition)(nil), "pb.Definition") @@ -2766,163 +2823,166 @@ func init() { func init() { proto.RegisterFile("ops.proto", fileDescriptor_8de16154b2733812) } var fileDescriptor_8de16154b2733812 = []byte{ - // 2486 bytes of a gzipped FileDescriptorProto + // 2529 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x59, 0xcf, 0x6f, 0x1b, 0xc7, - 0xf5, 0x17, 0x7f, 0x93, 0x8f, 0x12, 0xcd, 0xef, 0xd8, 0x49, 0x18, 0x7d, 0x5d, 0x59, 0xd9, 0xa4, - 0x81, 0x2c, 0xdb, 0x12, 0xaa, 0x00, 0x71, 0x60, 0x14, 0x45, 0x25, 0x91, 0x86, 0x18, 0xdb, 0xa2, + 0xf5, 0x17, 0x7f, 0x93, 0x8f, 0x12, 0xcd, 0x8c, 0x9d, 0x84, 0xd1, 0xd7, 0x5f, 0x59, 0xd9, 0xa4, + 0x81, 0x2c, 0xdb, 0x12, 0xaa, 0x00, 0x71, 0x60, 0x14, 0x45, 0x25, 0x91, 0xae, 0x18, 0xdb, 0xa2, 0x30, 0xb4, 0x9d, 0x1e, 0x0a, 0x18, 0xab, 0xe5, 0x90, 0x5a, 0x68, 0xb9, 0xb3, 0x98, 0x1d, 0xc6, - 0x62, 0x0f, 0x3d, 0xe4, 0x5e, 0x20, 0x40, 0x81, 0xa2, 0x97, 0xa2, 0xff, 0x44, 0xaf, 0xbd, 0x07, - 0xe8, 0x25, 0x87, 0x1e, 0x82, 0x1e, 0xd2, 0xc2, 0xb9, 0xf4, 0x8f, 0x68, 0x81, 0xe2, 0xbd, 0x99, - 0xfd, 0x41, 0x5a, 0x81, 0xed, 0xb6, 0xe8, 0x89, 0xb3, 0x9f, 0xf7, 0x99, 0xf7, 0xde, 0xcc, 0xbc, - 0x37, 0xf3, 0x66, 0x08, 0x0d, 0x19, 0xc5, 0x3b, 0x91, 0x92, 0x5a, 0xb2, 0x62, 0x74, 0xba, 0x7e, - 0x67, 0xe2, 0xeb, 0xb3, 0xd9, 0xe9, 0x8e, 0x27, 0xa7, 0xbb, 0x13, 0x39, 0x91, 0xbb, 0x24, 0x3a, - 0x9d, 0x8d, 0xe9, 0x8b, 0x3e, 0xa8, 0x65, 0xba, 0x38, 0x7f, 0x2f, 0x42, 0x71, 0x10, 0xb1, 0xf7, - 0xa0, 0xea, 0x87, 0xd1, 0x4c, 0xc7, 0x9d, 0xc2, 0x66, 0x69, 0xab, 0xb9, 0xd7, 0xd8, 0x89, 0x4e, - 0x77, 0xfa, 0x88, 0x70, 0x2b, 0x60, 0x9b, 0x50, 0x16, 0x17, 0xc2, 0xeb, 0x14, 0x37, 0x0b, 0x5b, - 0xcd, 0x3d, 0x40, 0x42, 0xef, 0x42, 0x78, 0x83, 0xe8, 0x68, 0x85, 0x93, 0x84, 0x7d, 0x08, 0xd5, - 0x58, 0xce, 0x94, 0x27, 0x3a, 0x25, 0xe2, 0xac, 0x22, 0x67, 0x48, 0x08, 0xb1, 0xac, 0x14, 0x35, - 0x8d, 0xfd, 0x40, 0x74, 0xca, 0x99, 0xa6, 0xfb, 0x7e, 0x60, 0x38, 0x24, 0x61, 0xef, 0x43, 0xe5, - 0x74, 0xe6, 0x07, 0xa3, 0x4e, 0x85, 0x28, 0x4d, 0xa4, 0x1c, 0x20, 0x40, 0x1c, 0x23, 0x43, 0xd2, - 0x54, 0xa8, 0x89, 0xe8, 0x54, 0x33, 0xd2, 0x23, 0x04, 0x0c, 0x89, 0x64, 0x68, 0x6b, 0xe4, 0x8f, - 0xc7, 0x9d, 0x5a, 0x66, 0xab, 0xeb, 0x8f, 0xc7, 0xc6, 0x16, 0x4a, 0xd8, 0x16, 0xd4, 0xa3, 0xc0, - 0xd5, 0x63, 0xa9, 0xa6, 0x1d, 0xc8, 0xfc, 0x3e, 0xb1, 0x18, 0x4f, 0xa5, 0xec, 0x2e, 0x34, 0x3d, - 0x19, 0xc6, 0x5a, 0xb9, 0x7e, 0xa8, 0xe3, 0x4e, 0x93, 0xc8, 0x6f, 0x21, 0xf9, 0x33, 0xa9, 0xce, - 0x85, 0x3a, 0xcc, 0x84, 0x3c, 0xcf, 0x3c, 0x28, 0x43, 0x51, 0x46, 0xce, 0x6f, 0x0a, 0x50, 0x4f, - 0xb4, 0x32, 0x07, 0x56, 0xf7, 0x95, 0x77, 0xe6, 0x6b, 0xe1, 0xe9, 0x99, 0x12, 0x9d, 0xc2, 0x66, - 0x61, 0xab, 0xc1, 0x17, 0x30, 0xd6, 0x82, 0xe2, 0x60, 0x48, 0xf3, 0xdd, 0xe0, 0xc5, 0xc1, 0x90, - 0x75, 0xa0, 0xf6, 0xd4, 0x55, 0xbe, 0x1b, 0x6a, 0x9a, 0xe0, 0x06, 0x4f, 0x3e, 0xd9, 0x75, 0x68, - 0x0c, 0x86, 0x4f, 0x85, 0x8a, 0x7d, 0x19, 0xd2, 0xb4, 0x36, 0x78, 0x06, 0xb0, 0x0d, 0x80, 0xc1, - 0xf0, 0xbe, 0x70, 0x51, 0x69, 0xdc, 0xa9, 0x6c, 0x96, 0xb6, 0x1a, 0x3c, 0x87, 0x38, 0xbf, 0x84, - 0x0a, 0x2d, 0x35, 0xfb, 0x14, 0xaa, 0x23, 0x7f, 0x22, 0x62, 0x6d, 0xdc, 0x39, 0xd8, 0xfb, 0xea, - 0xdb, 0x1b, 0x2b, 0x7f, 0xf9, 0xf6, 0xc6, 0x76, 0x2e, 0xa6, 0x64, 0x24, 0x42, 0x4f, 0x86, 0xda, - 0xf5, 0x43, 0xa1, 0xe2, 0xdd, 0x89, 0xbc, 0x63, 0xba, 0xec, 0x74, 0xe9, 0x87, 0x5b, 0x0d, 0xec, - 0x26, 0x54, 0xfc, 0x70, 0x24, 0x2e, 0xc8, 0xff, 0xd2, 0xc1, 0x55, 0xab, 0xaa, 0x39, 0x98, 0xe9, - 0x68, 0xa6, 0xfb, 0x28, 0xe2, 0x86, 0xe1, 0xfc, 0xa9, 0x00, 0x55, 0x13, 0x4a, 0xec, 0x3a, 0x94, - 0xa7, 0x42, 0xbb, 0x64, 0xbf, 0xb9, 0x57, 0x37, 0x4b, 0xaa, 0x5d, 0x4e, 0x28, 0x46, 0xe9, 0x54, - 0xce, 0x70, 0xee, 0x8b, 0x59, 0x94, 0x3e, 0x42, 0x84, 0x5b, 0x01, 0xfb, 0x21, 0xd4, 0x42, 0xa1, - 0x9f, 0x4b, 0x75, 0x4e, 0x73, 0xd4, 0x32, 0x61, 0x71, 0x2c, 0xf4, 0x23, 0x39, 0x12, 0x3c, 0x91, - 0xb1, 0xdb, 0x50, 0x8f, 0x85, 0x37, 0x53, 0xbe, 0x9e, 0xd3, 0x7c, 0xb5, 0xf6, 0xda, 0x14, 0xac, - 0x16, 0x23, 0x72, 0xca, 0x60, 0xb7, 0xa0, 0x11, 0x0b, 0x4f, 0x09, 0x2d, 0xc2, 0xcf, 0x69, 0xfe, - 0x9a, 0x7b, 0x6b, 0x96, 0xae, 0x84, 0xee, 0x85, 0x9f, 0xf3, 0x4c, 0xee, 0xfc, 0xaa, 0x08, 0x65, - 0xf4, 0x99, 0x31, 0x28, 0xbb, 0x6a, 0x62, 0x32, 0xaa, 0xc1, 0xa9, 0xcd, 0xda, 0x50, 0x42, 0x1d, - 0x45, 0x82, 0xb0, 0x89, 0x88, 0xf7, 0x7c, 0x64, 0x17, 0x14, 0x9b, 0xd8, 0x6f, 0x16, 0x0b, 0x65, - 0xd7, 0x91, 0xda, 0xec, 0x26, 0x34, 0x22, 0x25, 0x2f, 0xe6, 0xcf, 0x8c, 0x07, 0x59, 0x94, 0x22, - 0x88, 0x0e, 0xd4, 0x23, 0xdb, 0x62, 0xdb, 0x00, 0xe2, 0x42, 0x2b, 0xf7, 0x48, 0xc6, 0x3a, 0xee, - 0x54, 0xc9, 0x5b, 0x8a, 0x7b, 0x04, 0xfa, 0x27, 0x3c, 0x27, 0x65, 0xeb, 0x50, 0x3f, 0x93, 0xb1, - 0x0e, 0xdd, 0xa9, 0xa0, 0x0c, 0x69, 0xf0, 0xf4, 0x9b, 0x39, 0x50, 0x9d, 0x05, 0xfe, 0xd4, 0xd7, - 0x9d, 0x46, 0xa6, 0xe3, 0x09, 0x21, 0xdc, 0x4a, 0x30, 0x8a, 0xbd, 0x89, 0x92, 0xb3, 0xe8, 0xc4, - 0x55, 0x22, 0xd4, 0x94, 0x3f, 0x0d, 0xbe, 0x80, 0x39, 0xb7, 0xa1, 0x6a, 0x2c, 0xe3, 0xc0, 0xb0, - 0x65, 0x63, 0x9d, 0xda, 0x18, 0xe3, 0xfd, 0x93, 0x24, 0xc6, 0xfb, 0x27, 0x4e, 0x17, 0xaa, 0xc6, - 0x06, 0xb2, 0x8f, 0xd1, 0x2f, 0xcb, 0xc6, 0x36, 0x62, 0x43, 0x39, 0xd6, 0x26, 0xa6, 0x38, 0xb5, - 0x49, 0xab, 0xab, 0xcc, 0x0c, 0x96, 0x38, 0xb5, 0x9d, 0x07, 0xd0, 0x48, 0xd7, 0x86, 0x4c, 0x74, - 0xad, 0x9a, 0x62, 0xbf, 0x8b, 0x1d, 0x68, 0xc0, 0xc6, 0x28, 0xb5, 0x71, 0x22, 0x64, 0xa4, 0x7d, - 0x19, 0xba, 0x01, 0x29, 0xaa, 0xf3, 0xf4, 0xdb, 0xf9, 0x6d, 0x09, 0x2a, 0x14, 0x64, 0x6c, 0x0b, - 0x63, 0x3a, 0x9a, 0x99, 0x11, 0x94, 0x0e, 0x98, 0x8d, 0x69, 0xa0, 0xec, 0x49, 0x43, 0x1a, 0x33, - 0x69, 0x1d, 0xe3, 0x2b, 0x10, 0x9e, 0x96, 0xca, 0xda, 0x49, 0xbf, 0xd1, 0xfe, 0x08, 0x73, 0xcc, - 0x2c, 0x39, 0xb5, 0xd9, 0x2d, 0xa8, 0x4a, 0x4a, 0x0c, 0x5a, 0xf5, 0xef, 0x49, 0x17, 0x4b, 0x41, - 0xe5, 0x4a, 0xb8, 0x23, 0x19, 0x06, 0x73, 0x8a, 0x85, 0x3a, 0x4f, 0xbf, 0x31, 0x54, 0x29, 0x13, - 0x1e, 0xcf, 0x23, 0xb3, 0x31, 0xb6, 0x4c, 0xa8, 0x3e, 0x4a, 0x40, 0x9e, 0xc9, 0x71, 0xeb, 0x7b, - 0x3c, 0x8d, 0xc6, 0xf1, 0x20, 0xd2, 0x9d, 0xab, 0x59, 0x50, 0x25, 0x18, 0x4f, 0xa5, 0xc8, 0xf4, - 0x5c, 0xef, 0x4c, 0x20, 0xf3, 0x5a, 0xc6, 0x3c, 0xb4, 0x18, 0x4f, 0xa5, 0x59, 0xae, 0x20, 0xf5, - 0x2d, 0xa2, 0xe6, 0x72, 0x05, 0xb9, 0x99, 0x1c, 0x63, 0x6c, 0x38, 0x3c, 0x42, 0xe6, 0xdb, 0xd9, - 0xfe, 0x6c, 0x10, 0x6e, 0x25, 0x66, 0xb4, 0xf1, 0x2c, 0xd0, 0xfd, 0x6e, 0xe7, 0x1d, 0x33, 0x95, - 0xc9, 0xb7, 0xb3, 0x91, 0x0d, 0x00, 0xa7, 0x35, 0xf6, 0x7f, 0x61, 0xe2, 0xa5, 0xc4, 0xa9, 0xed, - 0xf4, 0xa1, 0x9e, 0xb8, 0xf8, 0x52, 0x18, 0xdc, 0x81, 0x5a, 0x7c, 0xe6, 0x2a, 0x3f, 0x9c, 0xd0, - 0x0a, 0xb5, 0xf6, 0xae, 0xa6, 0x23, 0x1a, 0x1a, 0x1c, 0xbd, 0x48, 0x38, 0x8e, 0x4c, 0x42, 0xea, - 0x32, 0x5d, 0x6d, 0x28, 0xcd, 0xfc, 0x11, 0xe9, 0x59, 0xe3, 0xd8, 0x44, 0x64, 0xe2, 0x9b, 0xa0, - 0x5c, 0xe3, 0xd8, 0x44, 0xff, 0xa6, 0x72, 0x64, 0x4e, 0xbd, 0x35, 0x4e, 0xed, 0x85, 0xb0, 0xab, - 0x2c, 0x85, 0x5d, 0x90, 0xcc, 0xcd, 0xff, 0xc4, 0xda, 0xaf, 0x0b, 0x50, 0x4f, 0x8e, 0x6a, 0x3c, - 0x30, 0xfc, 0x91, 0x08, 0xb5, 0x3f, 0xf6, 0x85, 0xb2, 0x86, 0x73, 0x08, 0xbb, 0x03, 0x15, 0x57, - 0x6b, 0x95, 0x6c, 0xc3, 0xef, 0xe4, 0xcf, 0xf9, 0x9d, 0x7d, 0x94, 0xf4, 0x42, 0xad, 0xe6, 0xdc, - 0xb0, 0xd6, 0x3f, 0x01, 0xc8, 0x40, 0xf4, 0xf5, 0x5c, 0xcc, 0xad, 0x56, 0x6c, 0xb2, 0x6b, 0x50, - 0xf9, 0xdc, 0x0d, 0x66, 0x49, 0x46, 0x9a, 0x8f, 0x7b, 0xc5, 0x4f, 0x0a, 0xce, 0x1f, 0x8b, 0x50, - 0xb3, 0xe7, 0x3e, 0xbb, 0x0d, 0x35, 0x3a, 0xf7, 0xad, 0x47, 0x97, 0xa7, 0x5f, 0x42, 0x61, 0xbb, - 0x69, 0x41, 0x93, 0xf3, 0xd1, 0xaa, 0x32, 0x85, 0x8d, 0xf5, 0x31, 0x2b, 0x6f, 0x4a, 0x23, 0x31, - 0xb6, 0x95, 0x4b, 0x8b, 0xea, 0x04, 0x31, 0xf6, 0x43, 0x1f, 0xe7, 0x87, 0xa3, 0x88, 0xdd, 0x4e, - 0x46, 0x5d, 0x26, 0x8d, 0x6f, 0xe7, 0x35, 0xbe, 0x3c, 0xe8, 0x3e, 0x34, 0x73, 0x66, 0x2e, 0x19, - 0xf5, 0x07, 0xf9, 0x51, 0x5b, 0x93, 0xa4, 0xce, 0x94, 0x5d, 0xd9, 0x2c, 0xfc, 0x07, 0xf3, 0xf7, - 0x31, 0x40, 0xa6, 0xf2, 0xf5, 0xb7, 0x2f, 0xe7, 0x8b, 0x12, 0xc0, 0x20, 0xc2, 0x53, 0x6c, 0xe4, - 0xd2, 0xb9, 0xbb, 0xea, 0x4f, 0x42, 0xa9, 0xc4, 0x33, 0x4a, 0x73, 0xea, 0x5f, 0xe7, 0x4d, 0x83, - 0x51, 0xc6, 0xb0, 0x7d, 0x68, 0x8e, 0x44, 0xec, 0x29, 0x9f, 0x02, 0xca, 0x4e, 0xfa, 0x0d, 0x1c, - 0x53, 0xa6, 0x67, 0xa7, 0x9b, 0x31, 0xcc, 0x5c, 0xe5, 0xfb, 0xb0, 0x3d, 0x58, 0x15, 0x17, 0x91, - 0x54, 0xda, 0x5a, 0x31, 0xe5, 0xe1, 0x15, 0x53, 0x68, 0x22, 0x4e, 0x96, 0x78, 0x53, 0x64, 0x1f, - 0xcc, 0x85, 0xb2, 0xe7, 0x46, 0xb1, 0x3d, 0x94, 0x3b, 0x4b, 0xf6, 0x0e, 0xdd, 0xc8, 0x4c, 0xda, - 0xc1, 0x47, 0x38, 0xd6, 0x2f, 0xfe, 0x7a, 0xe3, 0x56, 0xae, 0x92, 0x99, 0xca, 0xd3, 0xf9, 0x2e, - 0xc5, 0xcb, 0xb9, 0xaf, 0x77, 0x67, 0xda, 0x0f, 0x76, 0xdd, 0xc8, 0x47, 0x75, 0xd8, 0xb1, 0xdf, - 0xe5, 0xa4, 0x7a, 0xfd, 0x27, 0xd0, 0x5e, 0xf6, 0xfb, 0x4d, 0xd6, 0x60, 0xfd, 0x2e, 0x34, 0x52, - 0x3f, 0x5e, 0xd5, 0xb1, 0x9e, 0x5f, 0xbc, 0x3f, 0x14, 0xa0, 0x6a, 0xb2, 0x8a, 0xdd, 0x85, 0x46, - 0x20, 0x3d, 0x17, 0x1d, 0x48, 0x2a, 0xf4, 0x77, 0xb3, 0xa4, 0xdb, 0x79, 0x98, 0xc8, 0xcc, 0xac, - 0x66, 0x5c, 0x0c, 0x32, 0x3f, 0x1c, 0xcb, 0x24, 0x0b, 0x5a, 0x59, 0xa7, 0x7e, 0x38, 0x96, 0xdc, - 0x08, 0xd7, 0x1f, 0x40, 0x6b, 0x51, 0xc5, 0x25, 0x7e, 0xbe, 0xbf, 0x18, 0xae, 0xb4, 0xa7, 0xa7, - 0x9d, 0xf2, 0x6e, 0xdf, 0x85, 0x46, 0x8a, 0xb3, 0xed, 0x97, 0x1d, 0x5f, 0xcd, 0xf7, 0xcc, 0xf9, - 0xea, 0x04, 0x00, 0x99, 0x6b, 0xb8, 0x59, 0xe1, 0x55, 0x20, 0xcc, 0x4a, 0x80, 0xf4, 0x9b, 0x4e, - 0x50, 0x57, 0xbb, 0xe4, 0xca, 0x2a, 0xa7, 0x36, 0xdb, 0x01, 0x18, 0xa5, 0x09, 0xfb, 0x3d, 0x69, - 0x9c, 0x63, 0x38, 0x03, 0xa8, 0x27, 0x4e, 0xb0, 0x4d, 0x68, 0xc6, 0xd6, 0x32, 0x56, 0xac, 0x68, - 0xae, 0xc2, 0xf3, 0x10, 0x56, 0x9e, 0xca, 0x0d, 0x27, 0x62, 0xa1, 0xf2, 0xe4, 0x88, 0x70, 0x2b, - 0x70, 0x3e, 0x83, 0x0a, 0x01, 0x98, 0x66, 0xb1, 0x76, 0x95, 0xb6, 0x45, 0xac, 0xa9, 0xd3, 0x64, - 0x4c, 0x66, 0x0f, 0xca, 0x18, 0x88, 0xdc, 0x10, 0xd8, 0x07, 0x58, 0x0d, 0x8e, 0xec, 0x8c, 0x5e, - 0xc6, 0x43, 0xb1, 0xf3, 0x63, 0xa8, 0x27, 0x30, 0x8e, 0xfc, 0xa1, 0x1f, 0x0a, 0xeb, 0x22, 0xb5, - 0xb1, 0xf8, 0x3f, 0x3c, 0x73, 0x95, 0xeb, 0x69, 0x61, 0x8a, 0x8d, 0x0a, 0xcf, 0x00, 0xe7, 0x7d, - 0x68, 0xe6, 0xb2, 0x07, 0xc3, 0xed, 0x29, 0x2d, 0xa3, 0xc9, 0x61, 0xf3, 0xe1, 0xfc, 0x1e, 0xaf, - 0x26, 0x49, 0x01, 0xf9, 0x03, 0x80, 0x33, 0xad, 0xa3, 0x67, 0x54, 0x51, 0xda, 0xb9, 0x6f, 0x20, - 0x42, 0x0c, 0x76, 0x03, 0x9a, 0xf8, 0x11, 0x5b, 0xb9, 0x89, 0x77, 0xea, 0x11, 0x1b, 0xc2, 0xff, - 0x43, 0x63, 0x9c, 0x76, 0x2f, 0xd9, 0xa5, 0x4b, 0x7a, 0xbf, 0x0b, 0xf5, 0x50, 0x5a, 0x99, 0x29, - 0x70, 0x6b, 0xa1, 0x4c, 0xfb, 0xb9, 0x41, 0x60, 0x65, 0x15, 0xd3, 0xcf, 0x0d, 0x02, 0x12, 0x3a, - 0xb7, 0xe0, 0xff, 0x5e, 0xba, 0x64, 0xb1, 0xb7, 0xa1, 0x3a, 0xf6, 0x03, 0x4d, 0x27, 0x02, 0x16, - 0xd4, 0xf6, 0xcb, 0xf9, 0x67, 0x01, 0x20, 0x5b, 0x76, 0x0c, 0x66, 0xdc, 0xda, 0x91, 0xb3, 0x6a, - 0xb6, 0xf2, 0x00, 0xea, 0x53, 0xbb, 0x49, 0xd8, 0x05, 0xbd, 0xbe, 0x18, 0x2a, 0x3b, 0xc9, 0x1e, - 0x62, 0xb6, 0x8f, 0x3d, 0xbb, 0x7d, 0xbc, 0xc9, 0x45, 0x28, 0xb5, 0x40, 0x55, 0x4e, 0xfe, 0x5e, - 0x0c, 0x59, 0x16, 0x72, 0x2b, 0x59, 0x7f, 0x00, 0x6b, 0x0b, 0x26, 0x5f, 0xf3, 0xc0, 0xc8, 0x36, - 0xbb, 0x7c, 0x0a, 0xee, 0x41, 0xd5, 0x5c, 0xa8, 0xd9, 0x16, 0xd4, 0x5c, 0xcf, 0x64, 0x5f, 0x6e, - 0x07, 0x40, 0xe1, 0x3e, 0xc1, 0x3c, 0x11, 0x3b, 0x7f, 0x2e, 0x02, 0x64, 0xf8, 0x1b, 0x94, 0xba, - 0xf7, 0xa0, 0x15, 0x0b, 0x4f, 0x86, 0x23, 0x57, 0xcd, 0x49, 0x6a, 0x6f, 0x7c, 0x97, 0x75, 0x59, - 0x62, 0xe6, 0xca, 0xde, 0xd2, 0xab, 0xcb, 0xde, 0x2d, 0x28, 0x7b, 0x32, 0x9a, 0xdb, 0x73, 0x81, - 0x2d, 0x0e, 0xe4, 0x50, 0x46, 0x73, 0xbc, 0xd2, 0x23, 0x83, 0xed, 0x40, 0x75, 0x7a, 0x4e, 0x4f, - 0x0c, 0xe6, 0xaa, 0x74, 0x6d, 0x91, 0xfb, 0xe8, 0x1c, 0xdb, 0x47, 0x2b, 0xdc, 0xb2, 0xd8, 0x2d, - 0xa8, 0x4c, 0xcf, 0x47, 0xbe, 0xb2, 0x2f, 0x09, 0x57, 0x97, 0xe9, 0x5d, 0x5f, 0xd1, 0x8b, 0x02, - 0x72, 0x98, 0x03, 0x45, 0x35, 0xb5, 0xef, 0x09, 0xed, 0xa5, 0xd9, 0x9c, 0x1e, 0xad, 0xf0, 0xa2, - 0x9a, 0x1e, 0xd4, 0xa1, 0x6a, 0xe6, 0xd5, 0xf9, 0x47, 0x09, 0x5a, 0x8b, 0x5e, 0xe2, 0xca, 0xc6, - 0xca, 0x4b, 0x56, 0x36, 0x56, 0x5e, 0x7a, 0x23, 0x28, 0xe6, 0x6e, 0x04, 0x0e, 0x54, 0xe4, 0xf3, - 0x50, 0xa8, 0xfc, 0x5b, 0xca, 0xe1, 0x99, 0x7c, 0x1e, 0x62, 0x55, 0x6a, 0x44, 0x0b, 0x45, 0x5e, - 0xc5, 0x16, 0x79, 0x1f, 0xc0, 0xda, 0x58, 0x06, 0x81, 0x7c, 0x3e, 0x9c, 0x4f, 0x03, 0x3f, 0x3c, - 0xb7, 0x95, 0xde, 0x22, 0xc8, 0xb6, 0xe0, 0xca, 0xc8, 0x57, 0xe8, 0xce, 0xa1, 0x0c, 0xb5, 0x08, - 0xe9, 0xa6, 0x88, 0xbc, 0x65, 0x98, 0x7d, 0x0a, 0x9b, 0xae, 0xd6, 0x62, 0x1a, 0xe9, 0x27, 0x61, - 0xe4, 0x7a, 0xe7, 0x5d, 0xe9, 0x51, 0x16, 0x4e, 0x23, 0x57, 0xfb, 0xa7, 0x7e, 0x80, 0x37, 0xe8, - 0x1a, 0x75, 0x7d, 0x25, 0x8f, 0x7d, 0x08, 0x2d, 0x4f, 0x09, 0x57, 0x8b, 0xae, 0x88, 0xf5, 0x89, - 0xab, 0xcf, 0x3a, 0x75, 0xea, 0xb9, 0x84, 0xe2, 0x18, 0x5c, 0xf4, 0xf6, 0x33, 0x3f, 0x18, 0x79, - 0x78, 0xb7, 0x6b, 0x98, 0x31, 0x2c, 0x80, 0x6c, 0x07, 0x18, 0x01, 0xbd, 0x69, 0xa4, 0xe7, 0x29, - 0x15, 0x88, 0x7a, 0x89, 0x04, 0xf7, 0x49, 0xed, 0x4f, 0x45, 0xac, 0xdd, 0x69, 0x44, 0x8f, 0x37, - 0x25, 0x9e, 0x01, 0xec, 0x26, 0xb4, 0xfd, 0xd0, 0x0b, 0x66, 0x23, 0xf1, 0x2c, 0xc2, 0x81, 0xa8, - 0x30, 0xee, 0xac, 0xd2, 0xae, 0x72, 0xc5, 0xe2, 0x27, 0x16, 0x46, 0xaa, 0xb8, 0x58, 0xa2, 0xae, - 0x19, 0xaa, 0xc5, 0x13, 0xaa, 0xf3, 0x65, 0x01, 0xda, 0xcb, 0x81, 0x87, 0xcb, 0x16, 0xe1, 0xe0, - 0xed, 0xcd, 0x16, 0xdb, 0xe9, 0x52, 0x16, 0x73, 0x4b, 0x99, 0x1c, 0x73, 0xa5, 0xdc, 0x31, 0x97, - 0x86, 0x45, 0xf9, 0xfb, 0xc3, 0x62, 0x61, 0xa0, 0x95, 0xa5, 0x81, 0x3a, 0xbf, 0x2b, 0xc0, 0x95, - 0xa5, 0xe0, 0x7e, 0x6d, 0x8f, 0x36, 0xa1, 0x39, 0x75, 0xcf, 0x85, 0xb9, 0xd9, 0xc7, 0xf6, 0xa6, - 0x9c, 0x87, 0xfe, 0x0b, 0xfe, 0x85, 0xb0, 0x9a, 0xcf, 0xa8, 0x4b, 0x7d, 0x4b, 0x02, 0xe4, 0x58, - 0xea, 0xfb, 0x72, 0x66, 0x8f, 0xd0, 0x24, 0x40, 0x12, 0xf0, 0xe5, 0x30, 0x2a, 0x5d, 0x12, 0x46, - 0xce, 0x31, 0xd4, 0x13, 0x07, 0xd9, 0x0d, 0xfb, 0xf4, 0x52, 0xc8, 0x5e, 0x14, 0x9f, 0xc4, 0x42, - 0xa1, 0xef, 0xe6, 0x1d, 0xe6, 0x3d, 0xa8, 0xd0, 0xdb, 0x86, 0xdd, 0x83, 0x17, 0x18, 0x46, 0xe2, - 0x0c, 0xa1, 0x66, 0x11, 0xb6, 0x0d, 0xd5, 0xd3, 0x79, 0xfa, 0x88, 0x61, 0xb7, 0x0b, 0xfc, 0x1e, - 0x59, 0x06, 0xee, 0x41, 0x86, 0xc1, 0xae, 0x41, 0xf9, 0x74, 0xde, 0xef, 0x9a, 0x5b, 0x1d, 0xee, - 0x64, 0xf8, 0x75, 0x50, 0x35, 0x0e, 0x39, 0x0f, 0x61, 0x35, 0xdf, 0x2f, 0x7d, 0xc3, 0x28, 0xe4, - 0xde, 0x30, 0xd2, 0x2d, 0xbb, 0xf8, 0xaa, 0xf2, 0xfe, 0x63, 0x00, 0x7a, 0x28, 0x7d, 0xd3, 0x6b, - 0xc1, 0x8f, 0xa0, 0x66, 0x1f, 0x58, 0xd9, 0x87, 0x4b, 0x0f, 0xc6, 0xad, 0xf4, 0xf5, 0x75, 0xe1, - 0xd5, 0xd8, 0xb9, 0x87, 0xa5, 0xe5, 0x73, 0xa1, 0xba, 0xfe, 0x78, 0xfc, 0xa6, 0xe6, 0xee, 0x41, - 0xeb, 0x49, 0x14, 0xfd, 0x7b, 0x7d, 0x7f, 0x0e, 0x55, 0xf3, 0xce, 0x8b, 0x7d, 0x02, 0xf4, 0xc0, - 0xae, 0x01, 0x33, 0xe5, 0x67, 0xde, 0x25, 0x6e, 0x08, 0xc8, 0x9c, 0xa1, 0x3d, 0xbb, 0xb8, 0xc4, - 0x5c, 0x74, 0x80, 0x1b, 0xc2, 0xf6, 0x16, 0xd4, 0xec, 0x93, 0x22, 0x6b, 0x40, 0xe5, 0xc9, 0xf1, - 0xb0, 0xf7, 0xb8, 0xbd, 0xc2, 0xea, 0x50, 0x3e, 0x1a, 0x0c, 0x1f, 0xb7, 0x0b, 0xd8, 0x3a, 0x1e, - 0x1c, 0xf7, 0xda, 0xc5, 0xed, 0x9b, 0xb0, 0x9a, 0x7f, 0x54, 0x64, 0x4d, 0xa8, 0x0d, 0xf7, 0x8f, - 0xbb, 0x07, 0x83, 0x9f, 0xb5, 0x57, 0xd8, 0x2a, 0xd4, 0xfb, 0xc7, 0xc3, 0xde, 0xe1, 0x13, 0xde, - 0x6b, 0x17, 0xb6, 0x7f, 0x0a, 0x8d, 0xf4, 0x95, 0x06, 0x35, 0x1c, 0xf4, 0x8f, 0xbb, 0xed, 0x15, - 0x06, 0x50, 0x1d, 0xf6, 0x0e, 0x79, 0x0f, 0xf5, 0xd6, 0xa0, 0x34, 0x1c, 0x1e, 0xb5, 0x8b, 0x68, - 0xf5, 0x70, 0xff, 0xf0, 0xa8, 0xd7, 0x2e, 0x61, 0xf3, 0xf1, 0xa3, 0x93, 0xfb, 0xc3, 0x76, 0x79, - 0xfb, 0x63, 0xb8, 0xb2, 0xf4, 0x7e, 0x41, 0xbd, 0x8f, 0xf6, 0x79, 0x0f, 0x35, 0x35, 0xa1, 0x76, - 0xc2, 0xfb, 0x4f, 0xf7, 0x1f, 0xf7, 0xda, 0x05, 0x14, 0x3c, 0x1c, 0x1c, 0x3e, 0xe8, 0x75, 0xdb, - 0xc5, 0x83, 0xeb, 0x5f, 0xbd, 0xd8, 0x28, 0x7c, 0xfd, 0x62, 0xa3, 0xf0, 0xcd, 0x8b, 0x8d, 0xc2, - 0xdf, 0x5e, 0x6c, 0x14, 0xbe, 0xfc, 0x6e, 0x63, 0xe5, 0xeb, 0xef, 0x36, 0x56, 0xbe, 0xf9, 0x6e, - 0x63, 0xe5, 0xb4, 0x4a, 0xff, 0x14, 0x7c, 0xf4, 0xaf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xcd, 0x9c, - 0x8e, 0xbd, 0x69, 0x18, 0x00, 0x00, + 0x62, 0x0f, 0x3d, 0xf4, 0x5e, 0x20, 0x40, 0x81, 0xa2, 0x97, 0xa2, 0xff, 0x44, 0x8f, 0xed, 0x3d, + 0x40, 0x2f, 0x39, 0xf4, 0x10, 0xf4, 0x90, 0x16, 0xce, 0xa5, 0x7f, 0x44, 0x0b, 0x14, 0xef, 0xcd, + 0xec, 0x0f, 0xd2, 0x0a, 0x1c, 0xb7, 0x45, 0x4f, 0x9c, 0xfd, 0xbc, 0xcf, 0xbc, 0x79, 0x33, 0xf3, + 0xde, 0xbc, 0x37, 0x43, 0x68, 0xc8, 0x28, 0xde, 0x89, 0x94, 0xd4, 0x92, 0x15, 0xa3, 0xd3, 0xf5, + 0x3b, 0x13, 0x5f, 0x9f, 0xcd, 0x4e, 0x77, 0x3c, 0x39, 0xdd, 0x9d, 0xc8, 0x89, 0xdc, 0x25, 0xd1, + 0xe9, 0x6c, 0x4c, 0x5f, 0xf4, 0x41, 0x2d, 0xd3, 0xc5, 0xf9, 0x7b, 0x11, 0x8a, 0x83, 0x88, 0xbd, + 0x0b, 0x55, 0x3f, 0x8c, 0x66, 0x3a, 0xee, 0x14, 0x36, 0x4b, 0x5b, 0xcd, 0xbd, 0xc6, 0x4e, 0x74, + 0xba, 0xd3, 0x47, 0x84, 0x5b, 0x01, 0xdb, 0x84, 0xb2, 0xb8, 0x10, 0x5e, 0xa7, 0xb8, 0x59, 0xd8, + 0x6a, 0xee, 0x01, 0x12, 0x7a, 0x17, 0xc2, 0x1b, 0x44, 0x47, 0x2b, 0x9c, 0x24, 0xec, 0x03, 0xa8, + 0xc6, 0x72, 0xa6, 0x3c, 0xd1, 0x29, 0x11, 0x67, 0x15, 0x39, 0x43, 0x42, 0x88, 0x65, 0xa5, 0xa8, + 0x69, 0xec, 0x07, 0xa2, 0x53, 0xce, 0x34, 0xdd, 0xf7, 0x03, 0xc3, 0x21, 0x09, 0x7b, 0x0f, 0x2a, + 0xa7, 0x33, 0x3f, 0x18, 0x75, 0x2a, 0x44, 0x69, 0x22, 0xe5, 0x00, 0x01, 0xe2, 0x18, 0x19, 0x92, + 0xa6, 0x42, 0x4d, 0x44, 0xa7, 0x9a, 0x91, 0x1e, 0x21, 0x60, 0x48, 0x24, 0xc3, 0xb1, 0x46, 0xfe, + 0x78, 0xdc, 0xa9, 0x65, 0x63, 0x75, 0xfd, 0xf1, 0xd8, 0x8c, 0x85, 0x12, 0xb6, 0x05, 0xf5, 0x28, + 0x70, 0xf5, 0x58, 0xaa, 0x69, 0x07, 0x32, 0xbb, 0x4f, 0x2c, 0xc6, 0x53, 0x29, 0xbb, 0x0b, 0x4d, + 0x4f, 0x86, 0xb1, 0x56, 0xae, 0x1f, 0xea, 0xb8, 0xd3, 0x24, 0xf2, 0x9b, 0x48, 0xfe, 0x54, 0xaa, + 0x73, 0xa1, 0x0e, 0x33, 0x21, 0xcf, 0x33, 0x0f, 0xca, 0x50, 0x94, 0x91, 0xf3, 0xeb, 0x02, 0xd4, + 0x13, 0xad, 0xcc, 0x81, 0xd5, 0x7d, 0xe5, 0x9d, 0xf9, 0x5a, 0x78, 0x7a, 0xa6, 0x44, 0xa7, 0xb0, + 0x59, 0xd8, 0x6a, 0xf0, 0x05, 0x8c, 0xb5, 0xa0, 0x38, 0x18, 0xd2, 0x7a, 0x37, 0x78, 0x71, 0x30, + 0x64, 0x1d, 0xa8, 0x3d, 0x75, 0x95, 0xef, 0x86, 0x9a, 0x16, 0xb8, 0xc1, 0x93, 0x4f, 0x76, 0x1d, + 0x1a, 0x83, 0xe1, 0x53, 0xa1, 0x62, 0x5f, 0x86, 0xb4, 0xac, 0x0d, 0x9e, 0x01, 0x6c, 0x03, 0x60, + 0x30, 0xbc, 0x2f, 0x5c, 0x54, 0x1a, 0x77, 0x2a, 0x9b, 0xa5, 0xad, 0x06, 0xcf, 0x21, 0xce, 0xcf, + 0xa1, 0x42, 0x5b, 0xcd, 0x3e, 0x81, 0xea, 0xc8, 0x9f, 0x88, 0x58, 0x1b, 0x73, 0x0e, 0xf6, 0xbe, + 0xf8, 0xfa, 0xc6, 0xca, 0x5f, 0xbe, 0xbe, 0xb1, 0x9d, 0xf3, 0x29, 0x19, 0x89, 0xd0, 0x93, 0xa1, + 0x76, 0xfd, 0x50, 0xa8, 0x78, 0x77, 0x22, 0xef, 0x98, 0x2e, 0x3b, 0x5d, 0xfa, 0xe1, 0x56, 0x03, + 0xbb, 0x09, 0x15, 0x3f, 0x1c, 0x89, 0x0b, 0xb2, 0xbf, 0x74, 0x70, 0xd5, 0xaa, 0x6a, 0x0e, 0x66, + 0x3a, 0x9a, 0xe9, 0x3e, 0x8a, 0xb8, 0x61, 0x38, 0x7f, 0x2a, 0x40, 0xd5, 0xb8, 0x12, 0xbb, 0x0e, + 0xe5, 0xa9, 0xd0, 0x2e, 0x8d, 0xdf, 0xdc, 0xab, 0x9b, 0x2d, 0xd5, 0x2e, 0x27, 0x14, 0xbd, 0x74, + 0x2a, 0x67, 0xb8, 0xf6, 0xc5, 0xcc, 0x4b, 0x1f, 0x21, 0xc2, 0xad, 0x80, 0x7d, 0x0f, 0x6a, 0xa1, + 0xd0, 0xcf, 0xa5, 0x3a, 0xa7, 0x35, 0x6a, 0x19, 0xb7, 0x38, 0x16, 0xfa, 0x91, 0x1c, 0x09, 0x9e, + 0xc8, 0xd8, 0x6d, 0xa8, 0xc7, 0xc2, 0x9b, 0x29, 0x5f, 0xcf, 0x69, 0xbd, 0x5a, 0x7b, 0x6d, 0x72, + 0x56, 0x8b, 0x11, 0x39, 0x65, 0xb0, 0x5b, 0xd0, 0x88, 0x85, 0xa7, 0x84, 0x16, 0xe1, 0x67, 0xb4, + 0x7e, 0xcd, 0xbd, 0x35, 0x4b, 0x57, 0x42, 0xf7, 0xc2, 0xcf, 0x78, 0x26, 0x77, 0x7e, 0x59, 0x84, + 0x32, 0xda, 0xcc, 0x18, 0x94, 0x5d, 0x35, 0x31, 0x11, 0xd5, 0xe0, 0xd4, 0x66, 0x6d, 0x28, 0xa1, + 0x8e, 0x22, 0x41, 0xd8, 0x44, 0xc4, 0x7b, 0x3e, 0xb2, 0x1b, 0x8a, 0x4d, 0xec, 0x37, 0x8b, 0x85, + 0xb2, 0xfb, 0x48, 0x6d, 0x76, 0x13, 0x1a, 0x91, 0x92, 0x17, 0xf3, 0x67, 0xc6, 0x82, 0xcc, 0x4b, + 0x11, 0x44, 0x03, 0xea, 0x91, 0x6d, 0xb1, 0x6d, 0x00, 0x71, 0xa1, 0x95, 0x7b, 0x24, 0x63, 0x1d, + 0x77, 0xaa, 0x64, 0x2d, 0xf9, 0x3d, 0x02, 0xfd, 0x13, 0x9e, 0x93, 0xb2, 0x75, 0xa8, 0x9f, 0xc9, + 0x58, 0x87, 0xee, 0x54, 0x50, 0x84, 0x34, 0x78, 0xfa, 0xcd, 0x1c, 0xa8, 0xce, 0x02, 0x7f, 0xea, + 0xeb, 0x4e, 0x23, 0xd3, 0xf1, 0x84, 0x10, 0x6e, 0x25, 0xe8, 0xc5, 0xde, 0x44, 0xc9, 0x59, 0x74, + 0xe2, 0x2a, 0x11, 0x6a, 0x8a, 0x9f, 0x06, 0x5f, 0xc0, 0x9c, 0xdb, 0x50, 0x35, 0x23, 0xe3, 0xc4, + 0xb0, 0x65, 0x7d, 0x9d, 0xda, 0xe8, 0xe3, 0xfd, 0x93, 0xc4, 0xc7, 0xfb, 0x27, 0x4e, 0x17, 0xaa, + 0x66, 0x0c, 0x64, 0x1f, 0xa3, 0x5d, 0x96, 0x8d, 0x6d, 0xc4, 0x86, 0x72, 0xac, 0x8d, 0x4f, 0x71, + 0x6a, 0x93, 0x56, 0x57, 0x99, 0x15, 0x2c, 0x71, 0x6a, 0x3b, 0x0f, 0xa0, 0x91, 0xee, 0x0d, 0x0d, + 0xd1, 0xb5, 0x6a, 0x8a, 0xfd, 0x2e, 0x76, 0xa0, 0x09, 0x9b, 0x41, 0xa9, 0x8d, 0x0b, 0x21, 0x23, + 0xed, 0xcb, 0xd0, 0x0d, 0x48, 0x51, 0x9d, 0xa7, 0xdf, 0xce, 0x6f, 0x4a, 0x50, 0x21, 0x27, 0x63, + 0x5b, 0xe8, 0xd3, 0xd1, 0xcc, 0xcc, 0xa0, 0x74, 0xc0, 0xac, 0x4f, 0x03, 0x45, 0x4f, 0xea, 0xd2, + 0x18, 0x49, 0xeb, 0xe8, 0x5f, 0x81, 0xf0, 0xb4, 0x54, 0x76, 0x9c, 0xf4, 0x1b, 0xc7, 0x1f, 0x61, + 0x8c, 0x99, 0x2d, 0xa7, 0x36, 0xbb, 0x05, 0x55, 0x49, 0x81, 0x41, 0xbb, 0xfe, 0x2d, 0xe1, 0x62, + 0x29, 0xa8, 0x5c, 0x09, 0x77, 0x24, 0xc3, 0x60, 0x4e, 0xbe, 0x50, 0xe7, 0xe9, 0x37, 0xba, 0x2a, + 0x45, 0xc2, 0xe3, 0x79, 0x64, 0x0e, 0xc6, 0x96, 0x71, 0xd5, 0x47, 0x09, 0xc8, 0x33, 0x39, 0x1e, + 0x7d, 0x8f, 0xa7, 0xd1, 0x38, 0x1e, 0x44, 0xba, 0x73, 0x35, 0x73, 0xaa, 0x04, 0xe3, 0xa9, 0x14, + 0x99, 0x9e, 0xeb, 0x9d, 0x09, 0x64, 0x5e, 0xcb, 0x98, 0x87, 0x16, 0xe3, 0xa9, 0x34, 0x8b, 0x15, + 0xa4, 0xbe, 0x49, 0xd4, 0x5c, 0xac, 0x20, 0x37, 0x93, 0xa3, 0x8f, 0x0d, 0x87, 0x47, 0xc8, 0x7c, + 0x2b, 0x3b, 0x9f, 0x0d, 0xc2, 0xad, 0xc4, 0xcc, 0x36, 0x9e, 0x05, 0xba, 0xdf, 0xed, 0xbc, 0x6d, + 0x96, 0x32, 0xf9, 0x76, 0x36, 0xb2, 0x09, 0xe0, 0xb2, 0xc6, 0xfe, 0xcf, 0x8c, 0xbf, 0x94, 0x38, + 0xb5, 0x9d, 0x3e, 0xd4, 0x13, 0x13, 0x5f, 0x72, 0x83, 0x3b, 0x50, 0x8b, 0xcf, 0x5c, 0xe5, 0x87, + 0x13, 0xda, 0xa1, 0xd6, 0xde, 0xd5, 0x74, 0x46, 0x43, 0x83, 0xa3, 0x15, 0x09, 0xc7, 0x91, 0x89, + 0x4b, 0x5d, 0xa6, 0xab, 0x0d, 0xa5, 0x99, 0x3f, 0x22, 0x3d, 0x6b, 0x1c, 0x9b, 0x88, 0x4c, 0x7c, + 0xe3, 0x94, 0x6b, 0x1c, 0x9b, 0x68, 0xdf, 0x54, 0x8e, 0x4c, 0xd6, 0x5b, 0xe3, 0xd4, 0x5e, 0x70, + 0xbb, 0xca, 0x92, 0xdb, 0x05, 0xc9, 0xda, 0xfc, 0x4f, 0x46, 0xfb, 0x55, 0x01, 0xea, 0x49, 0xaa, + 0xc6, 0x84, 0xe1, 0x8f, 0x44, 0xa8, 0xfd, 0xb1, 0x2f, 0x94, 0x1d, 0x38, 0x87, 0xb0, 0x3b, 0x50, + 0x71, 0xb5, 0x56, 0xc9, 0x31, 0xfc, 0x76, 0x3e, 0xcf, 0xef, 0xec, 0xa3, 0xa4, 0x17, 0x6a, 0x35, + 0xe7, 0x86, 0xb5, 0xfe, 0x31, 0x40, 0x06, 0xa2, 0xad, 0xe7, 0x62, 0x6e, 0xb5, 0x62, 0x93, 0x5d, + 0x83, 0xca, 0x67, 0x6e, 0x30, 0x4b, 0x22, 0xd2, 0x7c, 0xdc, 0x2b, 0x7e, 0x5c, 0x70, 0xfe, 0x58, + 0x84, 0x9a, 0xcd, 0xfb, 0xec, 0x36, 0xd4, 0x28, 0xef, 0x5b, 0x8b, 0x2e, 0x0f, 0xbf, 0x84, 0xc2, + 0x76, 0xd3, 0x82, 0x26, 0x67, 0xa3, 0x55, 0x65, 0x0a, 0x1b, 0x6b, 0x63, 0x56, 0xde, 0x94, 0x46, + 0x62, 0x6c, 0x2b, 0x97, 0x16, 0xd5, 0x09, 0x62, 0xec, 0x87, 0x3e, 0xae, 0x0f, 0x47, 0x11, 0xbb, + 0x9d, 0xcc, 0xba, 0x4c, 0x1a, 0xdf, 0xca, 0x6b, 0x7c, 0x79, 0xd2, 0x7d, 0x68, 0xe6, 0x86, 0xb9, + 0x64, 0xd6, 0xef, 0xe7, 0x67, 0x6d, 0x87, 0x24, 0x75, 0xa6, 0xec, 0xca, 0x56, 0xe1, 0x3f, 0x58, + 0xbf, 0x8f, 0x00, 0x32, 0x95, 0xdf, 0xfd, 0xf8, 0x72, 0xfe, 0x50, 0x02, 0x18, 0x44, 0x98, 0xc5, + 0x46, 0x2e, 0xe5, 0xdd, 0x55, 0x7f, 0x12, 0x4a, 0x25, 0x9e, 0x51, 0x98, 0x53, 0xff, 0x3a, 0x6f, + 0x1a, 0x8c, 0x22, 0x86, 0xed, 0x43, 0x73, 0x24, 0x62, 0x4f, 0xf9, 0xe4, 0x50, 0x76, 0xd1, 0x6f, + 0xe0, 0x9c, 0x32, 0x3d, 0x3b, 0xdd, 0x8c, 0x61, 0xd6, 0x2a, 0xdf, 0x87, 0xed, 0xc1, 0xaa, 0xb8, + 0x88, 0xa4, 0xd2, 0x76, 0x14, 0x53, 0x1e, 0x5e, 0x31, 0x85, 0x26, 0xe2, 0x34, 0x12, 0x6f, 0x8a, + 0xec, 0x83, 0xb9, 0x50, 0xf6, 0xdc, 0x28, 0xb6, 0x49, 0xb9, 0xb3, 0x34, 0xde, 0xa1, 0x1b, 0x99, + 0x45, 0x3b, 0xf8, 0x10, 0xe7, 0xfa, 0x8b, 0xbf, 0xde, 0xb8, 0x95, 0xab, 0x64, 0xa6, 0xf2, 0x74, + 0xbe, 0x4b, 0xfe, 0x72, 0xee, 0xeb, 0xdd, 0x99, 0xf6, 0x83, 0x5d, 0x37, 0xf2, 0x51, 0x1d, 0x76, + 0xec, 0x77, 0x39, 0xa9, 0x66, 0x1f, 0x43, 0x2b, 0x52, 0x72, 0xa2, 0x44, 0x1c, 0x3f, 0xa3, 0xbc, + 0x66, 0xeb, 0xcd, 0x37, 0x6c, 0xfe, 0x25, 0xc9, 0x8f, 0x51, 0xc0, 0xd7, 0xa2, 0xfc, 0xe7, 0xfa, + 0x0f, 0xa1, 0xbd, 0x3c, 0xe3, 0xd7, 0xd9, 0xbd, 0xf5, 0xbb, 0xd0, 0x48, 0x67, 0xf0, 0xaa, 0x8e, + 0xf5, 0xfc, 0xb6, 0xff, 0xbe, 0x00, 0x55, 0x13, 0x8f, 0xec, 0x2e, 0x34, 0x02, 0xe9, 0xb9, 0x68, + 0x40, 0x52, 0xdb, 0xbf, 0x93, 0x85, 0xeb, 0xce, 0xc3, 0x44, 0x66, 0xf6, 0x23, 0xe3, 0xa2, 0x7b, + 0xfa, 0xe1, 0x58, 0x26, 0xf1, 0xd3, 0xca, 0x3a, 0xf5, 0xc3, 0xb1, 0xe4, 0x46, 0xb8, 0xfe, 0x00, + 0x5a, 0x8b, 0x2a, 0x2e, 0xb1, 0xf3, 0xbd, 0x45, 0x47, 0xa7, 0x6c, 0x90, 0x76, 0xca, 0x9b, 0x7d, + 0x17, 0x1a, 0x29, 0xce, 0xb6, 0x5f, 0x36, 0x7c, 0x35, 0xdf, 0x33, 0x67, 0xab, 0x13, 0x00, 0x64, + 0xa6, 0xe1, 0x31, 0x87, 0x97, 0x88, 0x30, 0x2b, 0x1e, 0xd2, 0x6f, 0xca, 0xbd, 0xae, 0x76, 0xc9, + 0x94, 0x55, 0x4e, 0x6d, 0xb6, 0x03, 0x30, 0x4a, 0x43, 0xfd, 0x5b, 0x0e, 0x80, 0x1c, 0xc3, 0x19, + 0x40, 0x3d, 0x31, 0x82, 0x6d, 0x42, 0x33, 0xb6, 0x23, 0x63, 0xad, 0x8b, 0xc3, 0x55, 0x78, 0x1e, + 0xc2, 0x9a, 0x55, 0xb9, 0xe1, 0x44, 0x2c, 0xd4, 0xac, 0x1c, 0x11, 0x6e, 0x05, 0xce, 0xa7, 0x50, + 0x21, 0x00, 0x03, 0x34, 0xd6, 0xae, 0xd2, 0xb6, 0xfc, 0x35, 0x15, 0x9e, 0x8c, 0x69, 0xd8, 0x83, + 0x32, 0xba, 0x30, 0x37, 0x04, 0xf6, 0x3e, 0xd6, 0x91, 0x23, 0xbb, 0xa2, 0x97, 0xf1, 0x50, 0xec, + 0xfc, 0x00, 0xea, 0x09, 0x8c, 0x33, 0x7f, 0xe8, 0x87, 0xc2, 0x9a, 0x48, 0x6d, 0xbc, 0x36, 0x1c, + 0x9e, 0xb9, 0xca, 0xf5, 0xb4, 0x30, 0x65, 0x4a, 0x85, 0x67, 0x80, 0xf3, 0x1e, 0x34, 0x73, 0x71, + 0x87, 0xee, 0xf6, 0x94, 0xb6, 0xd1, 0x44, 0xbf, 0xf9, 0x70, 0x3e, 0x84, 0xb5, 0x85, 0x18, 0xc0, + 0x64, 0xe5, 0x8f, 0x92, 0x64, 0x65, 0x12, 0xd1, 0x72, 0xb5, 0xe5, 0xfc, 0x0e, 0x6f, 0x42, 0x49, + 0xbd, 0xfa, 0xff, 0x00, 0x67, 0x5a, 0x47, 0xcf, 0xa8, 0x80, 0xb5, 0x1d, 0x1b, 0x88, 0x10, 0x83, + 0xdd, 0x80, 0x26, 0x7e, 0xc4, 0x56, 0x6e, 0xd4, 0x50, 0x8f, 0xd8, 0x10, 0xfe, 0x0f, 0x1a, 0xe3, + 0xb4, 0x7b, 0xc9, 0xee, 0x77, 0xd2, 0xfb, 0x1d, 0xa8, 0x87, 0xd2, 0xca, 0x4c, 0x3d, 0x5d, 0x0b, + 0x65, 0xda, 0xcf, 0x0d, 0x02, 0x2b, 0xab, 0x98, 0x7e, 0x6e, 0x10, 0x90, 0xd0, 0xb9, 0x05, 0x6f, + 0xbc, 0x74, 0xa7, 0x63, 0x6f, 0x41, 0x75, 0xec, 0x07, 0x9a, 0x12, 0x10, 0xd6, 0xef, 0xf6, 0xcb, + 0xf9, 0x67, 0x01, 0x20, 0xf3, 0x15, 0x8c, 0x00, 0xcc, 0x24, 0xc8, 0x59, 0x35, 0x99, 0x23, 0x80, + 0xfa, 0xd4, 0x9e, 0x49, 0xd6, 0x0b, 0xae, 0x2f, 0xfa, 0xd7, 0x4e, 0x72, 0x64, 0x99, 0xd3, 0x6a, + 0xcf, 0x9e, 0x56, 0xaf, 0x73, 0xef, 0x4a, 0x47, 0xa0, 0xa2, 0x2a, 0x7f, 0x0d, 0x87, 0x2c, 0x74, + 0xb9, 0x95, 0xac, 0x3f, 0x80, 0xb5, 0x85, 0x21, 0xbf, 0x63, 0x7e, 0xca, 0xce, 0xd6, 0x7c, 0xdc, + 0xee, 0x41, 0xd5, 0xdc, 0xdf, 0xd9, 0x16, 0xd4, 0x5c, 0xcf, 0x84, 0x6c, 0xee, 0xd8, 0x40, 0xe1, + 0x3e, 0xc1, 0x3c, 0x11, 0x3b, 0x7f, 0x2e, 0x02, 0x64, 0xf8, 0x6b, 0x54, 0xd6, 0xf7, 0xa0, 0x15, + 0x0b, 0x4f, 0x86, 0x23, 0x57, 0xcd, 0x49, 0x6a, 0x2f, 0x98, 0x97, 0x75, 0x59, 0x62, 0xe6, 0xaa, + 0xec, 0xd2, 0xab, 0xab, 0xec, 0x2d, 0x28, 0x7b, 0x32, 0x9a, 0xdb, 0x34, 0xc4, 0x16, 0x27, 0x72, + 0x28, 0xa3, 0xf9, 0xd1, 0x0a, 0x27, 0x06, 0xdb, 0x81, 0xea, 0xf4, 0x9c, 0x5e, 0x34, 0xcc, 0xcd, + 0xec, 0xda, 0x22, 0xf7, 0xd1, 0x39, 0xb6, 0x8f, 0x56, 0xb8, 0x65, 0xb1, 0x5b, 0x50, 0x99, 0x9e, + 0x8f, 0x7c, 0x65, 0x13, 0xc9, 0xd5, 0x65, 0x7a, 0xd7, 0x57, 0xf4, 0x80, 0x81, 0x1c, 0xe6, 0x40, + 0x51, 0x4d, 0xed, 0xf3, 0x45, 0x7b, 0x69, 0x35, 0xa7, 0x47, 0x2b, 0xbc, 0xa8, 0xa6, 0x07, 0x75, + 0xa8, 0x9a, 0x75, 0x75, 0xfe, 0x51, 0x82, 0xd6, 0xa2, 0x95, 0xb8, 0xb3, 0xb1, 0xf2, 0x92, 0x9d, + 0x8d, 0x95, 0x97, 0x5e, 0x40, 0x8a, 0xb9, 0x0b, 0x88, 0x03, 0x15, 0xf9, 0x3c, 0x14, 0x2a, 0xff, + 0x74, 0x73, 0x78, 0x26, 0x9f, 0x87, 0x58, 0x04, 0x1b, 0xd1, 0x42, 0x4d, 0x59, 0xb1, 0x35, 0xe5, + 0xfb, 0xb0, 0x36, 0x96, 0x41, 0x20, 0x9f, 0x0f, 0xe7, 0xd3, 0xc0, 0x0f, 0xcf, 0x6d, 0x61, 0xb9, + 0x08, 0xb2, 0x2d, 0xb8, 0x32, 0xf2, 0x15, 0x9a, 0x73, 0x28, 0x43, 0x2d, 0x42, 0xba, 0x98, 0x22, + 0x6f, 0x19, 0x66, 0x9f, 0xc0, 0xa6, 0xab, 0xb5, 0x98, 0x46, 0xfa, 0x49, 0x18, 0xb9, 0xde, 0x79, + 0x57, 0x7a, 0x14, 0x85, 0xd3, 0xc8, 0xd5, 0xfe, 0xa9, 0x1f, 0xe0, 0x85, 0xbd, 0x46, 0x5d, 0x5f, + 0xc9, 0x63, 0x1f, 0x40, 0xcb, 0x53, 0xc2, 0xd5, 0xa2, 0x2b, 0x62, 0x7d, 0xe2, 0xea, 0xb3, 0x4e, + 0x9d, 0x7a, 0x2e, 0xa1, 0x38, 0x07, 0x17, 0xad, 0xfd, 0xd4, 0x0f, 0x46, 0x1e, 0x5e, 0x25, 0x1b, + 0x66, 0x0e, 0x0b, 0x20, 0xdb, 0x01, 0x46, 0x40, 0x6f, 0x1a, 0xe9, 0x79, 0x4a, 0x05, 0xa2, 0x5e, + 0x22, 0xc1, 0xc3, 0x55, 0xfb, 0x53, 0x11, 0x6b, 0x77, 0x1a, 0xd1, 0x5b, 0x51, 0x89, 0x67, 0x00, + 0xbb, 0x09, 0x6d, 0x3f, 0xf4, 0x82, 0xd9, 0x48, 0x3c, 0x8b, 0x70, 0x22, 0x2a, 0x8c, 0x3b, 0xab, + 0x74, 0xaa, 0x5c, 0xb1, 0xf8, 0x89, 0x85, 0x91, 0x2a, 0x2e, 0x96, 0xa8, 0x6b, 0x86, 0x6a, 0xf1, + 0x84, 0xea, 0x7c, 0x5e, 0x80, 0xf6, 0xb2, 0xe3, 0xe1, 0xb6, 0x45, 0x38, 0x79, 0x7b, 0x91, 0xc6, + 0x76, 0xba, 0x95, 0xc5, 0xdc, 0x56, 0x26, 0xb9, 0xb1, 0x94, 0xcb, 0x8d, 0xa9, 0x5b, 0x94, 0xbf, + 0xdd, 0x2d, 0x16, 0x26, 0x5a, 0x59, 0x9a, 0xa8, 0xf3, 0xdb, 0x02, 0x5c, 0x59, 0x72, 0xee, 0xef, + 0x6c, 0xd1, 0x26, 0x34, 0xa7, 0xee, 0xb9, 0x30, 0x0f, 0x09, 0xb1, 0xbd, 0x98, 0xe7, 0xa1, 0xff, + 0x82, 0x7d, 0x21, 0xac, 0xe6, 0x23, 0xea, 0x52, 0xdb, 0x12, 0x07, 0x39, 0x96, 0xfa, 0xbe, 0x9c, + 0xd9, 0xbc, 0x9b, 0x38, 0x48, 0x02, 0xbe, 0xec, 0x46, 0xa5, 0x4b, 0xdc, 0xc8, 0x39, 0x86, 0x7a, + 0x62, 0x20, 0xbb, 0x61, 0x5f, 0x7a, 0x0a, 0xd9, 0x03, 0xe6, 0x93, 0x58, 0x28, 0xb4, 0xdd, 0x3c, + 0xfb, 0xbc, 0x0b, 0x15, 0x53, 0x72, 0x16, 0x5f, 0x66, 0x18, 0x89, 0x33, 0x84, 0x9a, 0x45, 0xd8, + 0x36, 0x54, 0x4f, 0xe7, 0xe9, 0x9b, 0x89, 0x3d, 0x2e, 0xf0, 0x7b, 0x64, 0x19, 0x78, 0x06, 0x19, + 0x06, 0xbb, 0x06, 0xe5, 0xd3, 0x79, 0xbf, 0x6b, 0x2e, 0x91, 0x78, 0x92, 0xe1, 0xd7, 0x41, 0xd5, + 0x18, 0xe4, 0x3c, 0x84, 0xd5, 0x7c, 0xbf, 0x34, 0x89, 0x17, 0x72, 0x4f, 0x26, 0xe9, 0x91, 0x5d, + 0x7c, 0xd5, 0x6d, 0xe2, 0x23, 0x00, 0x7a, 0x97, 0x7d, 0xdd, 0x5b, 0xc8, 0xf7, 0xa1, 0x66, 0xdf, + 0x73, 0xd9, 0x07, 0x4b, 0xef, 0xd3, 0xad, 0xf4, 0xb1, 0x77, 0xe1, 0x91, 0xda, 0xb9, 0x87, 0xf5, + 0xe8, 0x73, 0xa1, 0xba, 0xfe, 0x78, 0xfc, 0xba, 0xc3, 0xdd, 0x83, 0xd6, 0x93, 0x28, 0xfa, 0xf7, + 0xfa, 0xfe, 0x14, 0xaa, 0xe6, 0x59, 0x19, 0xfb, 0x04, 0x68, 0x81, 0xdd, 0x03, 0x66, 0x6a, 0xd6, + 0xbc, 0x49, 0xdc, 0x10, 0x90, 0x39, 0xc3, 0xf1, 0xec, 0xe6, 0x12, 0x73, 0xd1, 0x00, 0x6e, 0x08, + 0xdb, 0x5b, 0x50, 0xb3, 0x2f, 0x98, 0xac, 0x01, 0x95, 0x27, 0xc7, 0xc3, 0xde, 0xe3, 0xf6, 0x0a, + 0xab, 0x43, 0xf9, 0x68, 0x30, 0x7c, 0xdc, 0x2e, 0x60, 0xeb, 0x78, 0x70, 0xdc, 0x6b, 0x17, 0xb7, + 0x6f, 0xc2, 0x6a, 0xfe, 0x0d, 0x93, 0x35, 0xa1, 0x36, 0xdc, 0x3f, 0xee, 0x1e, 0x0c, 0x7e, 0xd2, + 0x5e, 0x61, 0xab, 0x50, 0xef, 0x1f, 0x0f, 0x7b, 0x87, 0x4f, 0x78, 0xaf, 0x5d, 0xd8, 0xfe, 0x11, + 0x34, 0xd2, 0x47, 0x21, 0xd4, 0x70, 0xd0, 0x3f, 0xee, 0xb6, 0x57, 0x18, 0x40, 0x75, 0xd8, 0x3b, + 0xe4, 0x3d, 0xd4, 0x5b, 0x83, 0xd2, 0x70, 0x78, 0xd4, 0x2e, 0xe2, 0xa8, 0x87, 0xfb, 0x87, 0x47, + 0xbd, 0x76, 0x09, 0x9b, 0x8f, 0x1f, 0x9d, 0xdc, 0x1f, 0xb6, 0xcb, 0xdb, 0x1f, 0xc1, 0x95, 0xa5, + 0xe7, 0x12, 0xea, 0x7d, 0xb4, 0xcf, 0x7b, 0xa8, 0xa9, 0x09, 0xb5, 0x13, 0xde, 0x7f, 0xba, 0xff, + 0xb8, 0xd7, 0x2e, 0xa0, 0xe0, 0xe1, 0xe0, 0xf0, 0x41, 0xaf, 0xdb, 0x2e, 0x1e, 0x5c, 0xff, 0xe2, + 0xc5, 0x46, 0xe1, 0xcb, 0x17, 0x1b, 0x85, 0xaf, 0x5e, 0x6c, 0x14, 0xfe, 0xf6, 0x62, 0xa3, 0xf0, + 0xf9, 0x37, 0x1b, 0x2b, 0x5f, 0x7e, 0xb3, 0xb1, 0xf2, 0xd5, 0x37, 0x1b, 0x2b, 0xa7, 0x55, 0xfa, + 0x63, 0xe2, 0xc3, 0x7f, 0x05, 0x00, 0x00, 0xff, 0xff, 0xda, 0xe3, 0x79, 0x1d, 0xd8, 0x18, 0x00, + 0x00, } func (m *Op) Marshal() (dAtA []byte, err error) { @@ -4019,6 +4079,18 @@ func (m *OpMetadata) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.ProgressGroup != nil { + { + size, err := m.ProgressGroup.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintOps(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } if len(m.Caps) > 0 { keysForCaps := make([]string, 0, len(m.Caps)) for k := range m.Caps { @@ -4400,6 +4472,43 @@ func (m *ExportCache) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *ProgressGroup) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ProgressGroup) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ProgressGroup) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintOps(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0x12 + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintOps(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *ProxyEnv) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -5876,6 +5985,10 @@ func (m *OpMetadata) Size() (n int) { n += mapEntrySize + 1 + sovOps(uint64(mapEntrySize)) } } + if m.ProgressGroup != nil { + l = m.ProgressGroup.Size() + n += 1 + l + sovOps(uint64(l)) + } return n } @@ -6001,6 +6114,23 @@ func (m *ExportCache) Size() (n int) { return n } +func (m *ProgressGroup) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + sovOps(uint64(l)) + } + l = len(m.Name) + if l > 0 { + n += 1 + l + sovOps(uint64(l)) + } + return n +} + func (m *ProxyEnv) Size() (n int) { if m == nil { return 0 @@ -9830,6 +9960,42 @@ func (m *OpMetadata) Unmarshal(dAtA []byte) error { } m.Caps[github_com_moby_buildkit_util_apicaps.CapID(mapkey)] = mapvalue iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ProgressGroup", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOps + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthOps + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthOps + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ProgressGroup == nil { + m.ProgressGroup = &ProgressGroup{} + } + if err := m.ProgressGroup.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipOps(dAtA[iNdEx:]) @@ -10677,6 +10843,120 @@ func (m *ExportCache) Unmarshal(dAtA []byte) error { } return nil } +func (m *ProgressGroup) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOps + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ProgressGroup: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ProgressGroup: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOps + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthOps + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOps + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOps + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthOps + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOps + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipOps(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthOps + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *ProxyEnv) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/solver/pb/ops.proto b/solver/pb/ops.proto index c43b85a5..7d814619 100644 --- a/solver/pb/ops.proto +++ b/solver/pb/ops.proto @@ -207,6 +207,8 @@ message OpMetadata { ExportCache export_cache = 4; map caps = 5 [(gogoproto.castkey) = "github.com/moby/buildkit/util/apicaps.CapID", (gogoproto.nullable) = false]; + + ProgressGroup progress_group = 6; } // Source is a source mapping description for a file @@ -249,6 +251,11 @@ message ExportCache { bool Value = 1; } +message ProgressGroup { + string id = 1; + string name = 2; +} + message ProxyEnv { string http_proxy = 1; string https_proxy = 2; diff --git a/solver/types.go b/solver/types.go index 1aec5f49..03a55f28 100644 --- a/solver/types.go +++ b/solver/types.go @@ -55,6 +55,7 @@ type VertexOptions struct { Description map[string]string // text values with no special meaning for solver ExportCache *bool // WorkerConstraint + ProgressGroup *pb.ProgressGroup } // Result is an abstract return value for a solve diff --git a/source/containerimage/pull.go b/source/containerimage/pull.go index a04a1c5a..665954b9 100644 --- a/source/containerimage/pull.go +++ b/source/containerimage/pull.go @@ -213,6 +213,7 @@ func (p *puller) CacheKey(ctx context.Context, g session.Group, index int) (cach if p.vtx != nil { progressController.Digest = p.vtx.Digest() progressController.Name = p.vtx.Name() + progressController.ProgressGroup = p.vtx.Options().ProgressGroup } p.descHandlers = cache.DescHandlers(make(map[digest.Digest]*cache.DescHandler)) diff --git a/util/progress/controller/controller.go b/util/progress/controller/controller.go index dfadb1cb..cda1bc03 100644 --- a/util/progress/controller/controller.go +++ b/util/progress/controller/controller.go @@ -6,6 +6,7 @@ import ( "time" "github.com/moby/buildkit/client" + "github.com/moby/buildkit/solver/pb" "github.com/moby/buildkit/util/progress" digest "github.com/opencontainers/go-digest" ) @@ -18,6 +19,7 @@ type Controller struct { Digest digest.Digest Name string WriterFactory progress.WriterFactory + ProgressGroup *pb.ProgressGroup } var _ progress.Controller = &Controller{} @@ -32,9 +34,10 @@ func (c *Controller) Start(ctx context.Context) (context.Context, func(error)) { if c.Digest != "" { c.writer.Write(c.Digest.String(), client.Vertex{ - Digest: c.Digest, - Name: c.Name, - Started: c.started, + Digest: c.Digest, + Name: c.Name, + Started: c.started, + ProgressGroup: c.ProgressGroup, }) } } @@ -47,11 +50,12 @@ func (c *Controller) Start(ctx context.Context) (context.Context, func(error)) { } if c.Digest != "" { c.writer.Write(c.Digest.String(), client.Vertex{ - Digest: c.Digest, - Name: c.Name, - Started: c.started, - Completed: &now, - Error: errString, + Digest: c.Digest, + Name: c.Name, + Started: c.started, + Completed: &now, + Error: errString, + ProgressGroup: c.ProgressGroup, }) } c.writer.Close() diff --git a/util/progress/progressui/display.go b/util/progress/progressui/display.go index 8f9ddf85..a7f177b4 100644 --- a/util/progress/progressui/display.go +++ b/util/progress/progressui/display.go @@ -121,10 +121,12 @@ type trace struct { nextIndex int updates map[digest.Digest]struct{} modeConsole bool + groups map[string]*vertexGroup // group id -> group } type vertex struct { *client.Vertex + statuses []*status byID map[string]*status indent string @@ -159,6 +161,42 @@ func (v *vertex) update(c int) { v.count += c } +type vertexGroup struct { + *vertex + subVtxs map[digest.Digest]client.Vertex +} + +func (vg *vertexGroup) mergeSubVtxs() *client.Vertex { + newVtx := *vg.Vertex + newVtx.Completed = &time.Time{} + newVtx.Cached = true + for _, subVtx := range vg.subVtxs { + // Group start time is the earliest start time of the vtxs (or nil if none have started) + if newVtx.Started == nil || (subVtx.Started != nil && subVtx.Started.Before(*newVtx.Started)) { + newVtx.Started = subVtx.Started + } + + // Group is considered not completed if any vtxs are not completed. If all vtxs + // are completed, then group completed time is the latest of those + if newVtx.Completed != nil { + if subVtx.Completed == nil { + newVtx.Completed = nil + } else if subVtx.Completed.After(*newVtx.Completed) { + newVtx.Completed = subVtx.Completed + } + } + + // Group is considered cached iff all subVtxs are cached + newVtx.Cached = newVtx.Cached && subVtx.Cached + + // Group error is set to the first error found in subvtxs, if any + if newVtx.Error == "" { + newVtx.Error = subVtx.Error + } + } + return &newVtx +} + type status struct { *client.VertexStatus } @@ -169,6 +207,7 @@ func newTrace(w io.Writer, modeConsole bool) *trace { updates: make(map[digest.Digest]struct{}), w: w, modeConsole: modeConsole, + groups: make(map[string]*vertexGroup), } } @@ -222,7 +261,36 @@ func (t *trace) triggerVertexEvent(v *client.Vertex) { } func (t *trace) update(s *client.SolveStatus, termWidth int) { + groups := make(map[string]struct{}) for _, v := range s.Vertexes { + if v.ProgressGroup != nil { + group, ok := t.groups[v.ProgressGroup.Id] + if !ok { + t.nextIndex++ + group = &vertexGroup{ + vertex: &vertex{ + Vertex: &client.Vertex{ + Digest: digest.Digest(v.ProgressGroup.Id), + Name: v.ProgressGroup.Name, + Completed: &time.Time{}, + }, + byID: make(map[string]*status), + statusUpdates: make(map[string]struct{}), + index: t.nextIndex, + }, + subVtxs: make(map[digest.Digest]client.Vertex), + } + if t.modeConsole { + group.term = vt100.NewVT100(termHeight, termWidth-termPad) + } + t.groups[v.ProgressGroup.Id] = group + t.byDigest[group.Digest] = group.vertex + } + groups[v.ProgressGroup.Id] = struct{}{} + group.subVtxs[v.Digest] = *v + t.byDigest[v.Digest] = group.vertex + continue + } prev, ok := t.byDigest[v.Digest] if !ok { t.nextIndex++ @@ -248,6 +316,19 @@ func (t *trace) update(s *client.SolveStatus, termWidth int) { } t.byDigest[v.Digest].jobCached = false } + for groupID := range groups { + group := t.groups[groupID] + newVtx := group.mergeSubVtxs() + t.triggerVertexEvent(newVtx) + if newVtx.Started != nil && group.Started == nil { + if t.localTimeDiff == 0 { + t.localTimeDiff = time.Since(*newVtx.Started) + } + t.vertexes = append(t.vertexes, group.vertex) + } + group.Vertex = newVtx + group.jobCached = false + } for _, s := range s.Statuses { v, ok := t.byDigest[s.Vertex] if !ok { @@ -344,6 +425,11 @@ func (t *trace) displayInfo() (d displayInfo) { } d.countTotal = len(t.byDigest) for _, v := range t.byDigest { + if v.ProgressGroup != nil { + // don't count vtxs in a group, they are merged into a single vtx + d.countTotal-- + continue + } if v.Completed != nil { d.countCompleted++ }