From cff3cdd35a85e01f18851ecf86b2ae4b6a867cc7 Mon Sep 17 00:00:00 2001 From: Vincent Demeester Date: Wed, 2 Nov 2016 19:43:27 +0100 Subject: [PATCH] Update swarmkit to 4dfc88ccce14ced6f0a6ea82d46dca004c6de0e2 Signed-off-by: Vincent Demeester --- hack/vendor.sh | 2 +- .../src/github.com/docker/swarmkit/api/gen.go | 2 +- .../docker/swarmkit/api/types.pb.go | 1354 ++++++++++++----- .../docker/swarmkit/api/types.proto | 55 +- .../docker/swarmkit/ca/certificates.go | 1 + .../github.com/docker/swarmkit/ca/external.go | 6 +- .../networkallocator/portallocator.go | 52 +- .../swarmkit/manager/controlapi/secret.go | 18 + .../swarmkit/manager/controlapi/service.go | 37 +- .../swarmkit/manager/dispatcher/dispatcher.go | 119 +- .../docker/swarmkit/manager/manager.go | 202 ++- .../manager/orchestrator/global/global.go | 2 +- .../swarmkit/manager/state/raft/raft.go | 2 +- .../github.com/docker/swarmkit/node/node.go | 17 +- .../docker/swarmkit/protobuf/plugin/gen.go | 2 +- .../docker/swarmkit/xnet/xnet_unix.go | 20 + .../docker/swarmkit/xnet/xnet_windows.go | 31 + 17 files changed, 1380 insertions(+), 542 deletions(-) create mode 100644 vendor/src/github.com/docker/swarmkit/xnet/xnet_unix.go create mode 100644 vendor/src/github.com/docker/swarmkit/xnet/xnet_windows.go diff --git a/hack/vendor.sh b/hack/vendor.sh index dfa4b791d4..3195db104a 100755 --- a/hack/vendor.sh +++ b/hack/vendor.sh @@ -147,7 +147,7 @@ clone git github.com/docker/containerd 52ef1ceb4b660c42cf4ea9013180a5663968d4c7 clone git github.com/tonistiigi/fifo 8c56881ce5e63e19e2dfc495c8af0fb90916467d # cluster -clone git github.com/docker/swarmkit 72981f443024da2c57d54b915eae0477be6dada5 +clone git github.com/docker/swarmkit 4dfc88ccce14ced6f0a6ea82d46dca004c6de0e2 clone git github.com/golang/mock bd3c8e81be01eef76d4b503f5e687d2d1354d2d9 clone git github.com/gogo/protobuf v0.3 clone git github.com/cloudflare/cfssl 7fb22c8cba7ecaf98e4082d22d65800cf45e042a diff --git a/vendor/src/github.com/docker/swarmkit/api/gen.go b/vendor/src/github.com/docker/swarmkit/api/gen.go index 9f90c7e7b5..d0fb1ede1d 100644 --- a/vendor/src/github.com/docker/swarmkit/api/gen.go +++ b/vendor/src/github.com/docker/swarmkit/api/gen.go @@ -1,3 +1,3 @@ package api -//go:generate protoc -I.:../protobuf:../vendor:../vendor/github.com/gogo/protobuf:../vendor/github.com/gogo/protobuf/protobuf --gogoswarm_out=plugins=grpc+deepcopy+raftproxy+authenticatedwrapper,import_path=github.com/docker/swarmkit/api,Mgogoproto/gogo.proto=github.com/gogo/protobuf/gogoproto,Mtimestamp/timestamp.proto=github.com/docker/swarmkit/api/timestamp,Mduration/duration.proto=github.com/docker/swarmkit/api/duration,Mgoogle/protobuf/descriptor.proto=github.com/gogo/protobuf/protoc-gen-gogo/descriptor,Mplugin/plugin.proto=github.com/docker/swarmkit/protobuf/plugin:. types.proto specs.proto objects.proto control.proto dispatcher.proto ca.proto snapshot.proto raft.proto health.proto resource.proto +//go:generate protoc -I.:../protobuf:../vendor:../vendor/github.com/gogo/protobuf --gogoswarm_out=plugins=grpc+deepcopy+raftproxy+authenticatedwrapper,import_path=github.com/docker/swarmkit/api,Mgogoproto/gogo.proto=github.com/gogo/protobuf/gogoproto,Mtimestamp/timestamp.proto=github.com/docker/swarmkit/api/timestamp,Mduration/duration.proto=github.com/docker/swarmkit/api/duration,Mgoogle/protobuf/descriptor.proto=github.com/gogo/protobuf/protoc-gen-gogo/descriptor,Mplugin/plugin.proto=github.com/docker/swarmkit/protobuf/plugin:. types.proto specs.proto objects.proto control.proto dispatcher.proto ca.proto snapshot.proto raft.proto health.proto resource.proto diff --git a/vendor/src/github.com/docker/swarmkit/api/types.pb.go b/vendor/src/github.com/docker/swarmkit/api/types.pb.go index 6a0eca980e..884138f044 100644 --- a/vendor/src/github.com/docker/swarmkit/api/types.pb.go +++ b/vendor/src/github.com/docker/swarmkit/api/types.pb.go @@ -60,6 +60,7 @@ SecretReference BlacklistedCertificate HealthConfig + MaybeEncryptedRecord NodeSpec ServiceSpec ReplicatedService @@ -650,34 +651,28 @@ func (EncryptionKey_Algorithm) EnumDescriptor() ([]byte, []int) { return fileDescriptorTypes, []int{37, 0} } -// Mode specifies how this secret should be exposed to the task. -type SecretReference_Mode int32 +type MaybeEncryptedRecord_Algorithm int32 const ( - // SYSTEM means that it is not exposed inside to a task at all, but - // only available via direct access, usually at the agent-level - SecretReference_SYSTEM SecretReference_Mode = 0 - // FILE means that it will be exposed to the task as a file - SecretReference_FILE SecretReference_Mode = 1 - // ENV means that it will be exposed to the task as an environment variable - SecretReference_ENV SecretReference_Mode = 2 + MaybeEncryptedRecord_NotEncrypted MaybeEncryptedRecord_Algorithm = 0 + MaybeEncryptedRecord_NACLSecretboxSalsa20Poly1305 MaybeEncryptedRecord_Algorithm = 1 ) -var SecretReference_Mode_name = map[int32]string{ - 0: "SYSTEM", - 1: "FILE", - 2: "ENV", +var MaybeEncryptedRecord_Algorithm_name = map[int32]string{ + 0: "NONE", + 1: "SECRETBOX_SALSA20_POLY1305", } -var SecretReference_Mode_value = map[string]int32{ - "SYSTEM": 0, - "FILE": 1, - "ENV": 2, +var MaybeEncryptedRecord_Algorithm_value = map[string]int32{ + "NONE": 0, + "SECRETBOX_SALSA20_POLY1305": 1, } -func (x SecretReference_Mode) String() string { - return proto.EnumName(SecretReference_Mode_name, int32(x)) +func (x MaybeEncryptedRecord_Algorithm) String() string { + return proto.EnumName(MaybeEncryptedRecord_Algorithm_name, int32(x)) +} +func (MaybeEncryptedRecord_Algorithm) EnumDescriptor() ([]byte, []int) { + return fileDescriptorTypes, []int{42, 0} } -func (SecretReference_Mode) EnumDescriptor() ([]byte, []int) { return fileDescriptorTypes, []int{39, 0} } // Version tracks the last time an object in the store was updated. type Version struct { @@ -786,6 +781,8 @@ func (*RaftMemberStatus) Descriptor() ([]byte, []int) { return fileDescriptorTyp type NodeStatus struct { State NodeStatus_State `protobuf:"varint,1,opt,name=state,proto3,enum=docker.swarmkit.v1.NodeStatus_State" json:"state,omitempty"` Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` + // Addr is the node's IP address as observed by the manager + Addr string `protobuf:"bytes,3,opt,name=addr,proto3" json:"addr,omitempty"` } func (m *NodeStatus) Reset() { *m = NodeStatus{} } @@ -1437,19 +1434,119 @@ type SecretReference struct { // referencing. This identifier exists so that SecretReferences don't leak // any information about the secret contents. SecretID string `protobuf:"bytes,1,opt,name=secret_id,json=secretId,proto3" json:"secret_id,omitempty"` - // Mode is the way the secret should be presented. - Mode SecretReference_Mode `protobuf:"varint,2,opt,name=mode,proto3,enum=docker.swarmkit.v1.SecretReference_Mode" json:"mode,omitempty"` - // Target is the name by which the image accesses the secret. - Target string `protobuf:"bytes,3,opt,name=target,proto3" json:"target,omitempty"` // SecretName is the name of the secret that this references, but this is just provided for // lookup/display purposes. The secret in the reference will be identified by its ID. - SecretName string `protobuf:"bytes,4,opt,name=secret_name,json=secretName,proto3" json:"secret_name,omitempty"` + SecretName string `protobuf:"bytes,2,opt,name=secret_name,json=secretName,proto3" json:"secret_name,omitempty"` + // Target specifies how this secret should be exposed to the task. + // + // Types that are valid to be assigned to Target: + // *SecretReference_File + Target isSecretReference_Target `protobuf_oneof:"target"` } func (m *SecretReference) Reset() { *m = SecretReference{} } func (*SecretReference) ProtoMessage() {} func (*SecretReference) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{39} } +type isSecretReference_Target interface { + isSecretReference_Target() + MarshalTo([]byte) (int, error) + Size() int +} + +type SecretReference_File struct { + File *SecretReference_FileTarget `protobuf:"bytes,3,opt,name=file,oneof"` +} + +func (*SecretReference_File) isSecretReference_Target() {} + +func (m *SecretReference) GetTarget() isSecretReference_Target { + if m != nil { + return m.Target + } + return nil +} + +func (m *SecretReference) GetFile() *SecretReference_FileTarget { + if x, ok := m.GetTarget().(*SecretReference_File); ok { + return x.File + } + return nil +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*SecretReference) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _SecretReference_OneofMarshaler, _SecretReference_OneofUnmarshaler, _SecretReference_OneofSizer, []interface{}{ + (*SecretReference_File)(nil), + } +} + +func _SecretReference_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*SecretReference) + // target + switch x := m.Target.(type) { + case *SecretReference_File: + _ = b.EncodeVarint(3<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.File); err != nil { + return err + } + case nil: + default: + return fmt.Errorf("SecretReference.Target has unexpected type %T", x) + } + return nil +} + +func _SecretReference_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*SecretReference) + switch tag { + case 3: // target.file + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(SecretReference_FileTarget) + err := b.DecodeMessage(msg) + m.Target = &SecretReference_File{msg} + return true, err + default: + return false, nil + } +} + +func _SecretReference_OneofSizer(msg proto.Message) (n int) { + m := msg.(*SecretReference) + // target + switch x := m.Target.(type) { + case *SecretReference_File: + s := proto.Size(x.File) + n += proto.SizeVarint(3<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +// FileTarget represents a specific target that is backed by a file +type SecretReference_FileTarget struct { + // Name represents the final filename in the filesystem + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // UID represents the file UID + UID string `protobuf:"bytes,2,opt,name=uid,proto3" json:"uid,omitempty"` + // GID represents the file GID + GID string `protobuf:"bytes,3,opt,name=gid,proto3" json:"gid,omitempty"` + // Mode represents the FileMode of the file + Mode os.FileMode `protobuf:"varint,4,opt,name=mode,proto3,customtype=os.FileMode" json:"mode"` +} + +func (m *SecretReference_FileTarget) Reset() { *m = SecretReference_FileTarget{} } +func (*SecretReference_FileTarget) ProtoMessage() {} +func (*SecretReference_FileTarget) Descriptor() ([]byte, []int) { + return fileDescriptorTypes, []int{39, 0} +} + // BlacklistedCertificate is a record for a blacklisted certificate. It does not // contain the certificate's CN, because these records are indexed by CN. type BlacklistedCertificate struct { @@ -1486,6 +1583,16 @@ func (m *HealthConfig) Reset() { *m = HealthConfig{} } func (*HealthConfig) ProtoMessage() {} func (*HealthConfig) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{41} } +type MaybeEncryptedRecord struct { + Algorithm MaybeEncryptedRecord_Algorithm `protobuf:"varint,1,opt,name=algorithm,proto3,enum=docker.swarmkit.v1.MaybeEncryptedRecord_Algorithm" json:"algorithm,omitempty"` + Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` + Nonce []byte `protobuf:"bytes,3,opt,name=nonce,proto3" json:"nonce,omitempty"` +} + +func (m *MaybeEncryptedRecord) Reset() { *m = MaybeEncryptedRecord{} } +func (*MaybeEncryptedRecord) ProtoMessage() {} +func (*MaybeEncryptedRecord) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{42} } + func init() { proto.RegisterType((*Version)(nil), "docker.swarmkit.v1.Version") proto.RegisterType((*Annotations)(nil), "docker.swarmkit.v1.Annotations") @@ -1532,8 +1639,10 @@ func init() { proto.RegisterType((*EncryptionKey)(nil), "docker.swarmkit.v1.EncryptionKey") proto.RegisterType((*ManagerStatus)(nil), "docker.swarmkit.v1.ManagerStatus") proto.RegisterType((*SecretReference)(nil), "docker.swarmkit.v1.SecretReference") + proto.RegisterType((*SecretReference_FileTarget)(nil), "docker.swarmkit.v1.SecretReference.FileTarget") proto.RegisterType((*BlacklistedCertificate)(nil), "docker.swarmkit.v1.BlacklistedCertificate") proto.RegisterType((*HealthConfig)(nil), "docker.swarmkit.v1.HealthConfig") + proto.RegisterType((*MaybeEncryptedRecord)(nil), "docker.swarmkit.v1.MaybeEncryptedRecord") proto.RegisterEnum("docker.swarmkit.v1.TaskState", TaskState_name, TaskState_value) proto.RegisterEnum("docker.swarmkit.v1.NodeRole", NodeRole_name, NodeRole_value) proto.RegisterEnum("docker.swarmkit.v1.RaftMemberStatus_Reachability", RaftMemberStatus_Reachability_name, RaftMemberStatus_Reachability_value) @@ -1549,7 +1658,7 @@ func init() { proto.RegisterEnum("docker.swarmkit.v1.IssuanceStatus_State", IssuanceStatus_State_name, IssuanceStatus_State_value) proto.RegisterEnum("docker.swarmkit.v1.ExternalCA_CAProtocol", ExternalCA_CAProtocol_name, ExternalCA_CAProtocol_value) proto.RegisterEnum("docker.swarmkit.v1.EncryptionKey_Algorithm", EncryptionKey_Algorithm_name, EncryptionKey_Algorithm_value) - proto.RegisterEnum("docker.swarmkit.v1.SecretReference_Mode", SecretReference_Mode_name, SecretReference_Mode_value) + proto.RegisterEnum("docker.swarmkit.v1.MaybeEncryptedRecord_Algorithm", MaybeEncryptedRecord_Algorithm_name, MaybeEncryptedRecord_Algorithm_value) } func (m *Version) Copy() *Version { @@ -1698,6 +1807,7 @@ func (m *NodeStatus) Copy() *NodeStatus { o := &NodeStatus{ State: m.State, Message: m.Message, + Addr: m.Addr, } return o @@ -2248,11 +2358,33 @@ func (m *SecretReference) Copy() *SecretReference { o := &SecretReference{ SecretID: m.SecretID, - Mode: m.Mode, - Target: m.Target, SecretName: m.SecretName, } + switch m.Target.(type) { + case *SecretReference_File: + i := &SecretReference_File{ + File: m.GetFile().Copy(), + } + + o.Target = i + } + + return o +} + +func (m *SecretReference_FileTarget) Copy() *SecretReference_FileTarget { + if m == nil { + return nil + } + + o := &SecretReference_FileTarget{ + Name: m.Name, + UID: m.UID, + GID: m.GID, + Mode: m.Mode, + } + return o } @@ -2287,6 +2419,20 @@ func (m *HealthConfig) Copy() *HealthConfig { return o } +func (m *MaybeEncryptedRecord) Copy() *MaybeEncryptedRecord { + if m == nil { + return nil + } + + o := &MaybeEncryptedRecord{ + Algorithm: m.Algorithm, + Data: m.Data, + Nonce: m.Nonce, + } + + return o +} + func (this *Version) GoString() string { if this == nil { return "nil" @@ -2429,10 +2575,11 @@ func (this *NodeStatus) GoString() string { if this == nil { return "nil" } - s := make([]string, 0, 6) + s := make([]string, 0, 7) s = append(s, "&api.NodeStatus{") s = append(s, "State: "+fmt.Sprintf("%#v", this.State)+",\n") s = append(s, "Message: "+fmt.Sprintf("%#v", this.Message)+",\n") + s = append(s, "Addr: "+fmt.Sprintf("%#v", this.Addr)+",\n") s = append(s, "}") return strings.Join(s, "") } @@ -2945,12 +3092,34 @@ func (this *SecretReference) GoString() string { if this == nil { return "nil" } - s := make([]string, 0, 8) + s := make([]string, 0, 7) s = append(s, "&api.SecretReference{") s = append(s, "SecretID: "+fmt.Sprintf("%#v", this.SecretID)+",\n") - s = append(s, "Mode: "+fmt.Sprintf("%#v", this.Mode)+",\n") - s = append(s, "Target: "+fmt.Sprintf("%#v", this.Target)+",\n") s = append(s, "SecretName: "+fmt.Sprintf("%#v", this.SecretName)+",\n") + if this.Target != nil { + s = append(s, "Target: "+fmt.Sprintf("%#v", this.Target)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *SecretReference_File) GoString() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&api.SecretReference_File{` + + `File:` + fmt.Sprintf("%#v", this.File) + `}`}, ", ") + return s +} +func (this *SecretReference_FileTarget) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 8) + s = append(s, "&api.SecretReference_FileTarget{") + s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n") + s = append(s, "UID: "+fmt.Sprintf("%#v", this.UID)+",\n") + s = append(s, "GID: "+fmt.Sprintf("%#v", this.GID)+",\n") + s = append(s, "Mode: "+fmt.Sprintf("%#v", this.Mode)+",\n") s = append(s, "}") return strings.Join(s, "") } @@ -2983,6 +3152,18 @@ func (this *HealthConfig) GoString() string { s = append(s, "}") return strings.Join(s, "") } +func (this *MaybeEncryptedRecord) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 7) + s = append(s, "&api.MaybeEncryptedRecord{") + s = append(s, "Algorithm: "+fmt.Sprintf("%#v", this.Algorithm)+",\n") + s = append(s, "Data: "+fmt.Sprintf("%#v", this.Data)+",\n") + s = append(s, "Nonce: "+fmt.Sprintf("%#v", this.Nonce)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} func valueToGoStringTypes(v interface{}, typ string) string { rv := reflect.ValueOf(v) if rv.IsNil() { @@ -3371,6 +3552,12 @@ func (m *NodeStatus) MarshalTo(data []byte) (int, error) { i = encodeVarintTypes(data, i, uint64(len(m.Message))) i += copy(data[i:], m.Message) } + if len(m.Addr) > 0 { + data[i] = 0x1a + i++ + i = encodeVarintTypes(data, i, uint64(len(m.Addr))) + i += copy(data[i:], m.Addr) + } return i, nil } @@ -4768,23 +4955,74 @@ func (m *SecretReference) MarshalTo(data []byte) (int, error) { i = encodeVarintTypes(data, i, uint64(len(m.SecretID))) i += copy(data[i:], m.SecretID) } - if m.Mode != 0 { - data[i] = 0x10 - i++ - i = encodeVarintTypes(data, i, uint64(m.Mode)) - } - if len(m.Target) > 0 { - data[i] = 0x1a - i++ - i = encodeVarintTypes(data, i, uint64(len(m.Target))) - i += copy(data[i:], m.Target) - } if len(m.SecretName) > 0 { - data[i] = 0x22 + data[i] = 0x12 i++ i = encodeVarintTypes(data, i, uint64(len(m.SecretName))) i += copy(data[i:], m.SecretName) } + if m.Target != nil { + nn28, err := m.Target.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += nn28 + } + return i, nil +} + +func (m *SecretReference_File) MarshalTo(data []byte) (int, error) { + i := 0 + if m.File != nil { + data[i] = 0x1a + i++ + i = encodeVarintTypes(data, i, uint64(m.File.Size())) + n29, err := m.File.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n29 + } + return i, nil +} +func (m *SecretReference_FileTarget) Marshal() (data []byte, err error) { + size := m.Size() + data = make([]byte, size) + n, err := m.MarshalTo(data) + if err != nil { + return nil, err + } + return data[:n], nil +} + +func (m *SecretReference_FileTarget) MarshalTo(data []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Name) > 0 { + data[i] = 0xa + i++ + i = encodeVarintTypes(data, i, uint64(len(m.Name))) + i += copy(data[i:], m.Name) + } + if len(m.UID) > 0 { + data[i] = 0x12 + i++ + i = encodeVarintTypes(data, i, uint64(len(m.UID))) + i += copy(data[i:], m.UID) + } + if len(m.GID) > 0 { + data[i] = 0x1a + i++ + i = encodeVarintTypes(data, i, uint64(len(m.GID))) + i += copy(data[i:], m.GID) + } + if m.Mode != 0 { + data[i] = 0x20 + i++ + i = encodeVarintTypes(data, i, uint64(m.Mode)) + } return i, nil } @@ -4807,11 +5045,11 @@ func (m *BlacklistedCertificate) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintTypes(data, i, uint64(m.Expiry.Size())) - n28, err := m.Expiry.MarshalTo(data[i:]) + n30, err := m.Expiry.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n28 + i += n30 } return i, nil } @@ -4850,21 +5088,21 @@ func (m *HealthConfig) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintTypes(data, i, uint64(m.Interval.Size())) - n29, err := m.Interval.MarshalTo(data[i:]) + n31, err := m.Interval.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n29 + i += n31 } if m.Timeout != nil { data[i] = 0x1a i++ i = encodeVarintTypes(data, i, uint64(m.Timeout.Size())) - n30, err := m.Timeout.MarshalTo(data[i:]) + n32, err := m.Timeout.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n30 + i += n32 } if m.Retries != 0 { data[i] = 0x20 @@ -4874,6 +5112,41 @@ func (m *HealthConfig) MarshalTo(data []byte) (int, error) { return i, nil } +func (m *MaybeEncryptedRecord) Marshal() (data []byte, err error) { + size := m.Size() + data = make([]byte, size) + n, err := m.MarshalTo(data) + if err != nil { + return nil, err + } + return data[:n], nil +} + +func (m *MaybeEncryptedRecord) MarshalTo(data []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Algorithm != 0 { + data[i] = 0x8 + i++ + i = encodeVarintTypes(data, i, uint64(m.Algorithm)) + } + if len(m.Data) > 0 { + data[i] = 0x12 + i++ + i = encodeVarintTypes(data, i, uint64(len(m.Data))) + i += copy(data[i:], m.Data) + } + if len(m.Nonce) > 0 { + data[i] = 0x1a + i++ + i = encodeVarintTypes(data, i, uint64(len(m.Nonce))) + i += copy(data[i:], m.Nonce) + } + return i, nil +} + func encodeFixed64Types(data []byte, offset int, v uint64) int { data[offset] = uint8(v) data[offset+1] = uint8(v >> 8) @@ -5055,6 +5328,10 @@ func (m *NodeStatus) Size() (n int) { if l > 0 { n += 1 + l + sovTypes(uint64(l)) } + l = len(m.Addr) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } return n } @@ -5660,17 +5937,43 @@ func (m *SecretReference) Size() (n int) { if l > 0 { n += 1 + l + sovTypes(uint64(l)) } - if m.Mode != 0 { - n += 1 + sovTypes(uint64(m.Mode)) - } - l = len(m.Target) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } l = len(m.SecretName) if l > 0 { n += 1 + l + sovTypes(uint64(l)) } + if m.Target != nil { + n += m.Target.Size() + } + return n +} + +func (m *SecretReference_File) Size() (n int) { + var l int + _ = l + if m.File != nil { + l = m.File.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} +func (m *SecretReference_FileTarget) Size() (n int) { + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.UID) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.GID) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if m.Mode != 0 { + n += 1 + sovTypes(uint64(m.Mode)) + } return n } @@ -5707,6 +6010,23 @@ func (m *HealthConfig) Size() (n int) { return n } +func (m *MaybeEncryptedRecord) Size() (n int) { + var l int + _ = l + if m.Algorithm != 0 { + n += 1 + sovTypes(uint64(m.Algorithm)) + } + l = len(m.Data) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.Nonce) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + func sovTypes(x uint64) (n int) { for { n++ @@ -5849,6 +6169,7 @@ func (this *NodeStatus) String() string { s := strings.Join([]string{`&NodeStatus{`, `State:` + fmt.Sprintf("%v", this.State) + `,`, `Message:` + fmt.Sprintf("%v", this.Message) + `,`, + `Addr:` + fmt.Sprintf("%v", this.Addr) + `,`, `}`, }, "") return s @@ -6314,9 +6635,31 @@ func (this *SecretReference) String() string { } s := strings.Join([]string{`&SecretReference{`, `SecretID:` + fmt.Sprintf("%v", this.SecretID) + `,`, - `Mode:` + fmt.Sprintf("%v", this.Mode) + `,`, - `Target:` + fmt.Sprintf("%v", this.Target) + `,`, `SecretName:` + fmt.Sprintf("%v", this.SecretName) + `,`, + `Target:` + fmt.Sprintf("%v", this.Target) + `,`, + `}`, + }, "") + return s +} +func (this *SecretReference_File) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&SecretReference_File{`, + `File:` + strings.Replace(fmt.Sprintf("%v", this.File), "SecretReference_FileTarget", "SecretReference_FileTarget", 1) + `,`, + `}`, + }, "") + return s +} +func (this *SecretReference_FileTarget) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&SecretReference_FileTarget{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `UID:` + fmt.Sprintf("%v", this.UID) + `,`, + `GID:` + fmt.Sprintf("%v", this.GID) + `,`, + `Mode:` + fmt.Sprintf("%v", this.Mode) + `,`, `}`, }, "") return s @@ -6344,6 +6687,18 @@ func (this *HealthConfig) String() string { }, "") return s } +func (this *MaybeEncryptedRecord) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&MaybeEncryptedRecord{`, + `Algorithm:` + fmt.Sprintf("%v", this.Algorithm) + `,`, + `Data:` + fmt.Sprintf("%v", this.Data) + `,`, + `Nonce:` + fmt.Sprintf("%v", this.Nonce) + `,`, + `}`, + }, "") + return s +} func valueToStringTypes(v interface{}) string { rv := reflect.ValueOf(v) if rv.IsNil() { @@ -7635,6 +7990,35 @@ func (m *NodeStatus) Unmarshal(data []byte) error { } m.Message = string(data[iNdEx:postIndex]) iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Addr", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + 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 ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Addr = string(data[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(data[iNdEx:]) @@ -12357,54 +12741,6 @@ func (m *SecretReference) Unmarshal(data []byte) error { m.SecretID = string(data[iNdEx:postIndex]) iNdEx = postIndex case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Mode", wireType) - } - m.Mode = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := data[iNdEx] - iNdEx++ - m.Mode |= (SecretReference_Mode(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Target", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - 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 ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Target = string(data[iNdEx:postIndex]) - iNdEx = postIndex - case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field SecretName", wireType) } @@ -12433,6 +12769,194 @@ func (m *SecretReference) Unmarshal(data []byte) error { } m.SecretName = string(data[iNdEx:postIndex]) iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field File", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &SecretReference_FileTarget{} + if err := v.Unmarshal(data[iNdEx:postIndex]); err != nil { + return err + } + m.Target = &SecretReference_File{v} + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(data[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SecretReference_FileTarget) 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 ErrIntOverflowTypes + } + 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: FileTarget: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: FileTarget: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + 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 ErrIntOverflowTypes + } + 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 ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(data[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + 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 ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.UID = string(data[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + 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 ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.GID = string(data[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Mode", wireType) + } + m.Mode = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + m.Mode |= (os.FileMode(b) & 0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipTypes(data[iNdEx:]) @@ -12701,6 +13225,137 @@ func (m *HealthConfig) Unmarshal(data []byte) error { } return nil } +func (m *MaybeEncryptedRecord) 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 ErrIntOverflowTypes + } + 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: MaybeEncryptedRecord: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MaybeEncryptedRecord: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Algorithm", wireType) + } + m.Algorithm = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + m.Algorithm |= (MaybeEncryptedRecord_Algorithm(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = append(m.Data[:0], data[iNdEx:postIndex]...) + if m.Data == nil { + m.Data = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Nonce", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Nonce = append(m.Nonce[:0], data[iNdEx:postIndex]...) + if m.Nonce == nil { + m.Nonce = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(data[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipTypes(data []byte) (n int, err error) { l := len(data) iNdEx := 0 @@ -12809,242 +13464,251 @@ var ( func init() { proto.RegisterFile("types.proto", fileDescriptorTypes) } var fileDescriptorTypes = []byte{ - // 3787 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xac, 0x59, 0x4d, 0x6c, 0x23, 0x47, - 0x76, 0x16, 0x7f, 0x45, 0x3e, 0x52, 0x52, 0x4f, 0xcd, 0xec, 0x58, 0x43, 0x8f, 0x25, 0xba, 0xc7, - 0xb3, 0x1e, 0xcf, 0x3a, 0xb4, 0x2d, 0x7b, 0x8d, 0x59, 0xcf, 0x66, 0xc7, 0xcd, 0x1f, 0x8d, 0xb8, - 0x23, 0x51, 0x44, 0x91, 0x9a, 0x81, 0x11, 0x20, 0x44, 0xa9, 0xbb, 0x44, 0xb5, 0xd5, 0xec, 0x66, - 0xba, 0x8b, 0xd2, 0x30, 0x41, 0x80, 0x41, 0x0e, 0x49, 0xa0, 0x53, 0xee, 0x81, 0xb0, 0x08, 0x12, - 0xe4, 0x90, 0x43, 0xae, 0x01, 0x72, 0x32, 0x72, 0xf2, 0x2d, 0x9b, 0x04, 0x08, 0x16, 0x1b, 0x64, - 0x10, 0x2b, 0xe7, 0x00, 0x7b, 0x09, 0x72, 0x48, 0x0e, 0x41, 0xfd, 0x74, 0xb3, 0xc9, 0xa1, 0x34, - 0xf2, 0xae, 0x2f, 0x64, 0xd7, 0xab, 0xef, 0xbd, 0xfa, 0x7b, 0xf5, 0xea, 0x7b, 0x55, 0x50, 0x60, - 0xe3, 0x21, 0x0d, 0x2a, 0x43, 0xdf, 0x63, 0x1e, 0x42, 0x96, 0x67, 0x1e, 0x51, 0xbf, 0x12, 0x9c, - 0x10, 0x7f, 0x70, 0x64, 0xb3, 0xca, 0xf1, 0x47, 0xa5, 0x5b, 0xcc, 0x1e, 0xd0, 0x80, 0x91, 0xc1, - 0xf0, 0x83, 0xe8, 0x4b, 0xc2, 0x4b, 0x6f, 0x58, 0x23, 0x9f, 0x30, 0xdb, 0x73, 0x3f, 0x08, 0x3f, - 0x54, 0xc5, 0x8d, 0xbe, 0xd7, 0xf7, 0xc4, 0xe7, 0x07, 0xfc, 0x4b, 0x4a, 0xf5, 0x75, 0x58, 0x7c, - 0x4a, 0xfd, 0xc0, 0xf6, 0x5c, 0x74, 0x03, 0x32, 0xb6, 0x6b, 0xd1, 0xe7, 0xab, 0x89, 0x72, 0xe2, - 0x5e, 0x1a, 0xcb, 0x82, 0xfe, 0x17, 0x09, 0x28, 0x18, 0xae, 0xeb, 0x31, 0x61, 0x2b, 0x40, 0x08, - 0xd2, 0x2e, 0x19, 0x50, 0x01, 0xca, 0x63, 0xf1, 0x8d, 0x6a, 0x90, 0x75, 0xc8, 0x3e, 0x75, 0x82, - 0xd5, 0x64, 0x39, 0x75, 0xaf, 0xb0, 0xf1, 0x83, 0xca, 0xab, 0x7d, 0xae, 0xc4, 0x8c, 0x54, 0xb6, - 0x05, 0xba, 0xe1, 0x32, 0x7f, 0x8c, 0x95, 0x6a, 0xe9, 0x47, 0x50, 0x88, 0x89, 0x91, 0x06, 0xa9, - 0x23, 0x3a, 0x56, 0xcd, 0xf0, 0x4f, 0xde, 0xbf, 0x63, 0xe2, 0x8c, 0xe8, 0x6a, 0x52, 0xc8, 0x64, - 0xe1, 0xb3, 0xe4, 0x83, 0x84, 0xfe, 0x05, 0xe4, 0x31, 0x0d, 0xbc, 0x91, 0x6f, 0xd2, 0x00, 0xbd, - 0x07, 0x79, 0x97, 0xb8, 0x5e, 0xcf, 0x1c, 0x8e, 0x02, 0xa1, 0x9e, 0xaa, 0x16, 0xcf, 0x5f, 0xae, - 0xe7, 0x5a, 0xc4, 0xf5, 0x6a, 0xed, 0xbd, 0x00, 0xe7, 0x78, 0x75, 0x6d, 0x38, 0x0a, 0xd0, 0xdb, - 0x50, 0x1c, 0xd0, 0x81, 0xe7, 0x8f, 0x7b, 0xfb, 0x63, 0x46, 0x03, 0x61, 0x38, 0x85, 0x0b, 0x52, - 0x56, 0xe5, 0x22, 0xfd, 0xcf, 0x12, 0x70, 0x23, 0xb4, 0x8d, 0xe9, 0xef, 0x8d, 0x6c, 0x9f, 0x0e, - 0xa8, 0xcb, 0x02, 0xf4, 0x43, 0xc8, 0x3a, 0xf6, 0xc0, 0x66, 0xb2, 0x8d, 0xc2, 0xc6, 0x5b, 0xf3, - 0xc6, 0x1c, 0xf5, 0x0a, 0x2b, 0x30, 0x32, 0xa0, 0xe8, 0xd3, 0x80, 0xfa, 0xc7, 0x72, 0x26, 0x44, - 0x93, 0xaf, 0x55, 0x9e, 0x52, 0xd1, 0x37, 0x21, 0xd7, 0x76, 0x08, 0x3b, 0xf0, 0xfc, 0x01, 0xd2, - 0xa1, 0x48, 0x7c, 0xf3, 0xd0, 0x66, 0xd4, 0x64, 0x23, 0x3f, 0x5c, 0x95, 0x29, 0x19, 0xba, 0x09, - 0x49, 0x4f, 0x36, 0x94, 0xaf, 0x66, 0xcf, 0x5f, 0xae, 0x27, 0x77, 0x3b, 0x38, 0xe9, 0x05, 0xfa, - 0x43, 0xb8, 0xd6, 0x76, 0x46, 0x7d, 0xdb, 0xad, 0xd3, 0xc0, 0xf4, 0xed, 0x21, 0xb7, 0xce, 0x97, - 0x97, 0x3b, 0x5f, 0xb8, 0xbc, 0xfc, 0x3b, 0x5a, 0xf2, 0xe4, 0x64, 0xc9, 0xf5, 0x3f, 0x49, 0xc2, - 0xb5, 0x86, 0xdb, 0xb7, 0x5d, 0x1a, 0xd7, 0xbe, 0x0b, 0xcb, 0x54, 0x08, 0x7b, 0xc7, 0xd2, 0xa9, - 0x94, 0x9d, 0x25, 0x29, 0x0d, 0x3d, 0xad, 0x39, 0xe3, 0x2f, 0x1f, 0xcd, 0x1b, 0xfe, 0x2b, 0xd6, - 0xe7, 0x79, 0x0d, 0x6a, 0xc0, 0xe2, 0x50, 0x0c, 0x22, 0x58, 0x4d, 0x09, 0x5b, 0x77, 0xe7, 0xd9, - 0x7a, 0x65, 0x9c, 0xd5, 0xf4, 0xd7, 0x2f, 0xd7, 0x17, 0x70, 0xa8, 0xfb, 0x9b, 0x38, 0xdf, 0x7f, - 0x26, 0x60, 0xa5, 0xe5, 0x59, 0x53, 0xf3, 0x50, 0x82, 0xdc, 0xa1, 0x17, 0xb0, 0xd8, 0x46, 0x89, - 0xca, 0xe8, 0x01, 0xe4, 0x86, 0x6a, 0xf9, 0xd4, 0xea, 0xdf, 0x9e, 0xdf, 0x65, 0x89, 0xc1, 0x11, - 0x1a, 0x3d, 0x84, 0xbc, 0x1f, 0xfa, 0xc4, 0x6a, 0xea, 0x2a, 0x8e, 0x33, 0xc1, 0xa3, 0xdf, 0x86, - 0xac, 0x5c, 0x84, 0xd5, 0xb4, 0xd0, 0xbc, 0x7b, 0xa5, 0x39, 0xc7, 0x4a, 0x49, 0xff, 0x45, 0x02, - 0x34, 0x4c, 0x0e, 0xd8, 0x0e, 0x1d, 0xec, 0x53, 0xbf, 0xc3, 0x08, 0x1b, 0x05, 0xe8, 0x26, 0x64, - 0x1d, 0x4a, 0x2c, 0xea, 0x8b, 0x41, 0xe6, 0xb0, 0x2a, 0xa1, 0x3d, 0xee, 0xe4, 0xc4, 0x3c, 0x24, - 0xfb, 0xb6, 0x63, 0xb3, 0xb1, 0x18, 0xe6, 0xf2, 0xfc, 0x55, 0x9e, 0xb5, 0x59, 0xc1, 0x31, 0x45, - 0x3c, 0x65, 0x06, 0xad, 0xc2, 0xe2, 0x80, 0x06, 0x01, 0xe9, 0x53, 0x31, 0xfa, 0x3c, 0x0e, 0x8b, - 0xfa, 0x43, 0x28, 0xc6, 0xf5, 0x50, 0x01, 0x16, 0xf7, 0x5a, 0x4f, 0x5a, 0xbb, 0xcf, 0x5a, 0xda, - 0x02, 0x5a, 0x81, 0xc2, 0x5e, 0x0b, 0x37, 0x8c, 0xda, 0x96, 0x51, 0xdd, 0x6e, 0x68, 0x09, 0xb4, - 0x04, 0xf9, 0x49, 0x31, 0xa9, 0xff, 0x2c, 0x01, 0xc0, 0x17, 0x50, 0x0d, 0xea, 0x33, 0xc8, 0x04, - 0x8c, 0x30, 0xb9, 0x70, 0xcb, 0x1b, 0xef, 0xcc, 0xeb, 0xf5, 0x04, 0x5e, 0xe1, 0x7f, 0x14, 0x4b, - 0x95, 0x78, 0x0f, 0x93, 0xb3, 0x3d, 0xcc, 0x08, 0xe4, 0x74, 0xd7, 0x72, 0x90, 0xae, 0xf3, 0xaf, - 0x04, 0xca, 0x43, 0x06, 0x37, 0x8c, 0xfa, 0x17, 0x5a, 0x12, 0x69, 0x50, 0xac, 0x37, 0x3b, 0xb5, - 0xdd, 0x56, 0xab, 0x51, 0xeb, 0x36, 0xea, 0x5a, 0x4a, 0xbf, 0x0b, 0x99, 0xe6, 0x80, 0xf4, 0x29, - 0xba, 0xcd, 0x3d, 0xe0, 0x80, 0xfa, 0xd4, 0x35, 0x43, 0xc7, 0x9a, 0x08, 0xf4, 0x9f, 0xe7, 0x21, - 0xb3, 0xe3, 0x8d, 0x5c, 0x86, 0x36, 0x62, 0xbb, 0x78, 0x79, 0x63, 0x6d, 0xde, 0x10, 0x04, 0xb0, - 0xd2, 0x1d, 0x0f, 0xa9, 0xda, 0xe5, 0x37, 0x21, 0x2b, 0x7d, 0x45, 0x75, 0x5d, 0x95, 0xb8, 0x9c, - 0x11, 0xbf, 0x4f, 0x99, 0x9a, 0x74, 0x55, 0x42, 0xf7, 0x20, 0xe7, 0x53, 0x62, 0x79, 0xae, 0x33, - 0x16, 0x2e, 0x95, 0x93, 0x61, 0x16, 0x53, 0x62, 0xed, 0xba, 0xce, 0x18, 0x47, 0xb5, 0x68, 0x0b, - 0x8a, 0xfb, 0xb6, 0x6b, 0xf5, 0xbc, 0xa1, 0x8c, 0x79, 0x99, 0x8b, 0x1d, 0x50, 0xf6, 0xaa, 0x6a, - 0xbb, 0xd6, 0xae, 0x04, 0xe3, 0xc2, 0xfe, 0xa4, 0x80, 0x5a, 0xb0, 0x7c, 0xec, 0x39, 0xa3, 0x01, - 0x8d, 0x6c, 0x65, 0x85, 0xad, 0x77, 0x2f, 0xb6, 0xf5, 0x54, 0xe0, 0x43, 0x6b, 0x4b, 0xc7, 0xf1, - 0x22, 0x7a, 0x02, 0x4b, 0x6c, 0x30, 0x3c, 0x08, 0x22, 0x73, 0x8b, 0xc2, 0xdc, 0xf7, 0x2f, 0x99, - 0x30, 0x0e, 0x0f, 0xad, 0x15, 0x59, 0xac, 0x54, 0xfa, 0xa3, 0x14, 0x14, 0x62, 0x3d, 0x47, 0x1d, - 0x28, 0x0c, 0x7d, 0x6f, 0x48, 0xfa, 0x22, 0x6e, 0xab, 0xb5, 0xf8, 0xe8, 0x4a, 0xa3, 0xae, 0xb4, - 0x27, 0x8a, 0x38, 0x6e, 0x45, 0x3f, 0x4b, 0x42, 0x21, 0x56, 0x89, 0xee, 0x43, 0x0e, 0xb7, 0x71, - 0xf3, 0xa9, 0xd1, 0x6d, 0x68, 0x0b, 0xa5, 0xdb, 0xa7, 0x67, 0xe5, 0x55, 0x61, 0x2d, 0x6e, 0xa0, - 0xed, 0xdb, 0xc7, 0xdc, 0xf5, 0xee, 0xc1, 0x62, 0x08, 0x4d, 0x94, 0xde, 0x3c, 0x3d, 0x2b, 0xbf, - 0x31, 0x0b, 0x8d, 0x21, 0x71, 0x67, 0xcb, 0xc0, 0x8d, 0xba, 0x96, 0x9c, 0x8f, 0xc4, 0x9d, 0x43, - 0xe2, 0x53, 0x0b, 0x7d, 0x1f, 0xb2, 0x0a, 0x98, 0x2a, 0x95, 0x4e, 0xcf, 0xca, 0x37, 0x67, 0x81, - 0x13, 0x1c, 0xee, 0x6c, 0x1b, 0x4f, 0x1b, 0x5a, 0x7a, 0x3e, 0x0e, 0x77, 0x1c, 0x72, 0x4c, 0xd1, - 0x3b, 0x90, 0x91, 0xb0, 0x4c, 0xe9, 0xd6, 0xe9, 0x59, 0xf9, 0x7b, 0xaf, 0x98, 0xe3, 0xa8, 0xd2, - 0xea, 0x9f, 0xfe, 0xe5, 0xda, 0xc2, 0xdf, 0xff, 0xd5, 0x9a, 0x36, 0x5b, 0x5d, 0xfa, 0xbf, 0x04, - 0x2c, 0x4d, 0x2d, 0x39, 0xd2, 0x21, 0xeb, 0x7a, 0xa6, 0x37, 0x94, 0xe1, 0x3c, 0x57, 0x85, 0xf3, - 0x97, 0xeb, 0xd9, 0x96, 0x57, 0xf3, 0x86, 0x63, 0xac, 0x6a, 0xd0, 0x93, 0x99, 0x03, 0xe9, 0xe3, - 0x2b, 0xfa, 0xd3, 0xdc, 0x23, 0xe9, 0x11, 0x2c, 0x59, 0xbe, 0x7d, 0x4c, 0xfd, 0x9e, 0xe9, 0xb9, - 0x07, 0x76, 0x5f, 0x85, 0xea, 0xd2, 0x3c, 0x9b, 0x75, 0x01, 0xc4, 0x45, 0xa9, 0x50, 0x13, 0xf8, - 0xdf, 0xe0, 0x30, 0x2a, 0x3d, 0x85, 0x62, 0xdc, 0x43, 0xd1, 0x5b, 0x00, 0x81, 0xfd, 0xfb, 0x54, - 0xf1, 0x1b, 0xc1, 0x86, 0x70, 0x9e, 0x4b, 0x04, 0xbb, 0x41, 0xef, 0x42, 0x7a, 0xe0, 0x59, 0xd2, - 0x4e, 0xa6, 0x7a, 0x9d, 0x9f, 0x89, 0xbf, 0x7c, 0xb9, 0x5e, 0xf0, 0x82, 0xca, 0xa6, 0xed, 0xd0, - 0x1d, 0xcf, 0xa2, 0x58, 0x00, 0xf4, 0x63, 0x48, 0xf3, 0x50, 0x81, 0xde, 0x84, 0x74, 0xb5, 0xd9, - 0xaa, 0x6b, 0x0b, 0xa5, 0x6b, 0xa7, 0x67, 0xe5, 0x25, 0x31, 0x25, 0xbc, 0x82, 0xfb, 0x2e, 0x5a, - 0x87, 0xec, 0xd3, 0xdd, 0xed, 0xbd, 0x1d, 0xee, 0x5e, 0xd7, 0x4f, 0xcf, 0xca, 0x2b, 0x51, 0xb5, - 0x9c, 0x34, 0xf4, 0x16, 0x64, 0xba, 0x3b, 0xed, 0xcd, 0x8e, 0x96, 0x2c, 0xa1, 0xd3, 0xb3, 0xf2, - 0x72, 0x54, 0x2f, 0xfa, 0x5c, 0xba, 0xa6, 0x56, 0x35, 0x1f, 0xc9, 0xf5, 0xff, 0x4d, 0xc2, 0x12, - 0xe6, 0xfc, 0xd6, 0x67, 0x6d, 0xcf, 0xb1, 0xcd, 0x31, 0x6a, 0x43, 0xde, 0xf4, 0x5c, 0xcb, 0x8e, - 0xed, 0xa9, 0x8d, 0x0b, 0x0e, 0xc1, 0x89, 0x56, 0x58, 0xaa, 0x85, 0x9a, 0x78, 0x62, 0x04, 0x6d, - 0x40, 0xc6, 0xa2, 0x0e, 0x19, 0x5f, 0x76, 0x1a, 0xd7, 0x15, 0x97, 0xc6, 0x12, 0x2a, 0x98, 0x23, - 0x79, 0xde, 0x23, 0x8c, 0xd1, 0xc1, 0x90, 0xc9, 0xd3, 0x38, 0x8d, 0x0b, 0x03, 0xf2, 0xdc, 0x50, - 0x22, 0xf4, 0x09, 0x64, 0x4f, 0x6c, 0xd7, 0xf2, 0x4e, 0xd4, 0x81, 0x7b, 0xb9, 0x5d, 0x85, 0xd5, - 0x4f, 0xf9, 0x39, 0x3b, 0xd3, 0x59, 0x3e, 0xeb, 0xad, 0xdd, 0x56, 0x23, 0x9c, 0x75, 0x55, 0xbf, - 0xeb, 0xb6, 0x3c, 0x97, 0xef, 0x18, 0xd8, 0x6d, 0xf5, 0x36, 0x8d, 0xe6, 0xf6, 0x1e, 0xe6, 0x33, - 0x7f, 0xe3, 0xf4, 0xac, 0xac, 0x45, 0x90, 0x4d, 0x62, 0x3b, 0x9c, 0x04, 0xde, 0x82, 0x94, 0xd1, - 0xfa, 0x42, 0x4b, 0x96, 0xb4, 0xd3, 0xb3, 0x72, 0x31, 0xaa, 0x36, 0xdc, 0xf1, 0x64, 0x33, 0xcd, - 0xb6, 0xab, 0xff, 0x7b, 0x12, 0x8a, 0x7b, 0x43, 0x8b, 0x30, 0x2a, 0x3d, 0x13, 0x95, 0xa1, 0x30, - 0x24, 0x3e, 0x71, 0x1c, 0xea, 0xd8, 0xc1, 0x40, 0x25, 0x0a, 0x71, 0x11, 0x7a, 0xf0, 0x2d, 0x26, - 0x53, 0x91, 0x30, 0x35, 0xa5, 0x7b, 0xb0, 0x7c, 0x20, 0x3b, 0xdb, 0x23, 0xa6, 0x58, 0xdd, 0x94, - 0x58, 0xdd, 0xca, 0x3c, 0x13, 0xf1, 0x5e, 0x55, 0xd4, 0x18, 0x0d, 0xa1, 0x85, 0x97, 0x0e, 0xe2, - 0x45, 0xf4, 0x29, 0x2c, 0x0e, 0x3c, 0xd7, 0x66, 0x9e, 0x7f, 0xa5, 0x75, 0x08, 0xc1, 0xe8, 0x3e, - 0x5c, 0xe3, 0x2b, 0x1c, 0x76, 0x49, 0x54, 0x8b, 0x93, 0x2b, 0x89, 0x57, 0x06, 0xe4, 0xb9, 0x6a, - 0x13, 0x73, 0xb1, 0xfe, 0x29, 0x2c, 0x4d, 0xf5, 0x81, 0x9f, 0xe6, 0x6d, 0x63, 0xaf, 0xd3, 0xd0, - 0x16, 0x50, 0x11, 0x72, 0xb5, 0xdd, 0x56, 0xb7, 0xd9, 0xda, 0xe3, 0xd4, 0xa3, 0x08, 0x39, 0xbc, - 0xbb, 0xbd, 0x5d, 0x35, 0x6a, 0x4f, 0xb4, 0xa4, 0xfe, 0xdf, 0xd1, 0xfc, 0x2a, 0xee, 0x51, 0x9d, - 0xe6, 0x1e, 0xef, 0x5f, 0x3c, 0x74, 0xc5, 0x3e, 0x26, 0x85, 0x88, 0x83, 0xfc, 0x18, 0x40, 0x2c, - 0x23, 0xb5, 0x7a, 0x84, 0x5d, 0x96, 0x5f, 0x74, 0xc3, 0xcc, 0x11, 0xe7, 0x95, 0x82, 0xc1, 0xd0, - 0xe7, 0x50, 0x34, 0xbd, 0xc1, 0xd0, 0xa1, 0x4a, 0x3f, 0x75, 0x15, 0xfd, 0x42, 0xa4, 0x62, 0xb0, - 0x38, 0x07, 0x4a, 0x4f, 0x73, 0xa0, 0x3f, 0x4e, 0x40, 0x21, 0xd6, 0xe1, 0x69, 0x2a, 0x54, 0x84, - 0xdc, 0x5e, 0xbb, 0x6e, 0x74, 0x9b, 0xad, 0xc7, 0x5a, 0x02, 0x01, 0x64, 0xc5, 0x04, 0xd6, 0xb5, - 0x24, 0xa7, 0x6b, 0xb5, 0xdd, 0x9d, 0xf6, 0x76, 0x43, 0x90, 0x21, 0x74, 0x03, 0xb4, 0x70, 0x0a, - 0x7b, 0x9d, 0xae, 0x81, 0xb9, 0x34, 0x8d, 0xae, 0xc3, 0x4a, 0x24, 0x55, 0x9a, 0x19, 0x74, 0x13, - 0x50, 0x24, 0x9c, 0x98, 0xc8, 0xea, 0x7f, 0x08, 0x2b, 0x35, 0xcf, 0x65, 0xc4, 0x76, 0x23, 0x2a, - 0xbb, 0xc1, 0xc7, 0xad, 0x44, 0x3d, 0xdb, 0x92, 0xd1, 0xb6, 0xba, 0x72, 0xfe, 0x72, 0xbd, 0x10, - 0x41, 0x9b, 0x75, 0x3e, 0xd2, 0xb0, 0x60, 0xf1, 0x3d, 0x35, 0xb4, 0x2d, 0x15, 0x3c, 0x17, 0xcf, - 0x5f, 0xae, 0xa7, 0xda, 0xcd, 0x3a, 0xe6, 0x32, 0xf4, 0x26, 0xe4, 0xe9, 0x73, 0x9b, 0xf5, 0x4c, - 0x1e, 0x5d, 0xf9, 0x1c, 0x66, 0x70, 0x8e, 0x0b, 0x6a, 0x3c, 0x98, 0x56, 0x01, 0xda, 0x9e, 0xcf, - 0x54, 0xcb, 0x9f, 0x40, 0x66, 0xe8, 0xf9, 0x22, 0x8f, 0xe4, 0x47, 0xcf, 0x5c, 0xb2, 0xc6, 0xe1, - 0xd2, 0xd9, 0xb1, 0x04, 0xeb, 0xff, 0x90, 0x04, 0xe8, 0x92, 0xe0, 0x48, 0x19, 0x79, 0x08, 0xf9, - 0xe8, 0x22, 0xe0, 0xb2, 0x84, 0x34, 0xb6, 0xe6, 0x11, 0x1e, 0x7d, 0x1c, 0x7a, 0x9d, 0xe4, 0xe9, - 0xf3, 0x15, 0x55, 0x5b, 0xf3, 0xa8, 0xee, 0x34, 0x19, 0xe7, 0xe7, 0x15, 0xf5, 0x7d, 0xb5, 0xf8, - 0xfc, 0x13, 0xd5, 0x44, 0xcc, 0x96, 0xf3, 0xa6, 0xd8, 0xdf, 0x9d, 0x79, 0x8d, 0xcc, 0x2c, 0xca, - 0xd6, 0x02, 0x9e, 0xe8, 0xa1, 0x47, 0x50, 0xe0, 0x43, 0xef, 0x05, 0xa2, 0x4e, 0x11, 0xbf, 0x0b, - 0x67, 0x4b, 0x5a, 0xc0, 0x30, 0x8c, 0xbe, 0xab, 0x1a, 0x2c, 0xfb, 0x23, 0x97, 0x0f, 0x5b, 0xd9, - 0xd0, 0x6d, 0x78, 0xa3, 0x45, 0xd9, 0x89, 0xe7, 0x1f, 0x19, 0x8c, 0x11, 0xf3, 0x90, 0x67, 0xf6, - 0x2a, 0xd2, 0x4d, 0x58, 0x6f, 0x62, 0x8a, 0xf5, 0xae, 0xc2, 0x22, 0x71, 0x6c, 0x12, 0x50, 0x49, - 0x15, 0xf2, 0x38, 0x2c, 0x72, 0x6e, 0x4e, 0x2c, 0xcb, 0xa7, 0x41, 0x40, 0x65, 0x2e, 0x9a, 0xc7, - 0x13, 0x81, 0xfe, 0x2f, 0x49, 0x80, 0x66, 0xdb, 0xd8, 0x51, 0xe6, 0xeb, 0x90, 0x3d, 0x20, 0x03, - 0xdb, 0x19, 0x5f, 0xb6, 0xd3, 0x27, 0xf8, 0x8a, 0x21, 0x0d, 0x6d, 0x0a, 0x1d, 0xac, 0x74, 0x05, - 0x65, 0x1f, 0xed, 0xbb, 0x94, 0x45, 0x94, 0x5d, 0x94, 0x38, 0x3f, 0xf0, 0x89, 0x1b, 0xad, 0x8c, - 0x2c, 0xf0, 0xae, 0xf7, 0x09, 0xa3, 0x27, 0x64, 0x1c, 0x6e, 0x4c, 0x55, 0x44, 0x5b, 0x9c, 0xca, - 0x07, 0xd4, 0x3f, 0xa6, 0xd6, 0x6a, 0x46, 0x78, 0xe1, 0xeb, 0xfa, 0x83, 0x15, 0x5c, 0x32, 0x9f, - 0x48, 0xbb, 0xf4, 0x50, 0x1c, 0xd7, 0x93, 0xaa, 0x6f, 0x95, 0x49, 0x7f, 0x08, 0x4b, 0x53, 0xe3, - 0x7c, 0x25, 0x57, 0x6a, 0xb6, 0x9f, 0x7e, 0xa2, 0xa5, 0xd5, 0xd7, 0xa7, 0x5a, 0x56, 0xff, 0x9b, - 0x94, 0xdc, 0x4a, 0x6a, 0x56, 0xe7, 0xdf, 0x4d, 0xe5, 0xc4, 0x4d, 0x97, 0xe9, 0x39, 0xca, 0xbf, - 0xdf, 0xbd, 0x7c, 0x87, 0x71, 0xee, 0x2d, 0xe0, 0x38, 0x52, 0x44, 0xeb, 0x50, 0x90, 0xeb, 0xdf, - 0xe3, 0xfe, 0x24, 0xa6, 0x75, 0x09, 0x83, 0x14, 0x71, 0x4d, 0x74, 0x17, 0x96, 0x87, 0xa3, 0x7d, - 0xc7, 0x0e, 0x0e, 0xa9, 0x25, 0x31, 0x69, 0x81, 0x59, 0x8a, 0xa4, 0x02, 0xb6, 0x03, 0x45, 0x25, - 0xe8, 0x09, 0xde, 0x95, 0x11, 0x1d, 0xba, 0xff, 0xba, 0x0e, 0x49, 0x15, 0x41, 0xc7, 0x0a, 0xc3, - 0x49, 0x41, 0xaf, 0x43, 0x2e, 0xec, 0x2c, 0x5a, 0x85, 0x54, 0xb7, 0xd6, 0xd6, 0x16, 0x4a, 0x2b, - 0xa7, 0x67, 0xe5, 0x42, 0x28, 0xee, 0xd6, 0xda, 0xbc, 0x66, 0xaf, 0xde, 0xd6, 0x12, 0xd3, 0x35, - 0x7b, 0xf5, 0x76, 0x29, 0xcd, 0x4f, 0x7e, 0xfd, 0x00, 0x0a, 0xb1, 0x16, 0xd0, 0x1d, 0x58, 0x6c, - 0xb6, 0x1e, 0xe3, 0x46, 0xa7, 0xa3, 0x2d, 0x94, 0x6e, 0x9e, 0x9e, 0x95, 0x51, 0xac, 0xb6, 0xe9, - 0xf6, 0xf9, 0xfa, 0xa0, 0xb7, 0x20, 0xbd, 0xb5, 0xdb, 0xe9, 0x86, 0x44, 0x2f, 0x86, 0xd8, 0xf2, - 0x02, 0x56, 0xba, 0xae, 0x28, 0x45, 0xdc, 0xb0, 0xfe, 0xe7, 0x09, 0xc8, 0x4a, 0xbe, 0x3b, 0x77, - 0xa1, 0x0c, 0x58, 0x0c, 0xb3, 0x30, 0x49, 0xc2, 0xdf, 0xbd, 0x98, 0x30, 0x57, 0x14, 0xbf, 0x95, - 0xee, 0x17, 0xea, 0x95, 0x3e, 0x83, 0x62, 0xbc, 0xe2, 0x5b, 0x39, 0xdf, 0x1f, 0x40, 0x81, 0xfb, - 0x77, 0x48, 0x9c, 0x37, 0x20, 0x2b, 0x39, 0xb9, 0x8a, 0xa6, 0x97, 0xb1, 0x77, 0x85, 0x44, 0x0f, - 0x60, 0x51, 0x32, 0xfe, 0xf0, 0x2e, 0x6a, 0xed, 0xf2, 0x5d, 0x84, 0x43, 0xb8, 0xfe, 0x08, 0xd2, - 0x6d, 0x4a, 0x7d, 0x3e, 0xf7, 0xae, 0x67, 0xd1, 0xc9, 0x01, 0xa4, 0x92, 0x15, 0x8b, 0x36, 0xeb, - 0x3c, 0x59, 0xb1, 0x68, 0xd3, 0xe2, 0x93, 0xc7, 0xe3, 0x4a, 0x78, 0x1d, 0xc7, 0xbf, 0xf5, 0x2e, - 0x14, 0x9f, 0x51, 0xbb, 0x7f, 0xc8, 0xa8, 0x25, 0x0c, 0xbd, 0x0f, 0xe9, 0x21, 0x8d, 0x3a, 0xbf, - 0x3a, 0xd7, 0xc1, 0x28, 0xf5, 0xb1, 0x40, 0xf1, 0x38, 0x72, 0x22, 0xb4, 0xd5, 0x0d, 0xa8, 0x2a, - 0xe9, 0xff, 0x9c, 0x84, 0xe5, 0x66, 0x10, 0x8c, 0x88, 0x6b, 0x86, 0x0c, 0xe5, 0x27, 0xd3, 0x0c, - 0xe5, 0xde, 0xdc, 0x11, 0x4e, 0xa9, 0x4c, 0xdf, 0x90, 0xa8, 0xc3, 0x21, 0x19, 0x1d, 0x0e, 0xfa, - 0x7f, 0x25, 0xc2, 0xab, 0x91, 0xbb, 0xb1, 0xed, 0x5e, 0x5a, 0x3d, 0x3d, 0x2b, 0xdf, 0x88, 0x5b, - 0xa2, 0x7b, 0xee, 0x91, 0xeb, 0x9d, 0xb8, 0xe8, 0x6d, 0xc8, 0xe0, 0x46, 0xab, 0xf1, 0x4c, 0x4b, - 0x48, 0xf7, 0x9c, 0x02, 0x61, 0xea, 0xd2, 0x13, 0x6e, 0xa9, 0xdd, 0x68, 0xd5, 0x39, 0x97, 0x48, - 0xce, 0xb1, 0xd4, 0xa6, 0xae, 0x65, 0xbb, 0x7d, 0x74, 0x07, 0xb2, 0xcd, 0x4e, 0x67, 0x4f, 0x24, - 0xaf, 0x6f, 0x9c, 0x9e, 0x95, 0xaf, 0x4f, 0xa1, 0x78, 0x81, 0x5a, 0x1c, 0xc4, 0xc9, 0x35, 0x67, - 0x19, 0x73, 0x40, 0x9c, 0xf7, 0x49, 0x10, 0xde, 0xed, 0xf2, 0xcc, 0x3a, 0x33, 0x07, 0x84, 0x3d, - 0xfe, 0xab, 0xb6, 0xdb, 0xbf, 0x25, 0x41, 0x33, 0x4c, 0x93, 0x0e, 0x19, 0xaf, 0x57, 0x59, 0x4d, - 0x17, 0x72, 0x43, 0xfe, 0x65, 0xd3, 0x90, 0x07, 0x3c, 0x98, 0x7b, 0x87, 0x3e, 0xa3, 0x57, 0xc1, - 0x9e, 0x43, 0x0d, 0x6b, 0x60, 0x07, 0x01, 0xcf, 0xde, 0x85, 0x0c, 0x47, 0x96, 0x4a, 0xbf, 0x4a, - 0xc0, 0xf5, 0x39, 0x08, 0xf4, 0x21, 0xa4, 0x7d, 0xcf, 0x09, 0xd7, 0xf0, 0xf6, 0x45, 0x37, 0x5c, - 0x5c, 0x15, 0x0b, 0x24, 0x5a, 0x03, 0x20, 0x23, 0xe6, 0x11, 0xd1, 0xbe, 0x58, 0xbd, 0x1c, 0x8e, - 0x49, 0xd0, 0x33, 0xc8, 0x06, 0xd4, 0xf4, 0x69, 0x48, 0x18, 0x1f, 0xfd, 0xba, 0xbd, 0xaf, 0x74, - 0x84, 0x19, 0xac, 0xcc, 0x95, 0x2a, 0x90, 0x95, 0x12, 0xee, 0xf6, 0x16, 0x61, 0x44, 0x74, 0xba, - 0x88, 0xc5, 0x37, 0xf7, 0x26, 0xe2, 0xf4, 0x43, 0x6f, 0x22, 0x4e, 0x5f, 0xff, 0x59, 0x12, 0xa0, - 0xf1, 0x9c, 0x51, 0xdf, 0x25, 0x4e, 0xcd, 0x40, 0x8d, 0x58, 0xf4, 0x97, 0xa3, 0x7d, 0x6f, 0xee, - 0xbd, 0x67, 0xa4, 0x51, 0xa9, 0x19, 0x73, 0xe2, 0xff, 0x2d, 0x48, 0x8d, 0x7c, 0x47, 0xdd, 0xa1, - 0x0b, 0xa6, 0xb7, 0x87, 0xb7, 0x31, 0x97, 0xa1, 0xc6, 0x24, 0x6c, 0xa5, 0x2e, 0x7e, 0xfc, 0x88, - 0x35, 0xf0, 0xdd, 0x87, 0xae, 0xf7, 0x01, 0x26, 0xbd, 0x46, 0x6b, 0x90, 0xa9, 0x6d, 0x76, 0x3a, - 0xdb, 0xda, 0x82, 0x8c, 0xcd, 0x93, 0x2a, 0x21, 0xd6, 0xff, 0x3a, 0x01, 0xb9, 0x9a, 0xa1, 0x4e, - 0xcc, 0x4d, 0xd0, 0x44, 0xc0, 0x31, 0xa9, 0xcf, 0x7a, 0xf4, 0xf9, 0xd0, 0xf6, 0xc7, 0x2a, 0x66, - 0x5c, 0x9e, 0x26, 0x2d, 0x73, 0xad, 0x1a, 0xf5, 0x59, 0x43, 0xe8, 0x20, 0x0c, 0x45, 0xaa, 0x86, - 0xd8, 0x33, 0x49, 0x18, 0xc1, 0xd7, 0x2e, 0x9f, 0x0a, 0x49, 0xaf, 0x27, 0xe5, 0x00, 0x17, 0x42, - 0x23, 0x35, 0x12, 0xe8, 0x4f, 0xe1, 0xfa, 0xae, 0x6f, 0x1e, 0xd2, 0x80, 0xc9, 0x46, 0x55, 0x97, - 0x1f, 0xc1, 0x6d, 0x46, 0x82, 0xa3, 0xde, 0xa1, 0x1d, 0x30, 0xcf, 0x1f, 0xf7, 0x7c, 0xca, 0xa8, - 0xcb, 0xeb, 0x7b, 0xe2, 0x89, 0x45, 0x5d, 0x72, 0xdc, 0xe2, 0x98, 0x2d, 0x09, 0xc1, 0x21, 0x62, - 0x9b, 0x03, 0xf4, 0x26, 0x14, 0x39, 0x9b, 0xad, 0xd3, 0x03, 0x32, 0x72, 0x58, 0x80, 0x7e, 0x04, - 0xe0, 0x78, 0xfd, 0xde, 0x95, 0xc3, 0x7d, 0xde, 0xf1, 0xfa, 0xf2, 0x53, 0xff, 0x1d, 0xd0, 0xea, - 0x76, 0x30, 0x24, 0xcc, 0x3c, 0x0c, 0x6f, 0x6f, 0xd0, 0x63, 0xd0, 0x0e, 0x29, 0xf1, 0xd9, 0x3e, - 0x25, 0xac, 0x37, 0xa4, 0xbe, 0xed, 0x59, 0x57, 0x9a, 0xd2, 0x95, 0x48, 0xab, 0x2d, 0x94, 0xf4, - 0xff, 0x49, 0x00, 0x60, 0x72, 0x10, 0x92, 0x9b, 0x1f, 0xc0, 0xb5, 0xc0, 0x25, 0xc3, 0xe0, 0xd0, - 0x63, 0x3d, 0xdb, 0x65, 0xd4, 0x3f, 0x26, 0x8e, 0xca, 0xc0, 0xb5, 0xb0, 0xa2, 0xa9, 0xe4, 0xe8, - 0x7d, 0x40, 0x47, 0x94, 0x0e, 0x7b, 0x9e, 0x63, 0xf5, 0xc2, 0x4a, 0xf9, 0x06, 0x94, 0xc6, 0x1a, - 0xaf, 0xd9, 0x75, 0xac, 0x4e, 0x28, 0x47, 0x55, 0x58, 0xe3, 0x33, 0x40, 0x5d, 0xe6, 0xdb, 0x34, - 0xe8, 0x1d, 0x78, 0x7e, 0x2f, 0x70, 0xbc, 0x93, 0xde, 0x81, 0xe7, 0x38, 0xde, 0x09, 0xf5, 0xc3, - 0xfb, 0x8d, 0x92, 0xe3, 0xf5, 0x1b, 0x12, 0xb4, 0xe9, 0xf9, 0x1d, 0xc7, 0x3b, 0xd9, 0x0c, 0x11, - 0x9c, 0x01, 0x4d, 0x86, 0xcd, 0x6c, 0xf3, 0x28, 0x64, 0x40, 0x91, 0xb4, 0x6b, 0x9b, 0x47, 0xe8, - 0x0e, 0x2c, 0x51, 0x87, 0x8a, 0x2c, 0x59, 0xa2, 0x32, 0x02, 0x55, 0x0c, 0x85, 0x1c, 0xa4, 0xff, - 0x16, 0xe4, 0xdb, 0x0e, 0x31, 0xc5, 0x4b, 0x1b, 0x2a, 0x03, 0x4f, 0xba, 0xb8, 0x13, 0xd8, 0xae, - 0xca, 0x92, 0xf2, 0x38, 0x2e, 0xd2, 0x7f, 0x02, 0xf0, 0x53, 0xcf, 0x76, 0xbb, 0xde, 0x11, 0x75, - 0xc5, 0xa3, 0x04, 0x67, 0xf4, 0x6a, 0x29, 0xf3, 0x58, 0x95, 0x44, 0xc2, 0x42, 0x5c, 0xd2, 0xa7, - 0x7e, 0x74, 0x37, 0x2f, 0x8b, 0xfa, 0xd7, 0x09, 0xc8, 0x62, 0xcf, 0x63, 0x35, 0x03, 0x95, 0x21, - 0x6b, 0x92, 0x5e, 0xb8, 0xf3, 0x8a, 0xd5, 0xfc, 0xf9, 0xcb, 0xf5, 0x4c, 0xcd, 0x78, 0x42, 0xc7, - 0x38, 0x63, 0x92, 0x27, 0x74, 0xcc, 0x8f, 0x68, 0x93, 0x88, 0xfd, 0x22, 0xcc, 0x14, 0xe5, 0x11, - 0x5d, 0x33, 0xf8, 0x66, 0xc0, 0x59, 0x93, 0xf0, 0x7f, 0xf4, 0x21, 0x14, 0x15, 0xa8, 0x77, 0x48, - 0x82, 0x43, 0xc9, 0xc3, 0xab, 0xcb, 0xe7, 0x2f, 0xd7, 0x41, 0x22, 0xb7, 0x48, 0x70, 0x88, 0x41, - 0xa2, 0xf9, 0x37, 0x6a, 0x40, 0xe1, 0x4b, 0xcf, 0x76, 0x7b, 0x4c, 0x0c, 0x42, 0x5d, 0x55, 0xcc, - 0xdd, 0x3f, 0x93, 0xa1, 0xaa, 0xfb, 0x13, 0xf8, 0x32, 0x92, 0xe8, 0xff, 0x9a, 0x80, 0x02, 0xb7, - 0x69, 0x1f, 0xd8, 0x26, 0x3f, 0x52, 0xbf, 0x7d, 0xa4, 0xbf, 0x05, 0x29, 0x33, 0xf0, 0xd5, 0xd8, - 0x44, 0xa8, 0xab, 0x75, 0x30, 0xe6, 0x32, 0xf4, 0x39, 0x64, 0x55, 0xf2, 0x25, 0x83, 0xbc, 0xfe, - 0xfa, 0xc3, 0x5f, 0x75, 0x51, 0xe9, 0x89, 0xb5, 0x9c, 0xf4, 0x4e, 0x8c, 0xb2, 0x88, 0xe3, 0x22, - 0x74, 0x13, 0x92, 0xa6, 0x2b, 0x9c, 0x42, 0x3d, 0x56, 0xd6, 0x5a, 0x38, 0x69, 0xba, 0xfa, 0x3f, - 0x25, 0x60, 0xa9, 0xe1, 0x9a, 0xfe, 0x58, 0x04, 0x49, 0xbe, 0x10, 0xb7, 0x21, 0x1f, 0x8c, 0xf6, - 0x83, 0x71, 0xc0, 0xe8, 0x20, 0x7c, 0x0b, 0x89, 0x04, 0xa8, 0x09, 0x79, 0xe2, 0xf4, 0x3d, 0xdf, - 0x66, 0x87, 0x03, 0xc5, 0xfb, 0xe7, 0x07, 0xe6, 0xb8, 0xcd, 0x8a, 0x11, 0xaa, 0xe0, 0x89, 0x76, - 0x18, 0x8a, 0x53, 0xa2, 0xb3, 0x22, 0x14, 0xbf, 0x0d, 0x45, 0x87, 0x0c, 0x44, 0x36, 0xca, 0xd3, - 0x49, 0x31, 0x8e, 0x34, 0x2e, 0x28, 0x19, 0xcf, 0xb1, 0x75, 0x1d, 0xf2, 0x91, 0x31, 0xb4, 0x02, - 0x05, 0xa3, 0xd1, 0xe9, 0x7d, 0xb4, 0xf1, 0xa0, 0xf7, 0xb8, 0xb6, 0xa3, 0x2d, 0x28, 0x26, 0xf0, - 0x77, 0x09, 0x58, 0xda, 0x91, 0x3e, 0xa8, 0xd8, 0xd5, 0x1d, 0x58, 0xf4, 0xc9, 0x01, 0x0b, 0xf9, - 0x5f, 0x5a, 0x3a, 0x17, 0x0f, 0x02, 0x9c, 0xff, 0xf1, 0xaa, 0xf9, 0xfc, 0x2f, 0xf6, 0x12, 0x97, - 0xba, 0xf4, 0x25, 0x2e, 0xfd, 0x9d, 0xbc, 0xc4, 0xe9, 0xbf, 0x4c, 0xc0, 0x8a, 0x3a, 0xa8, 0xc3, - 0xd7, 0x27, 0xf4, 0x1e, 0xe4, 0xe5, 0x99, 0x3d, 0x61, 0xaf, 0xe2, 0x41, 0x48, 0xe2, 0x9a, 0x75, - 0x9c, 0x93, 0xd5, 0x4d, 0x0b, 0xfd, 0x38, 0x76, 0xed, 0x7c, 0x01, 0x87, 0x9c, 0xb1, 0x5e, 0x99, - 0xdc, 0x45, 0x5f, 0xf8, 0x20, 0xb5, 0x0e, 0x05, 0xd5, 0x01, 0x91, 0x5b, 0xc8, 0x1c, 0x17, 0xa4, - 0xa8, 0x45, 0x06, 0x54, 0xbf, 0x0b, 0x69, 0x91, 0xe1, 0x00, 0x64, 0x3b, 0x5f, 0x74, 0xba, 0x8d, - 0x1d, 0x99, 0x55, 0x6e, 0x36, 0xc5, 0xab, 0xe0, 0x22, 0xa4, 0x1a, 0xad, 0xa7, 0x5a, 0x52, 0xdf, - 0x85, 0x9b, 0x55, 0x87, 0x98, 0x47, 0x8e, 0x1d, 0x30, 0x6a, 0xc5, 0x77, 0xd3, 0x0f, 0x21, 0x3b, - 0x75, 0x46, 0xbe, 0xe6, 0x8a, 0x45, 0x81, 0xf5, 0xbf, 0x4d, 0x40, 0x71, 0x8b, 0x12, 0x87, 0x1d, - 0x4e, 0xf2, 0x54, 0x46, 0x03, 0xa6, 0x62, 0x99, 0xf8, 0x46, 0x0f, 0x20, 0x17, 0x45, 0xf5, 0xab, - 0x5c, 0x44, 0x47, 0x68, 0xf4, 0x29, 0x2c, 0x72, 0x2f, 0xf4, 0x46, 0x21, 0xf9, 0x7a, 0xcd, 0x0d, - 0xa7, 0x02, 0xf3, 0x80, 0xe8, 0x53, 0x11, 0xcc, 0xc5, 0x5c, 0x65, 0x70, 0x58, 0xbc, 0xff, 0x8f, - 0x29, 0xc8, 0x47, 0x17, 0x3e, 0x3c, 0x22, 0x70, 0xb6, 0xbd, 0x20, 0xaf, 0x8e, 0x23, 0x79, 0x8b, - 0x9e, 0xa0, 0xb7, 0x27, 0x3c, 0xfb, 0x73, 0x79, 0xf1, 0x1c, 0x55, 0x87, 0x1c, 0xfb, 0x1d, 0xc8, - 0x19, 0x9d, 0x4e, 0xf3, 0x71, 0xab, 0x51, 0xd7, 0xbe, 0x4a, 0x94, 0xbe, 0x77, 0x7a, 0x56, 0xbe, - 0x16, 0x81, 0x8c, 0x20, 0xb0, 0xfb, 0x2e, 0xb5, 0x04, 0xaa, 0x56, 0x6b, 0xb4, 0xbb, 0x8d, 0xba, - 0xf6, 0x22, 0x39, 0x8b, 0x12, 0xbc, 0x51, 0x3c, 0x22, 0xe5, 0xdb, 0xb8, 0xd1, 0x36, 0x30, 0x6f, - 0xf0, 0xab, 0xa4, 0xa4, 0xff, 0x93, 0x16, 0x7d, 0x3a, 0x24, 0x3e, 0x6f, 0x73, 0x2d, 0x7c, 0x4c, - 0x7d, 0x91, 0x92, 0x0f, 0x0d, 0x93, 0xdb, 0x2b, 0x4a, 0xac, 0x31, 0x6f, 0x4d, 0xdc, 0x1c, 0x0a, - 0x33, 0xa9, 0x99, 0xd6, 0x3a, 0x8c, 0xf8, 0x8c, 0x5b, 0xd1, 0x61, 0x11, 0xef, 0xb5, 0x5a, 0x1c, - 0xf4, 0x22, 0x3d, 0x33, 0x3a, 0x3c, 0x72, 0x5d, 0x8e, 0xb9, 0x0b, 0xb9, 0xf0, 0x62, 0x51, 0xfb, - 0x2a, 0x3d, 0xd3, 0xa1, 0x5a, 0x78, 0x2b, 0x2a, 0x1a, 0xdc, 0xda, 0xeb, 0x8a, 0xb7, 0xde, 0x17, - 0x99, 0xd9, 0x06, 0x0f, 0x47, 0xcc, 0xe2, 0x89, 0x4d, 0x39, 0xca, 0x34, 0xbe, 0xca, 0x48, 0xee, - 0x16, 0x61, 0x54, 0x9a, 0xf1, 0x0e, 0xe4, 0x70, 0xe3, 0xa7, 0xf2, 0x59, 0xf8, 0x45, 0x76, 0xc6, - 0x0e, 0xa6, 0x5f, 0x52, 0x93, 0x51, 0x6b, 0xf2, 0x8e, 0x12, 0x55, 0xdd, 0xff, 0x5d, 0xc8, 0x85, - 0x71, 0x1e, 0xad, 0x41, 0xf6, 0xd9, 0x2e, 0x7e, 0xd2, 0xc0, 0xda, 0x82, 0x9c, 0x9d, 0xb0, 0xe6, - 0x99, 0x3c, 0x28, 0xcb, 0xb0, 0xb8, 0x63, 0xb4, 0x8c, 0xc7, 0x0d, 0x1c, 0xa6, 0xf7, 0x21, 0x40, - 0x05, 0xab, 0x92, 0xa6, 0x1a, 0x88, 0x6c, 0x56, 0x6f, 0x7f, 0xfd, 0xcd, 0xda, 0xc2, 0x2f, 0xbe, - 0x59, 0x5b, 0xf8, 0xd5, 0x37, 0x6b, 0x89, 0x17, 0xe7, 0x6b, 0x89, 0xaf, 0xcf, 0xd7, 0x12, 0x3f, - 0x3f, 0x5f, 0x4b, 0xfc, 0xc7, 0xf9, 0x5a, 0x62, 0x3f, 0x2b, 0x88, 0xf4, 0xc7, 0xff, 0x1f, 0x00, - 0x00, 0xff, 0xff, 0x24, 0x7a, 0x55, 0x47, 0xd8, 0x24, 0x00, 0x00, + // 3932 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xac, 0x79, 0x4d, 0x6c, 0x1b, 0x49, + 0x76, 0xbf, 0xf8, 0x29, 0xf2, 0x91, 0x92, 0xda, 0x65, 0xaf, 0x47, 0xe6, 0x78, 0x24, 0x4e, 0x7b, + 0xbc, 0xe3, 0xf1, 0xce, 0x9f, 0x63, 0x6b, 0x3e, 0xe0, 0x1d, 0xff, 0xb3, 0x9e, 0xe6, 0x87, 0x2c, + 0xae, 0x25, 0x92, 0x28, 0x52, 0x76, 0x06, 0x01, 0x42, 0x94, 0xba, 0x4b, 0x54, 0x8f, 0x9a, 0xdd, + 0x4c, 0x77, 0x51, 0x32, 0x13, 0x04, 0x31, 0x72, 0x48, 0x02, 0x9d, 0x72, 0x0f, 0x84, 0x20, 0x48, + 0x90, 0x43, 0x0e, 0x7b, 0xc9, 0x21, 0x40, 0x4e, 0x83, 0x9c, 0xe6, 0x96, 0x4d, 0x02, 0x04, 0x8b, + 0x04, 0x31, 0x32, 0xca, 0x39, 0xc0, 0x5e, 0x82, 0x1c, 0x92, 0x00, 0x41, 0x7d, 0x74, 0xb3, 0x29, + 0xd3, 0xb2, 0x26, 0xbb, 0x17, 0xb2, 0xeb, 0xd5, 0xef, 0xbd, 0xfa, 0x7a, 0x55, 0xf5, 0x7b, 0xaf, + 0xa0, 0xc0, 0x26, 0x23, 0x1a, 0x54, 0x46, 0xbe, 0xc7, 0x3c, 0x84, 0x2c, 0xcf, 0x3c, 0xa4, 0x7e, + 0x25, 0x38, 0x26, 0xfe, 0xf0, 0xd0, 0x66, 0x95, 0xa3, 0xfb, 0xa5, 0x1b, 0xcc, 0x1e, 0xd2, 0x80, + 0x91, 0xe1, 0xe8, 0xa3, 0xe8, 0x4b, 0xc2, 0x4b, 0x6f, 0x59, 0x63, 0x9f, 0x30, 0xdb, 0x73, 0x3f, + 0x0a, 0x3f, 0x54, 0xc5, 0xb5, 0x81, 0x37, 0xf0, 0xc4, 0xe7, 0x47, 0xfc, 0x4b, 0x4a, 0xf5, 0x75, + 0x58, 0x7c, 0x4a, 0xfd, 0xc0, 0xf6, 0x5c, 0x74, 0x0d, 0x32, 0xb6, 0x6b, 0xd1, 0xe7, 0xab, 0x89, + 0x72, 0xe2, 0x4e, 0x1a, 0xcb, 0x82, 0xfe, 0x27, 0x09, 0x28, 0x18, 0xae, 0xeb, 0x31, 0x61, 0x2b, + 0x40, 0x08, 0xd2, 0x2e, 0x19, 0x52, 0x01, 0xca, 0x63, 0xf1, 0x8d, 0x6a, 0x90, 0x75, 0xc8, 0x1e, + 0x75, 0x82, 0xd5, 0x64, 0x39, 0x75, 0xa7, 0xb0, 0xf1, 0x83, 0xca, 0xab, 0x7d, 0xae, 0xc4, 0x8c, + 0x54, 0xb6, 0x05, 0xba, 0xe1, 0x32, 0x7f, 0x82, 0x95, 0x6a, 0xe9, 0x87, 0x50, 0x88, 0x89, 0x91, + 0x06, 0xa9, 0x43, 0x3a, 0x51, 0xcd, 0xf0, 0x4f, 0xde, 0xbf, 0x23, 0xe2, 0x8c, 0xe9, 0x6a, 0x52, + 0xc8, 0x64, 0xe1, 0xf3, 0xe4, 0x83, 0x84, 0xfe, 0x25, 0xe4, 0x31, 0x0d, 0xbc, 0xb1, 0x6f, 0xd2, + 0x00, 0x7d, 0x00, 0x79, 0x97, 0xb8, 0x5e, 0xdf, 0x1c, 0x8d, 0x03, 0xa1, 0x9e, 0xaa, 0x16, 0xcf, + 0x5e, 0xae, 0xe7, 0x5a, 0xc4, 0xf5, 0x6a, 0x9d, 0xdd, 0x00, 0xe7, 0x78, 0x75, 0x6d, 0x34, 0x0e, + 0xd0, 0xbb, 0x50, 0x1c, 0xd2, 0xa1, 0xe7, 0x4f, 0xfa, 0x7b, 0x13, 0x46, 0x03, 0x61, 0x38, 0x85, + 0x0b, 0x52, 0x56, 0xe5, 0x22, 0xfd, 0x0f, 0x13, 0x70, 0x2d, 0xb4, 0x8d, 0xe9, 0x6f, 0x8c, 0x6d, + 0x9f, 0x0e, 0xa9, 0xcb, 0x02, 0xf4, 0x29, 0x64, 0x1d, 0x7b, 0x68, 0x33, 0xd9, 0x46, 0x61, 0xe3, + 0x9d, 0x79, 0x63, 0x8e, 0x7a, 0x85, 0x15, 0x18, 0x19, 0x50, 0xf4, 0x69, 0x40, 0xfd, 0x23, 0x39, + 0x13, 0xa2, 0xc9, 0x37, 0x2a, 0xcf, 0xa8, 0xe8, 0x9b, 0x90, 0xeb, 0x38, 0x84, 0xed, 0x7b, 0xfe, + 0x10, 0xe9, 0x50, 0x24, 0xbe, 0x79, 0x60, 0x33, 0x6a, 0xb2, 0xb1, 0x1f, 0xae, 0xca, 0x8c, 0x0c, + 0x5d, 0x87, 0xa4, 0x27, 0x1b, 0xca, 0x57, 0xb3, 0x67, 0x2f, 0xd7, 0x93, 0xed, 0x2e, 0x4e, 0x7a, + 0x81, 0xfe, 0x10, 0xae, 0x74, 0x9c, 0xf1, 0xc0, 0x76, 0xeb, 0x34, 0x30, 0x7d, 0x7b, 0xc4, 0xad, + 0xf3, 0xe5, 0xe5, 0xce, 0x17, 0x2e, 0x2f, 0xff, 0x8e, 0x96, 0x3c, 0x39, 0x5d, 0x72, 0xfd, 0xf7, + 0x93, 0x70, 0xa5, 0xe1, 0x0e, 0x6c, 0x97, 0xc6, 0xb5, 0x6f, 0xc3, 0x32, 0x15, 0xc2, 0xfe, 0x91, + 0x74, 0x2a, 0x65, 0x67, 0x49, 0x4a, 0x43, 0x4f, 0x6b, 0x9e, 0xf3, 0x97, 0xfb, 0xf3, 0x86, 0xff, + 0x8a, 0xf5, 0x79, 0x5e, 0x83, 0x1a, 0xb0, 0x38, 0x12, 0x83, 0x08, 0x56, 0x53, 0xc2, 0xd6, 0xed, + 0x79, 0xb6, 0x5e, 0x19, 0x67, 0x35, 0xfd, 0xcd, 0xcb, 0xf5, 0x05, 0x1c, 0xea, 0xfe, 0x22, 0xce, + 0xf7, 0x6f, 0x09, 0x58, 0x69, 0x79, 0xd6, 0xcc, 0x3c, 0x94, 0x20, 0x77, 0xe0, 0x05, 0x2c, 0xb6, + 0x51, 0xa2, 0x32, 0x7a, 0x00, 0xb9, 0x91, 0x5a, 0x3e, 0xb5, 0xfa, 0x37, 0xe7, 0x77, 0x59, 0x62, + 0x70, 0x84, 0x46, 0x0f, 0x21, 0xef, 0x87, 0x3e, 0xb1, 0x9a, 0xba, 0x8c, 0xe3, 0x4c, 0xf1, 0xe8, + 0x57, 0x20, 0x2b, 0x17, 0x61, 0x35, 0x2d, 0x34, 0x6f, 0x5f, 0x6a, 0xce, 0xb1, 0x52, 0xd2, 0x7f, + 0x96, 0x00, 0x0d, 0x93, 0x7d, 0xb6, 0x43, 0x87, 0x7b, 0xd4, 0xef, 0x32, 0xc2, 0xc6, 0x01, 0xba, + 0x0e, 0x59, 0x87, 0x12, 0x8b, 0xfa, 0x62, 0x90, 0x39, 0xac, 0x4a, 0x68, 0x97, 0x3b, 0x39, 0x31, + 0x0f, 0xc8, 0x9e, 0xed, 0xd8, 0x6c, 0x22, 0x86, 0xb9, 0x3c, 0x7f, 0x95, 0xcf, 0xdb, 0xac, 0xe0, + 0x98, 0x22, 0x9e, 0x31, 0x83, 0x56, 0x61, 0x71, 0x48, 0x83, 0x80, 0x0c, 0xa8, 0x18, 0x7d, 0x1e, + 0x87, 0x45, 0xfd, 0x21, 0x14, 0xe3, 0x7a, 0xa8, 0x00, 0x8b, 0xbb, 0xad, 0x27, 0xad, 0xf6, 0xb3, + 0x96, 0xb6, 0x80, 0x56, 0xa0, 0xb0, 0xdb, 0xc2, 0x0d, 0xa3, 0xb6, 0x65, 0x54, 0xb7, 0x1b, 0x5a, + 0x02, 0x2d, 0x41, 0x7e, 0x5a, 0x4c, 0xea, 0x7f, 0x99, 0x00, 0xe0, 0x0b, 0xa8, 0x06, 0xf5, 0x39, + 0x64, 0x02, 0x46, 0x98, 0x5c, 0xb8, 0xe5, 0x8d, 0xf7, 0xe6, 0xf5, 0x7a, 0x0a, 0xaf, 0xf0, 0x3f, + 0x8a, 0xa5, 0x4a, 0xbc, 0x87, 0xc9, 0x99, 0x1e, 0xf2, 0x3d, 0x44, 0x2c, 0xcb, 0x57, 0x1d, 0x17, + 0xdf, 0xfa, 0x43, 0xc8, 0x08, 0xed, 0xd9, 0xee, 0xe6, 0x20, 0x5d, 0xe7, 0x5f, 0x09, 0x94, 0x87, + 0x0c, 0x6e, 0x18, 0xf5, 0x2f, 0xb5, 0x24, 0xd2, 0xa0, 0x58, 0x6f, 0x76, 0x6b, 0xed, 0x56, 0xab, + 0x51, 0xeb, 0x35, 0xea, 0x5a, 0x4a, 0xbf, 0x0d, 0x99, 0xe6, 0x90, 0x5b, 0xbe, 0xc9, 0xbd, 0x62, + 0x9f, 0xfa, 0xd4, 0x35, 0x43, 0x67, 0x9b, 0x0a, 0xf4, 0x9f, 0xe6, 0x21, 0xb3, 0xe3, 0x8d, 0x5d, + 0x86, 0x36, 0x62, 0x3b, 0x7b, 0x79, 0x63, 0x6d, 0xde, 0xb0, 0x04, 0xb0, 0xd2, 0x9b, 0x8c, 0xa8, + 0xda, 0xf9, 0xd7, 0x21, 0x2b, 0xfd, 0x47, 0x0d, 0x47, 0x95, 0xb8, 0x9c, 0x11, 0x7f, 0x40, 0x99, + 0x1a, 0x8f, 0x2a, 0xa1, 0x3b, 0x90, 0xf3, 0x29, 0xb1, 0x3c, 0xd7, 0x99, 0x08, 0x37, 0xcb, 0xc9, + 0xa3, 0x17, 0x53, 0x62, 0xb5, 0x5d, 0x67, 0x82, 0xa3, 0x5a, 0xb4, 0x05, 0xc5, 0x3d, 0xdb, 0xb5, + 0xfa, 0xde, 0x48, 0x9e, 0x83, 0x99, 0xd7, 0x3b, 0xa5, 0xec, 0x55, 0xd5, 0x76, 0xad, 0xb6, 0x04, + 0xe3, 0xc2, 0xde, 0xb4, 0x80, 0x5a, 0xb0, 0x7c, 0xe4, 0x39, 0xe3, 0x21, 0x8d, 0x6c, 0x65, 0x85, + 0xad, 0xf7, 0x5f, 0x6f, 0xeb, 0xa9, 0xc0, 0x87, 0xd6, 0x96, 0x8e, 0xe2, 0x45, 0xf4, 0x04, 0x96, + 0xd8, 0x70, 0xb4, 0x1f, 0x44, 0xe6, 0x16, 0x85, 0xb9, 0xef, 0x5f, 0x30, 0x61, 0x1c, 0x1e, 0x5a, + 0x2b, 0xb2, 0x58, 0xa9, 0xf4, 0xbb, 0x29, 0x28, 0xc4, 0x7a, 0x8e, 0xba, 0x50, 0x18, 0xf9, 0xde, + 0x88, 0x0c, 0xc4, 0x59, 0xae, 0xd6, 0xe2, 0xfe, 0xa5, 0x46, 0x5d, 0xe9, 0x4c, 0x15, 0x71, 0xdc, + 0x8a, 0x7e, 0x9a, 0x84, 0x42, 0xac, 0x12, 0xdd, 0x85, 0x1c, 0xee, 0xe0, 0xe6, 0x53, 0xa3, 0xd7, + 0xd0, 0x16, 0x4a, 0x37, 0x4f, 0x4e, 0xcb, 0xab, 0xc2, 0x5a, 0xdc, 0x40, 0xc7, 0xb7, 0x8f, 0xb8, + 0xeb, 0xdd, 0x81, 0xc5, 0x10, 0x9a, 0x28, 0xbd, 0x7d, 0x72, 0x5a, 0x7e, 0xeb, 0x3c, 0x34, 0x86, + 0xc4, 0xdd, 0x2d, 0x03, 0x37, 0xea, 0x5a, 0x72, 0x3e, 0x12, 0x77, 0x0f, 0x88, 0x4f, 0x2d, 0xf4, + 0x7d, 0xc8, 0x2a, 0x60, 0xaa, 0x54, 0x3a, 0x39, 0x2d, 0x5f, 0x3f, 0x0f, 0x9c, 0xe2, 0x70, 0x77, + 0xdb, 0x78, 0xda, 0xd0, 0xd2, 0xf3, 0x71, 0xb8, 0xeb, 0x90, 0x23, 0x8a, 0xde, 0x83, 0x8c, 0x84, + 0x65, 0x4a, 0x37, 0x4e, 0x4e, 0xcb, 0xdf, 0x7b, 0xc5, 0x1c, 0x47, 0x95, 0x56, 0xff, 0xe0, 0x4f, + 0xd7, 0x16, 0xfe, 0xfa, 0xcf, 0xd6, 0xb4, 0xf3, 0xd5, 0xa5, 0xff, 0x4e, 0xc0, 0xd2, 0xcc, 0x92, + 0x23, 0x1d, 0xb2, 0xae, 0x67, 0x7a, 0x23, 0x79, 0xc4, 0xe7, 0xaa, 0x70, 0xf6, 0x72, 0x3d, 0xdb, + 0xf2, 0x6a, 0xde, 0x68, 0x82, 0x55, 0x0d, 0x7a, 0x72, 0xee, 0x92, 0xfa, 0xf8, 0x92, 0xfe, 0x34, + 0xf7, 0x9a, 0x7a, 0x04, 0x4b, 0x96, 0x6f, 0x1f, 0x51, 0xbf, 0x6f, 0x7a, 0xee, 0xbe, 0x3d, 0x50, + 0xc7, 0x77, 0x69, 0x9e, 0xcd, 0xba, 0x00, 0xe2, 0xa2, 0x54, 0xa8, 0x09, 0xfc, 0x2f, 0x70, 0x41, + 0x95, 0x9e, 0x42, 0x31, 0xee, 0xa1, 0xe8, 0x1d, 0x80, 0xc0, 0xfe, 0x4d, 0xaa, 0x38, 0x8f, 0x60, + 0x48, 0x38, 0xcf, 0x25, 0x82, 0xf1, 0xa0, 0xf7, 0x21, 0x3d, 0xf4, 0x2c, 0x69, 0x67, 0xa9, 0x7a, + 0x95, 0xdf, 0x93, 0xff, 0xf4, 0x72, 0xbd, 0xe0, 0x05, 0x95, 0x4d, 0xdb, 0xa1, 0x3b, 0x9e, 0x45, + 0xb1, 0x00, 0xe8, 0x47, 0x90, 0xe6, 0x47, 0x05, 0x7a, 0x1b, 0xd2, 0xd5, 0x66, 0xab, 0xae, 0x2d, + 0x94, 0xae, 0x9c, 0x9c, 0x96, 0x97, 0xc4, 0x94, 0xf0, 0x0a, 0xee, 0xbb, 0x68, 0x1d, 0xb2, 0x4f, + 0xdb, 0xdb, 0xbb, 0x3b, 0xdc, 0xbd, 0xae, 0x9e, 0x9c, 0x96, 0x57, 0xa2, 0x6a, 0x39, 0x69, 0xe8, + 0x1d, 0xc8, 0xf4, 0x76, 0x3a, 0x9b, 0x5d, 0x2d, 0x59, 0x42, 0x27, 0xa7, 0xe5, 0xe5, 0xa8, 0x5e, + 0xf4, 0xb9, 0x74, 0x45, 0xad, 0x6a, 0x3e, 0x92, 0xeb, 0xff, 0x95, 0x84, 0x25, 0xcc, 0x39, 0xaf, + 0xcf, 0x3a, 0x9e, 0x63, 0x9b, 0x13, 0xd4, 0x81, 0xbc, 0xe9, 0xb9, 0x96, 0x1d, 0xdb, 0x53, 0x1b, + 0xaf, 0xb9, 0x18, 0xa7, 0x5a, 0x61, 0xa9, 0x16, 0x6a, 0xe2, 0xa9, 0x11, 0xb4, 0x01, 0x19, 0x8b, + 0x3a, 0x64, 0x72, 0xd1, 0x0d, 0x5d, 0x57, 0xfc, 0x1a, 0x4b, 0xa8, 0x60, 0x93, 0xe4, 0x79, 0x9f, + 0x30, 0x46, 0x87, 0x23, 0x26, 0x6f, 0xe8, 0x34, 0x2e, 0x0c, 0xc9, 0x73, 0x43, 0x89, 0xd0, 0x27, + 0x90, 0x3d, 0xb6, 0x5d, 0xcb, 0x3b, 0x56, 0x97, 0xf0, 0xc5, 0x76, 0x15, 0x56, 0x3f, 0xe1, 0x77, + 0xef, 0xb9, 0xce, 0xf2, 0x59, 0x6f, 0xb5, 0x5b, 0x8d, 0x70, 0xd6, 0x55, 0x7d, 0xdb, 0x6d, 0x79, + 0x2e, 0xdf, 0x31, 0xd0, 0x6e, 0xf5, 0x37, 0x8d, 0xe6, 0xf6, 0x2e, 0xe6, 0x33, 0x7f, 0xed, 0xe4, + 0xb4, 0xac, 0x45, 0x90, 0x4d, 0x62, 0x3b, 0x9c, 0x18, 0xde, 0x80, 0x94, 0xd1, 0xfa, 0x52, 0x4b, + 0x96, 0xb4, 0x93, 0xd3, 0x72, 0x31, 0xaa, 0x36, 0xdc, 0xc9, 0x74, 0x33, 0x9d, 0x6f, 0x57, 0xff, + 0x97, 0x24, 0x14, 0x77, 0x47, 0x16, 0x61, 0x54, 0x7a, 0x26, 0x2a, 0x43, 0x61, 0x44, 0x7c, 0xe2, + 0x38, 0xd4, 0xb1, 0x83, 0xa1, 0x0a, 0x1e, 0xe2, 0x22, 0xf4, 0xe0, 0x3b, 0x4c, 0xa6, 0x22, 0x66, + 0x6a, 0x4a, 0x77, 0x61, 0x79, 0x5f, 0x76, 0xb6, 0x4f, 0x4c, 0xb1, 0xba, 0x29, 0xb1, 0xba, 0x95, + 0x79, 0x26, 0xe2, 0xbd, 0xaa, 0xa8, 0x31, 0x1a, 0x42, 0x0b, 0x2f, 0xed, 0xc7, 0x8b, 0xe8, 0x33, + 0x58, 0x1c, 0x7a, 0xae, 0xcd, 0x3c, 0xff, 0x52, 0xeb, 0x10, 0x82, 0xd1, 0x5d, 0xb8, 0xc2, 0x57, + 0x38, 0xec, 0x92, 0xa8, 0x16, 0x37, 0x57, 0x12, 0xaf, 0x0c, 0xc9, 0x73, 0xd5, 0x26, 0xe6, 0x62, + 0xfd, 0x33, 0x58, 0x9a, 0xe9, 0x03, 0xbf, 0xcd, 0x3b, 0xc6, 0x6e, 0xb7, 0xa1, 0x2d, 0xa0, 0x22, + 0xe4, 0x6a, 0xed, 0x56, 0xaf, 0xd9, 0xda, 0xe5, 0x74, 0xa4, 0x08, 0x39, 0xdc, 0xde, 0xde, 0xae, + 0x1a, 0xb5, 0x27, 0x5a, 0x52, 0xff, 0x8f, 0x68, 0x7e, 0x15, 0x1f, 0xa9, 0xce, 0xf2, 0x91, 0x0f, + 0x5f, 0x3f, 0x74, 0xc5, 0x48, 0xa6, 0x85, 0x88, 0x97, 0xfc, 0x7f, 0x00, 0xb1, 0x8c, 0xd4, 0xea, + 0x13, 0x76, 0x51, 0xcc, 0xd1, 0x0b, 0xa3, 0x49, 0x9c, 0x57, 0x0a, 0x06, 0x43, 0x5f, 0x40, 0xd1, + 0xf4, 0x86, 0x23, 0x87, 0x2a, 0xfd, 0xd4, 0x65, 0xf4, 0x0b, 0x91, 0x8a, 0xc1, 0xe2, 0xbc, 0x28, + 0x3d, 0xcb, 0xdc, 0x7e, 0x2f, 0x01, 0x85, 0x58, 0x87, 0x67, 0xa9, 0x50, 0x11, 0x72, 0xbb, 0x9d, + 0xba, 0xd1, 0x6b, 0xb6, 0x1e, 0x6b, 0x09, 0x04, 0x90, 0x15, 0x13, 0x58, 0xd7, 0x92, 0x9c, 0xc2, + 0xd5, 0xda, 0x3b, 0x9d, 0xed, 0x86, 0x20, 0x43, 0xe8, 0x1a, 0x68, 0xe1, 0x14, 0xf6, 0xbb, 0x3d, + 0x03, 0x73, 0x69, 0x1a, 0x5d, 0x85, 0x95, 0x48, 0xaa, 0x34, 0x33, 0xe8, 0x3a, 0xa0, 0x48, 0x38, + 0x35, 0x91, 0xd5, 0x7f, 0x1b, 0x56, 0x6a, 0x9e, 0xcb, 0x88, 0xed, 0x46, 0xf4, 0x76, 0x83, 0x8f, + 0x5b, 0x89, 0xfa, 0xb6, 0x25, 0x4f, 0xdb, 0xea, 0xca, 0xd9, 0xcb, 0xf5, 0x42, 0x04, 0x6d, 0xd6, + 0xf9, 0x48, 0xc3, 0x82, 0xc5, 0xf7, 0xd4, 0xc8, 0xb6, 0xc4, 0x14, 0x67, 0xaa, 0x8b, 0x67, 0x2f, + 0xd7, 0x53, 0x9d, 0x66, 0x1d, 0x73, 0x19, 0x7a, 0x1b, 0xf2, 0xf4, 0xb9, 0xcd, 0xfa, 0x26, 0x3f, + 0x5d, 0xf9, 0x1c, 0x66, 0x70, 0x8e, 0x0b, 0x6a, 0xfc, 0x30, 0xad, 0x02, 0x74, 0x3c, 0x9f, 0xa9, + 0x96, 0x3f, 0x81, 0xcc, 0xc8, 0xf3, 0x45, 0x6c, 0xc9, 0xaf, 0x9e, 0xb9, 0x64, 0x8d, 0xc3, 0xa5, + 0xb3, 0x63, 0x09, 0xd6, 0xff, 0x26, 0x09, 0xd0, 0x23, 0xc1, 0xa1, 0x32, 0xf2, 0x10, 0xf2, 0x51, + 0x72, 0xe0, 0xa2, 0x20, 0x35, 0xb6, 0xe6, 0x11, 0x1e, 0x7d, 0x1c, 0x7a, 0x9d, 0xe4, 0xee, 0xf3, + 0x15, 0x55, 0x5b, 0xf3, 0xe8, 0xef, 0x2c, 0x41, 0xe7, 0xf7, 0x15, 0xf5, 0x7d, 0xb5, 0xf8, 0xfc, + 0x13, 0xd5, 0xc4, 0x99, 0x2d, 0xe7, 0x4d, 0xb1, 0xbf, 0x5b, 0xf3, 0x1a, 0x39, 0xb7, 0x28, 0x5b, + 0x0b, 0x78, 0xaa, 0x87, 0x1e, 0x41, 0x81, 0x0f, 0xbd, 0x1f, 0x88, 0x3a, 0x45, 0xfc, 0x5e, 0x3b, + 0x5b, 0xd2, 0x02, 0x86, 0x51, 0xf4, 0x5d, 0xd5, 0x60, 0xd9, 0x1f, 0xbb, 0x7c, 0xd8, 0xca, 0x86, + 0x6e, 0xc3, 0x5b, 0x2d, 0xca, 0x8e, 0x3d, 0xff, 0xd0, 0x60, 0x8c, 0x98, 0x07, 0x3c, 0xda, 0x57, + 0x27, 0xdd, 0x94, 0xf5, 0x26, 0x66, 0x58, 0xef, 0x2a, 0x2c, 0x12, 0xc7, 0x26, 0x01, 0x95, 0x54, + 0x21, 0x8f, 0xc3, 0x22, 0xe7, 0xe6, 0x9c, 0xe9, 0xd3, 0x20, 0xa0, 0x32, 0x3e, 0xcd, 0xe3, 0xa9, + 0x40, 0xff, 0x87, 0x24, 0x40, 0xb3, 0x63, 0xec, 0x28, 0xf3, 0x75, 0xc8, 0xee, 0x93, 0xa1, 0xed, + 0x4c, 0x2e, 0xda, 0xe9, 0x53, 0x7c, 0xc5, 0x90, 0x86, 0x36, 0x85, 0x0e, 0x56, 0xba, 0x82, 0xb2, + 0x8f, 0xf7, 0x5c, 0xca, 0x22, 0xca, 0x2e, 0x4a, 0x9c, 0x1f, 0xf8, 0xc4, 0x8d, 0x56, 0x46, 0x16, + 0x78, 0xd7, 0x07, 0x84, 0xd1, 0x63, 0x32, 0x09, 0x37, 0xa6, 0x2a, 0xa2, 0x2d, 0x4e, 0xe5, 0x03, + 0xea, 0x1f, 0x51, 0x6b, 0x35, 0x23, 0xbc, 0xf0, 0x4d, 0xfd, 0xc1, 0x0a, 0x2e, 0x99, 0x4f, 0xa4, + 0x5d, 0x7a, 0x28, 0xae, 0xeb, 0x69, 0xd5, 0x77, 0x8a, 0xae, 0xef, 0xc1, 0xd2, 0xcc, 0x38, 0x5f, + 0x89, 0x95, 0x9a, 0x9d, 0xa7, 0x9f, 0x68, 0x69, 0xf5, 0xf5, 0x99, 0x96, 0xd5, 0xff, 0x22, 0x25, + 0xb7, 0x92, 0x9a, 0xd5, 0xf9, 0xf9, 0xaa, 0x9c, 0xc8, 0x7e, 0x99, 0x9e, 0xa3, 0xfc, 0xfb, 0xfd, + 0x8b, 0x77, 0x18, 0xe7, 0xde, 0x02, 0x8e, 0x23, 0x45, 0xb4, 0x0e, 0x05, 0xb9, 0xfe, 0x7d, 0xee, + 0x4f, 0x62, 0x5a, 0x97, 0x30, 0x48, 0x11, 0xd7, 0x44, 0xb7, 0x61, 0x79, 0x34, 0xde, 0x73, 0xec, + 0xe0, 0x80, 0x5a, 0x12, 0x93, 0x16, 0x98, 0xa5, 0x48, 0x2a, 0x60, 0x3b, 0x50, 0x54, 0x82, 0xbe, + 0xe0, 0x5d, 0x19, 0xd1, 0xa1, 0xbb, 0x6f, 0xea, 0x90, 0x54, 0x11, 0x74, 0xac, 0x30, 0x9a, 0x16, + 0xf4, 0x3a, 0xe4, 0xc2, 0xce, 0xa2, 0x55, 0x48, 0xf5, 0x6a, 0x1d, 0x6d, 0xa1, 0xb4, 0x72, 0x72, + 0x5a, 0x2e, 0x84, 0xe2, 0x5e, 0xad, 0xc3, 0x6b, 0x76, 0xeb, 0x1d, 0x2d, 0x31, 0x5b, 0xb3, 0x5b, + 0xef, 0x94, 0xd2, 0xfc, 0xe6, 0xd7, 0xf7, 0xa1, 0x10, 0x6b, 0x01, 0xdd, 0x82, 0xc5, 0x66, 0xeb, + 0x31, 0x6e, 0x74, 0xbb, 0xda, 0x42, 0xe9, 0xfa, 0xc9, 0x69, 0x19, 0xc5, 0x6a, 0x9b, 0xee, 0x80, + 0xaf, 0x0f, 0x7a, 0x07, 0xd2, 0x5b, 0xed, 0x6e, 0x2f, 0x24, 0x7a, 0x31, 0xc4, 0x96, 0x17, 0xb0, + 0xd2, 0x55, 0x45, 0x29, 0xe2, 0x86, 0xf5, 0x3f, 0x4a, 0x40, 0x56, 0xf2, 0xdd, 0xb9, 0x0b, 0x65, + 0xc0, 0x62, 0x18, 0x85, 0x49, 0x12, 0xfe, 0xfe, 0xeb, 0x09, 0x73, 0x45, 0xf1, 0x5b, 0xe9, 0x7e, + 0xa1, 0x5e, 0xe9, 0x73, 0x28, 0xc6, 0x2b, 0xbe, 0x93, 0xf3, 0xfd, 0x16, 0x14, 0xb8, 0x7f, 0x87, + 0xc4, 0x79, 0x03, 0xb2, 0x92, 0x93, 0xab, 0xd3, 0xf4, 0x22, 0xf6, 0xae, 0x90, 0xe8, 0x01, 0x2c, + 0x4a, 0xc6, 0x1f, 0xe6, 0xa7, 0xd6, 0x2e, 0xde, 0x45, 0x38, 0x84, 0xeb, 0x8f, 0x20, 0xdd, 0xa1, + 0xd4, 0xe7, 0x73, 0xef, 0x7a, 0x16, 0x9d, 0x5e, 0x40, 0x2a, 0x58, 0xb1, 0x68, 0xb3, 0xce, 0x83, + 0x15, 0x8b, 0x36, 0xad, 0x28, 0xbd, 0x90, 0x8c, 0xa5, 0x17, 0x7a, 0x50, 0x7c, 0x46, 0xed, 0xc1, + 0x01, 0xa3, 0x96, 0x30, 0xf4, 0x21, 0xa4, 0x47, 0x34, 0xea, 0xfc, 0xea, 0x5c, 0x07, 0xa3, 0xd4, + 0xc7, 0x02, 0xc5, 0xcf, 0x91, 0x63, 0xa1, 0xad, 0xb2, 0xa2, 0xaa, 0xa4, 0xff, 0x7d, 0x12, 0x96, + 0x9b, 0x41, 0x30, 0x26, 0xae, 0x19, 0x32, 0x94, 0x1f, 0xcd, 0x32, 0x94, 0x3b, 0x73, 0x47, 0x38, + 0xa3, 0x32, 0x9b, 0x35, 0x51, 0x97, 0x43, 0x32, 0xba, 0x1c, 0xf4, 0x7f, 0x4f, 0x84, 0xa9, 0x91, + 0xdb, 0xb1, 0xed, 0x5e, 0x5a, 0x3d, 0x39, 0x2d, 0x5f, 0x8b, 0x5b, 0xa2, 0xbb, 0xee, 0xa1, 0xeb, + 0x1d, 0xbb, 0xe8, 0x5d, 0xc8, 0xe0, 0x46, 0xab, 0xf1, 0x4c, 0x4b, 0x48, 0xf7, 0x9c, 0x01, 0x61, + 0xea, 0xd2, 0x63, 0x6e, 0xa9, 0xd3, 0x68, 0xd5, 0x39, 0x97, 0x48, 0xce, 0xb1, 0xd4, 0xa1, 0xae, + 0x65, 0xbb, 0x03, 0x74, 0x0b, 0xb2, 0xcd, 0x6e, 0x77, 0x57, 0x04, 0xaf, 0x6f, 0x9d, 0x9c, 0x96, + 0xaf, 0xce, 0xa0, 0x78, 0x81, 0x5a, 0x1c, 0xc4, 0xc9, 0x35, 0x67, 0x19, 0x73, 0x40, 0x9c, 0xf7, + 0x49, 0x10, 0x6e, 0xf7, 0x78, 0x64, 0x9d, 0x99, 0x03, 0xc2, 0x1e, 0xff, 0x55, 0xdb, 0xed, 0x9f, + 0x93, 0xa0, 0x19, 0xa6, 0x49, 0x47, 0x8c, 0xd7, 0xab, 0xa8, 0xa6, 0x07, 0xb9, 0x11, 0xff, 0xb2, + 0x69, 0xc8, 0x03, 0x1e, 0xcc, 0xcd, 0xab, 0x9f, 0xd3, 0xab, 0x60, 0xcf, 0xa1, 0x86, 0x35, 0xb4, + 0x83, 0x80, 0x47, 0xef, 0x42, 0x86, 0x23, 0x4b, 0xa5, 0x9f, 0x27, 0xe0, 0xea, 0x1c, 0x04, 0xba, + 0x07, 0x69, 0xdf, 0x73, 0xc2, 0x35, 0xbc, 0xf9, 0xba, 0xac, 0x17, 0x57, 0xc5, 0x02, 0x89, 0xd6, + 0x00, 0xc8, 0x98, 0x79, 0x44, 0xb4, 0x2f, 0x56, 0x2f, 0x87, 0x63, 0x12, 0xf4, 0x0c, 0xb2, 0x01, + 0x35, 0x7d, 0x1a, 0x12, 0xc6, 0x47, 0xff, 0xd7, 0xde, 0x57, 0xba, 0xc2, 0x0c, 0x56, 0xe6, 0x4a, + 0x15, 0xc8, 0x4a, 0x09, 0x77, 0x7b, 0x8b, 0x30, 0x22, 0x3a, 0x5d, 0xc4, 0xe2, 0x9b, 0x7b, 0x13, + 0x71, 0x06, 0xa1, 0x37, 0x11, 0x67, 0xa0, 0xff, 0x71, 0x12, 0xa0, 0xf1, 0x9c, 0x51, 0xdf, 0x25, + 0x4e, 0xcd, 0x40, 0x8d, 0xd8, 0xe9, 0x2f, 0x47, 0xfb, 0xc1, 0xdc, 0x5c, 0x68, 0xa4, 0x51, 0xa9, + 0x19, 0x73, 0xce, 0xff, 0x1b, 0x90, 0x1a, 0xfb, 0x8e, 0xca, 0xab, 0x0b, 0xa6, 0xb7, 0x8b, 0xb7, + 0x31, 0x97, 0xa1, 0xc6, 0xf4, 0xd8, 0x4a, 0xbd, 0xfe, 0x41, 0x24, 0xd6, 0xc0, 0x2f, 0xff, 0xe8, + 0xfa, 0x10, 0x60, 0xda, 0x6b, 0xb4, 0x06, 0x99, 0xda, 0x66, 0xb7, 0xbb, 0xad, 0x2d, 0xc8, 0xb3, + 0x79, 0x5a, 0x25, 0xc4, 0xfa, 0x9f, 0x27, 0x20, 0x57, 0x33, 0xd4, 0x8d, 0xb9, 0x09, 0x9a, 0x38, + 0x70, 0x4c, 0xea, 0xb3, 0x3e, 0x7d, 0x3e, 0xb2, 0xfd, 0x89, 0x3a, 0x33, 0x2e, 0x0e, 0x93, 0x96, + 0xb9, 0x56, 0x8d, 0xfa, 0xac, 0x21, 0x74, 0x10, 0x86, 0x22, 0x55, 0x43, 0xec, 0x9b, 0x24, 0x3c, + 0xc1, 0xd7, 0x2e, 0x9e, 0x0a, 0x49, 0xaf, 0xa7, 0xe5, 0x00, 0x17, 0x42, 0x23, 0x35, 0x12, 0xe8, + 0x4f, 0xe1, 0x6a, 0xdb, 0x37, 0x0f, 0x68, 0xc0, 0x64, 0xa3, 0xaa, 0xcb, 0x8f, 0xe0, 0x26, 0x23, + 0xc1, 0x61, 0xff, 0xc0, 0x0e, 0x98, 0xe7, 0x4f, 0xfa, 0x3e, 0x65, 0xd4, 0xe5, 0xf5, 0x7d, 0xf1, + 0xec, 0xa2, 0x92, 0x1c, 0x37, 0x38, 0x66, 0x4b, 0x42, 0x70, 0x88, 0xd8, 0xe6, 0x00, 0xbd, 0x09, + 0x45, 0xce, 0x66, 0xeb, 0x74, 0x9f, 0x8c, 0x1d, 0x16, 0xa0, 0x1f, 0x02, 0x38, 0xde, 0xa0, 0x7f, + 0xe9, 0xe3, 0x3e, 0xef, 0x78, 0x03, 0xf9, 0xa9, 0xff, 0x1a, 0x68, 0x75, 0x3b, 0x18, 0x11, 0x66, + 0x1e, 0x84, 0xd9, 0x1b, 0xf4, 0x18, 0xb4, 0x03, 0x4a, 0x7c, 0xb6, 0x47, 0x09, 0xeb, 0x8f, 0xa8, + 0x6f, 0x7b, 0xd6, 0xa5, 0xa6, 0x74, 0x25, 0xd2, 0xea, 0x08, 0x25, 0xfd, 0x3f, 0x13, 0x00, 0x98, + 0xec, 0x87, 0xe4, 0xe6, 0x07, 0x70, 0x25, 0x70, 0xc9, 0x28, 0x38, 0xf0, 0x58, 0xdf, 0x76, 0x19, + 0xf5, 0x8f, 0x88, 0xa3, 0x22, 0x70, 0x2d, 0xac, 0x68, 0x2a, 0x39, 0xfa, 0x10, 0xd0, 0x21, 0xa5, + 0xa3, 0xbe, 0xe7, 0x58, 0xfd, 0xb0, 0x52, 0xbe, 0x0b, 0xa5, 0xb1, 0xc6, 0x6b, 0xda, 0x8e, 0xd5, + 0x0d, 0xe5, 0xa8, 0x0a, 0x6b, 0x7c, 0x06, 0xa8, 0xcb, 0x7c, 0x9b, 0x06, 0xfd, 0x7d, 0xcf, 0xef, + 0x07, 0x8e, 0x77, 0xdc, 0xdf, 0xf7, 0x1c, 0xc7, 0x3b, 0xa6, 0x7e, 0x98, 0xdf, 0x28, 0x39, 0xde, + 0xa0, 0x21, 0x41, 0x9b, 0x9e, 0xdf, 0x75, 0xbc, 0xe3, 0xcd, 0x10, 0xc1, 0x19, 0xd0, 0x74, 0xd8, + 0xcc, 0x36, 0x0f, 0x43, 0x06, 0x14, 0x49, 0x7b, 0xb6, 0x79, 0x88, 0x6e, 0xc1, 0x12, 0x75, 0xa8, + 0x88, 0x92, 0x25, 0x2a, 0x23, 0x50, 0xc5, 0x50, 0xc8, 0x41, 0xfa, 0xff, 0x83, 0x7c, 0xc7, 0x21, + 0xa6, 0x78, 0x7d, 0x43, 0x65, 0xe0, 0x41, 0x17, 0x77, 0x02, 0xdb, 0x55, 0x51, 0x52, 0x1e, 0xc7, + 0x45, 0xfa, 0x8f, 0x00, 0x7e, 0xec, 0xd9, 0x6e, 0xcf, 0x3b, 0xa4, 0xae, 0x78, 0xa8, 0xe0, 0x8c, + 0x5e, 0x2d, 0x65, 0x1e, 0xab, 0x92, 0x08, 0x58, 0x88, 0x4b, 0x06, 0xd4, 0x8f, 0xf2, 0xf5, 0xb2, + 0xa8, 0x7f, 0x93, 0x80, 0x2c, 0xf6, 0x3c, 0x56, 0x33, 0x50, 0x19, 0xb2, 0x26, 0xe9, 0x87, 0x3b, + 0xaf, 0x58, 0xcd, 0x9f, 0xbd, 0x5c, 0xcf, 0xd4, 0x8c, 0x27, 0x74, 0x82, 0x33, 0x26, 0x79, 0x42, + 0x27, 0xfc, 0x8a, 0x36, 0x89, 0xd8, 0x2f, 0xc2, 0x4c, 0x51, 0x5e, 0xd1, 0x35, 0x83, 0x6f, 0x06, + 0x9c, 0x35, 0x09, 0xff, 0x47, 0xf7, 0xa0, 0xa8, 0x40, 0xfd, 0x03, 0x12, 0x1c, 0x48, 0x1e, 0x5e, + 0x5d, 0x3e, 0x7b, 0xb9, 0x0e, 0x12, 0xb9, 0x45, 0x82, 0x03, 0x0c, 0x12, 0xcd, 0xbf, 0x51, 0x03, + 0x0a, 0x5f, 0x79, 0xb6, 0xdb, 0x67, 0x62, 0x10, 0x2a, 0x55, 0x31, 0x77, 0xff, 0x4c, 0x87, 0xaa, + 0xf2, 0x27, 0xf0, 0x55, 0x24, 0xd1, 0xff, 0x31, 0x01, 0x05, 0x6e, 0xd3, 0xde, 0xb7, 0x4d, 0x7e, + 0xa5, 0x7e, 0xf7, 0x93, 0xfe, 0x06, 0xa4, 0xcc, 0xc0, 0x57, 0x63, 0x13, 0x47, 0x5d, 0xad, 0x8b, + 0x31, 0x97, 0xa1, 0x2f, 0x20, 0xab, 0x82, 0x2f, 0x79, 0xc8, 0xeb, 0x6f, 0xbe, 0xfc, 0x55, 0x17, + 0x95, 0x9e, 0x58, 0xcb, 0x69, 0xef, 0xc4, 0x28, 0x8b, 0x38, 0x2e, 0x42, 0xd7, 0x21, 0x69, 0xba, + 0xc2, 0x29, 0xd4, 0x03, 0x66, 0xad, 0x85, 0x93, 0xa6, 0xab, 0xff, 0x5d, 0x02, 0x96, 0x1a, 0xae, + 0xe9, 0x4f, 0xc4, 0x21, 0xc9, 0x17, 0xe2, 0x26, 0xe4, 0x83, 0xf1, 0x5e, 0x30, 0x09, 0x18, 0x1d, + 0x86, 0x6f, 0x21, 0x91, 0x00, 0x35, 0x21, 0x4f, 0x9c, 0x81, 0xe7, 0xdb, 0xec, 0x60, 0xa8, 0x78, + 0xff, 0xfc, 0x83, 0x39, 0x6e, 0xb3, 0x62, 0x84, 0x2a, 0x78, 0xaa, 0x1d, 0x1e, 0xc5, 0x29, 0xd1, + 0x59, 0x71, 0x14, 0xbf, 0x0b, 0x45, 0x87, 0x0c, 0x45, 0x34, 0xca, 0xc3, 0x49, 0x31, 0x8e, 0x34, + 0x2e, 0x28, 0x19, 0x8f, 0xb1, 0x75, 0x1d, 0xf2, 0x91, 0x31, 0xb4, 0x02, 0x05, 0xa3, 0xd1, 0xed, + 0xdf, 0xdf, 0x78, 0xd0, 0x7f, 0x5c, 0xdb, 0xd1, 0x16, 0x14, 0x13, 0xf8, 0xab, 0x04, 0x2c, 0xed, + 0x48, 0x1f, 0x54, 0xec, 0xea, 0x16, 0x2c, 0xfa, 0x64, 0x9f, 0x85, 0xfc, 0x2f, 0x2d, 0x9d, 0x8b, + 0x1f, 0x02, 0x9c, 0xff, 0xf1, 0xaa, 0xf9, 0xfc, 0x2f, 0xf6, 0x3a, 0x97, 0xba, 0xf0, 0x75, 0x2e, + 0xfd, 0x4b, 0x79, 0x9d, 0xd3, 0x7f, 0x92, 0x84, 0x15, 0x75, 0x51, 0x87, 0xaf, 0x4f, 0xe8, 0x03, + 0xc8, 0xcb, 0x3b, 0x7b, 0xca, 0x5e, 0xc5, 0x83, 0x90, 0xc4, 0x35, 0xeb, 0x38, 0x27, 0xab, 0x9b, + 0x16, 0x0f, 0xa7, 0x14, 0x34, 0xf6, 0xd6, 0x0c, 0x52, 0xd4, 0xe2, 0xb1, 0x40, 0x1d, 0xd2, 0xfb, + 0xb6, 0x43, 0x95, 0x9f, 0xcd, 0xcd, 0x00, 0x9e, 0x6b, 0x5e, 0x24, 0xac, 0x7b, 0x22, 0x20, 0xdb, + 0x5a, 0xc0, 0x42, 0xbb, 0xf4, 0x3b, 0x00, 0x53, 0xe9, 0xdc, 0x98, 0x83, 0xdf, 0xeb, 0x2a, 0x83, + 0x13, 0xde, 0xeb, 0xcd, 0x3a, 0xe6, 0x32, 0x5e, 0x35, 0xb0, 0x2d, 0xb5, 0x73, 0x45, 0xd5, 0x63, + 0x5e, 0x35, 0xb0, 0xad, 0x28, 0x6b, 0x9e, 0x7e, 0x43, 0xd6, 0xbc, 0x9a, 0x0b, 0x93, 0x08, 0x7a, + 0x1b, 0xae, 0x57, 0x1d, 0x62, 0x1e, 0x3a, 0x76, 0xc0, 0xa8, 0x15, 0xdf, 0xa1, 0x9f, 0x42, 0x76, + 0xe6, 0xde, 0x7d, 0x43, 0xda, 0x46, 0x81, 0xf5, 0x9f, 0x24, 0xa0, 0xb8, 0x45, 0x89, 0xc3, 0x0e, + 0xa6, 0xb1, 0x2f, 0xa3, 0x01, 0x53, 0xe7, 0xa3, 0xf8, 0x46, 0x0f, 0x20, 0x17, 0xdd, 0x14, 0x97, + 0x49, 0x6e, 0x47, 0x68, 0xf4, 0x19, 0x2c, 0x72, 0xcf, 0xf6, 0xc6, 0x21, 0xa1, 0x7b, 0x43, 0xd6, + 0x54, 0x81, 0xf9, 0x21, 0xeb, 0x53, 0x71, 0x41, 0x88, 0xd9, 0xc9, 0xe0, 0xb0, 0xa8, 0xff, 0x4f, + 0x02, 0xae, 0xed, 0x90, 0xc9, 0x1e, 0x55, 0x3b, 0x8e, 0x5a, 0x98, 0x9a, 0x9e, 0x6f, 0xa1, 0x4e, + 0x7c, 0xa7, 0x5e, 0x90, 0xd0, 0x9f, 0xa7, 0x3c, 0x7f, 0xc3, 0x86, 0x4c, 0x31, 0x19, 0x63, 0x8a, + 0xd7, 0x20, 0xe3, 0x7a, 0xae, 0x49, 0xd5, 0x36, 0x96, 0x05, 0xdd, 0x8e, 0xef, 0xd2, 0x52, 0x94, + 0x65, 0x17, 0x39, 0xf2, 0x96, 0xc7, 0xa2, 0xd6, 0xd0, 0x17, 0x50, 0xea, 0x36, 0x6a, 0xb8, 0xd1, + 0xab, 0xb6, 0x7f, 0xb5, 0xdf, 0x35, 0xb6, 0xbb, 0xc6, 0xc6, 0xbd, 0x7e, 0xa7, 0xbd, 0xfd, 0xe5, + 0xfd, 0x8f, 0xef, 0x7d, 0xaa, 0x25, 0x4a, 0xe5, 0x93, 0xd3, 0xf2, 0xcd, 0x96, 0x51, 0xdb, 0x96, + 0x6e, 0xb9, 0xe7, 0x3d, 0xef, 0x12, 0x27, 0x20, 0x1b, 0xf7, 0x3a, 0x9e, 0x33, 0xe1, 0x98, 0xbb, + 0x7f, 0x9b, 0x82, 0x7c, 0x94, 0x44, 0xe3, 0xde, 0xc5, 0x23, 0x18, 0xd5, 0x54, 0x24, 0x6f, 0xd1, + 0x63, 0xf4, 0xee, 0x34, 0x76, 0xf9, 0x42, 0x26, 0xf3, 0xa3, 0xea, 0x30, 0x6e, 0x79, 0x0f, 0x72, + 0x46, 0xb7, 0xdb, 0x7c, 0xdc, 0x6a, 0xd4, 0xb5, 0xaf, 0x13, 0xa5, 0xef, 0x9d, 0x9c, 0x96, 0xaf, + 0x44, 0x20, 0x23, 0x08, 0xec, 0x81, 0x4b, 0x2d, 0x81, 0xaa, 0xd5, 0x1a, 0x9d, 0x5e, 0xa3, 0xae, + 0xbd, 0x48, 0x9e, 0x47, 0x09, 0x2e, 0x2e, 0x1e, 0xe6, 0xf2, 0x1d, 0xdc, 0xe8, 0x18, 0x98, 0x37, + 0xf8, 0x75, 0x52, 0x86, 0x54, 0xd3, 0x16, 0x7d, 0x3a, 0x22, 0x3e, 0x6f, 0x73, 0x2d, 0x7c, 0xa0, + 0x7e, 0x91, 0x92, 0x8f, 0x37, 0xd3, 0x8c, 0x20, 0x25, 0xd6, 0x84, 0xb7, 0x26, 0xb2, 0xb1, 0xc2, + 0x4c, 0xea, 0x5c, 0x6b, 0x5d, 0x46, 0x7c, 0xc6, 0xad, 0xe8, 0xb0, 0x88, 0x77, 0x5b, 0x2d, 0x0e, + 0x7a, 0x91, 0x3e, 0x37, 0x3a, 0x3c, 0x76, 0x5d, 0x8e, 0xb9, 0x0d, 0xb9, 0x30, 0x59, 0xab, 0x7d, + 0x9d, 0x3e, 0xd7, 0xa1, 0x5a, 0x98, 0x69, 0x16, 0x0d, 0x6e, 0xed, 0xf6, 0xc4, 0xfb, 0xf9, 0x8b, + 0xcc, 0xf9, 0x06, 0x0f, 0xc6, 0xcc, 0xe2, 0xc1, 0x62, 0x39, 0x8a, 0xde, 0xbe, 0xce, 0x48, 0x3e, + 0x1c, 0x61, 0x54, 0xe8, 0xf6, 0x1e, 0xe4, 0x70, 0xe3, 0xc7, 0xf2, 0xa9, 0xfd, 0x45, 0xf6, 0x9c, + 0x1d, 0x4c, 0xbf, 0xa2, 0x26, 0xa3, 0xd6, 0xf4, 0x6d, 0x2a, 0xaa, 0xba, 0xfb, 0xeb, 0x90, 0x0b, + 0xef, 0x4e, 0xb4, 0x06, 0xd9, 0x67, 0x6d, 0xfc, 0xa4, 0x81, 0xb5, 0x05, 0x39, 0x3b, 0x61, 0xcd, + 0x33, 0x49, 0x3e, 0xca, 0xb0, 0xb8, 0x63, 0xb4, 0x8c, 0xc7, 0x0d, 0x1c, 0xa6, 0x4c, 0x42, 0x80, + 0xba, 0x00, 0x4a, 0x9a, 0x6a, 0x20, 0xb2, 0x59, 0xbd, 0xf9, 0xcd, 0xb7, 0x6b, 0x0b, 0x3f, 0xfb, + 0x76, 0x6d, 0xe1, 0xe7, 0xdf, 0xae, 0x25, 0x5e, 0x9c, 0xad, 0x25, 0xbe, 0x39, 0x5b, 0x4b, 0xfc, + 0xf4, 0x6c, 0x2d, 0xf1, 0xaf, 0x67, 0x6b, 0x89, 0xbd, 0xac, 0x08, 0x4e, 0x3e, 0xfe, 0xdf, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xb1, 0x0a, 0x70, 0x15, 0x40, 0x26, 0x00, 0x00, } diff --git a/vendor/src/github.com/docker/swarmkit/api/types.proto b/vendor/src/github.com/docker/swarmkit/api/types.proto index 2c6067674b..0f849135e6 100644 --- a/vendor/src/github.com/docker/swarmkit/api/types.proto +++ b/vendor/src/github.com/docker/swarmkit/api/types.proto @@ -117,6 +117,8 @@ message NodeStatus { State state = 1; string message = 2; + // Addr is the node's IP address as observed by the manager + string addr = 3; } message Image { @@ -200,7 +202,7 @@ message Mount { int64 size_bytes = 1; // Mode of the tmpfs upon creation - int32 mode = 2 [(gogoproto.customtype) = "os.FileMode", (gogoproto.nullable) = false]; + uint32 mode = 2 [(gogoproto.customtype) = "os.FileMode", (gogoproto.nullable) = false]; // TODO(stevvooe): There are several more tmpfs flags, specified in the // daemon, that are accepted. Only the most basic are added for now. @@ -781,6 +783,7 @@ message ManagerStatus { RaftMemberStatus.Reachability reachability = 4; } + // SecretReference is the linkage between a service and a secret that it uses. message SecretReference { // SecretID represents the ID of the specific Secret that we're @@ -788,26 +791,29 @@ message SecretReference { // any information about the secret contents. string secret_id = 1 [(gogoproto.customname) = "SecretID"]; - // Mode specifies how this secret should be exposed to the task. - enum Mode { - // SYSTEM means that it is not exposed inside to a task at all, but - // only available via direct access, usually at the agent-level - SYSTEM = 0; - // FILE means that it will be exposed to the task as a file - FILE = 1; - // ENV means that it will be exposed to the task as an environment variable - ENV = 2; - } - - // Mode is the way the secret should be presented. - Mode mode = 2; - - // Target is the name by which the image accesses the secret. - string target = 3; - // SecretName is the name of the secret that this references, but this is just provided for // lookup/display purposes. The secret in the reference will be identified by its ID. - string secret_name = 4; + string secret_name = 2; + + // FileTarget represents a specific target that is backed by a file + message FileTarget { + // Name represents the final filename in the filesystem + string name = 1; + + // UID represents the file UID + string uid = 2 [(gogoproto.customname) = "UID"]; + + // GID represents the file GID + string gid = 3 [(gogoproto.customname) = "GID"]; + + // Mode represents the FileMode of the file + uint32 mode = 4 [(gogoproto.customtype) = "os.FileMode", (gogoproto.nullable) = false]; + } + + // Target specifies how this secret should be exposed to the task. + oneof target { + FileTarget file = 3; + } } // BlacklistedCertificate is a record for a blacklisted certificate. It does not @@ -840,3 +846,14 @@ message HealthConfig { // container as unhealthy. Zero means inherit. int32 retries = 4; } + +message MaybeEncryptedRecord { + enum Algorithm { + NONE = 0 [(gogoproto.enumvalue_customname) = "NotEncrypted"]; + SECRETBOX_SALSA20_POLY1305 = 1 [(gogoproto.enumvalue_customname) = "NACLSecretboxSalsa20Poly1305"]; + } + + Algorithm algorithm = 1; + bytes data = 2; + bytes nonce = 3; +} diff --git a/vendor/src/github.com/docker/swarmkit/ca/certificates.go b/vendor/src/github.com/docker/swarmkit/ca/certificates.go index d12b896095..19022d58ef 100644 --- a/vendor/src/github.com/docker/swarmkit/ca/certificates.go +++ b/vendor/src/github.com/docker/swarmkit/ca/certificates.go @@ -629,6 +629,7 @@ func GetRemoteSignedCertificate(ctx context.Context, csr []byte, token string, r issueRequest := &api.IssueNodeCertificateRequest{CSR: csr, Token: token} issueResponse, err := caClient.IssueNodeCertificate(ctx, issueRequest) if err != nil { + r.Observe(peer, -remotes.DefaultObservationWeight) return nil, err } diff --git a/vendor/src/github.com/docker/swarmkit/ca/external.go b/vendor/src/github.com/docker/swarmkit/ca/external.go index e728961c03..28cdf3ac7b 100644 --- a/vendor/src/github.com/docker/swarmkit/ca/external.go +++ b/vendor/src/github.com/docker/swarmkit/ca/external.go @@ -8,7 +8,7 @@ import ( "net/http" "sync" - log "github.com/Sirupsen/logrus" + "github.com/Sirupsen/logrus" "github.com/cloudflare/cfssl/api" "github.com/cloudflare/cfssl/signer" "github.com/pkg/errors" @@ -90,7 +90,7 @@ func (eca *ExternalCA) Sign(req signer.SignRequest) (cert []byte, err error) { return eca.rootCA.AppendFirstRootPEM(cert) } - log.Debugf("unable to proxy certificate signing request to %s: %s", url, err) + logrus.Debugf("unable to proxy certificate signing request to %s: %s", url, err) } return nil, err @@ -114,7 +114,7 @@ func makeExternalSignRequest(client *http.Client, url string, csrJSON []byte) (c var apiResponse api.Response if err := json.Unmarshal(body, &apiResponse); err != nil { - log.Debugf("unable to JSON-parse CFSSL API response body: %s", string(body)) + logrus.Debugf("unable to JSON-parse CFSSL API response body: %s", string(body)) return nil, recoverableErr{err: errors.Wrap(err, "unable to parse JSON response")} } diff --git a/vendor/src/github.com/docker/swarmkit/manager/allocator/networkallocator/portallocator.go b/vendor/src/github.com/docker/swarmkit/manager/allocator/networkallocator/portallocator.go index 21546d72b2..a7391eba6c 100644 --- a/vendor/src/github.com/docker/swarmkit/manager/allocator/networkallocator/portallocator.go +++ b/vendor/src/github.com/docker/swarmkit/manager/allocator/networkallocator/portallocator.go @@ -73,6 +73,17 @@ func newPortSpace(protocol api.PortConfig_Protocol) (*portSpace, error) { }, nil } +// getPortConfigkey returns a map key for doing set operations with +// ports. The key consists of name, protocol and target port which +// uniquely identifies a port within a single Endpoint. +func getPortConfigKey(p *api.PortConfig) api.PortConfig { + return api.PortConfig{ + Name: p.Name, + Protocol: p.Protocol, + TargetPort: p.TargetPort, + } +} + func reconcilePortConfigs(s *api.Service) []*api.PortConfig { // If runtime state hasn't been created or if port config has // changed from port state return the port config from Spec. @@ -80,15 +91,31 @@ func reconcilePortConfigs(s *api.Service) []*api.PortConfig { return s.Spec.Endpoint.Ports } + allocatedPorts := make(map[api.PortConfig]*api.PortConfig) + for _, portState := range s.Endpoint.Ports { + if portState.PublishMode != api.PublishModeIngress { + continue + } + + allocatedPorts[getPortConfigKey(portState)] = portState + } + var portConfigs []*api.PortConfig - for i, portConfig := range s.Spec.Endpoint.Ports { - portState := s.Endpoint.Ports[i] + for _, portConfig := range s.Spec.Endpoint.Ports { + // If the PublishMode is not Ingress simply pick up + // the port config. + if portConfig.PublishMode != api.PublishModeIngress { + portConfigs = append(portConfigs, portConfig) + continue + } + + portState, ok := allocatedPorts[getPortConfigKey(portConfig)] // If the portConfig is exactly the same as portState // except if SwarmPort is not user-define then prefer // portState to ensure sticky allocation of the same // port that was allocated before. - if portConfig.Name == portState.Name && + if ok && portConfig.Name == portState.Name && portConfig.TargetPort == portState.TargetPort && portConfig.Protocol == portState.Protocol && portConfig.PublishedPort == 0 { @@ -186,21 +213,26 @@ func (pa *portAllocator) isPortsAllocated(s *api.Service) bool { return false } - for i, portConfig := range s.Spec.Endpoint.Ports { + allocatedPorts := make(map[api.PortConfig]*api.PortConfig) + for _, portState := range s.Endpoint.Ports { + if portState.PublishMode != api.PublishModeIngress { + continue + } + + allocatedPorts[getPortConfigKey(portState)] = portState + } + + for _, portConfig := range s.Spec.Endpoint.Ports { // Ignore ports which are not PublishModeIngress if portConfig.PublishMode != api.PublishModeIngress { continue } - // The port configuration slice and port state slice - // are expected to be in the same order. - portState := s.Endpoint.Ports[i] + portState, ok := allocatedPorts[getPortConfigKey(portConfig)] // If name, port, protocol values don't match then we // are not allocated. - if portConfig.Name != portState.Name || - portConfig.TargetPort != portState.TargetPort || - portConfig.Protocol != portState.Protocol { + if !ok { return false } diff --git a/vendor/src/github.com/docker/swarmkit/manager/controlapi/secret.go b/vendor/src/github.com/docker/swarmkit/manager/controlapi/secret.go index ba0b86d5bb..d7498cb4b9 100644 --- a/vendor/src/github.com/docker/swarmkit/manager/controlapi/secret.go +++ b/vendor/src/github.com/docker/swarmkit/manager/controlapi/secret.go @@ -3,9 +3,11 @@ package controlapi import ( "regexp" + "github.com/Sirupsen/logrus" "github.com/docker/distribution/digest" "github.com/docker/swarmkit/api" "github.com/docker/swarmkit/identity" + "github.com/docker/swarmkit/log" "github.com/docker/swarmkit/manager/state/store" "golang.org/x/net/context" "google.golang.org/grpc" @@ -85,6 +87,12 @@ func (s *Server) UpdateSecret(ctx context.Context, request *api.UpdateSecretRequ return nil, grpc.Errorf(codes.NotFound, "secret %s not found", request.SecretID) } + log.G(ctx).WithFields(logrus.Fields{ + "secret.ID": request.SecretID, + "secret.Name": request.Spec.Annotations.Name, + "method": "UpdateSecret", + }).Debugf("secret updated") + // WARN: we should never return the actual secret data here. We need to redact the private fields first. secret.Spec.Data = nil return &api.UpdateSecretResponse{ @@ -169,6 +177,11 @@ func (s *Server) CreateSecret(ctx context.Context, request *api.CreateSecretRequ return nil, grpc.Errorf(codes.AlreadyExists, "secret %s already exists", request.Spec.Annotations.Name) case nil: secret.Spec.Data = nil // clean the actual secret data so it's never returned + log.G(ctx).WithFields(logrus.Fields{ + "secret.Name": request.Spec.Annotations.Name, + "method": "CreateSecret", + }).Debugf("secret created") + return &api.CreateSecretResponse{Secret: secret}, nil default: return nil, err @@ -191,6 +204,11 @@ func (s *Server) RemoveSecret(ctx context.Context, request *api.RemoveSecretRequ case store.ErrNotExist: return nil, grpc.Errorf(codes.NotFound, "secret %s not found", request.SecretID) case nil: + log.G(ctx).WithFields(logrus.Fields{ + "secret.ID": request.SecretID, + "method": "RemoveSecret", + }).Debugf("secret removed") + return &api.RemoveSecretResponse{}, nil default: return nil, err diff --git a/vendor/src/github.com/docker/swarmkit/manager/controlapi/service.go b/vendor/src/github.com/docker/swarmkit/manager/controlapi/service.go index 5b7d82a5b1..8fc75b72ce 100644 --- a/vendor/src/github.com/docker/swarmkit/manager/controlapi/service.go +++ b/vendor/src/github.com/docker/swarmkit/manager/controlapi/service.go @@ -2,6 +2,7 @@ package controlapi import ( "errors" + "path/filepath" "reflect" "regexp" "strconv" @@ -304,20 +305,42 @@ func (s *Server) checkPortConflicts(spec *api.ServiceSpec, serviceID string) err return nil } -// checkSecretConflicts finds if the passed in spec has secrets with conflicting targets. -func (s *Server) checkSecretConflicts(spec *api.ServiceSpec) error { +// checkSecretValidity finds if the secrets passed in spec have any conflicting targets. +func (s *Server) checkSecretValidity(spec *api.ServiceSpec) error { container := spec.Task.GetContainer() if container == nil { return nil } + // Keep a map to track all the targets that will be exposed + // The string returned is only used for logging. It could as well be struct{}{} existingTargets := make(map[string]string) for _, secretRef := range container.Secrets { - if prevSecretName, ok := existingTargets[secretRef.Target]; ok { - return grpc.Errorf(codes.InvalidArgument, "secret references '%s' and '%s' have a conflicting target: '%s'", prevSecretName, secretRef.SecretName, secretRef.Target) + // SecretID and SecretName are mandatory, we have invalid references without them + if secretRef.SecretID == "" || secretRef.SecretName == "" { + return grpc.Errorf(codes.InvalidArgument, "malformed secret reference") } - existingTargets[secretRef.Target] = secretRef.SecretName + // Every secret referece requires a Target + if secretRef.GetTarget() == nil { + return grpc.Errorf(codes.InvalidArgument, "malformed secret reference, no target provided") + } + + // If this is a file target, we will ensure filename uniqueness + if secretRef.GetFile() != nil { + fileName := secretRef.GetFile().Name + // Validate the file name + if fileName == "" || fileName != filepath.Base(filepath.Clean(fileName)) { + return grpc.Errorf(codes.InvalidArgument, "malformed file secret reference, invalid target file name provided") + } + + // If this target is already in use, we have conflicting targets + if prevSecretName, ok := existingTargets[fileName]; ok { + return grpc.Errorf(codes.InvalidArgument, "secret references '%s' and '%s' have a conflicting target: '%s'", prevSecretName, secretRef.SecretName, fileName) + } + + existingTargets[fileName] = secretRef.SecretName + } } return nil @@ -341,7 +364,7 @@ func (s *Server) CreateService(ctx context.Context, request *api.CreateServiceRe return nil, err } - if err := s.checkSecretConflicts(request.Spec); err != nil { + if err := s.checkSecretValidity(request.Spec); err != nil { return nil, err } @@ -412,7 +435,7 @@ func (s *Server) UpdateService(ctx context.Context, request *api.UpdateServiceRe } } - if err := s.checkSecretConflicts(request.Spec); err != nil { + if err := s.checkSecretValidity(request.Spec); err != nil { return nil, err } diff --git a/vendor/src/github.com/docker/swarmkit/manager/dispatcher/dispatcher.go b/vendor/src/github.com/docker/swarmkit/manager/dispatcher/dispatcher.go index 38f2fb2d32..1bcaae12e9 100644 --- a/vendor/src/github.com/docker/swarmkit/manager/dispatcher/dispatcher.go +++ b/vendor/src/github.com/docker/swarmkit/manager/dispatcher/dispatcher.go @@ -2,6 +2,7 @@ package dispatcher import ( "fmt" + "net" "strconv" "sync" "time" @@ -313,17 +314,16 @@ func (d *Dispatcher) markNodesUnknown(ctx context.Context) error { if node.Status.State == api.NodeStatus_DOWN { return nil } - node.Status = api.NodeStatus{ - State: api.NodeStatus_UNKNOWN, - Message: `Node moved to "unknown" state due to leadership change in cluster`, - } + + node.Status.State = api.NodeStatus_UNKNOWN + node.Status.Message = `Node moved to "unknown" state due to leadership change in cluster` + nodeID := node.ID expireFunc := func() { log := log.WithField("node", nodeID) - nodeStatus := api.NodeStatus{State: api.NodeStatus_DOWN, Message: `heartbeat failure for node in "unknown" state`} log.Debugf("heartbeat expiration for unknown node") - if err := d.nodeRemove(nodeID, nodeStatus); err != nil { + if err := d.markNodeNotReady(nodeID, api.NodeStatus_DOWN, `heartbeat failure for node in "unknown" state`); err != nil { log.WithError(err).Errorf(`failed deregistering node after heartbeat expiration for node in "unknown" state`) } } @@ -356,12 +356,18 @@ func (d *Dispatcher) isRunning() bool { return true } -// updateNode updates the description of a node and sets status to READY +// markNodeReady updates the description of a node, updates its address, and sets status to READY // this is used during registration when a new node description is provided // and during node updates when the node description changes -func (d *Dispatcher) updateNode(nodeID string, description *api.NodeDescription) error { +func (d *Dispatcher) markNodeReady(nodeID string, description *api.NodeDescription, addr string) error { d.nodeUpdatesLock.Lock() - d.nodeUpdates[nodeID] = nodeUpdate{status: &api.NodeStatus{State: api.NodeStatus_READY}, description: description} + d.nodeUpdates[nodeID] = nodeUpdate{ + status: &api.NodeStatus{ + State: api.NodeStatus_READY, + Addr: addr, + }, + description: description, + } numUpdates := len(d.nodeUpdates) d.nodeUpdatesLock.Unlock() @@ -387,6 +393,19 @@ func (d *Dispatcher) updateNode(nodeID string, description *api.NodeDescription) return nil } +// gets the node IP from the context of a grpc call +func nodeIPFromContext(ctx context.Context) (string, error) { + nodeInfo, err := ca.RemoteNode(ctx) + if err != nil { + return "", err + } + addr, _, err := net.SplitHostPort(nodeInfo.RemoteAddr) + if err != nil { + return "", errors.Wrap(err, "unable to get ip from addr:port") + } + return addr, nil +} + // register is used for registration of node with particular dispatcher. func (d *Dispatcher) register(ctx context.Context, nodeID string, description *api.NodeDescription) (string, error) { // prevent register until we're ready to accept it @@ -407,14 +426,18 @@ func (d *Dispatcher) register(ctx context.Context, nodeID string, description *a return "", ErrNodeNotFound } - if err := d.updateNode(nodeID, description); err != nil { + addr, err := nodeIPFromContext(ctx) + if err != nil { + log.G(ctx).Debugf(err.Error()) + } + + if err := d.markNodeReady(nodeID, description, addr); err != nil { return "", err } expireFunc := func() { - nodeStatus := api.NodeStatus{State: api.NodeStatus_DOWN, Message: "heartbeat failure"} log.G(ctx).Debugf("heartbeat expiration") - if err := d.nodeRemove(nodeID, nodeStatus); err != nil { + if err := d.markNodeNotReady(nodeID, api.NodeStatus_DOWN, "heartbeat failure"); err != nil { log.G(ctx).WithError(err).Errorf("failed deregistering node after heartbeat expiration") } } @@ -575,7 +598,11 @@ func (d *Dispatcher) processUpdates() { } if nodeUpdate.status != nil { - node.Status = *nodeUpdate.status + node.Status.State = nodeUpdate.status.State + node.Status.Message = nodeUpdate.status.Message + if nodeUpdate.status.Addr != "" { + node.Status.Addr = nodeUpdate.status.Addr + } } if nodeUpdate.description != nil { node.Description = nodeUpdate.description @@ -782,13 +809,18 @@ func (d *Dispatcher) Assignments(r *api.AssignmentsRequest, stream api.Dispatche } var newSecrets []*api.Secret for _, secretRef := range container.Secrets { + // Empty ID prefix will return all secrets. Bail if there is no SecretID + if secretRef.SecretID == "" { + log.Debugf("invalid secret reference") + continue + } secretID := secretRef.SecretID log := log.WithFields(logrus.Fields{ "secret.id": secretID, "secret.name": secretRef.SecretName, }) - if tasksUsingSecret[secretID] == nil { + if len(tasksUsingSecret[secretID]) == 0 { tasksUsingSecret[secretID] = make(map[string]struct{}) secrets, err := store.FindSecrets(readTx, store.ByIDPrefix(secretID)) @@ -1046,18 +1078,24 @@ func (d *Dispatcher) Assignments(r *api.AssignmentsRequest, stream api.Dispatche } } for id, secret := range updateSecrets { - if _, ok := removeSecrets[id]; !ok { - secretChange := &api.AssignmentChange{ - Assignment: &api.Assignment{ - Item: &api.Assignment_Secret{ - Secret: secret, - }, - }, - Action: api.AssignmentChange_AssignmentActionUpdate, - } - - update.Changes = append(update.Changes, secretChange) + // If, due to multiple updates, this secret is no longer in use, + // don't send it down. + if len(tasksUsingSecret[id]) == 0 { + // delete this secret for the secrets to be updated + // so that deleteSecrets knows the current list + delete(updateSecrets, id) + continue } + secretChange := &api.AssignmentChange{ + Assignment: &api.Assignment{ + Item: &api.Assignment_Secret{ + Secret: secret, + }, + }, + Action: api.AssignmentChange_AssignmentActionUpdate, + } + + update.Changes = append(update.Changes, secretChange) } for id := range removeTasks { taskChange := &api.AssignmentChange{ @@ -1072,6 +1110,12 @@ func (d *Dispatcher) Assignments(r *api.AssignmentsRequest, stream api.Dispatche update.Changes = append(update.Changes, taskChange) } for id := range removeSecrets { + // If this secret is also being sent on the updated set + // don't also add it to the removed set + if _, ok := updateSecrets[id]; ok { + continue + } + secretChange := &api.AssignmentChange{ Assignment: &api.Assignment{ Item: &api.Assignment_Secret{ @@ -1091,13 +1135,22 @@ func (d *Dispatcher) Assignments(r *api.AssignmentsRequest, stream api.Dispatche } } -func (d *Dispatcher) nodeRemove(id string, status api.NodeStatus) error { +// markNodeNotReady sets the node state to some state other than READY +func (d *Dispatcher) markNodeNotReady(id string, state api.NodeStatus_State, message string) error { if err := d.isRunningLocked(); err != nil { return err } + status := &api.NodeStatus{ + State: state, + Message: message, + } + d.nodeUpdatesLock.Lock() - d.nodeUpdates[id] = nodeUpdate{status: status.Copy(), description: d.nodeUpdates[id].description} + // pluck the description out of nodeUpdates. this protects against a case + // where a node is marked ready and a description is added, but then the + // node is immediately marked not ready. this preserves that description + d.nodeUpdates[id] = nodeUpdate{status: status, description: d.nodeUpdates[id].description} numUpdates := len(d.nodeUpdates) d.nodeUpdatesLock.Unlock() @@ -1159,14 +1212,19 @@ func (d *Dispatcher) Session(r *api.SessionRequest, stream api.Dispatcher_Sessio var sessionID string if _, err := d.nodes.GetWithSession(nodeID, r.SessionID); err != nil { // register the node. - sessionID, err = d.register(stream.Context(), nodeID, r.Description) + sessionID, err = d.register(ctx, nodeID, r.Description) if err != nil { return err } } else { sessionID = r.SessionID + // get the node IP addr + addr, err := nodeIPFromContext(stream.Context()) + if err != nil { + log.G(ctx).Debugf(err.Error()) + } // update the node description - if err := d.updateNode(nodeID, r.Description); err != nil { + if err := d.markNodeReady(nodeID, r.Description, addr); err != nil { return err } } @@ -1226,8 +1284,7 @@ func (d *Dispatcher) Session(r *api.SessionRequest, stream api.Dispatcher_Sessio } } - nodeStatus := api.NodeStatus{State: api.NodeStatus_DISCONNECTED, Message: "node is currently trying to find new manager"} - if err := d.nodeRemove(nodeID, nodeStatus); err != nil { + if err := d.markNodeNotReady(nodeID, api.NodeStatus_DISCONNECTED, "node is currently trying to find new manager"); err != nil { log.WithError(err).Error("failed to remove node") } // still return an abort if the transport closure was ineffective. diff --git a/vendor/src/github.com/docker/swarmkit/manager/manager.go b/vendor/src/github.com/docker/swarmkit/manager/manager.go index b73061b1a5..6a854e0583 100644 --- a/vendor/src/github.com/docker/swarmkit/manager/manager.go +++ b/vendor/src/github.com/docker/swarmkit/manager/manager.go @@ -7,6 +7,7 @@ import ( "net" "os" "path/filepath" + "runtime" "sync" "syscall" "time" @@ -30,6 +31,7 @@ import ( "github.com/docker/swarmkit/manager/state/raft" "github.com/docker/swarmkit/manager/state/store" "github.com/docker/swarmkit/protobuf/ptypes" + "github.com/docker/swarmkit/xnet" "github.com/pkg/errors" "golang.org/x/net/context" "google.golang.org/grpc" @@ -40,6 +42,16 @@ const ( defaultTaskHistoryRetentionLimit = 5 ) +// RemoteAddrs provides an listening address and an optional advertise address +// for serving the remote API. +type RemoteAddrs struct { + // Address to bind + ListenAddr string + + // Address to advertise to remote nodes (optional). + AdvertiseAddr string +} + // Config is used to tune the Manager. type Config struct { SecurityConfig *ca.SecurityConfig @@ -48,13 +60,12 @@ type Config struct { // will make certificate signing requests for node certificates. ExternalCAs []*api.ExternalCA - ProtoAddr map[string]string - // ProtoListener will be used for grpc serving if it's not nil, - // ProtoAddr fields will be used to create listeners otherwise. - ProtoListener map[string]net.Listener + // ControlAPI is an address for serving the control API. + ControlAPI string - // AdvertiseAddr is a map of addresses to advertise, by protocol. - AdvertiseAddr string + // RemoteAPI is a listening address for serving the remote API, and + // an optional advertise address. + RemoteAPI RemoteAddrs // JoinRaft is an optional address of a node in an existing raft // cluster to join. @@ -81,7 +92,7 @@ type Config struct { // subsystems. type Manager struct { config *Config - listeners map[string]net.Listener + listeners []net.Listener caserver *ca.Server dispatcher *dispatcher.Dispatcher @@ -96,10 +107,11 @@ type Manager struct { localserver *grpc.Server raftNode *raft.Node - mu sync.Mutex + cancelFunc context.CancelFunc + mu sync.Mutex started chan struct{} - stopped chan struct{} + stopped bool } type closeOnceListener struct { @@ -119,41 +131,28 @@ func (l *closeOnceListener) Close() error { func New(config *Config) (*Manager, error) { dispatcherConfig := dispatcher.DefaultConfig() - if config.ProtoAddr == nil { - config.ProtoAddr = make(map[string]string) - } - - if config.ProtoListener != nil && config.ProtoListener["tcp"] != nil { - config.ProtoAddr["tcp"] = config.ProtoListener["tcp"].Addr().String() - } - // If an AdvertiseAddr was specified, we use that as our // externally-reachable address. - tcpAddr := config.AdvertiseAddr + advertiseAddr := config.RemoteAPI.AdvertiseAddr - var tcpAddrPort string - if tcpAddr == "" { + var advertiseAddrPort string + if advertiseAddr == "" { // Otherwise, we know we are joining an existing swarm. Use a // wildcard address to trigger remote autodetection of our // address. var err error - _, tcpAddrPort, err = net.SplitHostPort(config.ProtoAddr["tcp"]) + _, advertiseAddrPort, err = net.SplitHostPort(config.RemoteAPI.ListenAddr) if err != nil { - return nil, fmt.Errorf("missing or invalid listen address %s", config.ProtoAddr["tcp"]) + return nil, fmt.Errorf("missing or invalid listen address %s", config.RemoteAPI.ListenAddr) } // Even with an IPv6 listening address, it's okay to use // 0.0.0.0 here. Any "unspecified" (wildcard) IP will // be substituted with the actual source address. - tcpAddr = net.JoinHostPort("0.0.0.0", tcpAddrPort) + advertiseAddr = net.JoinHostPort("0.0.0.0", advertiseAddrPort) } - err := os.MkdirAll(filepath.Dir(config.ProtoAddr["unix"]), 0700) - if err != nil { - return nil, errors.Wrap(err, "failed to create socket directory") - } - - err = os.MkdirAll(config.StateDir, 0700) + err := os.MkdirAll(config.StateDir, 0700) if err != nil { return nil, errors.Wrap(err, "failed to create state directory") } @@ -164,41 +163,49 @@ func New(config *Config) (*Manager, error) { return nil, errors.Wrap(err, "failed to create raft state directory") } - var listeners map[string]net.Listener - if len(config.ProtoListener) > 0 { - listeners = config.ProtoListener - } else { - listeners = make(map[string]net.Listener) + var listeners []net.Listener - for proto, addr := range config.ProtoAddr { - l, err := net.Listen(proto, addr) - - // A unix socket may fail to bind if the file already - // exists. Try replacing the file. - unwrappedErr := err - if op, ok := unwrappedErr.(*net.OpError); ok { - unwrappedErr = op.Err - } - if sys, ok := unwrappedErr.(*os.SyscallError); ok { - unwrappedErr = sys.Err - } - if proto == "unix" && unwrappedErr == syscall.EADDRINUSE { - os.Remove(addr) - l, err = net.Listen(proto, addr) - if err != nil { - return nil, err - } - } else if err != nil { - return nil, err - } - if proto == "tcp" && tcpAddrPort == "0" { - // in case of 0 port - tcpAddr = l.Addr().String() - } - listeners[proto] = l + // don't create a socket directory if we're on windows. we used named pipe + if runtime.GOOS != "windows" { + err := os.MkdirAll(filepath.Dir(config.ControlAPI), 0700) + if err != nil { + return nil, errors.Wrap(err, "failed to create socket directory") } } + l, err := xnet.ListenLocal(config.ControlAPI) + + // A unix socket may fail to bind if the file already + // exists. Try replacing the file. + if runtime.GOOS != "windows" { + unwrappedErr := err + if op, ok := unwrappedErr.(*net.OpError); ok { + unwrappedErr = op.Err + } + if sys, ok := unwrappedErr.(*os.SyscallError); ok { + unwrappedErr = sys.Err + } + if unwrappedErr == syscall.EADDRINUSE { + os.Remove(config.ControlAPI) + l, err = xnet.ListenLocal(config.ControlAPI) + } + } + if err != nil { + return nil, errors.Wrap(err, "failed to listen on control API address") + } + + listeners = append(listeners, l) + + l, err = net.Listen("tcp", config.RemoteAPI.ListenAddr) + if err != nil { + return nil, errors.Wrap(err, "failed to listen on remote API address") + } + if advertiseAddrPort == "0" { + advertiseAddr = l.Addr().String() + config.RemoteAPI.ListenAddr = advertiseAddr + } + listeners = append(listeners, l) + raftCfg := raft.DefaultNodeConfig() if config.ElectionTick > 0 { @@ -210,7 +217,7 @@ func New(config *Config) (*Manager, error) { newNodeOpts := raft.NodeOptions{ ID: config.SecurityConfig.ClientTLSCreds.NodeID(), - Addr: tcpAddr, + Addr: advertiseAddr, JoinAddr: config.JoinRaft, Config: raftCfg, StateDir: raftStateDir, @@ -231,18 +238,14 @@ func New(config *Config) (*Manager, error) { localserver: grpc.NewServer(opts...), raftNode: raftNode, started: make(chan struct{}), - stopped: make(chan struct{}), } return m, nil } // Addr returns tcp address on which remote api listens. -func (m *Manager) Addr() net.Addr { - if l, ok := m.listeners["tcp"]; ok { - return l.Addr() - } - return nil +func (m *Manager) Addr() string { + return m.config.RemoteAPI.ListenAddr } // Run starts all manager sub-systems and the gRPC server at the configured @@ -252,14 +255,7 @@ func (m *Manager) Run(parent context.Context) error { ctx, ctxCancel := context.WithCancel(parent) defer ctxCancel() - // Harakiri. - go func() { - select { - case <-ctx.Done(): - case <-m.stopped: - ctxCancel() - } - }() + m.cancelFunc = ctxCancel leadershipCh, cancel := m.raftNode.SubscribeLeadership() defer cancel() @@ -336,8 +332,8 @@ func (m *Manager) Run(parent context.Context) error { localHealthServer.SetServingStatus("ControlAPI", api.HealthCheckResponse_NOT_SERVING) errServe := make(chan error, len(m.listeners)) - for proto, l := range m.listeners { - go m.serveListener(ctx, errServe, proto, l) + for _, lis := range m.listeners { + go m.serveListener(ctx, errServe, lis) } defer func() { @@ -383,24 +379,14 @@ func (m *Manager) Run(parent context.Context) error { // wait for an error in serving. err = <-errServe - select { - // check to see if stopped was posted to. if so, we're in the process of - // stopping, or done and that's why we got the error. if stopping is - // deliberate, stopped will ALWAYS be closed before the error is trigger, - // so this path will ALWAYS be taken if the stop was deliberate - case <-m.stopped: - // shutdown was requested, do not return an error - // but first, we wait to acquire a mutex to guarantee that stopping is - // finished. as long as we acquire the mutex BEFORE we return, we know - // that stopping is stopped. - m.mu.Lock() + m.mu.Lock() + if m.stopped { m.mu.Unlock() return nil - // otherwise, we'll get something from errServe, which indicates that an - // error in serving has actually occurred and this isn't a planned shutdown - default: - return err } + m.mu.Unlock() + m.Stop(ctx) + return err } const stopTimeout = 8 * time.Second @@ -417,13 +403,10 @@ func (m *Manager) Stop(ctx context.Context) { // from returning before we've finished stopping. m.mu.Lock() defer m.mu.Unlock() - select { - // check to see that we've already stopped - case <-m.stopped: + if m.stopped { return - default: - // do nothing, we're stopping for the first time } + m.stopped = true srvDone, localSrvDone := make(chan struct{}), make(chan struct{}) go func() { @@ -460,11 +443,7 @@ func (m *Manager) Stop(ctx context.Context) { m.keyManager.Stop() } - // once we start stopping, send a signal that we're doing so. this tells - // Run that we've started stopping, when it gets the error from errServe - // it also prevents the loop from processing any more stuff. - close(m.stopped) - + m.cancelFunc() <-m.raftNode.Done() timer := time.AfterFunc(stopTimeout, func() { @@ -582,11 +561,9 @@ func (m *Manager) handleLeadershipEvents(ctx context.Context, leadershipCh chan select { case leadershipEvent := <-leadershipCh: m.mu.Lock() - select { - case <-m.stopped: + if m.stopped { m.mu.Unlock() return - default: } newState := leadershipEvent.(raft.LeadershipState) @@ -596,8 +573,6 @@ func (m *Manager) handleLeadershipEvents(ctx context.Context, leadershipCh chan m.becomeFollower() } m.mu.Unlock() - case <-m.stopped: - return case <-ctx.Done(): return } @@ -605,20 +580,21 @@ func (m *Manager) handleLeadershipEvents(ctx context.Context, leadershipCh chan } // serveListener serves a listener for local and non local connections. -func (m *Manager) serveListener(ctx context.Context, errServe chan error, proto string, lis net.Listener) { +func (m *Manager) serveListener(ctx context.Context, errServe chan error, l net.Listener) { ctx = log.WithLogger(ctx, log.G(ctx).WithFields( logrus.Fields{ - "proto": lis.Addr().Network(), - "addr": lis.Addr().String()})) - if proto == "unix" { + "proto": l.Addr().Network(), + "addr": l.Addr().String(), + })) + if _, ok := l.(*net.TCPListener); !ok { log.G(ctx).Info("Listening for local connections") // we need to disallow double closes because UnixListener.Close // can delete unix-socket file of newer listener. grpc calls // Close twice indeed: in Serve and in Stop. - errServe <- m.localserver.Serve(&closeOnceListener{Listener: lis}) + errServe <- m.localserver.Serve(&closeOnceListener{Listener: l}) } else { log.G(ctx).Info("Listening for connections") - errServe <- m.server.Serve(lis) + errServe <- m.server.Serve(l) } } diff --git a/vendor/src/github.com/docker/swarmkit/manager/orchestrator/global/global.go b/vendor/src/github.com/docker/swarmkit/manager/orchestrator/global/global.go index 9252d6a831..c60694f367 100644 --- a/vendor/src/github.com/docker/swarmkit/manager/orchestrator/global/global.go +++ b/vendor/src/github.com/docker/swarmkit/manager/orchestrator/global/global.go @@ -205,7 +205,7 @@ func (g *Orchestrator) removeTasksFromNode(ctx context.Context, node *api.Node) return nil }) if err != nil { - log.G(ctx).WithError(err).Errorf("global orchestrator: removeTasksFromNode failed") + log.G(ctx).WithError(err).Errorf("global orchestrator: removeTasksFromNode failed batching tasks") } } diff --git a/vendor/src/github.com/docker/swarmkit/manager/state/raft/raft.go b/vendor/src/github.com/docker/swarmkit/manager/state/raft/raft.go index 3621348277..7f4a3c7452 100644 --- a/vendor/src/github.com/docker/swarmkit/manager/state/raft/raft.go +++ b/vendor/src/github.com/docker/swarmkit/manager/state/raft/raft.go @@ -1689,7 +1689,7 @@ func getIDs(snap *raftpb.Snapshot, ents []raftpb.Entry) []uint64 { case raftpb.ConfChangeUpdateNode: // do nothing default: - log.L.Panic("ConfChange Type should be either ConfChangeAddNode or ConfChangeRemoveNode!") + log.L.Panic("ConfChange Type should be either ConfChangeAddNode, or ConfChangeRemoveNode, or ConfChangeUpdateNode!") } } var sids []uint64 diff --git a/vendor/src/github.com/docker/swarmkit/node/node.go b/vendor/src/github.com/docker/swarmkit/node/node.go index d673b6a5c7..53195d7a90 100644 --- a/vendor/src/github.com/docker/swarmkit/node/node.go +++ b/vendor/src/github.com/docker/swarmkit/node/node.go @@ -22,6 +22,7 @@ import ( "github.com/docker/swarmkit/log" "github.com/docker/swarmkit/manager" "github.com/docker/swarmkit/remotes" + "github.com/docker/swarmkit/xnet" "github.com/pkg/errors" "golang.org/x/net/context" "google.golang.org/grpc" @@ -116,10 +117,10 @@ func (n *Node) RemoteAPIAddr() (string, error) { return "", errors.Errorf("node is not manager") } addr := n.manager.Addr() - if addr == nil { + if addr == "" { return "", errors.Errorf("manager addr is not set") } - return addr.String(), nil + return addr, nil } // New returns new Node instance. @@ -554,12 +555,10 @@ func (n *Node) initManagerConnection(ctx context.Context, ready chan<- struct{}) opts := []grpc.DialOption{} insecureCreds := credentials.NewTLS(&tls.Config{InsecureSkipVerify: true}) opts = append(opts, grpc.WithTransportCredentials(insecureCreds)) - // Using listen address instead of advertised address because this is a - // local connection. addr := n.config.ListenControlAPI opts = append(opts, grpc.WithDialer( func(addr string, timeout time.Duration) (net.Conn, error) { - return net.DialTimeout("unix", addr, timeout) + return xnet.DialTimeoutLocal(addr, timeout) })) conn, err := grpc.Dial(addr, opts...) if err != nil { @@ -623,11 +622,11 @@ func (n *Node) runManager(ctx context.Context, securityConfig *ca.SecurityConfig remoteAddr, _ := n.remotes.Select(n.NodeID()) m, err := manager.New(&manager.Config{ ForceNewCluster: n.config.ForceNewCluster, - ProtoAddr: map[string]string{ - "tcp": n.config.ListenRemoteAPI, - "unix": n.config.ListenControlAPI, + RemoteAPI: manager.RemoteAddrs{ + ListenAddr: n.config.ListenRemoteAPI, + AdvertiseAddr: n.config.AdvertiseRemoteAPI, }, - AdvertiseAddr: n.config.AdvertiseRemoteAPI, + ControlAPI: n.config.ListenControlAPI, SecurityConfig: securityConfig, ExternalCAs: n.config.ExternalCAs, JoinRaft: remoteAddr.Addr, diff --git a/vendor/src/github.com/docker/swarmkit/protobuf/plugin/gen.go b/vendor/src/github.com/docker/swarmkit/protobuf/plugin/gen.go index 1552a2f01b..b68b83798a 100644 --- a/vendor/src/github.com/docker/swarmkit/protobuf/plugin/gen.go +++ b/vendor/src/github.com/docker/swarmkit/protobuf/plugin/gen.go @@ -1,3 +1,3 @@ package plugin -//go:generate protoc -I.:../../vendor/github.com/gogo/protobuf/protobuf --gogoswarm_out=import_path=github.com/docker/swarmkit/protobuf/plugin,Mgoogle/protobuf/descriptor.proto=github.com/gogo/protobuf/protoc-gen-gogo/descriptor:. plugin.proto +//go:generate protoc -I.:/usr/local --gogoswarm_out=import_path=github.com/docker/swarmkit/protobuf/plugin,Mgoogle/protobuf/descriptor.proto=github.com/gogo/protobuf/protoc-gen-gogo/descriptor:. plugin.proto diff --git a/vendor/src/github.com/docker/swarmkit/xnet/xnet_unix.go b/vendor/src/github.com/docker/swarmkit/xnet/xnet_unix.go new file mode 100644 index 0000000000..7dc7732345 --- /dev/null +++ b/vendor/src/github.com/docker/swarmkit/xnet/xnet_unix.go @@ -0,0 +1,20 @@ +// +build !windows + +package xnet + +import ( + "net" + "time" +) + +// ListenLocal opens a local socket for control communication +func ListenLocal(socket string) (net.Listener, error) { + // on unix it's just a unix socket + return net.Listen("unix", socket) +} + +// DialTimeoutLocal is a DialTimeout function for local sockets +func DialTimeoutLocal(socket string, timeout time.Duration) (net.Conn, error) { + // on unix, we dial a unix socket + return net.DialTimeout("unix", socket, timeout) +} diff --git a/vendor/src/github.com/docker/swarmkit/xnet/xnet_windows.go b/vendor/src/github.com/docker/swarmkit/xnet/xnet_windows.go new file mode 100644 index 0000000000..38385a7e3a --- /dev/null +++ b/vendor/src/github.com/docker/swarmkit/xnet/xnet_windows.go @@ -0,0 +1,31 @@ +// +build windows + +package xnet + +import ( + "net" + "time" + + "github.com/Microsoft/go-winio" +) + +// ListenLocal opens a local socket for control communication +func ListenLocal(socket string) (net.Listener, error) { + // set up ACL for the named pipe + // allow Administrators and SYSTEM + sddl := "D:P(A;;GA;;;BA)(A;;GA;;;SY)" + c := winio.PipeConfig{ + SecurityDescriptor: sddl, + MessageMode: true, // Use message mode so that CloseWrite() is supported + InputBufferSize: 65536, // Use 64KB buffers to improve performance + OutputBufferSize: 65536, + } + // on windows, our socket is actually a named pipe + return winio.ListenPipe(socket, &c) +} + +// DialTimeoutLocal is a DialTimeout function for local sockets +func DialTimeoutLocal(socket string, timeout time.Duration) (net.Conn, error) { + // On windows, we dial a named pipe + return winio.DialPipe(socket, &timeout) +}