瀏覽代碼

Vendor swarmkit f420c4b9e1535170fc229db97ee8ac32374020b1

Signed-off-by: Nishant Totla <nishanttotla@gmail.com>
Nishant Totla 8 年之前
父節點
當前提交
1b68641fc8

+ 1 - 1
vendor.conf

@@ -108,7 +108,7 @@ github.com/docker/containerd 9048e5e50717ea4497b757314bad98ea3763c145
 github.com/tonistiigi/fifo 1405643975692217d6720f8b54aeee1bf2cd5cf4
 
 # cluster
-github.com/docker/swarmkit 8f053c2030ebfc90f19f241fb7880e95b9761b7a
+github.com/docker/swarmkit f420c4b9e1535170fc229db97ee8ac32374020b1
 github.com/gogo/protobuf 8d70fb3182befc465c4a1eac8ad4d38ff49778e2
 github.com/cloudflare/cfssl 7fb22c8cba7ecaf98e4082d22d65800cf45e042a
 github.com/google/certificate-transparency d90e65c3a07988180c5b1ece71791c0b6506826e

+ 8 - 3
vendor/github.com/docker/swarmkit/agent/agent.go

@@ -245,7 +245,12 @@ func (a *Agent) run(ctx context.Context) {
 			nodeDescription = newNodeDescription
 			// close the session
 			log.G(ctx).Info("agent: found node update")
-			session.sendError(nil)
+
+			if err := session.close(); err != nil {
+				log.G(ctx).WithError(err).Error("agent: closing session failed")
+			}
+			sessionq = nil
+			registered = nil
 		}
 	}
 
@@ -315,8 +320,8 @@ func (a *Agent) run(ctx context.Context) {
 			sessionq = a.sessionq
 		case err := <-session.errs:
 			// TODO(stevvooe): This may actually block if a session is closed
-			// but no error was sent. Session.close must only be called here
-			// for this to work.
+			// but no error was sent. This must be the only place
+			// session.close is called in response to errors, for this to work.
 			if err != nil {
 				log.G(ctx).WithError(err).Error("agent: session failed")
 				backoff = initialSessionFailureBackoff + 2*backoff

+ 14 - 4
vendor/github.com/docker/swarmkit/agent/session.go

@@ -14,9 +14,8 @@ import (
 	"google.golang.org/grpc/codes"
 )
 
-const dispatcherRPCTimeout = 5 * time.Second
-
 var (
+	dispatcherRPCTimeout = 5 * time.Second
 	errSessionDisconnect = errors.New("agent: session disconnect") // instructed to disconnect
 	errSessionClosed     = errors.New("agent: session closed")
 )
@@ -39,12 +38,14 @@ type session struct {
 	assignments   chan *api.AssignmentsMessage
 	subscriptions chan *api.SubscriptionMessage
 
+	cancel     func()        // this is assumed to be never nil, and set whenever a session is created
 	registered chan struct{} // closed registration
 	closed     chan struct{}
 	closeOnce  sync.Once
 }
 
 func newSession(ctx context.Context, agent *Agent, delay time.Duration, sessionID string, description *api.NodeDescription) *session {
+	sessionCtx, sessionCancel := context.WithCancel(ctx)
 	s := &session{
 		agent:         agent,
 		sessionID:     sessionID,
@@ -54,6 +55,7 @@ func newSession(ctx context.Context, agent *Agent, delay time.Duration, sessionI
 		subscriptions: make(chan *api.SubscriptionMessage),
 		registered:    make(chan struct{}),
 		closed:        make(chan struct{}),
+		cancel:        sessionCancel,
 	}
 
 	// TODO(stevvooe): Need to move connection management up a level or create
@@ -69,7 +71,7 @@ func newSession(ctx context.Context, agent *Agent, delay time.Duration, sessionI
 	}
 	s.conn = cc
 
-	go s.run(ctx, delay, description)
+	go s.run(sessionCtx, delay, description)
 	return s
 }
 
@@ -114,6 +116,14 @@ func (s *session) start(ctx context.Context, description *api.NodeDescription) e
 	// Note: we don't defer cancellation of this context, because the
 	// streaming RPC is used after this function returned. We only cancel
 	// it in the timeout case to make sure the goroutine completes.
+
+	// We also fork this context again from the `run` context, because on
+	// `dispatcherRPCTimeout`, we want to cancel establishing a session and
+	// return an error.  If we cancel the `run` context instead of forking,
+	// then in `run` it's possible that we just terminate the function because
+	// `ctx` is done and hence fail to propagate the timeout error to the agent.
+	// If the error is not propogated to the agent, the agent will not close
+	// the session or rebuild a new sesssion.
 	sessionCtx, cancelSession := context.WithCancel(ctx)
 
 	// Need to run Session in a goroutine since there's no way to set a
@@ -402,10 +412,10 @@ func (s *session) sendError(err error) {
 // of event loop.
 func (s *session) close() error {
 	s.closeOnce.Do(func() {
+		s.cancel()
 		if s.conn != nil {
 			s.conn.Close(false)
 		}
-
 		close(s.closed)
 	})
 

+ 1 - 1
vendor/github.com/docker/swarmkit/api/gen.go

@@ -1,3 +1,3 @@
 package api
 
-//go:generate protoc -I.:../protobuf:../vendor:../vendor/github.com/gogo/protobuf --gogoswarm_out=plugins=grpc+deepcopy+storeobject+raftproxy+authenticatedwrapper,import_path=github.com/docker/swarmkit/api,Mgogoproto/gogo.proto=github.com/gogo/protobuf/gogoproto,Mgoogle/protobuf/descriptor.proto=github.com/gogo/protobuf/protoc-gen-gogo/descriptor,Mplugin/plugin.proto=github.com/docker/swarmkit/protobuf/plugin,Mgoogle/protobuf/duration.proto=github.com/gogo/protobuf/types,Mgoogle/protobuf/timestamp.proto=github.com/gogo/protobuf/types,Mgoogle/protobuf/any.proto=github.com/gogo/protobuf/types:. types.proto specs.proto objects.proto control.proto dispatcher.proto ca.proto snapshot.proto raft.proto health.proto resource.proto logbroker.proto store.proto
+//go:generate protoc -I.:../protobuf:../vendor:../vendor/github.com/gogo/protobuf --gogoswarm_out=plugins=grpc+deepcopy+storeobject+raftproxy+authenticatedwrapper,import_path=github.com/docker/swarmkit/api,Mgogoproto/gogo.proto=github.com/gogo/protobuf/gogoproto,Mgoogle/protobuf/descriptor.proto=github.com/gogo/protobuf/protoc-gen-gogo/descriptor,Mplugin/plugin.proto=github.com/docker/swarmkit/protobuf/plugin,Mgoogle/protobuf/duration.proto=github.com/gogo/protobuf/types,Mgoogle/protobuf/timestamp.proto=github.com/gogo/protobuf/types,Mgoogle/protobuf/any.proto=github.com/gogo/protobuf/types:. types.proto specs.proto objects.proto control.proto dispatcher.proto ca.proto snapshot.proto raft.proto health.proto resource.proto logbroker.proto watch.proto

+ 316 - 64
vendor/github.com/docker/swarmkit/api/logbroker.pb.go

@@ -118,6 +118,16 @@ func (m *LogContext) Reset()                    { *m = LogContext{} }
 func (*LogContext) ProtoMessage()               {}
 func (*LogContext) Descriptor() ([]byte, []int) { return fileDescriptorLogbroker, []int{2} }
 
+// LogAttr is an extra key/value pair that may be have been set by users
+type LogAttr struct {
+	Key   string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
+	Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
+}
+
+func (m *LogAttr) Reset()                    { *m = LogAttr{} }
+func (*LogAttr) ProtoMessage()               {}
+func (*LogAttr) Descriptor() ([]byte, []int) { return fileDescriptorLogbroker, []int{3} }
+
 // LogMessage
 type LogMessage struct {
 	// Context identifies the source of the log message.
@@ -129,11 +139,14 @@ type LogMessage struct {
 	Stream LogStream `protobuf:"varint,3,opt,name=stream,proto3,enum=docker.swarmkit.v1.LogStream" json:"stream,omitempty"`
 	// Data is the raw log message, as generated by the application.
 	Data []byte `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"`
+	// Attrs is a list of key value pairs representing additional log details
+	// that may have been returned from the logger
+	Attrs []LogAttr `protobuf:"bytes,5,rep,name=attrs" json:"attrs"`
 }
 
 func (m *LogMessage) Reset()                    { *m = LogMessage{} }
 func (*LogMessage) ProtoMessage()               {}
-func (*LogMessage) Descriptor() ([]byte, []int) { return fileDescriptorLogbroker, []int{3} }
+func (*LogMessage) Descriptor() ([]byte, []int) { return fileDescriptorLogbroker, []int{4} }
 
 type SubscribeLogsRequest struct {
 	// LogSelector describes the logs to which the subscriber is
@@ -143,7 +156,7 @@ type SubscribeLogsRequest struct {
 
 func (m *SubscribeLogsRequest) Reset()                    { *m = SubscribeLogsRequest{} }
 func (*SubscribeLogsRequest) ProtoMessage()               {}
-func (*SubscribeLogsRequest) Descriptor() ([]byte, []int) { return fileDescriptorLogbroker, []int{4} }
+func (*SubscribeLogsRequest) Descriptor() ([]byte, []int) { return fileDescriptorLogbroker, []int{5} }
 
 type SubscribeLogsMessage struct {
 	Messages []LogMessage `protobuf:"bytes,1,rep,name=messages" json:"messages"`
@@ -151,7 +164,7 @@ type SubscribeLogsMessage struct {
 
 func (m *SubscribeLogsMessage) Reset()                    { *m = SubscribeLogsMessage{} }
 func (*SubscribeLogsMessage) ProtoMessage()               {}
-func (*SubscribeLogsMessage) Descriptor() ([]byte, []int) { return fileDescriptorLogbroker, []int{5} }
+func (*SubscribeLogsMessage) Descriptor() ([]byte, []int) { return fileDescriptorLogbroker, []int{6} }
 
 // ListenSubscriptionsRequest is a placeholder to begin listening for
 // subscriptions.
@@ -161,7 +174,7 @@ type ListenSubscriptionsRequest struct {
 func (m *ListenSubscriptionsRequest) Reset()      { *m = ListenSubscriptionsRequest{} }
 func (*ListenSubscriptionsRequest) ProtoMessage() {}
 func (*ListenSubscriptionsRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptorLogbroker, []int{6}
+	return fileDescriptorLogbroker, []int{7}
 }
 
 // SubscriptionMessage instructs the listener to start publishing messages for
@@ -182,7 +195,7 @@ type SubscriptionMessage struct {
 
 func (m *SubscriptionMessage) Reset()                    { *m = SubscriptionMessage{} }
 func (*SubscriptionMessage) ProtoMessage()               {}
-func (*SubscriptionMessage) Descriptor() ([]byte, []int) { return fileDescriptorLogbroker, []int{7} }
+func (*SubscriptionMessage) Descriptor() ([]byte, []int) { return fileDescriptorLogbroker, []int{8} }
 
 type PublishLogsMessage struct {
 	// SubscriptionID identifies which subscription the set of messages should
@@ -199,19 +212,20 @@ type PublishLogsMessage struct {
 
 func (m *PublishLogsMessage) Reset()                    { *m = PublishLogsMessage{} }
 func (*PublishLogsMessage) ProtoMessage()               {}
-func (*PublishLogsMessage) Descriptor() ([]byte, []int) { return fileDescriptorLogbroker, []int{8} }
+func (*PublishLogsMessage) Descriptor() ([]byte, []int) { return fileDescriptorLogbroker, []int{9} }
 
 type PublishLogsResponse struct {
 }
 
 func (m *PublishLogsResponse) Reset()                    { *m = PublishLogsResponse{} }
 func (*PublishLogsResponse) ProtoMessage()               {}
-func (*PublishLogsResponse) Descriptor() ([]byte, []int) { return fileDescriptorLogbroker, []int{9} }
+func (*PublishLogsResponse) Descriptor() ([]byte, []int) { return fileDescriptorLogbroker, []int{10} }
 
 func init() {
 	proto.RegisterType((*LogSubscriptionOptions)(nil), "docker.swarmkit.v1.LogSubscriptionOptions")
 	proto.RegisterType((*LogSelector)(nil), "docker.swarmkit.v1.LogSelector")
 	proto.RegisterType((*LogContext)(nil), "docker.swarmkit.v1.LogContext")
+	proto.RegisterType((*LogAttr)(nil), "docker.swarmkit.v1.LogAttr")
 	proto.RegisterType((*LogMessage)(nil), "docker.swarmkit.v1.LogMessage")
 	proto.RegisterType((*SubscribeLogsRequest)(nil), "docker.swarmkit.v1.SubscribeLogsRequest")
 	proto.RegisterType((*SubscribeLogsMessage)(nil), "docker.swarmkit.v1.SubscribeLogsMessage")
@@ -339,6 +353,21 @@ func (m *LogContext) CopyFrom(src interface{}) {
 	*m = *o
 }
 
+func (m *LogAttr) Copy() *LogAttr {
+	if m == nil {
+		return nil
+	}
+	o := &LogAttr{}
+	o.CopyFrom(m)
+	return o
+}
+
+func (m *LogAttr) CopyFrom(src interface{}) {
+
+	o := src.(*LogAttr)
+	*m = *o
+}
+
 func (m *LogMessage) Copy() *LogMessage {
 	if m == nil {
 		return nil
@@ -361,6 +390,13 @@ func (m *LogMessage) CopyFrom(src interface{}) {
 		m.Data = make([]byte, len(o.Data))
 		copy(m.Data, o.Data)
 	}
+	if o.Attrs != nil {
+		m.Attrs = make([]LogAttr, len(o.Attrs))
+		for i := range m.Attrs {
+			github_com_docker_swarmkit_api_deepcopy.Copy(&m.Attrs[i], &o.Attrs[i])
+		}
+	}
+
 }
 
 func (m *SubscribeLogsRequest) Copy() *SubscribeLogsRequest {
@@ -916,6 +952,36 @@ func (m *LogContext) MarshalTo(dAtA []byte) (int, error) {
 	return i, nil
 }
 
+func (m *LogAttr) 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 *LogAttr) MarshalTo(dAtA []byte) (int, error) {
+	var i int
+	_ = i
+	var l int
+	_ = l
+	if len(m.Key) > 0 {
+		dAtA[i] = 0xa
+		i++
+		i = encodeVarintLogbroker(dAtA, i, uint64(len(m.Key)))
+		i += copy(dAtA[i:], m.Key)
+	}
+	if len(m.Value) > 0 {
+		dAtA[i] = 0x12
+		i++
+		i = encodeVarintLogbroker(dAtA, i, uint64(len(m.Value)))
+		i += copy(dAtA[i:], m.Value)
+	}
+	return i, nil
+}
+
 func (m *LogMessage) Marshal() (dAtA []byte, err error) {
 	size := m.Size()
 	dAtA = make([]byte, size)
@@ -960,6 +1026,18 @@ func (m *LogMessage) MarshalTo(dAtA []byte) (int, error) {
 		i = encodeVarintLogbroker(dAtA, i, uint64(len(m.Data)))
 		i += copy(dAtA[i:], m.Data)
 	}
+	if len(m.Attrs) > 0 {
+		for _, msg := range m.Attrs {
+			dAtA[i] = 0x2a
+			i++
+			i = encodeVarintLogbroker(dAtA, i, uint64(msg.Size()))
+			n, err := msg.MarshalTo(dAtA[i:])
+			if err != nil {
+				return 0, err
+			}
+			i += n
+		}
+	}
 	return i, nil
 }
 
@@ -1563,6 +1641,20 @@ func (m *LogContext) Size() (n int) {
 	return n
 }
 
+func (m *LogAttr) Size() (n int) {
+	var l int
+	_ = l
+	l = len(m.Key)
+	if l > 0 {
+		n += 1 + l + sovLogbroker(uint64(l))
+	}
+	l = len(m.Value)
+	if l > 0 {
+		n += 1 + l + sovLogbroker(uint64(l))
+	}
+	return n
+}
+
 func (m *LogMessage) Size() (n int) {
 	var l int
 	_ = l
@@ -1579,6 +1671,12 @@ func (m *LogMessage) Size() (n int) {
 	if l > 0 {
 		n += 1 + l + sovLogbroker(uint64(l))
 	}
+	if len(m.Attrs) > 0 {
+		for _, e := range m.Attrs {
+			l = e.Size()
+			n += 1 + l + sovLogbroker(uint64(l))
+		}
+	}
 	return n
 }
 
@@ -1710,6 +1808,17 @@ func (this *LogContext) String() string {
 	}, "")
 	return s
 }
+func (this *LogAttr) String() string {
+	if this == nil {
+		return "nil"
+	}
+	s := strings.Join([]string{`&LogAttr{`,
+		`Key:` + fmt.Sprintf("%v", this.Key) + `,`,
+		`Value:` + fmt.Sprintf("%v", this.Value) + `,`,
+		`}`,
+	}, "")
+	return s
+}
 func (this *LogMessage) String() string {
 	if this == nil {
 		return "nil"
@@ -1719,6 +1828,7 @@ func (this *LogMessage) String() string {
 		`Timestamp:` + strings.Replace(fmt.Sprintf("%v", this.Timestamp), "Timestamp", "google_protobuf.Timestamp", 1) + `,`,
 		`Stream:` + fmt.Sprintf("%v", this.Stream) + `,`,
 		`Data:` + fmt.Sprintf("%v", this.Data) + `,`,
+		`Attrs:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Attrs), "LogAttr", "LogAttr", 1), `&`, ``, 1) + `,`,
 		`}`,
 	}, "")
 	return s
@@ -2253,6 +2363,114 @@ func (m *LogContext) Unmarshal(dAtA []byte) error {
 	}
 	return nil
 }
+func (m *LogAttr) 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 ErrIntOverflowLogbroker
+			}
+			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: LogAttr: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: LogAttr: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		case 1:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowLogbroker
+				}
+				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 ErrInvalidLengthLogbroker
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Key = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 2:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowLogbroker
+				}
+				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 ErrInvalidLengthLogbroker
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Value = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		default:
+			iNdEx = preIndex
+			skippy, err := skipLogbroker(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthLogbroker
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
 func (m *LogMessage) Unmarshal(dAtA []byte) error {
 	l := len(dAtA)
 	iNdEx := 0
@@ -2395,6 +2613,37 @@ func (m *LogMessage) Unmarshal(dAtA []byte) error {
 				m.Data = []byte{}
 			}
 			iNdEx = postIndex
+		case 5:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Attrs", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowLogbroker
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthLogbroker
+			}
+			postIndex := iNdEx + msglen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Attrs = append(m.Attrs, LogAttr{})
+			if err := m.Attrs[len(m.Attrs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
 		default:
 			iNdEx = preIndex
 			skippy, err := skipLogbroker(dAtA[iNdEx:])
@@ -3116,61 +3365,64 @@ var (
 func init() { proto.RegisterFile("logbroker.proto", fileDescriptorLogbroker) }
 
 var fileDescriptorLogbroker = []byte{
-	// 886 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xa4, 0x95, 0x4f, 0x8f, 0xdb, 0x44,
-	0x18, 0xc6, 0x33, 0xce, 0x36, 0x7f, 0xde, 0x74, 0xff, 0x74, 0xb2, 0x5d, 0x45, 0x11, 0xb5, 0x23,
-	0x57, 0x2a, 0xd1, 0xaa, 0x24, 0x25, 0x08, 0x81, 0x54, 0x09, 0x41, 0x48, 0x85, 0x22, 0xd2, 0x5d,
-	0x34, 0xc9, 0x0a, 0x6e, 0x2b, 0x27, 0x9e, 0x1a, 0x2b, 0x8e, 0x27, 0x78, 0x9c, 0x2e, 0x07, 0x0e,
-	0x1c, 0x8a, 0x84, 0x7a, 0xe0, 0x86, 0x04, 0x87, 0x9e, 0xe8, 0x05, 0x21, 0xc1, 0x9d, 0x0f, 0x80,
-	0x56, 0x9c, 0xe0, 0xc6, 0x29, 0xa2, 0xfe, 0x00, 0x7c, 0x06, 0xe4, 0x99, 0x89, 0xe3, 0x25, 0x49,
-	0x8b, 0xb6, 0x97, 0x64, 0xc6, 0xf3, 0xbc, 0x9e, 0xdf, 0x3c, 0xf3, 0xbc, 0x09, 0xec, 0x7a, 0xcc,
-	0x19, 0x06, 0x6c, 0x4c, 0x83, 0xc6, 0x34, 0x60, 0x21, 0xc3, 0xd8, 0x66, 0xa3, 0x78, 0xc6, 0xcf,
-	0xac, 0x60, 0x32, 0x76, 0xc3, 0xc6, 0xc3, 0xd7, 0xab, 0xfb, 0x0e, 0x73, 0x98, 0x58, 0x6e, 0xc6,
-	0x23, 0xa9, 0xac, 0x1a, 0x0e, 0x63, 0x8e, 0x47, 0x9b, 0x62, 0x36, 0x9c, 0x3d, 0x68, 0x86, 0xee,
-	0x84, 0xf2, 0xd0, 0x9a, 0x4c, 0x95, 0xa0, 0x3c, 0xf5, 0x66, 0x8e, 0xeb, 0x37, 0xe5, 0x97, 0x7c,
-	0x68, 0xfe, 0x82, 0xe0, 0xa0, 0xc7, 0x9c, 0xfe, 0x6c, 0xc8, 0x47, 0x81, 0x3b, 0x0d, 0x5d, 0xe6,
-	0x1f, 0x8b, 0x4f, 0x8e, 0xdf, 0x82, 0x3c, 0x0f, 0x03, 0x6a, 0x4d, 0x78, 0x05, 0xd5, 0xb2, 0xf5,
-	0x9d, 0xd6, 0x8d, 0xc6, 0x2a, 0x4c, 0x23, 0x2e, 0x16, 0x2a, 0xb2, 0x50, 0xe3, 0x03, 0xc8, 0x3d,
-	0x60, 0x9e, 0xc7, 0xce, 0x2a, 0x5a, 0x0d, 0xd5, 0x0b, 0x44, 0xcd, 0x30, 0x86, 0xad, 0xd0, 0x72,
-	0xbd, 0x4a, 0xb6, 0x86, 0xea, 0x59, 0x22, 0xc6, 0xf8, 0x0e, 0x5c, 0xe1, 0xae, 0x3f, 0xa2, 0x95,
-	0xad, 0x1a, 0xaa, 0x97, 0x5a, 0xd5, 0x86, 0x3c, 0x45, 0x63, 0x71, 0x8a, 0xc6, 0x60, 0x71, 0x0a,
-	0x22, 0x85, 0xe6, 0x37, 0x08, 0x4a, 0xf1, 0xa6, 0xd4, 0xa3, 0xa3, 0x90, 0x05, 0xb8, 0x09, 0x25,
-	0x4e, 0x83, 0x87, 0xee, 0x88, 0x9e, 0xba, 0xb6, 0x44, 0x2d, 0xb6, 0x77, 0xa2, 0xb9, 0x01, 0x7d,
-	0xf9, 0xb8, 0xdb, 0xe1, 0x04, 0x94, 0xa4, 0x6b, 0x73, 0x7c, 0x0b, 0x0a, 0x3e, 0xb3, 0xa5, 0x5a,
-	0x13, 0xea, 0x52, 0x34, 0x37, 0xf2, 0x47, 0xcc, 0x16, 0xd2, 0x7c, 0xbc, 0xa8, 0x74, 0xa1, 0xc5,
-	0xc7, 0x42, 0x97, 0x5d, 0xea, 0x06, 0x16, 0x1f, 0x0b, 0x5d, 0xbc, 0xd8, 0xb5, 0xb9, 0xf9, 0x08,
-	0x01, 0xf4, 0x98, 0xf3, 0x3e, 0xf3, 0x43, 0xfa, 0x79, 0x88, 0x6f, 0x03, 0x2c, 0x79, 0x2a, 0xa8,
-	0x86, 0xea, 0xc5, 0xf6, 0x76, 0x34, 0x37, 0x8a, 0x09, 0x0e, 0x29, 0x26, 0x34, 0xf8, 0x26, 0xe4,
-	0x15, 0x8c, 0x30, 0xab, 0xd8, 0x86, 0x68, 0x6e, 0xe4, 0x24, 0x0b, 0xc9, 0x49, 0x94, 0x58, 0xa4,
-	0x48, 0x84, 0x77, 0x4a, 0x24, 0x41, 0x48, 0x4e, 0x72, 0x98, 0x7f, 0x4a, 0x8c, 0xfb, 0x94, 0x73,
-	0xcb, 0xa1, 0xf8, 0x1d, 0xc8, 0x8f, 0x24, 0x91, 0x60, 0x28, 0xb5, 0xf4, 0x0d, 0xb7, 0xa7, 0xb8,
-	0xdb, 0x5b, 0xe7, 0x73, 0x23, 0x43, 0x16, 0x45, 0xf8, 0x6d, 0x28, 0x26, 0x01, 0x12, 0x68, 0xcf,
-	0xbf, 0x9c, 0xa5, 0x18, 0xbf, 0x09, 0x39, 0x99, 0x04, 0x01, 0xfb, 0xc2, 0xd8, 0x28, 0x71, 0x9c,
-	0x0e, 0xdb, 0x0a, 0x2d, 0x11, 0x84, 0xab, 0x44, 0x8c, 0xcd, 0xef, 0x11, 0xec, 0xab, 0x68, 0x0e,
-	0x69, 0x8f, 0x39, 0x9c, 0xd0, 0xcf, 0x66, 0x94, 0x87, 0xf8, 0x2e, 0x14, 0xb8, 0x0a, 0x80, 0x3a,
-	0x9e, 0xb1, 0x69, 0x17, 0x25, 0x23, 0x49, 0x01, 0xee, 0x40, 0x9e, 0xc9, 0x8c, 0xab, 0x83, 0x1d,
-	0x6e, 0xaa, 0x5d, 0xed, 0x0a, 0xb2, 0x28, 0x35, 0x3f, 0xf9, 0x0f, 0xda, 0xc2, 0xf8, 0x77, 0xa1,
-	0x30, 0x91, 0x43, 0x19, 0xc6, 0xcd, 0xce, 0xab, 0x0a, 0xe5, 0x7c, 0x52, 0x65, 0xbe, 0x02, 0xd5,
-	0x9e, 0xcb, 0x43, 0xea, 0xa7, 0xf7, 0x5f, 0x1c, 0xdd, 0xfc, 0x0d, 0x41, 0x39, 0xbd, 0xb0, 0xd8,
-	0xf7, 0x00, 0xb4, 0x24, 0x6f, 0xb9, 0x68, 0x6e, 0x68, 0xdd, 0x0e, 0xd1, 0x5c, 0xfb, 0x82, 0x55,
-	0xda, 0x4b, 0x58, 0x95, 0xbd, 0xb4, 0x55, 0x78, 0x1f, 0xae, 0x8c, 0x3c, 0xc6, 0x65, 0x93, 0x17,
-	0x88, 0x9c, 0x98, 0x3f, 0x22, 0xc0, 0x1f, 0xcd, 0x86, 0x9e, 0xcb, 0x3f, 0x4d, 0xfb, 0x77, 0x17,
-	0x76, 0x79, 0xea, 0x65, 0xcb, 0x26, 0xc2, 0xd1, 0xdc, 0xd8, 0x49, 0xef, 0xd3, 0xed, 0x90, 0x9d,
-	0xb4, 0xb4, 0x6b, 0x5f, 0x30, 0x5f, 0xbb, 0x8c, 0xf9, 0x4b, 0xd6, 0x6c, 0x9a, 0xf5, 0x3a, 0x94,
-	0x53, 0xa8, 0x84, 0xf2, 0x29, 0xf3, 0x39, 0x3d, 0x7c, 0x8a, 0xa0, 0x98, 0x24, 0x19, 0xdf, 0x06,
-	0xdc, 0x3b, 0xfe, 0xe0, 0xb4, 0x3f, 0x20, 0xf7, 0xde, 0xbb, 0x7f, 0x7a, 0x72, 0xf4, 0xe1, 0xd1,
-	0xf1, 0xc7, 0x47, 0x7b, 0x99, 0xea, 0xfe, 0xe3, 0x27, 0xb5, 0xbd, 0x44, 0x76, 0xe2, 0x8f, 0x7d,
-	0x76, 0xe6, 0xe3, 0x43, 0xb8, 0x96, 0x52, 0xf7, 0x07, 0x9d, 0xe3, 0x93, 0xc1, 0x1e, 0xaa, 0x96,
-	0x1f, 0x3f, 0xa9, 0xed, 0x26, 0xe2, 0x7e, 0x68, 0xb3, 0x59, 0xb8, 0xaa, 0xbd, 0x47, 0xc8, 0x9e,
-	0xb6, 0xaa, 0xa5, 0x41, 0x50, 0xbd, 0xf6, 0xf5, 0x0f, 0x7a, 0xe6, 0xd7, 0xa7, 0xfa, 0x12, 0xac,
-	0xf5, 0x08, 0xc1, 0x56, 0xcc, 0x8d, 0xbf, 0x80, 0xed, 0x0b, 0x99, 0xc5, 0xf5, 0x75, 0xee, 0xac,
-	0xeb, 0xb8, 0xea, 0x8b, 0x95, 0xca, 0x51, 0xf3, 0xfa, 0xef, 0x3f, 0xff, 0xf3, 0x9d, 0xb6, 0x0b,
-	0xdb, 0x42, 0xf9, 0xda, 0xc4, 0xf2, 0x2d, 0x87, 0x06, 0x77, 0x50, 0xeb, 0x27, 0x4d, 0xb8, 0xd5,
-	0x16, 0xff, 0x6f, 0xf8, 0x5b, 0x04, 0xe5, 0x35, 0x31, 0xc7, 0x8d, 0xb5, 0x17, 0xb6, 0xb1, 0x1f,
-	0xaa, 0xaf, 0x3e, 0x07, 0x2c, 0xdd, 0x20, 0xe6, 0x4d, 0xc1, 0x75, 0x03, 0xae, 0x4a, 0xae, 0x33,
-	0x16, 0x8c, 0x69, 0xb0, 0x42, 0x89, 0xbf, 0x42, 0x50, 0x4a, 0xdd, 0x35, 0xbe, 0xb5, 0xee, 0xfd,
-	0xab, 0xb9, 0x5d, 0xcf, 0xb1, 0x26, 0x34, 0xff, 0x8b, 0xa3, 0x8e, 0xda, 0x95, 0xf3, 0x67, 0x7a,
-	0xe6, 0xaf, 0x67, 0x7a, 0xe6, 0xcb, 0x48, 0x47, 0xe7, 0x91, 0x8e, 0xfe, 0x88, 0x74, 0xf4, 0x77,
-	0xa4, 0xa3, 0x61, 0x4e, 0xfc, 0xfe, 0xbe, 0xf1, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xa3, 0x37,
-	0x34, 0x6f, 0x2d, 0x08, 0x00, 0x00,
+	// 940 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xa4, 0x95, 0xcf, 0x6f, 0x1b, 0x45,
+	0x14, 0xc7, 0x33, 0xeb, 0xc4, 0x3f, 0x9e, 0x9b, 0xc4, 0x1d, 0xa7, 0x91, 0x65, 0xa8, 0x6d, 0x6d,
+	0xa5, 0x62, 0x45, 0xc5, 0x6e, 0x8d, 0x50, 0x91, 0x2a, 0x21, 0x6a, 0x5c, 0x21, 0x0b, 0x37, 0x41,
+	0x63, 0x47, 0x70, 0x8b, 0xd6, 0xde, 0xe9, 0xb2, 0xf2, 0x7a, 0xc7, 0xec, 0x8c, 0x13, 0x90, 0x38,
+	0x70, 0x28, 0x12, 0xca, 0x81, 0x1b, 0x12, 0x1c, 0x7a, 0xa2, 0x17, 0x84, 0x04, 0x77, 0xfe, 0x00,
+	0x14, 0x71, 0xe2, 0xc8, 0xc9, 0xa2, 0xfb, 0x07, 0xf0, 0x37, 0xa0, 0x9d, 0x19, 0xdb, 0x1b, 0x6c,
+	0xb7, 0xa8, 0xbd, 0x24, 0x33, 0x3b, 0x9f, 0xb7, 0xef, 0xfb, 0xbe, 0xf3, 0xde, 0x1a, 0x76, 0x3d,
+	0xe6, 0xf4, 0x03, 0x36, 0xa4, 0x41, 0x6d, 0x1c, 0x30, 0xc1, 0x30, 0xb6, 0xd9, 0x20, 0xda, 0xf1,
+	0x33, 0x2b, 0x18, 0x0d, 0x5d, 0x51, 0x3b, 0xbd, 0x53, 0xdc, 0x73, 0x98, 0xc3, 0xe4, 0x71, 0x3d,
+	0x5a, 0x29, 0xb2, 0x58, 0x76, 0x18, 0x73, 0x3c, 0x5a, 0x97, 0xbb, 0xfe, 0xe4, 0x51, 0x5d, 0xb8,
+	0x23, 0xca, 0x85, 0x35, 0x1a, 0x6b, 0x20, 0x3f, 0xf6, 0x26, 0x8e, 0xeb, 0xd7, 0xd5, 0x3f, 0xf5,
+	0xd0, 0xfc, 0x15, 0xc1, 0x7e, 0x87, 0x39, 0xdd, 0x49, 0x9f, 0x0f, 0x02, 0x77, 0x2c, 0x5c, 0xe6,
+	0x1f, 0xc9, 0xbf, 0x1c, 0xdf, 0x85, 0x14, 0x17, 0x01, 0xb5, 0x46, 0xbc, 0x80, 0x2a, 0x89, 0xea,
+	0x4e, 0xe3, 0x7a, 0x6d, 0x59, 0x4c, 0x2d, 0x0a, 0x96, 0x14, 0x99, 0xd1, 0x78, 0x1f, 0x92, 0x8f,
+	0x98, 0xe7, 0xb1, 0xb3, 0x82, 0x51, 0x41, 0xd5, 0x34, 0xd1, 0x3b, 0x8c, 0x61, 0x53, 0x58, 0xae,
+	0x57, 0x48, 0x54, 0x50, 0x35, 0x41, 0xe4, 0x1a, 0xdf, 0x86, 0x2d, 0xee, 0xfa, 0x03, 0x5a, 0xd8,
+	0xac, 0xa0, 0x6a, 0xb6, 0x51, 0xac, 0xa9, 0x2a, 0x6a, 0xb3, 0x2a, 0x6a, 0xbd, 0x59, 0x15, 0x44,
+	0x81, 0xe6, 0xb7, 0x08, 0xb2, 0x51, 0x52, 0xea, 0xd1, 0x81, 0x60, 0x01, 0xae, 0x43, 0x96, 0xd3,
+	0xe0, 0xd4, 0x1d, 0xd0, 0x13, 0xd7, 0x56, 0x52, 0x33, 0xcd, 0x9d, 0x70, 0x5a, 0x86, 0xae, 0x7a,
+	0xdc, 0x6e, 0x71, 0x02, 0x1a, 0x69, 0xdb, 0x1c, 0xdf, 0x84, 0xb4, 0xcf, 0x6c, 0x45, 0x1b, 0x92,
+	0xce, 0x86, 0xd3, 0x72, 0xea, 0x90, 0xd9, 0x12, 0x4d, 0x45, 0x87, 0x9a, 0x13, 0x16, 0x1f, 0x4a,
+	0x2e, 0xb1, 0xe0, 0x7a, 0x16, 0x1f, 0x4a, 0x2e, 0x3a, 0x6c, 0xdb, 0xdc, 0x7c, 0x8c, 0x00, 0x3a,
+	0xcc, 0x79, 0x9f, 0xf9, 0x82, 0x7e, 0x2e, 0xf0, 0x2d, 0x80, 0x85, 0x9e, 0x02, 0xaa, 0xa0, 0x6a,
+	0xa6, 0xb9, 0x1d, 0x4e, 0xcb, 0x99, 0xb9, 0x1c, 0x92, 0x99, 0xab, 0xc1, 0x37, 0x20, 0xa5, 0xc5,
+	0x48, 0xb3, 0x32, 0x4d, 0x08, 0xa7, 0xe5, 0xa4, 0xd2, 0x42, 0x92, 0x4a, 0x4a, 0x04, 0x69, 0x25,
+	0xd2, 0x3b, 0x0d, 0x29, 0x21, 0x24, 0xa9, 0x74, 0x98, 0x77, 0x20, 0xd5, 0x61, 0xce, 0x7d, 0x21,
+	0x02, 0x9c, 0x83, 0xc4, 0x90, 0x7e, 0xa1, 0x72, 0x93, 0x68, 0x89, 0xf7, 0x60, 0xeb, 0xd4, 0xf2,
+	0x26, 0x54, 0x25, 0x21, 0x6a, 0x63, 0x9e, 0x1b, 0x52, 0xf9, 0x43, 0xca, 0xb9, 0xe5, 0x50, 0xfc,
+	0x2e, 0xa4, 0x06, 0xaa, 0x08, 0x19, 0x9a, 0x6d, 0x94, 0xd6, 0x5c, 0xb8, 0x2e, 0xb5, 0xb9, 0x79,
+	0x31, 0x2d, 0x6f, 0x90, 0x59, 0x10, 0x7e, 0x07, 0x32, 0xf3, 0x9e, 0x93, 0x89, 0x9e, 0x7f, 0x9f,
+	0x0b, 0x18, 0xbf, 0x0d, 0x49, 0xd5, 0x3c, 0xb2, 0xbe, 0x17, 0x76, 0x9a, 0x86, 0xa3, 0x86, 0xb2,
+	0x2d, 0x61, 0xc9, 0xde, 0xb9, 0x42, 0xe4, 0x1a, 0xdf, 0x85, 0x2d, 0x4b, 0x88, 0x80, 0x17, 0xb6,
+	0x2a, 0x89, 0x6a, 0xb6, 0xf1, 0xda, 0x9a, 0x37, 0x45, 0x3e, 0x69, 0xfd, 0x8a, 0x37, 0x7f, 0x40,
+	0xb0, 0xa7, 0xc7, 0xa0, 0x4f, 0x3b, 0xcc, 0xe1, 0x84, 0x7e, 0x36, 0xa1, 0x5c, 0xe0, 0x7b, 0x90,
+	0xe6, 0xba, 0xd9, 0xb4, 0x2f, 0xe5, 0x75, 0xf2, 0x34, 0x46, 0xe6, 0x01, 0xb8, 0x05, 0x29, 0xa6,
+	0xe6, 0x49, 0x3b, 0x72, 0xb0, 0x2e, 0x76, 0x79, 0x02, 0xc9, 0x2c, 0xd4, 0xfc, 0xe4, 0x3f, 0xd2,
+	0x66, 0x37, 0xf6, 0x1e, 0xa4, 0x47, 0x6a, 0xa9, 0x1a, 0x7f, 0xfd, 0x95, 0xe9, 0x08, 0x5d, 0xf2,
+	0x3c, 0xca, 0x7c, 0x1d, 0x8a, 0x1d, 0x97, 0x0b, 0xea, 0xc7, 0xf3, 0xcf, 0x4a, 0x37, 0x7f, 0x47,
+	0x90, 0x8f, 0x1f, 0xcc, 0xf2, 0xee, 0x83, 0x31, 0xef, 0xed, 0x64, 0x38, 0x2d, 0x1b, 0xed, 0x16,
+	0x31, 0x5c, 0xfb, 0x92, 0x55, 0xc6, 0x2b, 0x58, 0x95, 0x78, 0x69, 0xab, 0xa2, 0x4e, 0x1f, 0x78,
+	0x8c, 0xab, 0x0f, 0x4a, 0x9a, 0xa8, 0x8d, 0xf9, 0x13, 0x02, 0xfc, 0xd1, 0xa4, 0xef, 0xb9, 0xfc,
+	0xd3, 0xb8, 0x7f, 0xf7, 0x60, 0x97, 0xc7, 0x5e, 0xb6, 0x18, 0x58, 0x1c, 0x4e, 0xcb, 0x3b, 0xf1,
+	0x3c, 0xed, 0x16, 0xd9, 0x89, 0xa3, 0x6d, 0xfb, 0x92, 0xf9, 0xc6, 0xcb, 0x98, 0xbf, 0xd0, 0x9a,
+	0x88, 0x6b, 0xbd, 0x06, 0xf9, 0x98, 0x54, 0x42, 0xf9, 0x98, 0xf9, 0x9c, 0x1e, 0x3c, 0x45, 0x90,
+	0x99, 0x8f, 0x00, 0xbe, 0x05, 0xb8, 0x73, 0xf4, 0xc1, 0x49, 0xb7, 0x47, 0x1e, 0xdc, 0x7f, 0x78,
+	0x72, 0x7c, 0xf8, 0xe1, 0xe1, 0xd1, 0xc7, 0x87, 0xb9, 0x8d, 0xe2, 0xde, 0xf9, 0x93, 0x4a, 0x6e,
+	0x8e, 0x1d, 0xfb, 0x43, 0x9f, 0x9d, 0xf9, 0xf8, 0x00, 0xae, 0xc6, 0xe8, 0x6e, 0xaf, 0x75, 0x74,
+	0xdc, 0xcb, 0xa1, 0x62, 0xfe, 0xfc, 0x49, 0x65, 0x77, 0x0e, 0x77, 0x85, 0xcd, 0x26, 0x62, 0x99,
+	0x7d, 0x40, 0x48, 0xce, 0x58, 0x66, 0x69, 0x10, 0x14, 0xaf, 0x7e, 0xf3, 0x63, 0x69, 0xe3, 0xb7,
+	0xa7, 0xa5, 0x85, 0xb0, 0xc6, 0x63, 0x04, 0x9b, 0x91, 0x6e, 0xfc, 0x25, 0x6c, 0x5f, 0xea, 0x59,
+	0x5c, 0x5d, 0xe5, 0xce, 0xaa, 0x89, 0x2b, 0xbe, 0x98, 0xd4, 0x8e, 0x9a, 0xd7, 0xfe, 0xf8, 0xe5,
+	0x9f, 0xef, 0x8d, 0x5d, 0xd8, 0x96, 0xe4, 0x9b, 0x23, 0xcb, 0xb7, 0x1c, 0x1a, 0xdc, 0x46, 0x8d,
+	0x9f, 0x0d, 0xe9, 0x56, 0x53, 0xfe, 0x96, 0xe2, 0xef, 0x10, 0xe4, 0x57, 0xb4, 0x39, 0xae, 0xad,
+	0xbc, 0xb0, 0xb5, 0xf3, 0x50, 0x7c, 0xe3, 0x39, 0xc2, 0xe2, 0x03, 0x62, 0xde, 0x90, 0xba, 0xae,
+	0xc3, 0x15, 0xa5, 0xeb, 0x8c, 0x05, 0x43, 0x1a, 0x2c, 0xa9, 0xc4, 0x5f, 0x23, 0xc8, 0xc6, 0xee,
+	0x1a, 0xdf, 0x5c, 0xf5, 0xfe, 0xe5, 0xbe, 0x5d, 0xad, 0x63, 0x45, 0xd3, 0xfc, 0x2f, 0x1d, 0x55,
+	0xd4, 0x2c, 0x5c, 0x3c, 0x2b, 0x6d, 0xfc, 0xf5, 0xac, 0xb4, 0xf1, 0x55, 0x58, 0x42, 0x17, 0x61,
+	0x09, 0xfd, 0x19, 0x96, 0xd0, 0xdf, 0x61, 0x09, 0xf5, 0x93, 0xf2, 0xc3, 0xfd, 0xd6, 0xbf, 0x01,
+	0x00, 0x00, 0xff, 0xff, 0xf8, 0x4f, 0xdd, 0x74, 0x99, 0x08, 0x00, 0x00,
 }

+ 10 - 0
vendor/github.com/docker/swarmkit/api/logbroker.proto

@@ -66,6 +66,12 @@ message LogContext {
 	string task_id = 3;
 }
 
+// LogAttr is an extra key/value pair that may be have been set by users
+message LogAttr {
+	string key = 1;
+	string value = 2;
+}
+
 // LogMessage
 message LogMessage {
 	// Context identifies the source of the log message.
@@ -80,6 +86,10 @@ message LogMessage {
 
 	// Data is the raw log message, as generated by the application.
 	bytes data = 4;
+
+	// Attrs is a list of key value pairs representing additional log details
+	// that may have been returned from the logger
+	repeated LogAttr attrs = 5 [(gogoproto.nullable) = false];
 }
 
 // Logs defines the methods for retrieving task logs messages from a cluster.

+ 356 - 292
vendor/github.com/docker/swarmkit/api/types.pb.go

@@ -17,7 +17,7 @@
 		health.proto
 		resource.proto
 		logbroker.proto
-		store.proto
+		watch.proto
 
 	It has these top-level messages:
 		Version
@@ -199,6 +199,7 @@
 		LogSubscriptionOptions
 		LogSelector
 		LogContext
+		LogAttr
 		LogMessage
 		SubscribeLogsRequest
 		SubscribeLogsMessage
@@ -1577,6 +1578,10 @@ type Placement struct {
 	// such as topology. They are provided in order from highest to lowest
 	// precedence.
 	Preferences []*PlacementPreference `protobuf:"bytes,2,rep,name=preferences" json:"preferences,omitempty"`
+	// Platforms stores all the platforms that the image can run on.
+	// This field is used in the platform filter for scheduling. If empty,
+	// then the platform filter is off, meaning there are no scheduling restrictions.
+	Platforms []*Platform `protobuf:"bytes,3,rep,name=platforms" json:"platforms,omitempty"`
 }
 
 func (m *Placement) Reset()                    { *m = Placement{} }
@@ -3076,6 +3081,14 @@ func (m *Placement) CopyFrom(src interface{}) {
 		}
 	}
 
+	if o.Platforms != nil {
+		m.Platforms = make([]*Platform, len(o.Platforms))
+		for i := range m.Platforms {
+			m.Platforms[i] = &Platform{}
+			github_com_docker_swarmkit_api_deepcopy.Copy(m.Platforms[i], o.Platforms[i])
+		}
+	}
+
 }
 
 func (m *JoinTokens) Copy() *JoinTokens {
@@ -5168,6 +5181,18 @@ func (m *Placement) MarshalTo(dAtA []byte) (int, error) {
 			i += n
 		}
 	}
+	if len(m.Platforms) > 0 {
+		for _, msg := range m.Platforms {
+			dAtA[i] = 0x1a
+			i++
+			i = encodeVarintTypes(dAtA, i, uint64(msg.Size()))
+			n, err := msg.MarshalTo(dAtA[i:])
+			if err != nil {
+				return 0, err
+			}
+			i += n
+		}
+	}
 	return i, nil
 }
 
@@ -6621,6 +6646,12 @@ func (m *Placement) Size() (n int) {
 			n += 1 + l + sovTypes(uint64(l))
 		}
 	}
+	if len(m.Platforms) > 0 {
+		for _, e := range m.Platforms {
+			l = e.Size()
+			n += 1 + l + sovTypes(uint64(l))
+		}
+	}
 	return n
 }
 
@@ -7539,6 +7570,7 @@ func (this *Placement) String() string {
 	s := strings.Join([]string{`&Placement{`,
 		`Constraints:` + fmt.Sprintf("%v", this.Constraints) + `,`,
 		`Preferences:` + strings.Replace(fmt.Sprintf("%v", this.Preferences), "PlacementPreference", "PlacementPreference", 1) + `,`,
+		`Platforms:` + strings.Replace(fmt.Sprintf("%v", this.Platforms), "Platform", "Platform", 1) + `,`,
 		`}`,
 	}, "")
 	return s
@@ -13685,6 +13717,37 @@ func (m *Placement) Unmarshal(dAtA []byte) error {
 				return err
 			}
 			iNdEx = postIndex
+		case 3:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Platforms", 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
+			}
+			m.Platforms = append(m.Platforms, &Platform{})
+			if err := m.Platforms[len(m.Platforms)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
 		default:
 			iNdEx = preIndex
 			skippy, err := skipTypes(dAtA[iNdEx:])
@@ -16020,296 +16083,297 @@ var (
 func init() { proto.RegisterFile("types.proto", fileDescriptorTypes) }
 
 var fileDescriptorTypes = []byte{
-	// 4643 bytes of a gzipped FileDescriptorProto
+	// 4658 bytes of a gzipped FileDescriptorProto
 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xac, 0x5a, 0x4d, 0x6c, 0x23, 0x47,
-	0x76, 0x16, 0x7f, 0x45, 0x3e, 0x52, 0x52, 0x4f, 0x8d, 0x76, 0x56, 0xc3, 0x1d, 0x4b, 0x74, 0xdb,
-	0xb3, 0xf6, 0x7a, 0x1d, 0x7a, 0x7e, 0x76, 0x17, 0x63, 0x3b, 0x6b, 0x9b, 0x7f, 0x1a, 0x71, 0x47,
-	0x22, 0x89, 0x22, 0x35, 0xb3, 0x3e, 0x24, 0x8d, 0x56, 0x77, 0x89, 0x6a, 0xab, 0xd9, 0xc5, 0x74,
-	0x17, 0xa5, 0x61, 0x7e, 0x90, 0x41, 0x0e, 0x49, 0xa0, 0x53, 0x72, 0x0b, 0x10, 0x28, 0x97, 0xe4,
-	0x14, 0xe4, 0x96, 0x43, 0x90, 0x5c, 0xe2, 0x00, 0x39, 0xf8, 0x96, 0x4d, 0x02, 0x04, 0x8b, 0x04,
-	0x50, 0x62, 0x1d, 0x72, 0x0b, 0x92, 0xcb, 0x22, 0x97, 0x04, 0x08, 0xea, 0xa7, 0x9b, 0x4d, 0x0d,
-	0x25, 0x8d, 0xe3, 0xbd, 0x48, 0x5d, 0xef, 0x7d, 0xef, 0xd5, 0xab, 0x57, 0xaf, 0xaa, 0xde, 0xab,
-	0x22, 0x14, 0xd8, 0x64, 0x44, 0x82, 0xca, 0xc8, 0xa7, 0x8c, 0x22, 0x64, 0x53, 0xeb, 0x90, 0xf8,
-	0x95, 0xe0, 0xd8, 0xf4, 0x87, 0x87, 0x0e, 0xab, 0x1c, 0xdd, 0x2f, 0x6d, 0x0c, 0x28, 0x1d, 0xb8,
-	0xe4, 0x3d, 0x81, 0xd8, 0x1b, 0xef, 0xbf, 0xc7, 0x9c, 0x21, 0x09, 0x98, 0x39, 0x1c, 0x49, 0xa1,
-	0xd2, 0xfa, 0x45, 0x80, 0x3d, 0xf6, 0x4d, 0xe6, 0x50, 0x4f, 0xf1, 0x57, 0x07, 0x74, 0x40, 0xc5,
-	0xe7, 0x7b, 0xfc, 0x4b, 0x52, 0xf5, 0x0d, 0x58, 0x7c, 0x4a, 0xfc, 0xc0, 0xa1, 0x1e, 0x5a, 0x85,
-	0x8c, 0xe3, 0xd9, 0xe4, 0xf9, 0x5a, 0xa2, 0x9c, 0x78, 0x3b, 0x8d, 0x65, 0x43, 0xbf, 0x07, 0xd0,
-	0xe2, 0x1f, 0x4d, 0x8f, 0xf9, 0x13, 0xa4, 0x41, 0xea, 0x90, 0x4c, 0x04, 0x22, 0x8f, 0xf9, 0x27,
-	0xa7, 0x1c, 0x99, 0xee, 0x5a, 0x52, 0x52, 0x8e, 0x4c, 0x57, 0xff, 0x32, 0x01, 0x85, 0xaa, 0xe7,
-	0x51, 0x26, 0x7a, 0x0f, 0x10, 0x82, 0xb4, 0x67, 0x0e, 0x89, 0x12, 0x12, 0xdf, 0xa8, 0x0e, 0x59,
-	0xd7, 0xdc, 0x23, 0x6e, 0xb0, 0x96, 0x2c, 0xa7, 0xde, 0x2e, 0x3c, 0xf8, 0x6e, 0xe5, 0xe5, 0x21,
-	0x57, 0x62, 0x4a, 0x2a, 0xdb, 0x02, 0x2d, 0x8c, 0xc0, 0x4a, 0x14, 0x7d, 0x04, 0x8b, 0x8e, 0x67,
-	0x3b, 0x16, 0x09, 0xd6, 0xd2, 0x42, 0xcb, 0xfa, 0x3c, 0x2d, 0x53, 0xeb, 0x6b, 0xe9, 0x2f, 0xce,
-	0x36, 0x16, 0x70, 0x28, 0x54, 0x7a, 0x1f, 0x0a, 0x31, 0xb5, 0x73, 0xc6, 0xb6, 0x0a, 0x99, 0x23,
-	0xd3, 0x1d, 0x13, 0x35, 0x3a, 0xd9, 0xf8, 0x20, 0xf9, 0x28, 0xa1, 0x7f, 0x0a, 0x79, 0x4c, 0x02,
-	0x3a, 0xf6, 0x2d, 0x12, 0xa0, 0xef, 0x40, 0xde, 0x33, 0x3d, 0x6a, 0x58, 0xa3, 0x71, 0x20, 0xc4,
-	0x53, 0xb5, 0xe2, 0xf9, 0xd9, 0x46, 0xae, 0x6d, 0x7a, 0xb4, 0xde, 0xdd, 0x0d, 0x70, 0x8e, 0xb3,
-	0xeb, 0xa3, 0x71, 0x80, 0x5e, 0x87, 0xe2, 0x90, 0x0c, 0xa9, 0x3f, 0x31, 0xf6, 0x26, 0x8c, 0x04,
-	0x42, 0x71, 0x0a, 0x17, 0x24, 0xad, 0xc6, 0x49, 0xfa, 0xef, 0x25, 0x60, 0x35, 0xd4, 0x8d, 0xc9,
-	0xaf, 0x8c, 0x1d, 0x9f, 0x0c, 0x89, 0xc7, 0x02, 0xf4, 0x7d, 0xc8, 0xba, 0xce, 0xd0, 0x61, 0xb2,
-	0x8f, 0xc2, 0x83, 0xd7, 0xe6, 0x8d, 0x36, 0xb2, 0x0a, 0x2b, 0x30, 0xaa, 0x42, 0xd1, 0x27, 0x01,
-	0xf1, 0x8f, 0xa4, 0x27, 0x45, 0x97, 0xd7, 0x0a, 0xcf, 0x88, 0xe8, 0x9b, 0x90, 0xeb, 0xba, 0x26,
-	0xdb, 0xa7, 0xfe, 0x10, 0xe9, 0x50, 0x34, 0x7d, 0xeb, 0xc0, 0x61, 0xc4, 0x62, 0x63, 0x3f, 0x9c,
-	0xd5, 0x19, 0x1a, 0xba, 0x05, 0x49, 0x2a, 0x3b, 0xca, 0xd7, 0xb2, 0xe7, 0x67, 0x1b, 0xc9, 0x4e,
-	0x0f, 0x27, 0x69, 0xa0, 0x7f, 0x08, 0x37, 0xba, 0xee, 0x78, 0xe0, 0x78, 0x0d, 0x12, 0x58, 0xbe,
-	0x33, 0xe2, 0xda, 0x79, 0x78, 0xf0, 0xd8, 0x0f, 0xc3, 0x83, 0x7f, 0x47, 0x21, 0x93, 0x9c, 0x86,
-	0x8c, 0xfe, 0x3b, 0x49, 0xb8, 0xd1, 0xf4, 0x06, 0x8e, 0x47, 0xe2, 0xd2, 0x77, 0x61, 0x99, 0x08,
-	0xa2, 0x71, 0x24, 0xc3, 0x58, 0xe9, 0x59, 0x92, 0xd4, 0x30, 0xb6, 0x5b, 0x17, 0xe2, 0xed, 0xfe,
-	0xbc, 0xe1, 0xbf, 0xa4, 0x7d, 0x6e, 0xd4, 0x35, 0x61, 0x71, 0x24, 0x06, 0x11, 0xac, 0xa5, 0x84,
-	0xae, 0xbb, 0xf3, 0x74, 0xbd, 0x34, 0xce, 0x30, 0xf8, 0x94, 0xec, 0xd7, 0x09, 0xbe, 0x3f, 0x4b,
-	0xc2, 0x4a, 0x9b, 0xda, 0x33, 0x7e, 0x28, 0x41, 0xee, 0x80, 0x06, 0x2c, 0xb6, 0xd0, 0xa2, 0x36,
-	0x7a, 0x04, 0xb9, 0x91, 0x9a, 0x3e, 0x35, 0xfb, 0x77, 0xe6, 0x9b, 0x2c, 0x31, 0x38, 0x42, 0xa3,
-	0x0f, 0x21, 0xef, 0x87, 0x31, 0xb1, 0x96, 0x7a, 0x95, 0xc0, 0x99, 0xe2, 0xd1, 0x0f, 0x21, 0x2b,
-	0x27, 0x61, 0x2d, 0x2d, 0x24, 0xef, 0xbe, 0x92, 0xcf, 0xb1, 0x12, 0x42, 0x8f, 0x21, 0xc7, 0xdc,
-	0xc0, 0x70, 0xbc, 0x7d, 0xba, 0x96, 0x11, 0x0a, 0x36, 0xe6, 0x29, 0xe0, 0x8e, 0xe8, 0x6f, 0xf7,
-	0x5a, 0xde, 0x3e, 0xad, 0x15, 0xce, 0xcf, 0x36, 0x16, 0x55, 0x03, 0x2f, 0x32, 0x37, 0xe0, 0x1f,
-	0xfa, 0xef, 0x27, 0xa0, 0x10, 0x43, 0xa1, 0xd7, 0x00, 0x98, 0x3f, 0x0e, 0x98, 0xe1, 0x53, 0xca,
-	0x84, 0xb3, 0x8a, 0x38, 0x2f, 0x28, 0x98, 0x52, 0x86, 0x2a, 0x70, 0xd3, 0x22, 0x3e, 0x33, 0x9c,
-	0x20, 0x18, 0x13, 0xdf, 0x08, 0xc6, 0x7b, 0x9f, 0x11, 0x8b, 0x09, 0xc7, 0x15, 0xf1, 0x0d, 0xce,
-	0x6a, 0x09, 0x4e, 0x4f, 0x32, 0xd0, 0x43, 0xb8, 0x15, 0xc7, 0x8f, 0xc6, 0x7b, 0xae, 0x63, 0x19,
-	0x7c, 0x32, 0x53, 0x42, 0xe4, 0xe6, 0x54, 0xa4, 0x2b, 0x78, 0x4f, 0xc8, 0x44, 0xff, 0x69, 0x02,
-	0x34, 0x6c, 0xee, 0xb3, 0x1d, 0x32, 0xdc, 0x23, 0x7e, 0x8f, 0x99, 0x6c, 0x1c, 0xa0, 0x5b, 0x90,
-	0x75, 0x89, 0x69, 0x13, 0x5f, 0x18, 0x95, 0xc3, 0xaa, 0x85, 0x76, 0xf9, 0x0a, 0x36, 0xad, 0x03,
-	0x73, 0xcf, 0x71, 0x1d, 0x36, 0x11, 0xa6, 0x2c, 0xcf, 0x0f, 0xe1, 0x8b, 0x3a, 0x2b, 0x38, 0x26,
-	0x88, 0x67, 0xd4, 0xa0, 0x35, 0x58, 0x1c, 0x92, 0x20, 0x30, 0x07, 0x44, 0x58, 0x9a, 0xc7, 0x61,
-	0x53, 0xff, 0x10, 0x8a, 0x71, 0x39, 0x54, 0x80, 0xc5, 0xdd, 0xf6, 0x93, 0x76, 0xe7, 0x59, 0x5b,
-	0x5b, 0x40, 0x2b, 0x50, 0xd8, 0x6d, 0xe3, 0x66, 0xb5, 0xbe, 0x55, 0xad, 0x6d, 0x37, 0xb5, 0x04,
-	0x5a, 0x82, 0xfc, 0xb4, 0x99, 0xd4, 0xff, 0x3c, 0x01, 0xc0, 0xdd, 0xad, 0x06, 0xf5, 0x01, 0x64,
-	0x02, 0x66, 0x32, 0x19, 0x95, 0xcb, 0x0f, 0xde, 0xbc, 0x6c, 0x0e, 0x95, 0xbd, 0xfc, 0x1f, 0xc1,
-	0x52, 0x24, 0x6e, 0x61, 0x72, 0xc6, 0x42, 0xbe, 0x41, 0x98, 0xb6, 0xed, 0x2b, 0xc3, 0xc5, 0xb7,
-	0xfe, 0x21, 0x64, 0x84, 0xf4, 0xac, 0xb9, 0x39, 0x48, 0x37, 0xf8, 0x57, 0x02, 0xe5, 0x21, 0x83,
-	0x9b, 0xd5, 0xc6, 0xa7, 0x5a, 0x12, 0x69, 0x50, 0x6c, 0xb4, 0x7a, 0xf5, 0x4e, 0xbb, 0xdd, 0xac,
-	0xf7, 0x9b, 0x0d, 0x2d, 0xa5, 0xdf, 0x85, 0x4c, 0x6b, 0xc8, 0x35, 0xdf, 0xe1, 0x21, 0xbf, 0x4f,
-	0x7c, 0xe2, 0x59, 0xe1, 0x4a, 0x9a, 0x12, 0xf4, 0x9f, 0xe4, 0x21, 0xb3, 0x43, 0xc7, 0x1e, 0x43,
-	0x0f, 0x62, 0xdb, 0xd6, 0xf2, 0xfc, 0x93, 0x47, 0x00, 0x2b, 0xfd, 0xc9, 0x88, 0xa8, 0x6d, 0xed,
-	0x16, 0x64, 0xe5, 0xe2, 0x50, 0xc3, 0x51, 0x2d, 0x4e, 0x67, 0xa6, 0x3f, 0x20, 0x4c, 0x8d, 0x47,
-	0xb5, 0xd0, 0xdb, 0x90, 0xf3, 0x89, 0x69, 0x53, 0xcf, 0x9d, 0x88, 0x35, 0x94, 0x93, 0xe7, 0x0a,
-	0x26, 0xa6, 0xdd, 0xf1, 0xdc, 0x09, 0x8e, 0xb8, 0x68, 0x0b, 0x8a, 0x7b, 0x8e, 0x67, 0x1b, 0x74,
-	0x24, 0x37, 0xf9, 0xcc, 0xe5, 0x2b, 0x4e, 0x5a, 0x55, 0x73, 0x3c, 0xbb, 0x23, 0xc1, 0xb8, 0xb0,
-	0x37, 0x6d, 0xa0, 0x36, 0x2c, 0x1f, 0x51, 0x77, 0x3c, 0x24, 0x91, 0xae, 0xac, 0xd0, 0xf5, 0xd6,
-	0xe5, 0xba, 0x9e, 0x0a, 0x7c, 0xa8, 0x6d, 0xe9, 0x28, 0xde, 0x44, 0x4f, 0x60, 0x89, 0x0d, 0x47,
-	0xfb, 0x41, 0xa4, 0x6e, 0x51, 0xa8, 0xfb, 0xf6, 0x15, 0x0e, 0xe3, 0xf0, 0x50, 0x5b, 0x91, 0xc5,
-	0x5a, 0xa5, 0xdf, 0x4a, 0x41, 0x21, 0x66, 0x39, 0xea, 0x41, 0x61, 0xe4, 0xd3, 0x91, 0x39, 0x10,
-	0x07, 0x95, 0x9a, 0x8b, 0xfb, 0xaf, 0x34, 0xea, 0x4a, 0x77, 0x2a, 0x88, 0xe3, 0x5a, 0xf4, 0xd3,
-	0x24, 0x14, 0x62, 0x4c, 0xf4, 0x0e, 0xe4, 0x70, 0x17, 0xb7, 0x9e, 0x56, 0xfb, 0x4d, 0x6d, 0xa1,
-	0x74, 0xe7, 0xe4, 0xb4, 0xbc, 0x26, 0xb4, 0xc5, 0x15, 0x74, 0x7d, 0xe7, 0x88, 0x87, 0xde, 0xdb,
-	0xb0, 0x18, 0x42, 0x13, 0xa5, 0x6f, 0x9d, 0x9c, 0x96, 0xbf, 0x79, 0x11, 0x1a, 0x43, 0xe2, 0xde,
-	0x56, 0x15, 0x37, 0x1b, 0x5a, 0x72, 0x3e, 0x12, 0xf7, 0x0e, 0x4c, 0x9f, 0xd8, 0xe8, 0xdb, 0x90,
-	0x55, 0xc0, 0x54, 0xa9, 0x74, 0x72, 0x5a, 0xbe, 0x75, 0x11, 0x38, 0xc5, 0xe1, 0xde, 0x76, 0xf5,
-	0x69, 0x53, 0x4b, 0xcf, 0xc7, 0xe1, 0x9e, 0x6b, 0x1e, 0x11, 0xf4, 0x26, 0x64, 0x24, 0x2c, 0x53,
-	0xba, 0x7d, 0x72, 0x5a, 0xfe, 0xc6, 0x4b, 0xea, 0x38, 0xaa, 0xb4, 0xf6, 0xbb, 0x7f, 0xbc, 0xbe,
-	0xf0, 0x57, 0x7f, 0xb2, 0xae, 0x5d, 0x64, 0x97, 0xfe, 0x27, 0x01, 0x4b, 0x33, 0x53, 0x8e, 0x74,
-	0xc8, 0x7a, 0xd4, 0xa2, 0x23, 0x79, 0x7e, 0xe5, 0x6a, 0x70, 0x7e, 0xb6, 0x91, 0x6d, 0xd3, 0x3a,
-	0x1d, 0x4d, 0xb0, 0xe2, 0xa0, 0x27, 0x17, 0x4e, 0xe0, 0x87, 0xaf, 0x18, 0x4f, 0x73, 0xcf, 0xe0,
-	0x8f, 0x61, 0xc9, 0xf6, 0x9d, 0x23, 0xe2, 0x1b, 0x16, 0xf5, 0xf6, 0x9d, 0x81, 0x3a, 0x9b, 0x4a,
-	0xf3, 0x74, 0x36, 0x04, 0x10, 0x17, 0xa5, 0x40, 0x5d, 0xe0, 0xbf, 0xc6, 0xe9, 0x5b, 0x7a, 0x0a,
-	0xc5, 0x78, 0x84, 0xf2, 0xe3, 0x24, 0x70, 0x7e, 0x95, 0xa8, 0x84, 0x4e, 0xa4, 0x7f, 0x38, 0xcf,
-	0x29, 0x22, 0x9d, 0x43, 0x6f, 0x41, 0x7a, 0x48, 0x6d, 0xa9, 0x67, 0xa9, 0x76, 0x93, 0x27, 0x01,
-	0xff, 0x7c, 0xb6, 0x51, 0xa0, 0x41, 0x65, 0xd3, 0x71, 0xc9, 0x0e, 0xb5, 0x09, 0x16, 0x00, 0xfd,
-	0x08, 0xd2, 0x7c, 0xab, 0x40, 0xdf, 0x82, 0x74, 0xad, 0xd5, 0x6e, 0x68, 0x0b, 0xa5, 0x1b, 0x27,
-	0xa7, 0xe5, 0x25, 0xe1, 0x12, 0xce, 0xe0, 0xb1, 0x8b, 0x36, 0x20, 0xfb, 0xb4, 0xb3, 0xbd, 0xbb,
-	0xc3, 0xc3, 0xeb, 0xe6, 0xc9, 0x69, 0x79, 0x25, 0x62, 0x4b, 0xa7, 0xa1, 0xd7, 0x20, 0xd3, 0xdf,
-	0xe9, 0x6e, 0xf6, 0xb4, 0x64, 0x09, 0x9d, 0x9c, 0x96, 0x97, 0x23, 0xbe, 0xb0, 0xb9, 0x74, 0x43,
-	0xcd, 0x6a, 0x3e, 0xa2, 0xeb, 0x3f, 0x4b, 0xc2, 0x12, 0xe6, 0x95, 0x84, 0xcf, 0xba, 0xd4, 0x75,
-	0xac, 0x09, 0xea, 0x42, 0xde, 0xa2, 0x9e, 0xed, 0xc4, 0xd6, 0xd4, 0x83, 0x4b, 0x4e, 0xfd, 0xa9,
-	0x54, 0xd8, 0xaa, 0x87, 0x92, 0x78, 0xaa, 0x04, 0xbd, 0x07, 0x19, 0x9b, 0xb8, 0xe6, 0x44, 0xa5,
-	0x1f, 0xb7, 0x2b, 0xb2, 0x56, 0xa9, 0x84, 0xb5, 0x4a, 0xa5, 0xa1, 0x6a, 0x15, 0x2c, 0x71, 0x22,
-	0x4f, 0x36, 0x9f, 0x1b, 0x26, 0x63, 0x64, 0x38, 0x62, 0x32, 0xf7, 0x48, 0xe3, 0xc2, 0xd0, 0x7c,
-	0x5e, 0x55, 0x24, 0x74, 0x1f, 0xb2, 0xc7, 0x8e, 0x67, 0xd3, 0x63, 0x95, 0x5e, 0x5c, 0xa1, 0x54,
-	0x01, 0xf5, 0x13, 0x7e, 0xea, 0x5e, 0x30, 0x93, 0xfb, 0xbb, 0xdd, 0x69, 0x37, 0x43, 0x7f, 0x2b,
-	0x7e, 0xc7, 0x6b, 0x53, 0x8f, 0xaf, 0x15, 0xe8, 0xb4, 0x8d, 0xcd, 0x6a, 0x6b, 0x7b, 0x17, 0x73,
-	0x9f, 0xaf, 0x9e, 0x9c, 0x96, 0xb5, 0x08, 0xb2, 0x69, 0x3a, 0x2e, 0xcf, 0x77, 0x6f, 0x43, 0xaa,
-	0xda, 0xfe, 0x54, 0x4b, 0x96, 0xb4, 0x93, 0xd3, 0x72, 0x31, 0x62, 0x57, 0xbd, 0xc9, 0x74, 0x19,
-	0x5d, 0xec, 0x57, 0xff, 0xbb, 0x14, 0x14, 0x77, 0x47, 0xb6, 0xc9, 0x88, 0x8c, 0x49, 0x54, 0x86,
-	0xc2, 0xc8, 0xf4, 0x4d, 0xd7, 0x25, 0xae, 0x13, 0x0c, 0x55, 0x15, 0x16, 0x27, 0xa1, 0xf7, 0x5f,
-	0xd5, 0x8d, 0xb5, 0x1c, 0x8f, 0xb3, 0x3f, 0xf8, 0xd7, 0x8d, 0x44, 0xe8, 0xd0, 0x5d, 0x58, 0xde,
-	0x97, 0xd6, 0x1a, 0xa6, 0x25, 0x26, 0x36, 0x25, 0x26, 0xb6, 0x32, 0x6f, 0x62, 0xe3, 0x66, 0x55,
-	0xd4, 0x20, 0xab, 0x42, 0x0a, 0x2f, 0xed, 0xc7, 0x9b, 0xe8, 0x21, 0x2c, 0x0e, 0xa9, 0xe7, 0x30,
-	0xea, 0x5f, 0x3f, 0x0b, 0x21, 0x12, 0xbd, 0x03, 0x37, 0xf8, 0xe4, 0x86, 0xf6, 0x08, 0xb6, 0x38,
-	0xb1, 0x92, 0x78, 0x65, 0x68, 0x3e, 0x57, 0x1d, 0x62, 0x4e, 0x46, 0x35, 0xc8, 0x50, 0x9f, 0xa7,
-	0x44, 0x59, 0x61, 0xee, 0xbb, 0xd7, 0x9a, 0x2b, 0x1b, 0x1d, 0x2e, 0x83, 0xa5, 0xa8, 0xfe, 0x03,
-	0x58, 0x9a, 0x19, 0x04, 0xcf, 0x04, 0xba, 0xd5, 0xdd, 0x5e, 0x53, 0x5b, 0x40, 0x45, 0xc8, 0xd5,
-	0x3b, 0xed, 0x7e, 0xab, 0xbd, 0xcb, 0x53, 0x99, 0x22, 0xe4, 0x70, 0x67, 0x7b, 0xbb, 0x56, 0xad,
-	0x3f, 0xd1, 0x92, 0x7a, 0x05, 0x0a, 0x31, 0x6d, 0x68, 0x19, 0xa0, 0xd7, 0xef, 0x74, 0x8d, 0xcd,
-	0x16, 0xee, 0xf5, 0x65, 0x22, 0xd4, 0xeb, 0x57, 0x71, 0x5f, 0x11, 0x12, 0xfa, 0x7f, 0x26, 0xc3,
-	0x19, 0x55, 0xb9, 0x4f, 0x6d, 0x36, 0xf7, 0xb9, 0xc2, 0x78, 0x95, 0xfd, 0x4c, 0x1b, 0x51, 0x0e,
-	0xf4, 0x3e, 0x80, 0x08, 0x1c, 0x62, 0x1b, 0x26, 0x53, 0x13, 0x5f, 0x7a, 0xc9, 0xc9, 0xfd, 0xf0,
-	0x32, 0x00, 0xe7, 0x15, 0xba, 0xca, 0xd0, 0x0f, 0xa1, 0x68, 0xd1, 0xe1, 0xc8, 0x25, 0x4a, 0x38,
-	0x75, 0xad, 0x70, 0x21, 0xc2, 0x57, 0x59, 0x3c, 0xfb, 0x4a, 0xcf, 0xe6, 0x87, 0xbf, 0x9d, 0x08,
-	0x3d, 0x33, 0x27, 0xe1, 0x2a, 0x42, 0x6e, 0xb7, 0xdb, 0xa8, 0xf6, 0x5b, 0xed, 0xc7, 0x5a, 0x02,
-	0x01, 0x64, 0x85, 0xab, 0x1b, 0x5a, 0x92, 0x27, 0x8a, 0xf5, 0xce, 0x4e, 0x77, 0xbb, 0x29, 0x52,
-	0x2e, 0xb4, 0x0a, 0x5a, 0xe8, 0x6c, 0x43, 0x38, 0xb2, 0xd9, 0xd0, 0xd2, 0xe8, 0x26, 0xac, 0x44,
-	0x54, 0x25, 0x99, 0x41, 0xb7, 0x00, 0x45, 0xc4, 0xa9, 0x8a, 0xac, 0xfe, 0x1b, 0xb0, 0x52, 0xa7,
-	0x1e, 0x33, 0x1d, 0x2f, 0x4a, 0xa2, 0x1f, 0xf0, 0x41, 0x2b, 0x92, 0xe1, 0xd8, 0x72, 0x4f, 0xaf,
-	0xad, 0x9c, 0x9f, 0x6d, 0x14, 0x22, 0x68, 0xab, 0xc1, 0x47, 0x1a, 0x36, 0x6c, 0xbe, 0x7e, 0x47,
-	0x8e, 0x2d, 0x9c, 0x9b, 0xa9, 0x2d, 0x9e, 0x9f, 0x6d, 0xa4, 0xba, 0xad, 0x06, 0xe6, 0x34, 0xf4,
-	0x2d, 0xc8, 0x93, 0xe7, 0x0e, 0x33, 0x2c, 0xbe, 0x87, 0x73, 0x07, 0x66, 0x70, 0x8e, 0x13, 0xea,
-	0x7c, 0xcb, 0xae, 0x01, 0x74, 0xa9, 0xcf, 0x54, 0xcf, 0xdf, 0x83, 0xcc, 0x88, 0xfa, 0xa2, 0x3c,
-	0xbf, 0xf4, 0x32, 0x82, 0xc3, 0x65, 0xa0, 0x62, 0x09, 0xd6, 0xff, 0x3a, 0x09, 0xd0, 0x37, 0x83,
-	0x43, 0xa5, 0xe4, 0x11, 0xe4, 0xa3, 0x8b, 0x1d, 0x55, 0xe7, 0x5f, 0x39, 0xdb, 0x11, 0x18, 0x3d,
-	0x0c, 0x83, 0x4d, 0x96, 0x07, 0x73, 0xeb, 0xb4, 0xb0, 0xa3, 0x79, 0x19, 0xf6, 0x6c, 0x0d, 0xc0,
-	0x8f, 0x44, 0xe2, 0xfb, 0x6a, 0xe6, 0xf9, 0x27, 0xaa, 0x8b, 0x63, 0x41, 0x3a, 0x4d, 0x25, 0x98,
-	0x6f, 0xcc, 0xeb, 0xe4, 0xc2, 0x8c, 0x6c, 0x2d, 0xe0, 0xa9, 0x1c, 0xfa, 0x18, 0x0a, 0x7c, 0xdc,
-	0x46, 0x20, 0x78, 0x2a, 0xb7, 0xbc, 0xd4, 0x55, 0x52, 0x03, 0x86, 0x51, 0xf4, 0x5d, 0xd3, 0x60,
-	0xd9, 0x1f, 0x7b, 0x7c, 0xd8, 0x4a, 0x87, 0xee, 0xc0, 0x37, 0xdb, 0x84, 0x1d, 0x53, 0xff, 0xb0,
-	0xca, 0x98, 0x69, 0x1d, 0x0c, 0x89, 0xa7, 0x7c, 0x1c, 0x4b, 0xac, 0x13, 0x33, 0x89, 0xf5, 0x1a,
-	0x2c, 0x9a, 0xae, 0x63, 0x06, 0x44, 0x66, 0x23, 0x79, 0x1c, 0x36, 0x79, 0xfa, 0xcf, 0x8b, 0x09,
-	0x12, 0x04, 0x44, 0xd6, 0xf7, 0x79, 0x3c, 0x25, 0xe8, 0xff, 0x98, 0x04, 0x68, 0x75, 0xab, 0x3b,
-	0x4a, 0x7d, 0x03, 0xb2, 0xfb, 0xe6, 0xd0, 0x71, 0x27, 0x57, 0x2d, 0xf0, 0x29, 0xbe, 0x52, 0x95,
-	0x8a, 0x36, 0x85, 0x0c, 0x56, 0xb2, 0xa2, 0x2a, 0x18, 0xef, 0x79, 0x84, 0x45, 0x55, 0x81, 0x68,
-	0xf1, 0x14, 0xc4, 0x37, 0xbd, 0x68, 0x66, 0x64, 0x83, 0x9b, 0x3e, 0x30, 0x19, 0x39, 0x36, 0x27,
-	0xe1, 0xaa, 0x54, 0x4d, 0xb4, 0xc5, 0xab, 0x85, 0x80, 0xf8, 0x47, 0xc4, 0x5e, 0xcb, 0x88, 0x10,
-	0xbc, 0xce, 0x1e, 0xac, 0xe0, 0x32, 0xb9, 0x8a, 0xa4, 0x4b, 0x1f, 0x8a, 0x8c, 0x60, 0xca, 0xfa,
-	0x4a, 0xb7, 0x13, 0xf7, 0x60, 0x69, 0x66, 0x9c, 0x2f, 0x95, 0x63, 0xad, 0xee, 0xd3, 0xef, 0x69,
-	0x69, 0xf5, 0xf5, 0x03, 0x2d, 0xab, 0xff, 0x69, 0x4a, 0xae, 0x23, 0xe5, 0xd5, 0xf9, 0xf7, 0x85,
-	0x39, 0x11, 0xfd, 0x16, 0x75, 0x55, 0x7c, 0xbf, 0x75, 0xf5, 0xf2, 0xe2, 0xe9, 0xbd, 0x80, 0xe3,
-	0x48, 0x10, 0x6d, 0x40, 0x41, 0xce, 0xbf, 0xc1, 0xe3, 0x49, 0xb8, 0x75, 0x09, 0x83, 0x24, 0x71,
-	0x49, 0x74, 0x17, 0x96, 0x45, 0xf9, 0x1e, 0x1c, 0x10, 0x5b, 0x62, 0xd2, 0x02, 0xb3, 0x14, 0x51,
-	0x05, 0x6c, 0x07, 0x8a, 0x8a, 0x60, 0x88, 0xd4, 0x2e, 0x23, 0x0c, 0x7a, 0xe7, 0x3a, 0x83, 0xa4,
-	0x88, 0xc8, 0xf8, 0x0a, 0xa3, 0x69, 0x43, 0x6f, 0x40, 0x2e, 0x34, 0x16, 0xad, 0x41, 0xaa, 0x5f,
-	0xef, 0x6a, 0x0b, 0xa5, 0x95, 0x93, 0xd3, 0x72, 0x21, 0x24, 0xf7, 0xeb, 0x5d, 0xce, 0xd9, 0x6d,
-	0x74, 0xb5, 0xc4, 0x2c, 0x67, 0xb7, 0xd1, 0x2d, 0xa5, 0x79, 0x8a, 0xa1, 0xef, 0x43, 0x21, 0xd6,
-	0x03, 0x7a, 0x03, 0x16, 0x5b, 0xed, 0xc7, 0xb8, 0xd9, 0xeb, 0x69, 0x0b, 0xa5, 0x5b, 0x27, 0xa7,
-	0x65, 0x14, 0xe3, 0xb6, 0xbc, 0x01, 0x9f, 0x1f, 0xf4, 0x1a, 0xa4, 0xb7, 0x3a, 0xfc, 0xe8, 0x92,
-	0xb9, 0x64, 0x0c, 0xb1, 0x45, 0x03, 0x56, 0xba, 0xa9, 0x72, 0x97, 0xb8, 0x62, 0xfd, 0x0f, 0x13,
-	0x90, 0x95, 0x29, 0xf5, 0xdc, 0x89, 0xaa, 0xc2, 0x62, 0x58, 0xe8, 0xc9, 0x3c, 0xff, 0xad, 0xcb,
-	0x73, 0xf2, 0x8a, 0x4a, 0xa1, 0x65, 0xf8, 0x85, 0x72, 0xa5, 0x0f, 0xa0, 0x18, 0x67, 0x7c, 0xa5,
-	0xe0, 0xfb, 0x35, 0x28, 0xf0, 0xf8, 0x0e, 0x73, 0xf3, 0x07, 0x90, 0x95, 0x69, 0x7f, 0xb4, 0x95,
-	0x5e, 0x5e, 0x20, 0x28, 0x24, 0x7a, 0x04, 0x8b, 0xb2, 0xa8, 0x08, 0xef, 0xf7, 0xd6, 0xaf, 0x5e,
-	0x45, 0x38, 0x84, 0xeb, 0x1f, 0x43, 0xba, 0x4b, 0x88, 0xcf, 0x7d, 0xef, 0x51, 0x9b, 0x4c, 0x4f,
-	0x1f, 0x55, 0x0f, 0xd9, 0xa4, 0xd5, 0xe0, 0xf5, 0x90, 0x4d, 0x5a, 0x76, 0x74, 0x83, 0x91, 0x8c,
-	0xdd, 0x60, 0xf4, 0xa1, 0xf8, 0x8c, 0x38, 0x83, 0x03, 0x46, 0x6c, 0xa1, 0xe8, 0x5d, 0x48, 0x8f,
-	0x48, 0x64, 0xfc, 0xda, 0xdc, 0x00, 0x23, 0xc4, 0xc7, 0x02, 0xc5, 0xf7, 0x91, 0x63, 0x21, 0xad,
-	0x6e, 0x95, 0x55, 0x4b, 0xff, 0x87, 0x24, 0x2c, 0xb7, 0x82, 0x60, 0x6c, 0x7a, 0x56, 0x98, 0x98,
-	0x7c, 0x34, 0x9b, 0x98, 0xbc, 0x3d, 0x77, 0x84, 0x33, 0x22, 0xb3, 0x17, 0x33, 0xea, 0x70, 0x48,
-	0x46, 0x87, 0x83, 0xfe, 0x1f, 0x89, 0xf0, 0xf6, 0xe5, 0x6e, 0x6c, 0xb9, 0x97, 0xd6, 0x4e, 0x4e,
-	0xcb, 0xab, 0x71, 0x4d, 0x64, 0xd7, 0x3b, 0xf4, 0xe8, 0xb1, 0x87, 0x5e, 0x87, 0x0c, 0x6e, 0xb6,
-	0x9b, 0xcf, 0xb4, 0x84, 0x0c, 0xcf, 0x19, 0x10, 0x26, 0x1e, 0x39, 0xe6, 0x9a, 0xba, 0xcd, 0x76,
-	0x83, 0x27, 0x12, 0xc9, 0x39, 0x9a, 0xba, 0xc4, 0xb3, 0x1d, 0x6f, 0x80, 0xde, 0x80, 0x6c, 0xab,
-	0xd7, 0xdb, 0x15, 0xf5, 0xf1, 0x37, 0x4f, 0x4e, 0xcb, 0x37, 0x67, 0x50, 0xe2, 0xe6, 0xcd, 0xe6,
-	0x20, 0x9e, 0xc5, 0xf3, 0x14, 0x63, 0x0e, 0x88, 0xa7, 0x87, 0x12, 0x84, 0x3b, 0x7d, 0x5e, 0xbc,
-	0x67, 0xe6, 0x80, 0x30, 0xe5, 0x7f, 0xd5, 0x72, 0xfb, 0x97, 0x24, 0x68, 0x55, 0xcb, 0x22, 0x23,
-	0xc6, 0xf9, 0xaa, 0x70, 0xea, 0x43, 0x6e, 0xc4, 0xbf, 0x1c, 0x12, 0x26, 0x01, 0x8f, 0xe6, 0xbe,
-	0x6b, 0x5c, 0x90, 0xab, 0x60, 0xea, 0x92, 0xaa, 0x3d, 0x74, 0x82, 0xc0, 0xa1, 0x9e, 0xa4, 0xe1,
-	0x48, 0x53, 0xe9, 0xbf, 0x12, 0x70, 0x73, 0x0e, 0x02, 0xdd, 0x83, 0xb4, 0x4f, 0xdd, 0x70, 0x0e,
-	0xef, 0x5c, 0x76, 0xb1, 0xc6, 0x45, 0xb1, 0x40, 0xa2, 0x75, 0x00, 0x73, 0xcc, 0xa8, 0x29, 0xfa,
-	0x17, 0xb3, 0x97, 0xc3, 0x31, 0x0a, 0x7a, 0x06, 0xd9, 0x80, 0x58, 0x3e, 0x09, 0x53, 0xc5, 0x8f,
-	0xff, 0xbf, 0xd6, 0x57, 0x7a, 0x42, 0x0d, 0x56, 0xea, 0x4a, 0x15, 0xc8, 0x4a, 0x0a, 0x0f, 0x7b,
-	0xdb, 0x64, 0xa6, 0xba, 0x76, 0x15, 0xdf, 0x3c, 0x9a, 0x4c, 0x77, 0x10, 0x46, 0x93, 0xe9, 0x0e,
-	0xf4, 0xbf, 0x4d, 0x02, 0x34, 0x9f, 0x33, 0xe2, 0x7b, 0xa6, 0x5b, 0xaf, 0xa2, 0x66, 0x6c, 0xf7,
-	0x97, 0xa3, 0xfd, 0xce, 0xdc, 0xbb, 0xe4, 0x48, 0xa2, 0x52, 0xaf, 0xce, 0xd9, 0xff, 0x6f, 0x43,
-	0x6a, 0xec, 0xab, 0xa7, 0x2a, 0x99, 0xe6, 0xed, 0xe2, 0x6d, 0xcc, 0x69, 0xa8, 0x39, 0xdd, 0xb6,
-	0x52, 0x97, 0x3f, 0x48, 0xc5, 0x3a, 0x98, 0xbb, 0x75, 0xf1, 0x95, 0x6f, 0x99, 0x86, 0x45, 0xd4,
-	0xc9, 0x51, 0x94, 0x2b, 0xbf, 0x5e, 0xad, 0x13, 0x9f, 0xe1, 0xac, 0x65, 0xf2, 0xff, 0x5f, 0x6b,
-	0x7f, 0x7b, 0x17, 0x60, 0x3a, 0x34, 0xb4, 0x0e, 0x99, 0xfa, 0x66, 0xaf, 0xb7, 0xad, 0x2d, 0xc8,
-	0x0d, 0x7c, 0xca, 0x12, 0x64, 0xfd, 0x2f, 0x93, 0x90, 0xab, 0x57, 0xd5, 0xb1, 0x5a, 0x07, 0x4d,
-	0xec, 0x4a, 0xe2, 0xb2, 0x9a, 0x3c, 0x1f, 0x39, 0xfe, 0x44, 0x6d, 0x2c, 0x57, 0xd4, 0x6c, 0xcb,
-	0x5c, 0x84, 0x5b, 0xdd, 0x14, 0x02, 0x08, 0x43, 0x91, 0x28, 0x27, 0x18, 0x96, 0x19, 0xee, 0xf1,
-	0xeb, 0x57, 0x3b, 0x4b, 0x66, 0xdf, 0xd3, 0x76, 0x80, 0x0b, 0xa1, 0x92, 0xba, 0x19, 0xa0, 0xf7,
-	0x61, 0x25, 0x70, 0x06, 0x9e, 0xe3, 0x0d, 0x8c, 0xd0, 0x79, 0xe2, 0xe6, 0xbc, 0x76, 0xe3, 0xfc,
-	0x6c, 0x63, 0xa9, 0x27, 0x59, 0xca, 0x87, 0x4b, 0x0a, 0x59, 0x17, 0xae, 0x44, 0x3f, 0x80, 0xe5,
-	0x98, 0x28, 0xf7, 0xa2, 0x74, 0xbb, 0x76, 0x7e, 0xb6, 0x51, 0x8c, 0x24, 0x9f, 0x90, 0x09, 0x2e,
-	0x46, 0x82, 0x4f, 0x88, 0xb8, 0x5e, 0xd8, 0xa7, 0xbe, 0x45, 0x0c, 0x5f, 0xac, 0x69, 0x71, 0x82,
-	0xa7, 0x71, 0x41, 0xd0, 0xe4, 0x32, 0xd7, 0x9f, 0xc2, 0xcd, 0x8e, 0x6f, 0x1d, 0x90, 0x80, 0x49,
-	0x57, 0x28, 0x2f, 0x7e, 0x0c, 0x77, 0x98, 0x19, 0x1c, 0x1a, 0x07, 0x4e, 0xc0, 0xa8, 0x3f, 0x31,
-	0x7c, 0xc2, 0x88, 0xc7, 0xf9, 0x86, 0x78, 0x6e, 0x53, 0xf7, 0x3f, 0xb7, 0x39, 0x66, 0x4b, 0x42,
-	0x70, 0x88, 0xd8, 0xe6, 0x00, 0xbd, 0x05, 0x45, 0x9e, 0x85, 0x37, 0xc8, 0xbe, 0x39, 0x76, 0x19,
-	0x1f, 0x3d, 0xb8, 0x74, 0x60, 0xbc, 0xf2, 0x31, 0x95, 0x77, 0xe9, 0x40, 0x7e, 0xea, 0x3f, 0x06,
-	0xad, 0xe1, 0x04, 0x23, 0x93, 0x59, 0x07, 0xe1, 0xc5, 0x16, 0x6a, 0x80, 0x76, 0x40, 0x4c, 0x9f,
-	0xed, 0x11, 0x93, 0x19, 0x23, 0xe2, 0x3b, 0xd4, 0xbe, 0x7e, 0x96, 0x57, 0x22, 0x91, 0xae, 0x90,
-	0xd0, 0xff, 0x3b, 0x01, 0x80, 0xcd, 0xfd, 0x30, 0x23, 0xfb, 0x2e, 0xdc, 0x08, 0x3c, 0x73, 0x14,
-	0x1c, 0x50, 0x66, 0x38, 0x1e, 0x23, 0xfe, 0x91, 0xe9, 0xaa, 0xfb, 0x09, 0x2d, 0x64, 0xb4, 0x14,
-	0x1d, 0xbd, 0x0b, 0xe8, 0x90, 0x90, 0x91, 0x41, 0x5d, 0xdb, 0x08, 0x99, 0xf2, 0x31, 0x30, 0x8d,
-	0x35, 0xce, 0xe9, 0xb8, 0x76, 0x2f, 0xa4, 0xa3, 0x1a, 0xac, 0xf3, 0xe1, 0x13, 0x8f, 0xf9, 0x0e,
-	0x09, 0x8c, 0x7d, 0xea, 0x1b, 0x81, 0x4b, 0x8f, 0x8d, 0x7d, 0xea, 0xba, 0xf4, 0x98, 0xf8, 0xe1,
-	0xd5, 0x4f, 0xc9, 0xa5, 0x83, 0xa6, 0x04, 0x6d, 0x52, 0xbf, 0xe7, 0xd2, 0xe3, 0xcd, 0x10, 0xc1,
-	0xd3, 0xb6, 0xe9, 0x98, 0x99, 0x63, 0x1d, 0x86, 0x69, 0x5b, 0x44, 0xed, 0x3b, 0xd6, 0x21, 0x7a,
-	0x03, 0x96, 0x88, 0x4b, 0xc4, 0x0d, 0x80, 0x44, 0x65, 0x04, 0xaa, 0x18, 0x12, 0x39, 0x48, 0xff,
-	0x04, 0xb4, 0xa6, 0x67, 0xf9, 0x93, 0x51, 0x6c, 0xce, 0xdf, 0x05, 0xc4, 0x37, 0x49, 0xc3, 0xa5,
-	0xd6, 0xa1, 0x31, 0x34, 0x3d, 0x73, 0xc0, 0xed, 0x92, 0x6f, 0x34, 0x1a, 0xe7, 0x6c, 0x53, 0xeb,
-	0x70, 0x47, 0xd1, 0xf5, 0xf7, 0x01, 0x7a, 0x23, 0x9f, 0x98, 0x76, 0x87, 0x67, 0x13, 0xdc, 0x75,
-	0xa2, 0x65, 0xd8, 0xea, 0x8d, 0x8b, 0xfa, 0x6a, 0xa9, 0x6b, 0x92, 0xd1, 0x88, 0xe8, 0xfa, 0x2f,
-	0xc1, 0xcd, 0xae, 0x6b, 0x5a, 0xe2, 0xbd, 0xb7, 0x1b, 0x3d, 0x3a, 0xa0, 0x47, 0x90, 0x95, 0x50,
-	0x35, 0x93, 0x73, 0x97, 0xdb, 0xb4, 0xcf, 0xad, 0x05, 0xac, 0xf0, 0xb5, 0x22, 0xc0, 0x54, 0x8f,
-	0xfe, 0x1c, 0xf2, 0x91, 0x7a, 0x54, 0x06, 0x5e, 0x02, 0xf3, 0xe8, 0x76, 0x3c, 0x55, 0xb3, 0xe6,
-	0x71, 0x9c, 0x84, 0x5a, 0x50, 0x18, 0x45, 0xc2, 0x57, 0xa6, 0x73, 0x73, 0x8c, 0xc6, 0x71, 0x59,
-	0xfd, 0x23, 0x80, 0x1f, 0x51, 0xc7, 0xeb, 0xd3, 0x43, 0xe2, 0x89, 0x77, 0x2e, 0x5e, 0xad, 0x91,
-	0xd0, 0x11, 0xaa, 0x25, 0x8a, 0x51, 0xe9, 0xc5, 0xe8, 0xb9, 0x47, 0x36, 0xf5, 0xbf, 0x49, 0x42,
-	0x16, 0x53, 0xca, 0xea, 0x55, 0x54, 0x86, 0xac, 0x5a, 0xea, 0xe2, 0x08, 0xa9, 0xe5, 0xcf, 0xcf,
-	0x36, 0x32, 0x72, 0x8d, 0x67, 0x2c, 0xb1, 0xb8, 0x63, 0x9b, 0x70, 0xf2, 0xb2, 0x4d, 0x18, 0xdd,
-	0x83, 0xa2, 0x02, 0x19, 0x07, 0x66, 0x70, 0x20, 0x6b, 0xac, 0xda, 0xf2, 0xf9, 0xd9, 0x06, 0x48,
-	0xe4, 0x96, 0x19, 0x1c, 0x60, 0x90, 0x68, 0xfe, 0x8d, 0x9a, 0x50, 0xf8, 0x8c, 0x3a, 0x9e, 0xc1,
-	0xc4, 0x20, 0xd4, 0x75, 0xd7, 0xdc, 0xa9, 0x98, 0x0e, 0x55, 0x3d, 0xfa, 0xc2, 0x67, 0xd3, 0xc1,
-	0x37, 0x61, 0xc9, 0xa7, 0x94, 0xc9, 0x9d, 0xc7, 0xa1, 0x9e, 0xaa, 0xa4, 0xcb, 0x73, 0x2f, 0x58,
-	0x29, 0x65, 0x58, 0xe1, 0x70, 0xd1, 0x8f, 0xb5, 0xd0, 0x3d, 0x58, 0x75, 0xcd, 0x80, 0x19, 0x62,
-	0xcb, 0xb2, 0xa7, 0xda, 0xb2, 0x62, 0xb5, 0x20, 0xce, 0xdb, 0x14, 0xac, 0x50, 0x42, 0xff, 0xa7,
-	0x04, 0x14, 0xf8, 0x60, 0x9c, 0x7d, 0xc7, 0xe2, 0x79, 0xda, 0x57, 0x4f, 0x1f, 0x6e, 0x43, 0xca,
-	0x0a, 0x7c, 0xe5, 0x54, 0x71, 0x7e, 0xd6, 0x7b, 0x18, 0x73, 0x1a, 0xfa, 0x04, 0xb2, 0xaa, 0xa2,
-	0x97, 0x99, 0x83, 0x7e, 0x7d, 0x46, 0xa9, 0x7c, 0xa3, 0xe4, 0x44, 0x3c, 0x4e, 0xad, 0x93, 0xfb,
-	0x38, 0x8e, 0x93, 0xd0, 0x2d, 0x48, 0x5a, 0xd2, 0x5d, 0xea, 0x57, 0x05, 0xf5, 0x36, 0x4e, 0x5a,
-	0x9e, 0xfe, 0xf7, 0x09, 0x58, 0x9a, 0xae, 0x59, 0x1e, 0x01, 0x77, 0x20, 0x1f, 0x8c, 0xf7, 0x82,
-	0x49, 0xc0, 0xc8, 0x30, 0x7c, 0xc3, 0x8b, 0x08, 0xa8, 0x05, 0x79, 0xd3, 0x1d, 0x50, 0xdf, 0x61,
-	0x07, 0x43, 0x55, 0x4c, 0xce, 0x3f, 0xed, 0xe3, 0x3a, 0x2b, 0xd5, 0x50, 0x04, 0x4f, 0xa5, 0xc3,
-	0xa3, 0x5b, 0x3e, 0xf4, 0x8a, 0xa3, 0xfb, 0x75, 0x28, 0xba, 0xe6, 0x50, 0x5c, 0x71, 0x30, 0x67,
-	0x28, 0xc7, 0x91, 0xc6, 0x05, 0x45, 0xeb, 0x3b, 0x43, 0xa2, 0xeb, 0x90, 0x8f, 0x94, 0xa1, 0x15,
-	0x28, 0x54, 0x9b, 0x3d, 0xe3, 0xfe, 0x83, 0x47, 0xc6, 0xe3, 0xfa, 0x8e, 0xb6, 0xa0, 0xd2, 0xcb,
-	0xbf, 0x48, 0xc0, 0x92, 0xda, 0x51, 0x54, 0xca, 0xfe, 0x06, 0x2c, 0xfa, 0xe6, 0x3e, 0x0b, 0x8b,
-	0x8a, 0xb4, 0x8c, 0x6a, 0xbe, 0x49, 0xf3, 0xa2, 0x82, 0xb3, 0xe6, 0x17, 0x15, 0xb1, 0x57, 0xe5,
-	0xd4, 0x95, 0xaf, 0xca, 0xe9, 0x9f, 0xcb, 0xab, 0xb2, 0xfe, 0x9b, 0x00, 0x9b, 0x8e, 0x4b, 0xfa,
-	0xf2, 0xa2, 0x65, 0x5e, 0x89, 0xc8, 0xd3, 0x30, 0x75, 0xdb, 0x16, 0xa6, 0x61, 0xad, 0x06, 0xe6,
-	0x34, 0xce, 0x1a, 0x38, 0xb6, 0x5a, 0x8c, 0x82, 0xf5, 0x98, 0xb3, 0x06, 0x8e, 0x1d, 0xbd, 0xa3,
-	0xa4, 0xaf, 0x7b, 0x47, 0x39, 0x4d, 0xc0, 0x8a, 0x4a, 0x3f, 0xa3, 0x1d, 0xf4, 0x3b, 0x90, 0x97,
-	0x99, 0xe8, 0xb4, 0x26, 0x13, 0x2f, 0xa9, 0x12, 0xd7, 0x6a, 0xe0, 0x9c, 0x64, 0xb7, 0x6c, 0xb4,
-	0x01, 0x05, 0x05, 0x8d, 0xfd, 0x02, 0x05, 0x24, 0xa9, 0xcd, 0xcd, 0xff, 0x1e, 0xa4, 0xf7, 0x1d,
-	0x97, 0xa8, 0x40, 0x9f, 0xbb, 0x01, 0x4c, 0x1d, 0xb0, 0xb5, 0x80, 0x05, 0xba, 0x96, 0x0b, 0x6f,
-	0xa2, 0x84, 0x7d, 0xaa, 0x72, 0x8c, 0xdb, 0x27, 0x8b, 0xc8, 0x0b, 0xf6, 0x49, 0x1c, 0xb7, 0x4f,
-	0xb2, 0xa5, 0x7d, 0x0a, 0x1a, 0xb7, 0x4f, 0x92, 0x7e, 0x2e, 0xf6, 0x6d, 0xc3, 0xad, 0x9a, 0x6b,
-	0x5a, 0x87, 0xae, 0x13, 0x30, 0x62, 0xc7, 0x77, 0x8c, 0x07, 0x90, 0x9d, 0xc9, 0x1b, 0xaf, 0xba,
-	0x98, 0x54, 0x48, 0xfd, 0xdf, 0x13, 0x50, 0xdc, 0x22, 0xa6, 0xcb, 0x0e, 0xa6, 0xb7, 0x3b, 0x8c,
-	0x04, 0x4c, 0x1d, 0x38, 0xe2, 0x1b, 0x7d, 0x1f, 0x72, 0x51, 0x5a, 0x71, 0xed, 0x0b, 0x51, 0x04,
-	0x45, 0x0f, 0x61, 0x91, 0xaf, 0x31, 0x3a, 0x0e, 0xeb, 0x95, 0xab, 0x1e, 0x1f, 0x14, 0x92, 0x1f,
-	0x32, 0x3e, 0x11, 0x79, 0x84, 0x08, 0xa5, 0x0c, 0x0e, 0x9b, 0xe8, 0x17, 0xa1, 0x28, 0xee, 0xce,
-	0xc3, 0xb4, 0x29, 0x73, 0x9d, 0xce, 0x82, 0x7c, 0xfe, 0x92, 0x29, 0xd3, 0xff, 0x26, 0x60, 0x75,
-	0xc7, 0x9c, 0xec, 0x11, 0xb5, 0x6d, 0x10, 0x1b, 0x13, 0x8b, 0xfa, 0x36, 0xea, 0xc6, 0xb7, 0x9b,
-	0x2b, 0x5e, 0xd3, 0xe6, 0x09, 0xcf, 0xdf, 0x75, 0xc2, 0x1a, 0x2a, 0x19, 0xab, 0xa1, 0x56, 0x21,
-	0xe3, 0x51, 0xcf, 0x22, 0x6a, 0x2f, 0x92, 0x0d, 0xdd, 0x89, 0x6f, 0x35, 0xa5, 0xe8, 0xa1, 0x4b,
-	0x3c, 0x53, 0xb5, 0x29, 0x8b, 0x7a, 0x43, 0x9f, 0x40, 0xa9, 0xd7, 0xac, 0xe3, 0x66, 0xbf, 0xd6,
-	0xf9, 0xb1, 0xd1, 0xab, 0x6e, 0xf7, 0xaa, 0x0f, 0xee, 0x19, 0xdd, 0xce, 0xf6, 0xa7, 0xf7, 0x1f,
-	0xde, 0xfb, 0xbe, 0x96, 0x28, 0x95, 0x4f, 0x4e, 0xcb, 0x77, 0xda, 0xd5, 0xfa, 0xb6, 0x5c, 0x31,
-	0x7b, 0xf4, 0x79, 0xcf, 0x74, 0x03, 0xf3, 0xc1, 0xbd, 0x2e, 0x75, 0x27, 0x1c, 0xc3, 0xc3, 0xba,
-	0x18, 0x3f, 0xaf, 0xe2, 0xc7, 0x70, 0xe2, 0xd2, 0x63, 0x78, 0x7a, 0x9a, 0x27, 0x2f, 0x39, 0xcd,
-	0x37, 0x61, 0xd5, 0xf2, 0x69, 0x10, 0x18, 0x3c, 0x81, 0x27, 0xf6, 0x85, 0x12, 0xe1, 0x1b, 0xe7,
-	0x67, 0x1b, 0x37, 0xea, 0x9c, 0xdf, 0x13, 0x6c, 0xa5, 0xfe, 0x86, 0x15, 0x23, 0x89, 0x9e, 0xf4,
-	0x3f, 0x4a, 0xf1, 0x5c, 0xc8, 0x39, 0x72, 0x5c, 0x32, 0x20, 0x01, 0x7a, 0x0a, 0x2b, 0x96, 0x4f,
-	0x6c, 0x9e, 0x99, 0x9b, 0xae, 0x11, 0x8c, 0x88, 0xa5, 0x82, 0xfa, 0x17, 0xe6, 0x26, 0x38, 0x91,
-	0x60, 0xa5, 0x1e, 0x49, 0xf5, 0x46, 0xc4, 0xc2, 0xcb, 0xd6, 0x4c, 0x1b, 0x7d, 0x06, 0x2b, 0x01,
-	0x71, 0x1d, 0x6f, 0xfc, 0xdc, 0xb0, 0xa8, 0xc7, 0xc8, 0xf3, 0xf0, 0xcd, 0xe6, 0x3a, 0xbd, 0xbd,
-	0xe6, 0x36, 0x97, 0xaa, 0x4b, 0xa1, 0x1a, 0x3a, 0x3f, 0xdb, 0x58, 0x9e, 0xa5, 0xe1, 0x65, 0xa5,
-	0x59, 0xb5, 0x4b, 0x6d, 0x58, 0x9e, 0xb5, 0x06, 0xad, 0xaa, 0xb5, 0x2f, 0xb6, 0x90, 0x70, 0x6d,
-	0xa3, 0x3b, 0x90, 0xf3, 0xc9, 0xc0, 0x09, 0x98, 0x2f, 0xdd, 0xcc, 0x39, 0x11, 0x85, 0xaf, 0x7c,
-	0xf9, 0x33, 0x94, 0xd2, 0xaf, 0xc3, 0x85, 0x1e, 0xf9, 0x62, 0xb1, 0x9d, 0xc0, 0xdc, 0x53, 0x2a,
-	0x73, 0x38, 0x6c, 0xf2, 0x18, 0x1c, 0x07, 0x51, 0xa2, 0x26, 0xbe, 0x39, 0x4d, 0x64, 0x14, 0xea,
-	0x47, 0x39, 0x22, 0x67, 0x08, 0x7f, 0xdd, 0x97, 0x8e, 0xfd, 0xba, 0x6f, 0x15, 0x32, 0x2e, 0x39,
-	0x22, 0xae, 0x3c, 0xcb, 0xb1, 0x6c, 0xbc, 0xf3, 0xb3, 0x14, 0xe4, 0xa3, 0xf7, 0x09, 0x7e, 0x12,
-	0xb4, 0x9b, 0xcf, 0xc2, 0x58, 0x8d, 0xe8, 0x6d, 0x72, 0x8c, 0x5e, 0x9f, 0x5e, 0x0b, 0x7d, 0x22,
-	0x1f, 0x64, 0x23, 0x76, 0x78, 0x25, 0xf4, 0x26, 0xe4, 0xaa, 0xbd, 0x5e, 0xeb, 0x71, 0xbb, 0xd9,
-	0xd0, 0x3e, 0x4f, 0x94, 0xbe, 0x71, 0x72, 0x5a, 0xbe, 0x11, 0x81, 0xaa, 0x81, 0x0c, 0x25, 0x81,
-	0xaa, 0xd7, 0x9b, 0xdd, 0x7e, 0xb3, 0xa1, 0xbd, 0x48, 0x5e, 0x44, 0x89, 0x6b, 0x0e, 0xf1, 0xb3,
-	0x8a, 0x7c, 0x17, 0x37, 0xbb, 0x55, 0xcc, 0x3b, 0xfc, 0x3c, 0x29, 0x6f, 0xab, 0xa6, 0x3d, 0xfa,
-	0x64, 0x64, 0xfa, 0xbc, 0xcf, 0xf5, 0xf0, 0xe7, 0x45, 0x2f, 0x52, 0xf2, 0xe9, 0x7d, 0xfa, 0xd8,
-	0x42, 0x4c, 0x7b, 0xc2, 0x7b, 0x13, 0xaf, 0x5c, 0x42, 0x4d, 0xea, 0x42, 0x6f, 0x3d, 0xbe, 0x93,
-	0x70, 0x2d, 0x3a, 0x2c, 0xe2, 0xdd, 0x76, 0x9b, 0x83, 0x5e, 0xa4, 0x2f, 0x8c, 0x0e, 0x8f, 0x3d,
-	0x5e, 0xc2, 0xa2, 0xbb, 0x90, 0x0b, 0x1f, 0xc1, 0xb4, 0xcf, 0xd3, 0x17, 0x0c, 0xaa, 0x87, 0x2f,
-	0x78, 0xa2, 0xc3, 0xad, 0xdd, 0xbe, 0xf8, 0xf5, 0xd3, 0x8b, 0xcc, 0xc5, 0x0e, 0x0f, 0xc6, 0xcc,
-	0xa6, 0xc7, 0x1e, 0x5f, 0x81, 0xea, 0x62, 0xec, 0xf3, 0x8c, 0xbc, 0x45, 0x88, 0x30, 0xea, 0x56,
-	0xec, 0x4d, 0xc8, 0xe1, 0xe6, 0x8f, 0xe4, 0x0f, 0xa5, 0x5e, 0x64, 0x2f, 0xe8, 0xc1, 0xe4, 0x33,
-	0x62, 0xa9, 0xde, 0x3a, 0xb8, 0xbb, 0x55, 0x15, 0x2e, 0xbf, 0x88, 0xea, 0xf8, 0xa3, 0x03, 0xd3,
-	0x23, 0xf6, 0xf4, 0xf7, 0x07, 0x11, 0xeb, 0x9d, 0x5f, 0x86, 0x5c, 0x98, 0x67, 0xa2, 0x75, 0xc8,
-	0x3e, 0xeb, 0xe0, 0x27, 0x4d, 0xac, 0x2d, 0x48, 0x1f, 0x86, 0x9c, 0x67, 0xb2, 0x42, 0x28, 0xc3,
-	0xe2, 0x4e, 0xb5, 0x5d, 0x7d, 0xdc, 0xc4, 0xe1, 0x9d, 0x75, 0x08, 0x50, 0xc9, 0x52, 0x49, 0x53,
-	0x1d, 0x44, 0x3a, 0x6b, 0x6b, 0x5f, 0x7c, 0xb9, 0xbe, 0xf0, 0xd3, 0x2f, 0xd7, 0x17, 0x5e, 0x9c,
-	0xaf, 0x27, 0xbe, 0x38, 0x5f, 0x4f, 0xfc, 0xe4, 0x7c, 0x3d, 0xf1, 0x6f, 0xe7, 0xeb, 0x89, 0xbd,
-	0xac, 0xd8, 0xd2, 0x1f, 0xfe, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb2, 0xf3, 0xe4, 0x8f, 0x7c,
-	0x2d, 0x00, 0x00,
+	0x76, 0x16, 0x7f, 0x45, 0x3e, 0x52, 0x52, 0x4f, 0x8d, 0x3c, 0xd6, 0xd0, 0x63, 0x49, 0x6e, 0x7b,
+	0xd6, 0x3f, 0xeb, 0xd0, 0xf3, 0x63, 0x1b, 0x63, 0x3b, 0x6b, 0x9b, 0x7f, 0x1a, 0x71, 0x47, 0x22,
+	0x89, 0x22, 0x35, 0xb3, 0x3e, 0x24, 0x8d, 0x56, 0x77, 0x89, 0x6a, 0xab, 0xd9, 0xc5, 0x74, 0x17,
+	0xa5, 0x61, 0x7e, 0x90, 0x41, 0x0e, 0x49, 0xa0, 0x53, 0x72, 0x0b, 0x10, 0x28, 0x97, 0xe4, 0x14,
+	0xe4, 0x96, 0x00, 0x41, 0x72, 0x89, 0x03, 0xe4, 0xe0, 0x5b, 0x36, 0x09, 0x10, 0x2c, 0x12, 0x40,
+	0x89, 0x75, 0xc8, 0x2d, 0x48, 0x2e, 0x8b, 0x5c, 0x12, 0x20, 0xa8, 0x9f, 0x6e, 0x36, 0x35, 0x94,
+	0x34, 0x5e, 0xef, 0x45, 0xea, 0x7a, 0xef, 0x7b, 0xaf, 0x5e, 0xbd, 0x7a, 0x55, 0xf5, 0x5e, 0x15,
+	0xa1, 0xc0, 0xc6, 0x43, 0x12, 0x94, 0x87, 0x3e, 0x65, 0x14, 0x21, 0x9b, 0x5a, 0x07, 0xc4, 0x2f,
+	0x07, 0x47, 0xa6, 0x3f, 0x38, 0x70, 0x58, 0xf9, 0xf0, 0x6e, 0x69, 0xad, 0x4f, 0x69, 0xdf, 0x25,
+	0xef, 0x09, 0xc4, 0xee, 0x68, 0xef, 0x3d, 0xe6, 0x0c, 0x48, 0xc0, 0xcc, 0xc1, 0x50, 0x0a, 0x95,
+	0x56, 0xcf, 0x03, 0xec, 0x91, 0x6f, 0x32, 0x87, 0x7a, 0x8a, 0xbf, 0xdc, 0xa7, 0x7d, 0x2a, 0x3e,
+	0xdf, 0xe3, 0x5f, 0x92, 0xaa, 0xaf, 0xc1, 0xfc, 0x63, 0xe2, 0x07, 0x0e, 0xf5, 0xd0, 0x32, 0x64,
+	0x1c, 0xcf, 0x26, 0x4f, 0x57, 0x12, 0xeb, 0x89, 0xb7, 0xd2, 0x58, 0x36, 0xf4, 0x3b, 0x00, 0x4d,
+	0xfe, 0xd1, 0xf0, 0x98, 0x3f, 0x46, 0x1a, 0xa4, 0x0e, 0xc8, 0x58, 0x20, 0xf2, 0x98, 0x7f, 0x72,
+	0xca, 0xa1, 0xe9, 0xae, 0x24, 0x25, 0xe5, 0xd0, 0x74, 0xf5, 0x6f, 0x12, 0x50, 0xa8, 0x78, 0x1e,
+	0x65, 0xa2, 0xf7, 0x00, 0x21, 0x48, 0x7b, 0xe6, 0x80, 0x28, 0x21, 0xf1, 0x8d, 0x6a, 0x90, 0x75,
+	0xcd, 0x5d, 0xe2, 0x06, 0x2b, 0xc9, 0xf5, 0xd4, 0x5b, 0x85, 0x7b, 0xdf, 0x2f, 0x3f, 0x3f, 0xe4,
+	0x72, 0x4c, 0x49, 0x79, 0x4b, 0xa0, 0x85, 0x11, 0x58, 0x89, 0xa2, 0x4f, 0x61, 0xde, 0xf1, 0x6c,
+	0xc7, 0x22, 0xc1, 0x4a, 0x5a, 0x68, 0x59, 0x9d, 0xa5, 0x65, 0x62, 0x7d, 0x35, 0xfd, 0xf5, 0xe9,
+	0xda, 0x1c, 0x0e, 0x85, 0x4a, 0x1f, 0x41, 0x21, 0xa6, 0x76, 0xc6, 0xd8, 0x96, 0x21, 0x73, 0x68,
+	0xba, 0x23, 0xa2, 0x46, 0x27, 0x1b, 0x1f, 0x27, 0x1f, 0x24, 0xf4, 0x2f, 0x20, 0x8f, 0x49, 0x40,
+	0x47, 0xbe, 0x45, 0x02, 0xf4, 0x36, 0xe4, 0x3d, 0xd3, 0xa3, 0x86, 0x35, 0x1c, 0x05, 0x42, 0x3c,
+	0x55, 0x2d, 0x9e, 0x9d, 0xae, 0xe5, 0x5a, 0xa6, 0x47, 0x6b, 0x9d, 0x9d, 0x00, 0xe7, 0x38, 0xbb,
+	0x36, 0x1c, 0x05, 0xe8, 0x35, 0x28, 0x0e, 0xc8, 0x80, 0xfa, 0x63, 0x63, 0x77, 0xcc, 0x48, 0x20,
+	0x14, 0xa7, 0x70, 0x41, 0xd2, 0xaa, 0x9c, 0xa4, 0xff, 0x5e, 0x02, 0x96, 0x43, 0xdd, 0x98, 0xfc,
+	0xca, 0xc8, 0xf1, 0xc9, 0x80, 0x78, 0x2c, 0x40, 0x1f, 0x40, 0xd6, 0x75, 0x06, 0x0e, 0x93, 0x7d,
+	0x14, 0xee, 0xbd, 0x3a, 0x6b, 0xb4, 0x91, 0x55, 0x58, 0x81, 0x51, 0x05, 0x8a, 0x3e, 0x09, 0x88,
+	0x7f, 0x28, 0x3d, 0x29, 0xba, 0xbc, 0x52, 0x78, 0x4a, 0x44, 0xdf, 0x80, 0x5c, 0xc7, 0x35, 0xd9,
+	0x1e, 0xf5, 0x07, 0x48, 0x87, 0xa2, 0xe9, 0x5b, 0xfb, 0x0e, 0x23, 0x16, 0x1b, 0xf9, 0xe1, 0xac,
+	0x4e, 0xd1, 0xd0, 0x0d, 0x48, 0x52, 0xd9, 0x51, 0xbe, 0x9a, 0x3d, 0x3b, 0x5d, 0x4b, 0xb6, 0xbb,
+	0x38, 0x49, 0x03, 0xfd, 0x13, 0xb8, 0xd6, 0x71, 0x47, 0x7d, 0xc7, 0xab, 0x93, 0xc0, 0xf2, 0x9d,
+	0x21, 0xd7, 0xce, 0xc3, 0x83, 0xc7, 0x7e, 0x18, 0x1e, 0xfc, 0x3b, 0x0a, 0x99, 0xe4, 0x24, 0x64,
+	0xf4, 0xdf, 0x49, 0xc2, 0xb5, 0x86, 0xd7, 0x77, 0x3c, 0x12, 0x97, 0xbe, 0x0d, 0x8b, 0x44, 0x10,
+	0x8d, 0x43, 0x19, 0xc6, 0x4a, 0xcf, 0x82, 0xa4, 0x86, 0xb1, 0xdd, 0x3c, 0x17, 0x6f, 0x77, 0x67,
+	0x0d, 0xff, 0x39, 0xed, 0x33, 0xa3, 0xae, 0x01, 0xf3, 0x43, 0x31, 0x88, 0x60, 0x25, 0x25, 0x74,
+	0xdd, 0x9e, 0xa5, 0xeb, 0xb9, 0x71, 0x86, 0xc1, 0xa7, 0x64, 0xbf, 0x4b, 0xf0, 0xfd, 0x59, 0x12,
+	0x96, 0x5a, 0xd4, 0x9e, 0xf2, 0x43, 0x09, 0x72, 0xfb, 0x34, 0x60, 0xb1, 0x85, 0x16, 0xb5, 0xd1,
+	0x03, 0xc8, 0x0d, 0xd5, 0xf4, 0xa9, 0xd9, 0xbf, 0x35, 0xdb, 0x64, 0x89, 0xc1, 0x11, 0x1a, 0x7d,
+	0x02, 0x79, 0x3f, 0x8c, 0x89, 0x95, 0xd4, 0x8b, 0x04, 0xce, 0x04, 0x8f, 0x7e, 0x00, 0x59, 0x39,
+	0x09, 0x2b, 0x69, 0x21, 0x79, 0xfb, 0x85, 0x7c, 0x8e, 0x95, 0x10, 0x7a, 0x08, 0x39, 0xe6, 0x06,
+	0x86, 0xe3, 0xed, 0xd1, 0x95, 0x8c, 0x50, 0xb0, 0x36, 0x4b, 0x01, 0x77, 0x44, 0x6f, 0xab, 0xdb,
+	0xf4, 0xf6, 0x68, 0xb5, 0x70, 0x76, 0xba, 0x36, 0xaf, 0x1a, 0x78, 0x9e, 0xb9, 0x01, 0xff, 0xd0,
+	0x7f, 0x3f, 0x01, 0x85, 0x18, 0x0a, 0xbd, 0x0a, 0xc0, 0xfc, 0x51, 0xc0, 0x0c, 0x9f, 0x52, 0x26,
+	0x9c, 0x55, 0xc4, 0x79, 0x41, 0xc1, 0x94, 0x32, 0x54, 0x86, 0xeb, 0x16, 0xf1, 0x99, 0xe1, 0x04,
+	0xc1, 0x88, 0xf8, 0x46, 0x30, 0xda, 0xfd, 0x92, 0x58, 0x4c, 0x38, 0xae, 0x88, 0xaf, 0x71, 0x56,
+	0x53, 0x70, 0xba, 0x92, 0x81, 0xee, 0xc3, 0x8d, 0x38, 0x7e, 0x38, 0xda, 0x75, 0x1d, 0xcb, 0xe0,
+	0x93, 0x99, 0x12, 0x22, 0xd7, 0x27, 0x22, 0x1d, 0xc1, 0x7b, 0x44, 0xc6, 0xfa, 0x4f, 0x12, 0xa0,
+	0x61, 0x73, 0x8f, 0x6d, 0x93, 0xc1, 0x2e, 0xf1, 0xbb, 0xcc, 0x64, 0xa3, 0x00, 0xdd, 0x80, 0xac,
+	0x4b, 0x4c, 0x9b, 0xf8, 0xc2, 0xa8, 0x1c, 0x56, 0x2d, 0xb4, 0xc3, 0x57, 0xb0, 0x69, 0xed, 0x9b,
+	0xbb, 0x8e, 0xeb, 0xb0, 0xb1, 0x30, 0x65, 0x71, 0x76, 0x08, 0x9f, 0xd7, 0x59, 0xc6, 0x31, 0x41,
+	0x3c, 0xa5, 0x06, 0xad, 0xc0, 0xfc, 0x80, 0x04, 0x81, 0xd9, 0x27, 0xc2, 0xd2, 0x3c, 0x0e, 0x9b,
+	0xfa, 0x27, 0x50, 0x8c, 0xcb, 0xa1, 0x02, 0xcc, 0xef, 0xb4, 0x1e, 0xb5, 0xda, 0x4f, 0x5a, 0xda,
+	0x1c, 0x5a, 0x82, 0xc2, 0x4e, 0x0b, 0x37, 0x2a, 0xb5, 0xcd, 0x4a, 0x75, 0xab, 0xa1, 0x25, 0xd0,
+	0x02, 0xe4, 0x27, 0xcd, 0xa4, 0xfe, 0xe7, 0x09, 0x00, 0xee, 0x6e, 0x35, 0xa8, 0x8f, 0x21, 0x13,
+	0x30, 0x93, 0xc9, 0xa8, 0x5c, 0xbc, 0xf7, 0xc6, 0x45, 0x73, 0xa8, 0xec, 0xe5, 0xff, 0x08, 0x96,
+	0x22, 0x71, 0x0b, 0x93, 0x53, 0x16, 0xf2, 0x0d, 0xc2, 0xb4, 0x6d, 0x5f, 0x19, 0x2e, 0xbe, 0xf5,
+	0x4f, 0x20, 0x23, 0xa4, 0xa7, 0xcd, 0xcd, 0x41, 0xba, 0xce, 0xbf, 0x12, 0x28, 0x0f, 0x19, 0xdc,
+	0xa8, 0xd4, 0xbf, 0xd0, 0x92, 0x48, 0x83, 0x62, 0xbd, 0xd9, 0xad, 0xb5, 0x5b, 0xad, 0x46, 0xad,
+	0xd7, 0xa8, 0x6b, 0x29, 0xfd, 0x36, 0x64, 0x9a, 0x03, 0xae, 0xf9, 0x16, 0x0f, 0xf9, 0x3d, 0xe2,
+	0x13, 0xcf, 0x0a, 0x57, 0xd2, 0x84, 0xa0, 0xff, 0x38, 0x0f, 0x99, 0x6d, 0x3a, 0xf2, 0x18, 0xba,
+	0x17, 0xdb, 0xb6, 0x16, 0x67, 0x9f, 0x3c, 0x02, 0x58, 0xee, 0x8d, 0x87, 0x44, 0x6d, 0x6b, 0x37,
+	0x20, 0x2b, 0x17, 0x87, 0x1a, 0x8e, 0x6a, 0x71, 0x3a, 0x33, 0xfd, 0x3e, 0x61, 0x6a, 0x3c, 0xaa,
+	0x85, 0xde, 0x82, 0x9c, 0x4f, 0x4c, 0x9b, 0x7a, 0xee, 0x58, 0xac, 0xa1, 0x9c, 0x3c, 0x57, 0x30,
+	0x31, 0xed, 0xb6, 0xe7, 0x8e, 0x71, 0xc4, 0x45, 0x9b, 0x50, 0xdc, 0x75, 0x3c, 0xdb, 0xa0, 0x43,
+	0xb9, 0xc9, 0x67, 0x2e, 0x5e, 0x71, 0xd2, 0xaa, 0xaa, 0xe3, 0xd9, 0x6d, 0x09, 0xc6, 0x85, 0xdd,
+	0x49, 0x03, 0xb5, 0x60, 0xf1, 0x90, 0xba, 0xa3, 0x01, 0x89, 0x74, 0x65, 0x85, 0xae, 0x37, 0x2f,
+	0xd6, 0xf5, 0x58, 0xe0, 0x43, 0x6d, 0x0b, 0x87, 0xf1, 0x26, 0x7a, 0x04, 0x0b, 0x6c, 0x30, 0xdc,
+	0x0b, 0x22, 0x75, 0xf3, 0x42, 0xdd, 0xf7, 0x2e, 0x71, 0x18, 0x87, 0x87, 0xda, 0x8a, 0x2c, 0xd6,
+	0x2a, 0xfd, 0x56, 0x0a, 0x0a, 0x31, 0xcb, 0x51, 0x17, 0x0a, 0x43, 0x9f, 0x0e, 0xcd, 0xbe, 0x38,
+	0xa8, 0xd4, 0x5c, 0xdc, 0x7d, 0xa1, 0x51, 0x97, 0x3b, 0x13, 0x41, 0x1c, 0xd7, 0xa2, 0x9f, 0x24,
+	0xa1, 0x10, 0x63, 0xa2, 0x77, 0x20, 0x87, 0x3b, 0xb8, 0xf9, 0xb8, 0xd2, 0x6b, 0x68, 0x73, 0xa5,
+	0x5b, 0xc7, 0x27, 0xeb, 0x2b, 0x42, 0x5b, 0x5c, 0x41, 0xc7, 0x77, 0x0e, 0x79, 0xe8, 0xbd, 0x05,
+	0xf3, 0x21, 0x34, 0x51, 0x7a, 0xe5, 0xf8, 0x64, 0xfd, 0xe5, 0xf3, 0xd0, 0x18, 0x12, 0x77, 0x37,
+	0x2b, 0xb8, 0x51, 0xd7, 0x92, 0xb3, 0x91, 0xb8, 0xbb, 0x6f, 0xfa, 0xc4, 0x46, 0xdf, 0x83, 0xac,
+	0x02, 0xa6, 0x4a, 0xa5, 0xe3, 0x93, 0xf5, 0x1b, 0xe7, 0x81, 0x13, 0x1c, 0xee, 0x6e, 0x55, 0x1e,
+	0x37, 0xb4, 0xf4, 0x6c, 0x1c, 0xee, 0xba, 0xe6, 0x21, 0x41, 0x6f, 0x40, 0x46, 0xc2, 0x32, 0xa5,
+	0x9b, 0xc7, 0x27, 0xeb, 0x2f, 0x3d, 0xa7, 0x8e, 0xa3, 0x4a, 0x2b, 0xbf, 0xfb, 0xc7, 0xab, 0x73,
+	0x7f, 0xfd, 0x27, 0xab, 0xda, 0x79, 0x76, 0xe9, 0x7f, 0x13, 0xb0, 0x30, 0x35, 0xe5, 0x48, 0x87,
+	0xac, 0x47, 0x2d, 0x3a, 0x94, 0xe7, 0x57, 0xae, 0x0a, 0x67, 0xa7, 0x6b, 0xd9, 0x16, 0xad, 0xd1,
+	0xe1, 0x18, 0x2b, 0x0e, 0x7a, 0x74, 0xee, 0x04, 0xbe, 0xff, 0x82, 0xf1, 0x34, 0xf3, 0x0c, 0xfe,
+	0x0c, 0x16, 0x6c, 0xdf, 0x39, 0x24, 0xbe, 0x61, 0x51, 0x6f, 0xcf, 0xe9, 0xab, 0xb3, 0xa9, 0x34,
+	0x4b, 0x67, 0x5d, 0x00, 0x71, 0x51, 0x0a, 0xd4, 0x04, 0xfe, 0x3b, 0x9c, 0xbe, 0xa5, 0xc7, 0x50,
+	0x8c, 0x47, 0x28, 0x3f, 0x4e, 0x02, 0xe7, 0x57, 0x89, 0x4a, 0xe8, 0x44, 0xfa, 0x87, 0xf3, 0x9c,
+	0x22, 0xd2, 0x39, 0xf4, 0x26, 0xa4, 0x07, 0xd4, 0x96, 0x7a, 0x16, 0xaa, 0xd7, 0x79, 0x12, 0xf0,
+	0x2f, 0xa7, 0x6b, 0x05, 0x1a, 0x94, 0x37, 0x1c, 0x97, 0x6c, 0x53, 0x9b, 0x60, 0x01, 0xd0, 0x0f,
+	0x21, 0xcd, 0xb7, 0x0a, 0xf4, 0x0a, 0xa4, 0xab, 0xcd, 0x56, 0x5d, 0x9b, 0x2b, 0x5d, 0x3b, 0x3e,
+	0x59, 0x5f, 0x10, 0x2e, 0xe1, 0x0c, 0x1e, 0xbb, 0x68, 0x0d, 0xb2, 0x8f, 0xdb, 0x5b, 0x3b, 0xdb,
+	0x3c, 0xbc, 0xae, 0x1f, 0x9f, 0xac, 0x2f, 0x45, 0x6c, 0xe9, 0x34, 0xf4, 0x2a, 0x64, 0x7a, 0xdb,
+	0x9d, 0x8d, 0xae, 0x96, 0x2c, 0xa1, 0xe3, 0x93, 0xf5, 0xc5, 0x88, 0x2f, 0x6c, 0x2e, 0x5d, 0x53,
+	0xb3, 0x9a, 0x8f, 0xe8, 0xfa, 0x4f, 0x93, 0xb0, 0x80, 0x79, 0x25, 0xe1, 0xb3, 0x0e, 0x75, 0x1d,
+	0x6b, 0x8c, 0x3a, 0x90, 0xb7, 0xa8, 0x67, 0x3b, 0xb1, 0x35, 0x75, 0xef, 0x82, 0x53, 0x7f, 0x22,
+	0x15, 0xb6, 0x6a, 0xa1, 0x24, 0x9e, 0x28, 0x41, 0xef, 0x41, 0xc6, 0x26, 0xae, 0x39, 0x56, 0xe9,
+	0xc7, 0xcd, 0xb2, 0xac, 0x55, 0xca, 0x61, 0xad, 0x52, 0xae, 0xab, 0x5a, 0x05, 0x4b, 0x9c, 0xc8,
+	0x93, 0xcd, 0xa7, 0x86, 0xc9, 0x18, 0x19, 0x0c, 0x99, 0xcc, 0x3d, 0xd2, 0xb8, 0x30, 0x30, 0x9f,
+	0x56, 0x14, 0x09, 0xdd, 0x85, 0xec, 0x91, 0xe3, 0xd9, 0xf4, 0x48, 0xa5, 0x17, 0x97, 0x28, 0x55,
+	0x40, 0xfd, 0x98, 0x9f, 0xba, 0xe7, 0xcc, 0xe4, 0xfe, 0x6e, 0xb5, 0x5b, 0x8d, 0xd0, 0xdf, 0x8a,
+	0xdf, 0xf6, 0x5a, 0xd4, 0xe3, 0x6b, 0x05, 0xda, 0x2d, 0x63, 0xa3, 0xd2, 0xdc, 0xda, 0xc1, 0xdc,
+	0xe7, 0xcb, 0xc7, 0x27, 0xeb, 0x5a, 0x04, 0xd9, 0x30, 0x1d, 0x97, 0xe7, 0xbb, 0x37, 0x21, 0x55,
+	0x69, 0x7d, 0xa1, 0x25, 0x4b, 0xda, 0xf1, 0xc9, 0x7a, 0x31, 0x62, 0x57, 0xbc, 0xf1, 0x64, 0x19,
+	0x9d, 0xef, 0x57, 0xff, 0xfb, 0x14, 0x14, 0x77, 0x86, 0xb6, 0xc9, 0x88, 0x8c, 0x49, 0xb4, 0x0e,
+	0x85, 0xa1, 0xe9, 0x9b, 0xae, 0x4b, 0x5c, 0x27, 0x18, 0xa8, 0x2a, 0x2c, 0x4e, 0x42, 0x1f, 0xbd,
+	0xa8, 0x1b, 0xab, 0x39, 0x1e, 0x67, 0x7f, 0xf0, 0x6f, 0x6b, 0x89, 0xd0, 0xa1, 0x3b, 0xb0, 0xb8,
+	0x27, 0xad, 0x35, 0x4c, 0x4b, 0x4c, 0x6c, 0x4a, 0x4c, 0x6c, 0x79, 0xd6, 0xc4, 0xc6, 0xcd, 0x2a,
+	0xab, 0x41, 0x56, 0x84, 0x14, 0x5e, 0xd8, 0x8b, 0x37, 0xd1, 0x7d, 0x98, 0x1f, 0x50, 0xcf, 0x61,
+	0xd4, 0xbf, 0x7a, 0x16, 0x42, 0x24, 0x7a, 0x07, 0xae, 0xf1, 0xc9, 0x0d, 0xed, 0x11, 0x6c, 0x71,
+	0x62, 0x25, 0xf1, 0xd2, 0xc0, 0x7c, 0xaa, 0x3a, 0xc4, 0x9c, 0x8c, 0xaa, 0x90, 0xa1, 0x3e, 0x4f,
+	0x89, 0xb2, 0xc2, 0xdc, 0x77, 0xaf, 0x34, 0x57, 0x36, 0xda, 0x5c, 0x06, 0x4b, 0x51, 0xfd, 0x43,
+	0x58, 0x98, 0x1a, 0x04, 0xcf, 0x04, 0x3a, 0x95, 0x9d, 0x6e, 0x43, 0x9b, 0x43, 0x45, 0xc8, 0xd5,
+	0xda, 0xad, 0x5e, 0xb3, 0xb5, 0xc3, 0x53, 0x99, 0x22, 0xe4, 0x70, 0x7b, 0x6b, 0xab, 0x5a, 0xa9,
+	0x3d, 0xd2, 0x92, 0x7a, 0x19, 0x0a, 0x31, 0x6d, 0x68, 0x11, 0xa0, 0xdb, 0x6b, 0x77, 0x8c, 0x8d,
+	0x26, 0xee, 0xf6, 0x64, 0x22, 0xd4, 0xed, 0x55, 0x70, 0x4f, 0x11, 0x12, 0xfa, 0x7f, 0x25, 0xc3,
+	0x19, 0x55, 0xb9, 0x4f, 0x75, 0x3a, 0xf7, 0xb9, 0xc4, 0x78, 0x95, 0xfd, 0x4c, 0x1a, 0x51, 0x0e,
+	0xf4, 0x11, 0x80, 0x08, 0x1c, 0x62, 0x1b, 0x26, 0x53, 0x13, 0x5f, 0x7a, 0xce, 0xc9, 0xbd, 0xf0,
+	0x32, 0x00, 0xe7, 0x15, 0xba, 0xc2, 0xd0, 0x0f, 0xa0, 0x68, 0xd1, 0xc1, 0xd0, 0x25, 0x4a, 0x38,
+	0x75, 0xa5, 0x70, 0x21, 0xc2, 0x57, 0x58, 0x3c, 0xfb, 0x4a, 0x4f, 0xe7, 0x87, 0xbf, 0x9d, 0x08,
+	0x3d, 0x33, 0x23, 0xe1, 0x2a, 0x42, 0x6e, 0xa7, 0x53, 0xaf, 0xf4, 0x9a, 0xad, 0x87, 0x5a, 0x02,
+	0x01, 0x64, 0x85, 0xab, 0xeb, 0x5a, 0x92, 0x27, 0x8a, 0xb5, 0xf6, 0x76, 0x67, 0xab, 0x21, 0x52,
+	0x2e, 0xb4, 0x0c, 0x5a, 0xe8, 0x6c, 0x43, 0x38, 0xb2, 0x51, 0xd7, 0xd2, 0xe8, 0x3a, 0x2c, 0x45,
+	0x54, 0x25, 0x99, 0x41, 0x37, 0x00, 0x45, 0xc4, 0x89, 0x8a, 0xac, 0xfe, 0x1b, 0xb0, 0x54, 0xa3,
+	0x1e, 0x33, 0x1d, 0x2f, 0x4a, 0xa2, 0xef, 0xf1, 0x41, 0x2b, 0x92, 0xe1, 0xd8, 0x72, 0x4f, 0xaf,
+	0x2e, 0x9d, 0x9d, 0xae, 0x15, 0x22, 0x68, 0xb3, 0xce, 0x47, 0x1a, 0x36, 0x6c, 0xbe, 0x7e, 0x87,
+	0x8e, 0x2d, 0x9c, 0x9b, 0xa9, 0xce, 0x9f, 0x9d, 0xae, 0xa5, 0x3a, 0xcd, 0x3a, 0xe6, 0x34, 0xf4,
+	0x0a, 0xe4, 0xc9, 0x53, 0x87, 0x19, 0x16, 0xdf, 0xc3, 0xb9, 0x03, 0x33, 0x38, 0xc7, 0x09, 0x35,
+	0xbe, 0x65, 0x57, 0x01, 0x3a, 0xd4, 0x67, 0xaa, 0xe7, 0xf7, 0x21, 0x33, 0xa4, 0xbe, 0x28, 0xcf,
+	0x2f, 0xbc, 0x8c, 0xe0, 0x70, 0x19, 0xa8, 0x58, 0x82, 0xf5, 0xbf, 0x49, 0x02, 0xf4, 0xcc, 0xe0,
+	0x40, 0x29, 0x79, 0x00, 0xf9, 0xe8, 0x62, 0x47, 0xd5, 0xf9, 0x97, 0xce, 0x76, 0x04, 0x46, 0xf7,
+	0xc3, 0x60, 0x93, 0xe5, 0xc1, 0xcc, 0x3a, 0x2d, 0xec, 0x68, 0x56, 0x86, 0x3d, 0x5d, 0x03, 0xf0,
+	0x23, 0x91, 0xf8, 0xbe, 0x9a, 0x79, 0xfe, 0x89, 0x6a, 0xe2, 0x58, 0x90, 0x4e, 0x53, 0x09, 0xe6,
+	0xeb, 0xb3, 0x3a, 0x39, 0x37, 0x23, 0x9b, 0x73, 0x78, 0x22, 0x87, 0x3e, 0x83, 0x02, 0x1f, 0xb7,
+	0x11, 0x08, 0x9e, 0xca, 0x2d, 0x2f, 0x74, 0x95, 0xd4, 0x80, 0x61, 0x18, 0x7d, 0x57, 0x35, 0x58,
+	0xf4, 0x47, 0x1e, 0x1f, 0xb6, 0xd2, 0xa1, 0x3b, 0xf0, 0x72, 0x8b, 0xb0, 0x23, 0xea, 0x1f, 0x54,
+	0x18, 0x33, 0xad, 0xfd, 0x01, 0xf1, 0x94, 0x8f, 0x63, 0x89, 0x75, 0x62, 0x2a, 0xb1, 0x5e, 0x81,
+	0x79, 0xd3, 0x75, 0xcc, 0x80, 0xc8, 0x6c, 0x24, 0x8f, 0xc3, 0x26, 0x4f, 0xff, 0x79, 0x31, 0x41,
+	0x82, 0x80, 0xc8, 0xfa, 0x3e, 0x8f, 0x27, 0x04, 0xfd, 0x9f, 0x92, 0x00, 0xcd, 0x4e, 0x65, 0x5b,
+	0xa9, 0xaf, 0x43, 0x76, 0xcf, 0x1c, 0x38, 0xee, 0xf8, 0xb2, 0x05, 0x3e, 0xc1, 0x97, 0x2b, 0x52,
+	0xd1, 0x86, 0x90, 0xc1, 0x4a, 0x56, 0x54, 0x05, 0xa3, 0x5d, 0x8f, 0xb0, 0xa8, 0x2a, 0x10, 0x2d,
+	0x9e, 0x82, 0xf8, 0xa6, 0x17, 0xcd, 0x8c, 0x6c, 0x70, 0xd3, 0xfb, 0x26, 0x23, 0x47, 0xe6, 0x38,
+	0x5c, 0x95, 0xaa, 0x89, 0x36, 0x79, 0xb5, 0x10, 0x10, 0xff, 0x90, 0xd8, 0x2b, 0x19, 0x11, 0x82,
+	0x57, 0xd9, 0x83, 0x15, 0x5c, 0x26, 0x57, 0x91, 0x74, 0xe9, 0x13, 0x91, 0x11, 0x4c, 0x58, 0xdf,
+	0xea, 0x76, 0xe2, 0x0e, 0x2c, 0x4c, 0x8d, 0xf3, 0xb9, 0x72, 0xac, 0xd9, 0x79, 0xfc, 0xbe, 0x96,
+	0x56, 0x5f, 0x1f, 0x6a, 0x59, 0xfd, 0x4f, 0x53, 0x72, 0x1d, 0x29, 0xaf, 0xce, 0xbe, 0x2f, 0xcc,
+	0x89, 0xe8, 0xb7, 0xa8, 0xab, 0xe2, 0xfb, 0xcd, 0xcb, 0x97, 0x17, 0x4f, 0xef, 0x05, 0x1c, 0x47,
+	0x82, 0x68, 0x0d, 0x0a, 0x72, 0xfe, 0x0d, 0x1e, 0x4f, 0xc2, 0xad, 0x0b, 0x18, 0x24, 0x89, 0x4b,
+	0xa2, 0xdb, 0xb0, 0x28, 0xca, 0xf7, 0x60, 0x9f, 0xd8, 0x12, 0x93, 0x16, 0x98, 0x85, 0x88, 0x2a,
+	0x60, 0xdb, 0x50, 0x54, 0x04, 0x43, 0xa4, 0x76, 0x19, 0x61, 0xd0, 0x3b, 0x57, 0x19, 0x24, 0x45,
+	0x44, 0xc6, 0x57, 0x18, 0x4e, 0x1a, 0x7a, 0x1d, 0x72, 0xa1, 0xb1, 0x68, 0x05, 0x52, 0xbd, 0x5a,
+	0x47, 0x9b, 0x2b, 0x2d, 0x1d, 0x9f, 0xac, 0x17, 0x42, 0x72, 0xaf, 0xd6, 0xe1, 0x9c, 0x9d, 0x7a,
+	0x47, 0x4b, 0x4c, 0x73, 0x76, 0xea, 0x9d, 0x52, 0x9a, 0xa7, 0x18, 0xfa, 0x1e, 0x14, 0x62, 0x3d,
+	0xa0, 0xd7, 0x61, 0xbe, 0xd9, 0x7a, 0x88, 0x1b, 0xdd, 0xae, 0x36, 0x57, 0xba, 0x71, 0x7c, 0xb2,
+	0x8e, 0x62, 0xdc, 0xa6, 0xd7, 0xe7, 0xf3, 0x83, 0x5e, 0x85, 0xf4, 0x66, 0x9b, 0x1f, 0x5d, 0x32,
+	0x97, 0x8c, 0x21, 0x36, 0x69, 0xc0, 0x4a, 0xd7, 0x55, 0xee, 0x12, 0x57, 0xac, 0xff, 0x61, 0x02,
+	0xb2, 0x32, 0xa5, 0x9e, 0x39, 0x51, 0x15, 0x98, 0x0f, 0x0b, 0x3d, 0x99, 0xe7, 0xbf, 0x79, 0x71,
+	0x4e, 0x5e, 0x56, 0x29, 0xb4, 0x0c, 0xbf, 0x50, 0xae, 0xf4, 0x31, 0x14, 0xe3, 0x8c, 0x6f, 0x15,
+	0x7c, 0xbf, 0x06, 0x05, 0x1e, 0xdf, 0x61, 0x6e, 0x7e, 0x0f, 0xb2, 0x32, 0xed, 0x8f, 0xb6, 0xd2,
+	0x8b, 0x0b, 0x04, 0x85, 0x44, 0x0f, 0x60, 0x5e, 0x16, 0x15, 0xe1, 0xfd, 0xde, 0xea, 0xe5, 0xab,
+	0x08, 0x87, 0x70, 0xfd, 0x33, 0x48, 0x77, 0x08, 0xf1, 0xb9, 0xef, 0x3d, 0x6a, 0x93, 0xc9, 0xe9,
+	0xa3, 0xea, 0x21, 0x9b, 0x34, 0xeb, 0xbc, 0x1e, 0xb2, 0x49, 0xd3, 0x8e, 0x6e, 0x30, 0x92, 0xb1,
+	0x1b, 0x8c, 0x1e, 0x14, 0x9f, 0x10, 0xa7, 0xbf, 0xcf, 0x88, 0x2d, 0x14, 0xbd, 0x0b, 0xe9, 0x21,
+	0x89, 0x8c, 0x5f, 0x99, 0x19, 0x60, 0x84, 0xf8, 0x58, 0xa0, 0xf8, 0x3e, 0x72, 0x24, 0xa4, 0xd5,
+	0xad, 0xb2, 0x6a, 0xe9, 0xff, 0x98, 0x84, 0xc5, 0x66, 0x10, 0x8c, 0x4c, 0xcf, 0x0a, 0x13, 0x93,
+	0x4f, 0xa7, 0x13, 0x93, 0xb7, 0x66, 0x8e, 0x70, 0x4a, 0x64, 0xfa, 0x62, 0x46, 0x1d, 0x0e, 0xc9,
+	0xe8, 0x70, 0xd0, 0xff, 0x33, 0x11, 0xde, 0xbe, 0xdc, 0x8e, 0x2d, 0xf7, 0xd2, 0xca, 0xf1, 0xc9,
+	0xfa, 0x72, 0x5c, 0x13, 0xd9, 0xf1, 0x0e, 0x3c, 0x7a, 0xe4, 0xa1, 0xd7, 0x20, 0x83, 0x1b, 0xad,
+	0xc6, 0x13, 0x2d, 0x21, 0xc3, 0x73, 0x0a, 0x84, 0x89, 0x47, 0x8e, 0xb8, 0xa6, 0x4e, 0xa3, 0x55,
+	0xe7, 0x89, 0x44, 0x72, 0x86, 0xa6, 0x0e, 0xf1, 0x6c, 0xc7, 0xeb, 0xa3, 0xd7, 0x21, 0xdb, 0xec,
+	0x76, 0x77, 0x44, 0x7d, 0xfc, 0xf2, 0xf1, 0xc9, 0xfa, 0xf5, 0x29, 0x94, 0xb8, 0x79, 0xb3, 0x39,
+	0x88, 0x67, 0xf1, 0x3c, 0xc5, 0x98, 0x01, 0xe2, 0xe9, 0xa1, 0x04, 0xe1, 0x76, 0x8f, 0x17, 0xef,
+	0x99, 0x19, 0x20, 0x4c, 0xf9, 0x5f, 0xb5, 0xdc, 0xfe, 0x35, 0x09, 0x5a, 0xc5, 0xb2, 0xc8, 0x90,
+	0x71, 0xbe, 0x2a, 0x9c, 0x7a, 0x90, 0x1b, 0xf2, 0x2f, 0x87, 0x84, 0x49, 0xc0, 0x83, 0x99, 0xef,
+	0x1a, 0xe7, 0xe4, 0xca, 0x98, 0xba, 0xa4, 0x62, 0x0f, 0x9c, 0x20, 0x70, 0xa8, 0x27, 0x69, 0x38,
+	0xd2, 0x54, 0xfa, 0xef, 0x04, 0x5c, 0x9f, 0x81, 0x40, 0x77, 0x20, 0xed, 0x53, 0x37, 0x9c, 0xc3,
+	0x5b, 0x17, 0x5d, 0xac, 0x71, 0x51, 0x2c, 0x90, 0x68, 0x15, 0xc0, 0x1c, 0x31, 0x6a, 0x8a, 0xfe,
+	0xc5, 0xec, 0xe5, 0x70, 0x8c, 0x82, 0x9e, 0x40, 0x36, 0x20, 0x96, 0x4f, 0xc2, 0x54, 0xf1, 0xb3,
+	0x9f, 0xd5, 0xfa, 0x72, 0x57, 0xa8, 0xc1, 0x4a, 0x5d, 0xa9, 0x0c, 0x59, 0x49, 0xe1, 0x61, 0x6f,
+	0x9b, 0xcc, 0x54, 0xd7, 0xae, 0xe2, 0x9b, 0x47, 0x93, 0xe9, 0xf6, 0xc3, 0x68, 0x32, 0xdd, 0xbe,
+	0xfe, 0x77, 0x49, 0x80, 0xc6, 0x53, 0x46, 0x7c, 0xcf, 0x74, 0x6b, 0x15, 0xd4, 0x88, 0xed, 0xfe,
+	0x72, 0xb4, 0x6f, 0xcf, 0xbc, 0x4b, 0x8e, 0x24, 0xca, 0xb5, 0xca, 0x8c, 0xfd, 0xff, 0x26, 0xa4,
+	0x46, 0xbe, 0x7a, 0xaa, 0x92, 0x69, 0xde, 0x0e, 0xde, 0xc2, 0x9c, 0x86, 0x1a, 0x93, 0x6d, 0x2b,
+	0x75, 0xf1, 0x83, 0x54, 0xac, 0x83, 0x99, 0x5b, 0x17, 0x5f, 0xf9, 0x96, 0x69, 0x58, 0x44, 0x9d,
+	0x1c, 0x45, 0xb9, 0xf2, 0x6b, 0x95, 0x1a, 0xf1, 0x19, 0xce, 0x5a, 0x26, 0xff, 0xff, 0x9d, 0xf6,
+	0xb7, 0x77, 0x01, 0x26, 0x43, 0x43, 0xab, 0x90, 0xa9, 0x6d, 0x74, 0xbb, 0x5b, 0xda, 0x9c, 0xdc,
+	0xc0, 0x27, 0x2c, 0x41, 0xd6, 0xff, 0x2a, 0x09, 0xb9, 0x5a, 0x45, 0x1d, 0xab, 0x35, 0xd0, 0xc4,
+	0xae, 0x24, 0x2e, 0xab, 0xc9, 0xd3, 0xa1, 0xe3, 0x8f, 0xd5, 0xc6, 0x72, 0x49, 0xcd, 0xb6, 0xc8,
+	0x45, 0xb8, 0xd5, 0x0d, 0x21, 0x80, 0x30, 0x14, 0x89, 0x72, 0x82, 0x61, 0x99, 0xe1, 0x1e, 0xbf,
+	0x7a, 0xb9, 0xb3, 0x64, 0xf6, 0x3d, 0x69, 0x07, 0xb8, 0x10, 0x2a, 0xa9, 0x99, 0x01, 0xfa, 0x08,
+	0x96, 0x02, 0xa7, 0xef, 0x39, 0x5e, 0xdf, 0x08, 0x9d, 0x27, 0x6e, 0xce, 0xab, 0xd7, 0xce, 0x4e,
+	0xd7, 0x16, 0xba, 0x92, 0xa5, 0x7c, 0xb8, 0xa0, 0x90, 0x35, 0xe1, 0x4a, 0xf4, 0x21, 0x2c, 0xc6,
+	0x44, 0xb9, 0x17, 0xa5, 0xdb, 0xb5, 0xb3, 0xd3, 0xb5, 0x62, 0x24, 0xf9, 0x88, 0x8c, 0x71, 0x31,
+	0x12, 0x7c, 0x44, 0xc4, 0xf5, 0xc2, 0x1e, 0xf5, 0x2d, 0x62, 0xf8, 0x62, 0x4d, 0x8b, 0x13, 0x3c,
+	0x8d, 0x0b, 0x82, 0x26, 0x97, 0xb9, 0xfe, 0x18, 0xae, 0xb7, 0x7d, 0x6b, 0x9f, 0x04, 0x4c, 0xba,
+	0x42, 0x79, 0xf1, 0x33, 0xb8, 0xc5, 0xcc, 0xe0, 0xc0, 0xd8, 0x77, 0x02, 0x46, 0xfd, 0xb1, 0xe1,
+	0x13, 0x46, 0x3c, 0xce, 0x37, 0xc4, 0x73, 0x9b, 0xba, 0xff, 0xb9, 0xc9, 0x31, 0x9b, 0x12, 0x82,
+	0x43, 0xc4, 0x16, 0x07, 0xe8, 0x4d, 0x28, 0xf2, 0x2c, 0xbc, 0x4e, 0xf6, 0xcc, 0x91, 0xcb, 0xf8,
+	0xe8, 0xc1, 0xa5, 0x7d, 0xe3, 0x85, 0x8f, 0xa9, 0xbc, 0x4b, 0xfb, 0xf2, 0x53, 0xff, 0x11, 0x68,
+	0x75, 0x27, 0x18, 0x9a, 0xcc, 0xda, 0x0f, 0x2f, 0xb6, 0x50, 0x1d, 0xb4, 0x7d, 0x62, 0xfa, 0x6c,
+	0x97, 0x98, 0xcc, 0x18, 0x12, 0xdf, 0xa1, 0xf6, 0xd5, 0xb3, 0xbc, 0x14, 0x89, 0x74, 0x84, 0x84,
+	0xfe, 0x3f, 0x09, 0x00, 0x6c, 0xee, 0x85, 0x19, 0xd9, 0xf7, 0xe1, 0x5a, 0xe0, 0x99, 0xc3, 0x60,
+	0x9f, 0x32, 0xc3, 0xf1, 0x18, 0xf1, 0x0f, 0x4d, 0x57, 0xdd, 0x4f, 0x68, 0x21, 0xa3, 0xa9, 0xe8,
+	0xe8, 0x5d, 0x40, 0x07, 0x84, 0x0c, 0x0d, 0xea, 0xda, 0x46, 0xc8, 0x94, 0x8f, 0x81, 0x69, 0xac,
+	0x71, 0x4e, 0xdb, 0xb5, 0xbb, 0x21, 0x1d, 0x55, 0x61, 0x95, 0x0f, 0x9f, 0x78, 0xcc, 0x77, 0x48,
+	0x60, 0xec, 0x51, 0xdf, 0x08, 0x5c, 0x7a, 0x64, 0xec, 0x51, 0xd7, 0xa5, 0x47, 0xc4, 0x0f, 0xaf,
+	0x7e, 0x4a, 0x2e, 0xed, 0x37, 0x24, 0x68, 0x83, 0xfa, 0x5d, 0x97, 0x1e, 0x6d, 0x84, 0x08, 0x9e,
+	0xb6, 0x4d, 0xc6, 0xcc, 0x1c, 0xeb, 0x20, 0x4c, 0xdb, 0x22, 0x6a, 0xcf, 0xb1, 0x0e, 0xd0, 0xeb,
+	0xb0, 0x40, 0x5c, 0x22, 0x6e, 0x00, 0x24, 0x2a, 0x23, 0x50, 0xc5, 0x90, 0xc8, 0x41, 0xfa, 0xe7,
+	0xa0, 0x35, 0x3c, 0xcb, 0x1f, 0x0f, 0x63, 0x73, 0xfe, 0x2e, 0x20, 0xbe, 0x49, 0x1a, 0x2e, 0xb5,
+	0x0e, 0x8c, 0x81, 0xe9, 0x99, 0x7d, 0x6e, 0x97, 0x7c, 0xa3, 0xd1, 0x38, 0x67, 0x8b, 0x5a, 0x07,
+	0xdb, 0x8a, 0xae, 0x7f, 0x04, 0xd0, 0x1d, 0xfa, 0xc4, 0xb4, 0xdb, 0x3c, 0x9b, 0xe0, 0xae, 0x13,
+	0x2d, 0xc3, 0x56, 0x6f, 0x5c, 0xd4, 0x57, 0x4b, 0x5d, 0x93, 0x8c, 0x7a, 0x44, 0xd7, 0x7f, 0x09,
+	0xae, 0x77, 0x5c, 0xd3, 0x12, 0xef, 0xbd, 0x9d, 0xe8, 0xd1, 0x01, 0x3d, 0x80, 0xac, 0x84, 0xaa,
+	0x99, 0x9c, 0xb9, 0xdc, 0x26, 0x7d, 0x6e, 0xce, 0x61, 0x85, 0xaf, 0x16, 0x01, 0x26, 0x7a, 0xf4,
+	0xbf, 0x48, 0x40, 0x3e, 0xd2, 0x8f, 0xd6, 0x81, 0xd7, 0xc0, 0x3c, 0xbc, 0x1d, 0x4f, 0x15, 0xad,
+	0x79, 0x1c, 0x27, 0xa1, 0x26, 0x14, 0x86, 0x91, 0xf4, 0xa5, 0xf9, 0xdc, 0x0c, 0xab, 0x71, 0x5c,
+	0x16, 0x7d, 0x0c, 0xf9, 0xf0, 0x51, 0x31, 0xdc, 0x61, 0x2f, 0x7f, 0x83, 0x9c, 0xc0, 0xf5, 0x4f,
+	0x01, 0x7e, 0x48, 0x1d, 0xaf, 0x47, 0x0f, 0x88, 0x27, 0x1e, 0xc9, 0x78, 0xa9, 0x47, 0x42, 0x2f,
+	0xaa, 0x96, 0xa8, 0x64, 0xe5, 0x14, 0x44, 0x6f, 0x45, 0xb2, 0xa9, 0xff, 0x6d, 0x12, 0xb2, 0x98,
+	0x52, 0x56, 0xab, 0xa0, 0x75, 0xc8, 0xaa, 0x7d, 0x42, 0x9c, 0x3f, 0xd5, 0xfc, 0xd9, 0xe9, 0x5a,
+	0x46, 0x6e, 0x10, 0x19, 0x4b, 0xec, 0x0c, 0xb1, 0x1d, 0x3c, 0x79, 0xd1, 0x0e, 0x8e, 0xee, 0x40,
+	0x51, 0x81, 0x8c, 0x7d, 0x33, 0xd8, 0x97, 0x05, 0x5a, 0x75, 0xf1, 0xec, 0x74, 0x0d, 0x24, 0x72,
+	0xd3, 0x0c, 0xf6, 0x31, 0x48, 0x34, 0xff, 0x46, 0x0d, 0x28, 0x7c, 0x49, 0x1d, 0xcf, 0x60, 0x62,
+	0x10, 0xea, 0xae, 0x6c, 0xe6, 0x3c, 0x4e, 0x86, 0xaa, 0x5e, 0x8c, 0xe1, 0xcb, 0xc9, 0xe0, 0x1b,
+	0xb0, 0xe0, 0x53, 0xca, 0xe4, 0xb6, 0xe5, 0x50, 0x4f, 0x95, 0xe1, 0xeb, 0x33, 0x6f, 0x67, 0x29,
+	0x65, 0x58, 0xe1, 0x70, 0xd1, 0x8f, 0xb5, 0xd0, 0x1d, 0x58, 0x76, 0xcd, 0x80, 0x19, 0x62, 0xbf,
+	0xb3, 0x27, 0xda, 0xb2, 0x62, 0xa9, 0x21, 0xce, 0xdb, 0x10, 0xac, 0x50, 0x42, 0xff, 0xe7, 0x04,
+	0x14, 0xf8, 0x60, 0x9c, 0x3d, 0xc7, 0xe2, 0x49, 0xde, 0xb7, 0xcf, 0x3d, 0x6e, 0x42, 0xca, 0x0a,
+	0x7c, 0xe5, 0x54, 0x71, 0xf8, 0xd6, 0xba, 0x18, 0x73, 0x1a, 0xfa, 0x1c, 0xb2, 0xea, 0x3a, 0x40,
+	0xa6, 0x1d, 0xfa, 0xd5, 0xe9, 0xa8, 0xf2, 0x8d, 0x92, 0x13, 0xb1, 0x3c, 0xb1, 0x4e, 0x1e, 0x02,
+	0x38, 0x4e, 0x42, 0x37, 0x20, 0x69, 0x49, 0x77, 0xa9, 0x9f, 0x24, 0xd4, 0x5a, 0x38, 0x69, 0x79,
+	0xfa, 0x3f, 0x24, 0x60, 0x61, 0xb2, 0xe0, 0x79, 0x04, 0xdc, 0x82, 0x7c, 0x30, 0xda, 0x0d, 0xc6,
+	0x01, 0x23, 0x83, 0xf0, 0x01, 0x30, 0x22, 0xa0, 0x26, 0xe4, 0x4d, 0xb7, 0x4f, 0x7d, 0x87, 0xed,
+	0x0f, 0x54, 0x25, 0x3a, 0x3b, 0x55, 0x88, 0xeb, 0x2c, 0x57, 0x42, 0x11, 0x3c, 0x91, 0x0e, 0xcf,
+	0x7d, 0xf9, 0x4a, 0x2c, 0xce, 0xfd, 0xd7, 0xa0, 0xe8, 0x9a, 0x03, 0x71, 0x3f, 0xc2, 0x9c, 0x81,
+	0x1c, 0x47, 0x1a, 0x17, 0x14, 0xad, 0xe7, 0x0c, 0x88, 0xae, 0x43, 0x3e, 0x52, 0x86, 0x96, 0xa0,
+	0x50, 0x69, 0x74, 0x8d, 0xbb, 0xf7, 0x1e, 0x18, 0x0f, 0x6b, 0xdb, 0xda, 0x9c, 0xca, 0x4d, 0xff,
+	0x32, 0x01, 0x0b, 0x6a, 0x3b, 0x52, 0xf9, 0xfe, 0xeb, 0x30, 0xef, 0x9b, 0x7b, 0x2c, 0xac, 0x48,
+	0xd2, 0x32, 0xaa, 0xf9, 0x0e, 0xcf, 0x2b, 0x12, 0xce, 0x9a, 0x5d, 0x91, 0xc4, 0x9e, 0xa4, 0x53,
+	0x97, 0x3e, 0x49, 0xa7, 0x7f, 0x2e, 0x4f, 0xd2, 0xfa, 0x6f, 0x02, 0x6c, 0x38, 0x2e, 0xe9, 0xc9,
+	0x5b, 0x9a, 0x59, 0xf5, 0x25, 0xcf, 0xe1, 0xd4, 0x55, 0x5d, 0x98, 0xc3, 0x35, 0xeb, 0x98, 0xd3,
+	0x38, 0xab, 0xef, 0xd8, 0x6a, 0x31, 0x0a, 0xd6, 0x43, 0xce, 0xea, 0x3b, 0x76, 0xf4, 0x08, 0x93,
+	0xbe, 0xea, 0x11, 0xe6, 0x24, 0x01, 0x4b, 0x2a, 0x77, 0x8d, 0xb6, 0xdf, 0xb7, 0x21, 0x2f, 0xd3,
+	0xd8, 0x49, 0x41, 0x27, 0x9e, 0x61, 0x25, 0xae, 0x59, 0xc7, 0x39, 0xc9, 0x6e, 0xda, 0x68, 0x0d,
+	0x0a, 0x0a, 0x1a, 0xfb, 0xf9, 0x0a, 0x48, 0x52, 0x8b, 0x9b, 0xff, 0x3e, 0xa4, 0xf7, 0x1c, 0x97,
+	0xa8, 0x40, 0x9f, 0xb9, 0x01, 0x4c, 0x1c, 0xb0, 0x39, 0x87, 0x05, 0xba, 0x9a, 0x0b, 0xaf, 0xb1,
+	0x84, 0x7d, 0xaa, 0xec, 0x8c, 0xdb, 0x27, 0x2b, 0xd0, 0x73, 0xf6, 0x49, 0x1c, 0xb7, 0x4f, 0xb2,
+	0xa5, 0x7d, 0x0a, 0x1a, 0xb7, 0x4f, 0x92, 0x7e, 0x2e, 0xf6, 0x6d, 0xc1, 0x8d, 0xaa, 0x6b, 0x5a,
+	0x07, 0xae, 0x13, 0x30, 0x62, 0xc7, 0x77, 0x8c, 0x7b, 0x90, 0x9d, 0x4a, 0x3a, 0x2f, 0xbb, 0xd5,
+	0x54, 0x48, 0xfd, 0x3f, 0x12, 0x50, 0xdc, 0x24, 0xa6, 0xcb, 0xf6, 0x27, 0x57, 0x43, 0x8c, 0x04,
+	0x4c, 0x1d, 0x56, 0xe2, 0x1b, 0x7d, 0x00, 0xb9, 0x28, 0x27, 0xb9, 0xf2, 0x79, 0x29, 0x82, 0xa2,
+	0xfb, 0x30, 0xcf, 0xd7, 0x18, 0x1d, 0x85, 0xc5, 0xce, 0x65, 0x2f, 0x17, 0x0a, 0xc9, 0x0f, 0x19,
+	0x9f, 0x88, 0x24, 0x44, 0x84, 0x52, 0x06, 0x87, 0x4d, 0xf4, 0x8b, 0x50, 0x14, 0x17, 0xef, 0x61,
+	0xce, 0x95, 0xb9, 0x4a, 0x67, 0x41, 0xbe, 0x9d, 0xc9, 0x7c, 0xeb, 0xff, 0x12, 0xb0, 0xbc, 0x6d,
+	0x8e, 0x77, 0x89, 0xda, 0x36, 0x88, 0x8d, 0x89, 0x45, 0x7d, 0x1b, 0x75, 0xe2, 0xdb, 0xcd, 0x25,
+	0x4f, 0x71, 0xb3, 0x84, 0x67, 0xef, 0x3a, 0x61, 0x01, 0x96, 0x8c, 0x15, 0x60, 0xcb, 0x90, 0xf1,
+	0xa8, 0x67, 0x11, 0xb5, 0x17, 0xc9, 0x86, 0xee, 0xc4, 0xb7, 0x9a, 0x52, 0xf4, 0x4a, 0x26, 0xde,
+	0xb8, 0x5a, 0x94, 0x45, 0xbd, 0xa1, 0xcf, 0xa1, 0xd4, 0x6d, 0xd4, 0x70, 0xa3, 0x57, 0x6d, 0xff,
+	0xc8, 0xe8, 0x56, 0xb6, 0xba, 0x95, 0x7b, 0x77, 0x8c, 0x4e, 0x7b, 0xeb, 0x8b, 0xbb, 0xf7, 0xef,
+	0x7c, 0xa0, 0x25, 0x4a, 0xeb, 0xc7, 0x27, 0xeb, 0xb7, 0x5a, 0x95, 0xda, 0x96, 0x5c, 0x31, 0xbb,
+	0xf4, 0x69, 0xd7, 0x74, 0x03, 0xf3, 0xde, 0x9d, 0x0e, 0x75, 0xc7, 0x1c, 0xc3, 0xc3, 0xba, 0x18,
+	0x3f, 0xaf, 0xe2, 0xc7, 0x70, 0xe2, 0xc2, 0x63, 0x78, 0x72, 0x9a, 0x27, 0x2f, 0x38, 0xcd, 0x37,
+	0x60, 0xd9, 0xf2, 0x69, 0x10, 0x18, 0x3c, 0xfb, 0x27, 0xf6, 0xb9, 0xfa, 0xe2, 0xa5, 0xb3, 0xd3,
+	0xb5, 0x6b, 0x35, 0xce, 0xef, 0x0a, 0xb6, 0x52, 0x7f, 0xcd, 0x8a, 0x91, 0x44, 0x4f, 0xfa, 0x1f,
+	0xa5, 0x78, 0x22, 0xe5, 0x1c, 0x3a, 0x2e, 0xe9, 0x93, 0x00, 0x3d, 0x86, 0x25, 0xcb, 0x27, 0x36,
+	0x4f, 0xeb, 0x4d, 0xd7, 0x08, 0x86, 0xc4, 0x52, 0x41, 0xfd, 0x0b, 0x33, 0x73, 0x9a, 0x48, 0xb0,
+	0x5c, 0x8b, 0xa4, 0xba, 0x43, 0x62, 0xe1, 0x45, 0x6b, 0xaa, 0x8d, 0xbe, 0x84, 0xa5, 0x80, 0xb8,
+	0x8e, 0x37, 0x7a, 0x6a, 0x58, 0xd4, 0x63, 0xe4, 0x69, 0xf8, 0xe0, 0x73, 0x95, 0xde, 0x6e, 0x63,
+	0x8b, 0x4b, 0xd5, 0xa4, 0x50, 0x15, 0x9d, 0x9d, 0xae, 0x2d, 0x4e, 0xd3, 0xf0, 0xa2, 0xd2, 0xac,
+	0xda, 0xa5, 0x16, 0x2c, 0x4e, 0x5b, 0x83, 0x96, 0xd5, 0xda, 0x17, 0x5b, 0x48, 0xb8, 0xb6, 0xd1,
+	0x2d, 0xc8, 0xf9, 0xa4, 0xef, 0x04, 0xcc, 0x97, 0x6e, 0xe6, 0x9c, 0x88, 0xc2, 0x57, 0xbe, 0xfc,
+	0x0d, 0x4b, 0xe9, 0xd7, 0xe1, 0x5c, 0x8f, 0x7c, 0xb1, 0xd8, 0x4e, 0x60, 0xee, 0x2a, 0x95, 0x39,
+	0x1c, 0x36, 0x79, 0x0c, 0x8e, 0x82, 0x28, 0x51, 0x13, 0xdf, 0x9c, 0x26, 0x32, 0x0a, 0xf5, 0x8b,
+	0x1e, 0x91, 0x33, 0x84, 0x3f, 0x0d, 0x4c, 0xc7, 0x7e, 0x1a, 0xb8, 0x0c, 0x19, 0x97, 0x1c, 0x12,
+	0x57, 0x9e, 0xe5, 0x58, 0x36, 0xde, 0xf9, 0x69, 0x0a, 0xf2, 0xd1, 0xe3, 0x06, 0x3f, 0x09, 0x5a,
+	0x8d, 0x27, 0x61, 0xac, 0x46, 0xf4, 0x16, 0x39, 0x42, 0xaf, 0x4d, 0xee, 0x94, 0x3e, 0x97, 0xaf,
+	0xb9, 0x11, 0x3b, 0xbc, 0x4f, 0x7a, 0x03, 0x72, 0x95, 0x6e, 0xb7, 0xf9, 0xb0, 0xd5, 0xa8, 0x6b,
+	0x5f, 0x25, 0x4a, 0x2f, 0x1d, 0x9f, 0xac, 0x5f, 0x8b, 0x40, 0x95, 0x40, 0x86, 0x92, 0x40, 0xd5,
+	0x6a, 0x8d, 0x4e, 0xaf, 0x51, 0xd7, 0x9e, 0x25, 0xcf, 0xa3, 0xc4, 0x1d, 0x89, 0xf8, 0x4d, 0x46,
+	0xbe, 0x83, 0x1b, 0x9d, 0x0a, 0xe6, 0x1d, 0x7e, 0x95, 0x94, 0x57, 0x5d, 0x93, 0x1e, 0x7d, 0x32,
+	0x34, 0x7d, 0xde, 0xe7, 0x6a, 0xf8, 0xdb, 0xa4, 0x67, 0x29, 0xf9, 0x6e, 0x3f, 0x79, 0xa9, 0x21,
+	0xa6, 0x3d, 0xe6, 0xbd, 0x89, 0x27, 0x32, 0xa1, 0x26, 0x75, 0xae, 0xb7, 0x2e, 0xdf, 0x49, 0xb8,
+	0x16, 0x1d, 0xe6, 0xf1, 0x4e, 0xab, 0xc5, 0x41, 0xcf, 0xd2, 0xe7, 0x46, 0x87, 0x47, 0x1e, 0xaf,
+	0x7f, 0xd1, 0x6d, 0xc8, 0x85, 0x2f, 0x68, 0xda, 0x57, 0xe9, 0x73, 0x06, 0xd5, 0xc2, 0xe7, 0x3f,
+	0xd1, 0xe1, 0xe6, 0x4e, 0x4f, 0xfc, 0x74, 0xea, 0x59, 0xe6, 0x7c, 0x87, 0xfb, 0x23, 0x66, 0xd3,
+	0x23, 0x8f, 0xaf, 0x40, 0x75, 0xab, 0xf6, 0x55, 0x46, 0x5e, 0x41, 0x44, 0x18, 0x75, 0xa5, 0xf6,
+	0x06, 0xe4, 0x70, 0xe3, 0x87, 0xf2, 0x57, 0x56, 0xcf, 0xb2, 0xe7, 0xf4, 0x60, 0xf2, 0x25, 0xb1,
+	0x54, 0x6f, 0x6d, 0xdc, 0xd9, 0xac, 0x08, 0x97, 0x9f, 0x47, 0xb5, 0xfd, 0xe1, 0xbe, 0xe9, 0x11,
+	0x7b, 0xf2, 0xe3, 0x85, 0x88, 0xf5, 0xce, 0x2f, 0x43, 0x2e, 0xcc, 0x33, 0xd1, 0x2a, 0x64, 0x9f,
+	0xb4, 0xf1, 0xa3, 0x06, 0xd6, 0xe6, 0xa4, 0x0f, 0x43, 0xce, 0x13, 0x59, 0x21, 0xac, 0xc3, 0xfc,
+	0x76, 0xa5, 0x55, 0x79, 0xd8, 0xc0, 0xe1, 0x85, 0x77, 0x08, 0x50, 0xc9, 0x52, 0x49, 0x53, 0x1d,
+	0x44, 0x3a, 0xab, 0x2b, 0x5f, 0x7f, 0xb3, 0x3a, 0xf7, 0x93, 0x6f, 0x56, 0xe7, 0x9e, 0x9d, 0xad,
+	0x26, 0xbe, 0x3e, 0x5b, 0x4d, 0xfc, 0xf8, 0x6c, 0x35, 0xf1, 0xef, 0x67, 0xab, 0x89, 0xdd, 0xac,
+	0xd8, 0xd2, 0xef, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xa9, 0x00, 0x24, 0x61, 0xb9, 0x2d,
+	0x00, 0x00,
 }

+ 5 - 0
vendor/github.com/docker/swarmkit/api/types.proto

@@ -771,6 +771,11 @@ message Placement {
 	// such as topology. They are provided in order from highest to lowest
 	// precedence.
 	repeated PlacementPreference preferences = 2;
+
+	// Platforms stores all the platforms that the image can run on.
+	// This field is used in the platform filter for scheduling. If empty,
+	// then the platform filter is off, meaning there are no scheduling restrictions.
+	repeated Platform platforms = 3;
 }
 
 // JoinToken contains the join tokens for workers and managers.

文件差異過大導致無法顯示
+ 139 - 139
vendor/github.com/docker/swarmkit/api/watch.pb.go


+ 2 - 2
vendor/github.com/docker/swarmkit/api/store.proto → vendor/github.com/docker/swarmkit/api/watch.proto

@@ -69,8 +69,8 @@ message SelectBy {
 }
 
 
-// Store defines the RPC methods for interacting with the data store.
-service Store {
+// Watch defines the RPC methods for monitoring data store change.
+service Watch {
 	// Watch starts a stream that returns any changes to objects that match
 	// the specified selectors. When the stream begins, it immediately sends
 	// an empty message back to the client. It is important to wait for

+ 23 - 6
vendor/github.com/docker/swarmkit/ca/certificates.go

@@ -258,6 +258,13 @@ func (rca *RootCA) RequestAndSaveNewCertificates(ctx context.Context, kw KeyWrit
 		// the local connection will not be returned by the connection
 		// broker anymore.
 		config.ForceRemote = true
+
+		// Wait a moment, in case a leader election was taking place.
+		select {
+		case <-time.After(config.RetryInterval):
+		case <-ctx.Done():
+			return nil, nil, ctx.Err()
+		}
 	}
 	if err != nil {
 		return nil, nil, err
@@ -286,10 +293,19 @@ func (rca *RootCA) RequestAndSaveNewCertificates(ctx context.Context, kw KeyWrit
 	var kekUpdate *KEKData
 	for i := 0; i < 5; i++ {
 		// ValidateCertChain will always return at least 1 cert, so indexing at 0 is safe
-		kekUpdate, err = rca.getKEKUpdate(ctx, leafCert, tlsKeyPair, config.ConnBroker)
+		kekUpdate, err = rca.getKEKUpdate(ctx, leafCert, tlsKeyPair, config)
 		if err == nil {
 			break
 		}
+
+		config.ForceRemote = true
+
+		// Wait a moment, in case a leader election was taking place.
+		select {
+		case <-time.After(config.RetryInterval):
+		case <-ctx.Done():
+			return nil, nil, ctx.Err()
+		}
 	}
 	if err != nil {
 		return nil, nil, err
@@ -305,7 +321,7 @@ func (rca *RootCA) RequestAndSaveNewCertificates(ctx context.Context, kw KeyWrit
 	}, nil
 }
 
-func (rca *RootCA) getKEKUpdate(ctx context.Context, leafCert *x509.Certificate, keypair tls.Certificate, connBroker *connectionbroker.Broker) (*KEKData, error) {
+func (rca *RootCA) getKEKUpdate(ctx context.Context, leafCert *x509.Certificate, keypair tls.Certificate, config CertificateRequestConfig) (*KEKData, error) {
 	var managerRole bool
 	for _, ou := range leafCert.Subject.OrganizationalUnit {
 		if ou == ManagerRole {
@@ -316,7 +332,7 @@ func (rca *RootCA) getKEKUpdate(ctx context.Context, leafCert *x509.Certificate,
 
 	if managerRole {
 		mtlsCreds := credentials.NewTLS(&tls.Config{ServerName: CARole, RootCAs: rca.Pool, Certificates: []tls.Certificate{keypair}})
-		conn, err := getGRPCConnection(mtlsCreds, connBroker, false)
+		conn, err := getGRPCConnection(mtlsCreds, config.ConnBroker, config.ForceRemote)
 		if err != nil {
 			return nil, err
 		}
@@ -386,16 +402,17 @@ func (rca *RootCA) CrossSignCACertificate(otherCAPEM []byte) ([]byte, error) {
 	}
 
 	// create a new cert with exactly the same parameters, including the public key and exact NotBefore and NotAfter
-	newCert, err := helpers.ParseCertificatePEM(otherCAPEM)
+	template, err := helpers.ParseCertificatePEM(otherCAPEM)
 	if err != nil {
 		return nil, errors.New("could not parse new CA certificate")
 	}
 
-	if !newCert.IsCA {
+	if !template.IsCA {
 		return nil, errors.New("certificate not a CA")
 	}
 
-	derBytes, err := x509.CreateCertificate(cryptorand.Reader, newCert, signer.parsedCert, newCert.PublicKey, signer.cryptoSigner)
+	template.SignatureAlgorithm = signer.parsedCert.SignatureAlgorithm // make sure we can sign with the signer key
+	derBytes, err := x509.CreateCertificate(cryptorand.Reader, template, signer.parsedCert, template.PublicKey, signer.cryptoSigner)
 	if err != nil {
 		return nil, errors.Wrap(err, "could not cross-sign new CA certificate using old CA material")
 	}

+ 16 - 1
vendor/github.com/docker/swarmkit/ca/config.go

@@ -50,6 +50,12 @@ const (
 	base36DigestLen = 50
 )
 
+var (
+	// GetCertRetryInterval is how long to wait before retrying a node
+	// certificate or root certificate request.
+	GetCertRetryInterval = 2 * time.Second
+)
+
 // SecurityConfig is used to represent a node's security configuration. It includes information about
 // the RootCA and ServerTLSCreds/ClientTLSCreds transport authenticators to be used for MTLS
 type SecurityConfig struct {
@@ -307,6 +313,12 @@ func DownloadRootCA(ctx context.Context, paths CertPaths, token string, connBrok
 			break
 		}
 		log.G(ctx).WithError(err).Errorf("failed to retrieve remote root CA certificate")
+
+		select {
+		case <-time.After(GetCertRetryInterval):
+		case <-ctx.Done():
+			return RootCA{}, ctx.Err()
+		}
 	}
 	if err != nil {
 		return RootCA{}, err
@@ -385,6 +397,8 @@ type CertificateRequestConfig struct {
 	// NodeCertificateStatusRequestTimeout determines how long to wait for a node
 	// status RPC result.  If not provided (zero value), will default to 5 seconds.
 	NodeCertificateStatusRequestTimeout time.Duration
+	// RetryInterval specifies how long to delay between retries, if non-zero.
+	RetryInterval time.Duration
 }
 
 // CreateSecurityConfig creates a new key and cert for this node, either locally
@@ -400,11 +414,12 @@ func (rootCA RootCA) CreateSecurityConfig(ctx context.Context, krw *KeyReadWrite
 	tlsKeyPair, issuerInfo, err := rootCA.IssueAndSaveNewCertificates(krw, cn, proposedRole, org)
 	switch errors.Cause(err) {
 	case ErrNoValidSigner:
+		config.RetryInterval = GetCertRetryInterval
 		// Request certificate issuance from a remote CA.
 		// Last argument is nil because at this point we don't have any valid TLS creds
 		tlsKeyPair, issuerInfo, err = rootCA.RequestAndSaveNewCertificates(ctx, krw, config)
 		if err != nil {
-			log.G(ctx).WithError(err).Error("failed to request save new certificate")
+			log.G(ctx).WithError(err).Error("failed to request and save new certificate")
 			return nil, err
 		}
 	case nil:

+ 1 - 19
vendor/github.com/docker/swarmkit/manager/allocator/network.go

@@ -562,25 +562,7 @@ func taskUpdateEndpoint(t *api.Task, endpoint *api.Endpoint) {
 
 // IsIngressNetworkNeeded checks whether the service requires the routing-mesh
 func IsIngressNetworkNeeded(s *api.Service) bool {
-	if s == nil {
-		return false
-	}
-
-	if s.Spec.Endpoint == nil {
-		return false
-	}
-
-	for _, p := range s.Spec.Endpoint.Ports {
-		// The service to which this task belongs is trying to
-		// expose ports with PublishMode as Ingress to the
-		// external world. Automatically attach the task to
-		// the ingress network.
-		if p.PublishMode == api.PublishModeIngress {
-			return true
-		}
-	}
-
-	return false
+	return networkallocator.IsIngressNetworkNeeded(s)
 }
 
 func (a *Allocator) taskCreateNetworkAttachments(t *api.Task, s *api.Service) {

+ 29 - 8
vendor/github.com/docker/swarmkit/manager/allocator/networkallocator/networkallocator.go

@@ -191,7 +191,7 @@ func (na *NetworkAllocator) ServiceAllocate(s *api.Service) (err error) {
 
 vipLoop:
 	for _, eAttach := range s.Endpoint.VirtualIPs {
-		if na.IsVIPOnIngressNetwork(eAttach) {
+		if na.IsVIPOnIngressNetwork(eAttach) && IsIngressNetworkNeeded(s) {
 			if err = na.allocateVIP(eAttach); err != nil {
 				return err
 			}
@@ -362,7 +362,7 @@ func (na *NetworkAllocator) ServiceNeedsAllocation(s *api.Service, flags ...func
 	if s.Endpoint != nil {
 	vipLoop:
 		for _, vip := range s.Endpoint.VirtualIPs {
-			if na.IsVIPOnIngressNetwork(vip) {
+			if na.IsVIPOnIngressNetwork(vip) && IsIngressNetworkNeeded(s) {
 				continue vipLoop
 			}
 			for _, net := range specNetworks {
@@ -802,17 +802,15 @@ func (na *NetworkAllocator) allocatePools(n *api.Network) (map[string]string, er
 
 	pools := make(map[string]string)
 
-	if n.Spec.IPAM == nil {
-		n.Spec.IPAM = &api.IPAMOptions{}
-	}
-
-	ipamConfigs := make([]*api.IPAMConfig, len(n.Spec.IPAM.Configs))
-	copy(ipamConfigs, n.Spec.IPAM.Configs)
+	var ipamConfigs []*api.IPAMConfig
 
 	// If there is non-nil IPAM state always prefer those subnet
 	// configs over Spec configs.
 	if n.IPAM != nil {
 		ipamConfigs = n.IPAM.Configs
+	} else if n.Spec.IPAM != nil {
+		ipamConfigs = make([]*api.IPAMConfig, len(n.Spec.IPAM.Configs))
+		copy(ipamConfigs, n.Spec.IPAM.Configs)
 	}
 
 	// Append an empty slot for subnet allocation if there are no
@@ -913,3 +911,26 @@ func IsIngressNetwork(nw *api.Network) bool {
 	_, ok := nw.Spec.Annotations.Labels["com.docker.swarm.internal"]
 	return ok && nw.Spec.Annotations.Name == "ingress"
 }
+
+// IsIngressNetworkNeeded checks whether the service requires the routing-mesh
+func IsIngressNetworkNeeded(s *api.Service) bool {
+	if s == nil {
+		return false
+	}
+
+	if s.Spec.Endpoint == nil {
+		return false
+	}
+
+	for _, p := range s.Spec.Endpoint.Ports {
+		// The service to which this task belongs is trying to
+		// expose ports with PublishMode as Ingress to the
+		// external world. Automatically attach the task to
+		// the ingress network.
+		if p.PublishMode == api.PublishModeIngress {
+			return true
+		}
+	}
+
+	return false
+}

+ 5 - 6
vendor/github.com/docker/swarmkit/manager/manager.go

@@ -36,7 +36,7 @@ import (
 	"github.com/docker/swarmkit/manager/scheduler"
 	"github.com/docker/swarmkit/manager/state/raft"
 	"github.com/docker/swarmkit/manager/state/store"
-	"github.com/docker/swarmkit/manager/storeapi"
+	"github.com/docker/swarmkit/manager/watchapi"
 	"github.com/docker/swarmkit/remotes"
 	"github.com/docker/swarmkit/xnet"
 	gogotypes "github.com/gogo/protobuf/types"
@@ -394,13 +394,13 @@ func (m *Manager) Run(parent context.Context) error {
 	}
 
 	baseControlAPI := controlapi.NewServer(m.raftNode.MemoryStore(), m.raftNode, m.config.SecurityConfig, m.caserver, m.config.PluginGetter)
-	baseStoreAPI := storeapi.NewServer(m.raftNode.MemoryStore())
+	baseWatchAPI := watchapi.NewServer(m.raftNode.MemoryStore())
 	baseResourceAPI := resourceapi.New(m.raftNode.MemoryStore())
 	healthServer := health.NewHealthServer()
 	localHealthServer := health.NewHealthServer()
 
 	authenticatedControlAPI := api.NewAuthenticatedWrapperControlServer(baseControlAPI, authorize)
-	authenticatedStoreAPI := api.NewAuthenticatedWrapperStoreServer(baseStoreAPI, authorize)
+	authenticatedWatchAPI := api.NewAuthenticatedWrapperWatchServer(baseWatchAPI, authorize)
 	authenticatedResourceAPI := api.NewAuthenticatedWrapperResourceAllocatorServer(baseResourceAPI, authorize)
 	authenticatedLogsServerAPI := api.NewAuthenticatedWrapperLogsServer(m.logbroker, authorize)
 	authenticatedLogBrokerAPI := api.NewAuthenticatedWrapperLogBrokerServer(m.logbroker, authorize)
@@ -450,7 +450,6 @@ func (m *Manager) Run(parent context.Context) error {
 		return context.WithValue(ctx, ca.LocalRequestKey, nodeInfo), nil
 	}
 	localProxyControlAPI := api.NewRaftProxyControlServer(baseControlAPI, m.raftNode, handleRequestLocally, forwardAsOwnRequest)
-	localProxyStoreAPI := api.NewRaftProxyStoreServer(baseStoreAPI, m.raftNode, handleRequestLocally, forwardAsOwnRequest)
 	localProxyLogsAPI := api.NewRaftProxyLogsServer(m.logbroker, m.raftNode, handleRequestLocally, forwardAsOwnRequest)
 	localProxyDispatcherAPI := api.NewRaftProxyDispatcherServer(m.dispatcher, m.raftNode, handleRequestLocally, forwardAsOwnRequest)
 	localProxyCAAPI := api.NewRaftProxyCAServer(m.caserver, m.raftNode, handleRequestLocally, forwardAsOwnRequest)
@@ -466,7 +465,7 @@ func (m *Manager) Run(parent context.Context) error {
 	api.RegisterHealthServer(m.server, authenticatedHealthAPI)
 	api.RegisterRaftMembershipServer(m.server, proxyRaftMembershipAPI)
 	api.RegisterControlServer(m.server, authenticatedControlAPI)
-	api.RegisterStoreServer(m.server, authenticatedStoreAPI)
+	api.RegisterWatchServer(m.server, authenticatedWatchAPI)
 	api.RegisterLogsServer(m.server, authenticatedLogsServerAPI)
 	api.RegisterLogBrokerServer(m.server, proxyLogBrokerAPI)
 	api.RegisterResourceAllocatorServer(m.server, proxyResourceAPI)
@@ -474,7 +473,7 @@ func (m *Manager) Run(parent context.Context) error {
 	grpc_prometheus.Register(m.server)
 
 	api.RegisterControlServer(m.localserver, localProxyControlAPI)
-	api.RegisterStoreServer(m.localserver, localProxyStoreAPI)
+	api.RegisterWatchServer(m.localserver, baseWatchAPI)
 	api.RegisterLogsServer(m.localserver, localProxyLogsAPI)
 	api.RegisterHealthServer(m.localserver, localHealthServer)
 	api.RegisterDispatcherServer(m.localserver, localProxyDispatcherAPI)

+ 43 - 0
vendor/github.com/docker/swarmkit/manager/scheduler/filter.go

@@ -217,3 +217,46 @@ func (f *ConstraintFilter) Explain(nodes int) string {
 	}
 	return fmt.Sprintf("scheduling constraints not satisfied on %d nodes", nodes)
 }
+
+// PlatformFilter selects only nodes that run the required platform.
+type PlatformFilter struct {
+	supportedPlatforms []*api.Platform
+}
+
+// SetTask returns true when the filter is enabled for a given task.
+func (f *PlatformFilter) SetTask(t *api.Task) bool {
+	placement := t.Spec.Placement
+	if placement != nil {
+		// copy the platform information
+		f.supportedPlatforms = placement.Platforms
+		if len(placement.Platforms) > 0 {
+			return true
+		}
+	}
+	return false
+}
+
+// Check returns true if the task can be scheduled into the given node.
+func (f *PlatformFilter) Check(n *NodeInfo) bool {
+	// if the supportedPlatforms field is empty, then either it wasn't
+	// provided or there are no constraints
+	if len(f.supportedPlatforms) == 0 {
+		return true
+	}
+	// check if the platform for the node is supported
+	nodePlatform := n.Description.Platform
+	for _, p := range f.supportedPlatforms {
+		if (p.Architecture == "" || p.Architecture == nodePlatform.Architecture) && (p.OS == "" || p.OS == nodePlatform.OS) {
+			return true
+		}
+	}
+	return false
+}
+
+// Explain returns an explanation of a failure.
+func (f *PlatformFilter) Explain(nodes int) string {
+	if nodes == 1 {
+		return "unsupported platform on 1 node"
+	}
+	return fmt.Sprintf("unsupported platform on %d nodes", nodes)
+}

+ 1 - 0
vendor/github.com/docker/swarmkit/manager/scheduler/pipeline.go

@@ -13,6 +13,7 @@ var (
 		&ResourceFilter{},
 		&PluginFilter{},
 		&ConstraintFilter{},
+		&PlatformFilter{},
 	}
 )
 

+ 31 - 22
vendor/github.com/docker/swarmkit/manager/scheduler/scheduler.go

@@ -125,15 +125,15 @@ func (s *Scheduler) Run(ctx context.Context) error {
 		commitDebounceTimeout <-chan time.Time
 	)
 
-	pendingChanges := 0
+	tickRequired := false
 
 	schedule := func() {
 		if len(s.preassignedTasks) > 0 {
 			s.processPreassignedTasks(ctx)
 		}
-		if pendingChanges > 0 {
+		if tickRequired {
 			s.tick(ctx)
-			pendingChanges = 0
+			tickRequired = false
 		}
 	}
 
@@ -143,17 +143,24 @@ func (s *Scheduler) Run(ctx context.Context) error {
 		case event := <-updates:
 			switch v := event.(type) {
 			case api.EventCreateTask:
-				pendingChanges += s.createTask(ctx, v.Task)
+				if s.createTask(ctx, v.Task) {
+					tickRequired = true
+				}
 			case api.EventUpdateTask:
-				pendingChanges += s.updateTask(ctx, v.Task)
+				if s.updateTask(ctx, v.Task) {
+					tickRequired = true
+				}
 			case api.EventDeleteTask:
-				s.deleteTask(ctx, v.Task)
+				if s.deleteTask(ctx, v.Task) {
+					// deleting tasks may free up node resource, pending tasks should be re-evaluated.
+					tickRequired = true
+				}
 			case api.EventCreateNode:
 				s.createOrUpdateNode(v.Node)
-				pendingChanges++
+				tickRequired = true
 			case api.EventUpdateNode:
 				s.createOrUpdateNode(v.Node)
-				pendingChanges++
+				tickRequired = true
 			case api.EventDeleteNode:
 				s.nodeSet.remove(v.Node.ID)
 			case state.EventCommit:
@@ -193,24 +200,24 @@ func (s *Scheduler) enqueue(t *api.Task) {
 	s.unassignedTasks[t.ID] = t
 }
 
-func (s *Scheduler) createTask(ctx context.Context, t *api.Task) int {
+func (s *Scheduler) createTask(ctx context.Context, t *api.Task) bool {
 	// Ignore all tasks that have not reached PENDING
 	// state, and tasks that no longer consume resources.
 	if t.Status.State < api.TaskStatePending || t.Status.State > api.TaskStateRunning {
-		return 0
+		return false
 	}
 
 	s.allTasks[t.ID] = t
 	if t.NodeID == "" {
 		// unassigned task
 		s.enqueue(t)
-		return 1
+		return true
 	}
 
 	if t.Status.State == api.TaskStatePending {
 		s.preassignedTasks[t.ID] = t
 		// preassigned tasks do not contribute to running tasks count
-		return 0
+		return false
 	}
 
 	nodeInfo, err := s.nodeSet.nodeInfo(t.NodeID)
@@ -218,23 +225,23 @@ func (s *Scheduler) createTask(ctx context.Context, t *api.Task) int {
 		s.nodeSet.updateNode(nodeInfo)
 	}
 
-	return 0
+	return false
 }
 
-func (s *Scheduler) updateTask(ctx context.Context, t *api.Task) int {
+func (s *Scheduler) updateTask(ctx context.Context, t *api.Task) bool {
 	// Ignore all tasks that have not reached PENDING
 	// state.
 	if t.Status.State < api.TaskStatePending {
-		return 0
+		return false
 	}
 
 	oldTask := s.allTasks[t.ID]
 
-	// Ignore all tasks that have not reached ALLOCATED
+	// Ignore all tasks that have not reached Pending
 	// state, and tasks that no longer consume resources.
 	if t.Status.State > api.TaskStateRunning {
 		if oldTask == nil {
-			return 1
+			return false
 		}
 		s.deleteTask(ctx, oldTask)
 		if t.Status.State != oldTask.Status.State &&
@@ -245,7 +252,7 @@ func (s *Scheduler) updateTask(ctx context.Context, t *api.Task) int {
 				s.nodeSet.updateNode(nodeInfo)
 			}
 		}
-		return 1
+		return true
 	}
 
 	if t.NodeID == "" {
@@ -255,7 +262,7 @@ func (s *Scheduler) updateTask(ctx context.Context, t *api.Task) int {
 		}
 		s.allTasks[t.ID] = t
 		s.enqueue(t)
-		return 1
+		return true
 	}
 
 	if t.Status.State == api.TaskStatePending {
@@ -265,7 +272,7 @@ func (s *Scheduler) updateTask(ctx context.Context, t *api.Task) int {
 		s.allTasks[t.ID] = t
 		s.preassignedTasks[t.ID] = t
 		// preassigned tasks do not contribute to running tasks count
-		return 0
+		return false
 	}
 
 	s.allTasks[t.ID] = t
@@ -274,16 +281,18 @@ func (s *Scheduler) updateTask(ctx context.Context, t *api.Task) int {
 		s.nodeSet.updateNode(nodeInfo)
 	}
 
-	return 0
+	return false
 }
 
-func (s *Scheduler) deleteTask(ctx context.Context, t *api.Task) {
+func (s *Scheduler) deleteTask(ctx context.Context, t *api.Task) bool {
 	delete(s.allTasks, t.ID)
 	delete(s.preassignedTasks, t.ID)
 	nodeInfo, err := s.nodeSet.nodeInfo(t.NodeID)
 	if err == nil && nodeInfo.removeTask(t) {
 		s.nodeSet.updateNode(nodeInfo)
+		return true
 	}
+	return false
 }
 
 func (s *Scheduler) createOrUpdateNode(n *api.Node) {

+ 1 - 1
vendor/github.com/docker/swarmkit/manager/storeapi/server.go → vendor/github.com/docker/swarmkit/manager/watchapi/server.go

@@ -1,4 +1,4 @@
-package storeapi
+package watchapi
 
 import (
 	"github.com/docker/swarmkit/manager/state/store"

+ 2 - 2
vendor/github.com/docker/swarmkit/manager/storeapi/watch.go → vendor/github.com/docker/swarmkit/manager/watchapi/watch.go

@@ -1,4 +1,4 @@
-package storeapi
+package watchapi
 
 import (
 	"google.golang.org/grpc"
@@ -14,7 +14,7 @@ import (
 // an empty message back to the client. It is important to wait for
 // this message before taking any actions that depend on an established
 // stream of changes for consistency.
-func (s *Server) Watch(request *api.WatchRequest, stream api.Store_WatchServer) error {
+func (s *Server) Watch(request *api.WatchRequest, stream api.Watch_WatchServer) error {
 	ctx := stream.Context()
 
 	watchArgs, err := api.ConvertWatchArgs(request.Entries)

部分文件因文件數量過多而無法顯示