Enable to restore build options from the server

Signed-off-by: Kohei Tokunaga <ktokunaga.mail@gmail.com>
pull/1640/head
Kohei Tokunaga 2 years ago
parent b3340cc7ba
commit ce48b1ae84
No known key found for this signature in database
GPG Key ID: 6CE0A04690DB3FB3

@ -200,6 +200,9 @@ func containerConfigFromResult(ctx context.Context, res *gateway.Result, c gatew
if res.Ref == nil { if res.Ref == nil {
return nil, errors.Errorf("no reference is registered") return nil, errors.Errorf("no reference is registered")
} }
if cfg.Initial {
return nil, errors.Errorf("starting from the container from the initial state of the step is supported only on the failed steps")
}
st, err := res.Ref.ToState() st, err := res.Ref.ToState()
if err != nil { if err != nil {
return nil, err return nil, err
@ -284,6 +287,9 @@ func containerConfigFromError(solveErr *errdefs.SolveError, cfg controllerapi.In
var mounts []gateway.Mount var mounts []gateway.Mount
for i, mnt := range exec.Mounts { for i, mnt := range exec.Mounts {
rid := solveErr.Solve.MountIDs[i] rid := solveErr.Solve.MountIDs[i]
if cfg.Initial {
rid = solveErr.Solve.InputIDs[i]
}
mounts = append(mounts, gateway.Mount{ mounts = append(mounts, gateway.Mount{
Selector: mnt.Selector, Selector: mnt.Selector,
Dest: mnt.Dest, Dest: mnt.Dest,

@ -22,6 +22,7 @@ type BuildxController interface {
Disconnect(ctx context.Context, ref string) error Disconnect(ctx context.Context, ref string) error
ListProcesses(ctx context.Context, ref string) (infos []*controllerapi.ProcessInfo, retErr error) ListProcesses(ctx context.Context, ref string) (infos []*controllerapi.ProcessInfo, retErr error)
DisconnectProcess(ctx context.Context, ref, pid string) error DisconnectProcess(ctx context.Context, ref, pid string) error
Inspect(ctx context.Context, ref string) (*controllerapi.InspectResponse, error)
} }
type ControlOptions struct { type ControlOptions struct {

@ -26,11 +26,18 @@ func NewLocalBuildxController(ctx context.Context, dockerCli command.Cli) contro
} }
} }
type buildConfig struct {
// TODO: these two structs should be merged
// Discussion: https://github.com/docker/buildx/pull/1640#discussion_r1113279719
resultCtx *build.ResultContext
buildOptions *controllerapi.BuildOptions
}
type localController struct { type localController struct {
dockerCli command.Cli dockerCli command.Cli
ref string ref string
resultCtx *build.ResultContext buildConfig buildConfig
processes *processes.Manager processes *processes.Manager
buildOnGoing atomic.Bool buildOnGoing atomic.Bool
} }
@ -89,7 +96,7 @@ func (b *localController) Invoke(ctx context.Context, ref string, pid string, cf
proc, ok := b.processes.Get(pid) proc, ok := b.processes.Get(pid)
if !ok { if !ok {
// Start a new process. // Start a new process.
if b.resultCtx == nil { if b.buildConfig.resultCtx == nil {
return errors.New("no build result is registered") return errors.New("no build result is registered")
} }
var err error var err error
@ -114,12 +121,15 @@ func (b *localController) Invoke(ctx context.Context, ref string, pid string, cf
} }
func (b *localController) Kill(context.Context) error { func (b *localController) Kill(context.Context) error {
b.cancelRunningProcesses() b.Close()
return nil return nil
} }
func (b *localController) Close() error { func (b *localController) Close() error {
b.cancelRunningProcesses() b.cancelRunningProcesses()
if b.buildConfig.resultCtx != nil {
b.buildConfig.resultCtx.Done()
}
// TODO: cancel ongoing builds? // TODO: cancel ongoing builds?
return nil return nil
} }
@ -129,6 +139,13 @@ func (b *localController) List(ctx context.Context) (res []string, _ error) {
} }
func (b *localController) Disconnect(ctx context.Context, key string) error { func (b *localController) Disconnect(ctx context.Context, key string) error {
b.cancelRunningProcesses() b.Close()
return nil return nil
} }
func (b *localController) Inspect(ctx context.Context, ref string) (*controllerapi.InspectResponse, error) {
if ref != b.ref {
return nil, errors.Errorf("unknown ref %q", ref)
}
return &controllerapi.InspectResponse{Options: b.buildConfig.buildOptions}, nil
}

@ -777,6 +777,82 @@ func (m *Secret) GetEnv() string {
return "" return ""
} }
type InspectRequest struct {
Ref string `protobuf:"bytes,1,opt,name=Ref,proto3" json:"Ref,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *InspectRequest) Reset() { *m = InspectRequest{} }
func (m *InspectRequest) String() string { return proto.CompactTextString(m) }
func (*InspectRequest) ProtoMessage() {}
func (*InspectRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{12}
}
func (m *InspectRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InspectRequest.Unmarshal(m, b)
}
func (m *InspectRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_InspectRequest.Marshal(b, m, deterministic)
}
func (m *InspectRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_InspectRequest.Merge(m, src)
}
func (m *InspectRequest) XXX_Size() int {
return xxx_messageInfo_InspectRequest.Size(m)
}
func (m *InspectRequest) XXX_DiscardUnknown() {
xxx_messageInfo_InspectRequest.DiscardUnknown(m)
}
var xxx_messageInfo_InspectRequest proto.InternalMessageInfo
func (m *InspectRequest) GetRef() string {
if m != nil {
return m.Ref
}
return ""
}
type InspectResponse struct {
Options *BuildOptions `protobuf:"bytes,1,opt,name=Options,proto3" json:"Options,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *InspectResponse) Reset() { *m = InspectResponse{} }
func (m *InspectResponse) String() string { return proto.CompactTextString(m) }
func (*InspectResponse) ProtoMessage() {}
func (*InspectResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{13}
}
func (m *InspectResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InspectResponse.Unmarshal(m, b)
}
func (m *InspectResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_InspectResponse.Marshal(b, m, deterministic)
}
func (m *InspectResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_InspectResponse.Merge(m, src)
}
func (m *InspectResponse) XXX_Size() int {
return xxx_messageInfo_InspectResponse.Size(m)
}
func (m *InspectResponse) XXX_DiscardUnknown() {
xxx_messageInfo_InspectResponse.DiscardUnknown(m)
}
var xxx_messageInfo_InspectResponse proto.InternalMessageInfo
func (m *InspectResponse) GetOptions() *BuildOptions {
if m != nil {
return m.Options
}
return nil
}
type UlimitOpt struct { type UlimitOpt struct {
Values map[string]*Ulimit `protobuf:"bytes,1,rep,name=values,proto3" json:"values,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` Values map[string]*Ulimit `protobuf:"bytes,1,rep,name=values,proto3" json:"values,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
@ -788,7 +864,7 @@ func (m *UlimitOpt) Reset() { *m = UlimitOpt{} }
func (m *UlimitOpt) String() string { return proto.CompactTextString(m) } func (m *UlimitOpt) String() string { return proto.CompactTextString(m) }
func (*UlimitOpt) ProtoMessage() {} func (*UlimitOpt) ProtoMessage() {}
func (*UlimitOpt) Descriptor() ([]byte, []int) { func (*UlimitOpt) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{12} return fileDescriptor_ed7f10298fa1d90f, []int{14}
} }
func (m *UlimitOpt) XXX_Unmarshal(b []byte) error { func (m *UlimitOpt) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_UlimitOpt.Unmarshal(m, b) return xxx_messageInfo_UlimitOpt.Unmarshal(m, b)
@ -828,7 +904,7 @@ func (m *Ulimit) Reset() { *m = Ulimit{} }
func (m *Ulimit) String() string { return proto.CompactTextString(m) } func (m *Ulimit) String() string { return proto.CompactTextString(m) }
func (*Ulimit) ProtoMessage() {} func (*Ulimit) ProtoMessage() {}
func (*Ulimit) Descriptor() ([]byte, []int) { func (*Ulimit) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{13} return fileDescriptor_ed7f10298fa1d90f, []int{15}
} }
func (m *Ulimit) XXX_Unmarshal(b []byte) error { func (m *Ulimit) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Ulimit.Unmarshal(m, b) return xxx_messageInfo_Ulimit.Unmarshal(m, b)
@ -880,7 +956,7 @@ func (m *BuildResponse) Reset() { *m = BuildResponse{} }
func (m *BuildResponse) String() string { return proto.CompactTextString(m) } func (m *BuildResponse) String() string { return proto.CompactTextString(m) }
func (*BuildResponse) ProtoMessage() {} func (*BuildResponse) ProtoMessage() {}
func (*BuildResponse) Descriptor() ([]byte, []int) { func (*BuildResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{14} return fileDescriptor_ed7f10298fa1d90f, []int{16}
} }
func (m *BuildResponse) XXX_Unmarshal(b []byte) error { func (m *BuildResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_BuildResponse.Unmarshal(m, b) return xxx_messageInfo_BuildResponse.Unmarshal(m, b)
@ -918,7 +994,7 @@ func (m *DisconnectRequest) Reset() { *m = DisconnectRequest{} }
func (m *DisconnectRequest) String() string { return proto.CompactTextString(m) } func (m *DisconnectRequest) String() string { return proto.CompactTextString(m) }
func (*DisconnectRequest) ProtoMessage() {} func (*DisconnectRequest) ProtoMessage() {}
func (*DisconnectRequest) Descriptor() ([]byte, []int) { func (*DisconnectRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{15} return fileDescriptor_ed7f10298fa1d90f, []int{17}
} }
func (m *DisconnectRequest) XXX_Unmarshal(b []byte) error { func (m *DisconnectRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DisconnectRequest.Unmarshal(m, b) return xxx_messageInfo_DisconnectRequest.Unmarshal(m, b)
@ -955,7 +1031,7 @@ func (m *DisconnectResponse) Reset() { *m = DisconnectResponse{} }
func (m *DisconnectResponse) String() string { return proto.CompactTextString(m) } func (m *DisconnectResponse) String() string { return proto.CompactTextString(m) }
func (*DisconnectResponse) ProtoMessage() {} func (*DisconnectResponse) ProtoMessage() {}
func (*DisconnectResponse) Descriptor() ([]byte, []int) { func (*DisconnectResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{16} return fileDescriptor_ed7f10298fa1d90f, []int{18}
} }
func (m *DisconnectResponse) XXX_Unmarshal(b []byte) error { func (m *DisconnectResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DisconnectResponse.Unmarshal(m, b) return xxx_messageInfo_DisconnectResponse.Unmarshal(m, b)
@ -986,7 +1062,7 @@ func (m *ListRequest) Reset() { *m = ListRequest{} }
func (m *ListRequest) String() string { return proto.CompactTextString(m) } func (m *ListRequest) String() string { return proto.CompactTextString(m) }
func (*ListRequest) ProtoMessage() {} func (*ListRequest) ProtoMessage() {}
func (*ListRequest) Descriptor() ([]byte, []int) { func (*ListRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{17} return fileDescriptor_ed7f10298fa1d90f, []int{19}
} }
func (m *ListRequest) XXX_Unmarshal(b []byte) error { func (m *ListRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListRequest.Unmarshal(m, b) return xxx_messageInfo_ListRequest.Unmarshal(m, b)
@ -1024,7 +1100,7 @@ func (m *ListResponse) Reset() { *m = ListResponse{} }
func (m *ListResponse) String() string { return proto.CompactTextString(m) } func (m *ListResponse) String() string { return proto.CompactTextString(m) }
func (*ListResponse) ProtoMessage() {} func (*ListResponse) ProtoMessage() {}
func (*ListResponse) Descriptor() ([]byte, []int) { func (*ListResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{18} return fileDescriptor_ed7f10298fa1d90f, []int{20}
} }
func (m *ListResponse) XXX_Unmarshal(b []byte) error { func (m *ListResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListResponse.Unmarshal(m, b) return xxx_messageInfo_ListResponse.Unmarshal(m, b)
@ -1065,7 +1141,7 @@ func (m *InputMessage) Reset() { *m = InputMessage{} }
func (m *InputMessage) String() string { return proto.CompactTextString(m) } func (m *InputMessage) String() string { return proto.CompactTextString(m) }
func (*InputMessage) ProtoMessage() {} func (*InputMessage) ProtoMessage() {}
func (*InputMessage) Descriptor() ([]byte, []int) { func (*InputMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{19} return fileDescriptor_ed7f10298fa1d90f, []int{21}
} }
func (m *InputMessage) XXX_Unmarshal(b []byte) error { func (m *InputMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InputMessage.Unmarshal(m, b) return xxx_messageInfo_InputMessage.Unmarshal(m, b)
@ -1139,7 +1215,7 @@ func (m *InputInitMessage) Reset() { *m = InputInitMessage{} }
func (m *InputInitMessage) String() string { return proto.CompactTextString(m) } func (m *InputInitMessage) String() string { return proto.CompactTextString(m) }
func (*InputInitMessage) ProtoMessage() {} func (*InputInitMessage) ProtoMessage() {}
func (*InputInitMessage) Descriptor() ([]byte, []int) { func (*InputInitMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{20} return fileDescriptor_ed7f10298fa1d90f, []int{22}
} }
func (m *InputInitMessage) XXX_Unmarshal(b []byte) error { func (m *InputInitMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InputInitMessage.Unmarshal(m, b) return xxx_messageInfo_InputInitMessage.Unmarshal(m, b)
@ -1178,7 +1254,7 @@ func (m *DataMessage) Reset() { *m = DataMessage{} }
func (m *DataMessage) String() string { return proto.CompactTextString(m) } func (m *DataMessage) String() string { return proto.CompactTextString(m) }
func (*DataMessage) ProtoMessage() {} func (*DataMessage) ProtoMessage() {}
func (*DataMessage) Descriptor() ([]byte, []int) { func (*DataMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{21} return fileDescriptor_ed7f10298fa1d90f, []int{23}
} }
func (m *DataMessage) XXX_Unmarshal(b []byte) error { func (m *DataMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DataMessage.Unmarshal(m, b) return xxx_messageInfo_DataMessage.Unmarshal(m, b)
@ -1222,7 +1298,7 @@ func (m *InputResponse) Reset() { *m = InputResponse{} }
func (m *InputResponse) String() string { return proto.CompactTextString(m) } func (m *InputResponse) String() string { return proto.CompactTextString(m) }
func (*InputResponse) ProtoMessage() {} func (*InputResponse) ProtoMessage() {}
func (*InputResponse) Descriptor() ([]byte, []int) { func (*InputResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{22} return fileDescriptor_ed7f10298fa1d90f, []int{24}
} }
func (m *InputResponse) XXX_Unmarshal(b []byte) error { func (m *InputResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InputResponse.Unmarshal(m, b) return xxx_messageInfo_InputResponse.Unmarshal(m, b)
@ -1258,7 +1334,7 @@ func (m *Message) Reset() { *m = Message{} }
func (m *Message) String() string { return proto.CompactTextString(m) } func (m *Message) String() string { return proto.CompactTextString(m) }
func (*Message) ProtoMessage() {} func (*Message) ProtoMessage() {}
func (*Message) Descriptor() ([]byte, []int) { func (*Message) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{23} return fileDescriptor_ed7f10298fa1d90f, []int{25}
} }
func (m *Message) XXX_Unmarshal(b []byte) error { func (m *Message) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Message.Unmarshal(m, b) return xxx_messageInfo_Message.Unmarshal(m, b)
@ -1360,7 +1436,7 @@ func (m *InitMessage) Reset() { *m = InitMessage{} }
func (m *InitMessage) String() string { return proto.CompactTextString(m) } func (m *InitMessage) String() string { return proto.CompactTextString(m) }
func (*InitMessage) ProtoMessage() {} func (*InitMessage) ProtoMessage() {}
func (*InitMessage) Descriptor() ([]byte, []int) { func (*InitMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{24} return fileDescriptor_ed7f10298fa1d90f, []int{26}
} }
func (m *InitMessage) XXX_Unmarshal(b []byte) error { func (m *InitMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InitMessage.Unmarshal(m, b) return xxx_messageInfo_InitMessage.Unmarshal(m, b)
@ -1411,6 +1487,7 @@ type InvokeConfig struct {
NoCwd bool `protobuf:"varint,7,opt,name=NoCwd,proto3" json:"NoCwd,omitempty"` NoCwd bool `protobuf:"varint,7,opt,name=NoCwd,proto3" json:"NoCwd,omitempty"`
Tty bool `protobuf:"varint,8,opt,name=Tty,proto3" json:"Tty,omitempty"` Tty bool `protobuf:"varint,8,opt,name=Tty,proto3" json:"Tty,omitempty"`
Rollback bool `protobuf:"varint,9,opt,name=Rollback,proto3" json:"Rollback,omitempty"` Rollback bool `protobuf:"varint,9,opt,name=Rollback,proto3" json:"Rollback,omitempty"`
Initial bool `protobuf:"varint,10,opt,name=Initial,proto3" json:"Initial,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -1420,7 +1497,7 @@ func (m *InvokeConfig) Reset() { *m = InvokeConfig{} }
func (m *InvokeConfig) String() string { return proto.CompactTextString(m) } func (m *InvokeConfig) String() string { return proto.CompactTextString(m) }
func (*InvokeConfig) ProtoMessage() {} func (*InvokeConfig) ProtoMessage() {}
func (*InvokeConfig) Descriptor() ([]byte, []int) { func (*InvokeConfig) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{25} return fileDescriptor_ed7f10298fa1d90f, []int{27}
} }
func (m *InvokeConfig) XXX_Unmarshal(b []byte) error { func (m *InvokeConfig) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InvokeConfig.Unmarshal(m, b) return xxx_messageInfo_InvokeConfig.Unmarshal(m, b)
@ -1503,6 +1580,13 @@ func (m *InvokeConfig) GetRollback() bool {
return false return false
} }
func (m *InvokeConfig) GetInitial() bool {
if m != nil {
return m.Initial
}
return false
}
type FdMessage struct { type FdMessage struct {
Fd uint32 `protobuf:"varint,1,opt,name=Fd,proto3" json:"Fd,omitempty"` Fd uint32 `protobuf:"varint,1,opt,name=Fd,proto3" json:"Fd,omitempty"`
EOF bool `protobuf:"varint,2,opt,name=EOF,proto3" json:"EOF,omitempty"` EOF bool `protobuf:"varint,2,opt,name=EOF,proto3" json:"EOF,omitempty"`
@ -1516,7 +1600,7 @@ func (m *FdMessage) Reset() { *m = FdMessage{} }
func (m *FdMessage) String() string { return proto.CompactTextString(m) } func (m *FdMessage) String() string { return proto.CompactTextString(m) }
func (*FdMessage) ProtoMessage() {} func (*FdMessage) ProtoMessage() {}
func (*FdMessage) Descriptor() ([]byte, []int) { func (*FdMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{26} return fileDescriptor_ed7f10298fa1d90f, []int{28}
} }
func (m *FdMessage) XXX_Unmarshal(b []byte) error { func (m *FdMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_FdMessage.Unmarshal(m, b) return xxx_messageInfo_FdMessage.Unmarshal(m, b)
@ -1569,7 +1653,7 @@ func (m *ResizeMessage) Reset() { *m = ResizeMessage{} }
func (m *ResizeMessage) String() string { return proto.CompactTextString(m) } func (m *ResizeMessage) String() string { return proto.CompactTextString(m) }
func (*ResizeMessage) ProtoMessage() {} func (*ResizeMessage) ProtoMessage() {}
func (*ResizeMessage) Descriptor() ([]byte, []int) { func (*ResizeMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{27} return fileDescriptor_ed7f10298fa1d90f, []int{29}
} }
func (m *ResizeMessage) XXX_Unmarshal(b []byte) error { func (m *ResizeMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ResizeMessage.Unmarshal(m, b) return xxx_messageInfo_ResizeMessage.Unmarshal(m, b)
@ -1616,7 +1700,7 @@ func (m *SignalMessage) Reset() { *m = SignalMessage{} }
func (m *SignalMessage) String() string { return proto.CompactTextString(m) } func (m *SignalMessage) String() string { return proto.CompactTextString(m) }
func (*SignalMessage) ProtoMessage() {} func (*SignalMessage) ProtoMessage() {}
func (*SignalMessage) Descriptor() ([]byte, []int) { func (*SignalMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{28} return fileDescriptor_ed7f10298fa1d90f, []int{30}
} }
func (m *SignalMessage) XXX_Unmarshal(b []byte) error { func (m *SignalMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SignalMessage.Unmarshal(m, b) return xxx_messageInfo_SignalMessage.Unmarshal(m, b)
@ -1654,7 +1738,7 @@ func (m *StatusRequest) Reset() { *m = StatusRequest{} }
func (m *StatusRequest) String() string { return proto.CompactTextString(m) } func (m *StatusRequest) String() string { return proto.CompactTextString(m) }
func (*StatusRequest) ProtoMessage() {} func (*StatusRequest) ProtoMessage() {}
func (*StatusRequest) Descriptor() ([]byte, []int) { func (*StatusRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{29} return fileDescriptor_ed7f10298fa1d90f, []int{31}
} }
func (m *StatusRequest) XXX_Unmarshal(b []byte) error { func (m *StatusRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StatusRequest.Unmarshal(m, b) return xxx_messageInfo_StatusRequest.Unmarshal(m, b)
@ -1695,7 +1779,7 @@ func (m *StatusResponse) Reset() { *m = StatusResponse{} }
func (m *StatusResponse) String() string { return proto.CompactTextString(m) } func (m *StatusResponse) String() string { return proto.CompactTextString(m) }
func (*StatusResponse) ProtoMessage() {} func (*StatusResponse) ProtoMessage() {}
func (*StatusResponse) Descriptor() ([]byte, []int) { func (*StatusResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{30} return fileDescriptor_ed7f10298fa1d90f, []int{32}
} }
func (m *StatusResponse) XXX_Unmarshal(b []byte) error { func (m *StatusResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StatusResponse.Unmarshal(m, b) return xxx_messageInfo_StatusResponse.Unmarshal(m, b)
@ -1753,7 +1837,7 @@ func (m *InfoRequest) Reset() { *m = InfoRequest{} }
func (m *InfoRequest) String() string { return proto.CompactTextString(m) } func (m *InfoRequest) String() string { return proto.CompactTextString(m) }
func (*InfoRequest) ProtoMessage() {} func (*InfoRequest) ProtoMessage() {}
func (*InfoRequest) Descriptor() ([]byte, []int) { func (*InfoRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{31} return fileDescriptor_ed7f10298fa1d90f, []int{33}
} }
func (m *InfoRequest) XXX_Unmarshal(b []byte) error { func (m *InfoRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InfoRequest.Unmarshal(m, b) return xxx_messageInfo_InfoRequest.Unmarshal(m, b)
@ -1784,7 +1868,7 @@ func (m *InfoResponse) Reset() { *m = InfoResponse{} }
func (m *InfoResponse) String() string { return proto.CompactTextString(m) } func (m *InfoResponse) String() string { return proto.CompactTextString(m) }
func (*InfoResponse) ProtoMessage() {} func (*InfoResponse) ProtoMessage() {}
func (*InfoResponse) Descriptor() ([]byte, []int) { func (*InfoResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{32} return fileDescriptor_ed7f10298fa1d90f, []int{34}
} }
func (m *InfoResponse) XXX_Unmarshal(b []byte) error { func (m *InfoResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InfoResponse.Unmarshal(m, b) return xxx_messageInfo_InfoResponse.Unmarshal(m, b)
@ -1824,7 +1908,7 @@ func (m *BuildxVersion) Reset() { *m = BuildxVersion{} }
func (m *BuildxVersion) String() string { return proto.CompactTextString(m) } func (m *BuildxVersion) String() string { return proto.CompactTextString(m) }
func (*BuildxVersion) ProtoMessage() {} func (*BuildxVersion) ProtoMessage() {}
func (*BuildxVersion) Descriptor() ([]byte, []int) { func (*BuildxVersion) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{33} return fileDescriptor_ed7f10298fa1d90f, []int{35}
} }
func (m *BuildxVersion) XXX_Unmarshal(b []byte) error { func (m *BuildxVersion) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_BuildxVersion.Unmarshal(m, b) return xxx_messageInfo_BuildxVersion.Unmarshal(m, b)
@ -1883,6 +1967,8 @@ func init() {
proto.RegisterType((*Attest)(nil), "buildx.controller.v1.Attest") proto.RegisterType((*Attest)(nil), "buildx.controller.v1.Attest")
proto.RegisterType((*SSH)(nil), "buildx.controller.v1.SSH") proto.RegisterType((*SSH)(nil), "buildx.controller.v1.SSH")
proto.RegisterType((*Secret)(nil), "buildx.controller.v1.Secret") proto.RegisterType((*Secret)(nil), "buildx.controller.v1.Secret")
proto.RegisterType((*InspectRequest)(nil), "buildx.controller.v1.InspectRequest")
proto.RegisterType((*InspectResponse)(nil), "buildx.controller.v1.InspectResponse")
proto.RegisterType((*UlimitOpt)(nil), "buildx.controller.v1.UlimitOpt") proto.RegisterType((*UlimitOpt)(nil), "buildx.controller.v1.UlimitOpt")
proto.RegisterMapType((map[string]*Ulimit)(nil), "buildx.controller.v1.UlimitOpt.ValuesEntry") proto.RegisterMapType((map[string]*Ulimit)(nil), "buildx.controller.v1.UlimitOpt.ValuesEntry")
proto.RegisterType((*Ulimit)(nil), "buildx.controller.v1.Ulimit") proto.RegisterType((*Ulimit)(nil), "buildx.controller.v1.Ulimit")
@ -1912,119 +1998,122 @@ func init() {
func init() { proto.RegisterFile("controller.proto", fileDescriptor_ed7f10298fa1d90f) } func init() { proto.RegisterFile("controller.proto", fileDescriptor_ed7f10298fa1d90f) }
var fileDescriptor_ed7f10298fa1d90f = []byte{ var fileDescriptor_ed7f10298fa1d90f = []byte{
// 1779 bytes of a gzipped FileDescriptorProto // 1832 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x58, 0x5f, 0x73, 0x1b, 0x49, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x58, 0x5f, 0x6f, 0xdb, 0xc8,
0x11, 0x67, 0x25, 0x59, 0x7f, 0x5a, 0x96, 0xcf, 0x19, 0x9c, 0x63, 0xa2, 0x84, 0x8b, 0xb3, 0x09, 0x11, 0x2f, 0x25, 0x59, 0x7f, 0x46, 0x96, 0xe3, 0x6c, 0x9d, 0xeb, 0x86, 0x49, 0x2f, 0x0e, 0x93,
0x87, 0x8a, 0x50, 0xf2, 0x9d, 0x8f, 0x23, 0x97, 0x4b, 0xa8, 0xc2, 0x96, 0xad, 0xb2, 0xaf, 0xe2, 0xbb, 0x0a, 0x4d, 0x21, 0xdf, 0xf9, 0x7a, 0xcd, 0xe5, 0x72, 0x05, 0x6a, 0xcb, 0x16, 0xec, 0x43,
0x3f, 0x35, 0x72, 0x72, 0x05, 0x54, 0x91, 0x5a, 0x49, 0x63, 0x79, 0x4b, 0xab, 0x1d, 0xb1, 0x33, 0xfc, 0x07, 0x94, 0x93, 0x43, 0x5b, 0xa0, 0x07, 0x4a, 0x5a, 0xcb, 0x84, 0x28, 0xae, 0xca, 0x5d,
0xb2, 0x2d, 0x9e, 0x78, 0xe1, 0x95, 0xef, 0x41, 0xf1, 0xca, 0x1b, 0x4f, 0x7c, 0x07, 0x3e, 0x08, 0xd9, 0x56, 0x9f, 0xfa, 0xd2, 0xb7, 0xa2, 0xdf, 0xa3, 0xe8, 0x47, 0xe8, 0x53, 0xbf, 0x50, 0xd1,
0x8f, 0x3c, 0x52, 0xd3, 0x33, 0x2b, 0xad, 0x2c, 0xad, 0x6c, 0xc3, 0x93, 0xa6, 0x7b, 0x7f, 0xbf, 0xc7, 0x3e, 0x16, 0x3b, 0xbb, 0xa4, 0x28, 0x4b, 0x94, 0xed, 0xde, 0x93, 0x76, 0x86, 0xbf, 0xdf,
0x9e, 0xe9, 0xde, 0x9e, 0xee, 0x5e, 0xc1, 0x7a, 0x47, 0x84, 0x2a, 0x12, 0x41, 0xc0, 0xa3, 0xfa, 0xec, 0xce, 0x70, 0x76, 0x66, 0x44, 0x58, 0xef, 0xf2, 0x50, 0x46, 0x3c, 0x08, 0x58, 0xd4, 0x18,
0x30, 0x12, 0x4a, 0x90, 0x8d, 0xf6, 0xc8, 0x0f, 0xba, 0xd7, 0xf5, 0xc4, 0x83, 0xcb, 0x2f, 0xab, 0x45, 0x5c, 0x72, 0xb2, 0xd1, 0x19, 0xfb, 0x41, 0xef, 0xba, 0x91, 0x7a, 0x70, 0xf9, 0xb9, 0xfd,
0x6f, 0x7a, 0xbe, 0xba, 0x18, 0xb5, 0xeb, 0x1d, 0x31, 0xd8, 0x1a, 0x88, 0xf6, 0x78, 0x0b, 0x51, 0xb6, 0xef, 0xcb, 0x8b, 0x71, 0xa7, 0xd1, 0xe5, 0xc3, 0xad, 0x21, 0xef, 0x4c, 0xb6, 0x10, 0x35,
0x7d, 0x5f, 0x6d, 0x79, 0x43, 0x7f, 0x4b, 0xf2, 0xe8, 0xd2, 0xef, 0x70, 0xb9, 0x65, 0x49, 0xf1, 0xf0, 0xe5, 0x96, 0x37, 0xf2, 0xb7, 0x04, 0x8b, 0x2e, 0xfd, 0x2e, 0x13, 0x5b, 0x86, 0x14, 0xff,
0xaf, 0x31, 0xe9, 0xd6, 0x60, 0xe3, 0x9d, 0x2f, 0xd5, 0x69, 0x24, 0x3a, 0x5c, 0x4a, 0x2e, 0x19, 0x6a, 0x93, 0x4e, 0x1d, 0x36, 0xde, 0xf9, 0x42, 0x9e, 0x46, 0xbc, 0xcb, 0x84, 0x60, 0xc2, 0x65,
0xff, 0xc3, 0x88, 0x4b, 0x45, 0xd6, 0x21, 0xcb, 0xf8, 0x39, 0x75, 0x36, 0x9d, 0x5a, 0x89, 0xe9, 0x7f, 0x1c, 0x33, 0x21, 0xc9, 0x3a, 0xe4, 0x5d, 0x76, 0x4e, 0xad, 0x4d, 0xab, 0x5e, 0x71, 0xd5,
0xa5, 0x7b, 0x0a, 0x0f, 0x6f, 0x20, 0xe5, 0x50, 0x84, 0x92, 0x93, 0x57, 0xb0, 0x72, 0x18, 0x9e, 0xd2, 0x39, 0x85, 0x47, 0x37, 0x90, 0x62, 0xc4, 0x43, 0xc1, 0xc8, 0x6b, 0x58, 0x39, 0x0c, 0xcf,
0x0b, 0x49, 0x9d, 0xcd, 0x6c, 0xad, 0xbc, 0xfd, 0xac, 0xbe, 0xe8, 0x94, 0x75, 0xcb, 0xd3, 0x48, 0xb9, 0xa0, 0xd6, 0x66, 0xbe, 0x5e, 0xdd, 0x7e, 0xde, 0x58, 0x74, 0xca, 0x86, 0xe1, 0x29, 0xa4,
0x66, 0xf0, 0xae, 0x84, 0x72, 0x42, 0x4b, 0x9e, 0x40, 0x29, 0x16, 0xf7, 0xec, 0xc6, 0x53, 0x05, 0xab, 0xf1, 0x8e, 0x80, 0x6a, 0x4a, 0x4b, 0x9e, 0x42, 0x25, 0x16, 0xf7, 0xcc, 0xc6, 0x53, 0x05,
0x69, 0xc2, 0xea, 0x61, 0x78, 0x29, 0xfa, 0xbc, 0x21, 0xc2, 0x73, 0xbf, 0x47, 0x33, 0x9b, 0x4e, 0x69, 0xc1, 0xea, 0x61, 0x78, 0xc9, 0x07, 0xac, 0xc9, 0xc3, 0x73, 0xbf, 0x4f, 0x73, 0x9b, 0x56,
0xad, 0xbc, 0xed, 0x2e, 0xde, 0x2c, 0x89, 0x64, 0x33, 0x3c, 0xf7, 0x3b, 0xa0, 0x7b, 0xbe, 0xec, 0xbd, 0xba, 0xed, 0x2c, 0xde, 0x2c, 0x8d, 0x74, 0x67, 0x78, 0xce, 0xb7, 0x40, 0xf7, 0x7c, 0xd1,
0x88, 0x30, 0xe4, 0x9d, 0xd8, 0x99, 0x54, 0xa7, 0x67, 0xcf, 0x94, 0xb9, 0x71, 0x26, 0xf7, 0x31, 0xe5, 0x61, 0xc8, 0xba, 0xb1, 0x33, 0x99, 0x4e, 0xcf, 0x9e, 0x29, 0x77, 0xe3, 0x4c, 0xce, 0x13,
0x3c, 0x5a, 0x60, 0xcb, 0x84, 0xc5, 0xfd, 0x3d, 0xac, 0xee, 0xea, 0xb3, 0xa5, 0x1b, 0x7f, 0x0b, 0x78, 0xbc, 0xc0, 0x96, 0x0e, 0x8b, 0xf3, 0x07, 0x58, 0xdd, 0x55, 0x67, 0xcb, 0x36, 0xfe, 0x0d,
0x85, 0x93, 0xa1, 0xf2, 0x45, 0x28, 0x97, 0x7b, 0x83, 0x66, 0x2c, 0x92, 0xc5, 0x14, 0xf7, 0x3f, 0x94, 0x4e, 0x46, 0xd2, 0xe7, 0xa1, 0x58, 0xee, 0x0d, 0x9a, 0x31, 0x48, 0x37, 0xa6, 0x38, 0xff,
0x60, 0x37, 0xb0, 0x0a, 0xb2, 0x09, 0xe5, 0x86, 0x08, 0x15, 0xbf, 0x56, 0xa7, 0x9e, 0xba, 0xb0, 0x05, 0xb3, 0x81, 0x51, 0x90, 0x4d, 0xa8, 0x36, 0x79, 0x28, 0xd9, 0xb5, 0x3c, 0xf5, 0xe4, 0x85,
0x1b, 0x25, 0x55, 0xe4, 0x73, 0x58, 0xdb, 0x13, 0x9d, 0x3e, 0x8f, 0xce, 0xfd, 0x80, 0x1f, 0x7b, 0xd9, 0x28, 0xad, 0x22, 0x9f, 0xc2, 0xda, 0x1e, 0xef, 0x0e, 0x58, 0x74, 0xee, 0x07, 0xec, 0xd8,
0x03, 0x6e, 0x5d, 0xba, 0xa1, 0x35, 0x5e, 0xfb, 0xa1, 0x6a, 0x8e, 0xc2, 0x0e, 0xcd, 0xc6, 0x5e, 0x1b, 0x32, 0xe3, 0xd2, 0x0d, 0xad, 0xf6, 0xda, 0x0f, 0x65, 0x6b, 0x1c, 0x76, 0x69, 0x3e, 0xf6,
0x5b, 0x05, 0xf9, 0x1d, 0x54, 0x34, 0xaa, 0x6b, 0x2d, 0x4b, 0x9a, 0xc3, 0xf7, 0xfe, 0xf5, 0xed, 0xda, 0x28, 0xc8, 0xef, 0xa1, 0xa6, 0x50, 0x3d, 0x63, 0x59, 0xd0, 0x02, 0xbe, 0xf7, 0x2f, 0x6f,
0x87, 0xaf, 0xcf, 0xf0, 0xf6, 0x43, 0x15, 0x8d, 0xd9, 0xac, 0x2d, 0xb2, 0x01, 0x2b, 0x3b, 0x41, 0x3f, 0x7c, 0x63, 0x86, 0xb7, 0x1f, 0xca, 0x68, 0xe2, 0xce, 0xda, 0x22, 0x1b, 0xb0, 0xb2, 0x13,
0x20, 0xae, 0xe8, 0xca, 0x66, 0xb6, 0x56, 0x62, 0x46, 0x20, 0xbf, 0x84, 0xc2, 0x8e, 0x52, 0x5c, 0x04, 0xfc, 0x8a, 0xae, 0x6c, 0xe6, 0xeb, 0x15, 0x57, 0x0b, 0xe4, 0x57, 0x50, 0xda, 0x91, 0x92,
0x2a, 0x49, 0xf3, 0xb8, 0xd9, 0x93, 0xc5, 0x9b, 0x19, 0x10, 0x8b, 0xc1, 0xe4, 0x04, 0x4a, 0xb8, 0x09, 0x29, 0x68, 0x11, 0x37, 0x7b, 0xba, 0x78, 0x33, 0x0d, 0x72, 0x63, 0x30, 0x39, 0x81, 0x0a,
0xff, 0x4e, 0xd4, 0x93, 0xb4, 0x80, 0xcc, 0x2f, 0xef, 0x70, 0xcc, 0x09, 0xc7, 0x1c, 0x71, 0x6a, 0xee, 0xbf, 0x13, 0xf5, 0x05, 0x2d, 0x21, 0xf3, 0xf3, 0x3b, 0x1c, 0x33, 0xe1, 0xe8, 0x23, 0x4e,
0x83, 0xec, 0x43, 0xa9, 0xe1, 0x75, 0x2e, 0x78, 0x33, 0x12, 0x03, 0x5a, 0x44, 0x83, 0x3f, 0x5d, 0x6d, 0x90, 0x7d, 0xa8, 0x34, 0xbd, 0xee, 0x05, 0x6b, 0x45, 0x7c, 0x48, 0xcb, 0x68, 0xf0, 0x67,
0x6c, 0x10, 0x61, 0xd6, 0xa0, 0x35, 0x33, 0x61, 0x92, 0x1d, 0x28, 0xa0, 0x70, 0x26, 0x68, 0xe9, 0x8b, 0x0d, 0x22, 0xcc, 0x18, 0x34, 0x66, 0x12, 0x26, 0xd9, 0x81, 0x12, 0x0a, 0x67, 0x9c, 0x56,
0x7e, 0x46, 0x62, 0x1e, 0x71, 0x61, 0xb5, 0xd1, 0x8b, 0xc4, 0x68, 0x78, 0xea, 0x45, 0x3c, 0x54, 0xee, 0x67, 0x24, 0xe6, 0x11, 0x07, 0x56, 0x9b, 0xfd, 0x88, 0x8f, 0x47, 0xa7, 0x5e, 0xc4, 0x42,
0x14, 0xf0, 0x35, 0xcd, 0xe8, 0xc8, 0x1b, 0x28, 0xec, 0x5f, 0x0f, 0x45, 0xa4, 0x24, 0x2d, 0x2f, 0x49, 0x01, 0x5f, 0xd3, 0x8c, 0x8e, 0xbc, 0x85, 0xd2, 0xfe, 0xf5, 0x88, 0x47, 0x52, 0xd0, 0xea,
0xbb, 0x9b, 0x06, 0x64, 0x37, 0xb0, 0x0c, 0xf2, 0x19, 0xc0, 0xfe, 0xb5, 0x8a, 0xbc, 0x03, 0xa1, 0xb2, 0xbb, 0xa9, 0x41, 0x66, 0x03, 0xc3, 0x20, 0x1f, 0x03, 0xec, 0x5f, 0xcb, 0xc8, 0x3b, 0xe0,
0xc3, 0xbe, 0x8a, 0xaf, 0x23, 0xa1, 0x21, 0x4d, 0xc8, 0xbf, 0xf3, 0xda, 0x3c, 0x90, 0xb4, 0x82, 0x2a, 0xec, 0xab, 0xf8, 0x3a, 0x52, 0x1a, 0xd2, 0x82, 0xe2, 0x3b, 0xaf, 0xc3, 0x02, 0x41, 0x6b,
0xb6, 0xeb, 0x77, 0x08, 0xac, 0x21, 0x98, 0x8d, 0x2c, 0x5b, 0xa7, 0xed, 0x31, 0x57, 0x57, 0x22, 0x68, 0xbb, 0x71, 0x87, 0xc0, 0x6a, 0x82, 0xde, 0xc8, 0xb0, 0x55, 0xda, 0x1e, 0x33, 0x79, 0xc5,
0xea, 0x1f, 0x89, 0x2e, 0xa7, 0x6b, 0x26, 0x6d, 0x13, 0x2a, 0xf2, 0x02, 0x2a, 0xc7, 0xc2, 0x04, 0xa3, 0xc1, 0x11, 0xef, 0x31, 0xba, 0xa6, 0xd3, 0x36, 0xa5, 0x22, 0x2f, 0xa1, 0x76, 0xcc, 0x75,
0xcf, 0x0f, 0x14, 0x8f, 0xe8, 0x27, 0x78, 0x98, 0x59, 0x25, 0x26, 0x6d, 0xe0, 0xa9, 0x73, 0x11, 0xf0, 0xfc, 0x40, 0xb2, 0x88, 0x3e, 0xc0, 0xc3, 0xcc, 0x2a, 0x31, 0x69, 0x03, 0x4f, 0x9e, 0xf3,
0x0d, 0x24, 0x5d, 0x47, 0xc4, 0x54, 0xa1, 0x33, 0xa8, 0xc5, 0x3b, 0x11, 0x57, 0x92, 0x3e, 0x58, 0x68, 0x28, 0xe8, 0x3a, 0x22, 0xa6, 0x0a, 0x95, 0x41, 0x6d, 0xd6, 0x8d, 0x98, 0x14, 0xf4, 0xe1,
0x96, 0x41, 0x06, 0xc4, 0x62, 0x30, 0xa1, 0x50, 0x68, 0x5d, 0x0c, 0x5a, 0xfe, 0x1f, 0x39, 0x25, 0xb2, 0x0c, 0xd2, 0x20, 0x37, 0x06, 0x13, 0x0a, 0xa5, 0xf6, 0xc5, 0xb0, 0xed, 0xff, 0x89, 0x51,
0x9b, 0x4e, 0x2d, 0xcb, 0x62, 0x91, 0xbc, 0x84, 0x6c, 0xab, 0x75, 0x40, 0x7f, 0x88, 0xd6, 0x1e, 0xb2, 0x69, 0xd5, 0xf3, 0x6e, 0x2c, 0x92, 0x57, 0x90, 0x6f, 0xb7, 0x0f, 0xe8, 0x8f, 0xd1, 0xda,
0xa5, 0x58, 0x6b, 0x1d, 0x30, 0x8d, 0x22, 0x04, 0x72, 0x67, 0x5e, 0x4f, 0xd2, 0x0d, 0x3c, 0x17, 0xe3, 0x0c, 0x6b, 0xed, 0x03, 0x57, 0xa1, 0x08, 0x81, 0xc2, 0x99, 0xd7, 0x17, 0x74, 0x03, 0xcf,
0xae, 0xc9, 0xa7, 0x90, 0x3f, 0xf3, 0xa2, 0x1e, 0x57, 0xf4, 0x21, 0xfa, 0x6c, 0x25, 0xf2, 0x1a, 0x85, 0x6b, 0xf2, 0x11, 0x14, 0xcf, 0xbc, 0xa8, 0xcf, 0x24, 0x7d, 0x84, 0x3e, 0x1b, 0x89, 0xbc,
0x0a, 0xef, 0x03, 0x7f, 0xe0, 0x2b, 0x49, 0x3f, 0xc5, 0xb2, 0xf0, 0x74, 0xb1, 0x71, 0x03, 0x3a, 0x81, 0xd2, 0xfb, 0xc0, 0x1f, 0xfa, 0x52, 0xd0, 0x8f, 0xb0, 0x2c, 0x3c, 0x5b, 0x6c, 0x5c, 0x83,
0x19, 0x2a, 0x16, 0xe3, 0xf5, 0x69, 0x31, 0xde, 0x3c, 0xa2, 0x3f, 0x42, 0x9b, 0xb1, 0xa8, 0xd3, 0x4e, 0x46, 0xd2, 0x8d, 0xf1, 0xea, 0xb4, 0x18, 0x6f, 0x16, 0xd1, 0x9f, 0xa0, 0xcd, 0x58, 0x54,
0xe5, 0x88, 0x2b, 0xaf, 0xeb, 0x29, 0xaf, 0xe9, 0x07, 0x9c, 0x52, 0x93, 0x2e, 0x49, 0x9d, 0x66, 0xe9, 0x72, 0xc4, 0xa4, 0xd7, 0xf3, 0xa4, 0xd7, 0xf2, 0x03, 0x46, 0xa9, 0x4e, 0x97, 0xb4, 0x4e,
0xdb, 0x90, 0xd2, 0x47, 0x9b, 0x4e, 0xad, 0xc8, 0x62, 0x51, 0x1f, 0xff, 0x74, 0x14, 0x04, 0xb4, 0xb1, 0x4d, 0x48, 0xe9, 0xe3, 0x4d, 0xab, 0x5e, 0x76, 0x63, 0x51, 0x1d, 0xff, 0x74, 0x1c, 0x04,
0x8a, 0x6a, 0x5c, 0x9b, 0xfc, 0xd0, 0xa9, 0x72, 0x3a, 0x92, 0x17, 0xf4, 0x31, 0x3e, 0x49, 0x68, 0xd4, 0x46, 0x35, 0xae, 0x75, 0x7e, 0xa8, 0x54, 0x39, 0x1d, 0x8b, 0x0b, 0xfa, 0x04, 0x9f, 0xa4,
0xa6, 0xcf, 0xdf, 0x09, 0xaf, 0x4b, 0x9f, 0x24, 0x9f, 0x6b, 0x4d, 0xf5, 0xd7, 0x40, 0xe6, 0xcb, 0x34, 0xd3, 0xe7, 0xef, 0xb8, 0xd7, 0xa3, 0x4f, 0xd3, 0xcf, 0x95, 0xc6, 0xfe, 0x0d, 0x90, 0xf9,
0x81, 0xae, 0x92, 0x7d, 0x3e, 0x8e, 0xab, 0x64, 0x9f, 0x8f, 0x75, 0x45, 0xb8, 0xf4, 0x82, 0x51, 0x72, 0xa0, 0xaa, 0xe4, 0x80, 0x4d, 0xe2, 0x2a, 0x39, 0x60, 0x13, 0x55, 0x11, 0x2e, 0xbd, 0x60,
0x5c, 0xab, 0x8c, 0xf0, 0x6d, 0xe6, 0x1b, 0xa7, 0xfa, 0x16, 0xd6, 0x66, 0x6f, 0xea, 0xbd, 0xd8, 0x1c, 0xd7, 0x2a, 0x2d, 0x7c, 0x9d, 0xfb, 0xca, 0xb2, 0xbf, 0x81, 0xb5, 0xd9, 0x9b, 0x7a, 0x2f,
0xaf, 0xa1, 0x9c, 0x48, 0xc7, 0xfb, 0x50, 0xdd, 0x7f, 0x3a, 0x50, 0x4e, 0xdc, 0x19, 0x7c, 0xbb, 0xf6, 0x1b, 0xa8, 0xa6, 0xd2, 0xf1, 0x3e, 0x54, 0xe7, 0x5f, 0x16, 0x54, 0x53, 0x77, 0x06, 0xdf,
0xe3, 0x21, 0xb7, 0x64, 0x5c, 0x93, 0x5d, 0x58, 0xd9, 0x51, 0x2a, 0xd2, 0xa5, 0x5d, 0x27, 0xc8, 0xee, 0x64, 0xc4, 0x0c, 0x19, 0xd7, 0x64, 0x17, 0x56, 0x76, 0xa4, 0x8c, 0x54, 0x69, 0x57, 0x09,
0xcf, 0x6f, 0xbd, 0x79, 0x75, 0x84, 0x9b, 0xbb, 0x61, 0xa8, 0xfa, 0x6a, 0xec, 0x71, 0xa9, 0xfc, 0xf2, 0x8b, 0x5b, 0x6f, 0x5e, 0x03, 0xe1, 0xfa, 0x6e, 0x68, 0xaa, 0xba, 0x1a, 0x7b, 0x4c, 0x48,
0xd0, 0xd3, 0xd7, 0xc7, 0x56, 0xe2, 0xa4, 0xaa, 0xfa, 0x0d, 0xc0, 0x94, 0x76, 0x2f, 0x1f, 0xfe, 0x3f, 0xf4, 0xd4, 0xf5, 0x31, 0x95, 0x38, 0xad, 0xb2, 0xbf, 0x02, 0x98, 0xd2, 0xee, 0xe5, 0xc3,
0xe6, 0xc0, 0x83, 0xb9, 0xf2, 0xb2, 0xd0, 0x93, 0x83, 0x59, 0x4f, 0xb6, 0xef, 0x58, 0xaa, 0xe6, 0x3f, 0x2c, 0x78, 0x38, 0x57, 0x5e, 0x16, 0x7a, 0x72, 0x30, 0xeb, 0xc9, 0xf6, 0x1d, 0x4b, 0xd5,
0xfd, 0xf9, 0x3f, 0x4e, 0x7b, 0x0c, 0x79, 0x53, 0xd3, 0x17, 0x9e, 0xb0, 0x0a, 0xc5, 0x3d, 0x5f, 0xbc, 0x3f, 0x3f, 0xe0, 0xb4, 0xc7, 0x50, 0xd4, 0x35, 0x7d, 0xe1, 0x09, 0x6d, 0x28, 0xef, 0xf9,
0x7a, 0xed, 0x80, 0x77, 0x91, 0x5a, 0x64, 0x13, 0x19, 0x1b, 0x0a, 0x9e, 0xde, 0x44, 0xcf, 0x08, 0xc2, 0xeb, 0x04, 0xac, 0x87, 0xd4, 0xb2, 0x9b, 0xc8, 0xd8, 0x50, 0xf0, 0xf4, 0x3a, 0x7a, 0x5a,
0xae, 0xb9, 0xbc, 0x64, 0x0d, 0x32, 0x93, 0x59, 0x23, 0x73, 0xb8, 0xa7, 0xc1, 0xba, 0x51, 0x1a, 0x70, 0xf4, 0xe5, 0x25, 0x6b, 0x90, 0x4b, 0x66, 0x8d, 0xdc, 0xe1, 0x9e, 0x02, 0xab, 0x46, 0xa9,
0x57, 0x4b, 0xcc, 0x08, 0x6e, 0x13, 0xf2, 0xa6, 0x1c, 0xcc, 0xe1, 0xab, 0x50, 0xd4, 0x37, 0x07, 0x5d, 0xad, 0xb8, 0x5a, 0x70, 0x5a, 0x50, 0xd4, 0xe5, 0x60, 0x0e, 0x6f, 0x43, 0x59, 0xdd, 0x1c,
0xfb, 0xad, 0x39, 0xf3, 0x44, 0xd6, 0xee, 0xed, 0x87, 0x97, 0x76, 0x5b, 0xbd, 0x74, 0xff, 0xea, 0xec, 0xb7, 0xfa, 0xcc, 0x89, 0xac, 0xdc, 0xdb, 0x0f, 0x2f, 0xcd, 0xb6, 0x6a, 0xe9, 0x38, 0xb0,
0x40, 0x69, 0x72, 0x69, 0x49, 0x03, 0xf2, 0xe8, 0x5f, 0x3c, 0x37, 0xbd, 0xbc, 0xe5, 0x96, 0xd7, 0x76, 0x18, 0x8a, 0x11, 0xeb, 0xca, 0xec, 0x29, 0xeb, 0x04, 0x1e, 0x24, 0x18, 0x33, 0x5f, 0xa5,
0x3f, 0x20, 0xda, 0x16, 0x4f, 0x43, 0xad, 0x7e, 0x0f, 0xe5, 0x84, 0x7a, 0x41, 0x48, 0xb7, 0x93, 0xc6, 0x04, 0xeb, 0xfe, 0x63, 0xc2, 0xdf, 0x2d, 0xa8, 0x24, 0x95, 0x82, 0x34, 0xa1, 0x88, 0x41,
0x21, 0x4d, 0xad, 0x7a, 0x66, 0x93, 0x64, 0xc0, 0xf7, 0x20, 0x6f, 0x94, 0x3a, 0xe0, 0x38, 0x2a, 0x8d, 0x87, 0xb5, 0x57, 0xb7, 0x94, 0x96, 0xc6, 0x07, 0x44, 0x9b, 0x8a, 0xad, 0xa9, 0xf6, 0x77,
0xd8, 0x80, 0xe3, 0x80, 0x40, 0x20, 0x77, 0xe0, 0x45, 0x26, 0xd8, 0x59, 0x86, 0x6b, 0xad, 0x6b, 0x50, 0x4d, 0xa9, 0x17, 0xbc, 0xc7, 0xed, 0xf4, 0x7b, 0xcc, 0x2c, 0xb5, 0x7a, 0x93, 0xf4, 0x5b,
0x89, 0x73, 0x85, 0x0e, 0x67, 0x19, 0xae, 0xdd, 0x7f, 0x38, 0x50, 0xb1, 0x43, 0x90, 0x1d, 0x16, 0xde, 0x83, 0xa2, 0x56, 0xaa, 0xb7, 0x8c, 0xf3, 0x89, 0x79, 0xcb, 0x38, 0x95, 0x10, 0x28, 0x1c,
0x39, 0xac, 0x9b, 0x9c, 0xe7, 0x51, 0xac, 0xb3, 0xfe, 0xbf, 0x5e, 0xd2, 0x3f, 0x62, 0x68, 0xfd, 0x78, 0x91, 0x7e, 0xc3, 0x79, 0x17, 0xd7, 0x4a, 0xd7, 0xe6, 0xe7, 0x12, 0xa3, 0x9c, 0x77, 0x71,
0x26, 0xd7, 0x44, 0x63, 0xce, 0x64, 0xb5, 0x01, 0x0f, 0x17, 0x42, 0xef, 0x95, 0x74, 0x3f, 0x81, 0xed, 0xfc, 0xd3, 0x82, 0x9a, 0x99, 0xbc, 0x4c, 0x04, 0x19, 0xac, 0xeb, 0x8b, 0xc6, 0xa2, 0x58,
0x07, 0xd3, 0xf1, 0x2e, 0x7d, 0x30, 0xde, 0x00, 0x92, 0x84, 0xd9, 0xf1, 0xef, 0x29, 0x94, 0xf5, 0x67, 0xfc, 0x7f, 0xb3, 0x24, 0x94, 0x31, 0xb4, 0x71, 0x93, 0xab, 0xa3, 0x31, 0x67, 0xd2, 0x6e,
0xb8, 0x9c, 0x4e, 0x73, 0x61, 0xd5, 0x00, 0x6c, 0x64, 0x08, 0xe4, 0xfa, 0x7c, 0x6c, 0xb2, 0xa1, 0xc2, 0xa3, 0x85, 0xd0, 0x7b, 0x65, 0xfa, 0x27, 0xf0, 0x70, 0x3a, 0x53, 0x66, 0xe7, 0xc9, 0x06,
0xc4, 0x70, 0xed, 0xfe, 0xc5, 0xd1, 0x53, 0xef, 0x70, 0xa4, 0x8e, 0xb8, 0x94, 0x5e, 0x8f, 0x93, 0x90, 0x34, 0xcc, 0xcc, 0x9c, 0xcf, 0xa0, 0xaa, 0x66, 0xf4, 0x6c, 0x9a, 0x03, 0xab, 0x1a, 0x60,
0xb7, 0x90, 0x3b, 0x0c, 0x7d, 0x85, 0x76, 0xca, 0xdb, 0x9f, 0xa7, 0x4d, 0xbf, 0xc3, 0x91, 0xd2, 0x22, 0x43, 0xa0, 0x30, 0x60, 0x13, 0x9d, 0x0d, 0x15, 0x17, 0xd7, 0xce, 0xdf, 0x2c, 0x35, 0x6a,
0x30, 0xcb, 0x3a, 0xf8, 0x01, 0x43, 0x16, 0x79, 0x05, 0xb9, 0x3d, 0x4f, 0x79, 0x36, 0x17, 0x52, 0x8f, 0xc6, 0xf2, 0x88, 0x09, 0xe1, 0xf5, 0x55, 0x02, 0x16, 0x0e, 0x43, 0x5f, 0x9a, 0xec, 0xfb,
0x86, 0x01, 0x8d, 0x48, 0x10, 0xb5, 0xb8, 0x5b, 0xd0, 0x23, 0xfe, 0x70, 0xa4, 0xdc, 0x17, 0xb0, 0x34, 0x6b, 0xe4, 0x1e, 0x8d, 0xa5, 0x82, 0x19, 0xd6, 0xc1, 0x8f, 0x5c, 0x64, 0x91, 0xd7, 0x50,
0x7e, 0xd3, 0xfa, 0x02, 0xd7, 0xbe, 0x82, 0x72, 0xc2, 0x0a, 0xde, 0x84, 0x93, 0x26, 0x02, 0x8a, 0xd8, 0xf3, 0xa4, 0x67, 0x72, 0x21, 0x63, 0x02, 0x51, 0x88, 0x14, 0x51, 0x89, 0xbb, 0x25, 0xf5,
0x4c, 0x2f, 0xb5, 0xaf, 0x93, 0x83, 0xac, 0x9a, 0x3d, 0xdc, 0x4f, 0xa0, 0x82, 0xa6, 0x27, 0x11, 0xbf, 0x62, 0x34, 0x96, 0xce, 0x4b, 0x58, 0xbf, 0x69, 0x7d, 0x81, 0x6b, 0x5f, 0x40, 0x35, 0x65,
0xfc, 0x53, 0x06, 0x0a, 0xb1, 0x89, 0x57, 0x33, 0x7e, 0x3f, 0x4b, 0xf3, 0x7b, 0xde, 0xe5, 0xaf, 0x05, 0xaf, 0xdf, 0x49, 0x0b, 0x01, 0x65, 0x57, 0x2d, 0x95, 0xaf, 0xc9, 0x41, 0x56, 0xf5, 0x1e,
0x21, 0x87, 0xfd, 0x2e, 0xb3, 0xac, 0x93, 0x36, 0xbb, 0x09, 0x1a, 0xb6, 0xc2, 0x5f, 0x41, 0x9e, 0xce, 0x03, 0xa8, 0xa1, 0xe9, 0x24, 0x82, 0x7f, 0xce, 0x41, 0x29, 0x36, 0xf1, 0x7a, 0xc6, 0xef,
0x71, 0xa9, 0xbb, 0x7e, 0x16, 0x89, 0xcf, 0x17, 0x13, 0x0d, 0x66, 0x4a, 0xb6, 0x24, 0x4d, 0x6f, 0xe7, 0x59, 0x7e, 0xcf, 0xbb, 0xfc, 0x25, 0x14, 0xb0, 0xc9, 0xe6, 0x96, 0xb5, 0xef, 0x56, 0x2f,
0xf9, 0xbd, 0xd0, 0x0b, 0x68, 0x6e, 0x19, 0xdd, 0x60, 0x12, 0x74, 0xa3, 0x98, 0x86, 0xfb, 0xcf, 0x45, 0xc3, 0xfe, 0xfb, 0x6b, 0x28, 0xba, 0x4c, 0xa8, 0x51, 0x23, 0x8f, 0xc4, 0x17, 0x8b, 0x89,
0x0e, 0x94, 0x97, 0x86, 0x7a, 0xf9, 0x07, 0xca, 0xdc, 0x47, 0x53, 0xf6, 0x7f, 0xfc, 0x68, 0xfa, 0x1a, 0x33, 0x25, 0x1b, 0x92, 0xa2, 0xb7, 0xfd, 0x7e, 0xe8, 0x05, 0xb4, 0xb0, 0x8c, 0xae, 0x31,
0x97, 0x33, 0x6b, 0x08, 0x9b, 0xbb, 0xbe, 0x4f, 0x43, 0xe1, 0x87, 0xca, 0xa6, 0x6c, 0x42, 0xa3, 0x29, 0xba, 0x56, 0x4c, 0xc3, 0xfd, 0x17, 0x0b, 0xaa, 0x4b, 0x43, 0xbd, 0xfc, 0x5f, 0xd1, 0xdc,
0x0f, 0xda, 0x18, 0x74, 0x6d, 0x19, 0xd5, 0xcb, 0x69, 0x39, 0xcc, 0xda, 0x72, 0xa8, 0x93, 0xe0, 0x3f, 0xb5, 0xfc, 0xff, 0xf9, 0x4f, 0xed, 0xdf, 0xd6, 0xac, 0x21, 0x9c, 0x28, 0xd4, 0x7d, 0x1a,
0xbd, 0xe4, 0x11, 0x86, 0xa8, 0xc4, 0x70, 0xad, 0x67, 0xa2, 0x63, 0x81, 0xda, 0x15, 0xcc, 0x16, 0x71, 0x3f, 0x94, 0x26, 0x65, 0x53, 0x1a, 0x75, 0xd0, 0xe6, 0xb0, 0x67, 0x6a, 0xb7, 0x5a, 0x4e,
0x2b, 0xa1, 0xbd, 0xab, 0x2e, 0xcd, 0x1b, 0xc7, 0x1b, 0x57, 0x58, 0xd7, 0x8f, 0x85, 0xd6, 0x15, 0x6b, 0x70, 0xde, 0xd4, 0x60, 0x95, 0x04, 0xef, 0x05, 0x8b, 0x30, 0x44, 0x15, 0x17, 0xd7, 0x6a,
0x10, 0x68, 0x04, 0x8d, 0x3b, 0x53, 0x63, 0x5a, 0x34, 0xa9, 0x76, 0xa6, 0xc6, 0xba, 0x44, 0x33, 0x10, 0x3b, 0xe6, 0xa8, 0x5d, 0xc1, 0x6c, 0x31, 0x12, 0xda, 0xbb, 0xea, 0xd1, 0xa2, 0x76, 0xbc,
0x11, 0x04, 0x6d, 0xaf, 0xd3, 0xa7, 0x25, 0xd3, 0x1b, 0x62, 0xd9, 0xdd, 0x81, 0xd2, 0xe4, 0xd5, 0x79, 0x85, 0xcd, 0xe4, 0x98, 0x2b, 0x5d, 0x09, 0x81, 0x5a, 0x50, 0xb8, 0x33, 0x39, 0xa1, 0x65,
0xeb, 0xda, 0xde, 0xec, 0x62, 0x68, 0x2b, 0x2c, 0xd3, 0xec, 0xc6, 0x59, 0x9b, 0x99, 0xcf, 0xda, 0x9d, 0x6a, 0x67, 0x72, 0xa2, 0xfa, 0x82, 0xcb, 0x83, 0xa0, 0xe3, 0x75, 0x07, 0xb4, 0xa2, 0x1b,
0x6c, 0x22, 0x6b, 0x5f, 0x41, 0x65, 0x26, 0x09, 0x34, 0x88, 0x89, 0x2b, 0x69, 0x0d, 0xe1, 0x5a, 0x52, 0x2c, 0xab, 0x29, 0x4b, 0x45, 0xd7, 0xf7, 0x02, 0x9c, 0xd9, 0xcb, 0x6e, 0x2c, 0x3a, 0x3b,
0xeb, 0x1a, 0x22, 0x30, 0x5f, 0x79, 0x15, 0x86, 0x6b, 0xf7, 0x39, 0x54, 0x66, 0x5e, 0xff, 0xa2, 0x50, 0x49, 0x92, 0x42, 0xb5, 0x9a, 0x56, 0x0f, 0x83, 0x5e, 0x73, 0x73, 0xad, 0x5e, 0x9c, 0xcf,
0x3a, 0xeb, 0x3e, 0x83, 0x4a, 0x4b, 0x79, 0x6a, 0xb4, 0xe4, 0xb3, 0xfc, 0xdf, 0x0e, 0xac, 0xc5, 0xb9, 0xf9, 0x7c, 0xce, 0xa7, 0xf2, 0xf9, 0x35, 0xd4, 0x66, 0xd2, 0x43, 0x81, 0x5c, 0x7e, 0x25,
0x18, 0x5b, 0x49, 0x7e, 0x01, 0xc5, 0x4b, 0x1e, 0x29, 0x7e, 0x3d, 0xe9, 0x2d, 0xb4, 0x3e, 0x10, 0x8c, 0x21, 0x5c, 0x2b, 0x5d, 0x93, 0x07, 0xfa, 0x4f, 0x67, 0xcd, 0xc5, 0xb5, 0xf3, 0x02, 0x6a,
0xed, 0x71, 0x3d, 0xfe, 0x63, 0x40, 0xbf, 0xed, 0x0f, 0x88, 0x60, 0x13, 0x24, 0xf9, 0x16, 0x8a, 0x33, 0x89, 0xb1, 0xa8, 0x02, 0x3b, 0xcf, 0xa1, 0xd6, 0x96, 0x9e, 0x1c, 0x2f, 0xf9, 0x4a, 0xf0,
0x12, 0xed, 0xf0, 0xb8, 0xd3, 0x7f, 0x96, 0xc6, 0xb2, 0xfb, 0x4d, 0xf0, 0x64, 0x0b, 0x72, 0x81, 0x1f, 0x0b, 0xd6, 0x62, 0x8c, 0xa9, 0x31, 0xbf, 0x84, 0xf2, 0x25, 0x8b, 0x24, 0xbb, 0x4e, 0xba,
0xe8, 0x49, 0x7c, 0xbb, 0xe5, 0xed, 0xc7, 0x69, 0xbc, 0x77, 0xa2, 0xc7, 0x10, 0x48, 0xde, 0x40, 0x0e, 0x6d, 0x0c, 0x79, 0x67, 0xd2, 0x88, 0xbf, 0x53, 0xa8, 0x3c, 0xf8, 0x80, 0x08, 0x37, 0x41,
0xf1, 0xca, 0x8b, 0x42, 0x3f, 0xec, 0xc5, 0x9f, 0x8f, 0x4f, 0xd3, 0x48, 0xdf, 0x1b, 0x1c, 0x9b, 0x92, 0xaf, 0xa1, 0x2c, 0xd0, 0x0e, 0x8b, 0x07, 0x8f, 0x8f, 0xb3, 0x58, 0x66, 0xbf, 0x04, 0x4f,
0x10, 0xdc, 0x8a, 0xbe, 0x14, 0xe7, 0xc2, 0xc6, 0xc4, 0xfd, 0x8d, 0xce, 0x4d, 0x2d, 0x5a, 0xf7, 0xb6, 0xa0, 0x10, 0xf0, 0xbe, 0xc0, 0xf7, 0x5e, 0xdd, 0x7e, 0x92, 0xc5, 0x7b, 0xc7, 0xfb, 0x2e,
0x0f, 0xa1, 0x62, 0xf2, 0xfb, 0x03, 0x8f, 0xa4, 0x9e, 0x9b, 0x9c, 0x65, 0x77, 0x70, 0x37, 0x09, 0x02, 0xc9, 0x5b, 0x28, 0x5f, 0x79, 0x51, 0xe8, 0x87, 0xfd, 0xf8, 0xdf, 0xec, 0xb3, 0x2c, 0xd2,
0x65, 0xb3, 0x4c, 0xf7, 0xa3, 0x6d, 0x5f, 0xb1, 0x42, 0x8f, 0xc8, 0x43, 0xaf, 0xd3, 0xf7, 0x7a, 0x77, 0x1a, 0xe7, 0x26, 0x04, 0xa7, 0xa6, 0xae, 0xcb, 0x39, 0x37, 0x31, 0x71, 0x7e, 0xab, 0xb2,
0xf1, 0x7b, 0x8a, 0x45, 0xfd, 0xe4, 0xd2, 0xee, 0x67, 0xae, 0x61, 0x2c, 0xea, 0x0c, 0x8c, 0xf8, 0x56, 0x89, 0xc6, 0xfd, 0x43, 0xa8, 0xe9, 0xcc, 0xff, 0xc0, 0x22, 0xa1, 0xc6, 0x38, 0x6b, 0xd9,
0xa5, 0x2f, 0xa7, 0x23, 0xdc, 0x44, 0xde, 0xfe, 0x7b, 0x1e, 0xa0, 0x31, 0x39, 0x0f, 0x39, 0x85, 0xed, 0xdc, 0x4d, 0x43, 0xdd, 0x59, 0xa6, 0xf3, 0xbd, 0x69, 0x6c, 0xb1, 0x42, 0xe5, 0xd2, 0xc8,
0x15, 0xdc, 0x8f, 0xb8, 0x4b, 0x9b, 0x21, 0xfa, 0x5d, 0x7d, 0x7e, 0x87, 0x86, 0x49, 0xde, 0x43, 0xeb, 0x0e, 0xbc, 0x7e, 0xfc, 0x9e, 0x62, 0x51, 0x3d, 0xb9, 0x34, 0xfb, 0xe9, 0x0b, 0x1a, 0x8b,
0xde, 0xbc, 0x2d, 0x92, 0x56, 0x83, 0x92, 0xf9, 0x55, 0x7d, 0xb1, 0x1c, 0x64, 0x8c, 0x7e, 0xe1, 0x2a, 0x37, 0x23, 0x76, 0xe9, 0x8b, 0xe9, 0x44, 0x99, 0xc8, 0xdb, 0x7f, 0x2d, 0x01, 0x34, 0x93,
0x10, 0x66, 0x2b, 0x14, 0x71, 0x97, 0xb4, 0x20, 0x9b, 0xd9, 0x69, 0x07, 0x9d, 0xa9, 0xf6, 0x35, 0xf3, 0x90, 0x53, 0x58, 0xc1, 0xfd, 0x88, 0xb3, 0xb4, 0x4d, 0xa2, 0xdf, 0xf6, 0x8b, 0x3b, 0xb4,
0x87, 0x7c, 0x07, 0x79, 0x53, 0x63, 0xc8, 0x8f, 0x17, 0x13, 0x62, 0x7b, 0xcb, 0x1f, 0xd7, 0x9c, 0x52, 0xf2, 0x41, 0x25, 0x3f, 0x8e, 0x37, 0xe4, 0x65, 0x56, 0x41, 0x48, 0x4f, 0x48, 0xf6, 0x27,
0x2f, 0x1c, 0x72, 0x04, 0x39, 0xdd, 0x5c, 0x49, 0x4a, 0xa7, 0x48, 0x74, 0xe6, 0xaa, 0xbb, 0x0c, 0xb7, 0xa0, 0x8c, 0xdd, 0xf7, 0x50, 0xd4, 0x59, 0x40, 0xb2, 0xaa, 0x5e, 0x3a, 0x6f, 0xed, 0x97,
0x62, 0xa3, 0xf8, 0x11, 0x60, 0xda, 0xe2, 0x49, 0xca, 0xc7, 0xfa, 0xdc, 0xac, 0x50, 0xad, 0xdd, 0xcb, 0x41, 0xda, 0xe8, 0x67, 0x16, 0x71, 0x4d, 0x4d, 0x24, 0xce, 0x92, 0xa6, 0x67, 0x6e, 0x4c,
0x0e, 0xb4, 0x1b, 0x1c, 0xe9, 0xfe, 0x76, 0x2e, 0x48, 0x6a, 0x67, 0x9b, 0xa4, 0x7b, 0xd5, 0x5d, 0x56, 0x00, 0x66, 0xfa, 0x4b, 0xdd, 0x22, 0xdf, 0x42, 0x51, 0x57, 0x35, 0xf2, 0xd3, 0xc5, 0x84,
0x06, 0xb1, 0xe6, 0x2e, 0xa0, 0x32, 0xf3, 0x5f, 0x1d, 0xf9, 0x59, 0xba, 0x93, 0x37, 0xff, 0xfa, 0xd8, 0xde, 0xf2, 0xc7, 0x75, 0xeb, 0x33, 0x8b, 0x1c, 0x41, 0x41, 0xb5, 0x73, 0x92, 0xd1, 0x9b,
0xab, 0xbe, 0xbc, 0x13, 0xd6, 0xee, 0xa4, 0x92, 0x33, 0x92, 0x7d, 0x4c, 0xea, 0xb7, 0xf9, 0x3d, 0x52, 0xb3, 0x80, 0xed, 0x2c, 0x83, 0x98, 0x28, 0x7e, 0x0f, 0x30, 0x1d, 0x2a, 0x48, 0xc6, 0x37,
0xfb, 0xbf, 0x5b, 0x75, 0xeb, 0xce, 0x78, 0xb3, 0xeb, 0x6e, 0xee, 0xb7, 0x99, 0x61, 0xbb, 0x9d, 0x89, 0xb9, 0xe9, 0xc4, 0xae, 0xdf, 0x0e, 0x34, 0x1b, 0x1c, 0xa9, 0x8e, 0x7a, 0xce, 0x49, 0x66,
0xc7, 0xbf, 0x30, 0xbf, 0xfa, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf1, 0x90, 0xec, 0x83, 0x29, 0x2f, 0x4d, 0xae, 0x91, 0xed, 0x2c, 0x83, 0x18, 0x73, 0x17, 0x50, 0x9b, 0xf9, 0x24, 0x49, 0x7e,
0x15, 0x00, 0x00, 0x9e, 0xed, 0xe4, 0xcd, 0x2f, 0x9c, 0xf6, 0xab, 0x3b, 0x61, 0xcd, 0x4e, 0x32, 0x3d, 0x95, 0x99,
0xc7, 0xa4, 0x71, 0x9b, 0xdf, 0xb3, 0x9f, 0x17, 0xed, 0xad, 0x3b, 0xe3, 0xf5, 0xae, 0xbb, 0x85,
0xdf, 0xe5, 0x46, 0x9d, 0x4e, 0x11, 0xbf, 0xd4, 0x7e, 0xf1, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff,
0xc2, 0xd5, 0x2b, 0x23, 0x10, 0x16, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
@ -2040,6 +2129,7 @@ const _ = grpc.SupportPackageIsVersion4
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type ControllerClient interface { type ControllerClient interface {
Build(ctx context.Context, in *BuildRequest, opts ...grpc.CallOption) (*BuildResponse, error) Build(ctx context.Context, in *BuildRequest, opts ...grpc.CallOption) (*BuildResponse, error)
Inspect(ctx context.Context, in *InspectRequest, opts ...grpc.CallOption) (*InspectResponse, error)
Status(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Controller_StatusClient, error) Status(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Controller_StatusClient, error)
Input(ctx context.Context, opts ...grpc.CallOption) (Controller_InputClient, error) Input(ctx context.Context, opts ...grpc.CallOption) (Controller_InputClient, error)
Invoke(ctx context.Context, opts ...grpc.CallOption) (Controller_InvokeClient, error) Invoke(ctx context.Context, opts ...grpc.CallOption) (Controller_InvokeClient, error)
@ -2067,6 +2157,15 @@ func (c *controllerClient) Build(ctx context.Context, in *BuildRequest, opts ...
return out, nil return out, nil
} }
func (c *controllerClient) Inspect(ctx context.Context, in *InspectRequest, opts ...grpc.CallOption) (*InspectResponse, error) {
out := new(InspectResponse)
err := c.cc.Invoke(ctx, "/buildx.controller.v1.Controller/Inspect", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *controllerClient) Status(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Controller_StatusClient, error) { func (c *controllerClient) Status(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Controller_StatusClient, error) {
stream, err := c.cc.NewStream(ctx, &_Controller_serviceDesc.Streams[0], "/buildx.controller.v1.Controller/Status", opts...) stream, err := c.cc.NewStream(ctx, &_Controller_serviceDesc.Streams[0], "/buildx.controller.v1.Controller/Status", opts...)
if err != nil { if err != nil {
@ -2212,6 +2311,7 @@ func (c *controllerClient) DisconnectProcess(ctx context.Context, in *Disconnect
// ControllerServer is the server API for Controller service. // ControllerServer is the server API for Controller service.
type ControllerServer interface { type ControllerServer interface {
Build(context.Context, *BuildRequest) (*BuildResponse, error) Build(context.Context, *BuildRequest) (*BuildResponse, error)
Inspect(context.Context, *InspectRequest) (*InspectResponse, error)
Status(*StatusRequest, Controller_StatusServer) error Status(*StatusRequest, Controller_StatusServer) error
Input(Controller_InputServer) error Input(Controller_InputServer) error
Invoke(Controller_InvokeServer) error Invoke(Controller_InvokeServer) error
@ -2229,6 +2329,9 @@ type UnimplementedControllerServer struct {
func (*UnimplementedControllerServer) Build(ctx context.Context, req *BuildRequest) (*BuildResponse, error) { func (*UnimplementedControllerServer) Build(ctx context.Context, req *BuildRequest) (*BuildResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method Build not implemented") return nil, status.Errorf(codes.Unimplemented, "method Build not implemented")
} }
func (*UnimplementedControllerServer) Inspect(ctx context.Context, req *InspectRequest) (*InspectResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method Inspect not implemented")
}
func (*UnimplementedControllerServer) Status(req *StatusRequest, srv Controller_StatusServer) error { func (*UnimplementedControllerServer) Status(req *StatusRequest, srv Controller_StatusServer) error {
return status.Errorf(codes.Unimplemented, "method Status not implemented") return status.Errorf(codes.Unimplemented, "method Status not implemented")
} }
@ -2276,6 +2379,24 @@ func _Controller_Build_Handler(srv interface{}, ctx context.Context, dec func(in
return interceptor(ctx, in, info, handler) return interceptor(ctx, in, info, handler)
} }
func _Controller_Inspect_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(InspectRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(ControllerServer).Inspect(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/buildx.controller.v1.Controller/Inspect",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(ControllerServer).Inspect(ctx, req.(*InspectRequest))
}
return interceptor(ctx, in, info, handler)
}
func _Controller_Status_Handler(srv interface{}, stream grpc.ServerStream) error { func _Controller_Status_Handler(srv interface{}, stream grpc.ServerStream) error {
m := new(StatusRequest) m := new(StatusRequest)
if err := stream.RecvMsg(m); err != nil { if err := stream.RecvMsg(m); err != nil {
@ -2447,6 +2568,10 @@ var _Controller_serviceDesc = grpc.ServiceDesc{
MethodName: "Build", MethodName: "Build",
Handler: _Controller_Build_Handler, Handler: _Controller_Build_Handler,
}, },
{
MethodName: "Inspect",
Handler: _Controller_Inspect_Handler,
},
{ {
MethodName: "List", MethodName: "List",
Handler: _Controller_List_Handler, Handler: _Controller_List_Handler,

@ -8,6 +8,7 @@ option go_package = "pb";
service Controller { service Controller {
rpc Build(BuildRequest) returns (BuildResponse); rpc Build(BuildRequest) returns (BuildResponse);
rpc Inspect(InspectRequest) returns (InspectResponse);
rpc Status(StatusRequest) returns (stream StatusResponse); rpc Status(StatusRequest) returns (stream StatusResponse);
rpc Input(stream InputMessage) returns (InputResponse); rpc Input(stream InputMessage) returns (InputResponse);
rpc Invoke(stream Message) returns (stream Message); rpc Invoke(stream Message) returns (stream Message);
@ -105,6 +106,14 @@ message Secret {
string Env = 3; string Env = 3;
} }
message InspectRequest {
string Ref = 1;
}
message InspectResponse {
BuildOptions Options = 1;
}
message UlimitOpt { message UlimitOpt {
map<string, Ulimit> values = 1; map<string, Ulimit> values = 1;
} }
@ -184,6 +193,7 @@ message InvokeConfig {
bool NoCwd = 7; // Do not set cwd but use the image's default bool NoCwd = 7; // Do not set cwd but use the image's default
bool Tty = 8; bool Tty = 8;
bool Rollback = 9; // Kill all process in the container and recreate it. bool Rollback = 9; // Kill all process in the container and recreate it.
bool Initial = 10; // Run container from the initial state of that stage (supported only on the failed step)
} }
message FdMessage { message FdMessage {

@ -74,6 +74,9 @@ func (c *Client) List(ctx context.Context) (keys []string, retErr error) {
} }
func (c *Client) Disconnect(ctx context.Context, key string) error { func (c *Client) Disconnect(ctx context.Context, key string) error {
if key == "" {
return nil
}
_, err := c.client().Disconnect(ctx, &pb.DisconnectRequest{Ref: key}) _, err := c.client().Disconnect(ctx, &pb.DisconnectRequest{Ref: key})
return err return err
} }
@ -107,6 +110,10 @@ func (c *Client) Invoke(ctx context.Context, ref string, pid string, invokeConfi
}) })
} }
func (c *Client) Inspect(ctx context.Context, ref string) (*pb.InspectResponse, error) {
return c.client().Inspect(ctx, &pb.InspectRequest{Ref: ref})
}
func (c *Client) Build(ctx context.Context, options pb.BuildOptions, in io.ReadCloser, w io.Writer, out console.File, progressMode string) (string, *client.SolveResponse, error) { func (c *Client) Build(ctx context.Context, options pb.BuildOptions, in io.ReadCloser, w io.Writer, out console.File, progressMode string) (string, *client.SolveResponse, error) {
ref := identity.NewID() ref := identity.NewID()
pw, err := progress.NewPrinter(context.TODO(), w, out, progressMode) pw, err := progress.NewPrinter(context.TODO(), w, out, progressMode)

@ -38,6 +38,7 @@ type session struct {
buildOnGoing atomic.Bool buildOnGoing atomic.Bool
statusChan chan *client.SolveStatus statusChan chan *client.SolveStatus
cancelBuild func() cancelBuild func()
buildOptions *pb.BuildOptions
inputPipe *io.PipeWriter inputPipe *io.PipeWriter
result *build.ResultContext result *build.ResultContext
@ -113,6 +114,9 @@ func (m *Server) Disconnect(ctx context.Context, req *pb.DisconnectRequest) (res
s.cancelBuild() s.cancelBuild()
} }
s.cancelRunningProcesses() s.cancelRunningProcesses()
if s.result != nil {
s.result.Done()
}
} }
delete(m.session, key) delete(m.session, key)
m.sessionMu.Unlock() m.sessionMu.Unlock()
@ -134,6 +138,23 @@ func (m *Server) Close() error {
return nil return nil
} }
func (m *Server) Inspect(ctx context.Context, req *pb.InspectRequest) (*pb.InspectResponse, error) {
ref := req.Ref
if ref == "" {
return nil, errors.New("inspect: empty key")
}
var bo *pb.BuildOptions
m.sessionMu.Lock()
if s, ok := m.session[ref]; ok {
bo = s.buildOptions
} else {
m.sessionMu.Unlock()
return nil, errors.Errorf("inspect: unknown key %v", ref)
}
m.sessionMu.Unlock()
return &pb.InspectResponse{Options: bo}, nil
}
func (m *Server) Build(ctx context.Context, req *pb.BuildRequest) (*pb.BuildResponse, error) { func (m *Server) Build(ctx context.Context, req *pb.BuildRequest) (*pb.BuildResponse, error) {
ref := req.Ref ref := req.Ref
if ref == "" { if ref == "" {

Loading…
Cancel
Save