Browse code

Vendoring swarmkit @b74ec2b

Signed-off-by: Alessandro Boch <aboch@docker.com>

Alessandro Boch authored on 2017/03/31 08:12:33
Showing 40 changed files
... ...
@@ -105,7 +105,7 @@ github.com/docker/containerd 422e31ce907fd9c3833a38d7b8fdd023e5a76e73
105 105
 github.com/tonistiigi/fifo 1405643975692217d6720f8b54aeee1bf2cd5cf4
106 106
 
107 107
 # cluster
108
-github.com/docker/swarmkit 970b45afa1c9da9ed4b9c793669cedbb05ad3833
108
+github.com/docker/swarmkit b74ec2b81bb1d4a998f461bb2dc59b9408b7790f
109 109
 github.com/golang/mock bd3c8e81be01eef76d4b503f5e687d2d1354d2d9
110 110
 github.com/gogo/protobuf 8d70fb3182befc465c4a1eac8ad4d38ff49778e2
111 111
 github.com/cloudflare/cfssl 7fb22c8cba7ecaf98e4082d22d65800cf45e042a
... ...
@@ -215,6 +215,10 @@ func (m *IssueNodeCertificateRequest) CopyFrom(src interface{}) {
215 215
 
216 216
 	o := src.(*IssueNodeCertificateRequest)
217 217
 	*m = *o
218
+	if o.CSR != nil {
219
+		m.CSR = make([]byte, len(o.CSR))
220
+		copy(m.CSR, o.CSR)
221
+	}
218 222
 }
219 223
 
220 224
 func (m *IssueNodeCertificateResponse) Copy() *IssueNodeCertificateResponse {
... ...
@@ -255,6 +259,10 @@ func (m *GetRootCACertificateResponse) CopyFrom(src interface{}) {
255 255
 
256 256
 	o := src.(*GetRootCACertificateResponse)
257 257
 	*m = *o
258
+	if o.Certificate != nil {
259
+		m.Certificate = make([]byte, len(o.Certificate))
260
+		copy(m.Certificate, o.Certificate)
261
+	}
258 262
 }
259 263
 
260 264
 func (m *GetUnlockKeyRequest) Copy() *GetUnlockKeyRequest {
... ...
@@ -280,6 +288,10 @@ func (m *GetUnlockKeyResponse) CopyFrom(src interface{}) {
280 280
 
281 281
 	o := src.(*GetUnlockKeyResponse)
282 282
 	*m = *o
283
+	if o.UnlockKey != nil {
284
+		m.UnlockKey = make([]byte, len(o.UnlockKey))
285
+		copy(m.UnlockKey, o.UnlockKey)
286
+	}
283 287
 	github_com_docker_swarmkit_api_deepcopy.Copy(&m.Version, &o.Version)
284 288
 }
285 289
 
... ...
@@ -234,7 +234,8 @@ func (*CreateServiceResponse) ProtoMessage()               {}
234 234
 func (*CreateServiceResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{15} }
235 235
 
236 236
 type GetServiceRequest struct {
237
-	ServiceID string `protobuf:"bytes,1,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"`
237
+	ServiceID      string `protobuf:"bytes,1,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"`
238
+	InsertDefaults bool   `protobuf:"varint,2,opt,name=insert_defaults,json=insertDefaults,proto3" json:"insert_defaults,omitempty"`
238 239
 }
239 240
 
240 241
 func (m *GetServiceRequest) Reset()                    { *m = GetServiceRequest{} }
... ...
@@ -3604,6 +3605,16 @@ func (m *GetServiceRequest) MarshalTo(dAtA []byte) (int, error) {
3604 3604
 		i = encodeVarintControl(dAtA, i, uint64(len(m.ServiceID)))
3605 3605
 		i += copy(dAtA[i:], m.ServiceID)
3606 3606
 	}
3607
+	if m.InsertDefaults {
3608
+		dAtA[i] = 0x10
3609
+		i++
3610
+		if m.InsertDefaults {
3611
+			dAtA[i] = 1
3612
+		} else {
3613
+			dAtA[i] = 0
3614
+		}
3615
+		i++
3616
+	}
3607 3617
 	return i, nil
3608 3618
 }
3609 3619
 
... ...
@@ -6105,6 +6116,9 @@ func (m *GetServiceRequest) Size() (n int) {
6105 6105
 	if l > 0 {
6106 6106
 		n += 1 + l + sovControl(uint64(l))
6107 6107
 	}
6108
+	if m.InsertDefaults {
6109
+		n += 2
6110
+	}
6108 6111
 	return n
6109 6112
 }
6110 6113
 
... ...
@@ -6833,6 +6847,7 @@ func (this *GetServiceRequest) String() string {
6833 6833
 	}
6834 6834
 	s := strings.Join([]string{`&GetServiceRequest{`,
6835 6835
 		`ServiceID:` + fmt.Sprintf("%v", this.ServiceID) + `,`,
6836
+		`InsertDefaults:` + fmt.Sprintf("%v", this.InsertDefaults) + `,`,
6836 6837
 		`}`,
6837 6838
 	}, "")
6838 6839
 	return s
... ...
@@ -9448,6 +9463,26 @@ func (m *GetServiceRequest) Unmarshal(dAtA []byte) error {
9448 9448
 			}
9449 9449
 			m.ServiceID = string(dAtA[iNdEx:postIndex])
9450 9450
 			iNdEx = postIndex
9451
+		case 2:
9452
+			if wireType != 0 {
9453
+				return fmt.Errorf("proto: wrong wireType = %d for field InsertDefaults", wireType)
9454
+			}
9455
+			var v int
9456
+			for shift := uint(0); ; shift += 7 {
9457
+				if shift >= 64 {
9458
+					return ErrIntOverflowControl
9459
+				}
9460
+				if iNdEx >= l {
9461
+					return io.ErrUnexpectedEOF
9462
+				}
9463
+				b := dAtA[iNdEx]
9464
+				iNdEx++
9465
+				v |= (int(b) & 0x7F) << shift
9466
+				if b < 0x80 {
9467
+					break
9468
+				}
9469
+			}
9470
+			m.InsertDefaults = bool(v != 0)
9451 9471
 		default:
9452 9472
 			iNdEx = preIndex
9453 9473
 			skippy, err := skipControl(dAtA[iNdEx:])
... ...
@@ -13463,124 +13498,125 @@ var (
13463 13463
 func init() { proto.RegisterFile("control.proto", fileDescriptorControl) }
13464 13464
 
13465 13465
 var fileDescriptorControl = []byte{
13466
-	// 1894 bytes of a gzipped FileDescriptorProto
13467
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xcc, 0x5a, 0x4f, 0x6f, 0xdb, 0x46,
13468
-	0x16, 0xb7, 0xfe, 0xd8, 0x92, 0x9e, 0x2c, 0xd9, 0x1e, 0x2b, 0x59, 0x41, 0xc9, 0xda, 0x06, 0xb3,
13469
-	0x71, 0xe4, 0x85, 0x57, 0xde, 0x28, 0x1b, 0x6c, 0x36, 0x8b, 0xfd, 0x13, 0x5b, 0x49, 0x56, 0x71,
13470
-	0xe2, 0x04, 0xb4, 0x1d, 0xec, 0x4d, 0x90, 0xa5, 0x89, 0xcb, 0x48, 0x16, 0x55, 0x92, 0x72, 0x62,
13471
-	0xf4, 0xd2, 0x16, 0xe9, 0x47, 0x28, 0xd0, 0x6b, 0xaf, 0x2d, 0xd0, 0x43, 0x4f, 0xf9, 0x08, 0x41,
13472
-	0x4f, 0x3d, 0x16, 0x28, 0x60, 0x34, 0x02, 0x0a, 0xf4, 0xd4, 0xcf, 0x50, 0xcc, 0x3f, 0x92, 0xa2,
13473
-	0x86, 0xa4, 0x64, 0x0b, 0x70, 0x4f, 0x21, 0x87, 0xbf, 0x37, 0xef, 0xcd, 0xbc, 0xdf, 0xfc, 0xf4,
13474
-	0xe6, 0x39, 0x90, 0x69, 0xe8, 0x1d, 0xcb, 0xd0, 0xdb, 0xa5, 0xae, 0xa1, 0x5b, 0x3a, 0x42, 0x4d,
13475
-	0xbd, 0xd1, 0xc2, 0x46, 0xc9, 0x7c, 0x55, 0x37, 0x8e, 0x5a, 0x9a, 0x55, 0x3a, 0xbe, 0x59, 0x48,
13476
-	0x9b, 0x5d, 0xdc, 0x30, 0x19, 0xa0, 0x90, 0xd1, 0x0f, 0x5e, 0xe2, 0x86, 0x25, 0x5e, 0xd3, 0xd6,
13477
-	0x49, 0x17, 0x8b, 0x97, 0xdc, 0xa1, 0x7e, 0xa8, 0xd3, 0xc7, 0x0d, 0xf2, 0xc4, 0x47, 0x17, 0xbb,
13478
-	0xed, 0xde, 0xa1, 0xd6, 0xd9, 0x60, 0xff, 0xb0, 0x41, 0xe5, 0x36, 0x64, 0x1f, 0x62, 0x6b, 0x47,
13479
-	0x6f, 0x62, 0x15, 0x7f, 0xd8, 0xc3, 0xa6, 0x85, 0xae, 0x41, 0xa2, 0xa3, 0x37, 0x71, 0x4d, 0x6b,
13480
-	0xe6, 0x23, 0x2b, 0x91, 0x62, 0x6a, 0x13, 0xfa, 0xa7, 0xcb, 0x33, 0x04, 0x51, 0xad, 0xa8, 0x33,
13481
-	0xe4, 0x53, 0xb5, 0xa9, 0xfc, 0x07, 0xe6, 0x6c, 0x33, 0xb3, 0xab, 0x77, 0x4c, 0x8c, 0xd6, 0x21,
13482
-	0x4e, 0x3e, 0x52, 0xa3, 0x74, 0x39, 0x5f, 0x1a, 0x5e, 0x40, 0x89, 0xe2, 0x29, 0x4a, 0x39, 0x8d,
13483
-	0xc1, 0xfc, 0x63, 0xcd, 0xa4, 0x53, 0x98, 0xc2, 0xf5, 0x03, 0x48, 0xbc, 0xd0, 0xda, 0x16, 0x36,
13484
-	0x4c, 0x3e, 0xcb, 0xba, 0x6c, 0x16, 0xaf, 0x59, 0xe9, 0x01, 0xb3, 0x51, 0x85, 0x71, 0xe1, 0x93,
13485
-	0x18, 0x24, 0xf8, 0x20, 0xca, 0xc1, 0x74, 0xa7, 0x7e, 0x84, 0xc9, 0x8c, 0xb1, 0x62, 0x4a, 0x65,
13486
-	0x2f, 0x68, 0x03, 0xd2, 0x5a, 0xb3, 0xd6, 0x35, 0xf0, 0x0b, 0xed, 0x35, 0x36, 0xf3, 0x51, 0xf2,
13487
-	0x6d, 0x33, 0xdb, 0x3f, 0x5d, 0x86, 0x6a, 0xe5, 0x19, 0x1f, 0x55, 0x41, 0x6b, 0x8a, 0x67, 0xf4,
13488
-	0x0c, 0x66, 0xda, 0xf5, 0x03, 0xdc, 0x36, 0xf3, 0xb1, 0x95, 0x58, 0x31, 0x5d, 0xbe, 0x33, 0x4e,
13489
-	0x64, 0xa5, 0xc7, 0xd4, 0xf4, 0x7e, 0xc7, 0x32, 0x4e, 0x54, 0x3e, 0x0f, 0xaa, 0x42, 0xfa, 0x08,
13490
-	0x1f, 0x1d, 0x60, 0xc3, 0xfc, 0x40, 0xeb, 0x9a, 0xf9, 0xf8, 0x4a, 0xac, 0x98, 0x2d, 0xdf, 0xf0,
13491
-	0xdb, 0xb6, 0xdd, 0x2e, 0x6e, 0x94, 0x9e, 0xd8, 0x78, 0xd5, 0x6d, 0x8b, 0xca, 0x30, 0x6d, 0xe8,
13492
-	0x6d, 0x6c, 0xe6, 0xa7, 0xe9, 0x24, 0x57, 0x7d, 0xf7, 0x5e, 0x6f, 0x63, 0x95, 0x41, 0xd1, 0x35,
13493
-	0xc8, 0x90, 0xad, 0x70, 0xf6, 0x60, 0x86, 0xee, 0xcf, 0x2c, 0x19, 0x14, 0xab, 0x2e, 0xfc, 0x03,
13494
-	0xd2, 0xae, 0xd0, 0xd1, 0x3c, 0xc4, 0x5a, 0xf8, 0x84, 0xd1, 0x42, 0x25, 0x8f, 0x64, 0x77, 0x8f,
13495
-	0xeb, 0xed, 0x1e, 0xce, 0x47, 0xe9, 0x18, 0x7b, 0xb9, 0x1b, 0xbd, 0x13, 0x51, 0xb6, 0x60, 0xc1,
13496
-	0xb5, 0x1d, 0x9c, 0x23, 0x25, 0x98, 0x26, 0xd9, 0x67, 0xc9, 0x08, 0x22, 0x09, 0x83, 0x29, 0x5f,
13497
-	0x45, 0x60, 0x61, 0xbf, 0xdb, 0xac, 0x5b, 0x78, 0x5c, 0x86, 0xa2, 0x7f, 0xc3, 0x2c, 0x05, 0x1d,
13498
-	0x63, 0xc3, 0xd4, 0xf4, 0x0e, 0x0d, 0x30, 0x5d, 0xbe, 0x22, 0xf3, 0xf8, 0x9c, 0x41, 0xd4, 0x34,
13499
-	0x31, 0xe0, 0x2f, 0xe8, 0xaf, 0x10, 0x27, 0xc7, 0x2d, 0x1f, 0xa3, 0x76, 0x57, 0x83, 0xf2, 0xa2,
13500
-	0x52, 0xa4, 0xb2, 0x09, 0xc8, 0x1d, 0xeb, 0x99, 0x8e, 0xc5, 0x0e, 0x2c, 0xa8, 0xf8, 0x48, 0x3f,
13501
-	0x1e, 0x7f, 0xbd, 0x39, 0x98, 0x7e, 0xa1, 0x1b, 0x0d, 0x96, 0x89, 0xa4, 0xca, 0x5e, 0x94, 0x1c,
13502
-	0x20, 0xf7, 0x7c, 0x2c, 0x26, 0x7e, 0xe8, 0xf7, 0xea, 0x66, 0xcb, 0xe5, 0xc2, 0xaa, 0x9b, 0x2d,
13503
-	0x8f, 0x0b, 0x82, 0x20, 0x2e, 0xc8, 0x27, 0xfb, 0xd0, 0x33, 0x33, 0x67, 0x75, 0xe4, 0x63, 0xd0,
13504
-	0xea, 0x28, 0x9e, 0xa2, 0x94, 0x3b, 0x62, 0x75, 0x63, 0xbb, 0xb6, 0xd7, 0xe1, 0xf6, 0xae, 0xbc,
13505
-	0x8d, 0x33, 0x11, 0x21, 0x83, 0x67, 0x10, 0x11, 0xb7, 0xd9, 0xb0, 0x88, 0xfc, 0x78, 0x81, 0x22,
13506
-	0x22, 0x8b, 0x4c, 0x2a, 0x22, 0x1b, 0x90, 0x36, 0xb1, 0x71, 0xac, 0x35, 0x08, 0x3b, 0x98, 0x88,
13507
-	0xf0, 0x10, 0x76, 0xd9, 0x70, 0xb5, 0x62, 0xaa, 0xc0, 0x21, 0xd5, 0xa6, 0x89, 0x56, 0x21, 0xc9,
13508
-	0xb9, 0xc4, 0xd4, 0x22, 0xb5, 0x99, 0xee, 0x9f, 0x2e, 0x27, 0x18, 0x99, 0x4c, 0x35, 0xc1, 0xd8,
13509
-	0x64, 0xa2, 0x0a, 0x64, 0x9b, 0xd8, 0xd4, 0x0c, 0xdc, 0xac, 0x99, 0x56, 0xdd, 0xe2, 0xfa, 0x90,
13510
-	0x2d, 0xff, 0xd1, 0x2f, 0xc5, 0xbb, 0x04, 0xa5, 0x66, 0xb8, 0x11, 0x7d, 0x93, 0x88, 0x4c, 0x62,
13511
-	0x58, 0x64, 0xd0, 0x55, 0x80, 0x5e, 0xb7, 0x66, 0xe9, 0x35, 0x72, 0x76, 0xf2, 0x49, 0x4a, 0xdf,
13512
-	0x64, 0xaf, 0xbb, 0xa7, 0x57, 0xea, 0x16, 0x46, 0x05, 0x48, 0x1a, 0xbd, 0x8e, 0xa5, 0x91, 0xdd,
13513
-	0x4f, 0x51, 0x6b, 0xfb, 0x7d, 0x02, 0xf2, 0xc4, 0x37, 0xda, 0x91, 0x27, 0xc2, 0xb7, 0x40, 0x79,
13514
-	0xa2, 0x04, 0x64, 0x30, 0x65, 0x1b, 0x72, 0x5b, 0x06, 0xae, 0x5b, 0x98, 0x6f, 0xb6, 0xa0, 0xe0,
13515
-	0x2d, 0xae, 0x1d, 0x8c, 0x7f, 0xcb, 0xb2, 0x69, 0xb8, 0x85, 0x4b, 0x3e, 0x76, 0xe0, 0x92, 0x67,
13516
-	0x32, 0x1e, 0xd5, 0x6d, 0x48, 0xf0, 0x04, 0xf2, 0x09, 0xaf, 0x04, 0x4c, 0xa8, 0x0a, 0xac, 0x72,
13517
-	0x0f, 0x16, 0x1e, 0x62, 0xcb, 0x13, 0xd9, 0x3a, 0x80, 0xc3, 0x17, 0x7e, 0xde, 0x32, 0xfd, 0xd3,
13518
-	0xe5, 0x94, 0x4d, 0x17, 0x35, 0x65, 0xb3, 0x45, 0xd9, 0x06, 0xe4, 0x9e, 0xe2, 0x7c, 0xf1, 0x7c,
13519
-	0x1b, 0x85, 0x1c, 0xd3, 0xc7, 0xf3, 0xc4, 0x84, 0x2a, 0x30, 0x27, 0xd0, 0x63, 0x48, 0x7b, 0x96,
13520
-	0xdb, 0x08, 0x75, 0xbf, 0x35, 0xa0, 0xee, 0xa3, 0x65, 0x08, 0x3d, 0x81, 0xa4, 0xa1, 0xb7, 0xdb,
13521
-	0x07, 0xf5, 0x46, 0x2b, 0x1f, 0x5f, 0x89, 0x14, 0xb3, 0xe5, 0x9b, 0x32, 0x43, 0xd9, 0x22, 0x4b,
13522
-	0x2a, 0x37, 0x54, 0xed, 0x29, 0x14, 0x05, 0x92, 0x62, 0x14, 0x25, 0x21, 0xbe, 0xf3, 0x74, 0xe7,
13523
-	0xfe, 0xfc, 0x14, 0x9a, 0x85, 0xe4, 0x33, 0xf5, 0xfe, 0xf3, 0xea, 0xd3, 0xfd, 0xdd, 0xf9, 0x08,
13524
-	0x21, 0x85, 0x67, 0xba, 0xf3, 0x25, 0xa1, 0x02, 0x39, 0xa6, 0xa3, 0xe7, 0xe2, 0xc5, 0x1f, 0xe0,
13525
-	0x92, 0x67, 0x16, 0x2e, 0xc8, 0x6f, 0x62, 0xb0, 0x48, 0x8e, 0x15, 0x1f, 0xb7, 0x35, 0xb9, 0xea,
13526
-	0xd5, 0xe4, 0x0d, 0x3f, 0xe5, 0xf3, 0x58, 0x0e, 0xcb, 0xf2, 0x97, 0xd1, 0x89, 0xcb, 0xf2, 0xae,
13527
-	0x47, 0x96, 0xff, 0x39, 0x66, 0x70, 0x52, 0x65, 0x1e, 0x92, 0xbe, 0xb8, 0x44, 0xfa, 0xdc, 0xe2,
13528
-	0x36, 0x3d, 0x39, 0x71, 0x7b, 0x0a, 0xb9, 0xc1, 0x70, 0x39, 0x69, 0xfe, 0x0e, 0x49, 0x9e, 0x44,
13529
-	0x21, 0x71, 0x81, 0xac, 0xb1, 0xc1, 0x8e, 0xd0, 0xed, 0x60, 0xeb, 0x95, 0x6e, 0xb4, 0xc6, 0x10,
13530
-	0x3a, 0x6e, 0x21, 0x13, 0x3a, 0x7b, 0x32, 0x87, 0xd3, 0x1d, 0x36, 0x14, 0xc4, 0x69, 0x61, 0x25,
13531
-	0xb0, 0xca, 0x3e, 0x15, 0x3a, 0x4f, 0x64, 0x08, 0xe2, 0x64, 0xa7, 0xf9, 0x7e, 0xd1, 0x67, 0x42,
13532
-	0x72, 0x6e, 0x43, 0x48, 0x1e, 0x75, 0x48, 0xce, 0x6d, 0x09, 0xc9, 0x39, 0xc0, 0x16, 0xbf, 0x09,
13533
-	0xc5, 0xf8, 0x7f, 0x71, 0xee, 0x26, 0x1e, 0xa6, 0x7d, 0x16, 0x3d, 0x91, 0x2a, 0xbf, 0x44, 0xd9,
13534
-	0x59, 0xe4, 0xe3, 0x67, 0x38, 0x8b, 0x1e, 0xcb, 0xe1, 0xb3, 0xf8, 0xd9, 0x05, 0x9e, 0x45, 0x9f,
13535
-	0xe0, 0xce, 0x7c, 0x16, 0x27, 0x70, 0xde, 0x9c, 0x90, 0x9c, 0xf3, 0xc6, 0x13, 0x15, 0x78, 0xde,
13536
-	0x44, 0xe6, 0x6c, 0x30, 0xff, 0xed, 0xde, 0x6a, 0xf7, 0x4c, 0x0b, 0x1b, 0x2e, 0x8d, 0x6e, 0xb0,
13537
-	0x11, 0x8f, 0x46, 0x73, 0x1c, 0xe1, 0x05, 0x07, 0xd8, 0xf4, 0xb5, 0xa7, 0x70, 0xe8, 0xcb, 0x21,
13538
-	0x41, 0xf4, 0x15, 0x56, 0x02, 0x6b, 0x73, 0x89, 0x7f, 0x38, 0x03, 0x97, 0x3c, 0x96, 0xbf, 0x2f,
13539
-	0x2e, 0xf9, 0x04, 0x77, 0x91, 0x5c, 0x72, 0x42, 0x72, 0xb8, 0xc4, 0xb3, 0x11, 0xc8, 0x25, 0x91,
13540
-	0x3a, 0x1b, 0xac, 0x7c, 0x1e, 0x81, 0xf4, 0x36, 0x3e, 0x51, 0x75, 0xab, 0x6e, 0x91, 0xd2, 0xe7,
13541
-	0xcf, 0xb0, 0x40, 0x48, 0x86, 0x8d, 0xda, 0x4b, 0x5d, 0xeb, 0xd4, 0x2c, 0xbd, 0x85, 0x3b, 0x34,
13542
-	0xb4, 0xa4, 0x3a, 0xc7, 0x3e, 0x3c, 0xd2, 0xb5, 0xce, 0x1e, 0x19, 0x46, 0xeb, 0x80, 0x8e, 0xea,
13543
-	0x9d, 0xfa, 0xe1, 0x20, 0x98, 0xdd, 0x30, 0xe7, 0xf9, 0x17, 0x29, 0xba, 0xd7, 0x69, 0xeb, 0x8d,
13544
-	0x56, 0x8d, 0xac, 0x3a, 0x36, 0x80, 0xde, 0xa7, 0x1f, 0xb6, 0xf1, 0x89, 0xf2, 0xa9, 0x5d, 0x0f,
13545
-	0x9e, 0x87, 0xe7, 0xa4, 0x1e, 0x14, 0xe8, 0x71, 0xea, 0x41, 0x6e, 0x33, 0x46, 0x3d, 0xc8, 0xbd,
13546
-	0xbb, 0xea, 0xc1, 0x7b, 0xa4, 0x1e, 0x64, 0xbb, 0x4a, 0xeb, 0x41, 0x1f, 0x43, 0xd7, 0xe6, 0x6f,
13547
-	0xc6, 0xdf, 0x9d, 0x2e, 0x4f, 0xa9, 0xb6, 0x99, 0x53, 0xdf, 0x4d, 0xe8, 0xa0, 0xfe, 0x0b, 0xe6,
13548
-	0x69, 0xc5, 0xde, 0x30, 0xb0, 0x25, 0xf6, 0x73, 0x0d, 0x52, 0x26, 0x1d, 0x70, 0xb6, 0x73, 0xb6,
13549
-	0x7f, 0xba, 0x9c, 0x64, 0xa8, 0x6a, 0x85, 0xfc, 0xce, 0xd3, 0xa7, 0xa6, 0xf2, 0x90, 0xdf, 0x19,
13550
-	0x98, 0x39, 0x0f, 0xa5, 0x0c, 0x33, 0x0c, 0xc0, 0x23, 0x29, 0xc8, 0x6b, 0x06, 0x6a, 0xc3, 0x91,
13551
-	0xca, 0xdb, 0x08, 0x2c, 0x8a, 0xc2, 0xf5, 0x6c, 0xb1, 0xa0, 0x4d, 0xc8, 0x72, 0xe8, 0x18, 0x79,
13552
-	0xcd, 0x30, 0x13, 0x91, 0xd6, 0xf2, 0x40, 0x5a, 0x97, 0xfc, 0x03, 0x77, 0x95, 0x27, 0x8f, 0x9c,
13553
-	0x6b, 0xca, 0xb9, 0xb7, 0xe1, 0xe7, 0x28, 0x20, 0x56, 0x89, 0x91, 0x57, 0x5b, 0x36, 0xff, 0xe7,
13554
-	0x95, 0xcd, 0x92, 0x7f, 0xc5, 0xe9, 0x36, 0x1c, 0x56, 0xcd, 0x37, 0x93, 0x57, 0x4d, 0xd5, 0xa3,
13555
-	0x9a, 0x77, 0xc7, 0x8b, 0xed, 0x42, 0x44, 0x73, 0x5b, 0x5c, 0x3b, 0x78, 0x44, 0x3c, 0x65, 0x7f,
13556
-	0x23, 0x97, 0x24, 0x3a, 0xc4, 0x25, 0x33, 0x28, 0x67, 0x02, 0xaa, 0x54, 0x61, 0x51, 0x5c, 0xc4,
13557
-	0xdd, 0xd4, 0x2d, 0x0f, 0xd4, 0xba, 0x23, 0x73, 0x69, 0x70, 0xaa, 0x73, 0x70, 0xe9, 0xbf, 0xb0,
13558
-	0x28, 0x2e, 0x5d, 0x67, 0x3c, 0xdd, 0x97, 0x9d, 0xcb, 0x9f, 0x3b, 0x9a, 0xf2, 0xd7, 0x97, 0x21,
13559
-	0xb1, 0xc5, 0xfe, 0xfa, 0x80, 0x34, 0x48, 0xf0, 0xc6, 0x3e, 0x52, 0x64, 0x41, 0x0d, 0xfe, 0xb1,
13560
-	0xa0, 0x70, 0x2d, 0x10, 0xc3, 0x2b, 0xd1, 0x4b, 0xdf, 0x7d, 0xf3, 0xeb, 0x17, 0xd1, 0x39, 0xc8,
13561
-	0x50, 0xd0, 0x5f, 0xf8, 0x2f, 0x01, 0xd2, 0x21, 0x65, 0x77, 0x88, 0xd1, 0x9f, 0x46, 0xe9, 0xa7,
13562
-	0x17, 0xae, 0x87, 0xa0, 0x82, 0x1d, 0x1a, 0x00, 0x4e, 0x83, 0x16, 0x5d, 0xf7, 0xbf, 0xbb, 0xbb,
13563
-	0x57, 0xb8, 0x1a, 0x06, 0x0b, 0xf5, 0xe9, 0x34, 0x60, 0xe5, 0x3e, 0x87, 0x1a, 0xbe, 0x72, 0x9f,
13564
-	0x92, 0x3e, 0xae, 0x8f, 0x4f, 0x96, 0xc3, 0xbd, 0xba, 0xd9, 0xf2, 0xcd, 0xa1, 0xab, 0x01, 0xeb,
13565
-	0x9b, 0xc3, 0x81, 0x56, 0x6b, 0x70, 0x0e, 0x69, 0x1b, 0xcd, 0x3f, 0x87, 0xee, 0x76, 0xa6, 0x7f,
13566
-	0x0e, 0x07, 0x7a, 0x71, 0xa1, 0xfb, 0x49, 0x97, 0x17, 0xb0, 0x9f, 0xee, 0x15, 0xae, 0x86, 0xc1,
13567
-	0x42, 0x7d, 0x3a, 0x6d, 0x30, 0xb9, 0xcf, 0xa1, 0x4e, 0x9b, 0xdc, 0xe7, 0x70, 0x37, 0xcd, 0xcf,
13568
-	0xe7, 0x6b, 0x98, 0x75, 0x5f, 0xe1, 0xd1, 0x8d, 0x11, 0x7b, 0x12, 0x85, 0x62, 0x38, 0x30, 0xd8,
13569
-	0xf3, 0x47, 0x90, 0x19, 0xe8, 0x43, 0x22, 0xe9, 0x8c, 0xb2, 0xbe, 0x67, 0x61, 0x6d, 0x04, 0x64,
13570
-	0xa8, 0xf3, 0x81, 0x7e, 0x97, 0xdc, 0xb9, 0xac, 0xc3, 0x26, 0x77, 0x2e, 0x6d, 0x9e, 0x05, 0x38,
13571
-	0x1f, 0x68, 0x6b, 0xc9, 0x9d, 0xcb, 0xfa, 0x67, 0x72, 0xe7, 0xf2, 0x1e, 0x59, 0x20, 0xc9, 0xf8,
13572
-	0x55, 0xd0, 0x97, 0x64, 0x83, 0xed, 0x03, 0x5f, 0x92, 0x79, 0x7b, 0x01, 0xc1, 0x24, 0x13, 0xf7,
13573
-	0x56, 0x7f, 0x92, 0x79, 0x2e, 0xdb, 0xfe, 0x24, 0xf3, 0x5e, 0x81, 0x43, 0x49, 0x26, 0x16, 0x1c,
13574
-	0x40, 0x32, 0xcf, 0x9a, 0xd7, 0x46, 0x40, 0x8e, 0x98, 0xe7, 0x40, 0xe7, 0xb2, 0x7e, 0x4d, 0x50,
13575
-	0x9e, 0x47, 0x74, 0xce, 0xf2, 0xcc, 0x0b, 0x77, 0xdf, 0x3c, 0x0f, 0x5e, 0x89, 0x7c, 0xf3, 0xec,
13576
-	0xb9, 0x35, 0x84, 0xe4, 0x59, 0xdc, 0x29, 0xfd, 0xf3, 0xec, 0xb9, 0x08, 0xfb, 0xe7, 0xd9, 0x7b,
13577
-	0x3d, 0x0d, 0x3d, 0xcf, 0x62, 0xc1, 0x01, 0xe7, 0xd9, 0xb3, 0xe6, 0xb5, 0x11, 0x90, 0xa1, 0x3f,
13578
-	0x4e, 0xf6, 0x6d, 0x46, 0xfe, 0xe3, 0xe4, 0xbd, 0x2b, 0x15, 0xae, 0x87, 0xa0, 0x42, 0xf7, 0xd9,
13579
-	0x7d, 0x75, 0x90, 0xef, 0xb3, 0xe4, 0x5a, 0x54, 0x28, 0x86, 0x03, 0x83, 0x3d, 0xf7, 0x20, 0xed,
13580
-	0x2a, 0x80, 0xd1, 0xea, 0x68, 0x35, 0x7b, 0xe1, 0x46, 0x28, 0x2e, 0x74, 0xc1, 0xee, 0xfa, 0x56,
13581
-	0xbe, 0x60, 0x49, 0x31, 0x5d, 0x28, 0x86, 0x03, 0x43, 0x3d, 0xbb, 0x6b, 0x59, 0xb9, 0x67, 0x49,
13582
-	0xbd, 0x5c, 0x28, 0x86, 0x03, 0x03, 0x3d, 0x6f, 0xe6, 0xdf, 0xbd, 0x5f, 0x9a, 0xfa, 0xe1, 0xfd,
13583
-	0xd2, 0xd4, 0xc7, 0xfd, 0xa5, 0xc8, 0xbb, 0xfe, 0x52, 0xe4, 0xfb, 0xfe, 0x52, 0xe4, 0xa7, 0xfe,
13584
-	0x52, 0xe4, 0x60, 0x86, 0xfe, 0x97, 0x9a, 0x5b, 0xbf, 0x05, 0x00, 0x00, 0xff, 0xff, 0x35, 0xa6,
13585
-	0x7d, 0x8d, 0xcb, 0x23, 0x00, 0x00,
13466
+	// 1917 bytes of a gzipped FileDescriptorProto
13467
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xcc, 0x5a, 0x4f, 0x6f, 0x1b, 0x41,
13468
+	0x15, 0x8f, 0xff, 0x24, 0xb6, 0x9f, 0x63, 0x27, 0x99, 0xb8, 0xc5, 0x72, 0x4b, 0x12, 0x6d, 0x69,
13469
+	0xe2, 0xa0, 0xe0, 0x50, 0x97, 0x8a, 0x52, 0xc4, 0x9f, 0x26, 0x6e, 0x8b, 0x9b, 0x36, 0xad, 0x36,
13470
+	0x49, 0xc5, 0xcd, 0xda, 0xd8, 0x93, 0xb0, 0xb5, 0xe3, 0x35, 0xbb, 0xeb, 0xb4, 0x11, 0x17, 0x40,
13471
+	0xe5, 0x23, 0x20, 0x71, 0xe5, 0x0a, 0x12, 0x07, 0x4e, 0xfd, 0x08, 0x15, 0x27, 0x8e, 0x48, 0x48,
13472
+	0x11, 0xb5, 0x84, 0xc4, 0x89, 0xcf, 0x80, 0xe6, 0xdf, 0xee, 0x7a, 0x3d, 0xbb, 0x6b, 0x27, 0x96,
13473
+	0xc2, 0xa9, 0xde, 0xd9, 0xdf, 0x9b, 0xf7, 0x66, 0xde, 0x6f, 0x7e, 0xfb, 0xe6, 0xa5, 0x90, 0x6b,
13474
+	0x1a, 0x5d, 0xdb, 0x34, 0x3a, 0x95, 0x9e, 0x69, 0xd8, 0x06, 0x42, 0x2d, 0xa3, 0xd9, 0xc6, 0x66,
13475
+	0xc5, 0xfa, 0xa0, 0x99, 0x67, 0x6d, 0xdd, 0xae, 0x9c, 0x3f, 0x28, 0x65, 0xad, 0x1e, 0x6e, 0x5a,
13476
+	0x0c, 0x50, 0xca, 0x19, 0xc7, 0xef, 0x71, 0xd3, 0x16, 0x8f, 0x59, 0xfb, 0xa2, 0x87, 0xc5, 0x43,
13477
+	0xe1, 0xd4, 0x38, 0x35, 0xe8, 0xcf, 0x6d, 0xf2, 0x8b, 0x8f, 0x2e, 0xf7, 0x3a, 0xfd, 0x53, 0xbd,
13478
+	0xbb, 0xcd, 0xfe, 0x61, 0x83, 0xca, 0x23, 0xc8, 0xbf, 0xc0, 0xf6, 0xbe, 0xd1, 0xc2, 0x2a, 0xfe,
13479
+	0x65, 0x1f, 0x5b, 0x36, 0xba, 0x07, 0xa9, 0xae, 0xd1, 0xc2, 0x0d, 0xbd, 0x55, 0x8c, 0xad, 0xc5,
13480
+	0xca, 0x99, 0x1d, 0x18, 0x5c, 0xae, 0xce, 0x11, 0x44, 0xbd, 0xa6, 0xce, 0x91, 0x57, 0xf5, 0x96,
13481
+	0xf2, 0x13, 0x58, 0x70, 0xcc, 0xac, 0x9e, 0xd1, 0xb5, 0x30, 0xda, 0x82, 0x24, 0x79, 0x49, 0x8d,
13482
+	0xb2, 0xd5, 0x62, 0x65, 0x74, 0x01, 0x15, 0x8a, 0xa7, 0x28, 0xe5, 0x32, 0x01, 0x8b, 0xaf, 0x74,
13483
+	0x8b, 0x4e, 0x61, 0x09, 0xd7, 0xcf, 0x21, 0x75, 0xa2, 0x77, 0x6c, 0x6c, 0x5a, 0x7c, 0x96, 0x2d,
13484
+	0xd9, 0x2c, 0x7e, 0xb3, 0xca, 0x73, 0x66, 0xa3, 0x0a, 0xe3, 0xd2, 0x6f, 0x12, 0x90, 0xe2, 0x83,
13485
+	0xa8, 0x00, 0xb3, 0x5d, 0xed, 0x0c, 0x93, 0x19, 0x13, 0xe5, 0x8c, 0xca, 0x1e, 0xd0, 0x36, 0x64,
13486
+	0xf5, 0x56, 0xa3, 0x67, 0xe2, 0x13, 0xfd, 0x23, 0xb6, 0x8a, 0x71, 0xf2, 0x6e, 0x27, 0x3f, 0xb8,
13487
+	0x5c, 0x85, 0x7a, 0xed, 0x2d, 0x1f, 0x55, 0x41, 0x6f, 0x89, 0xdf, 0xe8, 0x2d, 0xcc, 0x75, 0xb4,
13488
+	0x63, 0xdc, 0xb1, 0x8a, 0x89, 0xb5, 0x44, 0x39, 0x5b, 0x7d, 0x3c, 0x49, 0x64, 0x95, 0x57, 0xd4,
13489
+	0xf4, 0x59, 0xd7, 0x36, 0x2f, 0x54, 0x3e, 0x0f, 0xaa, 0x43, 0xf6, 0x0c, 0x9f, 0x1d, 0x63, 0xd3,
13490
+	0xfa, 0x85, 0xde, 0xb3, 0x8a, 0xc9, 0xb5, 0x44, 0x39, 0x5f, 0xdd, 0x08, 0xda, 0xb6, 0x83, 0x1e,
13491
+	0x6e, 0x56, 0x5e, 0x3b, 0x78, 0xd5, 0x6b, 0x8b, 0xaa, 0x30, 0x6b, 0x1a, 0x1d, 0x6c, 0x15, 0x67,
13492
+	0xe9, 0x24, 0x77, 0x03, 0xf7, 0xde, 0xe8, 0x60, 0x95, 0x41, 0xd1, 0x3d, 0xc8, 0x91, 0xad, 0x70,
13493
+	0xf7, 0x60, 0x8e, 0xee, 0xcf, 0x3c, 0x19, 0x14, 0xab, 0x2e, 0xfd, 0x00, 0xb2, 0x9e, 0xd0, 0xd1,
13494
+	0x22, 0x24, 0xda, 0xf8, 0x82, 0xd1, 0x42, 0x25, 0x3f, 0xc9, 0xee, 0x9e, 0x6b, 0x9d, 0x3e, 0x2e,
13495
+	0xc6, 0xe9, 0x18, 0x7b, 0x78, 0x12, 0x7f, 0x1c, 0x53, 0x76, 0x61, 0xc9, 0xb3, 0x1d, 0x9c, 0x23,
13496
+	0x15, 0x98, 0x25, 0xd9, 0x67, 0xc9, 0x08, 0x23, 0x09, 0x83, 0x29, 0x7f, 0x8a, 0xc1, 0xd2, 0x51,
13497
+	0xaf, 0xa5, 0xd9, 0x78, 0x52, 0x86, 0xa2, 0x1f, 0xc3, 0x3c, 0x05, 0x9d, 0x63, 0xd3, 0xd2, 0x8d,
13498
+	0x2e, 0x0d, 0x30, 0x5b, 0xbd, 0x23, 0xf3, 0xf8, 0x8e, 0x41, 0xd4, 0x2c, 0x31, 0xe0, 0x0f, 0xe8,
13499
+	0xbb, 0x90, 0x24, 0xc7, 0xad, 0x98, 0xa0, 0x76, 0x77, 0xc3, 0xf2, 0xa2, 0x52, 0xa4, 0xb2, 0x03,
13500
+	0xc8, 0x1b, 0xeb, 0x95, 0x8e, 0xc5, 0x3e, 0x2c, 0xa9, 0xf8, 0xcc, 0x38, 0x9f, 0x7c, 0xbd, 0x05,
13501
+	0x98, 0x3d, 0x31, 0xcc, 0x26, 0xcb, 0x44, 0x5a, 0x65, 0x0f, 0x4a, 0x01, 0x90, 0x77, 0x3e, 0x16,
13502
+	0x13, 0x3f, 0xf4, 0x87, 0x9a, 0xd5, 0xf6, 0xb8, 0xb0, 0x35, 0xab, 0xed, 0x73, 0x41, 0x10, 0xc4,
13503
+	0x05, 0x79, 0xe5, 0x1c, 0x7a, 0x66, 0xe6, 0xae, 0x8e, 0xbc, 0x0c, 0x5b, 0x1d, 0xc5, 0x53, 0x94,
13504
+	0xf2, 0x58, 0xac, 0x6e, 0x62, 0xd7, 0xce, 0x3a, 0xbc, 0xde, 0x95, 0xcf, 0x49, 0x26, 0x22, 0x64,
13505
+	0xf0, 0x0a, 0x22, 0xe2, 0x35, 0x1b, 0x15, 0x91, 0x7f, 0xde, 0xa0, 0x88, 0xc8, 0x22, 0x93, 0x8a,
13506
+	0xc8, 0x36, 0x64, 0x2d, 0x6c, 0x9e, 0xeb, 0x4d, 0xc2, 0x0e, 0x26, 0x22, 0x3c, 0x84, 0x03, 0x36,
13507
+	0x5c, 0xaf, 0x59, 0x2a, 0x70, 0x48, 0xbd, 0x65, 0xa1, 0x75, 0x48, 0x73, 0x2e, 0x31, 0xb5, 0xc8,
13508
+	0xec, 0x64, 0x07, 0x97, 0xab, 0x29, 0x46, 0x26, 0x4b, 0x4d, 0x31, 0x36, 0x59, 0xa8, 0x06, 0xf9,
13509
+	0x16, 0xb6, 0x74, 0x13, 0xb7, 0x1a, 0x96, 0xad, 0xd9, 0x5c, 0x1f, 0xf2, 0xd5, 0x6f, 0x06, 0xa5,
13510
+	0xf8, 0x80, 0xa0, 0xd4, 0x1c, 0x37, 0xa2, 0x4f, 0x12, 0x91, 0x49, 0x8d, 0x8a, 0x0c, 0xba, 0x0b,
13511
+	0xd0, 0xef, 0x35, 0x6c, 0xa3, 0x41, 0xce, 0x4e, 0x31, 0x4d, 0xe9, 0x9b, 0xee, 0xf7, 0x0e, 0x8d,
13512
+	0x9a, 0x66, 0x63, 0x54, 0x82, 0xb4, 0xd9, 0xef, 0xda, 0x3a, 0xd9, 0xfd, 0x0c, 0xb5, 0x76, 0x9e,
13513
+	0xa7, 0x20, 0x4f, 0x7c, 0xa3, 0x5d, 0x79, 0x22, 0x7c, 0x0b, 0x95, 0x27, 0x4a, 0x40, 0x06, 0x53,
13514
+	0xf6, 0xa0, 0xb0, 0x6b, 0x62, 0xcd, 0xc6, 0x7c, 0xb3, 0x05, 0x05, 0x1f, 0x72, 0xed, 0x60, 0xfc,
13515
+	0x5b, 0x95, 0x4d, 0xc3, 0x2d, 0x3c, 0xf2, 0xb1, 0x0f, 0xb7, 0x7c, 0x93, 0xf1, 0xa8, 0x1e, 0x41,
13516
+	0x8a, 0x27, 0x90, 0x4f, 0x78, 0x27, 0x64, 0x42, 0x55, 0x60, 0x95, 0xf7, 0xb0, 0xf4, 0x02, 0xdb,
13517
+	0xbe, 0xc8, 0xb6, 0x00, 0x5c, 0xbe, 0xf0, 0xf3, 0x96, 0x1b, 0x5c, 0xae, 0x66, 0x1c, 0xba, 0xa8,
13518
+	0x19, 0x87, 0x2d, 0x68, 0x03, 0x16, 0xf4, 0xae, 0x85, 0x4d, 0xbb, 0xd1, 0xc2, 0x27, 0x5a, 0xbf,
13519
+	0x63, 0x5b, 0x5c, 0x5d, 0xf2, 0x6c, 0xb8, 0xc6, 0x47, 0x95, 0x3d, 0x40, 0x5e, 0x5f, 0xd7, 0x0b,
13520
+	0xfc, 0xaf, 0x71, 0x28, 0x30, 0x21, 0xbd, 0x56, 0xf0, 0x35, 0x58, 0x10, 0xe8, 0x09, 0xbe, 0x01,
13521
+	0x79, 0x6e, 0x23, 0x3e, 0x03, 0x0f, 0x87, 0x3e, 0x03, 0xe3, 0xa5, 0x12, 0xbd, 0x86, 0xb4, 0x69,
13522
+	0x74, 0x3a, 0xc7, 0x5a, 0xb3, 0x5d, 0x4c, 0xae, 0xc5, 0xca, 0xf9, 0xea, 0x03, 0x99, 0xa1, 0x6c,
13523
+	0x91, 0x15, 0x95, 0x1b, 0xaa, 0xce, 0x14, 0x8a, 0x02, 0x69, 0x31, 0x8a, 0xd2, 0x90, 0xdc, 0x7f,
13524
+	0xb3, 0xff, 0x6c, 0x71, 0x06, 0xcd, 0x43, 0xfa, 0xad, 0xfa, 0xec, 0x5d, 0xfd, 0xcd, 0xd1, 0xc1,
13525
+	0x62, 0x8c, 0xb0, 0xc7, 0x37, 0xdd, 0xf5, 0x92, 0x50, 0x83, 0x02, 0x13, 0xdc, 0xeb, 0xe4, 0x40,
13526
+	0xf9, 0x06, 0xdc, 0xf2, 0xcd, 0xc2, 0x95, 0xfb, 0x53, 0x02, 0x96, 0xc9, 0xf9, 0xe3, 0xe3, 0x8e,
13527
+	0x78, 0xd7, 0xfd, 0xe2, 0xbd, 0x1d, 0x24, 0x91, 0x3e, 0xcb, 0x51, 0xfd, 0xfe, 0x63, 0x7c, 0xea,
13528
+	0xfa, 0x7d, 0xe0, 0xd3, 0xef, 0x1f, 0x4e, 0x18, 0x9c, 0x54, 0xc2, 0x47, 0x34, 0x32, 0x29, 0xd1,
13529
+	0x48, 0xaf, 0x0a, 0xce, 0x4e, 0x4f, 0x05, 0xdf, 0x40, 0x61, 0x38, 0x5c, 0x4e, 0x9a, 0xef, 0x43,
13530
+	0x9a, 0x27, 0x51, 0x68, 0x61, 0x28, 0x6b, 0x1c, 0xb0, 0xab, 0x88, 0xfb, 0xd8, 0xfe, 0x60, 0x98,
13531
+	0xed, 0x09, 0x14, 0x91, 0x5b, 0xc8, 0x14, 0xd1, 0x99, 0xcc, 0xe5, 0x74, 0x97, 0x0d, 0x85, 0x71,
13532
+	0x5a, 0x58, 0x09, 0xac, 0x72, 0x44, 0x15, 0xd1, 0x17, 0x19, 0x82, 0x24, 0xd9, 0x69, 0xbe, 0x5f,
13533
+	0xf4, 0x37, 0x21, 0x39, 0xb7, 0x21, 0x24, 0x8f, 0xbb, 0x24, 0xe7, 0xb6, 0x84, 0xe4, 0x1c, 0x50,
13534
+	0x6f, 0x71, 0xf1, 0x9b, 0x52, 0x8c, 0x3f, 0x17, 0xe7, 0x6e, 0xea, 0x61, 0x3a, 0x67, 0xd1, 0x17,
13535
+	0xa9, 0xf2, 0x9f, 0x38, 0x3b, 0x8b, 0x7c, 0xfc, 0x0a, 0x67, 0xd1, 0x67, 0x39, 0x7a, 0x16, 0x7f,
13536
+	0x77, 0x83, 0x67, 0x31, 0x20, 0xb8, 0x2b, 0x9f, 0xc5, 0x29, 0x9c, 0x37, 0x37, 0x24, 0xf7, 0xbc,
13537
+	0xf1, 0x44, 0x85, 0x9e, 0x37, 0x91, 0x39, 0x07, 0xac, 0x3c, 0xa5, 0x94, 0xde, 0xed, 0xf4, 0x2d,
13538
+	0x1b, 0x9b, 0x1e, 0x8d, 0x6e, 0xb2, 0x11, 0x9f, 0x46, 0x73, 0x1c, 0xe1, 0x05, 0x07, 0x38, 0xf4,
13539
+	0x75, 0xa6, 0x70, 0xe9, 0xcb, 0x21, 0x61, 0xf4, 0x15, 0x56, 0x02, 0xeb, 0x70, 0x89, 0xbf, 0xb8,
13540
+	0x02, 0x97, 0x7c, 0x96, 0xff, 0x5f, 0x5c, 0x0a, 0x08, 0xee, 0x26, 0xb9, 0xe4, 0x86, 0xe4, 0x72,
13541
+	0x89, 0x67, 0x23, 0x94, 0x4b, 0x22, 0x75, 0x0e, 0x58, 0xf9, 0x7d, 0x0c, 0xb2, 0x7b, 0xf8, 0x42,
13542
+	0x35, 0x6c, 0xcd, 0x26, 0xa5, 0xcf, 0xb7, 0x61, 0x89, 0x90, 0x0c, 0x9b, 0x8d, 0xf7, 0x86, 0xde,
13543
+	0x6d, 0xd8, 0x46, 0x1b, 0x77, 0x69, 0x68, 0x69, 0x75, 0x81, 0xbd, 0x78, 0x69, 0xe8, 0xdd, 0x43,
13544
+	0x32, 0x8c, 0xb6, 0x00, 0x9d, 0x69, 0x5d, 0xed, 0x74, 0x18, 0xcc, 0x8a, 0xc5, 0x45, 0xfe, 0x46,
13545
+	0x8a, 0xee, 0x77, 0x3b, 0x46, 0xb3, 0xdd, 0x20, 0xab, 0x4e, 0x0c, 0xa1, 0x8f, 0xe8, 0x8b, 0x3d,
13546
+	0x7c, 0xa1, 0xfc, 0xd6, 0xa9, 0x07, 0xaf, 0xc3, 0x73, 0x52, 0x0f, 0x0a, 0xf4, 0x24, 0xf5, 0x20,
13547
+	0xb7, 0x99, 0xa0, 0x1e, 0xe4, 0xde, 0x3d, 0xf5, 0xe0, 0x53, 0x52, 0x0f, 0xb2, 0x5d, 0xa5, 0xf5,
13548
+	0x60, 0x80, 0xa1, 0x67, 0xf3, 0x77, 0x92, 0x5f, 0x2e, 0x57, 0x67, 0x54, 0xc7, 0xcc, 0xad, 0xef,
13549
+	0xa6, 0x74, 0x50, 0x7f, 0x04, 0x8b, 0xb4, 0x62, 0x6f, 0x9a, 0xd8, 0x16, 0xfb, 0xb9, 0x09, 0x19,
13550
+	0x8b, 0x0e, 0xb8, 0xdb, 0x39, 0x3f, 0xb8, 0x5c, 0x4d, 0x33, 0x54, 0xbd, 0x46, 0xbe, 0xf3, 0xf4,
13551
+	0x57, 0x4b, 0x79, 0xc1, 0x2f, 0x17, 0xcc, 0x9c, 0x87, 0x52, 0x85, 0x39, 0x06, 0xe0, 0x91, 0x94,
13552
+	0xe4, 0x35, 0x03, 0xb5, 0xe1, 0x48, 0xe5, 0x73, 0x0c, 0x96, 0x45, 0xe1, 0x7a, 0xb5, 0x58, 0xd0,
13553
+	0x0e, 0xe4, 0x39, 0x74, 0x82, 0xbc, 0xe6, 0x98, 0x89, 0x48, 0x6b, 0x75, 0x28, 0xad, 0x2b, 0xc1,
13554
+	0x81, 0x7b, 0xca, 0x93, 0x97, 0xee, 0x35, 0xe5, 0xda, 0xdb, 0xf0, 0xef, 0x38, 0x20, 0x56, 0x89,
13555
+	0x91, 0x47, 0x47, 0x36, 0x7f, 0xe6, 0x97, 0xcd, 0x4a, 0x70, 0xc5, 0xe9, 0x35, 0x1c, 0x55, 0xcd,
13556
+	0x4f, 0xd3, 0x57, 0x4d, 0xd5, 0xa7, 0x9a, 0x4f, 0x26, 0x8b, 0xed, 0x46, 0x44, 0x73, 0x4f, 0x5c,
13557
+	0x3b, 0x78, 0x44, 0x3c, 0x65, 0xdf, 0x23, 0x97, 0x24, 0x3a, 0xc4, 0x25, 0x33, 0x2c, 0x67, 0x02,
13558
+	0xaa, 0xd4, 0x61, 0x59, 0xdc, 0xd8, 0xbd, 0xd4, 0xad, 0x0e, 0xd5, 0xba, 0x63, 0x73, 0x69, 0x78,
13559
+	0xaa, 0x6b, 0x70, 0xe9, 0xa7, 0xb0, 0x2c, 0x2e, 0x5d, 0x57, 0x3c, 0xdd, 0xb7, 0xdd, 0xcb, 0x9f,
13560
+	0x37, 0x9a, 0xea, 0x9f, 0x6f, 0x43, 0x6a, 0x97, 0xfd, 0x99, 0x02, 0xe9, 0x90, 0xe2, 0x7f, 0x01,
13561
+	0x40, 0x8a, 0x2c, 0xa8, 0xe1, 0xbf, 0x2a, 0x94, 0xee, 0x85, 0x62, 0x78, 0x25, 0x7a, 0xeb, 0x6f,
13562
+	0x7f, 0xf9, 0xef, 0x1f, 0xe2, 0x0b, 0x90, 0xa3, 0xa0, 0xef, 0xf0, 0x2f, 0x01, 0x32, 0x20, 0xe3,
13563
+	0xb4, 0x92, 0xd1, 0xb7, 0xc6, 0x69, 0xbc, 0x97, 0xee, 0x47, 0xa0, 0xc2, 0x1d, 0x9a, 0x00, 0x6e,
13564
+	0x27, 0x17, 0xdd, 0x0f, 0xbe, 0xbb, 0x7b, 0x57, 0xb8, 0x1e, 0x05, 0x8b, 0xf4, 0xe9, 0x76, 0x6a,
13565
+	0xe5, 0x3e, 0x47, 0x3a, 0xc3, 0x72, 0x9f, 0x92, 0x86, 0x6f, 0x80, 0x4f, 0x96, 0xc3, 0x43, 0xcd,
13566
+	0x6a, 0x07, 0xe6, 0xd0, 0xd3, 0xa9, 0x0d, 0xcc, 0xe1, 0x50, 0x4f, 0x36, 0x3c, 0x87, 0xb4, 0xdf,
13567
+	0x16, 0x9c, 0x43, 0x6f, 0xdf, 0x33, 0x38, 0x87, 0x43, 0x4d, 0xbb, 0xc8, 0xfd, 0xa4, 0xcb, 0x0b,
13568
+	0xd9, 0x4f, 0xef, 0x0a, 0xd7, 0xa3, 0x60, 0x91, 0x3e, 0xdd, 0x36, 0x98, 0xdc, 0xe7, 0x48, 0x4b,
13569
+	0x4e, 0xee, 0x73, 0xb4, 0x9b, 0x16, 0xe4, 0xf3, 0x23, 0xcc, 0x7b, 0xaf, 0xf0, 0x68, 0x63, 0xcc,
13570
+	0x9e, 0x44, 0xa9, 0x1c, 0x0d, 0x0c, 0xf7, 0xfc, 0x2b, 0xc8, 0x0d, 0x35, 0x2c, 0x91, 0x74, 0x46,
13571
+	0x59, 0x83, 0xb4, 0xb4, 0x39, 0x06, 0x32, 0xd2, 0xf9, 0x50, 0xbf, 0x4b, 0xee, 0x5c, 0xd6, 0x61,
13572
+	0x93, 0x3b, 0x97, 0x36, 0xcf, 0x42, 0x9c, 0x0f, 0xb5, 0xb5, 0xe4, 0xce, 0x65, 0xfd, 0x33, 0xb9,
13573
+	0x73, 0x79, 0x8f, 0x2c, 0x94, 0x64, 0xfc, 0x2a, 0x18, 0x48, 0xb2, 0xe1, 0xf6, 0x41, 0x20, 0xc9,
13574
+	0xfc, 0xbd, 0x80, 0x70, 0x92, 0x89, 0x7b, 0x6b, 0x30, 0xc9, 0x7c, 0x97, 0xed, 0x60, 0x92, 0xf9,
13575
+	0xaf, 0xc0, 0x91, 0x24, 0x13, 0x0b, 0x0e, 0x21, 0x99, 0x6f, 0xcd, 0x9b, 0x63, 0x20, 0xc7, 0xcc,
13576
+	0x73, 0xa8, 0x73, 0x59, 0xbf, 0x26, 0x2c, 0xcf, 0x63, 0x3a, 0x67, 0x79, 0xe6, 0x85, 0x7b, 0x60,
13577
+	0x9e, 0x87, 0xaf, 0x44, 0x81, 0x79, 0xf6, 0xdd, 0x1a, 0x22, 0xf2, 0x2c, 0xee, 0x94, 0xc1, 0x79,
13578
+	0xf6, 0x5d, 0x84, 0x83, 0xf3, 0xec, 0xbf, 0x9e, 0x46, 0x9e, 0x67, 0xb1, 0xe0, 0x90, 0xf3, 0xec,
13579
+	0x5b, 0xf3, 0xe6, 0x18, 0xc8, 0xc8, 0x8f, 0x93, 0x73, 0x9b, 0x91, 0x7f, 0x9c, 0xfc, 0x77, 0xa5,
13580
+	0xd2, 0xfd, 0x08, 0x54, 0xe4, 0x3e, 0x7b, 0xaf, 0x0e, 0xf2, 0x7d, 0x96, 0x5c, 0x8b, 0x4a, 0xe5,
13581
+	0x68, 0x60, 0xb8, 0xe7, 0x3e, 0x64, 0x3d, 0x05, 0x30, 0x5a, 0x1f, 0xaf, 0x66, 0x2f, 0x6d, 0x44,
13582
+	0xe2, 0x22, 0x17, 0xec, 0xad, 0x6f, 0xe5, 0x0b, 0x96, 0x14, 0xd3, 0xa5, 0x72, 0x34, 0x30, 0xd2,
13583
+	0xb3, 0xb7, 0x96, 0x95, 0x7b, 0x96, 0xd4, 0xcb, 0xa5, 0x72, 0x34, 0x30, 0xd4, 0xf3, 0x4e, 0xf1,
13584
+	0xcb, 0xd7, 0x95, 0x99, 0x7f, 0x7c, 0x5d, 0x99, 0xf9, 0xf5, 0x60, 0x25, 0xf6, 0x65, 0xb0, 0x12,
13585
+	0xfb, 0xfb, 0x60, 0x25, 0xf6, 0xaf, 0xc1, 0x4a, 0xec, 0x78, 0x8e, 0xfe, 0xdf, 0x9b, 0x87, 0xff,
13586
+	0x0b, 0x00, 0x00, 0xff, 0xff, 0x3b, 0x09, 0x33, 0xa6, 0xf4, 0x23, 0x00, 0x00,
13586 13587
 }
... ...
@@ -217,6 +217,7 @@ message CreateServiceResponse {
217 217
 
218 218
 message GetServiceRequest {
219 219
 	string service_id = 1;
220
+	bool insert_defaults = 2;
220 221
 }
221 222
 
222 223
 message GetServiceResponse {
223 224
new file mode 100644
... ...
@@ -0,0 +1,83 @@
0
+package defaults
1
+
2
+import (
3
+	"time"
4
+
5
+	"github.com/docker/swarmkit/api"
6
+	"github.com/docker/swarmkit/api/deepcopy"
7
+	gogotypes "github.com/gogo/protobuf/types"
8
+)
9
+
10
+// Service is a ServiceSpec object with all fields filled in using default
11
+// values.
12
+var Service = api.ServiceSpec{
13
+	Task: api.TaskSpec{
14
+		Runtime: &api.TaskSpec_Container{
15
+			Container: &api.ContainerSpec{
16
+				StopGracePeriod: gogotypes.DurationProto(10 * time.Second),
17
+				PullOptions:     &api.ContainerSpec_PullOptions{},
18
+				DNSConfig:       &api.ContainerSpec_DNSConfig{},
19
+			},
20
+		},
21
+		Resources: &api.ResourceRequirements{},
22
+		Restart: &api.RestartPolicy{
23
+			Delay: gogotypes.DurationProto(5 * time.Second),
24
+		},
25
+		Placement: &api.Placement{},
26
+	},
27
+	Update: &api.UpdateConfig{
28
+		FailureAction: api.UpdateConfig_PAUSE,
29
+		Monitor:       gogotypes.DurationProto(5 * time.Second),
30
+		Parallelism:   1,
31
+		Order:         api.UpdateConfig_STOP_FIRST,
32
+	},
33
+}
34
+
35
+// InterpolateService returns a ServiceSpec based on the provided spec, which
36
+// has all unspecified values filled in with default values.
37
+func InterpolateService(origSpec *api.ServiceSpec) *api.ServiceSpec {
38
+	spec := origSpec.Copy()
39
+
40
+	container := spec.Task.GetContainer()
41
+	defaultContainer := Service.Task.GetContainer()
42
+	if container != nil {
43
+		if container.StopGracePeriod == nil {
44
+			container.StopGracePeriod = &gogotypes.Duration{}
45
+			deepcopy.Copy(container.StopGracePeriod, defaultContainer.StopGracePeriod)
46
+		}
47
+		if container.PullOptions == nil {
48
+			container.PullOptions = defaultContainer.PullOptions.Copy()
49
+		}
50
+		if container.DNSConfig == nil {
51
+			container.DNSConfig = defaultContainer.DNSConfig.Copy()
52
+		}
53
+	}
54
+
55
+	if spec.Task.Resources == nil {
56
+		spec.Task.Resources = Service.Task.Resources.Copy()
57
+	}
58
+
59
+	if spec.Task.Restart == nil {
60
+		spec.Task.Restart = Service.Task.Restart.Copy()
61
+	} else {
62
+		if spec.Task.Restart.Delay == nil {
63
+			spec.Task.Restart.Delay = &gogotypes.Duration{}
64
+			deepcopy.Copy(spec.Task.Restart.Delay, Service.Task.Restart.Delay)
65
+		}
66
+	}
67
+
68
+	if spec.Task.Placement == nil {
69
+		spec.Task.Placement = Service.Task.Placement.Copy()
70
+	}
71
+
72
+	if spec.Update == nil {
73
+		spec.Update = Service.Update.Copy()
74
+	} else {
75
+		if spec.Update.Monitor == nil {
76
+			spec.Update.Monitor = &gogotypes.Duration{}
77
+			deepcopy.Copy(spec.Update.Monitor, Service.Update.Monitor)
78
+		}
79
+	}
80
+
81
+	return spec
82
+}
... ...
@@ -1,3 +1,3 @@
1 1
 package api
2 2
 
3
-//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
3
+//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
... ...
@@ -357,6 +357,10 @@ func (m *LogMessage) CopyFrom(src interface{}) {
357 357
 		m.Timestamp = &google_protobuf.Timestamp{}
358 358
 		github_com_docker_swarmkit_api_deepcopy.Copy(m.Timestamp, o.Timestamp)
359 359
 	}
360
+	if o.Data != nil {
361
+		m.Data = make([]byte, len(o.Data))
362
+		copy(m.Data, o.Data)
363
+	}
360 364
 }
361 365
 
362 366
 func (m *SubscribeLogsRequest) Copy() *SubscribeLogsRequest {
... ...
@@ -1859,8 +1859,9 @@ func (e EventCreateNode) Matches(apiEvent github_com_docker_go_events.Event) boo
1859 1859
 }
1860 1860
 
1861 1861
 type EventUpdateNode struct {
1862
-	Node   *Node
1863
-	Checks []NodeCheckFunc
1862
+	Node    *Node
1863
+	OldNode *Node
1864
+	Checks  []NodeCheckFunc
1864 1865
 }
1865 1866
 
1866 1867
 func (e EventUpdateNode) Matches(apiEvent github_com_docker_go_events.Event) bool {
... ...
@@ -1915,14 +1916,134 @@ func (m *Node) EventCreate() Event {
1915 1915
 	return EventCreateNode{Node: m}
1916 1916
 }
1917 1917
 
1918
-func (m *Node) EventUpdate() Event {
1919
-	return EventUpdateNode{Node: m}
1918
+func (m *Node) EventUpdate(oldObject StoreObject) Event {
1919
+	if oldObject != nil {
1920
+		return EventUpdateNode{Node: m, OldNode: oldObject.(*Node)}
1921
+	} else {
1922
+		return EventUpdateNode{Node: m}
1923
+	}
1920 1924
 }
1921 1925
 
1922 1926
 func (m *Node) EventDelete() Event {
1923 1927
 	return EventDeleteNode{Node: m}
1924 1928
 }
1925 1929
 
1930
+func NodeCheckID(v1, v2 *Node) bool {
1931
+	return v1.ID == v2.ID
1932
+}
1933
+
1934
+func NodeCheckIDPrefix(v1, v2 *Node) bool {
1935
+	return strings.HasPrefix(v2.ID, v1.ID)
1936
+}
1937
+
1938
+func NodeCheckName(v1, v2 *Node) bool {
1939
+	if v1.Description == nil || v2.Description == nil {
1940
+		return false
1941
+	}
1942
+	return v1.Description.Hostname == v2.Description.Hostname
1943
+}
1944
+
1945
+func NodeCheckNamePrefix(v1, v2 *Node) bool {
1946
+	if v1.Description == nil || v2.Description == nil {
1947
+		return false
1948
+	}
1949
+	return strings.HasPrefix(v2.Description.Hostname, v1.Description.Hostname)
1950
+}
1951
+
1952
+func NodeCheckCustom(v1, v2 *Node) bool {
1953
+	return checkCustom(v1.Spec.Annotations, v2.Spec.Annotations)
1954
+}
1955
+
1956
+func NodeCheckCustomPrefix(v1, v2 *Node) bool {
1957
+	return checkCustomPrefix(v1.Spec.Annotations, v2.Spec.Annotations)
1958
+}
1959
+
1960
+func NodeCheckRole(v1, v2 *Node) bool {
1961
+	return v1.Role == v2.Role
1962
+}
1963
+
1964
+func NodeCheckMembership(v1, v2 *Node) bool {
1965
+	return v1.Spec.Membership == v2.Spec.Membership
1966
+}
1967
+
1968
+func ConvertNodeWatch(action WatchActionKind, filters []*SelectBy) ([]Event, error) {
1969
+	var (
1970
+		m             Node
1971
+		checkFuncs    []NodeCheckFunc
1972
+		hasRole       bool
1973
+		hasMembership bool
1974
+	)
1975
+
1976
+	for _, filter := range filters {
1977
+		switch v := filter.By.(type) {
1978
+		case *SelectBy_ID:
1979
+			if m.ID != "" {
1980
+				return nil, errConflictingFilters
1981
+			}
1982
+			m.ID = v.ID
1983
+			checkFuncs = append(checkFuncs, NodeCheckID)
1984
+		case *SelectBy_IDPrefix:
1985
+			if m.ID != "" {
1986
+				return nil, errConflictingFilters
1987
+			}
1988
+			m.ID = v.IDPrefix
1989
+			checkFuncs = append(checkFuncs, NodeCheckIDPrefix)
1990
+		case *SelectBy_Name:
1991
+			if m.Description != nil {
1992
+				return nil, errConflictingFilters
1993
+			}
1994
+			m.Description = &NodeDescription{Hostname: v.Name}
1995
+			checkFuncs = append(checkFuncs, NodeCheckName)
1996
+		case *SelectBy_NamePrefix:
1997
+			if m.Description != nil {
1998
+				return nil, errConflictingFilters
1999
+			}
2000
+			m.Description = &NodeDescription{Hostname: v.NamePrefix}
2001
+			checkFuncs = append(checkFuncs, NodeCheckNamePrefix)
2002
+		case *SelectBy_Custom:
2003
+			if len(m.Spec.Annotations.Indices) != 0 {
2004
+				return nil, errConflictingFilters
2005
+			}
2006
+			m.Spec.Annotations.Indices = []IndexEntry{{Key: v.Custom.Index, Val: v.Custom.Value}}
2007
+			checkFuncs = append(checkFuncs, NodeCheckCustom)
2008
+		case *SelectBy_CustomPrefix:
2009
+			if len(m.Spec.Annotations.Indices) != 0 {
2010
+				return nil, errConflictingFilters
2011
+			}
2012
+			m.Spec.Annotations.Indices = []IndexEntry{{Key: v.CustomPrefix.Index, Val: v.CustomPrefix.Value}}
2013
+			checkFuncs = append(checkFuncs, NodeCheckCustomPrefix)
2014
+		case *SelectBy_Role:
2015
+			if hasRole {
2016
+				return nil, errConflictingFilters
2017
+			}
2018
+			hasRole = true
2019
+			m.Role = v.Role
2020
+			checkFuncs = append(checkFuncs, NodeCheckRole)
2021
+		case *SelectBy_Membership:
2022
+			if hasMembership {
2023
+				return nil, errConflictingFilters
2024
+			}
2025
+			hasMembership = true
2026
+			m.Spec.Membership = v.Membership
2027
+			checkFuncs = append(checkFuncs, NodeCheckMembership)
2028
+		}
2029
+	}
2030
+	var events []Event
2031
+	if (action & WatchActionKindCreate) != 0 {
2032
+		events = append(events, EventCreateNode{Node: &m, Checks: checkFuncs})
2033
+	}
2034
+	if (action & WatchActionKindUpdate) != 0 {
2035
+		events = append(events, EventUpdateNode{Node: &m, Checks: checkFuncs})
2036
+	}
2037
+	if (action & WatchActionKindRemove) != 0 {
2038
+		events = append(events, EventDeleteNode{Node: &m, Checks: checkFuncs})
2039
+	}
2040
+	if len(events) == 0 {
2041
+		return nil, errUnrecognizedAction
2042
+	}
2043
+	return events, nil
2044
+}
2045
+
1926 2046
 type NodeIndexerByID struct{}
1927 2047
 
1928 2048
 func (indexer NodeIndexerByID) FromArgs(args ...interface{}) ([]byte, error) {
... ...
@@ -1985,8 +2106,9 @@ func (e EventCreateService) Matches(apiEvent github_com_docker_go_events.Event)
1985 1985
 }
1986 1986
 
1987 1987
 type EventUpdateService struct {
1988
-	Service *Service
1989
-	Checks  []ServiceCheckFunc
1988
+	Service    *Service
1989
+	OldService *Service
1990
+	Checks     []ServiceCheckFunc
1990 1991
 }
1991 1992
 
1992 1993
 func (e EventUpdateService) Matches(apiEvent github_com_docker_go_events.Event) bool {
... ...
@@ -2041,14 +2163,104 @@ func (m *Service) EventCreate() Event {
2041 2041
 	return EventCreateService{Service: m}
2042 2042
 }
2043 2043
 
2044
-func (m *Service) EventUpdate() Event {
2045
-	return EventUpdateService{Service: m}
2044
+func (m *Service) EventUpdate(oldObject StoreObject) Event {
2045
+	if oldObject != nil {
2046
+		return EventUpdateService{Service: m, OldService: oldObject.(*Service)}
2047
+	} else {
2048
+		return EventUpdateService{Service: m}
2049
+	}
2046 2050
 }
2047 2051
 
2048 2052
 func (m *Service) EventDelete() Event {
2049 2053
 	return EventDeleteService{Service: m}
2050 2054
 }
2051 2055
 
2056
+func ServiceCheckID(v1, v2 *Service) bool {
2057
+	return v1.ID == v2.ID
2058
+}
2059
+
2060
+func ServiceCheckIDPrefix(v1, v2 *Service) bool {
2061
+	return strings.HasPrefix(v2.ID, v1.ID)
2062
+}
2063
+
2064
+func ServiceCheckName(v1, v2 *Service) bool {
2065
+	return v1.Spec.Annotations.Name == v2.Spec.Annotations.Name
2066
+}
2067
+
2068
+func ServiceCheckNamePrefix(v1, v2 *Service) bool {
2069
+	return strings.HasPrefix(v2.Spec.Annotations.Name, v1.Spec.Annotations.Name)
2070
+}
2071
+
2072
+func ServiceCheckCustom(v1, v2 *Service) bool {
2073
+	return checkCustom(v1.Spec.Annotations, v2.Spec.Annotations)
2074
+}
2075
+
2076
+func ServiceCheckCustomPrefix(v1, v2 *Service) bool {
2077
+	return checkCustomPrefix(v1.Spec.Annotations, v2.Spec.Annotations)
2078
+}
2079
+
2080
+func ConvertServiceWatch(action WatchActionKind, filters []*SelectBy) ([]Event, error) {
2081
+	var (
2082
+		m          Service
2083
+		checkFuncs []ServiceCheckFunc
2084
+	)
2085
+
2086
+	for _, filter := range filters {
2087
+		switch v := filter.By.(type) {
2088
+		case *SelectBy_ID:
2089
+			if m.ID != "" {
2090
+				return nil, errConflictingFilters
2091
+			}
2092
+			m.ID = v.ID
2093
+			checkFuncs = append(checkFuncs, ServiceCheckID)
2094
+		case *SelectBy_IDPrefix:
2095
+			if m.ID != "" {
2096
+				return nil, errConflictingFilters
2097
+			}
2098
+			m.ID = v.IDPrefix
2099
+			checkFuncs = append(checkFuncs, ServiceCheckIDPrefix)
2100
+		case *SelectBy_Name:
2101
+			if m.Spec.Annotations.Name != "" {
2102
+				return nil, errConflictingFilters
2103
+			}
2104
+			m.Spec.Annotations.Name = v.Name
2105
+			checkFuncs = append(checkFuncs, ServiceCheckName)
2106
+		case *SelectBy_NamePrefix:
2107
+			if m.Spec.Annotations.Name != "" {
2108
+				return nil, errConflictingFilters
2109
+			}
2110
+			m.Spec.Annotations.Name = v.NamePrefix
2111
+			checkFuncs = append(checkFuncs, ServiceCheckNamePrefix)
2112
+		case *SelectBy_Custom:
2113
+			if len(m.Spec.Annotations.Indices) != 0 {
2114
+				return nil, errConflictingFilters
2115
+			}
2116
+			m.Spec.Annotations.Indices = []IndexEntry{{Key: v.Custom.Index, Val: v.Custom.Value}}
2117
+			checkFuncs = append(checkFuncs, ServiceCheckCustom)
2118
+		case *SelectBy_CustomPrefix:
2119
+			if len(m.Spec.Annotations.Indices) != 0 {
2120
+				return nil, errConflictingFilters
2121
+			}
2122
+			m.Spec.Annotations.Indices = []IndexEntry{{Key: v.CustomPrefix.Index, Val: v.CustomPrefix.Value}}
2123
+			checkFuncs = append(checkFuncs, ServiceCheckCustomPrefix)
2124
+		}
2125
+	}
2126
+	var events []Event
2127
+	if (action & WatchActionKindCreate) != 0 {
2128
+		events = append(events, EventCreateService{Service: &m, Checks: checkFuncs})
2129
+	}
2130
+	if (action & WatchActionKindUpdate) != 0 {
2131
+		events = append(events, EventUpdateService{Service: &m, Checks: checkFuncs})
2132
+	}
2133
+	if (action & WatchActionKindRemove) != 0 {
2134
+		events = append(events, EventDeleteService{Service: &m, Checks: checkFuncs})
2135
+	}
2136
+	if len(events) == 0 {
2137
+		return nil, errUnrecognizedAction
2138
+	}
2139
+	return events, nil
2140
+}
2141
+
2052 2142
 type ServiceIndexerByID struct{}
2053 2143
 
2054 2144
 func (indexer ServiceIndexerByID) FromArgs(args ...interface{}) ([]byte, error) {
... ...
@@ -2111,8 +2323,9 @@ func (e EventCreateTask) Matches(apiEvent github_com_docker_go_events.Event) boo
2111 2111
 }
2112 2112
 
2113 2113
 type EventUpdateTask struct {
2114
-	Task   *Task
2115
-	Checks []TaskCheckFunc
2114
+	Task    *Task
2115
+	OldTask *Task
2116
+	Checks  []TaskCheckFunc
2116 2117
 }
2117 2118
 
2118 2119
 func (e EventUpdateTask) Matches(apiEvent github_com_docker_go_events.Event) bool {
... ...
@@ -2167,14 +2380,147 @@ func (m *Task) EventCreate() Event {
2167 2167
 	return EventCreateTask{Task: m}
2168 2168
 }
2169 2169
 
2170
-func (m *Task) EventUpdate() Event {
2171
-	return EventUpdateTask{Task: m}
2170
+func (m *Task) EventUpdate(oldObject StoreObject) Event {
2171
+	if oldObject != nil {
2172
+		return EventUpdateTask{Task: m, OldTask: oldObject.(*Task)}
2173
+	} else {
2174
+		return EventUpdateTask{Task: m}
2175
+	}
2172 2176
 }
2173 2177
 
2174 2178
 func (m *Task) EventDelete() Event {
2175 2179
 	return EventDeleteTask{Task: m}
2176 2180
 }
2177 2181
 
2182
+func TaskCheckID(v1, v2 *Task) bool {
2183
+	return v1.ID == v2.ID
2184
+}
2185
+
2186
+func TaskCheckIDPrefix(v1, v2 *Task) bool {
2187
+	return strings.HasPrefix(v2.ID, v1.ID)
2188
+}
2189
+
2190
+func TaskCheckName(v1, v2 *Task) bool {
2191
+	return v1.Annotations.Name == v2.Annotations.Name
2192
+}
2193
+
2194
+func TaskCheckNamePrefix(v1, v2 *Task) bool {
2195
+	return strings.HasPrefix(v2.Annotations.Name, v1.Annotations.Name)
2196
+}
2197
+
2198
+func TaskCheckCustom(v1, v2 *Task) bool {
2199
+	return checkCustom(v1.Annotations, v2.Annotations)
2200
+}
2201
+
2202
+func TaskCheckCustomPrefix(v1, v2 *Task) bool {
2203
+	return checkCustomPrefix(v1.Annotations, v2.Annotations)
2204
+}
2205
+
2206
+func TaskCheckNodeID(v1, v2 *Task) bool {
2207
+	return v1.NodeID == v2.NodeID
2208
+}
2209
+
2210
+func TaskCheckServiceID(v1, v2 *Task) bool {
2211
+	return v1.ServiceID == v2.ServiceID
2212
+}
2213
+
2214
+func TaskCheckSlot(v1, v2 *Task) bool {
2215
+	return v1.Slot == v2.Slot
2216
+}
2217
+
2218
+func TaskCheckDesiredState(v1, v2 *Task) bool {
2219
+	return v1.DesiredState == v2.DesiredState
2220
+}
2221
+
2222
+func ConvertTaskWatch(action WatchActionKind, filters []*SelectBy) ([]Event, error) {
2223
+	var (
2224
+		m               Task
2225
+		checkFuncs      []TaskCheckFunc
2226
+		hasDesiredState bool
2227
+	)
2228
+
2229
+	for _, filter := range filters {
2230
+		switch v := filter.By.(type) {
2231
+		case *SelectBy_ID:
2232
+			if m.ID != "" {
2233
+				return nil, errConflictingFilters
2234
+			}
2235
+			m.ID = v.ID
2236
+			checkFuncs = append(checkFuncs, TaskCheckID)
2237
+		case *SelectBy_IDPrefix:
2238
+			if m.ID != "" {
2239
+				return nil, errConflictingFilters
2240
+			}
2241
+			m.ID = v.IDPrefix
2242
+			checkFuncs = append(checkFuncs, TaskCheckIDPrefix)
2243
+		case *SelectBy_Name:
2244
+			if m.Annotations.Name != "" {
2245
+				return nil, errConflictingFilters
2246
+			}
2247
+			m.Annotations.Name = v.Name
2248
+			checkFuncs = append(checkFuncs, TaskCheckName)
2249
+		case *SelectBy_NamePrefix:
2250
+			if m.Annotations.Name != "" {
2251
+				return nil, errConflictingFilters
2252
+			}
2253
+			m.Annotations.Name = v.NamePrefix
2254
+			checkFuncs = append(checkFuncs, TaskCheckNamePrefix)
2255
+		case *SelectBy_Custom:
2256
+			if len(m.Annotations.Indices) != 0 {
2257
+				return nil, errConflictingFilters
2258
+			}
2259
+			m.Annotations.Indices = []IndexEntry{{Key: v.Custom.Index, Val: v.Custom.Value}}
2260
+			checkFuncs = append(checkFuncs, TaskCheckCustom)
2261
+		case *SelectBy_CustomPrefix:
2262
+			if len(m.Annotations.Indices) != 0 {
2263
+				return nil, errConflictingFilters
2264
+			}
2265
+			m.Annotations.Indices = []IndexEntry{{Key: v.CustomPrefix.Index, Val: v.CustomPrefix.Value}}
2266
+			checkFuncs = append(checkFuncs, TaskCheckCustomPrefix)
2267
+		case *SelectBy_ServiceID:
2268
+			if m.ServiceID != "" {
2269
+				return nil, errConflictingFilters
2270
+			}
2271
+			m.ServiceID = v.ServiceID
2272
+			checkFuncs = append(checkFuncs, TaskCheckServiceID)
2273
+		case *SelectBy_NodeID:
2274
+			if m.NodeID != "" {
2275
+				return nil, errConflictingFilters
2276
+			}
2277
+			m.NodeID = v.NodeID
2278
+			checkFuncs = append(checkFuncs, TaskCheckNodeID)
2279
+		case *SelectBy_Slot:
2280
+			if m.Slot != 0 || m.ServiceID != "" {
2281
+				return nil, errConflictingFilters
2282
+			}
2283
+			m.ServiceID = v.Slot.ServiceID
2284
+			m.Slot = v.Slot.Slot
2285
+			checkFuncs = append(checkFuncs, TaskCheckNodeID, TaskCheckSlot)
2286
+		case *SelectBy_DesiredState:
2287
+			if hasDesiredState {
2288
+				return nil, errConflictingFilters
2289
+			}
2290
+			hasDesiredState = true
2291
+			m.DesiredState = v.DesiredState
2292
+			checkFuncs = append(checkFuncs, TaskCheckDesiredState)
2293
+		}
2294
+	}
2295
+	var events []Event
2296
+	if (action & WatchActionKindCreate) != 0 {
2297
+		events = append(events, EventCreateTask{Task: &m, Checks: checkFuncs})
2298
+	}
2299
+	if (action & WatchActionKindUpdate) != 0 {
2300
+		events = append(events, EventUpdateTask{Task: &m, Checks: checkFuncs})
2301
+	}
2302
+	if (action & WatchActionKindRemove) != 0 {
2303
+		events = append(events, EventDeleteTask{Task: &m, Checks: checkFuncs})
2304
+	}
2305
+	if len(events) == 0 {
2306
+		return nil, errUnrecognizedAction
2307
+	}
2308
+	return events, nil
2309
+}
2310
+
2178 2311
 type TaskIndexerByID struct{}
2179 2312
 
2180 2313
 func (indexer TaskIndexerByID) FromArgs(args ...interface{}) ([]byte, error) {
... ...
@@ -2237,8 +2583,9 @@ func (e EventCreateNetwork) Matches(apiEvent github_com_docker_go_events.Event)
2237 2237
 }
2238 2238
 
2239 2239
 type EventUpdateNetwork struct {
2240
-	Network *Network
2241
-	Checks  []NetworkCheckFunc
2240
+	Network    *Network
2241
+	OldNetwork *Network
2242
+	Checks     []NetworkCheckFunc
2242 2243
 }
2243 2244
 
2244 2245
 func (e EventUpdateNetwork) Matches(apiEvent github_com_docker_go_events.Event) bool {
... ...
@@ -2293,14 +2640,104 @@ func (m *Network) EventCreate() Event {
2293 2293
 	return EventCreateNetwork{Network: m}
2294 2294
 }
2295 2295
 
2296
-func (m *Network) EventUpdate() Event {
2297
-	return EventUpdateNetwork{Network: m}
2296
+func (m *Network) EventUpdate(oldObject StoreObject) Event {
2297
+	if oldObject != nil {
2298
+		return EventUpdateNetwork{Network: m, OldNetwork: oldObject.(*Network)}
2299
+	} else {
2300
+		return EventUpdateNetwork{Network: m}
2301
+	}
2298 2302
 }
2299 2303
 
2300 2304
 func (m *Network) EventDelete() Event {
2301 2305
 	return EventDeleteNetwork{Network: m}
2302 2306
 }
2303 2307
 
2308
+func NetworkCheckID(v1, v2 *Network) bool {
2309
+	return v1.ID == v2.ID
2310
+}
2311
+
2312
+func NetworkCheckIDPrefix(v1, v2 *Network) bool {
2313
+	return strings.HasPrefix(v2.ID, v1.ID)
2314
+}
2315
+
2316
+func NetworkCheckName(v1, v2 *Network) bool {
2317
+	return v1.Spec.Annotations.Name == v2.Spec.Annotations.Name
2318
+}
2319
+
2320
+func NetworkCheckNamePrefix(v1, v2 *Network) bool {
2321
+	return strings.HasPrefix(v2.Spec.Annotations.Name, v1.Spec.Annotations.Name)
2322
+}
2323
+
2324
+func NetworkCheckCustom(v1, v2 *Network) bool {
2325
+	return checkCustom(v1.Spec.Annotations, v2.Spec.Annotations)
2326
+}
2327
+
2328
+func NetworkCheckCustomPrefix(v1, v2 *Network) bool {
2329
+	return checkCustomPrefix(v1.Spec.Annotations, v2.Spec.Annotations)
2330
+}
2331
+
2332
+func ConvertNetworkWatch(action WatchActionKind, filters []*SelectBy) ([]Event, error) {
2333
+	var (
2334
+		m          Network
2335
+		checkFuncs []NetworkCheckFunc
2336
+	)
2337
+
2338
+	for _, filter := range filters {
2339
+		switch v := filter.By.(type) {
2340
+		case *SelectBy_ID:
2341
+			if m.ID != "" {
2342
+				return nil, errConflictingFilters
2343
+			}
2344
+			m.ID = v.ID
2345
+			checkFuncs = append(checkFuncs, NetworkCheckID)
2346
+		case *SelectBy_IDPrefix:
2347
+			if m.ID != "" {
2348
+				return nil, errConflictingFilters
2349
+			}
2350
+			m.ID = v.IDPrefix
2351
+			checkFuncs = append(checkFuncs, NetworkCheckIDPrefix)
2352
+		case *SelectBy_Name:
2353
+			if m.Spec.Annotations.Name != "" {
2354
+				return nil, errConflictingFilters
2355
+			}
2356
+			m.Spec.Annotations.Name = v.Name
2357
+			checkFuncs = append(checkFuncs, NetworkCheckName)
2358
+		case *SelectBy_NamePrefix:
2359
+			if m.Spec.Annotations.Name != "" {
2360
+				return nil, errConflictingFilters
2361
+			}
2362
+			m.Spec.Annotations.Name = v.NamePrefix
2363
+			checkFuncs = append(checkFuncs, NetworkCheckNamePrefix)
2364
+		case *SelectBy_Custom:
2365
+			if len(m.Spec.Annotations.Indices) != 0 {
2366
+				return nil, errConflictingFilters
2367
+			}
2368
+			m.Spec.Annotations.Indices = []IndexEntry{{Key: v.Custom.Index, Val: v.Custom.Value}}
2369
+			checkFuncs = append(checkFuncs, NetworkCheckCustom)
2370
+		case *SelectBy_CustomPrefix:
2371
+			if len(m.Spec.Annotations.Indices) != 0 {
2372
+				return nil, errConflictingFilters
2373
+			}
2374
+			m.Spec.Annotations.Indices = []IndexEntry{{Key: v.CustomPrefix.Index, Val: v.CustomPrefix.Value}}
2375
+			checkFuncs = append(checkFuncs, NetworkCheckCustomPrefix)
2376
+		}
2377
+	}
2378
+	var events []Event
2379
+	if (action & WatchActionKindCreate) != 0 {
2380
+		events = append(events, EventCreateNetwork{Network: &m, Checks: checkFuncs})
2381
+	}
2382
+	if (action & WatchActionKindUpdate) != 0 {
2383
+		events = append(events, EventUpdateNetwork{Network: &m, Checks: checkFuncs})
2384
+	}
2385
+	if (action & WatchActionKindRemove) != 0 {
2386
+		events = append(events, EventDeleteNetwork{Network: &m, Checks: checkFuncs})
2387
+	}
2388
+	if len(events) == 0 {
2389
+		return nil, errUnrecognizedAction
2390
+	}
2391
+	return events, nil
2392
+}
2393
+
2304 2394
 type NetworkIndexerByID struct{}
2305 2395
 
2306 2396
 func (indexer NetworkIndexerByID) FromArgs(args ...interface{}) ([]byte, error) {
... ...
@@ -2363,8 +2800,9 @@ func (e EventCreateCluster) Matches(apiEvent github_com_docker_go_events.Event)
2363 2363
 }
2364 2364
 
2365 2365
 type EventUpdateCluster struct {
2366
-	Cluster *Cluster
2367
-	Checks  []ClusterCheckFunc
2366
+	Cluster    *Cluster
2367
+	OldCluster *Cluster
2368
+	Checks     []ClusterCheckFunc
2368 2369
 }
2369 2370
 
2370 2371
 func (e EventUpdateCluster) Matches(apiEvent github_com_docker_go_events.Event) bool {
... ...
@@ -2419,14 +2857,104 @@ func (m *Cluster) EventCreate() Event {
2419 2419
 	return EventCreateCluster{Cluster: m}
2420 2420
 }
2421 2421
 
2422
-func (m *Cluster) EventUpdate() Event {
2423
-	return EventUpdateCluster{Cluster: m}
2422
+func (m *Cluster) EventUpdate(oldObject StoreObject) Event {
2423
+	if oldObject != nil {
2424
+		return EventUpdateCluster{Cluster: m, OldCluster: oldObject.(*Cluster)}
2425
+	} else {
2426
+		return EventUpdateCluster{Cluster: m}
2427
+	}
2424 2428
 }
2425 2429
 
2426 2430
 func (m *Cluster) EventDelete() Event {
2427 2431
 	return EventDeleteCluster{Cluster: m}
2428 2432
 }
2429 2433
 
2434
+func ClusterCheckID(v1, v2 *Cluster) bool {
2435
+	return v1.ID == v2.ID
2436
+}
2437
+
2438
+func ClusterCheckIDPrefix(v1, v2 *Cluster) bool {
2439
+	return strings.HasPrefix(v2.ID, v1.ID)
2440
+}
2441
+
2442
+func ClusterCheckName(v1, v2 *Cluster) bool {
2443
+	return v1.Spec.Annotations.Name == v2.Spec.Annotations.Name
2444
+}
2445
+
2446
+func ClusterCheckNamePrefix(v1, v2 *Cluster) bool {
2447
+	return strings.HasPrefix(v2.Spec.Annotations.Name, v1.Spec.Annotations.Name)
2448
+}
2449
+
2450
+func ClusterCheckCustom(v1, v2 *Cluster) bool {
2451
+	return checkCustom(v1.Spec.Annotations, v2.Spec.Annotations)
2452
+}
2453
+
2454
+func ClusterCheckCustomPrefix(v1, v2 *Cluster) bool {
2455
+	return checkCustomPrefix(v1.Spec.Annotations, v2.Spec.Annotations)
2456
+}
2457
+
2458
+func ConvertClusterWatch(action WatchActionKind, filters []*SelectBy) ([]Event, error) {
2459
+	var (
2460
+		m          Cluster
2461
+		checkFuncs []ClusterCheckFunc
2462
+	)
2463
+
2464
+	for _, filter := range filters {
2465
+		switch v := filter.By.(type) {
2466
+		case *SelectBy_ID:
2467
+			if m.ID != "" {
2468
+				return nil, errConflictingFilters
2469
+			}
2470
+			m.ID = v.ID
2471
+			checkFuncs = append(checkFuncs, ClusterCheckID)
2472
+		case *SelectBy_IDPrefix:
2473
+			if m.ID != "" {
2474
+				return nil, errConflictingFilters
2475
+			}
2476
+			m.ID = v.IDPrefix
2477
+			checkFuncs = append(checkFuncs, ClusterCheckIDPrefix)
2478
+		case *SelectBy_Name:
2479
+			if m.Spec.Annotations.Name != "" {
2480
+				return nil, errConflictingFilters
2481
+			}
2482
+			m.Spec.Annotations.Name = v.Name
2483
+			checkFuncs = append(checkFuncs, ClusterCheckName)
2484
+		case *SelectBy_NamePrefix:
2485
+			if m.Spec.Annotations.Name != "" {
2486
+				return nil, errConflictingFilters
2487
+			}
2488
+			m.Spec.Annotations.Name = v.NamePrefix
2489
+			checkFuncs = append(checkFuncs, ClusterCheckNamePrefix)
2490
+		case *SelectBy_Custom:
2491
+			if len(m.Spec.Annotations.Indices) != 0 {
2492
+				return nil, errConflictingFilters
2493
+			}
2494
+			m.Spec.Annotations.Indices = []IndexEntry{{Key: v.Custom.Index, Val: v.Custom.Value}}
2495
+			checkFuncs = append(checkFuncs, ClusterCheckCustom)
2496
+		case *SelectBy_CustomPrefix:
2497
+			if len(m.Spec.Annotations.Indices) != 0 {
2498
+				return nil, errConflictingFilters
2499
+			}
2500
+			m.Spec.Annotations.Indices = []IndexEntry{{Key: v.CustomPrefix.Index, Val: v.CustomPrefix.Value}}
2501
+			checkFuncs = append(checkFuncs, ClusterCheckCustomPrefix)
2502
+		}
2503
+	}
2504
+	var events []Event
2505
+	if (action & WatchActionKindCreate) != 0 {
2506
+		events = append(events, EventCreateCluster{Cluster: &m, Checks: checkFuncs})
2507
+	}
2508
+	if (action & WatchActionKindUpdate) != 0 {
2509
+		events = append(events, EventUpdateCluster{Cluster: &m, Checks: checkFuncs})
2510
+	}
2511
+	if (action & WatchActionKindRemove) != 0 {
2512
+		events = append(events, EventDeleteCluster{Cluster: &m, Checks: checkFuncs})
2513
+	}
2514
+	if len(events) == 0 {
2515
+		return nil, errUnrecognizedAction
2516
+	}
2517
+	return events, nil
2518
+}
2519
+
2430 2520
 type ClusterIndexerByID struct{}
2431 2521
 
2432 2522
 func (indexer ClusterIndexerByID) FromArgs(args ...interface{}) ([]byte, error) {
... ...
@@ -2489,8 +3017,9 @@ func (e EventCreateSecret) Matches(apiEvent github_com_docker_go_events.Event) b
2489 2489
 }
2490 2490
 
2491 2491
 type EventUpdateSecret struct {
2492
-	Secret *Secret
2493
-	Checks []SecretCheckFunc
2492
+	Secret    *Secret
2493
+	OldSecret *Secret
2494
+	Checks    []SecretCheckFunc
2494 2495
 }
2495 2496
 
2496 2497
 func (e EventUpdateSecret) Matches(apiEvent github_com_docker_go_events.Event) bool {
... ...
@@ -2545,14 +3074,104 @@ func (m *Secret) EventCreate() Event {
2545 2545
 	return EventCreateSecret{Secret: m}
2546 2546
 }
2547 2547
 
2548
-func (m *Secret) EventUpdate() Event {
2549
-	return EventUpdateSecret{Secret: m}
2548
+func (m *Secret) EventUpdate(oldObject StoreObject) Event {
2549
+	if oldObject != nil {
2550
+		return EventUpdateSecret{Secret: m, OldSecret: oldObject.(*Secret)}
2551
+	} else {
2552
+		return EventUpdateSecret{Secret: m}
2553
+	}
2550 2554
 }
2551 2555
 
2552 2556
 func (m *Secret) EventDelete() Event {
2553 2557
 	return EventDeleteSecret{Secret: m}
2554 2558
 }
2555 2559
 
2560
+func SecretCheckID(v1, v2 *Secret) bool {
2561
+	return v1.ID == v2.ID
2562
+}
2563
+
2564
+func SecretCheckIDPrefix(v1, v2 *Secret) bool {
2565
+	return strings.HasPrefix(v2.ID, v1.ID)
2566
+}
2567
+
2568
+func SecretCheckName(v1, v2 *Secret) bool {
2569
+	return v1.Spec.Annotations.Name == v2.Spec.Annotations.Name
2570
+}
2571
+
2572
+func SecretCheckNamePrefix(v1, v2 *Secret) bool {
2573
+	return strings.HasPrefix(v2.Spec.Annotations.Name, v1.Spec.Annotations.Name)
2574
+}
2575
+
2576
+func SecretCheckCustom(v1, v2 *Secret) bool {
2577
+	return checkCustom(v1.Spec.Annotations, v2.Spec.Annotations)
2578
+}
2579
+
2580
+func SecretCheckCustomPrefix(v1, v2 *Secret) bool {
2581
+	return checkCustomPrefix(v1.Spec.Annotations, v2.Spec.Annotations)
2582
+}
2583
+
2584
+func ConvertSecretWatch(action WatchActionKind, filters []*SelectBy) ([]Event, error) {
2585
+	var (
2586
+		m          Secret
2587
+		checkFuncs []SecretCheckFunc
2588
+	)
2589
+
2590
+	for _, filter := range filters {
2591
+		switch v := filter.By.(type) {
2592
+		case *SelectBy_ID:
2593
+			if m.ID != "" {
2594
+				return nil, errConflictingFilters
2595
+			}
2596
+			m.ID = v.ID
2597
+			checkFuncs = append(checkFuncs, SecretCheckID)
2598
+		case *SelectBy_IDPrefix:
2599
+			if m.ID != "" {
2600
+				return nil, errConflictingFilters
2601
+			}
2602
+			m.ID = v.IDPrefix
2603
+			checkFuncs = append(checkFuncs, SecretCheckIDPrefix)
2604
+		case *SelectBy_Name:
2605
+			if m.Spec.Annotations.Name != "" {
2606
+				return nil, errConflictingFilters
2607
+			}
2608
+			m.Spec.Annotations.Name = v.Name
2609
+			checkFuncs = append(checkFuncs, SecretCheckName)
2610
+		case *SelectBy_NamePrefix:
2611
+			if m.Spec.Annotations.Name != "" {
2612
+				return nil, errConflictingFilters
2613
+			}
2614
+			m.Spec.Annotations.Name = v.NamePrefix
2615
+			checkFuncs = append(checkFuncs, SecretCheckNamePrefix)
2616
+		case *SelectBy_Custom:
2617
+			if len(m.Spec.Annotations.Indices) != 0 {
2618
+				return nil, errConflictingFilters
2619
+			}
2620
+			m.Spec.Annotations.Indices = []IndexEntry{{Key: v.Custom.Index, Val: v.Custom.Value}}
2621
+			checkFuncs = append(checkFuncs, SecretCheckCustom)
2622
+		case *SelectBy_CustomPrefix:
2623
+			if len(m.Spec.Annotations.Indices) != 0 {
2624
+				return nil, errConflictingFilters
2625
+			}
2626
+			m.Spec.Annotations.Indices = []IndexEntry{{Key: v.CustomPrefix.Index, Val: v.CustomPrefix.Value}}
2627
+			checkFuncs = append(checkFuncs, SecretCheckCustomPrefix)
2628
+		}
2629
+	}
2630
+	var events []Event
2631
+	if (action & WatchActionKindCreate) != 0 {
2632
+		events = append(events, EventCreateSecret{Secret: &m, Checks: checkFuncs})
2633
+	}
2634
+	if (action & WatchActionKindUpdate) != 0 {
2635
+		events = append(events, EventUpdateSecret{Secret: &m, Checks: checkFuncs})
2636
+	}
2637
+	if (action & WatchActionKindRemove) != 0 {
2638
+		events = append(events, EventDeleteSecret{Secret: &m, Checks: checkFuncs})
2639
+	}
2640
+	if len(events) == 0 {
2641
+		return nil, errUnrecognizedAction
2642
+	}
2643
+	return events, nil
2644
+}
2645
+
2556 2646
 type SecretIndexerByID struct{}
2557 2647
 
2558 2648
 func (indexer SecretIndexerByID) FromArgs(args ...interface{}) ([]byte, error) {
... ...
@@ -2615,8 +3234,9 @@ func (e EventCreateResource) Matches(apiEvent github_com_docker_go_events.Event)
2615 2615
 }
2616 2616
 
2617 2617
 type EventUpdateResource struct {
2618
-	Resource *Resource
2619
-	Checks   []ResourceCheckFunc
2618
+	Resource    *Resource
2619
+	OldResource *Resource
2620
+	Checks      []ResourceCheckFunc
2620 2621
 }
2621 2622
 
2622 2623
 func (e EventUpdateResource) Matches(apiEvent github_com_docker_go_events.Event) bool {
... ...
@@ -2671,14 +3291,110 @@ func (m *Resource) EventCreate() Event {
2671 2671
 	return EventCreateResource{Resource: m}
2672 2672
 }
2673 2673
 
2674
-func (m *Resource) EventUpdate() Event {
2675
-	return EventUpdateResource{Resource: m}
2674
+func (m *Resource) EventUpdate(oldObject StoreObject) Event {
2675
+	if oldObject != nil {
2676
+		return EventUpdateResource{Resource: m, OldResource: oldObject.(*Resource)}
2677
+	} else {
2678
+		return EventUpdateResource{Resource: m}
2679
+	}
2676 2680
 }
2677 2681
 
2678 2682
 func (m *Resource) EventDelete() Event {
2679 2683
 	return EventDeleteResource{Resource: m}
2680 2684
 }
2681 2685
 
2686
+func ResourceCheckID(v1, v2 *Resource) bool {
2687
+	return v1.ID == v2.ID
2688
+}
2689
+
2690
+func ResourceCheckIDPrefix(v1, v2 *Resource) bool {
2691
+	return strings.HasPrefix(v2.ID, v1.ID)
2692
+}
2693
+
2694
+func ResourceCheckName(v1, v2 *Resource) bool {
2695
+	return v1.Annotations.Name == v2.Annotations.Name
2696
+}
2697
+
2698
+func ResourceCheckNamePrefix(v1, v2 *Resource) bool {
2699
+	return strings.HasPrefix(v2.Annotations.Name, v1.Annotations.Name)
2700
+}
2701
+
2702
+func ResourceCheckCustom(v1, v2 *Resource) bool {
2703
+	return checkCustom(v1.Annotations, v2.Annotations)
2704
+}
2705
+
2706
+func ResourceCheckCustomPrefix(v1, v2 *Resource) bool {
2707
+	return checkCustomPrefix(v1.Annotations, v2.Annotations)
2708
+}
2709
+
2710
+func ResourceCheckKind(v1, v2 *Resource) bool {
2711
+	return v1.Kind == v2.Kind
2712
+}
2713
+
2714
+func ConvertResourceWatch(action WatchActionKind, filters []*SelectBy, kind string) ([]Event, error) {
2715
+	var (
2716
+		m          Resource
2717
+		checkFuncs []ResourceCheckFunc
2718
+	)
2719
+	m.Kind = kind
2720
+	checkFuncs = append(checkFuncs, ResourceCheckKind)
2721
+
2722
+	for _, filter := range filters {
2723
+		switch v := filter.By.(type) {
2724
+		case *SelectBy_ID:
2725
+			if m.ID != "" {
2726
+				return nil, errConflictingFilters
2727
+			}
2728
+			m.ID = v.ID
2729
+			checkFuncs = append(checkFuncs, ResourceCheckID)
2730
+		case *SelectBy_IDPrefix:
2731
+			if m.ID != "" {
2732
+				return nil, errConflictingFilters
2733
+			}
2734
+			m.ID = v.IDPrefix
2735
+			checkFuncs = append(checkFuncs, ResourceCheckIDPrefix)
2736
+		case *SelectBy_Name:
2737
+			if m.Annotations.Name != "" {
2738
+				return nil, errConflictingFilters
2739
+			}
2740
+			m.Annotations.Name = v.Name
2741
+			checkFuncs = append(checkFuncs, ResourceCheckName)
2742
+		case *SelectBy_NamePrefix:
2743
+			if m.Annotations.Name != "" {
2744
+				return nil, errConflictingFilters
2745
+			}
2746
+			m.Annotations.Name = v.NamePrefix
2747
+			checkFuncs = append(checkFuncs, ResourceCheckNamePrefix)
2748
+		case *SelectBy_Custom:
2749
+			if len(m.Annotations.Indices) != 0 {
2750
+				return nil, errConflictingFilters
2751
+			}
2752
+			m.Annotations.Indices = []IndexEntry{{Key: v.Custom.Index, Val: v.Custom.Value}}
2753
+			checkFuncs = append(checkFuncs, ResourceCheckCustom)
2754
+		case *SelectBy_CustomPrefix:
2755
+			if len(m.Annotations.Indices) != 0 {
2756
+				return nil, errConflictingFilters
2757
+			}
2758
+			m.Annotations.Indices = []IndexEntry{{Key: v.CustomPrefix.Index, Val: v.CustomPrefix.Value}}
2759
+			checkFuncs = append(checkFuncs, ResourceCheckCustomPrefix)
2760
+		}
2761
+	}
2762
+	var events []Event
2763
+	if (action & WatchActionKindCreate) != 0 {
2764
+		events = append(events, EventCreateResource{Resource: &m, Checks: checkFuncs})
2765
+	}
2766
+	if (action & WatchActionKindUpdate) != 0 {
2767
+		events = append(events, EventUpdateResource{Resource: &m, Checks: checkFuncs})
2768
+	}
2769
+	if (action & WatchActionKindRemove) != 0 {
2770
+		events = append(events, EventDeleteResource{Resource: &m, Checks: checkFuncs})
2771
+	}
2772
+	if len(events) == 0 {
2773
+		return nil, errUnrecognizedAction
2774
+	}
2775
+	return events, nil
2776
+}
2777
+
2682 2778
 type ResourceIndexerByID struct{}
2683 2779
 
2684 2780
 func (indexer ResourceIndexerByID) FromArgs(args ...interface{}) ([]byte, error) {
... ...
@@ -2741,8 +3457,9 @@ func (e EventCreateExtension) Matches(apiEvent github_com_docker_go_events.Event
2741 2741
 }
2742 2742
 
2743 2743
 type EventUpdateExtension struct {
2744
-	Extension *Extension
2745
-	Checks    []ExtensionCheckFunc
2744
+	Extension    *Extension
2745
+	OldExtension *Extension
2746
+	Checks       []ExtensionCheckFunc
2746 2747
 }
2747 2748
 
2748 2749
 func (e EventUpdateExtension) Matches(apiEvent github_com_docker_go_events.Event) bool {
... ...
@@ -2797,14 +3514,104 @@ func (m *Extension) EventCreate() Event {
2797 2797
 	return EventCreateExtension{Extension: m}
2798 2798
 }
2799 2799
 
2800
-func (m *Extension) EventUpdate() Event {
2801
-	return EventUpdateExtension{Extension: m}
2800
+func (m *Extension) EventUpdate(oldObject StoreObject) Event {
2801
+	if oldObject != nil {
2802
+		return EventUpdateExtension{Extension: m, OldExtension: oldObject.(*Extension)}
2803
+	} else {
2804
+		return EventUpdateExtension{Extension: m}
2805
+	}
2802 2806
 }
2803 2807
 
2804 2808
 func (m *Extension) EventDelete() Event {
2805 2809
 	return EventDeleteExtension{Extension: m}
2806 2810
 }
2807 2811
 
2812
+func ExtensionCheckID(v1, v2 *Extension) bool {
2813
+	return v1.ID == v2.ID
2814
+}
2815
+
2816
+func ExtensionCheckIDPrefix(v1, v2 *Extension) bool {
2817
+	return strings.HasPrefix(v2.ID, v1.ID)
2818
+}
2819
+
2820
+func ExtensionCheckName(v1, v2 *Extension) bool {
2821
+	return v1.Annotations.Name == v2.Annotations.Name
2822
+}
2823
+
2824
+func ExtensionCheckNamePrefix(v1, v2 *Extension) bool {
2825
+	return strings.HasPrefix(v2.Annotations.Name, v1.Annotations.Name)
2826
+}
2827
+
2828
+func ExtensionCheckCustom(v1, v2 *Extension) bool {
2829
+	return checkCustom(v1.Annotations, v2.Annotations)
2830
+}
2831
+
2832
+func ExtensionCheckCustomPrefix(v1, v2 *Extension) bool {
2833
+	return checkCustomPrefix(v1.Annotations, v2.Annotations)
2834
+}
2835
+
2836
+func ConvertExtensionWatch(action WatchActionKind, filters []*SelectBy) ([]Event, error) {
2837
+	var (
2838
+		m          Extension
2839
+		checkFuncs []ExtensionCheckFunc
2840
+	)
2841
+
2842
+	for _, filter := range filters {
2843
+		switch v := filter.By.(type) {
2844
+		case *SelectBy_ID:
2845
+			if m.ID != "" {
2846
+				return nil, errConflictingFilters
2847
+			}
2848
+			m.ID = v.ID
2849
+			checkFuncs = append(checkFuncs, ExtensionCheckID)
2850
+		case *SelectBy_IDPrefix:
2851
+			if m.ID != "" {
2852
+				return nil, errConflictingFilters
2853
+			}
2854
+			m.ID = v.IDPrefix
2855
+			checkFuncs = append(checkFuncs, ExtensionCheckIDPrefix)
2856
+		case *SelectBy_Name:
2857
+			if m.Annotations.Name != "" {
2858
+				return nil, errConflictingFilters
2859
+			}
2860
+			m.Annotations.Name = v.Name
2861
+			checkFuncs = append(checkFuncs, ExtensionCheckName)
2862
+		case *SelectBy_NamePrefix:
2863
+			if m.Annotations.Name != "" {
2864
+				return nil, errConflictingFilters
2865
+			}
2866
+			m.Annotations.Name = v.NamePrefix
2867
+			checkFuncs = append(checkFuncs, ExtensionCheckNamePrefix)
2868
+		case *SelectBy_Custom:
2869
+			if len(m.Annotations.Indices) != 0 {
2870
+				return nil, errConflictingFilters
2871
+			}
2872
+			m.Annotations.Indices = []IndexEntry{{Key: v.Custom.Index, Val: v.Custom.Value}}
2873
+			checkFuncs = append(checkFuncs, ExtensionCheckCustom)
2874
+		case *SelectBy_CustomPrefix:
2875
+			if len(m.Annotations.Indices) != 0 {
2876
+				return nil, errConflictingFilters
2877
+			}
2878
+			m.Annotations.Indices = []IndexEntry{{Key: v.CustomPrefix.Index, Val: v.CustomPrefix.Value}}
2879
+			checkFuncs = append(checkFuncs, ExtensionCheckCustomPrefix)
2880
+		}
2881
+	}
2882
+	var events []Event
2883
+	if (action & WatchActionKindCreate) != 0 {
2884
+		events = append(events, EventCreateExtension{Extension: &m, Checks: checkFuncs})
2885
+	}
2886
+	if (action & WatchActionKindUpdate) != 0 {
2887
+		events = append(events, EventUpdateExtension{Extension: &m, Checks: checkFuncs})
2888
+	}
2889
+	if (action & WatchActionKindRemove) != 0 {
2890
+		events = append(events, EventDeleteExtension{Extension: &m, Checks: checkFuncs})
2891
+	}
2892
+	if len(events) == 0 {
2893
+		return nil, errUnrecognizedAction
2894
+	}
2895
+	return events, nil
2896
+}
2897
+
2808 2898
 type ExtensionIndexerByID struct{}
2809 2899
 
2810 2900
 func (indexer ExtensionIndexerByID) FromArgs(args ...interface{}) ([]byte, error) {
... ...
@@ -2925,6 +3732,235 @@ func NewStoreAction(c Event) (StoreAction, error) {
2925 2925
 	return sa, nil
2926 2926
 }
2927 2927
 
2928
+func EventFromStoreAction(sa StoreAction, oldObject StoreObject) (Event, error) {
2929
+	switch v := sa.Target.(type) {
2930
+	case *StoreAction_Node:
2931
+		switch sa.Action {
2932
+		case StoreActionKindCreate:
2933
+			return EventCreateNode{Node: v.Node}, nil
2934
+		case StoreActionKindUpdate:
2935
+			if oldObject != nil {
2936
+				return EventUpdateNode{Node: v.Node, OldNode: oldObject.(*Node)}, nil
2937
+			} else {
2938
+				return EventUpdateNode{Node: v.Node}, nil
2939
+			}
2940
+		case StoreActionKindRemove:
2941
+			return EventDeleteNode{Node: v.Node}, nil
2942
+		}
2943
+	case *StoreAction_Service:
2944
+		switch sa.Action {
2945
+		case StoreActionKindCreate:
2946
+			return EventCreateService{Service: v.Service}, nil
2947
+		case StoreActionKindUpdate:
2948
+			if oldObject != nil {
2949
+				return EventUpdateService{Service: v.Service, OldService: oldObject.(*Service)}, nil
2950
+			} else {
2951
+				return EventUpdateService{Service: v.Service}, nil
2952
+			}
2953
+		case StoreActionKindRemove:
2954
+			return EventDeleteService{Service: v.Service}, nil
2955
+		}
2956
+	case *StoreAction_Task:
2957
+		switch sa.Action {
2958
+		case StoreActionKindCreate:
2959
+			return EventCreateTask{Task: v.Task}, nil
2960
+		case StoreActionKindUpdate:
2961
+			if oldObject != nil {
2962
+				return EventUpdateTask{Task: v.Task, OldTask: oldObject.(*Task)}, nil
2963
+			} else {
2964
+				return EventUpdateTask{Task: v.Task}, nil
2965
+			}
2966
+		case StoreActionKindRemove:
2967
+			return EventDeleteTask{Task: v.Task}, nil
2968
+		}
2969
+	case *StoreAction_Network:
2970
+		switch sa.Action {
2971
+		case StoreActionKindCreate:
2972
+			return EventCreateNetwork{Network: v.Network}, nil
2973
+		case StoreActionKindUpdate:
2974
+			if oldObject != nil {
2975
+				return EventUpdateNetwork{Network: v.Network, OldNetwork: oldObject.(*Network)}, nil
2976
+			} else {
2977
+				return EventUpdateNetwork{Network: v.Network}, nil
2978
+			}
2979
+		case StoreActionKindRemove:
2980
+			return EventDeleteNetwork{Network: v.Network}, nil
2981
+		}
2982
+	case *StoreAction_Cluster:
2983
+		switch sa.Action {
2984
+		case StoreActionKindCreate:
2985
+			return EventCreateCluster{Cluster: v.Cluster}, nil
2986
+		case StoreActionKindUpdate:
2987
+			if oldObject != nil {
2988
+				return EventUpdateCluster{Cluster: v.Cluster, OldCluster: oldObject.(*Cluster)}, nil
2989
+			} else {
2990
+				return EventUpdateCluster{Cluster: v.Cluster}, nil
2991
+			}
2992
+		case StoreActionKindRemove:
2993
+			return EventDeleteCluster{Cluster: v.Cluster}, nil
2994
+		}
2995
+	case *StoreAction_Secret:
2996
+		switch sa.Action {
2997
+		case StoreActionKindCreate:
2998
+			return EventCreateSecret{Secret: v.Secret}, nil
2999
+		case StoreActionKindUpdate:
3000
+			if oldObject != nil {
3001
+				return EventUpdateSecret{Secret: v.Secret, OldSecret: oldObject.(*Secret)}, nil
3002
+			} else {
3003
+				return EventUpdateSecret{Secret: v.Secret}, nil
3004
+			}
3005
+		case StoreActionKindRemove:
3006
+			return EventDeleteSecret{Secret: v.Secret}, nil
3007
+		}
3008
+	case *StoreAction_Resource:
3009
+		switch sa.Action {
3010
+		case StoreActionKindCreate:
3011
+			return EventCreateResource{Resource: v.Resource}, nil
3012
+		case StoreActionKindUpdate:
3013
+			if oldObject != nil {
3014
+				return EventUpdateResource{Resource: v.Resource, OldResource: oldObject.(*Resource)}, nil
3015
+			} else {
3016
+				return EventUpdateResource{Resource: v.Resource}, nil
3017
+			}
3018
+		case StoreActionKindRemove:
3019
+			return EventDeleteResource{Resource: v.Resource}, nil
3020
+		}
3021
+	case *StoreAction_Extension:
3022
+		switch sa.Action {
3023
+		case StoreActionKindCreate:
3024
+			return EventCreateExtension{Extension: v.Extension}, nil
3025
+		case StoreActionKindUpdate:
3026
+			if oldObject != nil {
3027
+				return EventUpdateExtension{Extension: v.Extension, OldExtension: oldObject.(*Extension)}, nil
3028
+			} else {
3029
+				return EventUpdateExtension{Extension: v.Extension}, nil
3030
+			}
3031
+		case StoreActionKindRemove:
3032
+			return EventDeleteExtension{Extension: v.Extension}, nil
3033
+		}
3034
+	}
3035
+	return nil, errUnknownStoreAction
3036
+}
3037
+
3038
+func WatchMessageEvent(c Event) *WatchMessage_Event {
3039
+	switch v := c.(type) {
3040
+	case EventCreateNode:
3041
+		return &WatchMessage_Event{Action: WatchActionKindCreate, Object: &Object{Object: &Object_Node{Node: v.Node}}}
3042
+	case EventUpdateNode:
3043
+		if v.OldNode != nil {
3044
+			return &WatchMessage_Event{Action: WatchActionKindUpdate, Object: &Object{Object: &Object_Node{Node: v.Node}}, OldObject: &Object{Object: &Object_Node{Node: v.OldNode}}}
3045
+		} else {
3046
+			return &WatchMessage_Event{Action: WatchActionKindUpdate, Object: &Object{Object: &Object_Node{Node: v.Node}}}
3047
+		}
3048
+	case EventDeleteNode:
3049
+		return &WatchMessage_Event{Action: WatchActionKindRemove, Object: &Object{Object: &Object_Node{Node: v.Node}}}
3050
+	case EventCreateService:
3051
+		return &WatchMessage_Event{Action: WatchActionKindCreate, Object: &Object{Object: &Object_Service{Service: v.Service}}}
3052
+	case EventUpdateService:
3053
+		if v.OldService != nil {
3054
+			return &WatchMessage_Event{Action: WatchActionKindUpdate, Object: &Object{Object: &Object_Service{Service: v.Service}}, OldObject: &Object{Object: &Object_Service{Service: v.OldService}}}
3055
+		} else {
3056
+			return &WatchMessage_Event{Action: WatchActionKindUpdate, Object: &Object{Object: &Object_Service{Service: v.Service}}}
3057
+		}
3058
+	case EventDeleteService:
3059
+		return &WatchMessage_Event{Action: WatchActionKindRemove, Object: &Object{Object: &Object_Service{Service: v.Service}}}
3060
+	case EventCreateTask:
3061
+		return &WatchMessage_Event{Action: WatchActionKindCreate, Object: &Object{Object: &Object_Task{Task: v.Task}}}
3062
+	case EventUpdateTask:
3063
+		if v.OldTask != nil {
3064
+			return &WatchMessage_Event{Action: WatchActionKindUpdate, Object: &Object{Object: &Object_Task{Task: v.Task}}, OldObject: &Object{Object: &Object_Task{Task: v.OldTask}}}
3065
+		} else {
3066
+			return &WatchMessage_Event{Action: WatchActionKindUpdate, Object: &Object{Object: &Object_Task{Task: v.Task}}}
3067
+		}
3068
+	case EventDeleteTask:
3069
+		return &WatchMessage_Event{Action: WatchActionKindRemove, Object: &Object{Object: &Object_Task{Task: v.Task}}}
3070
+	case EventCreateNetwork:
3071
+		return &WatchMessage_Event{Action: WatchActionKindCreate, Object: &Object{Object: &Object_Network{Network: v.Network}}}
3072
+	case EventUpdateNetwork:
3073
+		if v.OldNetwork != nil {
3074
+			return &WatchMessage_Event{Action: WatchActionKindUpdate, Object: &Object{Object: &Object_Network{Network: v.Network}}, OldObject: &Object{Object: &Object_Network{Network: v.OldNetwork}}}
3075
+		} else {
3076
+			return &WatchMessage_Event{Action: WatchActionKindUpdate, Object: &Object{Object: &Object_Network{Network: v.Network}}}
3077
+		}
3078
+	case EventDeleteNetwork:
3079
+		return &WatchMessage_Event{Action: WatchActionKindRemove, Object: &Object{Object: &Object_Network{Network: v.Network}}}
3080
+	case EventCreateCluster:
3081
+		return &WatchMessage_Event{Action: WatchActionKindCreate, Object: &Object{Object: &Object_Cluster{Cluster: v.Cluster}}}
3082
+	case EventUpdateCluster:
3083
+		if v.OldCluster != nil {
3084
+			return &WatchMessage_Event{Action: WatchActionKindUpdate, Object: &Object{Object: &Object_Cluster{Cluster: v.Cluster}}, OldObject: &Object{Object: &Object_Cluster{Cluster: v.OldCluster}}}
3085
+		} else {
3086
+			return &WatchMessage_Event{Action: WatchActionKindUpdate, Object: &Object{Object: &Object_Cluster{Cluster: v.Cluster}}}
3087
+		}
3088
+	case EventDeleteCluster:
3089
+		return &WatchMessage_Event{Action: WatchActionKindRemove, Object: &Object{Object: &Object_Cluster{Cluster: v.Cluster}}}
3090
+	case EventCreateSecret:
3091
+		return &WatchMessage_Event{Action: WatchActionKindCreate, Object: &Object{Object: &Object_Secret{Secret: v.Secret}}}
3092
+	case EventUpdateSecret:
3093
+		if v.OldSecret != nil {
3094
+			return &WatchMessage_Event{Action: WatchActionKindUpdate, Object: &Object{Object: &Object_Secret{Secret: v.Secret}}, OldObject: &Object{Object: &Object_Secret{Secret: v.OldSecret}}}
3095
+		} else {
3096
+			return &WatchMessage_Event{Action: WatchActionKindUpdate, Object: &Object{Object: &Object_Secret{Secret: v.Secret}}}
3097
+		}
3098
+	case EventDeleteSecret:
3099
+		return &WatchMessage_Event{Action: WatchActionKindRemove, Object: &Object{Object: &Object_Secret{Secret: v.Secret}}}
3100
+	case EventCreateResource:
3101
+		return &WatchMessage_Event{Action: WatchActionKindCreate, Object: &Object{Object: &Object_Resource{Resource: v.Resource}}}
3102
+	case EventUpdateResource:
3103
+		if v.OldResource != nil {
3104
+			return &WatchMessage_Event{Action: WatchActionKindUpdate, Object: &Object{Object: &Object_Resource{Resource: v.Resource}}, OldObject: &Object{Object: &Object_Resource{Resource: v.OldResource}}}
3105
+		} else {
3106
+			return &WatchMessage_Event{Action: WatchActionKindUpdate, Object: &Object{Object: &Object_Resource{Resource: v.Resource}}}
3107
+		}
3108
+	case EventDeleteResource:
3109
+		return &WatchMessage_Event{Action: WatchActionKindRemove, Object: &Object{Object: &Object_Resource{Resource: v.Resource}}}
3110
+	case EventCreateExtension:
3111
+		return &WatchMessage_Event{Action: WatchActionKindCreate, Object: &Object{Object: &Object_Extension{Extension: v.Extension}}}
3112
+	case EventUpdateExtension:
3113
+		if v.OldExtension != nil {
3114
+			return &WatchMessage_Event{Action: WatchActionKindUpdate, Object: &Object{Object: &Object_Extension{Extension: v.Extension}}, OldObject: &Object{Object: &Object_Extension{Extension: v.OldExtension}}}
3115
+		} else {
3116
+			return &WatchMessage_Event{Action: WatchActionKindUpdate, Object: &Object{Object: &Object_Extension{Extension: v.Extension}}}
3117
+		}
3118
+	case EventDeleteExtension:
3119
+		return &WatchMessage_Event{Action: WatchActionKindRemove, Object: &Object{Object: &Object_Extension{Extension: v.Extension}}}
3120
+	}
3121
+	return nil
3122
+}
3123
+
3124
+func ConvertWatchArgs(entries []*WatchRequest_WatchEntry) ([]Event, error) {
3125
+	var events []Event
3126
+	for _, entry := range entries {
3127
+		var newEvents []Event
3128
+		var err error
3129
+		switch entry.Kind {
3130
+		case "":
3131
+			return nil, errNoKindSpecified
3132
+		case "node":
3133
+			newEvents, err = ConvertNodeWatch(entry.Action, entry.Filters)
3134
+		case "service":
3135
+			newEvents, err = ConvertServiceWatch(entry.Action, entry.Filters)
3136
+		case "task":
3137
+			newEvents, err = ConvertTaskWatch(entry.Action, entry.Filters)
3138
+		case "network":
3139
+			newEvents, err = ConvertNetworkWatch(entry.Action, entry.Filters)
3140
+		case "cluster":
3141
+			newEvents, err = ConvertClusterWatch(entry.Action, entry.Filters)
3142
+		case "secret":
3143
+			newEvents, err = ConvertSecretWatch(entry.Action, entry.Filters)
3144
+		default:
3145
+			newEvents, err = ConvertResourceWatch(entry.Action, entry.Filters, entry.Kind)
3146
+		case "extension":
3147
+			newEvents, err = ConvertExtensionWatch(entry.Action, entry.Filters)
3148
+		}
3149
+		if err != nil {
3150
+			return nil, err
3151
+		}
3152
+		events = append(events, newEvents...)
3153
+	}
3154
+	return events, nil
3155
+}
3156
+
2928 3157
 func (this *Meta) String() string {
2929 3158
 	if this == nil {
2930 3159
 		return "nil"
... ...
@@ -5947,89 +6983,92 @@ var (
5947 5947
 func init() { proto.RegisterFile("objects.proto", fileDescriptorObjects) }
5948 5948
 
5949 5949
 var fileDescriptorObjects = []byte{
5950
-	// 1333 bytes of a gzipped FileDescriptorProto
5951
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xcc, 0x57, 0xc1, 0x8f, 0x1b, 0xb5,
5952
-	0x17, 0xde, 0x49, 0x66, 0x93, 0xcc, 0xcb, 0x66, 0xf5, 0xfb, 0xb9, 0xa5, 0x4c, 0x97, 0x25, 0x59,
5953
-	0xb6, 0x02, 0x55, 0xa8, 0xca, 0x42, 0x29, 0x68, 0x5b, 0x28, 0x90, 0x64, 0x23, 0x88, 0x4a, 0x69,
5954
-	0xe5, 0x96, 0xf6, 0x18, 0x79, 0x67, 0xdc, 0x30, 0x64, 0x32, 0x1e, 0xd9, 0x4e, 0x4a, 0x6e, 0x88,
5955
-	0x23, 0x47, 0x84, 0xc4, 0x0d, 0x89, 0x0b, 0x67, 0xae, 0xfc, 0x07, 0x7b, 0xe4, 0xc8, 0x69, 0x45,
5956
-	0x73, 0xe3, 0xc2, 0xdf, 0x80, 0xec, 0xf1, 0x64, 0x67, 0x9b, 0xc9, 0x6e, 0x8b, 0xaa, 0x15, 0xa7,
5957
-	0xd8, 0xe3, 0xef, 0x7b, 0x7e, 0xcf, 0xfe, 0xfc, 0xd9, 0x81, 0x1a, 0xdb, 0xff, 0x8a, 0x7a, 0x52,
5958
-	0x34, 0x63, 0xce, 0x24, 0x43, 0xc8, 0x67, 0xde, 0x90, 0xf2, 0xa6, 0x78, 0x4c, 0xf8, 0x68, 0x18,
5959
-	0xc8, 0xe6, 0xe4, 0xed, 0x8d, 0xaa, 0x9c, 0xc6, 0xd4, 0x00, 0x36, 0xaa, 0x22, 0xa6, 0x5e, 0xda,
5960
-	0x69, 0x0c, 0x18, 0x1b, 0x84, 0x74, 0x47, 0xf7, 0xf6, 0xc7, 0x8f, 0x76, 0x64, 0x30, 0xa2, 0x42,
5961
-	0x92, 0x51, 0x6c, 0x00, 0xe7, 0x07, 0x6c, 0xc0, 0x74, 0x73, 0x47, 0xb5, 0xcc, 0xd7, 0x8b, 0x4f,
5962
-	0xd3, 0x48, 0x34, 0x35, 0x43, 0xe7, 0xe2, 0x70, 0x3c, 0x08, 0xa2, 0x9d, 0xe4, 0x27, 0xf9, 0xb8,
5963
-	0xfd, 0x9b, 0x05, 0xf6, 0x6d, 0x2a, 0x09, 0x7a, 0x1f, 0xca, 0x13, 0xca, 0x45, 0xc0, 0x22, 0xd7,
5964
-	0xda, 0xb2, 0x2e, 0x57, 0xaf, 0xbe, 0xd2, 0x5c, 0xcc, 0xb7, 0xf9, 0x20, 0x81, 0xb4, 0xed, 0x83,
5965
-	0xc3, 0xc6, 0x0a, 0x4e, 0x19, 0xe8, 0x3a, 0x80, 0xc7, 0x29, 0x91, 0xd4, 0xef, 0x13, 0xe9, 0x16,
5966
-	0x34, 0x7f, 0xa3, 0x99, 0xa4, 0xd2, 0x4c, 0x53, 0x69, 0xde, 0x4f, 0x2b, 0xc0, 0x8e, 0x41, 0xb7,
5967
-	0xa4, 0xa2, 0x8e, 0x63, 0x3f, 0xa5, 0x16, 0x4f, 0xa7, 0x1a, 0x74, 0x4b, 0x6e, 0xff, 0x6c, 0x83,
5968
-	0xfd, 0x39, 0xf3, 0x29, 0xba, 0x00, 0x85, 0xc0, 0xd7, 0x69, 0x3b, 0xed, 0xd2, 0xec, 0xb0, 0x51,
5969
-	0xe8, 0xed, 0xe1, 0x42, 0xe0, 0xa3, 0xab, 0x60, 0x8f, 0xa8, 0x24, 0x26, 0x21, 0x37, 0xaf, 0x20,
5970
-	0x55, 0xbb, 0xa9, 0x46, 0x63, 0xd1, 0x7b, 0x60, 0xab, 0x6d, 0x30, 0x99, 0x6c, 0xe6, 0x71, 0xd4,
5971
-	0x9c, 0xf7, 0x62, 0xea, 0xa5, 0x3c, 0x85, 0x47, 0x5d, 0xa8, 0xfa, 0x54, 0x78, 0x3c, 0x88, 0xa5,
5972
-	0x5a, 0x43, 0x5b, 0xd3, 0x2f, 0x2d, 0xa3, 0xef, 0x1d, 0x41, 0x71, 0x96, 0x87, 0x3e, 0x80, 0x92,
5973
-	0x90, 0x44, 0x8e, 0x85, 0xbb, 0xaa, 0x23, 0xd4, 0x97, 0x26, 0xa0, 0x51, 0x26, 0x05, 0xc3, 0x41,
5974
-	0x9f, 0xc2, 0xfa, 0x88, 0x44, 0x64, 0x40, 0x79, 0xdf, 0x44, 0x29, 0xe9, 0x28, 0xaf, 0xe5, 0x96,
5975
-	0x9e, 0x20, 0x93, 0x40, 0xb8, 0x36, 0xca, 0x76, 0x51, 0x17, 0x80, 0x48, 0x49, 0xbc, 0x2f, 0x47,
5976
-	0x34, 0x92, 0x6e, 0x59, 0x47, 0x79, 0x3d, 0x37, 0x17, 0x2a, 0x1f, 0x33, 0x3e, 0x6c, 0xcd, 0xc1,
5977
-	0x38, 0x43, 0x44, 0x9f, 0x40, 0xd5, 0xa3, 0x5c, 0x06, 0x8f, 0x02, 0x8f, 0x48, 0xea, 0x56, 0x74,
5978
-	0x9c, 0x46, 0x5e, 0x9c, 0xce, 0x11, 0xcc, 0x14, 0x95, 0x65, 0xa2, 0xb7, 0xc0, 0xe6, 0x2c, 0xa4,
5979
-	0xae, 0xb3, 0x65, 0x5d, 0x5e, 0x5f, 0xbe, 0x2d, 0x98, 0x85, 0x14, 0x6b, 0xe4, 0x0d, 0xfb, 0xbb,
5980
-	0x1f, 0xb7, 0x57, 0xb6, 0xff, 0x2e, 0x42, 0xf9, 0x1e, 0xe5, 0x93, 0xc0, 0x7b, 0xb1, 0x32, 0xb9,
5981
-	0x7e, 0x4c, 0x26, 0xb9, 0x15, 0x99, 0x69, 0x17, 0x94, 0xb2, 0x0b, 0x15, 0x1a, 0xf9, 0x31, 0x0b,
5982
-	0x22, 0x69, 0x64, 0x92, 0x5b, 0x4e, 0xd7, 0x60, 0xf0, 0x1c, 0x8d, 0xba, 0x50, 0x4b, 0xd4, 0xdf,
5983
-	0x3f, 0xa6, 0x91, 0xad, 0x3c, 0xfa, 0x17, 0x1a, 0x68, 0x36, 0x77, 0x6d, 0x9c, 0xe9, 0xa1, 0x3d,
5984
-	0xa8, 0xc5, 0x9c, 0x4e, 0x02, 0x36, 0x16, 0x7d, 0x5d, 0x44, 0xe9, 0x99, 0x8a, 0xc0, 0x6b, 0x29,
5985
-	0x4b, 0xf5, 0xd0, 0x87, 0xb0, 0xa6, 0xc8, 0xfd, 0xd4, 0x35, 0xe0, 0x54, 0xd7, 0xc0, 0xda, 0xe0,
5986
-	0x4c, 0x07, 0xdd, 0x81, 0x97, 0x8e, 0x65, 0x31, 0x0f, 0x54, 0x3d, 0x3d, 0xd0, 0xb9, 0x6c, 0x26,
5987
-	0xe6, 0xa3, 0xd9, 0xf0, 0x9f, 0x0a, 0x50, 0x49, 0x97, 0x0e, 0x5d, 0x33, 0xbb, 0x64, 0x2d, 0x5f,
5988
-	0xa7, 0x14, 0xab, 0x2b, 0x4c, 0x36, 0xe8, 0x1a, 0xac, 0xc6, 0x8c, 0x4b, 0xe1, 0x16, 0xb6, 0x8a,
5989
-	0xcb, 0x8e, 0xe0, 0x5d, 0xc6, 0x65, 0x87, 0x45, 0x8f, 0x82, 0x01, 0x4e, 0xc0, 0xe8, 0x21, 0x54,
5990
-	0x27, 0x01, 0x97, 0x63, 0x12, 0xf6, 0x83, 0x58, 0xb8, 0x45, 0xcd, 0x7d, 0xe3, 0xa4, 0x29, 0x9b,
5991
-	0x0f, 0x12, 0x7c, 0xef, 0x6e, 0x7b, 0x7d, 0x76, 0xd8, 0x80, 0x79, 0x57, 0x60, 0x30, 0xa1, 0x7a,
5992
-	0xb1, 0xd8, 0xb8, 0x0d, 0xce, 0x7c, 0x04, 0x5d, 0x01, 0x88, 0x92, 0x13, 0xd7, 0x9f, 0x6b, 0xb9,
5993
-	0x36, 0x3b, 0x6c, 0x38, 0xe6, 0x1c, 0xf6, 0xf6, 0xb0, 0x63, 0x00, 0x3d, 0x1f, 0x21, 0xb0, 0x89,
5994
-	0xef, 0x73, 0xad, 0x6c, 0x07, 0xeb, 0xf6, 0xf6, 0xf7, 0x25, 0xb0, 0xef, 0x13, 0x31, 0x3c, 0x6b,
5995
-	0xd7, 0x54, 0x73, 0x2e, 0x9c, 0x85, 0x2b, 0x00, 0x22, 0x51, 0x98, 0x2a, 0xc7, 0x3e, 0x2a, 0xc7,
5996
-	0xe8, 0x4e, 0x95, 0x63, 0x00, 0x49, 0x39, 0x22, 0x64, 0x52, 0xcb, 0xde, 0xc6, 0xba, 0x8d, 0x2e,
5997
-	0x41, 0x39, 0x62, 0xbe, 0xa6, 0x97, 0x34, 0x1d, 0x66, 0x87, 0x8d, 0x92, 0xf2, 0x82, 0xde, 0x1e,
5998
-	0x2e, 0xa9, 0xa1, 0x9e, 0xaf, 0x6c, 0x88, 0x44, 0x11, 0x93, 0x44, 0x79, 0xac, 0x30, 0x76, 0x96,
5999
-	0xab, 0xf7, 0xd6, 0x11, 0x2c, 0xb5, 0xa1, 0x0c, 0x13, 0x3d, 0x80, 0x73, 0x69, 0xbe, 0xd9, 0x80,
6000
-	0x95, 0xe7, 0x09, 0x88, 0x4c, 0x84, 0xcc, 0x48, 0xc6, 0xf6, 0x9d, 0xe5, 0xb6, 0xaf, 0x57, 0x30,
6001
-	0xcf, 0xf6, 0xdb, 0x50, 0xf3, 0xa9, 0x08, 0x38, 0xf5, 0xb5, 0x31, 0x50, 0x7d, 0x16, 0xd7, 0xaf,
6002
-	0xbe, 0x7a, 0x52, 0x10, 0x8a, 0xd7, 0x0c, 0x47, 0xf7, 0x50, 0x0b, 0x2a, 0x46, 0x37, 0xc2, 0xad,
6003
-	0x6a, 0xed, 0x3e, 0xa3, 0xdd, 0xcf, 0x69, 0xc7, 0x8c, 0x6d, 0xed, 0xb9, 0x8c, 0xed, 0x3a, 0x40,
6004
-	0xc8, 0x06, 0x7d, 0x9f, 0x07, 0x13, 0xca, 0xdd, 0x9a, 0x79, 0x04, 0xe4, 0x70, 0xf7, 0x34, 0x02,
6005
-	0x3b, 0x21, 0x1b, 0x24, 0xcd, 0x05, 0x1b, 0x5a, 0x7f, 0x3e, 0x1b, 0x32, 0xae, 0xf1, 0xad, 0x05,
6006
-	0xff, 0x5f, 0x28, 0x0d, 0xbd, 0x0b, 0x65, 0x53, 0xdc, 0x49, 0x6f, 0x22, 0xc3, 0xc3, 0x29, 0x16,
6007
-	0x6d, 0x82, 0xa3, 0x4e, 0x1a, 0x15, 0x82, 0x26, 0x1e, 0xe2, 0xe0, 0xa3, 0x0f, 0xc8, 0x85, 0x32,
6008
-	0x09, 0x03, 0xa2, 0xc6, 0x8a, 0x7a, 0x2c, 0xed, 0x6e, 0xff, 0x50, 0x80, 0xb2, 0x09, 0x76, 0xd6,
6009
-	0x77, 0x95, 0x99, 0x76, 0xe1, 0x7c, 0xde, 0x84, 0xb5, 0x64, 0x53, 0x8c, 0xb0, 0xec, 0x53, 0xb7,
6010
-	0xa6, 0x9a, 0xe0, 0x13, 0x51, 0xdd, 0x04, 0x3b, 0x88, 0xc9, 0xc8, 0xdc, 0x53, 0xb9, 0x33, 0xf7,
6011
-	0xee, 0xb6, 0x6e, 0xdf, 0x89, 0x93, 0xf3, 0x51, 0x99, 0x1d, 0x36, 0x6c, 0xf5, 0x01, 0x6b, 0x9a,
6012
-	0xd9, 0x9b, 0x5f, 0x56, 0xa1, 0xdc, 0x09, 0xc7, 0x42, 0x52, 0x7e, 0xd6, 0xcb, 0x62, 0xa6, 0x5d,
6013
-	0x58, 0x96, 0x0e, 0x94, 0x39, 0x63, 0xb2, 0xef, 0x91, 0x93, 0x56, 0x04, 0x33, 0x26, 0x3b, 0xad,
6014
-	0xf6, 0xba, 0x22, 0x2a, 0x53, 0x4a, 0xfa, 0xb8, 0xa4, 0xa8, 0x1d, 0x82, 0x1e, 0xc2, 0x85, 0xd4,
6015
-	0xca, 0xf7, 0x19, 0x93, 0x42, 0x72, 0x12, 0xf7, 0x87, 0x74, 0xaa, 0xae, 0xf5, 0xe2, 0xb2, 0x47,
6016
-	0x5b, 0x37, 0xf2, 0xf8, 0x54, 0x2f, 0xd7, 0x2d, 0x3a, 0xc5, 0xe7, 0x4d, 0x80, 0x76, 0xca, 0xbf,
6017
-	0x45, 0xa7, 0x02, 0x7d, 0x04, 0x9b, 0x74, 0x0e, 0x53, 0x11, 0xfb, 0x21, 0x19, 0xa9, 0x4b, 0xaa,
6018
-	0xef, 0x85, 0xcc, 0x1b, 0x6a, 0x9f, 0xb4, 0xf1, 0x45, 0x9a, 0x0d, 0xf5, 0x59, 0x82, 0xe8, 0x28,
6019
-	0x00, 0x12, 0xe0, 0xee, 0x87, 0xc4, 0x1b, 0x86, 0x81, 0x50, 0xef, 0xf2, 0xcc, 0x3b, 0x4c, 0x59,
6020
-	0x9d, 0xca, 0x6d, 0xf7, 0x84, 0xd5, 0x6a, 0xb6, 0x8f, 0xb8, 0x99, 0x57, 0x9d, 0xe8, 0x46, 0x92,
6021
-	0x4f, 0xf1, 0xcb, 0xfb, 0xf9, 0xa3, 0xa8, 0x0d, 0xd5, 0x71, 0xa4, 0xa6, 0x4f, 0xd6, 0xc0, 0x79,
6022
-	0xd6, 0x35, 0x80, 0x84, 0xa5, 0x2a, 0xdf, 0x98, 0xc0, 0xe6, 0x49, 0x93, 0xa3, 0xff, 0x41, 0x71,
6023
-	0x48, 0xa7, 0x89, 0x7e, 0xb0, 0x6a, 0xa2, 0x8f, 0x61, 0x75, 0x42, 0xc2, 0x31, 0x35, 0xca, 0x79,
6024
-	0x33, 0x6f, 0xbe, 0xfc, 0x90, 0x38, 0x21, 0xde, 0x28, 0xec, 0x5a, 0x46, 0xa8, 0xbf, 0x5a, 0x50,
6025
-	0xba, 0x47, 0x3d, 0x4e, 0xe5, 0x0b, 0xd5, 0xe9, 0xee, 0x31, 0x9d, 0xd6, 0xf3, 0x5f, 0x69, 0x6a,
6026
-	0xd6, 0x05, 0x99, 0x6e, 0x40, 0x25, 0x88, 0x24, 0xe5, 0x11, 0x09, 0xb5, 0x4e, 0x2b, 0x78, 0xde,
6027
-	0x37, 0x29, 0xff, 0x65, 0x41, 0x05, 0x53, 0xc1, 0xc6, 0xfc, 0x05, 0xbf, 0x8f, 0x9f, 0xba, 0x71,
6028
-	0x8b, 0xff, 0xfa, 0xc6, 0x45, 0x60, 0x0f, 0x83, 0xc8, 0xbc, 0x0d, 0xb0, 0x6e, 0xa3, 0x26, 0x94,
6029
-	0x63, 0x32, 0x0d, 0x19, 0xf1, 0x8d, 0xb3, 0x9c, 0x5f, 0xf8, 0xc3, 0xd8, 0x8a, 0xa6, 0x38, 0x05,
6030
-	0x99, 0x5a, 0x0f, 0x2c, 0x70, 0xba, 0x5f, 0x4b, 0x1a, 0xe9, 0xe7, 0xe7, 0x7f, 0xb2, 0xd8, 0xad,
6031
-	0xc5, 0x3f, 0x91, 0xce, 0xb1, 0xff, 0x87, 0x49, 0x29, 0x6d, 0xf7, 0xe0, 0x49, 0x7d, 0xe5, 0x8f,
6032
-	0x27, 0xf5, 0x95, 0x6f, 0x66, 0x75, 0xeb, 0x60, 0x56, 0xb7, 0x7e, 0x9f, 0xd5, 0xad, 0x3f, 0x67,
6033
-	0x75, 0x6b, 0xbf, 0xa4, 0x57, 0xe0, 0x9d, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0xe5, 0x6e, 0x08,
6034
-	0x2c, 0x7c, 0x10, 0x00, 0x00,
5950
+	// 1390 bytes of a gzipped FileDescriptorProto
5951
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xcc, 0x57, 0xc1, 0x6f, 0x1b, 0x45,
5952
+	0x17, 0xef, 0xda, 0x1b, 0xdb, 0xfb, 0x9c, 0x58, 0xf9, 0xa6, 0xf9, 0xf2, 0x6d, 0xf3, 0xe5, 0xb3,
5953
+	0xf3, 0xb9, 0x02, 0x55, 0xa8, 0x72, 0x4a, 0x29, 0x28, 0x0d, 0x14, 0x6a, 0x27, 0x16, 0xb5, 0x4a,
5954
+	0x69, 0x34, 0x2d, 0x2d, 0x37, 0x33, 0xd9, 0x9d, 0xba, 0x8b, 0xd7, 0x3b, 0xab, 0x9d, 0xb1, 0x8b,
5955
+	0x6f, 0x88, 0x63, 0xfe, 0x81, 0xdc, 0x38, 0x70, 0xe2, 0x0e, 0x17, 0x2e, 0x9c, 0x7b, 0xe4, 0x84,
5956
+	0x38, 0x45, 0xd4, 0xff, 0x05, 0x12, 0x07, 0x34, 0xb3, 0xb3, 0xce, 0xa6, 0x5e, 0x27, 0x2d, 0xaa,
5957
+	0x2a, 0x4e, 0x9e, 0xd9, 0xf9, 0xfd, 0xde, 0xbc, 0xf7, 0xe6, 0x37, 0x6f, 0x9e, 0x61, 0x89, 0xed,
5958
+	0x7f, 0x49, 0x1d, 0xc1, 0x1b, 0x61, 0xc4, 0x04, 0x43, 0xc8, 0x65, 0x4e, 0x9f, 0x46, 0x0d, 0xfe,
5959
+	0x84, 0x44, 0x83, 0xbe, 0x27, 0x1a, 0xa3, 0xb7, 0xd7, 0xca, 0x62, 0x1c, 0x52, 0x0d, 0x58, 0x2b,
5960
+	0xf3, 0x90, 0x3a, 0xc9, 0xa4, 0xd6, 0x63, 0xac, 0xe7, 0xd3, 0x4d, 0x35, 0xdb, 0x1f, 0x3e, 0xda,
5961
+	0x14, 0xde, 0x80, 0x72, 0x41, 0x06, 0xa1, 0x06, 0xac, 0xf4, 0x58, 0x8f, 0xa9, 0xe1, 0xa6, 0x1c,
5962
+	0xe9, 0xaf, 0x17, 0x9e, 0xa7, 0x91, 0x60, 0xac, 0x97, 0xce, 0x87, 0xfe, 0xb0, 0xe7, 0x05, 0x9b,
5963
+	0xf1, 0x4f, 0xfc, 0xb1, 0xfe, 0x93, 0x01, 0xe6, 0x1d, 0x2a, 0x08, 0x7a, 0x1f, 0x8a, 0x23, 0x1a,
5964
+	0x71, 0x8f, 0x05, 0xb6, 0xb1, 0x61, 0x5c, 0x2a, 0x5f, 0xfd, 0x6f, 0x63, 0xd6, 0xdf, 0xc6, 0x83,
5965
+	0x18, 0xd2, 0x32, 0x9f, 0x1e, 0xd5, 0xce, 0xe1, 0x84, 0x81, 0xae, 0x03, 0x38, 0x11, 0x25, 0x82,
5966
+	0xba, 0x5d, 0x22, 0xec, 0x9c, 0xe2, 0xaf, 0x35, 0x62, 0x57, 0x1a, 0x89, 0x2b, 0x8d, 0xfb, 0x49,
5967
+	0x04, 0xd8, 0xd2, 0xe8, 0xa6, 0x90, 0xd4, 0x61, 0xe8, 0x26, 0xd4, 0xfc, 0xd9, 0x54, 0x8d, 0x6e,
5968
+	0x8a, 0xfa, 0x0f, 0x26, 0x98, 0x9f, 0x32, 0x97, 0xa2, 0x55, 0xc8, 0x79, 0xae, 0x72, 0xdb, 0x6a,
5969
+	0x15, 0x26, 0x47, 0xb5, 0x5c, 0x67, 0x17, 0xe7, 0x3c, 0x17, 0x5d, 0x05, 0x73, 0x40, 0x05, 0xd1,
5970
+	0x0e, 0xd9, 0x59, 0x01, 0xc9, 0xd8, 0x75, 0x34, 0x0a, 0x8b, 0xde, 0x03, 0x53, 0x1e, 0x83, 0xf6,
5971
+	0x64, 0x3d, 0x8b, 0x23, 0xf7, 0xbc, 0x17, 0x52, 0x27, 0xe1, 0x49, 0x3c, 0x6a, 0x43, 0xd9, 0xa5,
5972
+	0xdc, 0x89, 0xbc, 0x50, 0xc8, 0x1c, 0x9a, 0x8a, 0x7e, 0x71, 0x1e, 0x7d, 0xf7, 0x18, 0x8a, 0xd3,
5973
+	0x3c, 0xf4, 0x01, 0x14, 0xb8, 0x20, 0x62, 0xc8, 0xed, 0x05, 0x65, 0xa1, 0x3a, 0xd7, 0x01, 0x85,
5974
+	0xd2, 0x2e, 0x68, 0x0e, 0xba, 0x05, 0x95, 0x01, 0x09, 0x48, 0x8f, 0x46, 0x5d, 0x6d, 0xa5, 0xa0,
5975
+	0xac, 0xfc, 0x3f, 0x33, 0xf4, 0x18, 0x19, 0x1b, 0xc2, 0x4b, 0x83, 0xf4, 0x14, 0xb5, 0x01, 0x88,
5976
+	0x10, 0xc4, 0x79, 0x3c, 0xa0, 0x81, 0xb0, 0x8b, 0xca, 0xca, 0x1b, 0x99, 0xbe, 0x50, 0xf1, 0x84,
5977
+	0x45, 0xfd, 0xe6, 0x14, 0x8c, 0x53, 0x44, 0xf4, 0x31, 0x94, 0x1d, 0x1a, 0x09, 0xef, 0x91, 0xe7,
5978
+	0x10, 0x41, 0xed, 0x92, 0xb2, 0x53, 0xcb, 0xb2, 0xb3, 0x73, 0x0c, 0xd3, 0x41, 0xa5, 0x99, 0xe8,
5979
+	0x0a, 0x98, 0x11, 0xf3, 0xa9, 0x6d, 0x6d, 0x18, 0x97, 0x2a, 0xf3, 0x8f, 0x05, 0x33, 0x9f, 0x62,
5980
+	0x85, 0xdc, 0x5e, 0x3d, 0x38, 0xac, 0x23, 0x58, 0x2e, 0x19, 0xcb, 0x86, 0x92, 0x86, 0x71, 0xc5,
5981
+	0xf8, 0xdc, 0xf8, 0xc2, 0xa8, 0xff, 0x99, 0x87, 0xe2, 0x3d, 0x1a, 0x8d, 0x3c, 0xe7, 0xd5, 0x0a,
5982
+	0xe7, 0xfa, 0x09, 0xe1, 0x64, 0xc6, 0xa8, 0xb7, 0x9d, 0xd1, 0xce, 0x16, 0x94, 0x68, 0xe0, 0x86,
5983
+	0xcc, 0x0b, 0x84, 0x16, 0x4e, 0x66, 0x80, 0x6d, 0x8d, 0xc1, 0x53, 0x34, 0x6a, 0xc3, 0x52, 0x7c,
5984
+	0x1f, 0xba, 0x27, 0x54, 0xb3, 0x91, 0x45, 0xff, 0x4c, 0x01, 0xf5, 0x71, 0x2f, 0x0e, 0x53, 0x33,
5985
+	0xb4, 0x0b, 0x4b, 0x61, 0x44, 0x47, 0x1e, 0x1b, 0xf2, 0xae, 0x0a, 0xa2, 0xf0, 0x42, 0x41, 0xe0,
5986
+	0xc5, 0x84, 0x25, 0x67, 0xe8, 0x43, 0x58, 0x94, 0xe4, 0x6e, 0x52, 0x47, 0xe0, 0xcc, 0x3a, 0x82,
5987
+	0x55, 0xc9, 0xd3, 0x13, 0x74, 0x17, 0xfe, 0x7d, 0xc2, 0x8b, 0xa9, 0xa1, 0xf2, 0xd9, 0x86, 0xce,
5988
+	0xa7, 0x3d, 0xd1, 0x1f, 0xb7, 0xd1, 0xc1, 0x61, 0xbd, 0x02, 0x8b, 0x69, 0x09, 0xd4, 0xbf, 0xcd,
5989
+	0x41, 0x29, 0x49, 0x24, 0xba, 0xa6, 0xcf, 0xcc, 0x98, 0x9f, 0xb5, 0x04, 0xab, 0xe2, 0x8d, 0x8f,
5990
+	0xeb, 0x1a, 0x2c, 0x84, 0x2c, 0x12, 0xdc, 0xce, 0x6d, 0xe4, 0xe7, 0x5d, 0xd1, 0x3d, 0x16, 0x89,
5991
+	0x1d, 0x16, 0x3c, 0xf2, 0x7a, 0x38, 0x06, 0xa3, 0x87, 0x50, 0x1e, 0x79, 0x91, 0x18, 0x12, 0xbf,
5992
+	0xeb, 0x85, 0xdc, 0xce, 0x2b, 0xee, 0x9b, 0xa7, 0x6d, 0xd9, 0x78, 0x10, 0xe3, 0x3b, 0x7b, 0xad,
5993
+	0xca, 0xe4, 0xa8, 0x06, 0xd3, 0x29, 0xc7, 0xa0, 0x4d, 0x75, 0x42, 0xbe, 0x76, 0x07, 0xac, 0xe9,
5994
+	0x0a, 0xba, 0x0c, 0x10, 0xc4, 0x37, 0xb2, 0x3b, 0x55, 0xf6, 0xd2, 0xe4, 0xa8, 0x66, 0xe9, 0x7b,
5995
+	0xda, 0xd9, 0xc5, 0x96, 0x06, 0x74, 0x5c, 0x84, 0xc0, 0x24, 0xae, 0x1b, 0x29, 0x9d, 0x5b, 0x58,
5996
+	0x8d, 0xeb, 0xdf, 0x17, 0xc0, 0xbc, 0x4f, 0x78, 0xff, 0x75, 0x57, 0x55, 0xb9, 0xe7, 0xcc, 0xcd,
5997
+	0xb8, 0x0c, 0xc0, 0x63, 0xbd, 0xc9, 0x70, 0xcc, 0xe3, 0x70, 0xb4, 0x0a, 0x65, 0x38, 0x1a, 0x10,
5998
+	0x87, 0xc3, 0x7d, 0x26, 0xd4, 0x25, 0x30, 0xb1, 0x1a, 0xa3, 0x8b, 0x50, 0x0c, 0x98, 0xab, 0xe8,
5999
+	0x05, 0x45, 0x87, 0xc9, 0x51, 0xad, 0x20, 0x6b, 0x45, 0x67, 0x17, 0x17, 0xe4, 0x52, 0xc7, 0x95,
6000
+	0x65, 0x8a, 0x04, 0x01, 0x13, 0x44, 0xd6, 0x60, 0xae, 0xcb, 0x5d, 0xa6, 0xfa, 0x9b, 0xc7, 0xb0,
6001
+	0xa4, 0x4c, 0xa5, 0x98, 0xe8, 0x01, 0x9c, 0x4f, 0xfc, 0x4d, 0x1b, 0x2c, 0xbd, 0x8c, 0x41, 0xa4,
6002
+	0x2d, 0xa4, 0x56, 0x52, 0xcf, 0x82, 0x35, 0xff, 0x59, 0x50, 0x19, 0xcc, 0x7a, 0x16, 0x5a, 0xb0,
6003
+	0xe4, 0x52, 0xee, 0x45, 0xd4, 0x55, 0x65, 0x82, 0xaa, 0x9b, 0x59, 0xb9, 0xfa, 0xbf, 0xd3, 0x8c,
6004
+	0x50, 0xbc, 0xa8, 0x39, 0x6a, 0x86, 0x9a, 0x50, 0xd2, 0xba, 0xe1, 0x76, 0x59, 0x69, 0xf7, 0x05,
6005
+	0x9f, 0x83, 0x29, 0xed, 0x44, 0x99, 0x5b, 0x7c, 0xa9, 0x32, 0x77, 0x1d, 0xc0, 0x67, 0xbd, 0xae,
6006
+	0x1b, 0x79, 0x23, 0x1a, 0xd9, 0x4b, 0xba, 0x49, 0xc8, 0xe0, 0xee, 0x2a, 0x04, 0xb6, 0x7c, 0xd6,
6007
+	0x8b, 0x87, 0x33, 0x45, 0xa9, 0xf2, 0x72, 0x45, 0x69, 0x7b, 0xed, 0xe0, 0xb0, 0xbe, 0x0a, 0x2b,
6008
+	0xe9, 0x1a, 0xb2, 0x65, 0xdc, 0x34, 0x6e, 0x19, 0x7b, 0x46, 0xfd, 0x1b, 0x03, 0xfe, 0x35, 0x13,
6009
+	0x30, 0x7a, 0x17, 0x8a, 0x3a, 0xe4, 0xd3, 0x3a, 0x29, 0xcd, 0xc3, 0x09, 0x16, 0xad, 0x83, 0x25,
6010
+	0xef, 0x1f, 0xe5, 0x9c, 0xc6, 0x95, 0xc5, 0xc2, 0xc7, 0x1f, 0x90, 0x0d, 0x45, 0xe2, 0x7b, 0x44,
6011
+	0xae, 0xe5, 0xd5, 0x5a, 0x32, 0xad, 0x7f, 0x97, 0x83, 0xa2, 0x36, 0xf6, 0xba, 0xdf, 0x33, 0xbd,
6012
+	0xed, 0xcc, 0xad, 0xbd, 0x01, 0x8b, 0xf1, 0x51, 0x69, 0xb9, 0x99, 0x67, 0x1e, 0x58, 0x39, 0xc6,
6013
+	0xc7, 0x52, 0xbb, 0x01, 0xa6, 0x17, 0x92, 0x81, 0x7e, 0xcb, 0x32, 0x77, 0xee, 0xec, 0x35, 0xef,
6014
+	0xdc, 0x0d, 0xe3, 0x5b, 0x53, 0x9a, 0x1c, 0xd5, 0x4c, 0xf9, 0x01, 0x2b, 0x5a, 0x66, 0xd5, 0xff,
6015
+	0x71, 0x01, 0x8a, 0x3b, 0xfe, 0x90, 0x0b, 0x1a, 0xbd, 0xee, 0x24, 0xe9, 0x6d, 0x67, 0x92, 0xb4,
6016
+	0x03, 0xc5, 0x88, 0x31, 0xd1, 0x75, 0xc8, 0x69, 0xf9, 0xc1, 0x8c, 0x89, 0x9d, 0x66, 0xab, 0x22,
6017
+	0x89, 0xb2, 0x70, 0xc5, 0x73, 0x5c, 0x90, 0xd4, 0x1d, 0x82, 0x1e, 0xc2, 0x6a, 0x52, 0xee, 0xf7,
6018
+	0x19, 0x13, 0x5c, 0x44, 0x24, 0xec, 0xf6, 0xe9, 0x58, 0x36, 0x02, 0xf9, 0x79, 0x8d, 0x5f, 0x3b,
6019
+	0x70, 0xa2, 0xb1, 0x4a, 0xde, 0x6d, 0x3a, 0xc6, 0x2b, 0xda, 0x40, 0x2b, 0xe1, 0xdf, 0xa6, 0x63,
6020
+	0x8e, 0x3e, 0x82, 0x75, 0x3a, 0x85, 0x49, 0x8b, 0x5d, 0x9f, 0x0c, 0xe4, 0x43, 0xd6, 0x75, 0x7c,
6021
+	0xe6, 0xf4, 0x55, 0x2d, 0x35, 0xf1, 0x05, 0x9a, 0x36, 0xf5, 0x49, 0x8c, 0xd8, 0x91, 0x00, 0xc4,
6022
+	0xc1, 0xde, 0xf7, 0x89, 0xd3, 0xf7, 0x3d, 0x2e, 0x7b, 0xfb, 0x54, 0x2f, 0x27, 0xcb, 0xa1, 0xf4,
6023
+	0x6d, 0xeb, 0x94, 0x6c, 0x35, 0x5a, 0xc7, 0xdc, 0x54, 0x67, 0xc8, 0xdb, 0x81, 0x88, 0xc6, 0xf8,
6024
+	0x3f, 0xfb, 0xd9, 0xab, 0xa8, 0x05, 0xe5, 0x61, 0x20, 0xb7, 0x8f, 0x73, 0x60, 0xbd, 0x68, 0x0e,
6025
+	0x20, 0x66, 0xc9, 0xc8, 0xd7, 0x46, 0xb0, 0x7e, 0xda, 0xe6, 0x68, 0x19, 0xf2, 0x7d, 0x3a, 0x8e,
6026
+	0xf5, 0x83, 0xe5, 0x10, 0xdd, 0x84, 0x85, 0x11, 0xf1, 0x87, 0x54, 0x2b, 0xe7, 0xad, 0xac, 0xfd,
6027
+	0xb2, 0x4d, 0xe2, 0x98, 0xb8, 0x9d, 0xdb, 0x32, 0x32, 0x65, 0xfb, 0xb3, 0x01, 0x85, 0x7b, 0xd4,
6028
+	0x89, 0xa8, 0x78, 0xa5, 0xaa, 0xdd, 0x3a, 0xa1, 0xda, 0x6a, 0x76, 0x97, 0x27, 0x77, 0x9d, 0x11,
6029
+	0xed, 0x1a, 0x94, 0xbc, 0x40, 0xd0, 0x28, 0x20, 0xbe, 0x52, 0x6d, 0x09, 0x4f, 0xe7, 0x99, 0x01,
6030
+	0xfc, 0x61, 0x40, 0x09, 0x53, 0xce, 0x86, 0xd1, 0x2b, 0xee, 0xb6, 0x9f, 0x7b, 0xb1, 0xf3, 0x7f,
6031
+	0xfb, 0xc5, 0x46, 0x60, 0xf6, 0xbd, 0x40, 0xf7, 0x16, 0x58, 0x8d, 0x51, 0x03, 0x8a, 0x21, 0x19,
6032
+	0xfb, 0x8c, 0xb8, 0xba, 0x06, 0xad, 0xcc, 0xfc, 0x21, 0x6d, 0x06, 0x63, 0x9c, 0x80, 0xb6, 0x57,
6033
+	0x0e, 0x0e, 0xeb, 0xcb, 0x50, 0x49, 0x47, 0xfe, 0xd8, 0xa8, 0xff, 0x6a, 0x80, 0xd5, 0xfe, 0x4a,
6034
+	0xd0, 0x40, 0x35, 0xb7, 0xff, 0xc8, 0xe0, 0x37, 0x66, 0xff, 0xb4, 0x5a, 0x27, 0xfe, 0x8f, 0x66,
6035
+	0x1d, 0x6a, 0xcb, 0x7e, 0xfa, 0xac, 0x7a, 0xee, 0xb7, 0x67, 0xd5, 0x73, 0x5f, 0x4f, 0xaa, 0xc6,
6036
+	0xd3, 0x49, 0xd5, 0xf8, 0x65, 0x52, 0x35, 0x7e, 0x9f, 0x54, 0x8d, 0xfd, 0x82, 0xca, 0xcf, 0x3b,
6037
+	0x7f, 0x05, 0x00, 0x00, 0xff, 0xff, 0x01, 0x4f, 0xd2, 0x2a, 0xfa, 0x10, 0x00, 0x00,
6035 6038
 }
... ...
@@ -26,7 +26,18 @@ message Meta {
26 26
 
27 27
 // Node provides the internal node state as seen by the cluster.
28 28
 message Node {
29
-	option (docker.protobuf.plugin.store_object) = { };
29
+	option (docker.protobuf.plugin.store_object) = {
30
+		watch_selectors: {
31
+			id: true
32
+			id_prefix: true
33
+			name: true
34
+			name_prefix: true
35
+			custom: true
36
+			custom_prefix: true
37
+			role: true
38
+			membership: true
39
+		}
40
+	};
30 41
 
31 42
 	// ID specifies the identity of the node.
32 43
 	string id = 1;
... ...
@@ -67,7 +78,16 @@ message Node {
67 67
 }
68 68
 
69 69
 message Service {
70
-	option (docker.protobuf.plugin.store_object) = { };
70
+	option (docker.protobuf.plugin.store_object) = {
71
+		watch_selectors: {
72
+			id: true
73
+			id_prefix: true
74
+			name: true
75
+			name_prefix: true
76
+			custom: true
77
+			custom_prefix: true
78
+		}
79
+	};
71 80
 
72 81
 	string id = 1;
73 82
 
... ...
@@ -137,7 +157,20 @@ message Endpoint {
137 137
 // immutable and idempotent. Once it is dispatched to a node, it will not be
138 138
 // dispatched to another node.
139 139
 message Task {
140
-	option (docker.protobuf.plugin.store_object) = { };
140
+	option (docker.protobuf.plugin.store_object) = {
141
+		watch_selectors: {
142
+			id: true
143
+			id_prefix: true
144
+			name: true
145
+			name_prefix: true
146
+			custom: true
147
+			custom_prefix: true
148
+			service_id: true
149
+			node_id: true
150
+			slot: true
151
+			desired_state: true
152
+		}
153
+	};
141 154
 
142 155
 	string id = 1;
143 156
 
... ...
@@ -225,7 +258,16 @@ message NetworkAttachment {
225 225
 }
226 226
 
227 227
 message Network {
228
-	option (docker.protobuf.plugin.store_object) = { };
228
+	option (docker.protobuf.plugin.store_object) = {
229
+		watch_selectors: {
230
+			id: true
231
+			id_prefix: true
232
+			name: true
233
+			name_prefix: true
234
+			custom: true
235
+			custom_prefix: true
236
+		}
237
+	};
229 238
 
230 239
 	string id = 1;
231 240
 
... ...
@@ -243,7 +285,16 @@ message Network {
243 243
 
244 244
 // Cluster provides global cluster settings.
245 245
 message Cluster {
246
-	option (docker.protobuf.plugin.store_object) = { };
246
+	option (docker.protobuf.plugin.store_object) = {
247
+		watch_selectors: {
248
+			id: true
249
+			id_prefix: true
250
+			name: true
251
+			name_prefix: true
252
+			custom: true
253
+			custom_prefix: true
254
+		}
255
+	};
247 256
 
248 257
 	string id = 1;
249 258
 
... ...
@@ -281,7 +332,16 @@ message Cluster {
281 281
 // information that is generated from the secret data in the `spec`, such as
282 282
 // the digest and size of the secret data.
283 283
 message Secret {
284
-	option (docker.protobuf.plugin.store_object) = { };
284
+	option (docker.protobuf.plugin.store_object) = {
285
+		watch_selectors: {
286
+			id: true
287
+			id_prefix: true
288
+			name: true
289
+			name_prefix: true
290
+			custom: true
291
+			custom_prefix: true
292
+		}
293
+	};
285 294
 
286 295
 	string id = 1;
287 296
 
... ...
@@ -299,7 +359,17 @@ message Secret {
299 299
 // SwarmKit can serve as a store for these objects without understanding their
300 300
 // meanings.
301 301
 message Resource {
302
-	option (docker.protobuf.plugin.store_object) = { };
302
+	option (docker.protobuf.plugin.store_object) = {
303
+		watch_selectors: {
304
+			id: true
305
+			id_prefix: true
306
+			name: true
307
+			name_prefix: true
308
+			custom: true
309
+			custom_prefix: true
310
+			kind: true
311
+		}
312
+	};
303 313
 
304 314
 	string id = 1 [(gogoproto.customname) = "ID"];
305 315
 
... ...
@@ -320,7 +390,16 @@ message Resource {
320 320
 // Extension declares a type of "resource" object. This message provides some
321 321
 // metadata about the objects.
322 322
 message Extension {
323
-	option (docker.protobuf.plugin.store_object) = { };
323
+	option (docker.protobuf.plugin.store_object) = {
324
+		watch_selectors: {
325
+			id: true
326
+			id_prefix: true
327
+			name: true
328
+			name_prefix: true
329
+			custom: true
330
+			custom_prefix: true
331
+		}
332
+	};
324 333
 
325 334
 	string id = 1 [(gogoproto.customname) = "ID"];
326 335
 
... ...
@@ -1097,6 +1097,10 @@ func (m *SecretSpec) CopyFrom(src interface{}) {
1097 1097
 	o := src.(*SecretSpec)
1098 1098
 	*m = *o
1099 1099
 	github_com_docker_swarmkit_api_deepcopy.Copy(&m.Annotations, &o.Annotations)
1100
+	if o.Data != nil {
1101
+		m.Data = make([]byte, len(o.Data))
1102
+		copy(m.Data, o.Data)
1103
+	}
1100 1104
 }
1101 1105
 
1102 1106
 func (m *NodeSpec) Marshal() (dAtA []byte, err error) {
1103 1107
new file mode 100644
... ...
@@ -0,0 +1,4407 @@
0
+// Code generated by protoc-gen-gogo.
1
+// source: store.proto
2
+// DO NOT EDIT!
3
+
4
+package api
5
+
6
+import proto "github.com/gogo/protobuf/proto"
7
+import fmt "fmt"
8
+import math "math"
9
+import _ "github.com/gogo/protobuf/gogoproto"
10
+import _ "github.com/docker/swarmkit/protobuf/plugin"
11
+
12
+import github_com_docker_swarmkit_api_deepcopy "github.com/docker/swarmkit/api/deepcopy"
13
+
14
+import (
15
+	context "golang.org/x/net/context"
16
+	grpc "google.golang.org/grpc"
17
+)
18
+
19
+import raftselector "github.com/docker/swarmkit/manager/raftselector"
20
+import codes "google.golang.org/grpc/codes"
21
+import metadata "google.golang.org/grpc/metadata"
22
+import transport "google.golang.org/grpc/transport"
23
+import rafttime "time"
24
+
25
+import strings "strings"
26
+import reflect "reflect"
27
+
28
+import io "io"
29
+
30
+// Reference imports to suppress errors if they are not otherwise used.
31
+var _ = proto.Marshal
32
+var _ = fmt.Errorf
33
+var _ = math.Inf
34
+
35
+// WatchActionKind distinguishes between creations, updates, and removals. It
36
+// is structured as a bitmap so multiple kinds of events can be requested with
37
+// a mask.
38
+type WatchActionKind int32
39
+
40
+const (
41
+	WatchActionKindUnknown WatchActionKind = 0
42
+	WatchActionKindCreate  WatchActionKind = 1
43
+	WatchActionKindUpdate  WatchActionKind = 2
44
+	WatchActionKindRemove  WatchActionKind = 4
45
+)
46
+
47
+var WatchActionKind_name = map[int32]string{
48
+	0: "WATCH_ACTION_UNKNOWN",
49
+	1: "WATCH_ACTION_CREATE",
50
+	2: "WATCH_ACTION_UPDATE",
51
+	4: "WATCH_ACTION_REMOVE",
52
+}
53
+var WatchActionKind_value = map[string]int32{
54
+	"WATCH_ACTION_UNKNOWN": 0,
55
+	"WATCH_ACTION_CREATE":  1,
56
+	"WATCH_ACTION_UPDATE":  2,
57
+	"WATCH_ACTION_REMOVE":  4,
58
+}
59
+
60
+func (x WatchActionKind) String() string {
61
+	return proto.EnumName(WatchActionKind_name, int32(x))
62
+}
63
+func (WatchActionKind) EnumDescriptor() ([]byte, []int) { return fileDescriptorStore, []int{0} }
64
+
65
+type Object struct {
66
+	// Types that are valid to be assigned to Object:
67
+	//	*Object_Node
68
+	//	*Object_Service
69
+	//	*Object_Network
70
+	//	*Object_Task
71
+	//	*Object_Cluster
72
+	//	*Object_Secret
73
+	//	*Object_Resource
74
+	//	*Object_Extension
75
+	Object isObject_Object `protobuf_oneof:"Object"`
76
+}
77
+
78
+func (m *Object) Reset()                    { *m = Object{} }
79
+func (*Object) ProtoMessage()               {}
80
+func (*Object) Descriptor() ([]byte, []int) { return fileDescriptorStore, []int{0} }
81
+
82
+type isObject_Object interface {
83
+	isObject_Object()
84
+	MarshalTo([]byte) (int, error)
85
+	Size() int
86
+}
87
+
88
+type Object_Node struct {
89
+	Node *Node `protobuf:"bytes,1,opt,name=node,oneof"`
90
+}
91
+type Object_Service struct {
92
+	Service *Service `protobuf:"bytes,2,opt,name=service,oneof"`
93
+}
94
+type Object_Network struct {
95
+	Network *Network `protobuf:"bytes,3,opt,name=network,oneof"`
96
+}
97
+type Object_Task struct {
98
+	Task *Task `protobuf:"bytes,4,opt,name=task,oneof"`
99
+}
100
+type Object_Cluster struct {
101
+	Cluster *Cluster `protobuf:"bytes,5,opt,name=cluster,oneof"`
102
+}
103
+type Object_Secret struct {
104
+	Secret *Secret `protobuf:"bytes,6,opt,name=secret,oneof"`
105
+}
106
+type Object_Resource struct {
107
+	Resource *Resource `protobuf:"bytes,7,opt,name=resource,oneof"`
108
+}
109
+type Object_Extension struct {
110
+	Extension *Extension `protobuf:"bytes,8,opt,name=extension,oneof"`
111
+}
112
+
113
+func (*Object_Node) isObject_Object()      {}
114
+func (*Object_Service) isObject_Object()   {}
115
+func (*Object_Network) isObject_Object()   {}
116
+func (*Object_Task) isObject_Object()      {}
117
+func (*Object_Cluster) isObject_Object()   {}
118
+func (*Object_Secret) isObject_Object()    {}
119
+func (*Object_Resource) isObject_Object()  {}
120
+func (*Object_Extension) isObject_Object() {}
121
+
122
+func (m *Object) GetObject() isObject_Object {
123
+	if m != nil {
124
+		return m.Object
125
+	}
126
+	return nil
127
+}
128
+
129
+func (m *Object) GetNode() *Node {
130
+	if x, ok := m.GetObject().(*Object_Node); ok {
131
+		return x.Node
132
+	}
133
+	return nil
134
+}
135
+
136
+func (m *Object) GetService() *Service {
137
+	if x, ok := m.GetObject().(*Object_Service); ok {
138
+		return x.Service
139
+	}
140
+	return nil
141
+}
142
+
143
+func (m *Object) GetNetwork() *Network {
144
+	if x, ok := m.GetObject().(*Object_Network); ok {
145
+		return x.Network
146
+	}
147
+	return nil
148
+}
149
+
150
+func (m *Object) GetTask() *Task {
151
+	if x, ok := m.GetObject().(*Object_Task); ok {
152
+		return x.Task
153
+	}
154
+	return nil
155
+}
156
+
157
+func (m *Object) GetCluster() *Cluster {
158
+	if x, ok := m.GetObject().(*Object_Cluster); ok {
159
+		return x.Cluster
160
+	}
161
+	return nil
162
+}
163
+
164
+func (m *Object) GetSecret() *Secret {
165
+	if x, ok := m.GetObject().(*Object_Secret); ok {
166
+		return x.Secret
167
+	}
168
+	return nil
169
+}
170
+
171
+func (m *Object) GetResource() *Resource {
172
+	if x, ok := m.GetObject().(*Object_Resource); ok {
173
+		return x.Resource
174
+	}
175
+	return nil
176
+}
177
+
178
+func (m *Object) GetExtension() *Extension {
179
+	if x, ok := m.GetObject().(*Object_Extension); ok {
180
+		return x.Extension
181
+	}
182
+	return nil
183
+}
184
+
185
+// XXX_OneofFuncs is for the internal use of the proto package.
186
+func (*Object) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
187
+	return _Object_OneofMarshaler, _Object_OneofUnmarshaler, _Object_OneofSizer, []interface{}{
188
+		(*Object_Node)(nil),
189
+		(*Object_Service)(nil),
190
+		(*Object_Network)(nil),
191
+		(*Object_Task)(nil),
192
+		(*Object_Cluster)(nil),
193
+		(*Object_Secret)(nil),
194
+		(*Object_Resource)(nil),
195
+		(*Object_Extension)(nil),
196
+	}
197
+}
198
+
199
+func _Object_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
200
+	m := msg.(*Object)
201
+	// Object
202
+	switch x := m.Object.(type) {
203
+	case *Object_Node:
204
+		_ = b.EncodeVarint(1<<3 | proto.WireBytes)
205
+		if err := b.EncodeMessage(x.Node); err != nil {
206
+			return err
207
+		}
208
+	case *Object_Service:
209
+		_ = b.EncodeVarint(2<<3 | proto.WireBytes)
210
+		if err := b.EncodeMessage(x.Service); err != nil {
211
+			return err
212
+		}
213
+	case *Object_Network:
214
+		_ = b.EncodeVarint(3<<3 | proto.WireBytes)
215
+		if err := b.EncodeMessage(x.Network); err != nil {
216
+			return err
217
+		}
218
+	case *Object_Task:
219
+		_ = b.EncodeVarint(4<<3 | proto.WireBytes)
220
+		if err := b.EncodeMessage(x.Task); err != nil {
221
+			return err
222
+		}
223
+	case *Object_Cluster:
224
+		_ = b.EncodeVarint(5<<3 | proto.WireBytes)
225
+		if err := b.EncodeMessage(x.Cluster); err != nil {
226
+			return err
227
+		}
228
+	case *Object_Secret:
229
+		_ = b.EncodeVarint(6<<3 | proto.WireBytes)
230
+		if err := b.EncodeMessage(x.Secret); err != nil {
231
+			return err
232
+		}
233
+	case *Object_Resource:
234
+		_ = b.EncodeVarint(7<<3 | proto.WireBytes)
235
+		if err := b.EncodeMessage(x.Resource); err != nil {
236
+			return err
237
+		}
238
+	case *Object_Extension:
239
+		_ = b.EncodeVarint(8<<3 | proto.WireBytes)
240
+		if err := b.EncodeMessage(x.Extension); err != nil {
241
+			return err
242
+		}
243
+	case nil:
244
+	default:
245
+		return fmt.Errorf("Object.Object has unexpected type %T", x)
246
+	}
247
+	return nil
248
+}
249
+
250
+func _Object_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
251
+	m := msg.(*Object)
252
+	switch tag {
253
+	case 1: // Object.node
254
+		if wire != proto.WireBytes {
255
+			return true, proto.ErrInternalBadWireType
256
+		}
257
+		msg := new(Node)
258
+		err := b.DecodeMessage(msg)
259
+		m.Object = &Object_Node{msg}
260
+		return true, err
261
+	case 2: // Object.service
262
+		if wire != proto.WireBytes {
263
+			return true, proto.ErrInternalBadWireType
264
+		}
265
+		msg := new(Service)
266
+		err := b.DecodeMessage(msg)
267
+		m.Object = &Object_Service{msg}
268
+		return true, err
269
+	case 3: // Object.network
270
+		if wire != proto.WireBytes {
271
+			return true, proto.ErrInternalBadWireType
272
+		}
273
+		msg := new(Network)
274
+		err := b.DecodeMessage(msg)
275
+		m.Object = &Object_Network{msg}
276
+		return true, err
277
+	case 4: // Object.task
278
+		if wire != proto.WireBytes {
279
+			return true, proto.ErrInternalBadWireType
280
+		}
281
+		msg := new(Task)
282
+		err := b.DecodeMessage(msg)
283
+		m.Object = &Object_Task{msg}
284
+		return true, err
285
+	case 5: // Object.cluster
286
+		if wire != proto.WireBytes {
287
+			return true, proto.ErrInternalBadWireType
288
+		}
289
+		msg := new(Cluster)
290
+		err := b.DecodeMessage(msg)
291
+		m.Object = &Object_Cluster{msg}
292
+		return true, err
293
+	case 6: // Object.secret
294
+		if wire != proto.WireBytes {
295
+			return true, proto.ErrInternalBadWireType
296
+		}
297
+		msg := new(Secret)
298
+		err := b.DecodeMessage(msg)
299
+		m.Object = &Object_Secret{msg}
300
+		return true, err
301
+	case 7: // Object.resource
302
+		if wire != proto.WireBytes {
303
+			return true, proto.ErrInternalBadWireType
304
+		}
305
+		msg := new(Resource)
306
+		err := b.DecodeMessage(msg)
307
+		m.Object = &Object_Resource{msg}
308
+		return true, err
309
+	case 8: // Object.extension
310
+		if wire != proto.WireBytes {
311
+			return true, proto.ErrInternalBadWireType
312
+		}
313
+		msg := new(Extension)
314
+		err := b.DecodeMessage(msg)
315
+		m.Object = &Object_Extension{msg}
316
+		return true, err
317
+	default:
318
+		return false, nil
319
+	}
320
+}
321
+
322
+func _Object_OneofSizer(msg proto.Message) (n int) {
323
+	m := msg.(*Object)
324
+	// Object
325
+	switch x := m.Object.(type) {
326
+	case *Object_Node:
327
+		s := proto.Size(x.Node)
328
+		n += proto.SizeVarint(1<<3 | proto.WireBytes)
329
+		n += proto.SizeVarint(uint64(s))
330
+		n += s
331
+	case *Object_Service:
332
+		s := proto.Size(x.Service)
333
+		n += proto.SizeVarint(2<<3 | proto.WireBytes)
334
+		n += proto.SizeVarint(uint64(s))
335
+		n += s
336
+	case *Object_Network:
337
+		s := proto.Size(x.Network)
338
+		n += proto.SizeVarint(3<<3 | proto.WireBytes)
339
+		n += proto.SizeVarint(uint64(s))
340
+		n += s
341
+	case *Object_Task:
342
+		s := proto.Size(x.Task)
343
+		n += proto.SizeVarint(4<<3 | proto.WireBytes)
344
+		n += proto.SizeVarint(uint64(s))
345
+		n += s
346
+	case *Object_Cluster:
347
+		s := proto.Size(x.Cluster)
348
+		n += proto.SizeVarint(5<<3 | proto.WireBytes)
349
+		n += proto.SizeVarint(uint64(s))
350
+		n += s
351
+	case *Object_Secret:
352
+		s := proto.Size(x.Secret)
353
+		n += proto.SizeVarint(6<<3 | proto.WireBytes)
354
+		n += proto.SizeVarint(uint64(s))
355
+		n += s
356
+	case *Object_Resource:
357
+		s := proto.Size(x.Resource)
358
+		n += proto.SizeVarint(7<<3 | proto.WireBytes)
359
+		n += proto.SizeVarint(uint64(s))
360
+		n += s
361
+	case *Object_Extension:
362
+		s := proto.Size(x.Extension)
363
+		n += proto.SizeVarint(8<<3 | proto.WireBytes)
364
+		n += proto.SizeVarint(uint64(s))
365
+		n += s
366
+	case nil:
367
+	default:
368
+		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
369
+	}
370
+	return n
371
+}
372
+
373
+// FIXME(aaronl): These messages should ideally be embedded in SelectBy, but
374
+// protoc generates bad code for that.
375
+type SelectBySlot struct {
376
+	ServiceID string `protobuf:"bytes,1,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"`
377
+	Slot      uint64 `protobuf:"varint,2,opt,name=slot,proto3" json:"slot,omitempty"`
378
+}
379
+
380
+func (m *SelectBySlot) Reset()                    { *m = SelectBySlot{} }
381
+func (*SelectBySlot) ProtoMessage()               {}
382
+func (*SelectBySlot) Descriptor() ([]byte, []int) { return fileDescriptorStore, []int{1} }
383
+
384
+type SelectByCustom struct {
385
+	Kind  string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"`
386
+	Index string `protobuf:"bytes,2,opt,name=index,proto3" json:"index,omitempty"`
387
+	Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"`
388
+}
389
+
390
+func (m *SelectByCustom) Reset()                    { *m = SelectByCustom{} }
391
+func (*SelectByCustom) ProtoMessage()               {}
392
+func (*SelectByCustom) Descriptor() ([]byte, []int) { return fileDescriptorStore, []int{2} }
393
+
394
+type SelectBy struct {
395
+	// TODO(aaronl): Are all of these things we want to expose in
396
+	// the API? Exposing them may commit us to maintaining those
397
+	// internal indices going forward.
398
+	//
399
+	// Types that are valid to be assigned to By:
400
+	//	*SelectBy_ID
401
+	//	*SelectBy_IDPrefix
402
+	//	*SelectBy_Name
403
+	//	*SelectBy_NamePrefix
404
+	//	*SelectBy_Custom
405
+	//	*SelectBy_CustomPrefix
406
+	//	*SelectBy_ServiceID
407
+	//	*SelectBy_NodeID
408
+	//	*SelectBy_Slot
409
+	//	*SelectBy_DesiredState
410
+	//	*SelectBy_Role
411
+	//	*SelectBy_Membership
412
+	//	*SelectBy_ReferencedNetworkID
413
+	//	*SelectBy_ReferencedSecretID
414
+	//	*SelectBy_Kind
415
+	By isSelectBy_By `protobuf_oneof:"By"`
416
+}
417
+
418
+func (m *SelectBy) Reset()                    { *m = SelectBy{} }
419
+func (*SelectBy) ProtoMessage()               {}
420
+func (*SelectBy) Descriptor() ([]byte, []int) { return fileDescriptorStore, []int{3} }
421
+
422
+type isSelectBy_By interface {
423
+	isSelectBy_By()
424
+	MarshalTo([]byte) (int, error)
425
+	Size() int
426
+}
427
+
428
+type SelectBy_ID struct {
429
+	ID string `protobuf:"bytes,1,opt,name=id,proto3,oneof"`
430
+}
431
+type SelectBy_IDPrefix struct {
432
+	IDPrefix string `protobuf:"bytes,2,opt,name=id_prefix,json=idPrefix,proto3,oneof"`
433
+}
434
+type SelectBy_Name struct {
435
+	Name string `protobuf:"bytes,3,opt,name=name,proto3,oneof"`
436
+}
437
+type SelectBy_NamePrefix struct {
438
+	NamePrefix string `protobuf:"bytes,4,opt,name=name_prefix,json=namePrefix,proto3,oneof"`
439
+}
440
+type SelectBy_Custom struct {
441
+	Custom *SelectByCustom `protobuf:"bytes,5,opt,name=custom,oneof"`
442
+}
443
+type SelectBy_CustomPrefix struct {
444
+	CustomPrefix *SelectByCustom `protobuf:"bytes,6,opt,name=custom_prefix,json=customPrefix,oneof"`
445
+}
446
+type SelectBy_ServiceID struct {
447
+	ServiceID string `protobuf:"bytes,7,opt,name=service_id,json=serviceId,proto3,oneof"`
448
+}
449
+type SelectBy_NodeID struct {
450
+	NodeID string `protobuf:"bytes,8,opt,name=node_id,json=nodeId,proto3,oneof"`
451
+}
452
+type SelectBy_Slot struct {
453
+	Slot *SelectBySlot `protobuf:"bytes,9,opt,name=slot,oneof"`
454
+}
455
+type SelectBy_DesiredState struct {
456
+	DesiredState TaskState `protobuf:"varint,10,opt,name=desired_state,json=desiredState,proto3,enum=docker.swarmkit.v1.TaskState,oneof"`
457
+}
458
+type SelectBy_Role struct {
459
+	Role NodeRole `protobuf:"varint,11,opt,name=role,proto3,enum=docker.swarmkit.v1.NodeRole,oneof"`
460
+}
461
+type SelectBy_Membership struct {
462
+	Membership NodeSpec_Membership `protobuf:"varint,12,opt,name=membership,proto3,enum=docker.swarmkit.v1.NodeSpec_Membership,oneof"`
463
+}
464
+type SelectBy_ReferencedNetworkID struct {
465
+	ReferencedNetworkID string `protobuf:"bytes,13,opt,name=referenced_network_id,json=referencedNetworkId,proto3,oneof"`
466
+}
467
+type SelectBy_ReferencedSecretID struct {
468
+	ReferencedSecretID string `protobuf:"bytes,14,opt,name=referenced_secret_id,json=referencedSecretId,proto3,oneof"`
469
+}
470
+type SelectBy_Kind struct {
471
+	Kind string `protobuf:"bytes,15,opt,name=kind,proto3,oneof"`
472
+}
473
+
474
+func (*SelectBy_ID) isSelectBy_By()                  {}
475
+func (*SelectBy_IDPrefix) isSelectBy_By()            {}
476
+func (*SelectBy_Name) isSelectBy_By()                {}
477
+func (*SelectBy_NamePrefix) isSelectBy_By()          {}
478
+func (*SelectBy_Custom) isSelectBy_By()              {}
479
+func (*SelectBy_CustomPrefix) isSelectBy_By()        {}
480
+func (*SelectBy_ServiceID) isSelectBy_By()           {}
481
+func (*SelectBy_NodeID) isSelectBy_By()              {}
482
+func (*SelectBy_Slot) isSelectBy_By()                {}
483
+func (*SelectBy_DesiredState) isSelectBy_By()        {}
484
+func (*SelectBy_Role) isSelectBy_By()                {}
485
+func (*SelectBy_Membership) isSelectBy_By()          {}
486
+func (*SelectBy_ReferencedNetworkID) isSelectBy_By() {}
487
+func (*SelectBy_ReferencedSecretID) isSelectBy_By()  {}
488
+func (*SelectBy_Kind) isSelectBy_By()                {}
489
+
490
+func (m *SelectBy) GetBy() isSelectBy_By {
491
+	if m != nil {
492
+		return m.By
493
+	}
494
+	return nil
495
+}
496
+
497
+func (m *SelectBy) GetID() string {
498
+	if x, ok := m.GetBy().(*SelectBy_ID); ok {
499
+		return x.ID
500
+	}
501
+	return ""
502
+}
503
+
504
+func (m *SelectBy) GetIDPrefix() string {
505
+	if x, ok := m.GetBy().(*SelectBy_IDPrefix); ok {
506
+		return x.IDPrefix
507
+	}
508
+	return ""
509
+}
510
+
511
+func (m *SelectBy) GetName() string {
512
+	if x, ok := m.GetBy().(*SelectBy_Name); ok {
513
+		return x.Name
514
+	}
515
+	return ""
516
+}
517
+
518
+func (m *SelectBy) GetNamePrefix() string {
519
+	if x, ok := m.GetBy().(*SelectBy_NamePrefix); ok {
520
+		return x.NamePrefix
521
+	}
522
+	return ""
523
+}
524
+
525
+func (m *SelectBy) GetCustom() *SelectByCustom {
526
+	if x, ok := m.GetBy().(*SelectBy_Custom); ok {
527
+		return x.Custom
528
+	}
529
+	return nil
530
+}
531
+
532
+func (m *SelectBy) GetCustomPrefix() *SelectByCustom {
533
+	if x, ok := m.GetBy().(*SelectBy_CustomPrefix); ok {
534
+		return x.CustomPrefix
535
+	}
536
+	return nil
537
+}
538
+
539
+func (m *SelectBy) GetServiceID() string {
540
+	if x, ok := m.GetBy().(*SelectBy_ServiceID); ok {
541
+		return x.ServiceID
542
+	}
543
+	return ""
544
+}
545
+
546
+func (m *SelectBy) GetNodeID() string {
547
+	if x, ok := m.GetBy().(*SelectBy_NodeID); ok {
548
+		return x.NodeID
549
+	}
550
+	return ""
551
+}
552
+
553
+func (m *SelectBy) GetSlot() *SelectBySlot {
554
+	if x, ok := m.GetBy().(*SelectBy_Slot); ok {
555
+		return x.Slot
556
+	}
557
+	return nil
558
+}
559
+
560
+func (m *SelectBy) GetDesiredState() TaskState {
561
+	if x, ok := m.GetBy().(*SelectBy_DesiredState); ok {
562
+		return x.DesiredState
563
+	}
564
+	return TaskStateNew
565
+}
566
+
567
+func (m *SelectBy) GetRole() NodeRole {
568
+	if x, ok := m.GetBy().(*SelectBy_Role); ok {
569
+		return x.Role
570
+	}
571
+	return NodeRoleWorker
572
+}
573
+
574
+func (m *SelectBy) GetMembership() NodeSpec_Membership {
575
+	if x, ok := m.GetBy().(*SelectBy_Membership); ok {
576
+		return x.Membership
577
+	}
578
+	return NodeMembershipPending
579
+}
580
+
581
+func (m *SelectBy) GetReferencedNetworkID() string {
582
+	if x, ok := m.GetBy().(*SelectBy_ReferencedNetworkID); ok {
583
+		return x.ReferencedNetworkID
584
+	}
585
+	return ""
586
+}
587
+
588
+func (m *SelectBy) GetReferencedSecretID() string {
589
+	if x, ok := m.GetBy().(*SelectBy_ReferencedSecretID); ok {
590
+		return x.ReferencedSecretID
591
+	}
592
+	return ""
593
+}
594
+
595
+func (m *SelectBy) GetKind() string {
596
+	if x, ok := m.GetBy().(*SelectBy_Kind); ok {
597
+		return x.Kind
598
+	}
599
+	return ""
600
+}
601
+
602
+// XXX_OneofFuncs is for the internal use of the proto package.
603
+func (*SelectBy) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
604
+	return _SelectBy_OneofMarshaler, _SelectBy_OneofUnmarshaler, _SelectBy_OneofSizer, []interface{}{
605
+		(*SelectBy_ID)(nil),
606
+		(*SelectBy_IDPrefix)(nil),
607
+		(*SelectBy_Name)(nil),
608
+		(*SelectBy_NamePrefix)(nil),
609
+		(*SelectBy_Custom)(nil),
610
+		(*SelectBy_CustomPrefix)(nil),
611
+		(*SelectBy_ServiceID)(nil),
612
+		(*SelectBy_NodeID)(nil),
613
+		(*SelectBy_Slot)(nil),
614
+		(*SelectBy_DesiredState)(nil),
615
+		(*SelectBy_Role)(nil),
616
+		(*SelectBy_Membership)(nil),
617
+		(*SelectBy_ReferencedNetworkID)(nil),
618
+		(*SelectBy_ReferencedSecretID)(nil),
619
+		(*SelectBy_Kind)(nil),
620
+	}
621
+}
622
+
623
+func _SelectBy_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
624
+	m := msg.(*SelectBy)
625
+	// By
626
+	switch x := m.By.(type) {
627
+	case *SelectBy_ID:
628
+		_ = b.EncodeVarint(1<<3 | proto.WireBytes)
629
+		_ = b.EncodeStringBytes(x.ID)
630
+	case *SelectBy_IDPrefix:
631
+		_ = b.EncodeVarint(2<<3 | proto.WireBytes)
632
+		_ = b.EncodeStringBytes(x.IDPrefix)
633
+	case *SelectBy_Name:
634
+		_ = b.EncodeVarint(3<<3 | proto.WireBytes)
635
+		_ = b.EncodeStringBytes(x.Name)
636
+	case *SelectBy_NamePrefix:
637
+		_ = b.EncodeVarint(4<<3 | proto.WireBytes)
638
+		_ = b.EncodeStringBytes(x.NamePrefix)
639
+	case *SelectBy_Custom:
640
+		_ = b.EncodeVarint(5<<3 | proto.WireBytes)
641
+		if err := b.EncodeMessage(x.Custom); err != nil {
642
+			return err
643
+		}
644
+	case *SelectBy_CustomPrefix:
645
+		_ = b.EncodeVarint(6<<3 | proto.WireBytes)
646
+		if err := b.EncodeMessage(x.CustomPrefix); err != nil {
647
+			return err
648
+		}
649
+	case *SelectBy_ServiceID:
650
+		_ = b.EncodeVarint(7<<3 | proto.WireBytes)
651
+		_ = b.EncodeStringBytes(x.ServiceID)
652
+	case *SelectBy_NodeID:
653
+		_ = b.EncodeVarint(8<<3 | proto.WireBytes)
654
+		_ = b.EncodeStringBytes(x.NodeID)
655
+	case *SelectBy_Slot:
656
+		_ = b.EncodeVarint(9<<3 | proto.WireBytes)
657
+		if err := b.EncodeMessage(x.Slot); err != nil {
658
+			return err
659
+		}
660
+	case *SelectBy_DesiredState:
661
+		_ = b.EncodeVarint(10<<3 | proto.WireVarint)
662
+		_ = b.EncodeVarint(uint64(x.DesiredState))
663
+	case *SelectBy_Role:
664
+		_ = b.EncodeVarint(11<<3 | proto.WireVarint)
665
+		_ = b.EncodeVarint(uint64(x.Role))
666
+	case *SelectBy_Membership:
667
+		_ = b.EncodeVarint(12<<3 | proto.WireVarint)
668
+		_ = b.EncodeVarint(uint64(x.Membership))
669
+	case *SelectBy_ReferencedNetworkID:
670
+		_ = b.EncodeVarint(13<<3 | proto.WireBytes)
671
+		_ = b.EncodeStringBytes(x.ReferencedNetworkID)
672
+	case *SelectBy_ReferencedSecretID:
673
+		_ = b.EncodeVarint(14<<3 | proto.WireBytes)
674
+		_ = b.EncodeStringBytes(x.ReferencedSecretID)
675
+	case *SelectBy_Kind:
676
+		_ = b.EncodeVarint(15<<3 | proto.WireBytes)
677
+		_ = b.EncodeStringBytes(x.Kind)
678
+	case nil:
679
+	default:
680
+		return fmt.Errorf("SelectBy.By has unexpected type %T", x)
681
+	}
682
+	return nil
683
+}
684
+
685
+func _SelectBy_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
686
+	m := msg.(*SelectBy)
687
+	switch tag {
688
+	case 1: // By.id
689
+		if wire != proto.WireBytes {
690
+			return true, proto.ErrInternalBadWireType
691
+		}
692
+		x, err := b.DecodeStringBytes()
693
+		m.By = &SelectBy_ID{x}
694
+		return true, err
695
+	case 2: // By.id_prefix
696
+		if wire != proto.WireBytes {
697
+			return true, proto.ErrInternalBadWireType
698
+		}
699
+		x, err := b.DecodeStringBytes()
700
+		m.By = &SelectBy_IDPrefix{x}
701
+		return true, err
702
+	case 3: // By.name
703
+		if wire != proto.WireBytes {
704
+			return true, proto.ErrInternalBadWireType
705
+		}
706
+		x, err := b.DecodeStringBytes()
707
+		m.By = &SelectBy_Name{x}
708
+		return true, err
709
+	case 4: // By.name_prefix
710
+		if wire != proto.WireBytes {
711
+			return true, proto.ErrInternalBadWireType
712
+		}
713
+		x, err := b.DecodeStringBytes()
714
+		m.By = &SelectBy_NamePrefix{x}
715
+		return true, err
716
+	case 5: // By.custom
717
+		if wire != proto.WireBytes {
718
+			return true, proto.ErrInternalBadWireType
719
+		}
720
+		msg := new(SelectByCustom)
721
+		err := b.DecodeMessage(msg)
722
+		m.By = &SelectBy_Custom{msg}
723
+		return true, err
724
+	case 6: // By.custom_prefix
725
+		if wire != proto.WireBytes {
726
+			return true, proto.ErrInternalBadWireType
727
+		}
728
+		msg := new(SelectByCustom)
729
+		err := b.DecodeMessage(msg)
730
+		m.By = &SelectBy_CustomPrefix{msg}
731
+		return true, err
732
+	case 7: // By.service_id
733
+		if wire != proto.WireBytes {
734
+			return true, proto.ErrInternalBadWireType
735
+		}
736
+		x, err := b.DecodeStringBytes()
737
+		m.By = &SelectBy_ServiceID{x}
738
+		return true, err
739
+	case 8: // By.node_id
740
+		if wire != proto.WireBytes {
741
+			return true, proto.ErrInternalBadWireType
742
+		}
743
+		x, err := b.DecodeStringBytes()
744
+		m.By = &SelectBy_NodeID{x}
745
+		return true, err
746
+	case 9: // By.slot
747
+		if wire != proto.WireBytes {
748
+			return true, proto.ErrInternalBadWireType
749
+		}
750
+		msg := new(SelectBySlot)
751
+		err := b.DecodeMessage(msg)
752
+		m.By = &SelectBy_Slot{msg}
753
+		return true, err
754
+	case 10: // By.desired_state
755
+		if wire != proto.WireVarint {
756
+			return true, proto.ErrInternalBadWireType
757
+		}
758
+		x, err := b.DecodeVarint()
759
+		m.By = &SelectBy_DesiredState{TaskState(x)}
760
+		return true, err
761
+	case 11: // By.role
762
+		if wire != proto.WireVarint {
763
+			return true, proto.ErrInternalBadWireType
764
+		}
765
+		x, err := b.DecodeVarint()
766
+		m.By = &SelectBy_Role{NodeRole(x)}
767
+		return true, err
768
+	case 12: // By.membership
769
+		if wire != proto.WireVarint {
770
+			return true, proto.ErrInternalBadWireType
771
+		}
772
+		x, err := b.DecodeVarint()
773
+		m.By = &SelectBy_Membership{NodeSpec_Membership(x)}
774
+		return true, err
775
+	case 13: // By.referenced_network_id
776
+		if wire != proto.WireBytes {
777
+			return true, proto.ErrInternalBadWireType
778
+		}
779
+		x, err := b.DecodeStringBytes()
780
+		m.By = &SelectBy_ReferencedNetworkID{x}
781
+		return true, err
782
+	case 14: // By.referenced_secret_id
783
+		if wire != proto.WireBytes {
784
+			return true, proto.ErrInternalBadWireType
785
+		}
786
+		x, err := b.DecodeStringBytes()
787
+		m.By = &SelectBy_ReferencedSecretID{x}
788
+		return true, err
789
+	case 15: // By.kind
790
+		if wire != proto.WireBytes {
791
+			return true, proto.ErrInternalBadWireType
792
+		}
793
+		x, err := b.DecodeStringBytes()
794
+		m.By = &SelectBy_Kind{x}
795
+		return true, err
796
+	default:
797
+		return false, nil
798
+	}
799
+}
800
+
801
+func _SelectBy_OneofSizer(msg proto.Message) (n int) {
802
+	m := msg.(*SelectBy)
803
+	// By
804
+	switch x := m.By.(type) {
805
+	case *SelectBy_ID:
806
+		n += proto.SizeVarint(1<<3 | proto.WireBytes)
807
+		n += proto.SizeVarint(uint64(len(x.ID)))
808
+		n += len(x.ID)
809
+	case *SelectBy_IDPrefix:
810
+		n += proto.SizeVarint(2<<3 | proto.WireBytes)
811
+		n += proto.SizeVarint(uint64(len(x.IDPrefix)))
812
+		n += len(x.IDPrefix)
813
+	case *SelectBy_Name:
814
+		n += proto.SizeVarint(3<<3 | proto.WireBytes)
815
+		n += proto.SizeVarint(uint64(len(x.Name)))
816
+		n += len(x.Name)
817
+	case *SelectBy_NamePrefix:
818
+		n += proto.SizeVarint(4<<3 | proto.WireBytes)
819
+		n += proto.SizeVarint(uint64(len(x.NamePrefix)))
820
+		n += len(x.NamePrefix)
821
+	case *SelectBy_Custom:
822
+		s := proto.Size(x.Custom)
823
+		n += proto.SizeVarint(5<<3 | proto.WireBytes)
824
+		n += proto.SizeVarint(uint64(s))
825
+		n += s
826
+	case *SelectBy_CustomPrefix:
827
+		s := proto.Size(x.CustomPrefix)
828
+		n += proto.SizeVarint(6<<3 | proto.WireBytes)
829
+		n += proto.SizeVarint(uint64(s))
830
+		n += s
831
+	case *SelectBy_ServiceID:
832
+		n += proto.SizeVarint(7<<3 | proto.WireBytes)
833
+		n += proto.SizeVarint(uint64(len(x.ServiceID)))
834
+		n += len(x.ServiceID)
835
+	case *SelectBy_NodeID:
836
+		n += proto.SizeVarint(8<<3 | proto.WireBytes)
837
+		n += proto.SizeVarint(uint64(len(x.NodeID)))
838
+		n += len(x.NodeID)
839
+	case *SelectBy_Slot:
840
+		s := proto.Size(x.Slot)
841
+		n += proto.SizeVarint(9<<3 | proto.WireBytes)
842
+		n += proto.SizeVarint(uint64(s))
843
+		n += s
844
+	case *SelectBy_DesiredState:
845
+		n += proto.SizeVarint(10<<3 | proto.WireVarint)
846
+		n += proto.SizeVarint(uint64(x.DesiredState))
847
+	case *SelectBy_Role:
848
+		n += proto.SizeVarint(11<<3 | proto.WireVarint)
849
+		n += proto.SizeVarint(uint64(x.Role))
850
+	case *SelectBy_Membership:
851
+		n += proto.SizeVarint(12<<3 | proto.WireVarint)
852
+		n += proto.SizeVarint(uint64(x.Membership))
853
+	case *SelectBy_ReferencedNetworkID:
854
+		n += proto.SizeVarint(13<<3 | proto.WireBytes)
855
+		n += proto.SizeVarint(uint64(len(x.ReferencedNetworkID)))
856
+		n += len(x.ReferencedNetworkID)
857
+	case *SelectBy_ReferencedSecretID:
858
+		n += proto.SizeVarint(14<<3 | proto.WireBytes)
859
+		n += proto.SizeVarint(uint64(len(x.ReferencedSecretID)))
860
+		n += len(x.ReferencedSecretID)
861
+	case *SelectBy_Kind:
862
+		n += proto.SizeVarint(15<<3 | proto.WireBytes)
863
+		n += proto.SizeVarint(uint64(len(x.Kind)))
864
+		n += len(x.Kind)
865
+	case nil:
866
+	default:
867
+		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
868
+	}
869
+	return n
870
+}
871
+
872
+type WatchRequest struct {
873
+	// Multiple entries are combined using OR logic - i.e. if an event
874
+	// matches all of the selectors specified in any single watch entry,
875
+	// the event will be sent to the client.
876
+	Entries []*WatchRequest_WatchEntry `protobuf:"bytes,1,rep,name=entries" json:"entries,omitempty"`
877
+	// ResumeFrom provides an version to resume the watch from, if non-nil.
878
+	// The watch will return changes since this version, and continue to
879
+	// return new changes afterwards. Watch will return an error if the
880
+	// server has compacted its log and no longer has complete history to
881
+	// this point.
882
+	ResumeFrom *Version `protobuf:"bytes,2,opt,name=resume_from,json=resumeFrom" json:"resume_from,omitempty"`
883
+	// IncludeOldObject causes WatchMessages to include a copy of the
884
+	// previous version of the object on updates. Note that only live
885
+	// changes will include the old object (not historical changes
886
+	// retrieved using ResumeFrom).
887
+	IncludeOldObject bool `protobuf:"varint,3,opt,name=include_old_object,json=includeOldObject,proto3" json:"include_old_object,omitempty"`
888
+}
889
+
890
+func (m *WatchRequest) Reset()                    { *m = WatchRequest{} }
891
+func (*WatchRequest) ProtoMessage()               {}
892
+func (*WatchRequest) Descriptor() ([]byte, []int) { return fileDescriptorStore, []int{4} }
893
+
894
+type WatchRequest_WatchEntry struct {
895
+	// Kind can contain a builtin type such as "node", "secret", etc. or
896
+	// the kind specified by a custom-defined object.
897
+	Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"`
898
+	// Action (create/update/delete)
899
+	// This is a bitmask, so multiple actions may be OR'd together
900
+	Action WatchActionKind `protobuf:"varint,2,opt,name=action,proto3,enum=docker.swarmkit.v1.WatchActionKind" json:"action,omitempty"`
901
+	// Filters are combined using AND logic - an event must match
902
+	// all of them to pass the filter.
903
+	Filters []*SelectBy `protobuf:"bytes,3,rep,name=filters" json:"filters,omitempty"`
904
+}
905
+
906
+func (m *WatchRequest_WatchEntry) Reset()                    { *m = WatchRequest_WatchEntry{} }
907
+func (*WatchRequest_WatchEntry) ProtoMessage()               {}
908
+func (*WatchRequest_WatchEntry) Descriptor() ([]byte, []int) { return fileDescriptorStore, []int{4, 0} }
909
+
910
+// WatchMessage is the type of the stream that's returned to the client by
911
+// Watch. Note that the first item of this stream will always be a WatchMessage
912
+// with a nil Object, to signal that the stream has started.
913
+type WatchMessage struct {
914
+	Events []*WatchMessage_Event `protobuf:"bytes,1,rep,name=events" json:"events,omitempty"`
915
+	// Index versions this change to the data store. It can be used to
916
+	// resume the watch from this point.
917
+	Version *Version `protobuf:"bytes,2,opt,name=version" json:"version,omitempty"`
918
+}
919
+
920
+func (m *WatchMessage) Reset()                    { *m = WatchMessage{} }
921
+func (*WatchMessage) ProtoMessage()               {}
922
+func (*WatchMessage) Descriptor() ([]byte, []int) { return fileDescriptorStore, []int{5} }
923
+
924
+type WatchMessage_Event struct {
925
+	// Action (create/update/delete)
926
+	// Note that WatchMessage does not expose "commit" events that
927
+	// mark transaction boundaries.
928
+	Action WatchActionKind `protobuf:"varint,1,opt,name=action,proto3,enum=docker.swarmkit.v1.WatchActionKind" json:"action,omitempty"`
929
+	// Matched object
930
+	Object *Object `protobuf:"bytes,2,opt,name=object" json:"object,omitempty"`
931
+	// For updates, OldObject will optionally be included in the
932
+	// watch message, containing the previous version of the
933
+	// object, if IncludeOldObject was set in WatchRequest.
934
+	OldObject *Object `protobuf:"bytes,3,opt,name=old_object,json=oldObject" json:"old_object,omitempty"`
935
+}
936
+
937
+func (m *WatchMessage_Event) Reset()                    { *m = WatchMessage_Event{} }
938
+func (*WatchMessage_Event) ProtoMessage()               {}
939
+func (*WatchMessage_Event) Descriptor() ([]byte, []int) { return fileDescriptorStore, []int{5, 0} }
940
+
941
+func init() {
942
+	proto.RegisterType((*Object)(nil), "docker.swarmkit.v1.Object")
943
+	proto.RegisterType((*SelectBySlot)(nil), "docker.swarmkit.v1.SelectBySlot")
944
+	proto.RegisterType((*SelectByCustom)(nil), "docker.swarmkit.v1.SelectByCustom")
945
+	proto.RegisterType((*SelectBy)(nil), "docker.swarmkit.v1.SelectBy")
946
+	proto.RegisterType((*WatchRequest)(nil), "docker.swarmkit.v1.WatchRequest")
947
+	proto.RegisterType((*WatchRequest_WatchEntry)(nil), "docker.swarmkit.v1.WatchRequest.WatchEntry")
948
+	proto.RegisterType((*WatchMessage)(nil), "docker.swarmkit.v1.WatchMessage")
949
+	proto.RegisterType((*WatchMessage_Event)(nil), "docker.swarmkit.v1.WatchMessage.Event")
950
+	proto.RegisterEnum("docker.swarmkit.v1.WatchActionKind", WatchActionKind_name, WatchActionKind_value)
951
+}
952
+
953
+type authenticatedWrapperStoreServer struct {
954
+	local     StoreServer
955
+	authorize func(context.Context, []string) error
956
+}
957
+
958
+func NewAuthenticatedWrapperStoreServer(local StoreServer, authorize func(context.Context, []string) error) StoreServer {
959
+	return &authenticatedWrapperStoreServer{
960
+		local:     local,
961
+		authorize: authorize,
962
+	}
963
+}
964
+
965
+func (p *authenticatedWrapperStoreServer) Watch(r *WatchRequest, stream Store_WatchServer) error {
966
+
967
+	if err := p.authorize(stream.Context(), []string{"swarm-manager"}); err != nil {
968
+		return err
969
+	}
970
+	return p.local.Watch(r, stream)
971
+}
972
+
973
+func (m *Object) Copy() *Object {
974
+	if m == nil {
975
+		return nil
976
+	}
977
+	o := &Object{}
978
+	o.CopyFrom(m)
979
+	return o
980
+}
981
+
982
+func (m *Object) CopyFrom(src interface{}) {
983
+
984
+	o := src.(*Object)
985
+	*m = *o
986
+	if o.Object != nil {
987
+		switch o.Object.(type) {
988
+		case *Object_Node:
989
+			v := Object_Node{
990
+				Node: &Node{},
991
+			}
992
+			github_com_docker_swarmkit_api_deepcopy.Copy(v.Node, o.GetNode())
993
+			m.Object = &v
994
+		case *Object_Service:
995
+			v := Object_Service{
996
+				Service: &Service{},
997
+			}
998
+			github_com_docker_swarmkit_api_deepcopy.Copy(v.Service, o.GetService())
999
+			m.Object = &v
1000
+		case *Object_Network:
1001
+			v := Object_Network{
1002
+				Network: &Network{},
1003
+			}
1004
+			github_com_docker_swarmkit_api_deepcopy.Copy(v.Network, o.GetNetwork())
1005
+			m.Object = &v
1006
+		case *Object_Task:
1007
+			v := Object_Task{
1008
+				Task: &Task{},
1009
+			}
1010
+			github_com_docker_swarmkit_api_deepcopy.Copy(v.Task, o.GetTask())
1011
+			m.Object = &v
1012
+		case *Object_Cluster:
1013
+			v := Object_Cluster{
1014
+				Cluster: &Cluster{},
1015
+			}
1016
+			github_com_docker_swarmkit_api_deepcopy.Copy(v.Cluster, o.GetCluster())
1017
+			m.Object = &v
1018
+		case *Object_Secret:
1019
+			v := Object_Secret{
1020
+				Secret: &Secret{},
1021
+			}
1022
+			github_com_docker_swarmkit_api_deepcopy.Copy(v.Secret, o.GetSecret())
1023
+			m.Object = &v
1024
+		case *Object_Resource:
1025
+			v := Object_Resource{
1026
+				Resource: &Resource{},
1027
+			}
1028
+			github_com_docker_swarmkit_api_deepcopy.Copy(v.Resource, o.GetResource())
1029
+			m.Object = &v
1030
+		case *Object_Extension:
1031
+			v := Object_Extension{
1032
+				Extension: &Extension{},
1033
+			}
1034
+			github_com_docker_swarmkit_api_deepcopy.Copy(v.Extension, o.GetExtension())
1035
+			m.Object = &v
1036
+		}
1037
+	}
1038
+
1039
+}
1040
+
1041
+func (m *SelectBySlot) Copy() *SelectBySlot {
1042
+	if m == nil {
1043
+		return nil
1044
+	}
1045
+	o := &SelectBySlot{}
1046
+	o.CopyFrom(m)
1047
+	return o
1048
+}
1049
+
1050
+func (m *SelectBySlot) CopyFrom(src interface{}) {
1051
+
1052
+	o := src.(*SelectBySlot)
1053
+	*m = *o
1054
+}
1055
+
1056
+func (m *SelectByCustom) Copy() *SelectByCustom {
1057
+	if m == nil {
1058
+		return nil
1059
+	}
1060
+	o := &SelectByCustom{}
1061
+	o.CopyFrom(m)
1062
+	return o
1063
+}
1064
+
1065
+func (m *SelectByCustom) CopyFrom(src interface{}) {
1066
+
1067
+	o := src.(*SelectByCustom)
1068
+	*m = *o
1069
+}
1070
+
1071
+func (m *SelectBy) Copy() *SelectBy {
1072
+	if m == nil {
1073
+		return nil
1074
+	}
1075
+	o := &SelectBy{}
1076
+	o.CopyFrom(m)
1077
+	return o
1078
+}
1079
+
1080
+func (m *SelectBy) CopyFrom(src interface{}) {
1081
+
1082
+	o := src.(*SelectBy)
1083
+	*m = *o
1084
+	if o.By != nil {
1085
+		switch o.By.(type) {
1086
+		case *SelectBy_ID:
1087
+			v := SelectBy_ID{
1088
+				ID: o.GetID(),
1089
+			}
1090
+			m.By = &v
1091
+		case *SelectBy_IDPrefix:
1092
+			v := SelectBy_IDPrefix{
1093
+				IDPrefix: o.GetIDPrefix(),
1094
+			}
1095
+			m.By = &v
1096
+		case *SelectBy_Name:
1097
+			v := SelectBy_Name{
1098
+				Name: o.GetName(),
1099
+			}
1100
+			m.By = &v
1101
+		case *SelectBy_NamePrefix:
1102
+			v := SelectBy_NamePrefix{
1103
+				NamePrefix: o.GetNamePrefix(),
1104
+			}
1105
+			m.By = &v
1106
+		case *SelectBy_Custom:
1107
+			v := SelectBy_Custom{
1108
+				Custom: &SelectByCustom{},
1109
+			}
1110
+			github_com_docker_swarmkit_api_deepcopy.Copy(v.Custom, o.GetCustom())
1111
+			m.By = &v
1112
+		case *SelectBy_CustomPrefix:
1113
+			v := SelectBy_CustomPrefix{
1114
+				CustomPrefix: &SelectByCustom{},
1115
+			}
1116
+			github_com_docker_swarmkit_api_deepcopy.Copy(v.CustomPrefix, o.GetCustomPrefix())
1117
+			m.By = &v
1118
+		case *SelectBy_ServiceID:
1119
+			v := SelectBy_ServiceID{
1120
+				ServiceID: o.GetServiceID(),
1121
+			}
1122
+			m.By = &v
1123
+		case *SelectBy_NodeID:
1124
+			v := SelectBy_NodeID{
1125
+				NodeID: o.GetNodeID(),
1126
+			}
1127
+			m.By = &v
1128
+		case *SelectBy_Slot:
1129
+			v := SelectBy_Slot{
1130
+				Slot: &SelectBySlot{},
1131
+			}
1132
+			github_com_docker_swarmkit_api_deepcopy.Copy(v.Slot, o.GetSlot())
1133
+			m.By = &v
1134
+		case *SelectBy_DesiredState:
1135
+			v := SelectBy_DesiredState{
1136
+				DesiredState: o.GetDesiredState(),
1137
+			}
1138
+			m.By = &v
1139
+		case *SelectBy_Role:
1140
+			v := SelectBy_Role{
1141
+				Role: o.GetRole(),
1142
+			}
1143
+			m.By = &v
1144
+		case *SelectBy_Membership:
1145
+			v := SelectBy_Membership{
1146
+				Membership: o.GetMembership(),
1147
+			}
1148
+			m.By = &v
1149
+		case *SelectBy_ReferencedNetworkID:
1150
+			v := SelectBy_ReferencedNetworkID{
1151
+				ReferencedNetworkID: o.GetReferencedNetworkID(),
1152
+			}
1153
+			m.By = &v
1154
+		case *SelectBy_ReferencedSecretID:
1155
+			v := SelectBy_ReferencedSecretID{
1156
+				ReferencedSecretID: o.GetReferencedSecretID(),
1157
+			}
1158
+			m.By = &v
1159
+		case *SelectBy_Kind:
1160
+			v := SelectBy_Kind{
1161
+				Kind: o.GetKind(),
1162
+			}
1163
+			m.By = &v
1164
+		}
1165
+	}
1166
+
1167
+}
1168
+
1169
+func (m *WatchRequest) Copy() *WatchRequest {
1170
+	if m == nil {
1171
+		return nil
1172
+	}
1173
+	o := &WatchRequest{}
1174
+	o.CopyFrom(m)
1175
+	return o
1176
+}
1177
+
1178
+func (m *WatchRequest) CopyFrom(src interface{}) {
1179
+
1180
+	o := src.(*WatchRequest)
1181
+	*m = *o
1182
+	if o.Entries != nil {
1183
+		m.Entries = make([]*WatchRequest_WatchEntry, len(o.Entries))
1184
+		for i := range m.Entries {
1185
+			m.Entries[i] = &WatchRequest_WatchEntry{}
1186
+			github_com_docker_swarmkit_api_deepcopy.Copy(m.Entries[i], o.Entries[i])
1187
+		}
1188
+	}
1189
+
1190
+	if o.ResumeFrom != nil {
1191
+		m.ResumeFrom = &Version{}
1192
+		github_com_docker_swarmkit_api_deepcopy.Copy(m.ResumeFrom, o.ResumeFrom)
1193
+	}
1194
+}
1195
+
1196
+func (m *WatchRequest_WatchEntry) Copy() *WatchRequest_WatchEntry {
1197
+	if m == nil {
1198
+		return nil
1199
+	}
1200
+	o := &WatchRequest_WatchEntry{}
1201
+	o.CopyFrom(m)
1202
+	return o
1203
+}
1204
+
1205
+func (m *WatchRequest_WatchEntry) CopyFrom(src interface{}) {
1206
+
1207
+	o := src.(*WatchRequest_WatchEntry)
1208
+	*m = *o
1209
+	if o.Filters != nil {
1210
+		m.Filters = make([]*SelectBy, len(o.Filters))
1211
+		for i := range m.Filters {
1212
+			m.Filters[i] = &SelectBy{}
1213
+			github_com_docker_swarmkit_api_deepcopy.Copy(m.Filters[i], o.Filters[i])
1214
+		}
1215
+	}
1216
+
1217
+}
1218
+
1219
+func (m *WatchMessage) Copy() *WatchMessage {
1220
+	if m == nil {
1221
+		return nil
1222
+	}
1223
+	o := &WatchMessage{}
1224
+	o.CopyFrom(m)
1225
+	return o
1226
+}
1227
+
1228
+func (m *WatchMessage) CopyFrom(src interface{}) {
1229
+
1230
+	o := src.(*WatchMessage)
1231
+	*m = *o
1232
+	if o.Events != nil {
1233
+		m.Events = make([]*WatchMessage_Event, len(o.Events))
1234
+		for i := range m.Events {
1235
+			m.Events[i] = &WatchMessage_Event{}
1236
+			github_com_docker_swarmkit_api_deepcopy.Copy(m.Events[i], o.Events[i])
1237
+		}
1238
+	}
1239
+
1240
+	if o.Version != nil {
1241
+		m.Version = &Version{}
1242
+		github_com_docker_swarmkit_api_deepcopy.Copy(m.Version, o.Version)
1243
+	}
1244
+}
1245
+
1246
+func (m *WatchMessage_Event) Copy() *WatchMessage_Event {
1247
+	if m == nil {
1248
+		return nil
1249
+	}
1250
+	o := &WatchMessage_Event{}
1251
+	o.CopyFrom(m)
1252
+	return o
1253
+}
1254
+
1255
+func (m *WatchMessage_Event) CopyFrom(src interface{}) {
1256
+
1257
+	o := src.(*WatchMessage_Event)
1258
+	*m = *o
1259
+	if o.Object != nil {
1260
+		m.Object = &Object{}
1261
+		github_com_docker_swarmkit_api_deepcopy.Copy(m.Object, o.Object)
1262
+	}
1263
+	if o.OldObject != nil {
1264
+		m.OldObject = &Object{}
1265
+		github_com_docker_swarmkit_api_deepcopy.Copy(m.OldObject, o.OldObject)
1266
+	}
1267
+}
1268
+
1269
+// Reference imports to suppress errors if they are not otherwise used.
1270
+var _ context.Context
1271
+var _ grpc.ClientConn
1272
+
1273
+// This is a compile-time assertion to ensure that this generated file
1274
+// is compatible with the grpc package it is being compiled against.
1275
+const _ = grpc.SupportPackageIsVersion4
1276
+
1277
+// Client API for Store service
1278
+
1279
+type StoreClient interface {
1280
+	// Watch starts a stream that returns any changes to objects that match
1281
+	// the specified selectors. When the stream begins, it immediately sends
1282
+	// an empty message back to the client. It is important to wait for
1283
+	// this message before taking any actions that depend on an established
1284
+	// stream of changes for consistency.
1285
+	Watch(ctx context.Context, in *WatchRequest, opts ...grpc.CallOption) (Store_WatchClient, error)
1286
+}
1287
+
1288
+type storeClient struct {
1289
+	cc *grpc.ClientConn
1290
+}
1291
+
1292
+func NewStoreClient(cc *grpc.ClientConn) StoreClient {
1293
+	return &storeClient{cc}
1294
+}
1295
+
1296
+func (c *storeClient) Watch(ctx context.Context, in *WatchRequest, opts ...grpc.CallOption) (Store_WatchClient, error) {
1297
+	stream, err := grpc.NewClientStream(ctx, &_Store_serviceDesc.Streams[0], c.cc, "/docker.swarmkit.v1.Store/Watch", opts...)
1298
+	if err != nil {
1299
+		return nil, err
1300
+	}
1301
+	x := &storeWatchClient{stream}
1302
+	if err := x.ClientStream.SendMsg(in); err != nil {
1303
+		return nil, err
1304
+	}
1305
+	if err := x.ClientStream.CloseSend(); err != nil {
1306
+		return nil, err
1307
+	}
1308
+	return x, nil
1309
+}
1310
+
1311
+type Store_WatchClient interface {
1312
+	Recv() (*WatchMessage, error)
1313
+	grpc.ClientStream
1314
+}
1315
+
1316
+type storeWatchClient struct {
1317
+	grpc.ClientStream
1318
+}
1319
+
1320
+func (x *storeWatchClient) Recv() (*WatchMessage, error) {
1321
+	m := new(WatchMessage)
1322
+	if err := x.ClientStream.RecvMsg(m); err != nil {
1323
+		return nil, err
1324
+	}
1325
+	return m, nil
1326
+}
1327
+
1328
+// Server API for Store service
1329
+
1330
+type StoreServer interface {
1331
+	// Watch starts a stream that returns any changes to objects that match
1332
+	// the specified selectors. When the stream begins, it immediately sends
1333
+	// an empty message back to the client. It is important to wait for
1334
+	// this message before taking any actions that depend on an established
1335
+	// stream of changes for consistency.
1336
+	Watch(*WatchRequest, Store_WatchServer) error
1337
+}
1338
+
1339
+func RegisterStoreServer(s *grpc.Server, srv StoreServer) {
1340
+	s.RegisterService(&_Store_serviceDesc, srv)
1341
+}
1342
+
1343
+func _Store_Watch_Handler(srv interface{}, stream grpc.ServerStream) error {
1344
+	m := new(WatchRequest)
1345
+	if err := stream.RecvMsg(m); err != nil {
1346
+		return err
1347
+	}
1348
+	return srv.(StoreServer).Watch(m, &storeWatchServer{stream})
1349
+}
1350
+
1351
+type Store_WatchServer interface {
1352
+	Send(*WatchMessage) error
1353
+	grpc.ServerStream
1354
+}
1355
+
1356
+type storeWatchServer struct {
1357
+	grpc.ServerStream
1358
+}
1359
+
1360
+func (x *storeWatchServer) Send(m *WatchMessage) error {
1361
+	return x.ServerStream.SendMsg(m)
1362
+}
1363
+
1364
+var _Store_serviceDesc = grpc.ServiceDesc{
1365
+	ServiceName: "docker.swarmkit.v1.Store",
1366
+	HandlerType: (*StoreServer)(nil),
1367
+	Methods:     []grpc.MethodDesc{},
1368
+	Streams: []grpc.StreamDesc{
1369
+		{
1370
+			StreamName:    "Watch",
1371
+			Handler:       _Store_Watch_Handler,
1372
+			ServerStreams: true,
1373
+		},
1374
+	},
1375
+	Metadata: "store.proto",
1376
+}
1377
+
1378
+func (m *Object) Marshal() (dAtA []byte, err error) {
1379
+	size := m.Size()
1380
+	dAtA = make([]byte, size)
1381
+	n, err := m.MarshalTo(dAtA)
1382
+	if err != nil {
1383
+		return nil, err
1384
+	}
1385
+	return dAtA[:n], nil
1386
+}
1387
+
1388
+func (m *Object) MarshalTo(dAtA []byte) (int, error) {
1389
+	var i int
1390
+	_ = i
1391
+	var l int
1392
+	_ = l
1393
+	if m.Object != nil {
1394
+		nn1, err := m.Object.MarshalTo(dAtA[i:])
1395
+		if err != nil {
1396
+			return 0, err
1397
+		}
1398
+		i += nn1
1399
+	}
1400
+	return i, nil
1401
+}
1402
+
1403
+func (m *Object_Node) MarshalTo(dAtA []byte) (int, error) {
1404
+	i := 0
1405
+	if m.Node != nil {
1406
+		dAtA[i] = 0xa
1407
+		i++
1408
+		i = encodeVarintStore(dAtA, i, uint64(m.Node.Size()))
1409
+		n2, err := m.Node.MarshalTo(dAtA[i:])
1410
+		if err != nil {
1411
+			return 0, err
1412
+		}
1413
+		i += n2
1414
+	}
1415
+	return i, nil
1416
+}
1417
+func (m *Object_Service) MarshalTo(dAtA []byte) (int, error) {
1418
+	i := 0
1419
+	if m.Service != nil {
1420
+		dAtA[i] = 0x12
1421
+		i++
1422
+		i = encodeVarintStore(dAtA, i, uint64(m.Service.Size()))
1423
+		n3, err := m.Service.MarshalTo(dAtA[i:])
1424
+		if err != nil {
1425
+			return 0, err
1426
+		}
1427
+		i += n3
1428
+	}
1429
+	return i, nil
1430
+}
1431
+func (m *Object_Network) MarshalTo(dAtA []byte) (int, error) {
1432
+	i := 0
1433
+	if m.Network != nil {
1434
+		dAtA[i] = 0x1a
1435
+		i++
1436
+		i = encodeVarintStore(dAtA, i, uint64(m.Network.Size()))
1437
+		n4, err := m.Network.MarshalTo(dAtA[i:])
1438
+		if err != nil {
1439
+			return 0, err
1440
+		}
1441
+		i += n4
1442
+	}
1443
+	return i, nil
1444
+}
1445
+func (m *Object_Task) MarshalTo(dAtA []byte) (int, error) {
1446
+	i := 0
1447
+	if m.Task != nil {
1448
+		dAtA[i] = 0x22
1449
+		i++
1450
+		i = encodeVarintStore(dAtA, i, uint64(m.Task.Size()))
1451
+		n5, err := m.Task.MarshalTo(dAtA[i:])
1452
+		if err != nil {
1453
+			return 0, err
1454
+		}
1455
+		i += n5
1456
+	}
1457
+	return i, nil
1458
+}
1459
+func (m *Object_Cluster) MarshalTo(dAtA []byte) (int, error) {
1460
+	i := 0
1461
+	if m.Cluster != nil {
1462
+		dAtA[i] = 0x2a
1463
+		i++
1464
+		i = encodeVarintStore(dAtA, i, uint64(m.Cluster.Size()))
1465
+		n6, err := m.Cluster.MarshalTo(dAtA[i:])
1466
+		if err != nil {
1467
+			return 0, err
1468
+		}
1469
+		i += n6
1470
+	}
1471
+	return i, nil
1472
+}
1473
+func (m *Object_Secret) MarshalTo(dAtA []byte) (int, error) {
1474
+	i := 0
1475
+	if m.Secret != nil {
1476
+		dAtA[i] = 0x32
1477
+		i++
1478
+		i = encodeVarintStore(dAtA, i, uint64(m.Secret.Size()))
1479
+		n7, err := m.Secret.MarshalTo(dAtA[i:])
1480
+		if err != nil {
1481
+			return 0, err
1482
+		}
1483
+		i += n7
1484
+	}
1485
+	return i, nil
1486
+}
1487
+func (m *Object_Resource) MarshalTo(dAtA []byte) (int, error) {
1488
+	i := 0
1489
+	if m.Resource != nil {
1490
+		dAtA[i] = 0x3a
1491
+		i++
1492
+		i = encodeVarintStore(dAtA, i, uint64(m.Resource.Size()))
1493
+		n8, err := m.Resource.MarshalTo(dAtA[i:])
1494
+		if err != nil {
1495
+			return 0, err
1496
+		}
1497
+		i += n8
1498
+	}
1499
+	return i, nil
1500
+}
1501
+func (m *Object_Extension) MarshalTo(dAtA []byte) (int, error) {
1502
+	i := 0
1503
+	if m.Extension != nil {
1504
+		dAtA[i] = 0x42
1505
+		i++
1506
+		i = encodeVarintStore(dAtA, i, uint64(m.Extension.Size()))
1507
+		n9, err := m.Extension.MarshalTo(dAtA[i:])
1508
+		if err != nil {
1509
+			return 0, err
1510
+		}
1511
+		i += n9
1512
+	}
1513
+	return i, nil
1514
+}
1515
+func (m *SelectBySlot) Marshal() (dAtA []byte, err error) {
1516
+	size := m.Size()
1517
+	dAtA = make([]byte, size)
1518
+	n, err := m.MarshalTo(dAtA)
1519
+	if err != nil {
1520
+		return nil, err
1521
+	}
1522
+	return dAtA[:n], nil
1523
+}
1524
+
1525
+func (m *SelectBySlot) MarshalTo(dAtA []byte) (int, error) {
1526
+	var i int
1527
+	_ = i
1528
+	var l int
1529
+	_ = l
1530
+	if len(m.ServiceID) > 0 {
1531
+		dAtA[i] = 0xa
1532
+		i++
1533
+		i = encodeVarintStore(dAtA, i, uint64(len(m.ServiceID)))
1534
+		i += copy(dAtA[i:], m.ServiceID)
1535
+	}
1536
+	if m.Slot != 0 {
1537
+		dAtA[i] = 0x10
1538
+		i++
1539
+		i = encodeVarintStore(dAtA, i, uint64(m.Slot))
1540
+	}
1541
+	return i, nil
1542
+}
1543
+
1544
+func (m *SelectByCustom) Marshal() (dAtA []byte, err error) {
1545
+	size := m.Size()
1546
+	dAtA = make([]byte, size)
1547
+	n, err := m.MarshalTo(dAtA)
1548
+	if err != nil {
1549
+		return nil, err
1550
+	}
1551
+	return dAtA[:n], nil
1552
+}
1553
+
1554
+func (m *SelectByCustom) MarshalTo(dAtA []byte) (int, error) {
1555
+	var i int
1556
+	_ = i
1557
+	var l int
1558
+	_ = l
1559
+	if len(m.Kind) > 0 {
1560
+		dAtA[i] = 0xa
1561
+		i++
1562
+		i = encodeVarintStore(dAtA, i, uint64(len(m.Kind)))
1563
+		i += copy(dAtA[i:], m.Kind)
1564
+	}
1565
+	if len(m.Index) > 0 {
1566
+		dAtA[i] = 0x12
1567
+		i++
1568
+		i = encodeVarintStore(dAtA, i, uint64(len(m.Index)))
1569
+		i += copy(dAtA[i:], m.Index)
1570
+	}
1571
+	if len(m.Value) > 0 {
1572
+		dAtA[i] = 0x1a
1573
+		i++
1574
+		i = encodeVarintStore(dAtA, i, uint64(len(m.Value)))
1575
+		i += copy(dAtA[i:], m.Value)
1576
+	}
1577
+	return i, nil
1578
+}
1579
+
1580
+func (m *SelectBy) Marshal() (dAtA []byte, err error) {
1581
+	size := m.Size()
1582
+	dAtA = make([]byte, size)
1583
+	n, err := m.MarshalTo(dAtA)
1584
+	if err != nil {
1585
+		return nil, err
1586
+	}
1587
+	return dAtA[:n], nil
1588
+}
1589
+
1590
+func (m *SelectBy) MarshalTo(dAtA []byte) (int, error) {
1591
+	var i int
1592
+	_ = i
1593
+	var l int
1594
+	_ = l
1595
+	if m.By != nil {
1596
+		nn10, err := m.By.MarshalTo(dAtA[i:])
1597
+		if err != nil {
1598
+			return 0, err
1599
+		}
1600
+		i += nn10
1601
+	}
1602
+	return i, nil
1603
+}
1604
+
1605
+func (m *SelectBy_ID) MarshalTo(dAtA []byte) (int, error) {
1606
+	i := 0
1607
+	dAtA[i] = 0xa
1608
+	i++
1609
+	i = encodeVarintStore(dAtA, i, uint64(len(m.ID)))
1610
+	i += copy(dAtA[i:], m.ID)
1611
+	return i, nil
1612
+}
1613
+func (m *SelectBy_IDPrefix) MarshalTo(dAtA []byte) (int, error) {
1614
+	i := 0
1615
+	dAtA[i] = 0x12
1616
+	i++
1617
+	i = encodeVarintStore(dAtA, i, uint64(len(m.IDPrefix)))
1618
+	i += copy(dAtA[i:], m.IDPrefix)
1619
+	return i, nil
1620
+}
1621
+func (m *SelectBy_Name) MarshalTo(dAtA []byte) (int, error) {
1622
+	i := 0
1623
+	dAtA[i] = 0x1a
1624
+	i++
1625
+	i = encodeVarintStore(dAtA, i, uint64(len(m.Name)))
1626
+	i += copy(dAtA[i:], m.Name)
1627
+	return i, nil
1628
+}
1629
+func (m *SelectBy_NamePrefix) MarshalTo(dAtA []byte) (int, error) {
1630
+	i := 0
1631
+	dAtA[i] = 0x22
1632
+	i++
1633
+	i = encodeVarintStore(dAtA, i, uint64(len(m.NamePrefix)))
1634
+	i += copy(dAtA[i:], m.NamePrefix)
1635
+	return i, nil
1636
+}
1637
+func (m *SelectBy_Custom) MarshalTo(dAtA []byte) (int, error) {
1638
+	i := 0
1639
+	if m.Custom != nil {
1640
+		dAtA[i] = 0x2a
1641
+		i++
1642
+		i = encodeVarintStore(dAtA, i, uint64(m.Custom.Size()))
1643
+		n11, err := m.Custom.MarshalTo(dAtA[i:])
1644
+		if err != nil {
1645
+			return 0, err
1646
+		}
1647
+		i += n11
1648
+	}
1649
+	return i, nil
1650
+}
1651
+func (m *SelectBy_CustomPrefix) MarshalTo(dAtA []byte) (int, error) {
1652
+	i := 0
1653
+	if m.CustomPrefix != nil {
1654
+		dAtA[i] = 0x32
1655
+		i++
1656
+		i = encodeVarintStore(dAtA, i, uint64(m.CustomPrefix.Size()))
1657
+		n12, err := m.CustomPrefix.MarshalTo(dAtA[i:])
1658
+		if err != nil {
1659
+			return 0, err
1660
+		}
1661
+		i += n12
1662
+	}
1663
+	return i, nil
1664
+}
1665
+func (m *SelectBy_ServiceID) MarshalTo(dAtA []byte) (int, error) {
1666
+	i := 0
1667
+	dAtA[i] = 0x3a
1668
+	i++
1669
+	i = encodeVarintStore(dAtA, i, uint64(len(m.ServiceID)))
1670
+	i += copy(dAtA[i:], m.ServiceID)
1671
+	return i, nil
1672
+}
1673
+func (m *SelectBy_NodeID) MarshalTo(dAtA []byte) (int, error) {
1674
+	i := 0
1675
+	dAtA[i] = 0x42
1676
+	i++
1677
+	i = encodeVarintStore(dAtA, i, uint64(len(m.NodeID)))
1678
+	i += copy(dAtA[i:], m.NodeID)
1679
+	return i, nil
1680
+}
1681
+func (m *SelectBy_Slot) MarshalTo(dAtA []byte) (int, error) {
1682
+	i := 0
1683
+	if m.Slot != nil {
1684
+		dAtA[i] = 0x4a
1685
+		i++
1686
+		i = encodeVarintStore(dAtA, i, uint64(m.Slot.Size()))
1687
+		n13, err := m.Slot.MarshalTo(dAtA[i:])
1688
+		if err != nil {
1689
+			return 0, err
1690
+		}
1691
+		i += n13
1692
+	}
1693
+	return i, nil
1694
+}
1695
+func (m *SelectBy_DesiredState) MarshalTo(dAtA []byte) (int, error) {
1696
+	i := 0
1697
+	dAtA[i] = 0x50
1698
+	i++
1699
+	i = encodeVarintStore(dAtA, i, uint64(m.DesiredState))
1700
+	return i, nil
1701
+}
1702
+func (m *SelectBy_Role) MarshalTo(dAtA []byte) (int, error) {
1703
+	i := 0
1704
+	dAtA[i] = 0x58
1705
+	i++
1706
+	i = encodeVarintStore(dAtA, i, uint64(m.Role))
1707
+	return i, nil
1708
+}
1709
+func (m *SelectBy_Membership) MarshalTo(dAtA []byte) (int, error) {
1710
+	i := 0
1711
+	dAtA[i] = 0x60
1712
+	i++
1713
+	i = encodeVarintStore(dAtA, i, uint64(m.Membership))
1714
+	return i, nil
1715
+}
1716
+func (m *SelectBy_ReferencedNetworkID) MarshalTo(dAtA []byte) (int, error) {
1717
+	i := 0
1718
+	dAtA[i] = 0x6a
1719
+	i++
1720
+	i = encodeVarintStore(dAtA, i, uint64(len(m.ReferencedNetworkID)))
1721
+	i += copy(dAtA[i:], m.ReferencedNetworkID)
1722
+	return i, nil
1723
+}
1724
+func (m *SelectBy_ReferencedSecretID) MarshalTo(dAtA []byte) (int, error) {
1725
+	i := 0
1726
+	dAtA[i] = 0x72
1727
+	i++
1728
+	i = encodeVarintStore(dAtA, i, uint64(len(m.ReferencedSecretID)))
1729
+	i += copy(dAtA[i:], m.ReferencedSecretID)
1730
+	return i, nil
1731
+}
1732
+func (m *SelectBy_Kind) MarshalTo(dAtA []byte) (int, error) {
1733
+	i := 0
1734
+	dAtA[i] = 0x7a
1735
+	i++
1736
+	i = encodeVarintStore(dAtA, i, uint64(len(m.Kind)))
1737
+	i += copy(dAtA[i:], m.Kind)
1738
+	return i, nil
1739
+}
1740
+func (m *WatchRequest) Marshal() (dAtA []byte, err error) {
1741
+	size := m.Size()
1742
+	dAtA = make([]byte, size)
1743
+	n, err := m.MarshalTo(dAtA)
1744
+	if err != nil {
1745
+		return nil, err
1746
+	}
1747
+	return dAtA[:n], nil
1748
+}
1749
+
1750
+func (m *WatchRequest) MarshalTo(dAtA []byte) (int, error) {
1751
+	var i int
1752
+	_ = i
1753
+	var l int
1754
+	_ = l
1755
+	if len(m.Entries) > 0 {
1756
+		for _, msg := range m.Entries {
1757
+			dAtA[i] = 0xa
1758
+			i++
1759
+			i = encodeVarintStore(dAtA, i, uint64(msg.Size()))
1760
+			n, err := msg.MarshalTo(dAtA[i:])
1761
+			if err != nil {
1762
+				return 0, err
1763
+			}
1764
+			i += n
1765
+		}
1766
+	}
1767
+	if m.ResumeFrom != nil {
1768
+		dAtA[i] = 0x12
1769
+		i++
1770
+		i = encodeVarintStore(dAtA, i, uint64(m.ResumeFrom.Size()))
1771
+		n14, err := m.ResumeFrom.MarshalTo(dAtA[i:])
1772
+		if err != nil {
1773
+			return 0, err
1774
+		}
1775
+		i += n14
1776
+	}
1777
+	if m.IncludeOldObject {
1778
+		dAtA[i] = 0x18
1779
+		i++
1780
+		if m.IncludeOldObject {
1781
+			dAtA[i] = 1
1782
+		} else {
1783
+			dAtA[i] = 0
1784
+		}
1785
+		i++
1786
+	}
1787
+	return i, nil
1788
+}
1789
+
1790
+func (m *WatchRequest_WatchEntry) Marshal() (dAtA []byte, err error) {
1791
+	size := m.Size()
1792
+	dAtA = make([]byte, size)
1793
+	n, err := m.MarshalTo(dAtA)
1794
+	if err != nil {
1795
+		return nil, err
1796
+	}
1797
+	return dAtA[:n], nil
1798
+}
1799
+
1800
+func (m *WatchRequest_WatchEntry) MarshalTo(dAtA []byte) (int, error) {
1801
+	var i int
1802
+	_ = i
1803
+	var l int
1804
+	_ = l
1805
+	if len(m.Kind) > 0 {
1806
+		dAtA[i] = 0xa
1807
+		i++
1808
+		i = encodeVarintStore(dAtA, i, uint64(len(m.Kind)))
1809
+		i += copy(dAtA[i:], m.Kind)
1810
+	}
1811
+	if m.Action != 0 {
1812
+		dAtA[i] = 0x10
1813
+		i++
1814
+		i = encodeVarintStore(dAtA, i, uint64(m.Action))
1815
+	}
1816
+	if len(m.Filters) > 0 {
1817
+		for _, msg := range m.Filters {
1818
+			dAtA[i] = 0x1a
1819
+			i++
1820
+			i = encodeVarintStore(dAtA, i, uint64(msg.Size()))
1821
+			n, err := msg.MarshalTo(dAtA[i:])
1822
+			if err != nil {
1823
+				return 0, err
1824
+			}
1825
+			i += n
1826
+		}
1827
+	}
1828
+	return i, nil
1829
+}
1830
+
1831
+func (m *WatchMessage) Marshal() (dAtA []byte, err error) {
1832
+	size := m.Size()
1833
+	dAtA = make([]byte, size)
1834
+	n, err := m.MarshalTo(dAtA)
1835
+	if err != nil {
1836
+		return nil, err
1837
+	}
1838
+	return dAtA[:n], nil
1839
+}
1840
+
1841
+func (m *WatchMessage) MarshalTo(dAtA []byte) (int, error) {
1842
+	var i int
1843
+	_ = i
1844
+	var l int
1845
+	_ = l
1846
+	if len(m.Events) > 0 {
1847
+		for _, msg := range m.Events {
1848
+			dAtA[i] = 0xa
1849
+			i++
1850
+			i = encodeVarintStore(dAtA, i, uint64(msg.Size()))
1851
+			n, err := msg.MarshalTo(dAtA[i:])
1852
+			if err != nil {
1853
+				return 0, err
1854
+			}
1855
+			i += n
1856
+		}
1857
+	}
1858
+	if m.Version != nil {
1859
+		dAtA[i] = 0x12
1860
+		i++
1861
+		i = encodeVarintStore(dAtA, i, uint64(m.Version.Size()))
1862
+		n15, err := m.Version.MarshalTo(dAtA[i:])
1863
+		if err != nil {
1864
+			return 0, err
1865
+		}
1866
+		i += n15
1867
+	}
1868
+	return i, nil
1869
+}
1870
+
1871
+func (m *WatchMessage_Event) Marshal() (dAtA []byte, err error) {
1872
+	size := m.Size()
1873
+	dAtA = make([]byte, size)
1874
+	n, err := m.MarshalTo(dAtA)
1875
+	if err != nil {
1876
+		return nil, err
1877
+	}
1878
+	return dAtA[:n], nil
1879
+}
1880
+
1881
+func (m *WatchMessage_Event) MarshalTo(dAtA []byte) (int, error) {
1882
+	var i int
1883
+	_ = i
1884
+	var l int
1885
+	_ = l
1886
+	if m.Action != 0 {
1887
+		dAtA[i] = 0x8
1888
+		i++
1889
+		i = encodeVarintStore(dAtA, i, uint64(m.Action))
1890
+	}
1891
+	if m.Object != nil {
1892
+		dAtA[i] = 0x12
1893
+		i++
1894
+		i = encodeVarintStore(dAtA, i, uint64(m.Object.Size()))
1895
+		n16, err := m.Object.MarshalTo(dAtA[i:])
1896
+		if err != nil {
1897
+			return 0, err
1898
+		}
1899
+		i += n16
1900
+	}
1901
+	if m.OldObject != nil {
1902
+		dAtA[i] = 0x1a
1903
+		i++
1904
+		i = encodeVarintStore(dAtA, i, uint64(m.OldObject.Size()))
1905
+		n17, err := m.OldObject.MarshalTo(dAtA[i:])
1906
+		if err != nil {
1907
+			return 0, err
1908
+		}
1909
+		i += n17
1910
+	}
1911
+	return i, nil
1912
+}
1913
+
1914
+func encodeFixed64Store(dAtA []byte, offset int, v uint64) int {
1915
+	dAtA[offset] = uint8(v)
1916
+	dAtA[offset+1] = uint8(v >> 8)
1917
+	dAtA[offset+2] = uint8(v >> 16)
1918
+	dAtA[offset+3] = uint8(v >> 24)
1919
+	dAtA[offset+4] = uint8(v >> 32)
1920
+	dAtA[offset+5] = uint8(v >> 40)
1921
+	dAtA[offset+6] = uint8(v >> 48)
1922
+	dAtA[offset+7] = uint8(v >> 56)
1923
+	return offset + 8
1924
+}
1925
+func encodeFixed32Store(dAtA []byte, offset int, v uint32) int {
1926
+	dAtA[offset] = uint8(v)
1927
+	dAtA[offset+1] = uint8(v >> 8)
1928
+	dAtA[offset+2] = uint8(v >> 16)
1929
+	dAtA[offset+3] = uint8(v >> 24)
1930
+	return offset + 4
1931
+}
1932
+func encodeVarintStore(dAtA []byte, offset int, v uint64) int {
1933
+	for v >= 1<<7 {
1934
+		dAtA[offset] = uint8(v&0x7f | 0x80)
1935
+		v >>= 7
1936
+		offset++
1937
+	}
1938
+	dAtA[offset] = uint8(v)
1939
+	return offset + 1
1940
+}
1941
+
1942
+type raftProxyStoreServer struct {
1943
+	local                       StoreServer
1944
+	connSelector                raftselector.ConnProvider
1945
+	localCtxMods, remoteCtxMods []func(context.Context) (context.Context, error)
1946
+}
1947
+
1948
+func NewRaftProxyStoreServer(local StoreServer, connSelector raftselector.ConnProvider, localCtxMod, remoteCtxMod func(context.Context) (context.Context, error)) StoreServer {
1949
+	redirectChecker := func(ctx context.Context) (context.Context, error) {
1950
+		s, ok := transport.StreamFromContext(ctx)
1951
+		if !ok {
1952
+			return ctx, grpc.Errorf(codes.InvalidArgument, "remote addr is not found in context")
1953
+		}
1954
+		addr := s.ServerTransport().RemoteAddr().String()
1955
+		md, ok := metadata.FromContext(ctx)
1956
+		if ok && len(md["redirect"]) != 0 {
1957
+			return ctx, grpc.Errorf(codes.ResourceExhausted, "more than one redirect to leader from: %s", md["redirect"])
1958
+		}
1959
+		if !ok {
1960
+			md = metadata.New(map[string]string{})
1961
+		}
1962
+		md["redirect"] = append(md["redirect"], addr)
1963
+		return metadata.NewContext(ctx, md), nil
1964
+	}
1965
+	remoteMods := []func(context.Context) (context.Context, error){redirectChecker}
1966
+	remoteMods = append(remoteMods, remoteCtxMod)
1967
+
1968
+	var localMods []func(context.Context) (context.Context, error)
1969
+	if localCtxMod != nil {
1970
+		localMods = []func(context.Context) (context.Context, error){localCtxMod}
1971
+	}
1972
+
1973
+	return &raftProxyStoreServer{
1974
+		local:         local,
1975
+		connSelector:  connSelector,
1976
+		localCtxMods:  localMods,
1977
+		remoteCtxMods: remoteMods,
1978
+	}
1979
+}
1980
+func (p *raftProxyStoreServer) runCtxMods(ctx context.Context, ctxMods []func(context.Context) (context.Context, error)) (context.Context, error) {
1981
+	var err error
1982
+	for _, mod := range ctxMods {
1983
+		ctx, err = mod(ctx)
1984
+		if err != nil {
1985
+			return ctx, err
1986
+		}
1987
+	}
1988
+	return ctx, nil
1989
+}
1990
+func (p *raftProxyStoreServer) pollNewLeaderConn(ctx context.Context) (*grpc.ClientConn, error) {
1991
+	ticker := rafttime.NewTicker(500 * rafttime.Millisecond)
1992
+	defer ticker.Stop()
1993
+	for {
1994
+		select {
1995
+		case <-ticker.C:
1996
+			conn, err := p.connSelector.LeaderConn(ctx)
1997
+			if err != nil {
1998
+				return nil, err
1999
+			}
2000
+
2001
+			client := NewHealthClient(conn)
2002
+
2003
+			resp, err := client.Check(ctx, &HealthCheckRequest{Service: "Raft"})
2004
+			if err != nil || resp.Status != HealthCheckResponse_SERVING {
2005
+				continue
2006
+			}
2007
+			return conn, nil
2008
+		case <-ctx.Done():
2009
+			return nil, ctx.Err()
2010
+		}
2011
+	}
2012
+}
2013
+
2014
+type Store_WatchServerWrapper struct {
2015
+	Store_WatchServer
2016
+	ctx context.Context
2017
+}
2018
+
2019
+func (s Store_WatchServerWrapper) Context() context.Context {
2020
+	return s.ctx
2021
+}
2022
+
2023
+func (p *raftProxyStoreServer) Watch(r *WatchRequest, stream Store_WatchServer) error {
2024
+	ctx := stream.Context()
2025
+	conn, err := p.connSelector.LeaderConn(ctx)
2026
+	if err != nil {
2027
+		if err == raftselector.ErrIsLeader {
2028
+			ctx, err = p.runCtxMods(ctx, p.localCtxMods)
2029
+			if err != nil {
2030
+				return err
2031
+			}
2032
+			streamWrapper := Store_WatchServerWrapper{
2033
+				Store_WatchServer: stream,
2034
+				ctx:               ctx,
2035
+			}
2036
+			return p.local.Watch(r, streamWrapper)
2037
+		}
2038
+		return err
2039
+	}
2040
+	ctx, err = p.runCtxMods(ctx, p.remoteCtxMods)
2041
+	if err != nil {
2042
+		return err
2043
+	}
2044
+	clientStream, err := NewStoreClient(conn).Watch(ctx, r)
2045
+
2046
+	if err != nil {
2047
+		return err
2048
+	}
2049
+
2050
+	for {
2051
+		msg, err := clientStream.Recv()
2052
+		if err == io.EOF {
2053
+			break
2054
+		}
2055
+		if err != nil {
2056
+			return err
2057
+		}
2058
+		if err := stream.Send(msg); err != nil {
2059
+			return err
2060
+		}
2061
+	}
2062
+	return nil
2063
+}
2064
+
2065
+func (m *Object) Size() (n int) {
2066
+	var l int
2067
+	_ = l
2068
+	if m.Object != nil {
2069
+		n += m.Object.Size()
2070
+	}
2071
+	return n
2072
+}
2073
+
2074
+func (m *Object_Node) Size() (n int) {
2075
+	var l int
2076
+	_ = l
2077
+	if m.Node != nil {
2078
+		l = m.Node.Size()
2079
+		n += 1 + l + sovStore(uint64(l))
2080
+	}
2081
+	return n
2082
+}
2083
+func (m *Object_Service) Size() (n int) {
2084
+	var l int
2085
+	_ = l
2086
+	if m.Service != nil {
2087
+		l = m.Service.Size()
2088
+		n += 1 + l + sovStore(uint64(l))
2089
+	}
2090
+	return n
2091
+}
2092
+func (m *Object_Network) Size() (n int) {
2093
+	var l int
2094
+	_ = l
2095
+	if m.Network != nil {
2096
+		l = m.Network.Size()
2097
+		n += 1 + l + sovStore(uint64(l))
2098
+	}
2099
+	return n
2100
+}
2101
+func (m *Object_Task) Size() (n int) {
2102
+	var l int
2103
+	_ = l
2104
+	if m.Task != nil {
2105
+		l = m.Task.Size()
2106
+		n += 1 + l + sovStore(uint64(l))
2107
+	}
2108
+	return n
2109
+}
2110
+func (m *Object_Cluster) Size() (n int) {
2111
+	var l int
2112
+	_ = l
2113
+	if m.Cluster != nil {
2114
+		l = m.Cluster.Size()
2115
+		n += 1 + l + sovStore(uint64(l))
2116
+	}
2117
+	return n
2118
+}
2119
+func (m *Object_Secret) Size() (n int) {
2120
+	var l int
2121
+	_ = l
2122
+	if m.Secret != nil {
2123
+		l = m.Secret.Size()
2124
+		n += 1 + l + sovStore(uint64(l))
2125
+	}
2126
+	return n
2127
+}
2128
+func (m *Object_Resource) Size() (n int) {
2129
+	var l int
2130
+	_ = l
2131
+	if m.Resource != nil {
2132
+		l = m.Resource.Size()
2133
+		n += 1 + l + sovStore(uint64(l))
2134
+	}
2135
+	return n
2136
+}
2137
+func (m *Object_Extension) Size() (n int) {
2138
+	var l int
2139
+	_ = l
2140
+	if m.Extension != nil {
2141
+		l = m.Extension.Size()
2142
+		n += 1 + l + sovStore(uint64(l))
2143
+	}
2144
+	return n
2145
+}
2146
+func (m *SelectBySlot) Size() (n int) {
2147
+	var l int
2148
+	_ = l
2149
+	l = len(m.ServiceID)
2150
+	if l > 0 {
2151
+		n += 1 + l + sovStore(uint64(l))
2152
+	}
2153
+	if m.Slot != 0 {
2154
+		n += 1 + sovStore(uint64(m.Slot))
2155
+	}
2156
+	return n
2157
+}
2158
+
2159
+func (m *SelectByCustom) Size() (n int) {
2160
+	var l int
2161
+	_ = l
2162
+	l = len(m.Kind)
2163
+	if l > 0 {
2164
+		n += 1 + l + sovStore(uint64(l))
2165
+	}
2166
+	l = len(m.Index)
2167
+	if l > 0 {
2168
+		n += 1 + l + sovStore(uint64(l))
2169
+	}
2170
+	l = len(m.Value)
2171
+	if l > 0 {
2172
+		n += 1 + l + sovStore(uint64(l))
2173
+	}
2174
+	return n
2175
+}
2176
+
2177
+func (m *SelectBy) Size() (n int) {
2178
+	var l int
2179
+	_ = l
2180
+	if m.By != nil {
2181
+		n += m.By.Size()
2182
+	}
2183
+	return n
2184
+}
2185
+
2186
+func (m *SelectBy_ID) Size() (n int) {
2187
+	var l int
2188
+	_ = l
2189
+	l = len(m.ID)
2190
+	n += 1 + l + sovStore(uint64(l))
2191
+	return n
2192
+}
2193
+func (m *SelectBy_IDPrefix) Size() (n int) {
2194
+	var l int
2195
+	_ = l
2196
+	l = len(m.IDPrefix)
2197
+	n += 1 + l + sovStore(uint64(l))
2198
+	return n
2199
+}
2200
+func (m *SelectBy_Name) Size() (n int) {
2201
+	var l int
2202
+	_ = l
2203
+	l = len(m.Name)
2204
+	n += 1 + l + sovStore(uint64(l))
2205
+	return n
2206
+}
2207
+func (m *SelectBy_NamePrefix) Size() (n int) {
2208
+	var l int
2209
+	_ = l
2210
+	l = len(m.NamePrefix)
2211
+	n += 1 + l + sovStore(uint64(l))
2212
+	return n
2213
+}
2214
+func (m *SelectBy_Custom) Size() (n int) {
2215
+	var l int
2216
+	_ = l
2217
+	if m.Custom != nil {
2218
+		l = m.Custom.Size()
2219
+		n += 1 + l + sovStore(uint64(l))
2220
+	}
2221
+	return n
2222
+}
2223
+func (m *SelectBy_CustomPrefix) Size() (n int) {
2224
+	var l int
2225
+	_ = l
2226
+	if m.CustomPrefix != nil {
2227
+		l = m.CustomPrefix.Size()
2228
+		n += 1 + l + sovStore(uint64(l))
2229
+	}
2230
+	return n
2231
+}
2232
+func (m *SelectBy_ServiceID) Size() (n int) {
2233
+	var l int
2234
+	_ = l
2235
+	l = len(m.ServiceID)
2236
+	n += 1 + l + sovStore(uint64(l))
2237
+	return n
2238
+}
2239
+func (m *SelectBy_NodeID) Size() (n int) {
2240
+	var l int
2241
+	_ = l
2242
+	l = len(m.NodeID)
2243
+	n += 1 + l + sovStore(uint64(l))
2244
+	return n
2245
+}
2246
+func (m *SelectBy_Slot) Size() (n int) {
2247
+	var l int
2248
+	_ = l
2249
+	if m.Slot != nil {
2250
+		l = m.Slot.Size()
2251
+		n += 1 + l + sovStore(uint64(l))
2252
+	}
2253
+	return n
2254
+}
2255
+func (m *SelectBy_DesiredState) Size() (n int) {
2256
+	var l int
2257
+	_ = l
2258
+	n += 1 + sovStore(uint64(m.DesiredState))
2259
+	return n
2260
+}
2261
+func (m *SelectBy_Role) Size() (n int) {
2262
+	var l int
2263
+	_ = l
2264
+	n += 1 + sovStore(uint64(m.Role))
2265
+	return n
2266
+}
2267
+func (m *SelectBy_Membership) Size() (n int) {
2268
+	var l int
2269
+	_ = l
2270
+	n += 1 + sovStore(uint64(m.Membership))
2271
+	return n
2272
+}
2273
+func (m *SelectBy_ReferencedNetworkID) Size() (n int) {
2274
+	var l int
2275
+	_ = l
2276
+	l = len(m.ReferencedNetworkID)
2277
+	n += 1 + l + sovStore(uint64(l))
2278
+	return n
2279
+}
2280
+func (m *SelectBy_ReferencedSecretID) Size() (n int) {
2281
+	var l int
2282
+	_ = l
2283
+	l = len(m.ReferencedSecretID)
2284
+	n += 1 + l + sovStore(uint64(l))
2285
+	return n
2286
+}
2287
+func (m *SelectBy_Kind) Size() (n int) {
2288
+	var l int
2289
+	_ = l
2290
+	l = len(m.Kind)
2291
+	n += 1 + l + sovStore(uint64(l))
2292
+	return n
2293
+}
2294
+func (m *WatchRequest) Size() (n int) {
2295
+	var l int
2296
+	_ = l
2297
+	if len(m.Entries) > 0 {
2298
+		for _, e := range m.Entries {
2299
+			l = e.Size()
2300
+			n += 1 + l + sovStore(uint64(l))
2301
+		}
2302
+	}
2303
+	if m.ResumeFrom != nil {
2304
+		l = m.ResumeFrom.Size()
2305
+		n += 1 + l + sovStore(uint64(l))
2306
+	}
2307
+	if m.IncludeOldObject {
2308
+		n += 2
2309
+	}
2310
+	return n
2311
+}
2312
+
2313
+func (m *WatchRequest_WatchEntry) Size() (n int) {
2314
+	var l int
2315
+	_ = l
2316
+	l = len(m.Kind)
2317
+	if l > 0 {
2318
+		n += 1 + l + sovStore(uint64(l))
2319
+	}
2320
+	if m.Action != 0 {
2321
+		n += 1 + sovStore(uint64(m.Action))
2322
+	}
2323
+	if len(m.Filters) > 0 {
2324
+		for _, e := range m.Filters {
2325
+			l = e.Size()
2326
+			n += 1 + l + sovStore(uint64(l))
2327
+		}
2328
+	}
2329
+	return n
2330
+}
2331
+
2332
+func (m *WatchMessage) Size() (n int) {
2333
+	var l int
2334
+	_ = l
2335
+	if len(m.Events) > 0 {
2336
+		for _, e := range m.Events {
2337
+			l = e.Size()
2338
+			n += 1 + l + sovStore(uint64(l))
2339
+		}
2340
+	}
2341
+	if m.Version != nil {
2342
+		l = m.Version.Size()
2343
+		n += 1 + l + sovStore(uint64(l))
2344
+	}
2345
+	return n
2346
+}
2347
+
2348
+func (m *WatchMessage_Event) Size() (n int) {
2349
+	var l int
2350
+	_ = l
2351
+	if m.Action != 0 {
2352
+		n += 1 + sovStore(uint64(m.Action))
2353
+	}
2354
+	if m.Object != nil {
2355
+		l = m.Object.Size()
2356
+		n += 1 + l + sovStore(uint64(l))
2357
+	}
2358
+	if m.OldObject != nil {
2359
+		l = m.OldObject.Size()
2360
+		n += 1 + l + sovStore(uint64(l))
2361
+	}
2362
+	return n
2363
+}
2364
+
2365
+func sovStore(x uint64) (n int) {
2366
+	for {
2367
+		n++
2368
+		x >>= 7
2369
+		if x == 0 {
2370
+			break
2371
+		}
2372
+	}
2373
+	return n
2374
+}
2375
+func sozStore(x uint64) (n int) {
2376
+	return sovStore(uint64((x << 1) ^ uint64((int64(x) >> 63))))
2377
+}
2378
+func (this *Object) String() string {
2379
+	if this == nil {
2380
+		return "nil"
2381
+	}
2382
+	s := strings.Join([]string{`&Object{`,
2383
+		`Object:` + fmt.Sprintf("%v", this.Object) + `,`,
2384
+		`}`,
2385
+	}, "")
2386
+	return s
2387
+}
2388
+func (this *Object_Node) String() string {
2389
+	if this == nil {
2390
+		return "nil"
2391
+	}
2392
+	s := strings.Join([]string{`&Object_Node{`,
2393
+		`Node:` + strings.Replace(fmt.Sprintf("%v", this.Node), "Node", "Node", 1) + `,`,
2394
+		`}`,
2395
+	}, "")
2396
+	return s
2397
+}
2398
+func (this *Object_Service) String() string {
2399
+	if this == nil {
2400
+		return "nil"
2401
+	}
2402
+	s := strings.Join([]string{`&Object_Service{`,
2403
+		`Service:` + strings.Replace(fmt.Sprintf("%v", this.Service), "Service", "Service", 1) + `,`,
2404
+		`}`,
2405
+	}, "")
2406
+	return s
2407
+}
2408
+func (this *Object_Network) String() string {
2409
+	if this == nil {
2410
+		return "nil"
2411
+	}
2412
+	s := strings.Join([]string{`&Object_Network{`,
2413
+		`Network:` + strings.Replace(fmt.Sprintf("%v", this.Network), "Network", "Network", 1) + `,`,
2414
+		`}`,
2415
+	}, "")
2416
+	return s
2417
+}
2418
+func (this *Object_Task) String() string {
2419
+	if this == nil {
2420
+		return "nil"
2421
+	}
2422
+	s := strings.Join([]string{`&Object_Task{`,
2423
+		`Task:` + strings.Replace(fmt.Sprintf("%v", this.Task), "Task", "Task", 1) + `,`,
2424
+		`}`,
2425
+	}, "")
2426
+	return s
2427
+}
2428
+func (this *Object_Cluster) String() string {
2429
+	if this == nil {
2430
+		return "nil"
2431
+	}
2432
+	s := strings.Join([]string{`&Object_Cluster{`,
2433
+		`Cluster:` + strings.Replace(fmt.Sprintf("%v", this.Cluster), "Cluster", "Cluster", 1) + `,`,
2434
+		`}`,
2435
+	}, "")
2436
+	return s
2437
+}
2438
+func (this *Object_Secret) String() string {
2439
+	if this == nil {
2440
+		return "nil"
2441
+	}
2442
+	s := strings.Join([]string{`&Object_Secret{`,
2443
+		`Secret:` + strings.Replace(fmt.Sprintf("%v", this.Secret), "Secret", "Secret", 1) + `,`,
2444
+		`}`,
2445
+	}, "")
2446
+	return s
2447
+}
2448
+func (this *Object_Resource) String() string {
2449
+	if this == nil {
2450
+		return "nil"
2451
+	}
2452
+	s := strings.Join([]string{`&Object_Resource{`,
2453
+		`Resource:` + strings.Replace(fmt.Sprintf("%v", this.Resource), "Resource", "Resource", 1) + `,`,
2454
+		`}`,
2455
+	}, "")
2456
+	return s
2457
+}
2458
+func (this *Object_Extension) String() string {
2459
+	if this == nil {
2460
+		return "nil"
2461
+	}
2462
+	s := strings.Join([]string{`&Object_Extension{`,
2463
+		`Extension:` + strings.Replace(fmt.Sprintf("%v", this.Extension), "Extension", "Extension", 1) + `,`,
2464
+		`}`,
2465
+	}, "")
2466
+	return s
2467
+}
2468
+func (this *SelectBySlot) String() string {
2469
+	if this == nil {
2470
+		return "nil"
2471
+	}
2472
+	s := strings.Join([]string{`&SelectBySlot{`,
2473
+		`ServiceID:` + fmt.Sprintf("%v", this.ServiceID) + `,`,
2474
+		`Slot:` + fmt.Sprintf("%v", this.Slot) + `,`,
2475
+		`}`,
2476
+	}, "")
2477
+	return s
2478
+}
2479
+func (this *SelectByCustom) String() string {
2480
+	if this == nil {
2481
+		return "nil"
2482
+	}
2483
+	s := strings.Join([]string{`&SelectByCustom{`,
2484
+		`Kind:` + fmt.Sprintf("%v", this.Kind) + `,`,
2485
+		`Index:` + fmt.Sprintf("%v", this.Index) + `,`,
2486
+		`Value:` + fmt.Sprintf("%v", this.Value) + `,`,
2487
+		`}`,
2488
+	}, "")
2489
+	return s
2490
+}
2491
+func (this *SelectBy) String() string {
2492
+	if this == nil {
2493
+		return "nil"
2494
+	}
2495
+	s := strings.Join([]string{`&SelectBy{`,
2496
+		`By:` + fmt.Sprintf("%v", this.By) + `,`,
2497
+		`}`,
2498
+	}, "")
2499
+	return s
2500
+}
2501
+func (this *SelectBy_ID) String() string {
2502
+	if this == nil {
2503
+		return "nil"
2504
+	}
2505
+	s := strings.Join([]string{`&SelectBy_ID{`,
2506
+		`ID:` + fmt.Sprintf("%v", this.ID) + `,`,
2507
+		`}`,
2508
+	}, "")
2509
+	return s
2510
+}
2511
+func (this *SelectBy_IDPrefix) String() string {
2512
+	if this == nil {
2513
+		return "nil"
2514
+	}
2515
+	s := strings.Join([]string{`&SelectBy_IDPrefix{`,
2516
+		`IDPrefix:` + fmt.Sprintf("%v", this.IDPrefix) + `,`,
2517
+		`}`,
2518
+	}, "")
2519
+	return s
2520
+}
2521
+func (this *SelectBy_Name) String() string {
2522
+	if this == nil {
2523
+		return "nil"
2524
+	}
2525
+	s := strings.Join([]string{`&SelectBy_Name{`,
2526
+		`Name:` + fmt.Sprintf("%v", this.Name) + `,`,
2527
+		`}`,
2528
+	}, "")
2529
+	return s
2530
+}
2531
+func (this *SelectBy_NamePrefix) String() string {
2532
+	if this == nil {
2533
+		return "nil"
2534
+	}
2535
+	s := strings.Join([]string{`&SelectBy_NamePrefix{`,
2536
+		`NamePrefix:` + fmt.Sprintf("%v", this.NamePrefix) + `,`,
2537
+		`}`,
2538
+	}, "")
2539
+	return s
2540
+}
2541
+func (this *SelectBy_Custom) String() string {
2542
+	if this == nil {
2543
+		return "nil"
2544
+	}
2545
+	s := strings.Join([]string{`&SelectBy_Custom{`,
2546
+		`Custom:` + strings.Replace(fmt.Sprintf("%v", this.Custom), "SelectByCustom", "SelectByCustom", 1) + `,`,
2547
+		`}`,
2548
+	}, "")
2549
+	return s
2550
+}
2551
+func (this *SelectBy_CustomPrefix) String() string {
2552
+	if this == nil {
2553
+		return "nil"
2554
+	}
2555
+	s := strings.Join([]string{`&SelectBy_CustomPrefix{`,
2556
+		`CustomPrefix:` + strings.Replace(fmt.Sprintf("%v", this.CustomPrefix), "SelectByCustom", "SelectByCustom", 1) + `,`,
2557
+		`}`,
2558
+	}, "")
2559
+	return s
2560
+}
2561
+func (this *SelectBy_ServiceID) String() string {
2562
+	if this == nil {
2563
+		return "nil"
2564
+	}
2565
+	s := strings.Join([]string{`&SelectBy_ServiceID{`,
2566
+		`ServiceID:` + fmt.Sprintf("%v", this.ServiceID) + `,`,
2567
+		`}`,
2568
+	}, "")
2569
+	return s
2570
+}
2571
+func (this *SelectBy_NodeID) String() string {
2572
+	if this == nil {
2573
+		return "nil"
2574
+	}
2575
+	s := strings.Join([]string{`&SelectBy_NodeID{`,
2576
+		`NodeID:` + fmt.Sprintf("%v", this.NodeID) + `,`,
2577
+		`}`,
2578
+	}, "")
2579
+	return s
2580
+}
2581
+func (this *SelectBy_Slot) String() string {
2582
+	if this == nil {
2583
+		return "nil"
2584
+	}
2585
+	s := strings.Join([]string{`&SelectBy_Slot{`,
2586
+		`Slot:` + strings.Replace(fmt.Sprintf("%v", this.Slot), "SelectBySlot", "SelectBySlot", 1) + `,`,
2587
+		`}`,
2588
+	}, "")
2589
+	return s
2590
+}
2591
+func (this *SelectBy_DesiredState) String() string {
2592
+	if this == nil {
2593
+		return "nil"
2594
+	}
2595
+	s := strings.Join([]string{`&SelectBy_DesiredState{`,
2596
+		`DesiredState:` + fmt.Sprintf("%v", this.DesiredState) + `,`,
2597
+		`}`,
2598
+	}, "")
2599
+	return s
2600
+}
2601
+func (this *SelectBy_Role) String() string {
2602
+	if this == nil {
2603
+		return "nil"
2604
+	}
2605
+	s := strings.Join([]string{`&SelectBy_Role{`,
2606
+		`Role:` + fmt.Sprintf("%v", this.Role) + `,`,
2607
+		`}`,
2608
+	}, "")
2609
+	return s
2610
+}
2611
+func (this *SelectBy_Membership) String() string {
2612
+	if this == nil {
2613
+		return "nil"
2614
+	}
2615
+	s := strings.Join([]string{`&SelectBy_Membership{`,
2616
+		`Membership:` + fmt.Sprintf("%v", this.Membership) + `,`,
2617
+		`}`,
2618
+	}, "")
2619
+	return s
2620
+}
2621
+func (this *SelectBy_ReferencedNetworkID) String() string {
2622
+	if this == nil {
2623
+		return "nil"
2624
+	}
2625
+	s := strings.Join([]string{`&SelectBy_ReferencedNetworkID{`,
2626
+		`ReferencedNetworkID:` + fmt.Sprintf("%v", this.ReferencedNetworkID) + `,`,
2627
+		`}`,
2628
+	}, "")
2629
+	return s
2630
+}
2631
+func (this *SelectBy_ReferencedSecretID) String() string {
2632
+	if this == nil {
2633
+		return "nil"
2634
+	}
2635
+	s := strings.Join([]string{`&SelectBy_ReferencedSecretID{`,
2636
+		`ReferencedSecretID:` + fmt.Sprintf("%v", this.ReferencedSecretID) + `,`,
2637
+		`}`,
2638
+	}, "")
2639
+	return s
2640
+}
2641
+func (this *SelectBy_Kind) String() string {
2642
+	if this == nil {
2643
+		return "nil"
2644
+	}
2645
+	s := strings.Join([]string{`&SelectBy_Kind{`,
2646
+		`Kind:` + fmt.Sprintf("%v", this.Kind) + `,`,
2647
+		`}`,
2648
+	}, "")
2649
+	return s
2650
+}
2651
+func (this *WatchRequest) String() string {
2652
+	if this == nil {
2653
+		return "nil"
2654
+	}
2655
+	s := strings.Join([]string{`&WatchRequest{`,
2656
+		`Entries:` + strings.Replace(fmt.Sprintf("%v", this.Entries), "WatchRequest_WatchEntry", "WatchRequest_WatchEntry", 1) + `,`,
2657
+		`ResumeFrom:` + strings.Replace(fmt.Sprintf("%v", this.ResumeFrom), "Version", "Version", 1) + `,`,
2658
+		`IncludeOldObject:` + fmt.Sprintf("%v", this.IncludeOldObject) + `,`,
2659
+		`}`,
2660
+	}, "")
2661
+	return s
2662
+}
2663
+func (this *WatchRequest_WatchEntry) String() string {
2664
+	if this == nil {
2665
+		return "nil"
2666
+	}
2667
+	s := strings.Join([]string{`&WatchRequest_WatchEntry{`,
2668
+		`Kind:` + fmt.Sprintf("%v", this.Kind) + `,`,
2669
+		`Action:` + fmt.Sprintf("%v", this.Action) + `,`,
2670
+		`Filters:` + strings.Replace(fmt.Sprintf("%v", this.Filters), "SelectBy", "SelectBy", 1) + `,`,
2671
+		`}`,
2672
+	}, "")
2673
+	return s
2674
+}
2675
+func (this *WatchMessage) String() string {
2676
+	if this == nil {
2677
+		return "nil"
2678
+	}
2679
+	s := strings.Join([]string{`&WatchMessage{`,
2680
+		`Events:` + strings.Replace(fmt.Sprintf("%v", this.Events), "WatchMessage_Event", "WatchMessage_Event", 1) + `,`,
2681
+		`Version:` + strings.Replace(fmt.Sprintf("%v", this.Version), "Version", "Version", 1) + `,`,
2682
+		`}`,
2683
+	}, "")
2684
+	return s
2685
+}
2686
+func (this *WatchMessage_Event) String() string {
2687
+	if this == nil {
2688
+		return "nil"
2689
+	}
2690
+	s := strings.Join([]string{`&WatchMessage_Event{`,
2691
+		`Action:` + fmt.Sprintf("%v", this.Action) + `,`,
2692
+		`Object:` + strings.Replace(fmt.Sprintf("%v", this.Object), "Object", "Object", 1) + `,`,
2693
+		`OldObject:` + strings.Replace(fmt.Sprintf("%v", this.OldObject), "Object", "Object", 1) + `,`,
2694
+		`}`,
2695
+	}, "")
2696
+	return s
2697
+}
2698
+func valueToStringStore(v interface{}) string {
2699
+	rv := reflect.ValueOf(v)
2700
+	if rv.IsNil() {
2701
+		return "nil"
2702
+	}
2703
+	pv := reflect.Indirect(rv).Interface()
2704
+	return fmt.Sprintf("*%v", pv)
2705
+}
2706
+func (m *Object) Unmarshal(dAtA []byte) error {
2707
+	l := len(dAtA)
2708
+	iNdEx := 0
2709
+	for iNdEx < l {
2710
+		preIndex := iNdEx
2711
+		var wire uint64
2712
+		for shift := uint(0); ; shift += 7 {
2713
+			if shift >= 64 {
2714
+				return ErrIntOverflowStore
2715
+			}
2716
+			if iNdEx >= l {
2717
+				return io.ErrUnexpectedEOF
2718
+			}
2719
+			b := dAtA[iNdEx]
2720
+			iNdEx++
2721
+			wire |= (uint64(b) & 0x7F) << shift
2722
+			if b < 0x80 {
2723
+				break
2724
+			}
2725
+		}
2726
+		fieldNum := int32(wire >> 3)
2727
+		wireType := int(wire & 0x7)
2728
+		if wireType == 4 {
2729
+			return fmt.Errorf("proto: Object: wiretype end group for non-group")
2730
+		}
2731
+		if fieldNum <= 0 {
2732
+			return fmt.Errorf("proto: Object: illegal tag %d (wire type %d)", fieldNum, wire)
2733
+		}
2734
+		switch fieldNum {
2735
+		case 1:
2736
+			if wireType != 2 {
2737
+				return fmt.Errorf("proto: wrong wireType = %d for field Node", wireType)
2738
+			}
2739
+			var msglen int
2740
+			for shift := uint(0); ; shift += 7 {
2741
+				if shift >= 64 {
2742
+					return ErrIntOverflowStore
2743
+				}
2744
+				if iNdEx >= l {
2745
+					return io.ErrUnexpectedEOF
2746
+				}
2747
+				b := dAtA[iNdEx]
2748
+				iNdEx++
2749
+				msglen |= (int(b) & 0x7F) << shift
2750
+				if b < 0x80 {
2751
+					break
2752
+				}
2753
+			}
2754
+			if msglen < 0 {
2755
+				return ErrInvalidLengthStore
2756
+			}
2757
+			postIndex := iNdEx + msglen
2758
+			if postIndex > l {
2759
+				return io.ErrUnexpectedEOF
2760
+			}
2761
+			v := &Node{}
2762
+			if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
2763
+				return err
2764
+			}
2765
+			m.Object = &Object_Node{v}
2766
+			iNdEx = postIndex
2767
+		case 2:
2768
+			if wireType != 2 {
2769
+				return fmt.Errorf("proto: wrong wireType = %d for field Service", wireType)
2770
+			}
2771
+			var msglen int
2772
+			for shift := uint(0); ; shift += 7 {
2773
+				if shift >= 64 {
2774
+					return ErrIntOverflowStore
2775
+				}
2776
+				if iNdEx >= l {
2777
+					return io.ErrUnexpectedEOF
2778
+				}
2779
+				b := dAtA[iNdEx]
2780
+				iNdEx++
2781
+				msglen |= (int(b) & 0x7F) << shift
2782
+				if b < 0x80 {
2783
+					break
2784
+				}
2785
+			}
2786
+			if msglen < 0 {
2787
+				return ErrInvalidLengthStore
2788
+			}
2789
+			postIndex := iNdEx + msglen
2790
+			if postIndex > l {
2791
+				return io.ErrUnexpectedEOF
2792
+			}
2793
+			v := &Service{}
2794
+			if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
2795
+				return err
2796
+			}
2797
+			m.Object = &Object_Service{v}
2798
+			iNdEx = postIndex
2799
+		case 3:
2800
+			if wireType != 2 {
2801
+				return fmt.Errorf("proto: wrong wireType = %d for field Network", wireType)
2802
+			}
2803
+			var msglen int
2804
+			for shift := uint(0); ; shift += 7 {
2805
+				if shift >= 64 {
2806
+					return ErrIntOverflowStore
2807
+				}
2808
+				if iNdEx >= l {
2809
+					return io.ErrUnexpectedEOF
2810
+				}
2811
+				b := dAtA[iNdEx]
2812
+				iNdEx++
2813
+				msglen |= (int(b) & 0x7F) << shift
2814
+				if b < 0x80 {
2815
+					break
2816
+				}
2817
+			}
2818
+			if msglen < 0 {
2819
+				return ErrInvalidLengthStore
2820
+			}
2821
+			postIndex := iNdEx + msglen
2822
+			if postIndex > l {
2823
+				return io.ErrUnexpectedEOF
2824
+			}
2825
+			v := &Network{}
2826
+			if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
2827
+				return err
2828
+			}
2829
+			m.Object = &Object_Network{v}
2830
+			iNdEx = postIndex
2831
+		case 4:
2832
+			if wireType != 2 {
2833
+				return fmt.Errorf("proto: wrong wireType = %d for field Task", wireType)
2834
+			}
2835
+			var msglen int
2836
+			for shift := uint(0); ; shift += 7 {
2837
+				if shift >= 64 {
2838
+					return ErrIntOverflowStore
2839
+				}
2840
+				if iNdEx >= l {
2841
+					return io.ErrUnexpectedEOF
2842
+				}
2843
+				b := dAtA[iNdEx]
2844
+				iNdEx++
2845
+				msglen |= (int(b) & 0x7F) << shift
2846
+				if b < 0x80 {
2847
+					break
2848
+				}
2849
+			}
2850
+			if msglen < 0 {
2851
+				return ErrInvalidLengthStore
2852
+			}
2853
+			postIndex := iNdEx + msglen
2854
+			if postIndex > l {
2855
+				return io.ErrUnexpectedEOF
2856
+			}
2857
+			v := &Task{}
2858
+			if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
2859
+				return err
2860
+			}
2861
+			m.Object = &Object_Task{v}
2862
+			iNdEx = postIndex
2863
+		case 5:
2864
+			if wireType != 2 {
2865
+				return fmt.Errorf("proto: wrong wireType = %d for field Cluster", wireType)
2866
+			}
2867
+			var msglen int
2868
+			for shift := uint(0); ; shift += 7 {
2869
+				if shift >= 64 {
2870
+					return ErrIntOverflowStore
2871
+				}
2872
+				if iNdEx >= l {
2873
+					return io.ErrUnexpectedEOF
2874
+				}
2875
+				b := dAtA[iNdEx]
2876
+				iNdEx++
2877
+				msglen |= (int(b) & 0x7F) << shift
2878
+				if b < 0x80 {
2879
+					break
2880
+				}
2881
+			}
2882
+			if msglen < 0 {
2883
+				return ErrInvalidLengthStore
2884
+			}
2885
+			postIndex := iNdEx + msglen
2886
+			if postIndex > l {
2887
+				return io.ErrUnexpectedEOF
2888
+			}
2889
+			v := &Cluster{}
2890
+			if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
2891
+				return err
2892
+			}
2893
+			m.Object = &Object_Cluster{v}
2894
+			iNdEx = postIndex
2895
+		case 6:
2896
+			if wireType != 2 {
2897
+				return fmt.Errorf("proto: wrong wireType = %d for field Secret", wireType)
2898
+			}
2899
+			var msglen int
2900
+			for shift := uint(0); ; shift += 7 {
2901
+				if shift >= 64 {
2902
+					return ErrIntOverflowStore
2903
+				}
2904
+				if iNdEx >= l {
2905
+					return io.ErrUnexpectedEOF
2906
+				}
2907
+				b := dAtA[iNdEx]
2908
+				iNdEx++
2909
+				msglen |= (int(b) & 0x7F) << shift
2910
+				if b < 0x80 {
2911
+					break
2912
+				}
2913
+			}
2914
+			if msglen < 0 {
2915
+				return ErrInvalidLengthStore
2916
+			}
2917
+			postIndex := iNdEx + msglen
2918
+			if postIndex > l {
2919
+				return io.ErrUnexpectedEOF
2920
+			}
2921
+			v := &Secret{}
2922
+			if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
2923
+				return err
2924
+			}
2925
+			m.Object = &Object_Secret{v}
2926
+			iNdEx = postIndex
2927
+		case 7:
2928
+			if wireType != 2 {
2929
+				return fmt.Errorf("proto: wrong wireType = %d for field Resource", wireType)
2930
+			}
2931
+			var msglen int
2932
+			for shift := uint(0); ; shift += 7 {
2933
+				if shift >= 64 {
2934
+					return ErrIntOverflowStore
2935
+				}
2936
+				if iNdEx >= l {
2937
+					return io.ErrUnexpectedEOF
2938
+				}
2939
+				b := dAtA[iNdEx]
2940
+				iNdEx++
2941
+				msglen |= (int(b) & 0x7F) << shift
2942
+				if b < 0x80 {
2943
+					break
2944
+				}
2945
+			}
2946
+			if msglen < 0 {
2947
+				return ErrInvalidLengthStore
2948
+			}
2949
+			postIndex := iNdEx + msglen
2950
+			if postIndex > l {
2951
+				return io.ErrUnexpectedEOF
2952
+			}
2953
+			v := &Resource{}
2954
+			if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
2955
+				return err
2956
+			}
2957
+			m.Object = &Object_Resource{v}
2958
+			iNdEx = postIndex
2959
+		case 8:
2960
+			if wireType != 2 {
2961
+				return fmt.Errorf("proto: wrong wireType = %d for field Extension", wireType)
2962
+			}
2963
+			var msglen int
2964
+			for shift := uint(0); ; shift += 7 {
2965
+				if shift >= 64 {
2966
+					return ErrIntOverflowStore
2967
+				}
2968
+				if iNdEx >= l {
2969
+					return io.ErrUnexpectedEOF
2970
+				}
2971
+				b := dAtA[iNdEx]
2972
+				iNdEx++
2973
+				msglen |= (int(b) & 0x7F) << shift
2974
+				if b < 0x80 {
2975
+					break
2976
+				}
2977
+			}
2978
+			if msglen < 0 {
2979
+				return ErrInvalidLengthStore
2980
+			}
2981
+			postIndex := iNdEx + msglen
2982
+			if postIndex > l {
2983
+				return io.ErrUnexpectedEOF
2984
+			}
2985
+			v := &Extension{}
2986
+			if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
2987
+				return err
2988
+			}
2989
+			m.Object = &Object_Extension{v}
2990
+			iNdEx = postIndex
2991
+		default:
2992
+			iNdEx = preIndex
2993
+			skippy, err := skipStore(dAtA[iNdEx:])
2994
+			if err != nil {
2995
+				return err
2996
+			}
2997
+			if skippy < 0 {
2998
+				return ErrInvalidLengthStore
2999
+			}
3000
+			if (iNdEx + skippy) > l {
3001
+				return io.ErrUnexpectedEOF
3002
+			}
3003
+			iNdEx += skippy
3004
+		}
3005
+	}
3006
+
3007
+	if iNdEx > l {
3008
+		return io.ErrUnexpectedEOF
3009
+	}
3010
+	return nil
3011
+}
3012
+func (m *SelectBySlot) Unmarshal(dAtA []byte) error {
3013
+	l := len(dAtA)
3014
+	iNdEx := 0
3015
+	for iNdEx < l {
3016
+		preIndex := iNdEx
3017
+		var wire uint64
3018
+		for shift := uint(0); ; shift += 7 {
3019
+			if shift >= 64 {
3020
+				return ErrIntOverflowStore
3021
+			}
3022
+			if iNdEx >= l {
3023
+				return io.ErrUnexpectedEOF
3024
+			}
3025
+			b := dAtA[iNdEx]
3026
+			iNdEx++
3027
+			wire |= (uint64(b) & 0x7F) << shift
3028
+			if b < 0x80 {
3029
+				break
3030
+			}
3031
+		}
3032
+		fieldNum := int32(wire >> 3)
3033
+		wireType := int(wire & 0x7)
3034
+		if wireType == 4 {
3035
+			return fmt.Errorf("proto: SelectBySlot: wiretype end group for non-group")
3036
+		}
3037
+		if fieldNum <= 0 {
3038
+			return fmt.Errorf("proto: SelectBySlot: illegal tag %d (wire type %d)", fieldNum, wire)
3039
+		}
3040
+		switch fieldNum {
3041
+		case 1:
3042
+			if wireType != 2 {
3043
+				return fmt.Errorf("proto: wrong wireType = %d for field ServiceID", wireType)
3044
+			}
3045
+			var stringLen uint64
3046
+			for shift := uint(0); ; shift += 7 {
3047
+				if shift >= 64 {
3048
+					return ErrIntOverflowStore
3049
+				}
3050
+				if iNdEx >= l {
3051
+					return io.ErrUnexpectedEOF
3052
+				}
3053
+				b := dAtA[iNdEx]
3054
+				iNdEx++
3055
+				stringLen |= (uint64(b) & 0x7F) << shift
3056
+				if b < 0x80 {
3057
+					break
3058
+				}
3059
+			}
3060
+			intStringLen := int(stringLen)
3061
+			if intStringLen < 0 {
3062
+				return ErrInvalidLengthStore
3063
+			}
3064
+			postIndex := iNdEx + intStringLen
3065
+			if postIndex > l {
3066
+				return io.ErrUnexpectedEOF
3067
+			}
3068
+			m.ServiceID = string(dAtA[iNdEx:postIndex])
3069
+			iNdEx = postIndex
3070
+		case 2:
3071
+			if wireType != 0 {
3072
+				return fmt.Errorf("proto: wrong wireType = %d for field Slot", wireType)
3073
+			}
3074
+			m.Slot = 0
3075
+			for shift := uint(0); ; shift += 7 {
3076
+				if shift >= 64 {
3077
+					return ErrIntOverflowStore
3078
+				}
3079
+				if iNdEx >= l {
3080
+					return io.ErrUnexpectedEOF
3081
+				}
3082
+				b := dAtA[iNdEx]
3083
+				iNdEx++
3084
+				m.Slot |= (uint64(b) & 0x7F) << shift
3085
+				if b < 0x80 {
3086
+					break
3087
+				}
3088
+			}
3089
+		default:
3090
+			iNdEx = preIndex
3091
+			skippy, err := skipStore(dAtA[iNdEx:])
3092
+			if err != nil {
3093
+				return err
3094
+			}
3095
+			if skippy < 0 {
3096
+				return ErrInvalidLengthStore
3097
+			}
3098
+			if (iNdEx + skippy) > l {
3099
+				return io.ErrUnexpectedEOF
3100
+			}
3101
+			iNdEx += skippy
3102
+		}
3103
+	}
3104
+
3105
+	if iNdEx > l {
3106
+		return io.ErrUnexpectedEOF
3107
+	}
3108
+	return nil
3109
+}
3110
+func (m *SelectByCustom) Unmarshal(dAtA []byte) error {
3111
+	l := len(dAtA)
3112
+	iNdEx := 0
3113
+	for iNdEx < l {
3114
+		preIndex := iNdEx
3115
+		var wire uint64
3116
+		for shift := uint(0); ; shift += 7 {
3117
+			if shift >= 64 {
3118
+				return ErrIntOverflowStore
3119
+			}
3120
+			if iNdEx >= l {
3121
+				return io.ErrUnexpectedEOF
3122
+			}
3123
+			b := dAtA[iNdEx]
3124
+			iNdEx++
3125
+			wire |= (uint64(b) & 0x7F) << shift
3126
+			if b < 0x80 {
3127
+				break
3128
+			}
3129
+		}
3130
+		fieldNum := int32(wire >> 3)
3131
+		wireType := int(wire & 0x7)
3132
+		if wireType == 4 {
3133
+			return fmt.Errorf("proto: SelectByCustom: wiretype end group for non-group")
3134
+		}
3135
+		if fieldNum <= 0 {
3136
+			return fmt.Errorf("proto: SelectByCustom: illegal tag %d (wire type %d)", fieldNum, wire)
3137
+		}
3138
+		switch fieldNum {
3139
+		case 1:
3140
+			if wireType != 2 {
3141
+				return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType)
3142
+			}
3143
+			var stringLen uint64
3144
+			for shift := uint(0); ; shift += 7 {
3145
+				if shift >= 64 {
3146
+					return ErrIntOverflowStore
3147
+				}
3148
+				if iNdEx >= l {
3149
+					return io.ErrUnexpectedEOF
3150
+				}
3151
+				b := dAtA[iNdEx]
3152
+				iNdEx++
3153
+				stringLen |= (uint64(b) & 0x7F) << shift
3154
+				if b < 0x80 {
3155
+					break
3156
+				}
3157
+			}
3158
+			intStringLen := int(stringLen)
3159
+			if intStringLen < 0 {
3160
+				return ErrInvalidLengthStore
3161
+			}
3162
+			postIndex := iNdEx + intStringLen
3163
+			if postIndex > l {
3164
+				return io.ErrUnexpectedEOF
3165
+			}
3166
+			m.Kind = string(dAtA[iNdEx:postIndex])
3167
+			iNdEx = postIndex
3168
+		case 2:
3169
+			if wireType != 2 {
3170
+				return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType)
3171
+			}
3172
+			var stringLen uint64
3173
+			for shift := uint(0); ; shift += 7 {
3174
+				if shift >= 64 {
3175
+					return ErrIntOverflowStore
3176
+				}
3177
+				if iNdEx >= l {
3178
+					return io.ErrUnexpectedEOF
3179
+				}
3180
+				b := dAtA[iNdEx]
3181
+				iNdEx++
3182
+				stringLen |= (uint64(b) & 0x7F) << shift
3183
+				if b < 0x80 {
3184
+					break
3185
+				}
3186
+			}
3187
+			intStringLen := int(stringLen)
3188
+			if intStringLen < 0 {
3189
+				return ErrInvalidLengthStore
3190
+			}
3191
+			postIndex := iNdEx + intStringLen
3192
+			if postIndex > l {
3193
+				return io.ErrUnexpectedEOF
3194
+			}
3195
+			m.Index = string(dAtA[iNdEx:postIndex])
3196
+			iNdEx = postIndex
3197
+		case 3:
3198
+			if wireType != 2 {
3199
+				return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType)
3200
+			}
3201
+			var stringLen uint64
3202
+			for shift := uint(0); ; shift += 7 {
3203
+				if shift >= 64 {
3204
+					return ErrIntOverflowStore
3205
+				}
3206
+				if iNdEx >= l {
3207
+					return io.ErrUnexpectedEOF
3208
+				}
3209
+				b := dAtA[iNdEx]
3210
+				iNdEx++
3211
+				stringLen |= (uint64(b) & 0x7F) << shift
3212
+				if b < 0x80 {
3213
+					break
3214
+				}
3215
+			}
3216
+			intStringLen := int(stringLen)
3217
+			if intStringLen < 0 {
3218
+				return ErrInvalidLengthStore
3219
+			}
3220
+			postIndex := iNdEx + intStringLen
3221
+			if postIndex > l {
3222
+				return io.ErrUnexpectedEOF
3223
+			}
3224
+			m.Value = string(dAtA[iNdEx:postIndex])
3225
+			iNdEx = postIndex
3226
+		default:
3227
+			iNdEx = preIndex
3228
+			skippy, err := skipStore(dAtA[iNdEx:])
3229
+			if err != nil {
3230
+				return err
3231
+			}
3232
+			if skippy < 0 {
3233
+				return ErrInvalidLengthStore
3234
+			}
3235
+			if (iNdEx + skippy) > l {
3236
+				return io.ErrUnexpectedEOF
3237
+			}
3238
+			iNdEx += skippy
3239
+		}
3240
+	}
3241
+
3242
+	if iNdEx > l {
3243
+		return io.ErrUnexpectedEOF
3244
+	}
3245
+	return nil
3246
+}
3247
+func (m *SelectBy) Unmarshal(dAtA []byte) error {
3248
+	l := len(dAtA)
3249
+	iNdEx := 0
3250
+	for iNdEx < l {
3251
+		preIndex := iNdEx
3252
+		var wire uint64
3253
+		for shift := uint(0); ; shift += 7 {
3254
+			if shift >= 64 {
3255
+				return ErrIntOverflowStore
3256
+			}
3257
+			if iNdEx >= l {
3258
+				return io.ErrUnexpectedEOF
3259
+			}
3260
+			b := dAtA[iNdEx]
3261
+			iNdEx++
3262
+			wire |= (uint64(b) & 0x7F) << shift
3263
+			if b < 0x80 {
3264
+				break
3265
+			}
3266
+		}
3267
+		fieldNum := int32(wire >> 3)
3268
+		wireType := int(wire & 0x7)
3269
+		if wireType == 4 {
3270
+			return fmt.Errorf("proto: SelectBy: wiretype end group for non-group")
3271
+		}
3272
+		if fieldNum <= 0 {
3273
+			return fmt.Errorf("proto: SelectBy: illegal tag %d (wire type %d)", fieldNum, wire)
3274
+		}
3275
+		switch fieldNum {
3276
+		case 1:
3277
+			if wireType != 2 {
3278
+				return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType)
3279
+			}
3280
+			var stringLen uint64
3281
+			for shift := uint(0); ; shift += 7 {
3282
+				if shift >= 64 {
3283
+					return ErrIntOverflowStore
3284
+				}
3285
+				if iNdEx >= l {
3286
+					return io.ErrUnexpectedEOF
3287
+				}
3288
+				b := dAtA[iNdEx]
3289
+				iNdEx++
3290
+				stringLen |= (uint64(b) & 0x7F) << shift
3291
+				if b < 0x80 {
3292
+					break
3293
+				}
3294
+			}
3295
+			intStringLen := int(stringLen)
3296
+			if intStringLen < 0 {
3297
+				return ErrInvalidLengthStore
3298
+			}
3299
+			postIndex := iNdEx + intStringLen
3300
+			if postIndex > l {
3301
+				return io.ErrUnexpectedEOF
3302
+			}
3303
+			m.By = &SelectBy_ID{string(dAtA[iNdEx:postIndex])}
3304
+			iNdEx = postIndex
3305
+		case 2:
3306
+			if wireType != 2 {
3307
+				return fmt.Errorf("proto: wrong wireType = %d for field IDPrefix", wireType)
3308
+			}
3309
+			var stringLen uint64
3310
+			for shift := uint(0); ; shift += 7 {
3311
+				if shift >= 64 {
3312
+					return ErrIntOverflowStore
3313
+				}
3314
+				if iNdEx >= l {
3315
+					return io.ErrUnexpectedEOF
3316
+				}
3317
+				b := dAtA[iNdEx]
3318
+				iNdEx++
3319
+				stringLen |= (uint64(b) & 0x7F) << shift
3320
+				if b < 0x80 {
3321
+					break
3322
+				}
3323
+			}
3324
+			intStringLen := int(stringLen)
3325
+			if intStringLen < 0 {
3326
+				return ErrInvalidLengthStore
3327
+			}
3328
+			postIndex := iNdEx + intStringLen
3329
+			if postIndex > l {
3330
+				return io.ErrUnexpectedEOF
3331
+			}
3332
+			m.By = &SelectBy_IDPrefix{string(dAtA[iNdEx:postIndex])}
3333
+			iNdEx = postIndex
3334
+		case 3:
3335
+			if wireType != 2 {
3336
+				return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType)
3337
+			}
3338
+			var stringLen uint64
3339
+			for shift := uint(0); ; shift += 7 {
3340
+				if shift >= 64 {
3341
+					return ErrIntOverflowStore
3342
+				}
3343
+				if iNdEx >= l {
3344
+					return io.ErrUnexpectedEOF
3345
+				}
3346
+				b := dAtA[iNdEx]
3347
+				iNdEx++
3348
+				stringLen |= (uint64(b) & 0x7F) << shift
3349
+				if b < 0x80 {
3350
+					break
3351
+				}
3352
+			}
3353
+			intStringLen := int(stringLen)
3354
+			if intStringLen < 0 {
3355
+				return ErrInvalidLengthStore
3356
+			}
3357
+			postIndex := iNdEx + intStringLen
3358
+			if postIndex > l {
3359
+				return io.ErrUnexpectedEOF
3360
+			}
3361
+			m.By = &SelectBy_Name{string(dAtA[iNdEx:postIndex])}
3362
+			iNdEx = postIndex
3363
+		case 4:
3364
+			if wireType != 2 {
3365
+				return fmt.Errorf("proto: wrong wireType = %d for field NamePrefix", wireType)
3366
+			}
3367
+			var stringLen uint64
3368
+			for shift := uint(0); ; shift += 7 {
3369
+				if shift >= 64 {
3370
+					return ErrIntOverflowStore
3371
+				}
3372
+				if iNdEx >= l {
3373
+					return io.ErrUnexpectedEOF
3374
+				}
3375
+				b := dAtA[iNdEx]
3376
+				iNdEx++
3377
+				stringLen |= (uint64(b) & 0x7F) << shift
3378
+				if b < 0x80 {
3379
+					break
3380
+				}
3381
+			}
3382
+			intStringLen := int(stringLen)
3383
+			if intStringLen < 0 {
3384
+				return ErrInvalidLengthStore
3385
+			}
3386
+			postIndex := iNdEx + intStringLen
3387
+			if postIndex > l {
3388
+				return io.ErrUnexpectedEOF
3389
+			}
3390
+			m.By = &SelectBy_NamePrefix{string(dAtA[iNdEx:postIndex])}
3391
+			iNdEx = postIndex
3392
+		case 5:
3393
+			if wireType != 2 {
3394
+				return fmt.Errorf("proto: wrong wireType = %d for field Custom", wireType)
3395
+			}
3396
+			var msglen int
3397
+			for shift := uint(0); ; shift += 7 {
3398
+				if shift >= 64 {
3399
+					return ErrIntOverflowStore
3400
+				}
3401
+				if iNdEx >= l {
3402
+					return io.ErrUnexpectedEOF
3403
+				}
3404
+				b := dAtA[iNdEx]
3405
+				iNdEx++
3406
+				msglen |= (int(b) & 0x7F) << shift
3407
+				if b < 0x80 {
3408
+					break
3409
+				}
3410
+			}
3411
+			if msglen < 0 {
3412
+				return ErrInvalidLengthStore
3413
+			}
3414
+			postIndex := iNdEx + msglen
3415
+			if postIndex > l {
3416
+				return io.ErrUnexpectedEOF
3417
+			}
3418
+			v := &SelectByCustom{}
3419
+			if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
3420
+				return err
3421
+			}
3422
+			m.By = &SelectBy_Custom{v}
3423
+			iNdEx = postIndex
3424
+		case 6:
3425
+			if wireType != 2 {
3426
+				return fmt.Errorf("proto: wrong wireType = %d for field CustomPrefix", wireType)
3427
+			}
3428
+			var msglen int
3429
+			for shift := uint(0); ; shift += 7 {
3430
+				if shift >= 64 {
3431
+					return ErrIntOverflowStore
3432
+				}
3433
+				if iNdEx >= l {
3434
+					return io.ErrUnexpectedEOF
3435
+				}
3436
+				b := dAtA[iNdEx]
3437
+				iNdEx++
3438
+				msglen |= (int(b) & 0x7F) << shift
3439
+				if b < 0x80 {
3440
+					break
3441
+				}
3442
+			}
3443
+			if msglen < 0 {
3444
+				return ErrInvalidLengthStore
3445
+			}
3446
+			postIndex := iNdEx + msglen
3447
+			if postIndex > l {
3448
+				return io.ErrUnexpectedEOF
3449
+			}
3450
+			v := &SelectByCustom{}
3451
+			if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
3452
+				return err
3453
+			}
3454
+			m.By = &SelectBy_CustomPrefix{v}
3455
+			iNdEx = postIndex
3456
+		case 7:
3457
+			if wireType != 2 {
3458
+				return fmt.Errorf("proto: wrong wireType = %d for field ServiceID", wireType)
3459
+			}
3460
+			var stringLen uint64
3461
+			for shift := uint(0); ; shift += 7 {
3462
+				if shift >= 64 {
3463
+					return ErrIntOverflowStore
3464
+				}
3465
+				if iNdEx >= l {
3466
+					return io.ErrUnexpectedEOF
3467
+				}
3468
+				b := dAtA[iNdEx]
3469
+				iNdEx++
3470
+				stringLen |= (uint64(b) & 0x7F) << shift
3471
+				if b < 0x80 {
3472
+					break
3473
+				}
3474
+			}
3475
+			intStringLen := int(stringLen)
3476
+			if intStringLen < 0 {
3477
+				return ErrInvalidLengthStore
3478
+			}
3479
+			postIndex := iNdEx + intStringLen
3480
+			if postIndex > l {
3481
+				return io.ErrUnexpectedEOF
3482
+			}
3483
+			m.By = &SelectBy_ServiceID{string(dAtA[iNdEx:postIndex])}
3484
+			iNdEx = postIndex
3485
+		case 8:
3486
+			if wireType != 2 {
3487
+				return fmt.Errorf("proto: wrong wireType = %d for field NodeID", wireType)
3488
+			}
3489
+			var stringLen uint64
3490
+			for shift := uint(0); ; shift += 7 {
3491
+				if shift >= 64 {
3492
+					return ErrIntOverflowStore
3493
+				}
3494
+				if iNdEx >= l {
3495
+					return io.ErrUnexpectedEOF
3496
+				}
3497
+				b := dAtA[iNdEx]
3498
+				iNdEx++
3499
+				stringLen |= (uint64(b) & 0x7F) << shift
3500
+				if b < 0x80 {
3501
+					break
3502
+				}
3503
+			}
3504
+			intStringLen := int(stringLen)
3505
+			if intStringLen < 0 {
3506
+				return ErrInvalidLengthStore
3507
+			}
3508
+			postIndex := iNdEx + intStringLen
3509
+			if postIndex > l {
3510
+				return io.ErrUnexpectedEOF
3511
+			}
3512
+			m.By = &SelectBy_NodeID{string(dAtA[iNdEx:postIndex])}
3513
+			iNdEx = postIndex
3514
+		case 9:
3515
+			if wireType != 2 {
3516
+				return fmt.Errorf("proto: wrong wireType = %d for field Slot", wireType)
3517
+			}
3518
+			var msglen int
3519
+			for shift := uint(0); ; shift += 7 {
3520
+				if shift >= 64 {
3521
+					return ErrIntOverflowStore
3522
+				}
3523
+				if iNdEx >= l {
3524
+					return io.ErrUnexpectedEOF
3525
+				}
3526
+				b := dAtA[iNdEx]
3527
+				iNdEx++
3528
+				msglen |= (int(b) & 0x7F) << shift
3529
+				if b < 0x80 {
3530
+					break
3531
+				}
3532
+			}
3533
+			if msglen < 0 {
3534
+				return ErrInvalidLengthStore
3535
+			}
3536
+			postIndex := iNdEx + msglen
3537
+			if postIndex > l {
3538
+				return io.ErrUnexpectedEOF
3539
+			}
3540
+			v := &SelectBySlot{}
3541
+			if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
3542
+				return err
3543
+			}
3544
+			m.By = &SelectBy_Slot{v}
3545
+			iNdEx = postIndex
3546
+		case 10:
3547
+			if wireType != 0 {
3548
+				return fmt.Errorf("proto: wrong wireType = %d for field DesiredState", wireType)
3549
+			}
3550
+			var v TaskState
3551
+			for shift := uint(0); ; shift += 7 {
3552
+				if shift >= 64 {
3553
+					return ErrIntOverflowStore
3554
+				}
3555
+				if iNdEx >= l {
3556
+					return io.ErrUnexpectedEOF
3557
+				}
3558
+				b := dAtA[iNdEx]
3559
+				iNdEx++
3560
+				v |= (TaskState(b) & 0x7F) << shift
3561
+				if b < 0x80 {
3562
+					break
3563
+				}
3564
+			}
3565
+			m.By = &SelectBy_DesiredState{v}
3566
+		case 11:
3567
+			if wireType != 0 {
3568
+				return fmt.Errorf("proto: wrong wireType = %d for field Role", wireType)
3569
+			}
3570
+			var v NodeRole
3571
+			for shift := uint(0); ; shift += 7 {
3572
+				if shift >= 64 {
3573
+					return ErrIntOverflowStore
3574
+				}
3575
+				if iNdEx >= l {
3576
+					return io.ErrUnexpectedEOF
3577
+				}
3578
+				b := dAtA[iNdEx]
3579
+				iNdEx++
3580
+				v |= (NodeRole(b) & 0x7F) << shift
3581
+				if b < 0x80 {
3582
+					break
3583
+				}
3584
+			}
3585
+			m.By = &SelectBy_Role{v}
3586
+		case 12:
3587
+			if wireType != 0 {
3588
+				return fmt.Errorf("proto: wrong wireType = %d for field Membership", wireType)
3589
+			}
3590
+			var v NodeSpec_Membership
3591
+			for shift := uint(0); ; shift += 7 {
3592
+				if shift >= 64 {
3593
+					return ErrIntOverflowStore
3594
+				}
3595
+				if iNdEx >= l {
3596
+					return io.ErrUnexpectedEOF
3597
+				}
3598
+				b := dAtA[iNdEx]
3599
+				iNdEx++
3600
+				v |= (NodeSpec_Membership(b) & 0x7F) << shift
3601
+				if b < 0x80 {
3602
+					break
3603
+				}
3604
+			}
3605
+			m.By = &SelectBy_Membership{v}
3606
+		case 13:
3607
+			if wireType != 2 {
3608
+				return fmt.Errorf("proto: wrong wireType = %d for field ReferencedNetworkID", wireType)
3609
+			}
3610
+			var stringLen uint64
3611
+			for shift := uint(0); ; shift += 7 {
3612
+				if shift >= 64 {
3613
+					return ErrIntOverflowStore
3614
+				}
3615
+				if iNdEx >= l {
3616
+					return io.ErrUnexpectedEOF
3617
+				}
3618
+				b := dAtA[iNdEx]
3619
+				iNdEx++
3620
+				stringLen |= (uint64(b) & 0x7F) << shift
3621
+				if b < 0x80 {
3622
+					break
3623
+				}
3624
+			}
3625
+			intStringLen := int(stringLen)
3626
+			if intStringLen < 0 {
3627
+				return ErrInvalidLengthStore
3628
+			}
3629
+			postIndex := iNdEx + intStringLen
3630
+			if postIndex > l {
3631
+				return io.ErrUnexpectedEOF
3632
+			}
3633
+			m.By = &SelectBy_ReferencedNetworkID{string(dAtA[iNdEx:postIndex])}
3634
+			iNdEx = postIndex
3635
+		case 14:
3636
+			if wireType != 2 {
3637
+				return fmt.Errorf("proto: wrong wireType = %d for field ReferencedSecretID", wireType)
3638
+			}
3639
+			var stringLen uint64
3640
+			for shift := uint(0); ; shift += 7 {
3641
+				if shift >= 64 {
3642
+					return ErrIntOverflowStore
3643
+				}
3644
+				if iNdEx >= l {
3645
+					return io.ErrUnexpectedEOF
3646
+				}
3647
+				b := dAtA[iNdEx]
3648
+				iNdEx++
3649
+				stringLen |= (uint64(b) & 0x7F) << shift
3650
+				if b < 0x80 {
3651
+					break
3652
+				}
3653
+			}
3654
+			intStringLen := int(stringLen)
3655
+			if intStringLen < 0 {
3656
+				return ErrInvalidLengthStore
3657
+			}
3658
+			postIndex := iNdEx + intStringLen
3659
+			if postIndex > l {
3660
+				return io.ErrUnexpectedEOF
3661
+			}
3662
+			m.By = &SelectBy_ReferencedSecretID{string(dAtA[iNdEx:postIndex])}
3663
+			iNdEx = postIndex
3664
+		case 15:
3665
+			if wireType != 2 {
3666
+				return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType)
3667
+			}
3668
+			var stringLen uint64
3669
+			for shift := uint(0); ; shift += 7 {
3670
+				if shift >= 64 {
3671
+					return ErrIntOverflowStore
3672
+				}
3673
+				if iNdEx >= l {
3674
+					return io.ErrUnexpectedEOF
3675
+				}
3676
+				b := dAtA[iNdEx]
3677
+				iNdEx++
3678
+				stringLen |= (uint64(b) & 0x7F) << shift
3679
+				if b < 0x80 {
3680
+					break
3681
+				}
3682
+			}
3683
+			intStringLen := int(stringLen)
3684
+			if intStringLen < 0 {
3685
+				return ErrInvalidLengthStore
3686
+			}
3687
+			postIndex := iNdEx + intStringLen
3688
+			if postIndex > l {
3689
+				return io.ErrUnexpectedEOF
3690
+			}
3691
+			m.By = &SelectBy_Kind{string(dAtA[iNdEx:postIndex])}
3692
+			iNdEx = postIndex
3693
+		default:
3694
+			iNdEx = preIndex
3695
+			skippy, err := skipStore(dAtA[iNdEx:])
3696
+			if err != nil {
3697
+				return err
3698
+			}
3699
+			if skippy < 0 {
3700
+				return ErrInvalidLengthStore
3701
+			}
3702
+			if (iNdEx + skippy) > l {
3703
+				return io.ErrUnexpectedEOF
3704
+			}
3705
+			iNdEx += skippy
3706
+		}
3707
+	}
3708
+
3709
+	if iNdEx > l {
3710
+		return io.ErrUnexpectedEOF
3711
+	}
3712
+	return nil
3713
+}
3714
+func (m *WatchRequest) Unmarshal(dAtA []byte) error {
3715
+	l := len(dAtA)
3716
+	iNdEx := 0
3717
+	for iNdEx < l {
3718
+		preIndex := iNdEx
3719
+		var wire uint64
3720
+		for shift := uint(0); ; shift += 7 {
3721
+			if shift >= 64 {
3722
+				return ErrIntOverflowStore
3723
+			}
3724
+			if iNdEx >= l {
3725
+				return io.ErrUnexpectedEOF
3726
+			}
3727
+			b := dAtA[iNdEx]
3728
+			iNdEx++
3729
+			wire |= (uint64(b) & 0x7F) << shift
3730
+			if b < 0x80 {
3731
+				break
3732
+			}
3733
+		}
3734
+		fieldNum := int32(wire >> 3)
3735
+		wireType := int(wire & 0x7)
3736
+		if wireType == 4 {
3737
+			return fmt.Errorf("proto: WatchRequest: wiretype end group for non-group")
3738
+		}
3739
+		if fieldNum <= 0 {
3740
+			return fmt.Errorf("proto: WatchRequest: illegal tag %d (wire type %d)", fieldNum, wire)
3741
+		}
3742
+		switch fieldNum {
3743
+		case 1:
3744
+			if wireType != 2 {
3745
+				return fmt.Errorf("proto: wrong wireType = %d for field Entries", wireType)
3746
+			}
3747
+			var msglen int
3748
+			for shift := uint(0); ; shift += 7 {
3749
+				if shift >= 64 {
3750
+					return ErrIntOverflowStore
3751
+				}
3752
+				if iNdEx >= l {
3753
+					return io.ErrUnexpectedEOF
3754
+				}
3755
+				b := dAtA[iNdEx]
3756
+				iNdEx++
3757
+				msglen |= (int(b) & 0x7F) << shift
3758
+				if b < 0x80 {
3759
+					break
3760
+				}
3761
+			}
3762
+			if msglen < 0 {
3763
+				return ErrInvalidLengthStore
3764
+			}
3765
+			postIndex := iNdEx + msglen
3766
+			if postIndex > l {
3767
+				return io.ErrUnexpectedEOF
3768
+			}
3769
+			m.Entries = append(m.Entries, &WatchRequest_WatchEntry{})
3770
+			if err := m.Entries[len(m.Entries)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
3771
+				return err
3772
+			}
3773
+			iNdEx = postIndex
3774
+		case 2:
3775
+			if wireType != 2 {
3776
+				return fmt.Errorf("proto: wrong wireType = %d for field ResumeFrom", wireType)
3777
+			}
3778
+			var msglen int
3779
+			for shift := uint(0); ; shift += 7 {
3780
+				if shift >= 64 {
3781
+					return ErrIntOverflowStore
3782
+				}
3783
+				if iNdEx >= l {
3784
+					return io.ErrUnexpectedEOF
3785
+				}
3786
+				b := dAtA[iNdEx]
3787
+				iNdEx++
3788
+				msglen |= (int(b) & 0x7F) << shift
3789
+				if b < 0x80 {
3790
+					break
3791
+				}
3792
+			}
3793
+			if msglen < 0 {
3794
+				return ErrInvalidLengthStore
3795
+			}
3796
+			postIndex := iNdEx + msglen
3797
+			if postIndex > l {
3798
+				return io.ErrUnexpectedEOF
3799
+			}
3800
+			if m.ResumeFrom == nil {
3801
+				m.ResumeFrom = &Version{}
3802
+			}
3803
+			if err := m.ResumeFrom.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
3804
+				return err
3805
+			}
3806
+			iNdEx = postIndex
3807
+		case 3:
3808
+			if wireType != 0 {
3809
+				return fmt.Errorf("proto: wrong wireType = %d for field IncludeOldObject", wireType)
3810
+			}
3811
+			var v int
3812
+			for shift := uint(0); ; shift += 7 {
3813
+				if shift >= 64 {
3814
+					return ErrIntOverflowStore
3815
+				}
3816
+				if iNdEx >= l {
3817
+					return io.ErrUnexpectedEOF
3818
+				}
3819
+				b := dAtA[iNdEx]
3820
+				iNdEx++
3821
+				v |= (int(b) & 0x7F) << shift
3822
+				if b < 0x80 {
3823
+					break
3824
+				}
3825
+			}
3826
+			m.IncludeOldObject = bool(v != 0)
3827
+		default:
3828
+			iNdEx = preIndex
3829
+			skippy, err := skipStore(dAtA[iNdEx:])
3830
+			if err != nil {
3831
+				return err
3832
+			}
3833
+			if skippy < 0 {
3834
+				return ErrInvalidLengthStore
3835
+			}
3836
+			if (iNdEx + skippy) > l {
3837
+				return io.ErrUnexpectedEOF
3838
+			}
3839
+			iNdEx += skippy
3840
+		}
3841
+	}
3842
+
3843
+	if iNdEx > l {
3844
+		return io.ErrUnexpectedEOF
3845
+	}
3846
+	return nil
3847
+}
3848
+func (m *WatchRequest_WatchEntry) Unmarshal(dAtA []byte) error {
3849
+	l := len(dAtA)
3850
+	iNdEx := 0
3851
+	for iNdEx < l {
3852
+		preIndex := iNdEx
3853
+		var wire uint64
3854
+		for shift := uint(0); ; shift += 7 {
3855
+			if shift >= 64 {
3856
+				return ErrIntOverflowStore
3857
+			}
3858
+			if iNdEx >= l {
3859
+				return io.ErrUnexpectedEOF
3860
+			}
3861
+			b := dAtA[iNdEx]
3862
+			iNdEx++
3863
+			wire |= (uint64(b) & 0x7F) << shift
3864
+			if b < 0x80 {
3865
+				break
3866
+			}
3867
+		}
3868
+		fieldNum := int32(wire >> 3)
3869
+		wireType := int(wire & 0x7)
3870
+		if wireType == 4 {
3871
+			return fmt.Errorf("proto: WatchEntry: wiretype end group for non-group")
3872
+		}
3873
+		if fieldNum <= 0 {
3874
+			return fmt.Errorf("proto: WatchEntry: illegal tag %d (wire type %d)", fieldNum, wire)
3875
+		}
3876
+		switch fieldNum {
3877
+		case 1:
3878
+			if wireType != 2 {
3879
+				return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType)
3880
+			}
3881
+			var stringLen uint64
3882
+			for shift := uint(0); ; shift += 7 {
3883
+				if shift >= 64 {
3884
+					return ErrIntOverflowStore
3885
+				}
3886
+				if iNdEx >= l {
3887
+					return io.ErrUnexpectedEOF
3888
+				}
3889
+				b := dAtA[iNdEx]
3890
+				iNdEx++
3891
+				stringLen |= (uint64(b) & 0x7F) << shift
3892
+				if b < 0x80 {
3893
+					break
3894
+				}
3895
+			}
3896
+			intStringLen := int(stringLen)
3897
+			if intStringLen < 0 {
3898
+				return ErrInvalidLengthStore
3899
+			}
3900
+			postIndex := iNdEx + intStringLen
3901
+			if postIndex > l {
3902
+				return io.ErrUnexpectedEOF
3903
+			}
3904
+			m.Kind = string(dAtA[iNdEx:postIndex])
3905
+			iNdEx = postIndex
3906
+		case 2:
3907
+			if wireType != 0 {
3908
+				return fmt.Errorf("proto: wrong wireType = %d for field Action", wireType)
3909
+			}
3910
+			m.Action = 0
3911
+			for shift := uint(0); ; shift += 7 {
3912
+				if shift >= 64 {
3913
+					return ErrIntOverflowStore
3914
+				}
3915
+				if iNdEx >= l {
3916
+					return io.ErrUnexpectedEOF
3917
+				}
3918
+				b := dAtA[iNdEx]
3919
+				iNdEx++
3920
+				m.Action |= (WatchActionKind(b) & 0x7F) << shift
3921
+				if b < 0x80 {
3922
+					break
3923
+				}
3924
+			}
3925
+		case 3:
3926
+			if wireType != 2 {
3927
+				return fmt.Errorf("proto: wrong wireType = %d for field Filters", wireType)
3928
+			}
3929
+			var msglen int
3930
+			for shift := uint(0); ; shift += 7 {
3931
+				if shift >= 64 {
3932
+					return ErrIntOverflowStore
3933
+				}
3934
+				if iNdEx >= l {
3935
+					return io.ErrUnexpectedEOF
3936
+				}
3937
+				b := dAtA[iNdEx]
3938
+				iNdEx++
3939
+				msglen |= (int(b) & 0x7F) << shift
3940
+				if b < 0x80 {
3941
+					break
3942
+				}
3943
+			}
3944
+			if msglen < 0 {
3945
+				return ErrInvalidLengthStore
3946
+			}
3947
+			postIndex := iNdEx + msglen
3948
+			if postIndex > l {
3949
+				return io.ErrUnexpectedEOF
3950
+			}
3951
+			m.Filters = append(m.Filters, &SelectBy{})
3952
+			if err := m.Filters[len(m.Filters)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
3953
+				return err
3954
+			}
3955
+			iNdEx = postIndex
3956
+		default:
3957
+			iNdEx = preIndex
3958
+			skippy, err := skipStore(dAtA[iNdEx:])
3959
+			if err != nil {
3960
+				return err
3961
+			}
3962
+			if skippy < 0 {
3963
+				return ErrInvalidLengthStore
3964
+			}
3965
+			if (iNdEx + skippy) > l {
3966
+				return io.ErrUnexpectedEOF
3967
+			}
3968
+			iNdEx += skippy
3969
+		}
3970
+	}
3971
+
3972
+	if iNdEx > l {
3973
+		return io.ErrUnexpectedEOF
3974
+	}
3975
+	return nil
3976
+}
3977
+func (m *WatchMessage) Unmarshal(dAtA []byte) error {
3978
+	l := len(dAtA)
3979
+	iNdEx := 0
3980
+	for iNdEx < l {
3981
+		preIndex := iNdEx
3982
+		var wire uint64
3983
+		for shift := uint(0); ; shift += 7 {
3984
+			if shift >= 64 {
3985
+				return ErrIntOverflowStore
3986
+			}
3987
+			if iNdEx >= l {
3988
+				return io.ErrUnexpectedEOF
3989
+			}
3990
+			b := dAtA[iNdEx]
3991
+			iNdEx++
3992
+			wire |= (uint64(b) & 0x7F) << shift
3993
+			if b < 0x80 {
3994
+				break
3995
+			}
3996
+		}
3997
+		fieldNum := int32(wire >> 3)
3998
+		wireType := int(wire & 0x7)
3999
+		if wireType == 4 {
4000
+			return fmt.Errorf("proto: WatchMessage: wiretype end group for non-group")
4001
+		}
4002
+		if fieldNum <= 0 {
4003
+			return fmt.Errorf("proto: WatchMessage: illegal tag %d (wire type %d)", fieldNum, wire)
4004
+		}
4005
+		switch fieldNum {
4006
+		case 1:
4007
+			if wireType != 2 {
4008
+				return fmt.Errorf("proto: wrong wireType = %d for field Events", wireType)
4009
+			}
4010
+			var msglen int
4011
+			for shift := uint(0); ; shift += 7 {
4012
+				if shift >= 64 {
4013
+					return ErrIntOverflowStore
4014
+				}
4015
+				if iNdEx >= l {
4016
+					return io.ErrUnexpectedEOF
4017
+				}
4018
+				b := dAtA[iNdEx]
4019
+				iNdEx++
4020
+				msglen |= (int(b) & 0x7F) << shift
4021
+				if b < 0x80 {
4022
+					break
4023
+				}
4024
+			}
4025
+			if msglen < 0 {
4026
+				return ErrInvalidLengthStore
4027
+			}
4028
+			postIndex := iNdEx + msglen
4029
+			if postIndex > l {
4030
+				return io.ErrUnexpectedEOF
4031
+			}
4032
+			m.Events = append(m.Events, &WatchMessage_Event{})
4033
+			if err := m.Events[len(m.Events)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
4034
+				return err
4035
+			}
4036
+			iNdEx = postIndex
4037
+		case 2:
4038
+			if wireType != 2 {
4039
+				return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType)
4040
+			}
4041
+			var msglen int
4042
+			for shift := uint(0); ; shift += 7 {
4043
+				if shift >= 64 {
4044
+					return ErrIntOverflowStore
4045
+				}
4046
+				if iNdEx >= l {
4047
+					return io.ErrUnexpectedEOF
4048
+				}
4049
+				b := dAtA[iNdEx]
4050
+				iNdEx++
4051
+				msglen |= (int(b) & 0x7F) << shift
4052
+				if b < 0x80 {
4053
+					break
4054
+				}
4055
+			}
4056
+			if msglen < 0 {
4057
+				return ErrInvalidLengthStore
4058
+			}
4059
+			postIndex := iNdEx + msglen
4060
+			if postIndex > l {
4061
+				return io.ErrUnexpectedEOF
4062
+			}
4063
+			if m.Version == nil {
4064
+				m.Version = &Version{}
4065
+			}
4066
+			if err := m.Version.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
4067
+				return err
4068
+			}
4069
+			iNdEx = postIndex
4070
+		default:
4071
+			iNdEx = preIndex
4072
+			skippy, err := skipStore(dAtA[iNdEx:])
4073
+			if err != nil {
4074
+				return err
4075
+			}
4076
+			if skippy < 0 {
4077
+				return ErrInvalidLengthStore
4078
+			}
4079
+			if (iNdEx + skippy) > l {
4080
+				return io.ErrUnexpectedEOF
4081
+			}
4082
+			iNdEx += skippy
4083
+		}
4084
+	}
4085
+
4086
+	if iNdEx > l {
4087
+		return io.ErrUnexpectedEOF
4088
+	}
4089
+	return nil
4090
+}
4091
+func (m *WatchMessage_Event) Unmarshal(dAtA []byte) error {
4092
+	l := len(dAtA)
4093
+	iNdEx := 0
4094
+	for iNdEx < l {
4095
+		preIndex := iNdEx
4096
+		var wire uint64
4097
+		for shift := uint(0); ; shift += 7 {
4098
+			if shift >= 64 {
4099
+				return ErrIntOverflowStore
4100
+			}
4101
+			if iNdEx >= l {
4102
+				return io.ErrUnexpectedEOF
4103
+			}
4104
+			b := dAtA[iNdEx]
4105
+			iNdEx++
4106
+			wire |= (uint64(b) & 0x7F) << shift
4107
+			if b < 0x80 {
4108
+				break
4109
+			}
4110
+		}
4111
+		fieldNum := int32(wire >> 3)
4112
+		wireType := int(wire & 0x7)
4113
+		if wireType == 4 {
4114
+			return fmt.Errorf("proto: Event: wiretype end group for non-group")
4115
+		}
4116
+		if fieldNum <= 0 {
4117
+			return fmt.Errorf("proto: Event: illegal tag %d (wire type %d)", fieldNum, wire)
4118
+		}
4119
+		switch fieldNum {
4120
+		case 1:
4121
+			if wireType != 0 {
4122
+				return fmt.Errorf("proto: wrong wireType = %d for field Action", wireType)
4123
+			}
4124
+			m.Action = 0
4125
+			for shift := uint(0); ; shift += 7 {
4126
+				if shift >= 64 {
4127
+					return ErrIntOverflowStore
4128
+				}
4129
+				if iNdEx >= l {
4130
+					return io.ErrUnexpectedEOF
4131
+				}
4132
+				b := dAtA[iNdEx]
4133
+				iNdEx++
4134
+				m.Action |= (WatchActionKind(b) & 0x7F) << shift
4135
+				if b < 0x80 {
4136
+					break
4137
+				}
4138
+			}
4139
+		case 2:
4140
+			if wireType != 2 {
4141
+				return fmt.Errorf("proto: wrong wireType = %d for field Object", wireType)
4142
+			}
4143
+			var msglen int
4144
+			for shift := uint(0); ; shift += 7 {
4145
+				if shift >= 64 {
4146
+					return ErrIntOverflowStore
4147
+				}
4148
+				if iNdEx >= l {
4149
+					return io.ErrUnexpectedEOF
4150
+				}
4151
+				b := dAtA[iNdEx]
4152
+				iNdEx++
4153
+				msglen |= (int(b) & 0x7F) << shift
4154
+				if b < 0x80 {
4155
+					break
4156
+				}
4157
+			}
4158
+			if msglen < 0 {
4159
+				return ErrInvalidLengthStore
4160
+			}
4161
+			postIndex := iNdEx + msglen
4162
+			if postIndex > l {
4163
+				return io.ErrUnexpectedEOF
4164
+			}
4165
+			if m.Object == nil {
4166
+				m.Object = &Object{}
4167
+			}
4168
+			if err := m.Object.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
4169
+				return err
4170
+			}
4171
+			iNdEx = postIndex
4172
+		case 3:
4173
+			if wireType != 2 {
4174
+				return fmt.Errorf("proto: wrong wireType = %d for field OldObject", wireType)
4175
+			}
4176
+			var msglen int
4177
+			for shift := uint(0); ; shift += 7 {
4178
+				if shift >= 64 {
4179
+					return ErrIntOverflowStore
4180
+				}
4181
+				if iNdEx >= l {
4182
+					return io.ErrUnexpectedEOF
4183
+				}
4184
+				b := dAtA[iNdEx]
4185
+				iNdEx++
4186
+				msglen |= (int(b) & 0x7F) << shift
4187
+				if b < 0x80 {
4188
+					break
4189
+				}
4190
+			}
4191
+			if msglen < 0 {
4192
+				return ErrInvalidLengthStore
4193
+			}
4194
+			postIndex := iNdEx + msglen
4195
+			if postIndex > l {
4196
+				return io.ErrUnexpectedEOF
4197
+			}
4198
+			if m.OldObject == nil {
4199
+				m.OldObject = &Object{}
4200
+			}
4201
+			if err := m.OldObject.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
4202
+				return err
4203
+			}
4204
+			iNdEx = postIndex
4205
+		default:
4206
+			iNdEx = preIndex
4207
+			skippy, err := skipStore(dAtA[iNdEx:])
4208
+			if err != nil {
4209
+				return err
4210
+			}
4211
+			if skippy < 0 {
4212
+				return ErrInvalidLengthStore
4213
+			}
4214
+			if (iNdEx + skippy) > l {
4215
+				return io.ErrUnexpectedEOF
4216
+			}
4217
+			iNdEx += skippy
4218
+		}
4219
+	}
4220
+
4221
+	if iNdEx > l {
4222
+		return io.ErrUnexpectedEOF
4223
+	}
4224
+	return nil
4225
+}
4226
+func skipStore(dAtA []byte) (n int, err error) {
4227
+	l := len(dAtA)
4228
+	iNdEx := 0
4229
+	for iNdEx < l {
4230
+		var wire uint64
4231
+		for shift := uint(0); ; shift += 7 {
4232
+			if shift >= 64 {
4233
+				return 0, ErrIntOverflowStore
4234
+			}
4235
+			if iNdEx >= l {
4236
+				return 0, io.ErrUnexpectedEOF
4237
+			}
4238
+			b := dAtA[iNdEx]
4239
+			iNdEx++
4240
+			wire |= (uint64(b) & 0x7F) << shift
4241
+			if b < 0x80 {
4242
+				break
4243
+			}
4244
+		}
4245
+		wireType := int(wire & 0x7)
4246
+		switch wireType {
4247
+		case 0:
4248
+			for shift := uint(0); ; shift += 7 {
4249
+				if shift >= 64 {
4250
+					return 0, ErrIntOverflowStore
4251
+				}
4252
+				if iNdEx >= l {
4253
+					return 0, io.ErrUnexpectedEOF
4254
+				}
4255
+				iNdEx++
4256
+				if dAtA[iNdEx-1] < 0x80 {
4257
+					break
4258
+				}
4259
+			}
4260
+			return iNdEx, nil
4261
+		case 1:
4262
+			iNdEx += 8
4263
+			return iNdEx, nil
4264
+		case 2:
4265
+			var length int
4266
+			for shift := uint(0); ; shift += 7 {
4267
+				if shift >= 64 {
4268
+					return 0, ErrIntOverflowStore
4269
+				}
4270
+				if iNdEx >= l {
4271
+					return 0, io.ErrUnexpectedEOF
4272
+				}
4273
+				b := dAtA[iNdEx]
4274
+				iNdEx++
4275
+				length |= (int(b) & 0x7F) << shift
4276
+				if b < 0x80 {
4277
+					break
4278
+				}
4279
+			}
4280
+			iNdEx += length
4281
+			if length < 0 {
4282
+				return 0, ErrInvalidLengthStore
4283
+			}
4284
+			return iNdEx, nil
4285
+		case 3:
4286
+			for {
4287
+				var innerWire uint64
4288
+				var start int = iNdEx
4289
+				for shift := uint(0); ; shift += 7 {
4290
+					if shift >= 64 {
4291
+						return 0, ErrIntOverflowStore
4292
+					}
4293
+					if iNdEx >= l {
4294
+						return 0, io.ErrUnexpectedEOF
4295
+					}
4296
+					b := dAtA[iNdEx]
4297
+					iNdEx++
4298
+					innerWire |= (uint64(b) & 0x7F) << shift
4299
+					if b < 0x80 {
4300
+						break
4301
+					}
4302
+				}
4303
+				innerWireType := int(innerWire & 0x7)
4304
+				if innerWireType == 4 {
4305
+					break
4306
+				}
4307
+				next, err := skipStore(dAtA[start:])
4308
+				if err != nil {
4309
+					return 0, err
4310
+				}
4311
+				iNdEx = start + next
4312
+			}
4313
+			return iNdEx, nil
4314
+		case 4:
4315
+			return iNdEx, nil
4316
+		case 5:
4317
+			iNdEx += 4
4318
+			return iNdEx, nil
4319
+		default:
4320
+			return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
4321
+		}
4322
+	}
4323
+	panic("unreachable")
4324
+}
4325
+
4326
+var (
4327
+	ErrInvalidLengthStore = fmt.Errorf("proto: negative length found during unmarshaling")
4328
+	ErrIntOverflowStore   = fmt.Errorf("proto: integer overflow")
4329
+)
4330
+
4331
+func init() { proto.RegisterFile("store.proto", fileDescriptorStore) }
4332
+
4333
+var fileDescriptorStore = []byte{
4334
+	// 1127 bytes of a gzipped FileDescriptorProto
4335
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x94, 0x96, 0x4f, 0x6f, 0x1b, 0xc5,
4336
+	0x1b, 0xc7, 0xbd, 0x8e, 0xb3, 0xb6, 0x1f, 0xc7, 0x6d, 0x34, 0x49, 0xdb, 0xfd, 0xf9, 0x57, 0x6c,
4337
+	0x63, 0x04, 0x54, 0xb4, 0xb8, 0x10, 0x4a, 0x11, 0x50, 0x90, 0x62, 0xc7, 0xc8, 0xa6, 0x8a, 0x13,
4338
+	0x8d, 0x93, 0xe6, 0x68, 0x6d, 0x76, 0x9f, 0xa4, 0x8b, 0xf7, 0x8f, 0x99, 0x1d, 0x3b, 0xcd, 0x8d,
4339
+	0x23, 0xea, 0x1d, 0x89, 0x4b, 0xb9, 0xc0, 0x99, 0x0b, 0x37, 0x78, 0x03, 0x15, 0x07, 0xc4, 0x11,
4340
+	0x2e, 0x16, 0xf5, 0x0b, 0xe0, 0x15, 0x70, 0x40, 0x33, 0x3b, 0x9b, 0x3f, 0xee, 0x3a, 0xa5, 0x27,
4341
+	0xcf, 0xcc, 0x7e, 0x3f, 0xcf, 0x3e, 0xf3, 0x7c, 0x67, 0x1e, 0x2f, 0x14, 0x42, 0x1e, 0x30, 0xac,
4342
+	0x0f, 0x59, 0xc0, 0x03, 0x42, 0xec, 0xc0, 0x1a, 0x20, 0xab, 0x87, 0x47, 0x26, 0xf3, 0x06, 0x0e,
4343
+	0xaf, 0x8f, 0xdf, 0x2d, 0x15, 0xc2, 0x21, 0x5a, 0x61, 0x24, 0x28, 0x15, 0x83, 0xfd, 0x2f, 0xd0,
4344
+	0xe2, 0xf1, 0xb4, 0xc0, 0x8f, 0x87, 0x18, 0x4f, 0x56, 0x0f, 0x83, 0xc3, 0x40, 0x0e, 0x6f, 0x8b,
4345
+	0x91, 0x5a, 0x5d, 0x19, 0xba, 0xa3, 0x43, 0xc7, 0xbf, 0x1d, 0xfd, 0x44, 0x8b, 0xb5, 0xdf, 0x16,
4346
+	0x40, 0xdf, 0x92, 0x91, 0x48, 0x1d, 0x32, 0x7e, 0x60, 0xa3, 0xa1, 0x55, 0xb5, 0x1b, 0x85, 0x35,
4347
+	0xa3, 0xfe, 0x7c, 0x06, 0xf5, 0x6e, 0x60, 0x63, 0x3b, 0x45, 0xa5, 0x8e, 0x7c, 0x00, 0xd9, 0x10,
4348
+	0xd9, 0xd8, 0xb1, 0xd0, 0x48, 0x4b, 0xe4, 0xff, 0x49, 0x48, 0x2f, 0x92, 0xb4, 0x53, 0x34, 0x56,
4349
+	0x0b, 0xd0, 0x47, 0x7e, 0x14, 0xb0, 0x81, 0xb1, 0x30, 0x1f, 0xec, 0x46, 0x12, 0x01, 0x2a, 0xb5,
4350
+	0xc8, 0x90, 0x9b, 0xe1, 0xc0, 0xc8, 0xcc, 0xcf, 0x70, 0xc7, 0x0c, 0x05, 0x22, 0x75, 0xe2, 0x45,
4351
+	0x96, 0x3b, 0x0a, 0x39, 0x32, 0x63, 0x71, 0xfe, 0x8b, 0x9a, 0x91, 0x44, 0xbc, 0x48, 0xa9, 0xc9,
4352
+	0x1d, 0xd0, 0x43, 0xb4, 0x18, 0x72, 0x43, 0x97, 0x5c, 0x29, 0x79, 0x67, 0x42, 0xd1, 0x4e, 0x51,
4353
+	0xa5, 0x25, 0x1f, 0x41, 0x8e, 0x61, 0x18, 0x8c, 0x98, 0x85, 0x46, 0x56, 0x72, 0xd7, 0x93, 0x38,
4354
+	0xaa, 0x34, 0xed, 0x14, 0x3d, 0xd1, 0x93, 0x4f, 0x20, 0x8f, 0x8f, 0x38, 0xfa, 0xa1, 0x13, 0xf8,
4355
+	0x46, 0x4e, 0xc2, 0xaf, 0x24, 0xc1, 0xad, 0x58, 0xd4, 0x4e, 0xd1, 0x53, 0xa2, 0x91, 0x8b, 0x5d,
4356
+	0xac, 0x6d, 0xc3, 0x52, 0x0f, 0x5d, 0xb4, 0x78, 0xe3, 0xb8, 0xe7, 0x06, 0x9c, 0xdc, 0x02, 0x50,
4357
+	0x75, 0xef, 0x3b, 0xb6, 0xf4, 0x36, 0xdf, 0x28, 0x4e, 0x27, 0x95, 0xbc, 0x32, 0xa6, 0xb3, 0x41,
4358
+	0xf3, 0x4a, 0xd0, 0xb1, 0x09, 0x81, 0x4c, 0xe8, 0x06, 0x5c, 0x1a, 0x9a, 0xa1, 0x72, 0x5c, 0xdb,
4359
+	0x86, 0x4b, 0x71, 0xc4, 0xe6, 0x28, 0xe4, 0x81, 0x27, 0x54, 0x03, 0xc7, 0x57, 0xd1, 0xa8, 0x1c,
4360
+	0x93, 0x55, 0x58, 0x74, 0x7c, 0x1b, 0x1f, 0x49, 0x34, 0x4f, 0xa3, 0x89, 0x58, 0x1d, 0x9b, 0xee,
4361
+	0x08, 0xa5, 0xd1, 0x79, 0x1a, 0x4d, 0x6a, 0xdf, 0xe9, 0x90, 0x8b, 0x43, 0x12, 0x03, 0xd2, 0x27,
4362
+	0x89, 0xe9, 0xd3, 0x49, 0x25, 0xdd, 0xd9, 0x68, 0xa7, 0x68, 0xda, 0xb1, 0xc9, 0x4d, 0xc8, 0x3b,
4363
+	0x76, 0x7f, 0xc8, 0xf0, 0xc0, 0x51, 0x61, 0x1b, 0x4b, 0xd3, 0x49, 0x25, 0xd7, 0xd9, 0xd8, 0x96,
4364
+	0x6b, 0xa2, 0x80, 0x8e, 0x1d, 0x8d, 0xc9, 0x2a, 0x64, 0x7c, 0xd3, 0x53, 0x2f, 0x92, 0x67, 0xd4,
4365
+	0xf4, 0x90, 0xbc, 0x0a, 0x05, 0xf1, 0x1b, 0x07, 0xc9, 0xa8, 0x87, 0x20, 0x16, 0x15, 0x78, 0x0f,
4366
+	0x74, 0x4b, 0x6e, 0x4b, 0x9d, 0x91, 0x5a, 0xb2, 0xd7, 0x67, 0x0b, 0x20, 0x3c, 0x8f, 0x18, 0xd2,
4367
+	0x81, 0x62, 0x34, 0x8a, 0x5f, 0xa1, 0xbf, 0x44, 0x90, 0xa5, 0x08, 0x55, 0x89, 0xd4, 0xcf, 0x39,
4368
+	0x95, 0x4d, 0x70, 0x4a, 0x78, 0x7e, 0xea, 0xd5, 0xeb, 0x90, 0x15, 0xf7, 0x50, 0x88, 0x73, 0x52,
4369
+	0x0c, 0xd3, 0x49, 0x45, 0x17, 0x57, 0x54, 0x2a, 0x75, 0xf1, 0xb0, 0x63, 0x93, 0xbb, 0xca, 0xd2,
4370
+	0xbc, 0x4c, 0xac, 0x7a, 0x51, 0x62, 0xe2, 0xc0, 0x88, 0xd2, 0x09, 0x3d, 0xd9, 0x80, 0xa2, 0x8d,
4371
+	0xa1, 0xc3, 0xd0, 0xee, 0x87, 0xdc, 0xe4, 0x68, 0x40, 0x55, 0xbb, 0x71, 0x29, 0xf9, 0x54, 0x8a,
4372
+	0x5b, 0xd7, 0x13, 0x22, 0xb1, 0x29, 0x45, 0xc9, 0x39, 0x59, 0x83, 0x0c, 0x0b, 0x5c, 0x34, 0x0a,
4373
+	0x12, 0xbe, 0x3e, 0xaf, 0xa9, 0xd0, 0xc0, 0x95, 0x8d, 0x45, 0x68, 0x49, 0x07, 0xc0, 0x43, 0x6f,
4374
+	0x1f, 0x59, 0xf8, 0xd0, 0x19, 0x1a, 0x4b, 0x92, 0x7c, 0x73, 0x1e, 0xd9, 0x1b, 0xa2, 0x55, 0xdf,
4375
+	0x3c, 0x91, 0x0b, 0x73, 0x4f, 0x61, 0xb2, 0x09, 0x57, 0x18, 0x1e, 0x20, 0x43, 0xdf, 0x42, 0xbb,
4376
+	0xaf, 0xfa, 0x88, 0xa8, 0x58, 0x51, 0x56, 0xec, 0xda, 0x74, 0x52, 0x59, 0xa1, 0x27, 0x02, 0xd5,
4377
+	0x72, 0x64, 0xf9, 0x56, 0xd8, 0x73, 0xcb, 0x36, 0xf9, 0x1c, 0x56, 0xcf, 0x84, 0x8b, 0xae, 0xbd,
4378
+	0x88, 0x76, 0x49, 0x46, 0xbb, 0x3a, 0x9d, 0x54, 0xc8, 0x69, 0xb4, 0xa8, 0x3f, 0xc8, 0x60, 0x84,
4379
+	0xcd, 0xae, 0x8a, 0x0b, 0x13, 0x5d, 0xa2, 0xcb, 0xf1, 0x81, 0x15, 0xb3, 0x46, 0x06, 0xd2, 0x8d,
4380
+	0xe3, 0xda, 0x9f, 0x69, 0x58, 0xda, 0x33, 0xb9, 0xf5, 0x90, 0xe2, 0x97, 0x23, 0x0c, 0x39, 0x69,
4381
+	0x41, 0x16, 0x7d, 0xce, 0x1c, 0x0c, 0x0d, 0xad, 0xba, 0x70, 0xa3, 0xb0, 0x76, 0x33, 0xa9, 0x1e,
4382
+	0x67, 0x91, 0x68, 0xd2, 0xf2, 0x39, 0x3b, 0xa6, 0x31, 0x4b, 0xee, 0x41, 0x81, 0x61, 0x38, 0xf2,
4383
+	0xb0, 0x7f, 0xc0, 0x02, 0xef, 0xa2, 0xb6, 0xfd, 0x00, 0x99, 0x68, 0x2c, 0x14, 0x22, 0xfd, 0x67,
4384
+	0x2c, 0xf0, 0xc8, 0x2d, 0x20, 0x8e, 0x6f, 0xb9, 0x23, 0x1b, 0xfb, 0x81, 0x6b, 0xf7, 0xa3, 0x3f,
4385
+	0x20, 0x79, 0xe1, 0x72, 0x74, 0x59, 0x3d, 0xd9, 0x72, 0xed, 0xa8, 0x11, 0x95, 0xbe, 0xd1, 0x00,
4386
+	0x4e, 0x73, 0x48, 0xec, 0x19, 0x1f, 0x83, 0x6e, 0x5a, 0x5c, 0x74, 0xbc, 0xb4, 0x34, 0xf9, 0xb5,
4387
+	0xb9, 0x9b, 0x5a, 0x97, 0xb2, 0xfb, 0x8e, 0x6f, 0x53, 0x85, 0x90, 0xbb, 0x90, 0x3d, 0x70, 0x5c,
4388
+	0x8e, 0x2c, 0x34, 0x16, 0x64, 0x49, 0xae, 0x5f, 0x74, 0xb4, 0x69, 0x2c, 0xae, 0xfd, 0x12, 0xd7,
4389
+	0x76, 0x13, 0xc3, 0xd0, 0x3c, 0x44, 0xf2, 0x29, 0xe8, 0x38, 0x46, 0x9f, 0xc7, 0xa5, 0x7d, 0x63,
4390
+	0x6e, 0x16, 0x8a, 0xa8, 0xb7, 0x84, 0x9c, 0x2a, 0x8a, 0xbc, 0x0f, 0xd9, 0x71, 0x54, 0xad, 0xff,
4391
+	0x52, 0xd0, 0x58, 0x5b, 0xfa, 0x49, 0x83, 0x45, 0x19, 0xe8, 0x4c, 0x19, 0xb4, 0x97, 0x2f, 0xc3,
4392
+	0x1a, 0xe8, 0xca, 0x88, 0xf4, 0xfc, 0xbf, 0xaa, 0xc8, 0x12, 0xaa, 0x94, 0xe4, 0x43, 0x80, 0x19,
4393
+	0x03, 0x2f, 0xe6, 0xf2, 0x41, 0xec, 0xea, 0x5b, 0xff, 0x68, 0x70, 0x79, 0x26, 0x15, 0x72, 0x07,
4394
+	0x56, 0xf7, 0xd6, 0x77, 0x9a, 0xed, 0xfe, 0x7a, 0x73, 0xa7, 0xb3, 0xd5, 0xed, 0xef, 0x76, 0xef,
4395
+	0x77, 0xb7, 0xf6, 0xba, 0xcb, 0xa9, 0x52, 0xe9, 0xf1, 0x93, 0xea, 0xd5, 0x19, 0xf9, 0xae, 0x3f,
4396
+	0xf0, 0x83, 0x23, 0x91, 0xf8, 0xca, 0x39, 0xaa, 0x49, 0x5b, 0xeb, 0x3b, 0xad, 0x65, 0xad, 0xf4,
4397
+	0xbf, 0xc7, 0x4f, 0xaa, 0x57, 0x66, 0xa0, 0x26, 0xc3, 0xa8, 0x9b, 0x9c, 0x67, 0x76, 0xb7, 0x37,
4398
+	0x04, 0x93, 0x4e, 0x64, 0x76, 0x87, 0x76, 0x12, 0x43, 0x5b, 0x9b, 0x5b, 0x0f, 0x5a, 0xcb, 0x99,
4399
+	0x44, 0x86, 0xa2, 0x17, 0x8c, 0xb1, 0x74, 0xed, 0xeb, 0xef, 0xcb, 0xa9, 0x9f, 0x7f, 0x28, 0xcf,
4400
+	0x6e, 0x75, 0xcd, 0x83, 0xc5, 0x9e, 0xf8, 0x4a, 0x23, 0x36, 0x2c, 0xca, 0x67, 0xa4, 0xfa, 0xa2,
4401
+	0x8b, 0x58, 0xaa, 0xbe, 0xe8, 0x3c, 0xd5, 0xae, 0xfc, 0xfa, 0xe3, 0xdf, 0xdf, 0xa6, 0x2f, 0x43,
4402
+	0x51, 0x2a, 0xde, 0xf6, 0x4c, 0xdf, 0x3c, 0x44, 0xf6, 0x8e, 0xd6, 0x30, 0x9e, 0x3e, 0x2b, 0xa7,
4403
+	0xfe, 0x78, 0x56, 0x4e, 0x7d, 0x35, 0x2d, 0x6b, 0x4f, 0xa7, 0x65, 0xed, 0xf7, 0x69, 0x59, 0xfb,
4404
+	0x6b, 0x5a, 0xd6, 0xf6, 0x75, 0xf9, 0xf9, 0xf6, 0xde, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xa9,
4405
+	0xa5, 0x8e, 0xe6, 0x35, 0x0a, 0x00, 0x00,
4406
+}
0 4407
new file mode 100644
... ...
@@ -0,0 +1,152 @@
0
+syntax = "proto3";
1
+
2
+package docker.swarmkit.v1;
3
+
4
+import "specs.proto";
5
+import "objects.proto";
6
+import "types.proto";
7
+import "gogoproto/gogo.proto";
8
+import "plugin/plugin.proto";
9
+
10
+message Object {
11
+	oneof Object {
12
+		Node node = 1;
13
+		Service service = 2;
14
+		Network network = 3;
15
+		Task task = 4;
16
+		Cluster cluster = 5;
17
+		Secret secret = 6;
18
+		Resource resource = 7;
19
+		Extension extension = 8;
20
+	}
21
+}
22
+
23
+// FIXME(aaronl): These messages should ideally be embedded in SelectBy, but
24
+// protoc generates bad code for that.
25
+message SelectBySlot {
26
+	string service_id = 1 [(gogoproto.customname) = "ServiceID"];
27
+	uint64 slot = 2;
28
+}
29
+
30
+message SelectByCustom {
31
+	string kind = 1;
32
+	string index = 2;
33
+	string value = 3;
34
+}
35
+
36
+message SelectBy {
37
+	// TODO(aaronl): Are all of these things we want to expose in
38
+	// the API? Exposing them may commit us to maintaining those
39
+	// internal indices going forward.
40
+	oneof By {
41
+		// supported by all object types
42
+		string id = 1 [(gogoproto.customname) = "ID"]; // not applicable for FindObjects - use GetObject instead
43
+		string id_prefix = 2 [(gogoproto.customname) = "IDPrefix"];
44
+		string name = 3;
45
+		string name_prefix = 4;
46
+		SelectByCustom custom = 5;
47
+		SelectByCustom custom_prefix = 6;
48
+
49
+		// supported by tasks only
50
+		string service_id = 7 [(gogoproto.customname) = "ServiceID"];
51
+		string node_id = 8 [(gogoproto.customname) = "NodeID"];
52
+		SelectBySlot slot = 9;
53
+		TaskState desired_state = 10;
54
+
55
+		// supported by nodes only
56
+		NodeRole role = 11;
57
+		NodeSpec.Membership membership = 12;
58
+
59
+		// supported by: service, task
60
+		string referenced_network_id = 13 [(gogoproto.customname) = "ReferencedNetworkID"];
61
+		string referenced_secret_id = 14 [(gogoproto.customname) = "ReferencedSecretID"];
62
+
63
+		// supported by: resource
64
+		string kind = 15;
65
+	}
66
+}
67
+
68
+
69
+// Store defines the RPC methods for interacting with the data store.
70
+service Store {
71
+	// Watch starts a stream that returns any changes to objects that match
72
+	// the specified selectors. When the stream begins, it immediately sends
73
+	// an empty message back to the client. It is important to wait for
74
+	// this message before taking any actions that depend on an established
75
+	// stream of changes for consistency.
76
+	rpc Watch(WatchRequest) returns (stream WatchMessage) {
77
+		option (docker.protobuf.plugin.tls_authorization) = { roles: "swarm-manager" };
78
+	};
79
+}
80
+
81
+message WatchRequest {
82
+	message WatchEntry {
83
+		// Kind can contain a builtin type such as "node", "secret", etc. or
84
+		// the kind specified by a custom-defined object.
85
+		string kind = 1;
86
+
87
+		// Action (create/update/delete)
88
+		// This is a bitmask, so multiple actions may be OR'd together
89
+		WatchActionKind action = 2;
90
+
91
+		// Filters are combined using AND logic - an event must match
92
+		// all of them to pass the filter.
93
+		repeated SelectBy filters = 3;
94
+	}
95
+
96
+	// Multiple entries are combined using OR logic - i.e. if an event
97
+	// matches all of the selectors specified in any single watch entry,
98
+	// the event will be sent to the client.
99
+	repeated WatchEntry entries = 1;
100
+
101
+	// ResumeFrom provides an version to resume the watch from, if non-nil.
102
+	// The watch will return changes since this version, and continue to
103
+	// return new changes afterwards. Watch will return an error if the
104
+	// server has compacted its log and no longer has complete history to
105
+	// this point.
106
+	Version resume_from = 2;
107
+
108
+	// IncludeOldObject causes WatchMessages to include a copy of the
109
+	// previous version of the object on updates. Note that only live
110
+	// changes will include the old object (not historical changes
111
+	// retrieved using ResumeFrom).
112
+	bool include_old_object = 3;
113
+}
114
+
115
+// WatchMessage is the type of the stream that's returned to the client by
116
+// Watch. Note that the first item of this stream will always be a WatchMessage
117
+// with a nil Object, to signal that the stream has started.
118
+message WatchMessage {
119
+	message Event {
120
+		// Action (create/update/delete)
121
+		// Note that WatchMessage does not expose "commit" events that
122
+		// mark transaction boundaries.
123
+		WatchActionKind action = 1;
124
+
125
+		// Matched object
126
+		Object object = 2;
127
+
128
+		// For updates, OldObject will optionally be included in the
129
+		// watch message, containing the previous version of the
130
+		// object, if IncludeOldObject was set in WatchRequest.
131
+		Object old_object = 3;
132
+	}
133
+
134
+	repeated Event events = 1;
135
+
136
+	// Index versions this change to the data store. It can be used to
137
+	// resume the watch from this point.
138
+	Version version = 2;
139
+}
140
+
141
+// WatchActionKind distinguishes between creations, updates, and removals. It
142
+// is structured as a bitmap so multiple kinds of events can be requested with
143
+// a mask.
144
+enum WatchActionKind {
145
+	option (gogoproto.goproto_enum_prefix) = false;
146
+	option (gogoproto.enum_customname) = "WatchActionKind";
147
+	WATCH_ACTION_UNKNOWN = 0 [(gogoproto.enumvalue_customname) = "WatchActionKindUnknown"]; // default value, invalid
148
+	WATCH_ACTION_CREATE = 1 [(gogoproto.enumvalue_customname) = "WatchActionKindCreate"];
149
+	WATCH_ACTION_UPDATE = 2 [(gogoproto.enumvalue_customname) = "WatchActionKindUpdate"];
150
+	WATCH_ACTION_REMOVE = 4 [(gogoproto.enumvalue_customname) = "WatchActionKindRemove"];
151
+}
... ...
@@ -3,21 +3,27 @@ package api
3 3
 import (
4 4
 	"errors"
5 5
 	"fmt"
6
+	"strings"
6 7
 
7 8
 	"github.com/docker/go-events"
8 9
 )
9 10
 
10
-var errUnknownStoreAction = errors.New("unrecognized action type")
11
+var (
12
+	errUnknownStoreAction = errors.New("unrecognized action type")
13
+	errConflictingFilters = errors.New("conflicting filters specified")
14
+	errNoKindSpecified    = errors.New("no kind of object specified")
15
+	errUnrecognizedAction = errors.New("unrecognized action")
16
+)
11 17
 
12 18
 // StoreObject is an abstract object that can be handled by the store.
13 19
 type StoreObject interface {
14
-	GetID() string                // Get ID
15
-	GetMeta() Meta                // Retrieve metadata
16
-	SetMeta(Meta)                 // Set metadata
17
-	CopyStoreObject() StoreObject // Return a copy of this object
18
-	EventCreate() Event           // Return a creation event
19
-	EventUpdate() Event           // Return an update event
20
-	EventDelete() Event           // Return a deletion event
20
+	GetID() string                           // Get ID
21
+	GetMeta() Meta                           // Retrieve metadata
22
+	SetMeta(Meta)                            // Set metadata
23
+	CopyStoreObject() StoreObject            // Return a copy of this object
24
+	EventCreate() Event                      // Return a creation event
25
+	EventUpdate(oldObject StoreObject) Event // Return an update event
26
+	EventDelete() Event                      // Return a deletion event
21 27
 }
22 28
 
23 29
 // Event is the type used for events passed over watcher channels, and also
... ...
@@ -78,3 +84,25 @@ func prefixFromArgs(args ...interface{}) ([]byte, error) {
78 78
 	}
79 79
 	return val, nil
80 80
 }
81
+
82
+func checkCustom(a1, a2 Annotations) bool {
83
+	if len(a1.Indices) == 1 {
84
+		for _, ind := range a2.Indices {
85
+			if ind.Key == a1.Indices[0].Key && ind.Val == a1.Indices[0].Val {
86
+				return true
87
+			}
88
+		}
89
+	}
90
+	return false
91
+}
92
+
93
+func checkCustomPrefix(a1, a2 Annotations) bool {
94
+	if len(a1.Indices) == 1 {
95
+		for _, ind := range a2.Indices {
96
+			if ind.Key == a1.Indices[0].Key && strings.HasPrefix(ind.Val, a1.Indices[0].Val) {
97
+				return true
98
+			}
99
+		}
100
+	}
101
+	return false
102
+}
... ...
@@ -17,6 +17,7 @@
17 17
 		health.proto
18 18
 		resource.proto
19 19
 		logbroker.proto
20
+		store.proto
20 21
 
21 22
 	It has these top-level messages:
22 23
 		Version
... ...
@@ -189,6 +190,12 @@
189 189
 		SubscriptionMessage
190 190
 		PublishLogsMessage
191 191
 		PublishLogsResponse
192
+		Object
193
+		SelectBySlot
194
+		SelectByCustom
195
+		SelectBy
196
+		WatchRequest
197
+		WatchMessage
192 198
 */
193 199
 package api
194 200
 
... ...
@@ -1345,6 +1352,18 @@ type CAConfig struct {
1345 1345
 	// ExternalCAs is a list of CAs to which a manager node will make
1346 1346
 	// certificate signing requests for node certificates.
1347 1347
 	ExternalCAs []*ExternalCA `protobuf:"bytes,2,rep,name=external_cas,json=externalCas" json:"external_cas,omitempty"`
1348
+	// SigningCACert is the desired CA certificate to be used as the root and
1349
+	// signing CA for the swarm.  If not provided, indicates that we are either happy
1350
+	// with the current configuration, or (together with a bump in the ForceRotate value)
1351
+	// that we want a certificate and key generated for us.
1352
+	SigningCACert []byte `protobuf:"bytes,3,opt,name=signing_ca_cert,json=signingCaCert,proto3" json:"signing_ca_cert,omitempty"`
1353
+	// SigningCAKey is the desired private key, matching the signing CA cert, to be used
1354
+	// to sign certificates for the swarm
1355
+	SigningCAKey []byte `protobuf:"bytes,4,opt,name=signing_ca_key,json=signingCaKey,proto3" json:"signing_ca_key,omitempty"`
1356
+	// ForceRotate is a counter that triggers a root CA rotation even if no relevant
1357
+	// parameters have been in the spec. This will force the manager to generate a new
1358
+	// certificate and key, if none have been provided.
1359
+	ForceRotate uint64 `protobuf:"varint,5,opt,name=force_rotate,json=forceRotate,proto3" json:"force_rotate,omitempty"`
1348 1360
 }
1349 1361
 
1350 1362
 func (m *CAConfig) Reset()                    { *m = CAConfig{} }
... ...
@@ -1558,6 +1577,9 @@ type RootCA struct {
1558 1558
 	// RootRotation contains the new root cert and key we want to rotate to - if this is nil, we are not in the
1559 1559
 	// middle of a root rotation
1560 1560
 	RootRotation *RootRotation `protobuf:"bytes,5,opt,name=root_rotation,json=rootRotation" json:"root_rotation,omitempty"`
1561
+	// LastForcedRotation matches the Cluster Spec's CAConfig's ForceRotation counter.
1562
+	// It indicates when the current CA cert and key were generated (or updated).
1563
+	LastForcedRotation uint64 `protobuf:"varint,6,opt,name=last_forced_rotation,json=lastForcedRotation,proto3" json:"last_forced_rotation,omitempty"`
1561 1564
 }
1562 1565
 
1563 1566
 func (m *RootCA) Reset()                    { *m = RootCA{} }
... ...
@@ -2531,6 +2553,10 @@ func (m *AcceptancePolicy_RoleAdmissionPolicy_Secret) CopyFrom(src interface{})
2531 2531
 
2532 2532
 	o := src.(*AcceptancePolicy_RoleAdmissionPolicy_Secret)
2533 2533
 	*m = *o
2534
+	if o.Data != nil {
2535
+		m.Data = make([]byte, len(o.Data))
2536
+		copy(m.Data, o.Data)
2537
+	}
2534 2538
 }
2535 2539
 
2536 2540
 func (m *ExternalCA) Copy() *ExternalCA {
... ...
@@ -2553,6 +2579,10 @@ func (m *ExternalCA) CopyFrom(src interface{}) {
2553 2553
 		}
2554 2554
 	}
2555 2555
 
2556
+	if o.CACert != nil {
2557
+		m.CACert = make([]byte, len(o.CACert))
2558
+		copy(m.CACert, o.CACert)
2559
+	}
2556 2560
 }
2557 2561
 
2558 2562
 func (m *CAConfig) Copy() *CAConfig {
... ...
@@ -2580,6 +2610,14 @@ func (m *CAConfig) CopyFrom(src interface{}) {
2580 2580
 		}
2581 2581
 	}
2582 2582
 
2583
+	if o.SigningCACert != nil {
2584
+		m.SigningCACert = make([]byte, len(o.SigningCACert))
2585
+		copy(m.SigningCACert, o.SigningCACert)
2586
+	}
2587
+	if o.SigningCAKey != nil {
2588
+		m.SigningCAKey = make([]byte, len(o.SigningCAKey))
2589
+		copy(m.SigningCAKey, o.SigningCAKey)
2590
+	}
2583 2591
 }
2584 2592
 
2585 2593
 func (m *OrchestrationConfig) Copy() *OrchestrationConfig {
... ...
@@ -2762,6 +2800,14 @@ func (m *RootCA) CopyFrom(src interface{}) {
2762 2762
 
2763 2763
 	o := src.(*RootCA)
2764 2764
 	*m = *o
2765
+	if o.CAKey != nil {
2766
+		m.CAKey = make([]byte, len(o.CAKey))
2767
+		copy(m.CAKey, o.CAKey)
2768
+	}
2769
+	if o.CACert != nil {
2770
+		m.CACert = make([]byte, len(o.CACert))
2771
+		copy(m.CACert, o.CACert)
2772
+	}
2765 2773
 	github_com_docker_swarmkit_api_deepcopy.Copy(&m.JoinTokens, &o.JoinTokens)
2766 2774
 	if o.RootRotation != nil {
2767 2775
 		m.RootRotation = &RootRotation{}
... ...
@@ -2782,7 +2828,15 @@ func (m *Certificate) CopyFrom(src interface{}) {
2782 2782
 
2783 2783
 	o := src.(*Certificate)
2784 2784
 	*m = *o
2785
+	if o.CSR != nil {
2786
+		m.CSR = make([]byte, len(o.CSR))
2787
+		copy(m.CSR, o.CSR)
2788
+	}
2785 2789
 	github_com_docker_swarmkit_api_deepcopy.Copy(&m.Status, &o.Status)
2790
+	if o.Certificate != nil {
2791
+		m.Certificate = make([]byte, len(o.Certificate))
2792
+		copy(m.Certificate, o.Certificate)
2793
+	}
2786 2794
 }
2787 2795
 
2788 2796
 func (m *EncryptionKey) Copy() *EncryptionKey {
... ...
@@ -2798,6 +2852,10 @@ func (m *EncryptionKey) CopyFrom(src interface{}) {
2798 2798
 
2799 2799
 	o := src.(*EncryptionKey)
2800 2800
 	*m = *o
2801
+	if o.Key != nil {
2802
+		m.Key = make([]byte, len(o.Key))
2803
+		copy(m.Key, o.Key)
2804
+	}
2801 2805
 }
2802 2806
 
2803 2807
 func (m *ManagerStatus) Copy() *ManagerStatus {
... ...
@@ -2920,6 +2978,14 @@ func (m *MaybeEncryptedRecord) CopyFrom(src interface{}) {
2920 2920
 
2921 2921
 	o := src.(*MaybeEncryptedRecord)
2922 2922
 	*m = *o
2923
+	if o.Data != nil {
2924
+		m.Data = make([]byte, len(o.Data))
2925
+		copy(m.Data, o.Data)
2926
+	}
2927
+	if o.Nonce != nil {
2928
+		m.Nonce = make([]byte, len(o.Nonce))
2929
+		copy(m.Nonce, o.Nonce)
2930
+	}
2923 2931
 }
2924 2932
 
2925 2933
 func (m *RootRotation) Copy() *RootRotation {
... ...
@@ -2935,6 +3001,18 @@ func (m *RootRotation) CopyFrom(src interface{}) {
2935 2935
 
2936 2936
 	o := src.(*RootRotation)
2937 2937
 	*m = *o
2938
+	if o.CACert != nil {
2939
+		m.CACert = make([]byte, len(o.CACert))
2940
+		copy(m.CACert, o.CACert)
2941
+	}
2942
+	if o.CAKey != nil {
2943
+		m.CAKey = make([]byte, len(o.CAKey))
2944
+		copy(m.CAKey, o.CAKey)
2945
+	}
2946
+	if o.CrossSignedCACert != nil {
2947
+		m.CrossSignedCACert = make([]byte, len(o.CrossSignedCACert))
2948
+		copy(m.CrossSignedCACert, o.CrossSignedCACert)
2949
+	}
2938 2950
 }
2939 2951
 
2940 2952
 func (m *Version) Marshal() (dAtA []byte, err error) {
... ...
@@ -4369,6 +4447,23 @@ func (m *CAConfig) MarshalTo(dAtA []byte) (int, error) {
4369 4369
 			i += n
4370 4370
 		}
4371 4371
 	}
4372
+	if len(m.SigningCACert) > 0 {
4373
+		dAtA[i] = 0x1a
4374
+		i++
4375
+		i = encodeVarintTypes(dAtA, i, uint64(len(m.SigningCACert)))
4376
+		i += copy(dAtA[i:], m.SigningCACert)
4377
+	}
4378
+	if len(m.SigningCAKey) > 0 {
4379
+		dAtA[i] = 0x22
4380
+		i++
4381
+		i = encodeVarintTypes(dAtA, i, uint64(len(m.SigningCAKey)))
4382
+		i += copy(dAtA[i:], m.SigningCAKey)
4383
+	}
4384
+	if m.ForceRotate != 0 {
4385
+		dAtA[i] = 0x28
4386
+		i++
4387
+		i = encodeVarintTypes(dAtA, i, uint64(m.ForceRotate))
4388
+	}
4372 4389
 	return i, nil
4373 4390
 }
4374 4391
 
... ...
@@ -4711,6 +4806,11 @@ func (m *RootCA) MarshalTo(dAtA []byte) (int, error) {
4711 4711
 		}
4712 4712
 		i += n29
4713 4713
 	}
4714
+	if m.LastForcedRotation != 0 {
4715
+		dAtA[i] = 0x30
4716
+		i++
4717
+		i = encodeVarintTypes(dAtA, i, uint64(m.LastForcedRotation))
4718
+	}
4714 4719
 	return i, nil
4715 4720
 }
4716 4721
 
... ...
@@ -5755,6 +5855,17 @@ func (m *CAConfig) Size() (n int) {
5755 5755
 			n += 1 + l + sovTypes(uint64(l))
5756 5756
 		}
5757 5757
 	}
5758
+	l = len(m.SigningCACert)
5759
+	if l > 0 {
5760
+		n += 1 + l + sovTypes(uint64(l))
5761
+	}
5762
+	l = len(m.SigningCAKey)
5763
+	if l > 0 {
5764
+		n += 1 + l + sovTypes(uint64(l))
5765
+	}
5766
+	if m.ForceRotate != 0 {
5767
+		n += 1 + sovTypes(uint64(m.ForceRotate))
5768
+	}
5758 5769
 	return n
5759 5770
 }
5760 5771
 
... ...
@@ -5898,6 +6009,9 @@ func (m *RootCA) Size() (n int) {
5898 5898
 		l = m.RootRotation.Size()
5899 5899
 		n += 1 + l + sovTypes(uint64(l))
5900 5900
 	}
5901
+	if m.LastForcedRotation != 0 {
5902
+		n += 1 + sovTypes(uint64(m.LastForcedRotation))
5903
+	}
5901 5904
 	return n
5902 5905
 }
5903 5906
 
... ...
@@ -6576,6 +6690,9 @@ func (this *CAConfig) String() string {
6576 6576
 	s := strings.Join([]string{`&CAConfig{`,
6577 6577
 		`NodeCertExpiry:` + strings.Replace(fmt.Sprintf("%v", this.NodeCertExpiry), "Duration", "google_protobuf1.Duration", 1) + `,`,
6578 6578
 		`ExternalCAs:` + strings.Replace(fmt.Sprintf("%v", this.ExternalCAs), "ExternalCA", "ExternalCA", 1) + `,`,
6579
+		`SigningCACert:` + fmt.Sprintf("%v", this.SigningCACert) + `,`,
6580
+		`SigningCAKey:` + fmt.Sprintf("%v", this.SigningCAKey) + `,`,
6581
+		`ForceRotate:` + fmt.Sprintf("%v", this.ForceRotate) + `,`,
6579 6582
 		`}`,
6580 6583
 	}, "")
6581 6584
 	return s
... ...
@@ -6696,6 +6813,7 @@ func (this *RootCA) String() string {
6696 6696
 		`CACertHash:` + fmt.Sprintf("%v", this.CACertHash) + `,`,
6697 6697
 		`JoinTokens:` + strings.Replace(strings.Replace(this.JoinTokens.String(), "JoinTokens", "JoinTokens", 1), `&`, ``, 1) + `,`,
6698 6698
 		`RootRotation:` + strings.Replace(fmt.Sprintf("%v", this.RootRotation), "RootRotation", "RootRotation", 1) + `,`,
6699
+		`LastForcedRotation:` + fmt.Sprintf("%v", this.LastForcedRotation) + `,`,
6699 6700
 		`}`,
6700 6701
 	}, "")
6701 6702
 	return s
... ...
@@ -11761,6 +11879,87 @@ func (m *CAConfig) Unmarshal(dAtA []byte) error {
11761 11761
 				return err
11762 11762
 			}
11763 11763
 			iNdEx = postIndex
11764
+		case 3:
11765
+			if wireType != 2 {
11766
+				return fmt.Errorf("proto: wrong wireType = %d for field SigningCACert", wireType)
11767
+			}
11768
+			var byteLen int
11769
+			for shift := uint(0); ; shift += 7 {
11770
+				if shift >= 64 {
11771
+					return ErrIntOverflowTypes
11772
+				}
11773
+				if iNdEx >= l {
11774
+					return io.ErrUnexpectedEOF
11775
+				}
11776
+				b := dAtA[iNdEx]
11777
+				iNdEx++
11778
+				byteLen |= (int(b) & 0x7F) << shift
11779
+				if b < 0x80 {
11780
+					break
11781
+				}
11782
+			}
11783
+			if byteLen < 0 {
11784
+				return ErrInvalidLengthTypes
11785
+			}
11786
+			postIndex := iNdEx + byteLen
11787
+			if postIndex > l {
11788
+				return io.ErrUnexpectedEOF
11789
+			}
11790
+			m.SigningCACert = append(m.SigningCACert[:0], dAtA[iNdEx:postIndex]...)
11791
+			if m.SigningCACert == nil {
11792
+				m.SigningCACert = []byte{}
11793
+			}
11794
+			iNdEx = postIndex
11795
+		case 4:
11796
+			if wireType != 2 {
11797
+				return fmt.Errorf("proto: wrong wireType = %d for field SigningCAKey", wireType)
11798
+			}
11799
+			var byteLen int
11800
+			for shift := uint(0); ; shift += 7 {
11801
+				if shift >= 64 {
11802
+					return ErrIntOverflowTypes
11803
+				}
11804
+				if iNdEx >= l {
11805
+					return io.ErrUnexpectedEOF
11806
+				}
11807
+				b := dAtA[iNdEx]
11808
+				iNdEx++
11809
+				byteLen |= (int(b) & 0x7F) << shift
11810
+				if b < 0x80 {
11811
+					break
11812
+				}
11813
+			}
11814
+			if byteLen < 0 {
11815
+				return ErrInvalidLengthTypes
11816
+			}
11817
+			postIndex := iNdEx + byteLen
11818
+			if postIndex > l {
11819
+				return io.ErrUnexpectedEOF
11820
+			}
11821
+			m.SigningCAKey = append(m.SigningCAKey[:0], dAtA[iNdEx:postIndex]...)
11822
+			if m.SigningCAKey == nil {
11823
+				m.SigningCAKey = []byte{}
11824
+			}
11825
+			iNdEx = postIndex
11826
+		case 5:
11827
+			if wireType != 0 {
11828
+				return fmt.Errorf("proto: wrong wireType = %d for field ForceRotate", wireType)
11829
+			}
11830
+			m.ForceRotate = 0
11831
+			for shift := uint(0); ; shift += 7 {
11832
+				if shift >= 64 {
11833
+					return ErrIntOverflowTypes
11834
+				}
11835
+				if iNdEx >= l {
11836
+					return io.ErrUnexpectedEOF
11837
+				}
11838
+				b := dAtA[iNdEx]
11839
+				iNdEx++
11840
+				m.ForceRotate |= (uint64(b) & 0x7F) << shift
11841
+				if b < 0x80 {
11842
+					break
11843
+				}
11844
+			}
11764 11845
 		default:
11765 11846
 			iNdEx = preIndex
11766 11847
 			skippy, err := skipTypes(dAtA[iNdEx:])
... ...
@@ -12794,6 +12993,25 @@ func (m *RootCA) Unmarshal(dAtA []byte) error {
12794 12794
 				return err
12795 12795
 			}
12796 12796
 			iNdEx = postIndex
12797
+		case 6:
12798
+			if wireType != 0 {
12799
+				return fmt.Errorf("proto: wrong wireType = %d for field LastForcedRotation", wireType)
12800
+			}
12801
+			m.LastForcedRotation = 0
12802
+			for shift := uint(0); ; shift += 7 {
12803
+				if shift >= 64 {
12804
+					return ErrIntOverflowTypes
12805
+				}
12806
+				if iNdEx >= l {
12807
+					return io.ErrUnexpectedEOF
12808
+				}
12809
+				b := dAtA[iNdEx]
12810
+				iNdEx++
12811
+				m.LastForcedRotation |= (uint64(b) & 0x7F) << shift
12812
+				if b < 0x80 {
12813
+					break
12814
+				}
12815
+			}
12797 12816
 		default:
12798 12817
 			iNdEx = preIndex
12799 12818
 			skippy, err := skipTypes(dAtA[iNdEx:])
... ...
@@ -14248,271 +14466,276 @@ var (
14248 14248
 func init() { proto.RegisterFile("types.proto", fileDescriptorTypes) }
14249 14249
 
14250 14250
 var fileDescriptorTypes = []byte{
14251
-	// 4248 bytes of a gzipped FileDescriptorProto
14252
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xac, 0x5a, 0x4d, 0x6c, 0x24, 0x49,
14253
-	0x56, 0x76, 0xfd, 0xba, 0xea, 0x55, 0xd9, 0x9d, 0x1d, 0xdd, 0xdb, 0xeb, 0xae, 0xed, 0xb1, 0x6b,
14254
-	0x72, 0xa6, 0x77, 0x7e, 0x76, 0x54, 0xd3, 0xed, 0xde, 0x59, 0xf5, 0xcc, 0xb0, 0x33, 0x93, 0xf5,
14255
-	0xe3, 0x76, 0x6d, 0xdb, 0x55, 0xa5, 0xa8, 0x72, 0xf7, 0xce, 0x01, 0x52, 0xe1, 0xcc, 0x70, 0x39,
14256
-	0xc7, 0x59, 0x19, 0x45, 0x66, 0x96, 0xdd, 0x05, 0x42, 0xb4, 0x38, 0x00, 0xf2, 0x05, 0x8e, 0x48,
14257
-	0xc8, 0xa7, 0xe5, 0xc4, 0x81, 0x0b, 0x07, 0x24, 0x2e, 0xcc, 0x81, 0xc3, 0xdc, 0x58, 0x40, 0x42,
14258
-	0x2b, 0x90, 0x1a, 0xc6, 0x48, 0xdc, 0x10, 0x5c, 0x56, 0x5c, 0x40, 0x42, 0xf1, 0x93, 0x59, 0x69,
14259
-	0x77, 0xd9, 0xee, 0x61, 0xb8, 0xd8, 0x19, 0x2f, 0xbe, 0xf7, 0xe2, 0x45, 0xc4, 0x8b, 0x88, 0xef,
14260
-	0x45, 0x14, 0x94, 0xc2, 0xe9, 0x98, 0x06, 0xb5, 0xb1, 0xcf, 0x42, 0x86, 0x90, 0xcd, 0xac, 0x03,
14261
-	0xea, 0xd7, 0x82, 0x23, 0xe2, 0x8f, 0x0e, 0x9c, 0xb0, 0x76, 0x78, 0xbf, 0xb2, 0x36, 0x64, 0x6c,
14262
-	0xe8, 0xd2, 0xf7, 0x05, 0x62, 0x77, 0xb2, 0xf7, 0x7e, 0xe8, 0x8c, 0x68, 0x10, 0x92, 0xd1, 0x58,
14263
-	0x2a, 0x55, 0x56, 0xcf, 0x03, 0xec, 0x89, 0x4f, 0x42, 0x87, 0x79, 0xaa, 0xfe, 0xe6, 0x90, 0x0d,
14264
-	0x99, 0xf8, 0x7c, 0x9f, 0x7f, 0x49, 0xa9, 0xbe, 0x06, 0x8b, 0x4f, 0xa8, 0x1f, 0x38, 0xcc, 0x43,
14265
-	0x37, 0x21, 0xe7, 0x78, 0x36, 0x7d, 0xb6, 0x92, 0xaa, 0xa6, 0xde, 0xce, 0x62, 0x59, 0xd0, 0xef,
14266
-	0x01, 0xb4, 0xf9, 0x47, 0xcb, 0x0b, 0xfd, 0x29, 0xd2, 0x20, 0x73, 0x40, 0xa7, 0x02, 0x51, 0xc4,
14267
-	0xfc, 0x93, 0x4b, 0x0e, 0x89, 0xbb, 0x92, 0x96, 0x92, 0x43, 0xe2, 0xea, 0x5f, 0xa7, 0xa0, 0x64,
14268
-	0x78, 0x1e, 0x0b, 0x45, 0xeb, 0x01, 0x42, 0x90, 0xf5, 0xc8, 0x88, 0x2a, 0x25, 0xf1, 0x8d, 0x1a,
14269
-	0x90, 0x77, 0xc9, 0x2e, 0x75, 0x83, 0x95, 0x74, 0x35, 0xf3, 0x76, 0x69, 0xfd, 0x07, 0xb5, 0x97,
14270
-	0xbb, 0x5c, 0x4b, 0x18, 0xa9, 0x6d, 0x09, 0xb4, 0x70, 0x02, 0x2b, 0x55, 0xf4, 0x09, 0x2c, 0x3a,
14271
-	0x9e, 0xed, 0x58, 0x34, 0x58, 0xc9, 0x0a, 0x2b, 0xab, 0xf3, 0xac, 0xcc, 0xbc, 0xaf, 0x67, 0xbf,
14272
-	0x7a, 0xb1, 0xb6, 0x80, 0x23, 0xa5, 0xca, 0x87, 0x50, 0x4a, 0x98, 0x9d, 0xd3, 0xb7, 0x9b, 0x90,
14273
-	0x3b, 0x24, 0xee, 0x84, 0xaa, 0xde, 0xc9, 0xc2, 0x47, 0xe9, 0x87, 0x29, 0xfd, 0x73, 0x28, 0x62,
14274
-	0x1a, 0xb0, 0x89, 0x6f, 0xd1, 0x00, 0xbd, 0x03, 0x45, 0x8f, 0x78, 0xcc, 0xb4, 0xc6, 0x93, 0x40,
14275
-	0xa8, 0x67, 0xea, 0xe5, 0xd3, 0x17, 0x6b, 0x85, 0x0e, 0xf1, 0x58, 0xa3, 0xb7, 0x13, 0xe0, 0x02,
14276
-	0xaf, 0x6e, 0x8c, 0x27, 0x01, 0x7a, 0x1d, 0xca, 0x23, 0x3a, 0x62, 0xfe, 0xd4, 0xdc, 0x9d, 0x86,
14277
-	0x34, 0x10, 0x86, 0x33, 0xb8, 0x24, 0x65, 0x75, 0x2e, 0xd2, 0xff, 0x30, 0x05, 0x37, 0x23, 0xdb,
14278
-	0x98, 0xfe, 0xfa, 0xc4, 0xf1, 0xe9, 0x88, 0x7a, 0x61, 0x80, 0x3e, 0x80, 0xbc, 0xeb, 0x8c, 0x9c,
14279
-	0x50, 0xb6, 0x51, 0x5a, 0x7f, 0x6d, 0x5e, 0x6f, 0x63, 0xaf, 0xb0, 0x02, 0x23, 0x03, 0xca, 0x3e,
14280
-	0x0d, 0xa8, 0x7f, 0x28, 0x47, 0x52, 0x34, 0x79, 0xa5, 0xf2, 0x19, 0x15, 0x7d, 0x03, 0x0a, 0x3d,
14281
-	0x97, 0x84, 0x7b, 0xcc, 0x1f, 0x21, 0x1d, 0xca, 0xc4, 0xb7, 0xf6, 0x9d, 0x90, 0x5a, 0xe1, 0xc4,
14282
-	0x8f, 0x66, 0xf5, 0x8c, 0x0c, 0xdd, 0x82, 0x34, 0x93, 0x0d, 0x15, 0xeb, 0xf9, 0xd3, 0x17, 0x6b,
14283
-	0xe9, 0x6e, 0x1f, 0xa7, 0x59, 0xa0, 0x7f, 0x0c, 0xd7, 0x7b, 0xee, 0x64, 0xe8, 0x78, 0x4d, 0x1a,
14284
-	0x58, 0xbe, 0x33, 0xe6, 0xd6, 0x79, 0x78, 0xf0, 0xd8, 0x8f, 0xc2, 0x83, 0x7f, 0xc7, 0x21, 0x93,
14285
-	0x9e, 0x85, 0x8c, 0xfe, 0x7b, 0x69, 0xb8, 0xde, 0xf2, 0x86, 0x8e, 0x47, 0x93, 0xda, 0x77, 0x61,
14286
-	0x99, 0x0a, 0xa1, 0x79, 0x28, 0xc3, 0x58, 0xd9, 0x59, 0x92, 0xd2, 0x28, 0xb6, 0xdb, 0xe7, 0xe2,
14287
-	0xed, 0xfe, 0xbc, 0xee, 0xbf, 0x64, 0x7d, 0x6e, 0xd4, 0xb5, 0x60, 0x71, 0x2c, 0x3a, 0x11, 0xac,
14288
-	0x64, 0x84, 0xad, 0xbb, 0xf3, 0x6c, 0xbd, 0xd4, 0xcf, 0x28, 0xf8, 0x94, 0xee, 0xb7, 0x09, 0xbe,
14289
-	0x7f, 0x4d, 0xc1, 0xb5, 0x0e, 0xb3, 0xcf, 0x8c, 0x43, 0x05, 0x0a, 0xfb, 0x2c, 0x08, 0x13, 0x0b,
14290
-	0x2d, 0x2e, 0xa3, 0x87, 0x50, 0x18, 0xab, 0xe9, 0x53, 0xb3, 0x7f, 0x67, 0xbe, 0xcb, 0x12, 0x83,
14291
-	0x63, 0x34, 0xfa, 0x18, 0x8a, 0x7e, 0x14, 0x13, 0x2b, 0x99, 0x57, 0x09, 0x9c, 0x19, 0x1e, 0xfd,
14292
-	0x18, 0xf2, 0x72, 0x12, 0x56, 0xb2, 0x42, 0xf3, 0xee, 0x2b, 0x8d, 0x39, 0x56, 0x4a, 0xfa, 0x2f,
14293
-	0x52, 0xa0, 0x61, 0xb2, 0x17, 0x6e, 0xd3, 0xd1, 0x2e, 0xf5, 0xfb, 0x21, 0x09, 0x27, 0x01, 0xba,
14294
-	0x05, 0x79, 0x97, 0x12, 0x9b, 0xfa, 0xa2, 0x93, 0x05, 0xac, 0x4a, 0x68, 0x87, 0x07, 0x39, 0xb1,
14295
-	0xf6, 0xc9, 0xae, 0xe3, 0x3a, 0xe1, 0x54, 0x74, 0x73, 0x79, 0xfe, 0x2c, 0x9f, 0xb7, 0x59, 0xc3,
14296
-	0x09, 0x45, 0x7c, 0xc6, 0x0c, 0x5a, 0x81, 0xc5, 0x11, 0x0d, 0x02, 0x32, 0xa4, 0xa2, 0xf7, 0x45,
14297
-	0x1c, 0x15, 0xf5, 0x8f, 0xa1, 0x9c, 0xd4, 0x43, 0x25, 0x58, 0xdc, 0xe9, 0x3c, 0xee, 0x74, 0x9f,
14298
-	0x76, 0xb4, 0x05, 0x74, 0x0d, 0x4a, 0x3b, 0x1d, 0xdc, 0x32, 0x1a, 0x9b, 0x46, 0x7d, 0xab, 0xa5,
14299
-	0xa5, 0xd0, 0x12, 0x14, 0x67, 0xc5, 0xb4, 0xfe, 0xe7, 0x29, 0x00, 0x3e, 0x81, 0xaa, 0x53, 0x1f,
14300
-	0x41, 0x2e, 0x08, 0x49, 0x28, 0x27, 0x6e, 0x79, 0xfd, 0xcd, 0x79, 0x5e, 0xcf, 0xe0, 0x35, 0xfe,
14301
-	0x8f, 0x62, 0xa9, 0x92, 0xf4, 0x30, 0x7d, 0xc6, 0x43, 0xbe, 0x86, 0x88, 0x6d, 0xfb, 0xca, 0x71,
14302
-	0xf1, 0xad, 0x7f, 0x0c, 0x39, 0xa1, 0x7d, 0xd6, 0xdd, 0x02, 0x64, 0x9b, 0xfc, 0x2b, 0x85, 0x8a,
14303
-	0x90, 0xc3, 0x2d, 0xa3, 0xf9, 0xb9, 0x96, 0x46, 0x1a, 0x94, 0x9b, 0xed, 0x7e, 0xa3, 0xdb, 0xe9,
14304
-	0xb4, 0x1a, 0x83, 0x56, 0x53, 0xcb, 0xe8, 0x77, 0x21, 0xd7, 0x1e, 0x71, 0xcb, 0x77, 0x78, 0x54,
14305
-	0xec, 0x51, 0x9f, 0x7a, 0x56, 0x14, 0x6c, 0x33, 0x81, 0xfe, 0xf3, 0x22, 0xe4, 0xb6, 0xd9, 0xc4,
14306
-	0x0b, 0xd1, 0x7a, 0x62, 0x65, 0x2f, 0xcf, 0xdf, 0x9c, 0x05, 0xb0, 0x36, 0x98, 0x8e, 0xa9, 0x5a,
14307
-	0xf9, 0xb7, 0x20, 0x2f, 0xe3, 0x47, 0x75, 0x47, 0x95, 0xb8, 0x3c, 0x24, 0xfe, 0x90, 0x86, 0xaa,
14308
-	0x3f, 0xaa, 0x84, 0xde, 0x86, 0x82, 0x4f, 0x89, 0xcd, 0x3c, 0x77, 0x2a, 0xc2, 0xac, 0x20, 0xb7,
14309
-	0x5e, 0x4c, 0x89, 0xdd, 0xf5, 0xdc, 0x29, 0x8e, 0x6b, 0xd1, 0x26, 0x94, 0x77, 0x1d, 0xcf, 0x36,
14310
-	0xd9, 0x58, 0xee, 0x83, 0xb9, 0x8b, 0x83, 0x52, 0x7a, 0x55, 0x77, 0x3c, 0xbb, 0x2b, 0xc1, 0xb8,
14311
-	0xb4, 0x3b, 0x2b, 0xa0, 0x0e, 0x2c, 0x1f, 0x32, 0x77, 0x32, 0xa2, 0xb1, 0xad, 0xbc, 0xb0, 0xf5,
14312
-	0xd6, 0xc5, 0xb6, 0x9e, 0x08, 0x7c, 0x64, 0x6d, 0xe9, 0x30, 0x59, 0x44, 0x8f, 0x61, 0x29, 0x1c,
14313
-	0x8d, 0xf7, 0x82, 0xd8, 0xdc, 0xa2, 0x30, 0xf7, 0xfd, 0x4b, 0x06, 0x8c, 0xc3, 0x23, 0x6b, 0xe5,
14314
-	0x30, 0x51, 0xaa, 0xfc, 0x4e, 0x06, 0x4a, 0x09, 0xcf, 0x51, 0x1f, 0x4a, 0x63, 0x9f, 0x8d, 0xc9,
14315
-	0x50, 0xec, 0xe5, 0x6a, 0x2e, 0xee, 0xbf, 0x52, 0xaf, 0x6b, 0xbd, 0x99, 0x22, 0x4e, 0x5a, 0xd1,
14316
-	0x4f, 0xd2, 0x50, 0x4a, 0x54, 0xa2, 0x77, 0xa1, 0x80, 0x7b, 0xb8, 0xfd, 0xc4, 0x18, 0xb4, 0xb4,
14317
-	0x85, 0xca, 0x9d, 0xe3, 0x93, 0xea, 0x8a, 0xb0, 0x96, 0x34, 0xd0, 0xf3, 0x9d, 0x43, 0x1e, 0x7a,
14318
-	0x6f, 0xc3, 0x62, 0x04, 0x4d, 0x55, 0xbe, 0x77, 0x7c, 0x52, 0xfd, 0xee, 0x79, 0x68, 0x02, 0x89,
14319
-	0xfb, 0x9b, 0x06, 0x6e, 0x35, 0xb5, 0xf4, 0x7c, 0x24, 0xee, 0xef, 0x13, 0x9f, 0xda, 0xe8, 0xfb,
14320
-	0x90, 0x57, 0xc0, 0x4c, 0xa5, 0x72, 0x7c, 0x52, 0xbd, 0x75, 0x1e, 0x38, 0xc3, 0xe1, 0xfe, 0x96,
14321
-	0xf1, 0xa4, 0xa5, 0x65, 0xe7, 0xe3, 0x70, 0xdf, 0x25, 0x87, 0x14, 0xbd, 0x09, 0x39, 0x09, 0xcb,
14322
-	0x55, 0x6e, 0x1f, 0x9f, 0x54, 0xbf, 0xf3, 0x92, 0x39, 0x8e, 0xaa, 0xac, 0xfc, 0xfe, 0xcf, 0x56,
14323
-	0x17, 0xfe, 0xf2, 0x4f, 0x56, 0xb5, 0xf3, 0xd5, 0x95, 0xff, 0x4e, 0xc1, 0xd2, 0x99, 0x29, 0x47,
14324
-	0x3a, 0xe4, 0x3d, 0x66, 0xb1, 0xb1, 0xdc, 0xe2, 0x0b, 0x75, 0x38, 0x7d, 0xb1, 0x96, 0xef, 0xb0,
14325
-	0x06, 0x1b, 0x4f, 0xb1, 0xaa, 0x41, 0x8f, 0xcf, 0x1d, 0x52, 0x0f, 0x5e, 0x31, 0x9e, 0xe6, 0x1e,
14326
-	0x53, 0x9f, 0xc2, 0x92, 0xed, 0x3b, 0x87, 0xd4, 0x37, 0x2d, 0xe6, 0xed, 0x39, 0x43, 0xb5, 0x7d,
14327
-	0x57, 0xe6, 0xd9, 0x6c, 0x0a, 0x20, 0x2e, 0x4b, 0x85, 0x86, 0xc0, 0x7f, 0x8b, 0x03, 0xaa, 0xf2,
14328
-	0x04, 0xca, 0xc9, 0x08, 0x45, 0xaf, 0x01, 0x04, 0xce, 0x6f, 0x50, 0xc5, 0x79, 0x04, 0x43, 0xc2,
14329
-	0x45, 0x2e, 0x11, 0x8c, 0x07, 0xbd, 0x05, 0xd9, 0x11, 0xb3, 0xa5, 0x9d, 0xa5, 0xfa, 0x0d, 0x7e,
14330
-	0x4e, 0xfe, 0xe3, 0x8b, 0xb5, 0x12, 0x0b, 0x6a, 0x1b, 0x8e, 0x4b, 0xb7, 0x99, 0x4d, 0xb1, 0x00,
14331
-	0xe8, 0x87, 0x90, 0xe5, 0x5b, 0x05, 0xfa, 0x1e, 0x64, 0xeb, 0xed, 0x4e, 0x53, 0x5b, 0xa8, 0x5c,
14332
-	0x3f, 0x3e, 0xa9, 0x2e, 0x89, 0x21, 0xe1, 0x15, 0x3c, 0x76, 0xd1, 0x1a, 0xe4, 0x9f, 0x74, 0xb7,
14333
-	0x76, 0xb6, 0x79, 0x78, 0xdd, 0x38, 0x3e, 0xa9, 0x5e, 0x8b, 0xab, 0xe5, 0xa0, 0xa1, 0xd7, 0x20,
14334
-	0x37, 0xd8, 0xee, 0x6d, 0xf4, 0xb5, 0x74, 0x05, 0x1d, 0x9f, 0x54, 0x97, 0xe3, 0x7a, 0xe1, 0x73,
14335
-	0xe5, 0xba, 0x9a, 0xd5, 0x62, 0x2c, 0xd7, 0x7f, 0x99, 0x86, 0x25, 0xcc, 0xc9, 0xb6, 0x1f, 0xf6,
14336
-	0x98, 0xeb, 0x58, 0x53, 0xd4, 0x83, 0xa2, 0xc5, 0x3c, 0xdb, 0x49, 0xac, 0xa9, 0xf5, 0x0b, 0x0e,
14337
-	0xc6, 0x99, 0x56, 0x54, 0x6a, 0x44, 0x9a, 0x78, 0x66, 0x04, 0xbd, 0x0f, 0x39, 0x9b, 0xba, 0x64,
14338
-	0xaa, 0x4e, 0xe8, 0xdb, 0x35, 0x49, 0xe7, 0x6b, 0x11, 0x9d, 0xaf, 0x35, 0x15, 0x9d, 0xc7, 0x12,
14339
-	0x27, 0xa8, 0x24, 0x79, 0x66, 0x92, 0x30, 0xa4, 0xa3, 0x71, 0x28, 0x8f, 0xe7, 0x2c, 0x2e, 0x8d,
14340
-	0xc8, 0x33, 0x43, 0x89, 0xd0, 0x7d, 0xc8, 0x1f, 0x39, 0x9e, 0xcd, 0x8e, 0xd4, 0x09, 0x7c, 0x89,
14341
-	0x51, 0x05, 0xd4, 0x8f, 0xf9, 0xa9, 0x7b, 0xce, 0x4d, 0x3e, 0xde, 0x9d, 0x6e, 0xa7, 0x15, 0x8d,
14342
-	0xb7, 0xaa, 0xef, 0x7a, 0x1d, 0xe6, 0xf1, 0xb5, 0x02, 0xdd, 0x8e, 0xb9, 0x61, 0xb4, 0xb7, 0x76,
14343
-	0x30, 0x1f, 0xf3, 0x9b, 0xc7, 0x27, 0x55, 0x2d, 0x86, 0x6c, 0x10, 0xc7, 0xe5, 0x94, 0xf0, 0x36,
14344
-	0x64, 0x8c, 0xce, 0xe7, 0x5a, 0xba, 0xa2, 0x1d, 0x9f, 0x54, 0xcb, 0x71, 0xb5, 0xe1, 0x4d, 0x67,
14345
-	0xcb, 0xe8, 0x7c, 0xbb, 0xfa, 0xdf, 0x64, 0xa0, 0xbc, 0x33, 0xb6, 0x49, 0x48, 0x65, 0x4c, 0xa2,
14346
-	0x2a, 0x94, 0xc6, 0xc4, 0x27, 0xae, 0x4b, 0x5d, 0x27, 0x18, 0xa9, 0x44, 0x25, 0x29, 0x42, 0x1f,
14347
-	0xbe, 0xea, 0x30, 0xd6, 0x0b, 0x3c, 0xce, 0xfe, 0xe8, 0x9f, 0xd7, 0x52, 0xd1, 0x80, 0xee, 0xc0,
14348
-	0xf2, 0x9e, 0xf4, 0xd6, 0x24, 0x96, 0x98, 0xd8, 0x8c, 0x98, 0xd8, 0xda, 0xbc, 0x89, 0x4d, 0xba,
14349
-	0x55, 0x53, 0x9d, 0x34, 0x84, 0x16, 0x5e, 0xda, 0x4b, 0x16, 0xd1, 0x03, 0x58, 0x1c, 0x31, 0xcf,
14350
-	0x09, 0x99, 0x7f, 0xf5, 0x2c, 0x44, 0x48, 0xf4, 0x2e, 0x5c, 0xe7, 0x93, 0x1b, 0xf9, 0x23, 0xaa,
14351
-	0xc5, 0x89, 0x95, 0xc6, 0xd7, 0x46, 0xe4, 0x99, 0x6a, 0x10, 0x73, 0x31, 0xaa, 0x43, 0x8e, 0xf9,
14352
-	0x9c, 0x12, 0xe5, 0x85, 0xbb, 0xef, 0x5d, 0xe9, 0xae, 0x2c, 0x74, 0xb9, 0x0e, 0x96, 0xaa, 0xfa,
14353
-	0x8f, 0x60, 0xe9, 0x4c, 0x27, 0x38, 0x13, 0xe8, 0x19, 0x3b, 0xfd, 0x96, 0xb6, 0x80, 0xca, 0x50,
14354
-	0x68, 0x74, 0x3b, 0x83, 0x76, 0x67, 0x87, 0x53, 0x99, 0x32, 0x14, 0x70, 0x77, 0x6b, 0xab, 0x6e,
14355
-	0x34, 0x1e, 0x6b, 0x69, 0xbd, 0x06, 0xa5, 0x84, 0x35, 0xb4, 0x0c, 0xd0, 0x1f, 0x74, 0x7b, 0xe6,
14356
-	0x46, 0x1b, 0xf7, 0x07, 0x92, 0x08, 0xf5, 0x07, 0x06, 0x1e, 0x28, 0x41, 0x4a, 0xff, 0x8f, 0x74,
14357
-	0x34, 0xa3, 0x8a, 0xfb, 0xd4, 0xcf, 0x72, 0x9f, 0x4b, 0x9c, 0x57, 0xec, 0x67, 0x56, 0x88, 0x39,
14358
-	0xd0, 0x87, 0x00, 0x22, 0x70, 0xa8, 0x6d, 0x92, 0x50, 0x4d, 0x7c, 0xe5, 0xa5, 0x41, 0x1e, 0x44,
14359
-	0xf9, 0x32, 0x2e, 0x2a, 0xb4, 0x11, 0xa2, 0x1f, 0x43, 0xd9, 0x62, 0xa3, 0xb1, 0x4b, 0x95, 0x72,
14360
-	0xe6, 0x4a, 0xe5, 0x52, 0x8c, 0x37, 0xc2, 0x24, 0xfb, 0xca, 0x9e, 0xe5, 0x87, 0xbf, 0x9b, 0x8a,
14361
-	0x46, 0x66, 0x0e, 0xe1, 0x2a, 0x43, 0x61, 0xa7, 0xd7, 0x34, 0x06, 0xed, 0xce, 0x23, 0x2d, 0x85,
14362
-	0x00, 0xf2, 0x62, 0xa8, 0x9b, 0x5a, 0x9a, 0x13, 0xc5, 0x46, 0x77, 0xbb, 0xb7, 0xd5, 0x12, 0x94,
14363
-	0x0b, 0xdd, 0x04, 0x2d, 0x1a, 0x6c, 0x53, 0x0c, 0x64, 0xab, 0xa9, 0x65, 0xd1, 0x0d, 0xb8, 0x16,
14364
-	0x4b, 0x95, 0x66, 0x0e, 0xdd, 0x02, 0x14, 0x0b, 0x67, 0x26, 0xf2, 0xfa, 0x6f, 0xc1, 0xb5, 0x06,
14365
-	0xf3, 0x42, 0xe2, 0x78, 0x31, 0x89, 0x5e, 0xe7, 0x9d, 0x56, 0x22, 0xd3, 0xb1, 0xe5, 0x9e, 0x5e,
14366
-	0xbf, 0x76, 0xfa, 0x62, 0xad, 0x14, 0x43, 0xdb, 0x4d, 0xde, 0xd3, 0xa8, 0x60, 0xf3, 0xf5, 0x3b,
14367
-	0x76, 0x6c, 0x31, 0xb8, 0xb9, 0xfa, 0xe2, 0xe9, 0x8b, 0xb5, 0x4c, 0xaf, 0xdd, 0xc4, 0x5c, 0x86,
14368
-	0xbe, 0x07, 0x45, 0xfa, 0xcc, 0x09, 0x4d, 0x8b, 0xef, 0xe1, 0x7c, 0x00, 0x73, 0xb8, 0xc0, 0x05,
14369
-	0x0d, 0xbe, 0x65, 0xd7, 0x01, 0x7a, 0xcc, 0x0f, 0x55, 0xcb, 0x3f, 0x84, 0xdc, 0x98, 0xf9, 0x22,
14370
-	0x83, 0xbd, 0x30, 0x5f, 0xe7, 0x70, 0x19, 0xa8, 0x58, 0x82, 0xf5, 0xbf, 0x4a, 0x03, 0x0c, 0x48,
14371
-	0x70, 0xa0, 0x8c, 0x3c, 0x84, 0x62, 0x7c, 0xf7, 0xa1, 0x52, 0xe1, 0x4b, 0x67, 0x3b, 0x06, 0xa3,
14372
-	0x07, 0x51, 0xb0, 0xc9, 0xf4, 0x60, 0x6e, 0x2a, 0x13, 0x35, 0x34, 0x8f, 0x61, 0x9f, 0xcd, 0x01,
14373
-	0xf8, 0x91, 0x48, 0x7d, 0x5f, 0xcd, 0x3c, 0xff, 0x44, 0x0d, 0x71, 0x2c, 0xc8, 0x41, 0x53, 0x04,
14374
-	0xf3, 0x8d, 0x79, 0x8d, 0x9c, 0x9b, 0x91, 0xcd, 0x05, 0x3c, 0xd3, 0x43, 0x9f, 0x42, 0x89, 0xf7,
14375
-	0xdb, 0x0c, 0x44, 0x9d, 0xe2, 0x96, 0x17, 0x0e, 0x95, 0xb4, 0x80, 0x61, 0x1c, 0x7f, 0xd7, 0x35,
14376
-	0x58, 0xf6, 0x27, 0x1e, 0xef, 0xb6, 0xb2, 0xa1, 0x3b, 0xf0, 0xdd, 0x0e, 0x0d, 0x8f, 0x98, 0x7f,
14377
-	0x60, 0x84, 0x21, 0xb1, 0xf6, 0x47, 0xd4, 0x53, 0x63, 0x9c, 0x20, 0xd6, 0xa9, 0x33, 0xc4, 0x7a,
14378
-	0x05, 0x16, 0x89, 0xeb, 0x90, 0x80, 0x4a, 0x36, 0x52, 0xc4, 0x51, 0x91, 0xd3, 0x7f, 0x9e, 0x4c,
14379
-	0xd0, 0x20, 0xa0, 0x32, 0x05, 0x2e, 0xe2, 0x99, 0x40, 0xff, 0xfb, 0x34, 0x40, 0xbb, 0x67, 0x6c,
14380
-	0x2b, 0xf3, 0x4d, 0xc8, 0xef, 0x91, 0x91, 0xe3, 0x4e, 0x2f, 0x5b, 0xe0, 0x33, 0x7c, 0xcd, 0x90,
14381
-	0x86, 0x36, 0x84, 0x0e, 0x56, 0xba, 0x22, 0x2b, 0x98, 0xec, 0x7a, 0x34, 0x8c, 0xb3, 0x02, 0x51,
14382
-	0xe2, 0x14, 0xc4, 0x27, 0x5e, 0x3c, 0x33, 0xb2, 0xc0, 0x5d, 0x1f, 0x92, 0x90, 0x1e, 0x91, 0x69,
14383
-	0xb4, 0x2a, 0x55, 0x11, 0x6d, 0xf2, 0x6c, 0x21, 0xa0, 0xfe, 0x21, 0xb5, 0x57, 0x72, 0x22, 0x04,
14384
-	0xaf, 0xf2, 0x07, 0x2b, 0xb8, 0x24, 0x57, 0xb1, 0x76, 0xe5, 0x63, 0xc1, 0x08, 0x66, 0x55, 0xdf,
14385
-	0x28, 0x81, 0xbf, 0x07, 0x4b, 0x67, 0xfa, 0xf9, 0x52, 0x3a, 0xd6, 0xee, 0x3d, 0xf9, 0xa1, 0x96,
14386
-	0x55, 0x5f, 0x3f, 0xd2, 0xf2, 0xfa, 0x9f, 0x66, 0xe4, 0x3a, 0x52, 0xa3, 0x3a, 0xff, 0x4a, 0xad,
14387
-	0x20, 0xa2, 0xdf, 0x62, 0xae, 0x8a, 0xef, 0xb7, 0x2e, 0x5f, 0x5e, 0x9c, 0xde, 0x0b, 0x38, 0x8e,
14388
-	0x15, 0xd1, 0x1a, 0x94, 0xe4, 0xfc, 0x9b, 0x3c, 0x9e, 0xc4, 0xb0, 0x2e, 0x61, 0x90, 0x22, 0xae,
14389
-	0x89, 0xee, 0xc2, 0xf2, 0x78, 0xb2, 0xeb, 0x3a, 0xc1, 0x3e, 0xb5, 0x25, 0x26, 0x2b, 0x30, 0x4b,
14390
-	0xb1, 0x54, 0xc0, 0xb6, 0xa1, 0xac, 0x04, 0xa6, 0xa0, 0x76, 0x39, 0xe1, 0xd0, 0xbb, 0x57, 0x39,
14391
-	0x24, 0x55, 0x04, 0xe3, 0x2b, 0x8d, 0x67, 0x05, 0xbd, 0x09, 0x85, 0xc8, 0x59, 0xb4, 0x02, 0x99,
14392
-	0x41, 0xa3, 0xa7, 0x2d, 0x54, 0xae, 0x1d, 0x9f, 0x54, 0x4b, 0x91, 0x78, 0xd0, 0xe8, 0xf1, 0x9a,
14393
-	0x9d, 0x66, 0x4f, 0x4b, 0x9d, 0xad, 0xd9, 0x69, 0xf6, 0x2a, 0x59, 0x4e, 0x31, 0xf4, 0x3d, 0x28,
14394
-	0x25, 0x5a, 0x40, 0x6f, 0xc0, 0x62, 0xbb, 0xf3, 0x08, 0xb7, 0xfa, 0x7d, 0x6d, 0xa1, 0x72, 0xeb,
14395
-	0xf8, 0xa4, 0x8a, 0x12, 0xb5, 0x6d, 0x6f, 0xc8, 0xe7, 0x07, 0xbd, 0x06, 0xd9, 0xcd, 0x2e, 0x3f,
14396
-	0xba, 0x24, 0x97, 0x4c, 0x20, 0x36, 0x59, 0x10, 0x56, 0x6e, 0x28, 0xee, 0x92, 0x34, 0xac, 0xff,
14397
-	0x71, 0x0a, 0xf2, 0x92, 0x52, 0xcf, 0x9d, 0x28, 0x03, 0x16, 0xa3, 0x44, 0x4f, 0xf2, 0xfc, 0xb7,
14398
-	0x2e, 0xe6, 0xe4, 0x35, 0x45, 0xa1, 0x65, 0xf8, 0x45, 0x7a, 0x95, 0x8f, 0xa0, 0x9c, 0xac, 0xf8,
14399
-	0x46, 0xc1, 0xf7, 0x9b, 0x50, 0xe2, 0xf1, 0x1d, 0x71, 0xf3, 0x75, 0xc8, 0x4b, 0xda, 0x1f, 0x6f,
14400
-	0xa5, 0x17, 0x27, 0x08, 0x0a, 0x89, 0x1e, 0xc2, 0xa2, 0x4c, 0x2a, 0xa2, 0x2b, 0xb0, 0xd5, 0xcb,
14401
-	0x57, 0x11, 0x8e, 0xe0, 0xfa, 0xa7, 0x90, 0xed, 0x51, 0xea, 0xf3, 0xb1, 0xf7, 0x98, 0x4d, 0x67,
14402
-	0xa7, 0x8f, 0xca, 0x87, 0x6c, 0xda, 0x6e, 0xf2, 0x7c, 0xc8, 0xa6, 0x6d, 0x3b, 0xbe, 0xc1, 0x48,
14403
-	0x27, 0x6e, 0x30, 0x06, 0x50, 0x7e, 0x4a, 0x9d, 0xe1, 0x7e, 0x48, 0x6d, 0x61, 0xe8, 0x3d, 0xc8,
14404
-	0x8e, 0x69, 0xec, 0xfc, 0xca, 0xdc, 0x00, 0xa3, 0xd4, 0xc7, 0x02, 0xc5, 0xf7, 0x91, 0x23, 0xa1,
14405
-	0xad, 0x2e, 0x5e, 0x55, 0x49, 0xff, 0xbb, 0x34, 0x2c, 0xb7, 0x83, 0x60, 0x42, 0x3c, 0x2b, 0x22,
14406
-	0x26, 0x9f, 0x9c, 0x25, 0x26, 0x6f, 0xcf, 0xed, 0xe1, 0x19, 0x95, 0xb3, 0x17, 0x33, 0xea, 0x70,
14407
-	0x48, 0xc7, 0x87, 0x83, 0xfe, 0xef, 0xa9, 0xe8, 0xf6, 0xe5, 0x6e, 0x62, 0xb9, 0x57, 0x56, 0x8e,
14408
-	0x4f, 0xaa, 0x37, 0x93, 0x96, 0xe8, 0x8e, 0x77, 0xe0, 0xb1, 0x23, 0x0f, 0xbd, 0x0e, 0x39, 0xdc,
14409
-	0xea, 0xb4, 0x9e, 0x6a, 0x29, 0x19, 0x9e, 0x67, 0x40, 0x98, 0x7a, 0xf4, 0x88, 0x5b, 0xea, 0xb5,
14410
-	0x3a, 0x4d, 0x4e, 0x24, 0xd2, 0x73, 0x2c, 0xf5, 0xa8, 0x67, 0x3b, 0xde, 0x10, 0xbd, 0x01, 0xf9,
14411
-	0x76, 0xbf, 0xbf, 0x23, 0xf2, 0xe3, 0xef, 0x1e, 0x9f, 0x54, 0x6f, 0x9c, 0x41, 0xf1, 0x02, 0xb5,
14412
-	0x39, 0x88, 0xb3, 0x78, 0x4e, 0x31, 0xe6, 0x80, 0x38, 0x3d, 0x94, 0x20, 0xdc, 0x1d, 0xf0, 0xe4,
14413
-	0x3d, 0x37, 0x07, 0x84, 0x19, 0xff, 0xab, 0x96, 0xdb, 0x3f, 0xa5, 0x41, 0x33, 0x2c, 0x8b, 0x8e,
14414
-	0x43, 0x5e, 0xaf, 0x12, 0xa7, 0x01, 0x14, 0xc6, 0xfc, 0xcb, 0xa1, 0x11, 0x09, 0x78, 0x38, 0xf7,
14415
-	0xea, 0xff, 0x9c, 0x5e, 0x0d, 0x33, 0x97, 0x1a, 0xf6, 0xc8, 0x09, 0x02, 0x87, 0x79, 0x52, 0x86,
14416
-	0x63, 0x4b, 0x95, 0xff, 0x4c, 0xc1, 0x8d, 0x39, 0x08, 0x74, 0x0f, 0xb2, 0x3e, 0x73, 0xa3, 0x39,
14417
-	0xbc, 0x73, 0xd1, 0xc5, 0x1a, 0x57, 0xc5, 0x02, 0x89, 0x56, 0x01, 0xc8, 0x24, 0x64, 0x44, 0xb4,
14418
-	0x2f, 0x66, 0xaf, 0x80, 0x13, 0x12, 0xf4, 0x14, 0xf2, 0x01, 0xb5, 0x7c, 0x1a, 0x51, 0xc5, 0x4f,
14419
-	0xff, 0xaf, 0xde, 0xd7, 0xfa, 0xc2, 0x0c, 0x56, 0xe6, 0x2a, 0x35, 0xc8, 0x4b, 0x09, 0x0f, 0x7b,
14420
-	0x9b, 0x84, 0x44, 0x38, 0x5d, 0xc6, 0xe2, 0x9b, 0x47, 0x13, 0x71, 0x87, 0x51, 0x34, 0x11, 0x77,
14421
-	0xa8, 0xff, 0x75, 0x1a, 0xa0, 0xf5, 0x2c, 0xa4, 0xbe, 0x47, 0xdc, 0x86, 0x81, 0x5a, 0x89, 0xdd,
14422
-	0x5f, 0xf6, 0xf6, 0x9d, 0xb9, 0xd7, 0xad, 0xb1, 0x46, 0xad, 0x61, 0xcc, 0xd9, 0xff, 0x6f, 0x43,
14423
-	0x66, 0xe2, 0xab, 0xd7, 0x1c, 0x49, 0xf3, 0x76, 0xf0, 0x16, 0xe6, 0x32, 0xd4, 0x9a, 0x6d, 0x5b,
14424
-	0x99, 0x8b, 0xdf, 0x6c, 0x12, 0x0d, 0xcc, 0xdd, 0xba, 0xf8, 0xca, 0xb7, 0x88, 0x69, 0x51, 0x75,
14425
-	0x72, 0x94, 0xe5, 0xca, 0x6f, 0x18, 0x0d, 0xea, 0x87, 0x38, 0x6f, 0x11, 0xfe, 0xff, 0x5b, 0xed,
14426
-	0x6f, 0xef, 0x01, 0xcc, 0xba, 0x86, 0x56, 0x21, 0xd7, 0xd8, 0xe8, 0xf7, 0xb7, 0xb4, 0x05, 0xb9,
14427
-	0x81, 0xcf, 0xaa, 0x84, 0x58, 0xff, 0x59, 0x0a, 0x0a, 0x0d, 0x43, 0x1d, 0xab, 0x0d, 0xd0, 0xc4,
14428
-	0xae, 0xc4, 0xbd, 0x33, 0xe9, 0xb3, 0xb1, 0xe3, 0x4f, 0xd5, 0xc6, 0x72, 0x49, 0xce, 0xb6, 0xcc,
14429
-	0x55, 0xb8, 0xd7, 0x2d, 0xa1, 0x80, 0x30, 0x94, 0xa9, 0x1a, 0x04, 0xd3, 0x22, 0xd1, 0x1e, 0xbf,
14430
-	0x7a, 0xf9, 0x60, 0x49, 0xf6, 0x3d, 0x2b, 0x07, 0xb8, 0x14, 0x19, 0x69, 0x90, 0x40, 0x7f, 0x02,
14431
-	0x37, 0xba, 0xbe, 0xb5, 0x4f, 0x83, 0x50, 0x36, 0xaa, 0xfc, 0xfd, 0x14, 0xee, 0x84, 0x24, 0x38,
14432
-	0x30, 0xf7, 0x9d, 0x20, 0x64, 0xfe, 0xd4, 0xf4, 0x69, 0x48, 0x3d, 0x5e, 0x6f, 0x8a, 0xb7, 0x1f,
14433
-	0x75, 0xd3, 0x72, 0x9b, 0x63, 0x36, 0x25, 0x04, 0x47, 0x88, 0x2d, 0x0e, 0xd0, 0xdb, 0x50, 0xe6,
14434
-	0x7c, 0xb7, 0x49, 0xf7, 0xc8, 0xc4, 0x0d, 0x03, 0x9e, 0x49, 0xb9, 0x6c, 0x68, 0xbe, 0xf2, 0x81,
14435
-	0x50, 0x74, 0xd9, 0x50, 0x7e, 0xea, 0x3f, 0x05, 0xad, 0xe9, 0x04, 0x63, 0x12, 0x5a, 0xfb, 0xd1,
14436
-	0x15, 0x12, 0x6a, 0x82, 0xb6, 0x4f, 0x89, 0x1f, 0xee, 0x52, 0x12, 0x9a, 0x63, 0xea, 0x3b, 0xcc,
14437
-	0xbe, 0x7a, 0x3c, 0xaf, 0xc5, 0x2a, 0x3d, 0xa1, 0xa1, 0xff, 0x57, 0x0a, 0x00, 0x93, 0xbd, 0x88,
14438
-	0xfb, 0xfc, 0x00, 0xae, 0x07, 0x1e, 0x19, 0x07, 0xfb, 0x2c, 0x34, 0x1d, 0x2f, 0xa4, 0xfe, 0x21,
14439
-	0x71, 0xd5, 0x4d, 0x80, 0x16, 0x55, 0xb4, 0x95, 0x1c, 0xbd, 0x07, 0xe8, 0x80, 0xd2, 0xb1, 0xc9,
14440
-	0x5c, 0xdb, 0x8c, 0x2a, 0xe5, 0xcb, 0x54, 0x16, 0x6b, 0xbc, 0xa6, 0xeb, 0xda, 0xfd, 0x48, 0x8e,
14441
-	0xea, 0xb0, 0xca, 0xbb, 0x4f, 0xbd, 0xd0, 0x77, 0x68, 0x60, 0xee, 0x31, 0xdf, 0x0c, 0x5c, 0x76,
14442
-	0x64, 0xee, 0x31, 0xd7, 0x65, 0x47, 0xd4, 0x8f, 0x2e, 0x59, 0x2a, 0x2e, 0x1b, 0xb6, 0x24, 0x68,
14443
-	0x83, 0xf9, 0x7d, 0x97, 0x1d, 0x6d, 0x44, 0x08, 0x4e, 0x90, 0x66, 0x7d, 0x0e, 0x1d, 0xeb, 0x20,
14444
-	0x22, 0x48, 0xb1, 0x74, 0xe0, 0x58, 0x07, 0xe8, 0x0d, 0x58, 0xa2, 0x2e, 0x15, 0xb9, 0xb6, 0x44,
14445
-	0xe5, 0x04, 0xaa, 0x1c, 0x09, 0x39, 0x48, 0xff, 0x0c, 0xb4, 0x96, 0x67, 0xf9, 0xd3, 0x71, 0x62,
14446
-	0xce, 0xdf, 0x03, 0xc4, 0xb7, 0x23, 0xd3, 0x65, 0xd6, 0x81, 0x39, 0x22, 0x1e, 0x19, 0x72, 0xbf,
14447
-	0xe4, 0x6b, 0x88, 0xc6, 0x6b, 0xb6, 0x98, 0x75, 0xb0, 0xad, 0xe4, 0xfa, 0x87, 0x00, 0xfd, 0xb1,
14448
-	0x4f, 0x89, 0xdd, 0xe5, 0xe7, 0x36, 0x1f, 0x3a, 0x51, 0x32, 0x6d, 0xf5, 0xe0, 0xc2, 0x7c, 0xb5,
14449
-	0xa8, 0x34, 0x59, 0xd1, 0x8c, 0xe5, 0xfa, 0xaf, 0xc2, 0x8d, 0x9e, 0x4b, 0x2c, 0xf1, 0xf8, 0xd8,
14450
-	0x8b, 0xaf, 0xf7, 0xd1, 0x43, 0xc8, 0x4b, 0xa8, 0x9a, 0xc9, 0xb9, 0x81, 0x3d, 0x6b, 0x73, 0x73,
14451
-	0x01, 0x2b, 0x7c, 0xbd, 0x0c, 0x30, 0xb3, 0xa3, 0x3f, 0x83, 0x62, 0x6c, 0x1e, 0x55, 0x81, 0x27,
14452
-	0x9b, 0x3c, 0xba, 0x1d, 0x4f, 0x65, 0x87, 0x45, 0x9c, 0x14, 0xa1, 0x36, 0x94, 0xc6, 0xb1, 0xf2,
14453
-	0xa5, 0xc4, 0x69, 0x8e, 0xd3, 0x38, 0xa9, 0xab, 0x7f, 0x02, 0xf0, 0x13, 0xe6, 0x78, 0x03, 0x76,
14454
-	0x40, 0x3d, 0xf1, 0xa2, 0xc4, 0xf3, 0x22, 0x1a, 0x0d, 0x84, 0x2a, 0x89, 0xb4, 0x4f, 0x8e, 0x62,
14455
-	0xfc, 0xb0, 0x22, 0x8b, 0xfa, 0x1f, 0xa4, 0x21, 0x8f, 0x19, 0x0b, 0x1b, 0x06, 0xaa, 0x42, 0xde,
14456
-	0x22, 0x66, 0xb4, 0x35, 0x95, 0xeb, 0xc5, 0xd3, 0x17, 0x6b, 0xb9, 0x86, 0xf1, 0x98, 0x4e, 0x71,
14457
-	0xce, 0x22, 0x8f, 0xe9, 0x34, 0xb9, 0xdd, 0xa5, 0x2f, 0xda, 0xee, 0xd0, 0x3d, 0x28, 0x2b, 0x90,
14458
-	0xb9, 0x4f, 0x82, 0x7d, 0x99, 0xcd, 0xd4, 0x97, 0x4f, 0x5f, 0xac, 0x81, 0x44, 0x6e, 0x92, 0x60,
14459
-	0x1f, 0x83, 0x44, 0xf3, 0x6f, 0xd4, 0x82, 0xd2, 0x17, 0xcc, 0xf1, 0xcc, 0x50, 0x74, 0x42, 0x5d,
14460
-	0x2c, 0xcd, 0x9d, 0x8a, 0x59, 0x57, 0xd5, 0x0b, 0x24, 0x7c, 0x31, 0xeb, 0x7c, 0x0b, 0x96, 0x7c,
14461
-	0xc6, 0x42, 0xd3, 0x57, 0xef, 0xec, 0x2a, 0x67, 0xad, 0xce, 0xbd, 0xca, 0x64, 0x2c, 0xc4, 0x0a,
14462
-	0x87, 0xcb, 0x7e, 0xa2, 0xa4, 0xff, 0x43, 0x0a, 0x4a, 0xdc, 0x35, 0x67, 0xcf, 0xb1, 0x38, 0xbf,
14463
-	0xf9, 0xe6, 0xc7, 0xee, 0x6d, 0xc8, 0x58, 0x81, 0xaf, 0x86, 0x48, 0x9c, 0x3b, 0x8d, 0x3e, 0xc6,
14464
-	0x5c, 0x86, 0x3e, 0x83, 0xbc, 0xca, 0x84, 0xe5, 0x89, 0xab, 0x5f, 0xcd, 0xc4, 0x54, 0x4f, 0x95,
14465
-	0x9e, 0x88, 0xae, 0x99, 0x77, 0xf2, 0xd8, 0xc1, 0x49, 0x11, 0xba, 0x05, 0x69, 0x4b, 0x76, 0x5e,
14466
-	0x3d, 0x58, 0x37, 0x3a, 0x38, 0x6d, 0x79, 0xfa, 0xdf, 0xa6, 0x60, 0x69, 0xb6, 0x02, 0xf9, 0x7c,
14467
-	0xde, 0x81, 0x62, 0x30, 0xd9, 0x0d, 0xa6, 0x41, 0x48, 0x47, 0xd1, 0xdb, 0x57, 0x2c, 0x40, 0x6d,
14468
-	0x28, 0x12, 0x77, 0xc8, 0x7c, 0x27, 0xdc, 0x1f, 0xa9, 0x24, 0x6c, 0xfe, 0x29, 0x99, 0xb4, 0x59,
14469
-	0x33, 0x22, 0x15, 0x3c, 0xd3, 0x8e, 0x8e, 0xbc, 0x8c, 0x70, 0x56, 0x1c, 0x79, 0xaf, 0x43, 0xd9,
14470
-	0x25, 0x23, 0x71, 0x35, 0xc0, 0x73, 0x7b, 0xd1, 0x8f, 0x2c, 0x2e, 0x29, 0xd9, 0xc0, 0x19, 0x51,
14471
-	0x5d, 0x87, 0x62, 0x6c, 0x0c, 0x5d, 0x83, 0x92, 0xd1, 0xea, 0x9b, 0xf7, 0xd7, 0x1f, 0x9a, 0x8f,
14472
-	0x1a, 0xdb, 0xda, 0x82, 0xa2, 0x65, 0x7f, 0x91, 0x82, 0x25, 0xb5, 0x3f, 0x28, 0xaa, 0xfb, 0x06,
14473
-	0x2c, 0xfa, 0x64, 0x2f, 0x8c, 0xc8, 0x78, 0x56, 0xc6, 0x28, 0xdf, 0x72, 0x39, 0x19, 0xe7, 0x55,
14474
-	0xf3, 0xc9, 0x78, 0xe2, 0x35, 0x36, 0x73, 0xe9, 0x6b, 0x6c, 0xf6, 0xff, 0xe5, 0x35, 0x56, 0xff,
14475
-	0xb3, 0x34, 0x5c, 0x53, 0xac, 0x29, 0xde, 0x8e, 0xde, 0x81, 0xa2, 0x24, 0x50, 0xb3, 0x54, 0x42,
14476
-	0x3c, 0x00, 0x4a, 0x5c, 0xbb, 0x89, 0x0b, 0xb2, 0xba, 0x6d, 0xf3, 0xdc, 0x56, 0x41, 0x13, 0xbf,
14477
-	0x2d, 0x00, 0x29, 0xea, 0xf0, 0xc4, 0xac, 0x09, 0xd9, 0x3d, 0xc7, 0xa5, 0x2a, 0xce, 0xe6, 0x5e,
14478
-	0xfb, 0x9e, 0x6b, 0x5e, 0x3c, 0x50, 0x0c, 0x44, 0x76, 0xbc, 0xb9, 0x80, 0x85, 0x76, 0xe5, 0xb7,
14479
-	0x01, 0x66, 0xd2, 0xb9, 0x09, 0x20, 0x27, 0x59, 0xea, 0x2e, 0x2d, 0x22, 0x59, 0xed, 0x26, 0xe6,
14480
-	0x32, 0x5e, 0x35, 0x74, 0x6c, 0xb5, 0x01, 0x88, 0xaa, 0x47, 0xbc, 0x6a, 0xe8, 0xd8, 0xf1, 0x2b,
14481
-	0x49, 0xf6, 0x8a, 0x57, 0x92, 0x7a, 0x21, 0xba, 0xd1, 0xd1, 0xb7, 0xe0, 0x56, 0xdd, 0x25, 0xd6,
14482
-	0x81, 0xeb, 0x04, 0x21, 0xb5, 0x93, 0x2b, 0x74, 0x1d, 0xf2, 0x67, 0xf8, 0xcd, 0x65, 0x17, 0x68,
14483
-	0x0a, 0xa9, 0xff, 0x5b, 0x0a, 0xca, 0x9b, 0x94, 0xb8, 0xe1, 0xfe, 0xec, 0x16, 0x22, 0xa4, 0x41,
14484
-	0xa8, 0xb6, 0x6b, 0xf1, 0x8d, 0x3e, 0x80, 0x42, 0x7c, 0x28, 0x5f, 0xf9, 0x92, 0x11, 0x43, 0xd1,
14485
-	0x03, 0x58, 0xe4, 0x31, 0xcd, 0x26, 0x11, 0xaf, 0xbe, 0xec, 0x92, 0x5c, 0x21, 0xf9, 0x16, 0xed,
14486
-	0x53, 0x71, 0x0a, 0x8b, 0x41, 0xc9, 0xe1, 0xa8, 0x88, 0x7e, 0x05, 0xca, 0xe2, 0x8e, 0x37, 0x22,
14487
-	0x1d, 0xb9, 0xab, 0x6c, 0x96, 0xe4, 0x33, 0x8d, 0x24, 0x1c, 0xff, 0x93, 0x82, 0x9b, 0xdb, 0x64,
14488
-	0xba, 0x4b, 0xd5, 0x32, 0xa5, 0x36, 0xa6, 0x16, 0xf3, 0x6d, 0xd4, 0x4b, 0x2e, 0xef, 0x4b, 0x5e,
14489
-	0x7d, 0xe6, 0x29, 0xcf, 0x5f, 0xe5, 0x11, 0xd7, 0x4f, 0x27, 0xb8, 0xfe, 0x4d, 0xc8, 0x79, 0xcc,
14490
-	0xb3, 0xa8, 0x5a, 0xfb, 0xb2, 0xa0, 0x3b, 0xc9, 0xa5, 0x5d, 0x89, 0x1f, 0x64, 0xc4, 0x73, 0x4a,
14491
-	0x87, 0x85, 0x71, 0x6b, 0xe8, 0x33, 0xa8, 0xf4, 0x5b, 0x0d, 0xdc, 0x1a, 0xd4, 0xbb, 0x3f, 0x35,
14492
-	0xfb, 0xc6, 0x56, 0xdf, 0x58, 0xbf, 0x67, 0xf6, 0xba, 0x5b, 0x9f, 0xdf, 0x7f, 0x70, 0xef, 0x03,
14493
-	0x2d, 0x55, 0xa9, 0x1e, 0x9f, 0x54, 0xef, 0x74, 0x8c, 0xc6, 0x96, 0x8c, 0xe5, 0x5d, 0xf6, 0xac,
14494
-	0x4f, 0xdc, 0x80, 0xac, 0xdf, 0xeb, 0x31, 0x77, 0xca, 0x31, 0xfa, 0x49, 0x0a, 0xca, 0xc9, 0xdd,
14495
-	0x3e, 0x79, 0x88, 0xa5, 0x2e, 0x3c, 0xc4, 0x66, 0x67, 0x61, 0xfa, 0x82, 0xb3, 0x70, 0x03, 0x6e,
14496
-	0x5a, 0x3e, 0x0b, 0x02, 0x33, 0x70, 0x86, 0x1e, 0xb5, 0xcd, 0xc8, 0xa6, 0xe8, 0x67, 0xfd, 0x3b,
14497
-	0xa7, 0x2f, 0xd6, 0xae, 0x37, 0x78, 0x7d, 0x5f, 0x54, 0x2b, 0xf3, 0xd7, 0xad, 0x84, 0x48, 0xb4,
14498
-	0xf4, 0xee, 0x2f, 0x33, 0x50, 0x8c, 0xaf, 0x69, 0xf9, 0x92, 0xe1, 0x39, 0xb2, 0x1a, 0x8a, 0x58,
14499
-	0xde, 0xa1, 0x47, 0xe8, 0xf5, 0x59, 0x76, 0xfc, 0x99, 0x7c, 0x97, 0x8a, 0xab, 0xa3, 0xcc, 0xf8,
14500
-	0x4d, 0x28, 0x18, 0xfd, 0x7e, 0xfb, 0x51, 0xa7, 0xd5, 0xd4, 0xbe, 0x4c, 0x55, 0xbe, 0x73, 0x7c,
14501
-	0x52, 0xbd, 0x1e, 0x83, 0x8c, 0x40, 0x7a, 0x2a, 0x50, 0x8d, 0x46, 0xab, 0x37, 0x68, 0x35, 0xb5,
14502
-	0xe7, 0xe9, 0xf3, 0x28, 0x91, 0xed, 0x89, 0xd7, 0xe5, 0x62, 0x0f, 0xb7, 0x7a, 0x06, 0xe6, 0x0d,
14503
-	0x7e, 0x99, 0x96, 0x49, 0xfb, 0xac, 0x45, 0x9f, 0x8e, 0x89, 0xcf, 0xdb, 0x5c, 0x8d, 0x7e, 0x65,
14504
-	0xf1, 0x3c, 0x23, 0x5f, 0x20, 0x67, 0x77, 0xce, 0x94, 0xd8, 0x53, 0xde, 0x9a, 0xb8, 0xec, 0x17,
14505
-	0x66, 0x32, 0xe7, 0x5a, 0xeb, 0xf3, 0x40, 0xe5, 0x56, 0x74, 0x58, 0xc4, 0x3b, 0x9d, 0x0e, 0x07,
14506
-	0x3d, 0xcf, 0x9e, 0xeb, 0x1d, 0x9e, 0x78, 0x1e, 0xc7, 0xdc, 0x85, 0x42, 0xf4, 0x16, 0xa0, 0x7d,
14507
-	0x99, 0x3d, 0xe7, 0x50, 0x23, 0x7a, 0xc8, 0x10, 0x0d, 0x6e, 0xee, 0x0c, 0xc4, 0x8f, 0x40, 0x9e,
14508
-	0xe7, 0xce, 0x37, 0xb8, 0x3f, 0x09, 0x6d, 0x76, 0xe4, 0xf1, 0x09, 0x56, 0xf7, 0x03, 0x5f, 0xe6,
14509
-	0x64, 0x32, 0x15, 0x63, 0xd4, 0xe5, 0xc0, 0x9b, 0x50, 0xc0, 0xad, 0x9f, 0xc8, 0xdf, 0x8b, 0x3c,
14510
-	0xcf, 0x9f, 0xb3, 0x83, 0xe9, 0x17, 0xd4, 0x52, 0xad, 0x75, 0x71, 0x6f, 0xd3, 0x10, 0x43, 0x7e,
14511
-	0x1e, 0xd5, 0xf5, 0xc7, 0xfb, 0xc4, 0xa3, 0xf6, 0xec, 0x19, 0x36, 0xae, 0x7a, 0xf7, 0xd7, 0xa0,
14512
-	0x10, 0xd1, 0x06, 0xb4, 0x0a, 0xf9, 0xa7, 0x5d, 0xfc, 0xb8, 0x85, 0xb5, 0x05, 0x39, 0x86, 0x51,
14513
-	0xcd, 0x53, 0x49, 0xdf, 0xaa, 0xb0, 0xb8, 0x6d, 0x74, 0x8c, 0x47, 0x2d, 0x1c, 0x5d, 0xdd, 0x45,
14514
-	0x00, 0x75, 0xf6, 0x55, 0x34, 0xd5, 0x40, 0x6c, 0xb3, 0xbe, 0xf2, 0xd5, 0xd7, 0xab, 0x0b, 0xbf,
14515
-	0xf8, 0x7a, 0x75, 0xe1, 0xf9, 0xe9, 0x6a, 0xea, 0xab, 0xd3, 0xd5, 0xd4, 0xcf, 0x4f, 0x57, 0x53,
14516
-	0xff, 0x72, 0xba, 0x9a, 0xda, 0xcd, 0x8b, 0x1d, 0xe3, 0xc1, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff,
14517
-	0x55, 0x06, 0x85, 0xd6, 0xa6, 0x29, 0x00, 0x00,
14251
+	// 4333 bytes of a gzipped FileDescriptorProto
14252
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xac, 0x5a, 0x4f, 0x6c, 0x24, 0xc7,
14253
+	0x5a, 0xf7, 0xfc, 0xf5, 0xcc, 0x37, 0x63, 0xbb, 0xb7, 0xd6, 0xd9, 0x78, 0x27, 0x1b, 0x7b, 0xd2,
14254
+	0xc9, 0xbe, 0xfc, 0x79, 0xd1, 0x64, 0xd7, 0xfb, 0x12, 0x6d, 0x12, 0x5e, 0x92, 0xf9, 0xe7, 0xf5,
14255
+	0xbc, 0xb5, 0x67, 0x46, 0x35, 0xe3, 0xdd, 0x97, 0x03, 0xb4, 0xca, 0xdd, 0xe5, 0x71, 0xc7, 0x3d,
14256
+	0x5d, 0x43, 0x77, 0x8f, 0xbd, 0x03, 0x42, 0xac, 0x38, 0x00, 0xf2, 0x89, 0x23, 0x12, 0xf2, 0x09,
14257
+	0x4e, 0x1c, 0xb8, 0x70, 0x40, 0x70, 0x21, 0x48, 0x1c, 0x72, 0xe3, 0x01, 0x12, 0x7a, 0x02, 0xc9,
14258
+	0x10, 0x23, 0x71, 0x43, 0x70, 0x79, 0xe2, 0x02, 0x12, 0xaa, 0x3f, 0xdd, 0xd3, 0xf6, 0x8e, 0xed,
14259
+	0x0d, 0xe1, 0x62, 0x77, 0x7d, 0xf5, 0xfb, 0xbe, 0xaa, 0xfa, 0xea, 0xab, 0xaa, 0xdf, 0x57, 0x35,
14260
+	0x50, 0x08, 0x26, 0x23, 0xea, 0x57, 0x46, 0x1e, 0x0b, 0x18, 0x42, 0x16, 0x33, 0x0f, 0xa8, 0x57,
14261
+	0xf1, 0x8f, 0x88, 0x37, 0x3c, 0xb0, 0x83, 0xca, 0xe1, 0xfd, 0xd2, 0xda, 0x80, 0xb1, 0x81, 0x43,
14262
+	0x3f, 0x10, 0x88, 0xdd, 0xf1, 0xde, 0x07, 0x81, 0x3d, 0xa4, 0x7e, 0x40, 0x86, 0x23, 0xa9, 0x54,
14263
+	0x5a, 0xbd, 0x08, 0xb0, 0xc6, 0x1e, 0x09, 0x6c, 0xe6, 0xaa, 0xfa, 0xe5, 0x01, 0x1b, 0x30, 0xf1,
14264
+	0xf9, 0x01, 0xff, 0x92, 0x52, 0x7d, 0x0d, 0xe6, 0x9f, 0x50, 0xcf, 0xb7, 0x99, 0x8b, 0x96, 0x21,
14265
+	0x63, 0xbb, 0x16, 0x7d, 0xb6, 0x92, 0x28, 0x27, 0xde, 0x49, 0x63, 0x59, 0xd0, 0xef, 0x01, 0xb4,
14266
+	0xf8, 0x47, 0xd3, 0x0d, 0xbc, 0x09, 0xd2, 0x20, 0x75, 0x40, 0x27, 0x02, 0x91, 0xc7, 0xfc, 0x93,
14267
+	0x4b, 0x0e, 0x89, 0xb3, 0x92, 0x94, 0x92, 0x43, 0xe2, 0xe8, 0xdf, 0x26, 0xa0, 0x50, 0x75, 0x5d,
14268
+	0x16, 0x88, 0xd6, 0x7d, 0x84, 0x20, 0xed, 0x92, 0x21, 0x55, 0x4a, 0xe2, 0x1b, 0xd5, 0x21, 0xeb,
14269
+	0x90, 0x5d, 0xea, 0xf8, 0x2b, 0xc9, 0x72, 0xea, 0x9d, 0xc2, 0xfa, 0x0f, 0x2b, 0x2f, 0x0e, 0xb9,
14270
+	0x12, 0x33, 0x52, 0xd9, 0x12, 0x68, 0xd1, 0x09, 0xac, 0x54, 0xd1, 0x67, 0x30, 0x6f, 0xbb, 0x96,
14271
+	0x6d, 0x52, 0x7f, 0x25, 0x2d, 0xac, 0xac, 0xce, 0xb2, 0x32, 0xed, 0x7d, 0x2d, 0xfd, 0xcd, 0xe9,
14272
+	0xda, 0x1c, 0x0e, 0x95, 0x4a, 0x1f, 0x43, 0x21, 0x66, 0x76, 0xc6, 0xd8, 0x96, 0x21, 0x73, 0x48,
14273
+	0x9c, 0x31, 0x55, 0xa3, 0x93, 0x85, 0x4f, 0x92, 0x0f, 0x13, 0xfa, 0x97, 0x90, 0xc7, 0xd4, 0x67,
14274
+	0x63, 0xcf, 0xa4, 0x3e, 0x7a, 0x17, 0xf2, 0x2e, 0x71, 0x99, 0x61, 0x8e, 0xc6, 0xbe, 0x50, 0x4f,
14275
+	0xd5, 0x8a, 0x67, 0xa7, 0x6b, 0xb9, 0x36, 0x71, 0x59, 0xbd, 0xbb, 0xe3, 0xe3, 0x1c, 0xaf, 0xae,
14276
+	0x8f, 0xc6, 0x3e, 0x7a, 0x03, 0x8a, 0x43, 0x3a, 0x64, 0xde, 0xc4, 0xd8, 0x9d, 0x04, 0xd4, 0x17,
14277
+	0x86, 0x53, 0xb8, 0x20, 0x65, 0x35, 0x2e, 0xd2, 0x7f, 0x2f, 0x01, 0xcb, 0xa1, 0x6d, 0x4c, 0x7f,
14278
+	0x75, 0x6c, 0x7b, 0x74, 0x48, 0xdd, 0xc0, 0x47, 0x1f, 0x42, 0xd6, 0xb1, 0x87, 0x76, 0x20, 0xdb,
14279
+	0x28, 0xac, 0xbf, 0x3e, 0x6b, 0xb4, 0x51, 0xaf, 0xb0, 0x02, 0xa3, 0x2a, 0x14, 0x3d, 0xea, 0x53,
14280
+	0xef, 0x50, 0x7a, 0x52, 0x34, 0x79, 0xad, 0xf2, 0x39, 0x15, 0x7d, 0x03, 0x72, 0x5d, 0x87, 0x04,
14281
+	0x7b, 0xcc, 0x1b, 0x22, 0x1d, 0x8a, 0xc4, 0x33, 0xf7, 0xed, 0x80, 0x9a, 0xc1, 0xd8, 0x0b, 0x67,
14282
+	0xf5, 0x9c, 0x0c, 0xdd, 0x82, 0x24, 0x93, 0x0d, 0xe5, 0x6b, 0xd9, 0xb3, 0xd3, 0xb5, 0x64, 0xa7,
14283
+	0x87, 0x93, 0xcc, 0xd7, 0x3f, 0x85, 0x1b, 0x5d, 0x67, 0x3c, 0xb0, 0xdd, 0x06, 0xf5, 0x4d, 0xcf,
14284
+	0x1e, 0x71, 0xeb, 0x3c, 0x3c, 0x78, 0xec, 0x87, 0xe1, 0xc1, 0xbf, 0xa3, 0x90, 0x49, 0x4e, 0x43,
14285
+	0x46, 0xff, 0x9d, 0x24, 0xdc, 0x68, 0xba, 0x03, 0xdb, 0xa5, 0x71, 0xed, 0xbb, 0xb0, 0x48, 0x85,
14286
+	0xd0, 0x38, 0x94, 0x61, 0xac, 0xec, 0x2c, 0x48, 0x69, 0x18, 0xdb, 0xad, 0x0b, 0xf1, 0x76, 0x7f,
14287
+	0xd6, 0xf0, 0x5f, 0xb0, 0x3e, 0x33, 0xea, 0x9a, 0x30, 0x3f, 0x12, 0x83, 0xf0, 0x57, 0x52, 0xc2,
14288
+	0xd6, 0xdd, 0x59, 0xb6, 0x5e, 0x18, 0x67, 0x18, 0x7c, 0x4a, 0xf7, 0xfb, 0x04, 0xdf, 0xbf, 0x26,
14289
+	0x60, 0xa9, 0xcd, 0xac, 0x73, 0x7e, 0x28, 0x41, 0x6e, 0x9f, 0xf9, 0x41, 0x6c, 0xa1, 0x45, 0x65,
14290
+	0xf4, 0x10, 0x72, 0x23, 0x35, 0x7d, 0x6a, 0xf6, 0xef, 0xcc, 0xee, 0xb2, 0xc4, 0xe0, 0x08, 0x8d,
14291
+	0x3e, 0x85, 0xbc, 0x17, 0xc6, 0xc4, 0x4a, 0xea, 0x65, 0x02, 0x67, 0x8a, 0x47, 0x3f, 0x86, 0xac,
14292
+	0x9c, 0x84, 0x95, 0xb4, 0xd0, 0xbc, 0xfb, 0x52, 0x3e, 0xc7, 0x4a, 0x49, 0xff, 0x79, 0x02, 0x34,
14293
+	0x4c, 0xf6, 0x82, 0x6d, 0x3a, 0xdc, 0xa5, 0x5e, 0x2f, 0x20, 0xc1, 0xd8, 0x47, 0xb7, 0x20, 0xeb,
14294
+	0x50, 0x62, 0x51, 0x4f, 0x0c, 0x32, 0x87, 0x55, 0x09, 0xed, 0xf0, 0x20, 0x27, 0xe6, 0x3e, 0xd9,
14295
+	0xb5, 0x1d, 0x3b, 0x98, 0x88, 0x61, 0x2e, 0xce, 0x9e, 0xe5, 0x8b, 0x36, 0x2b, 0x38, 0xa6, 0x88,
14296
+	0xcf, 0x99, 0x41, 0x2b, 0x30, 0x3f, 0xa4, 0xbe, 0x4f, 0x06, 0x54, 0x8c, 0x3e, 0x8f, 0xc3, 0xa2,
14297
+	0xfe, 0x29, 0x14, 0xe3, 0x7a, 0xa8, 0x00, 0xf3, 0x3b, 0xed, 0xc7, 0xed, 0xce, 0xd3, 0xb6, 0x36,
14298
+	0x87, 0x96, 0xa0, 0xb0, 0xd3, 0xc6, 0xcd, 0x6a, 0x7d, 0xb3, 0x5a, 0xdb, 0x6a, 0x6a, 0x09, 0xb4,
14299
+	0x00, 0xf9, 0x69, 0x31, 0xa9, 0xff, 0x69, 0x02, 0x80, 0x4f, 0xa0, 0x1a, 0xd4, 0x27, 0x90, 0xf1,
14300
+	0x03, 0x12, 0xc8, 0x89, 0x5b, 0x5c, 0x7f, 0x6b, 0x56, 0xaf, 0xa7, 0xf0, 0x0a, 0xff, 0x47, 0xb1,
14301
+	0x54, 0x89, 0xf7, 0x30, 0x79, 0xae, 0x87, 0x7c, 0x0d, 0x11, 0xcb, 0xf2, 0x54, 0xc7, 0xc5, 0xb7,
14302
+	0xfe, 0x29, 0x64, 0x84, 0xf6, 0xf9, 0xee, 0xe6, 0x20, 0xdd, 0xe0, 0x5f, 0x09, 0x94, 0x87, 0x0c,
14303
+	0x6e, 0x56, 0x1b, 0x5f, 0x6a, 0x49, 0xa4, 0x41, 0xb1, 0xd1, 0xea, 0xd5, 0x3b, 0xed, 0x76, 0xb3,
14304
+	0xde, 0x6f, 0x36, 0xb4, 0x94, 0x7e, 0x17, 0x32, 0xad, 0x21, 0xb7, 0x7c, 0x87, 0x47, 0xc5, 0x1e,
14305
+	0xf5, 0xa8, 0x6b, 0x86, 0xc1, 0x36, 0x15, 0xe8, 0x3f, 0xcb, 0x43, 0x66, 0x9b, 0x8d, 0xdd, 0x00,
14306
+	0xad, 0xc7, 0x56, 0xf6, 0xe2, 0xec, 0xcd, 0x59, 0x00, 0x2b, 0xfd, 0xc9, 0x88, 0xaa, 0x95, 0x7f,
14307
+	0x0b, 0xb2, 0x32, 0x7e, 0xd4, 0x70, 0x54, 0x89, 0xcb, 0x03, 0xe2, 0x0d, 0x68, 0xa0, 0xc6, 0xa3,
14308
+	0x4a, 0xe8, 0x1d, 0xc8, 0x79, 0x94, 0x58, 0xcc, 0x75, 0x26, 0x22, 0xcc, 0x72, 0x72, 0xeb, 0xc5,
14309
+	0x94, 0x58, 0x1d, 0xd7, 0x99, 0xe0, 0xa8, 0x16, 0x6d, 0x42, 0x71, 0xd7, 0x76, 0x2d, 0x83, 0x8d,
14310
+	0xe4, 0x3e, 0x98, 0xb9, 0x3c, 0x28, 0x65, 0xaf, 0x6a, 0xb6, 0x6b, 0x75, 0x24, 0x18, 0x17, 0x76,
14311
+	0xa7, 0x05, 0xd4, 0x86, 0xc5, 0x43, 0xe6, 0x8c, 0x87, 0x34, 0xb2, 0x95, 0x15, 0xb6, 0xde, 0xbe,
14312
+	0xdc, 0xd6, 0x13, 0x81, 0x0f, 0xad, 0x2d, 0x1c, 0xc6, 0x8b, 0xe8, 0x31, 0x2c, 0x04, 0xc3, 0xd1,
14313
+	0x9e, 0x1f, 0x99, 0x9b, 0x17, 0xe6, 0x7e, 0x70, 0x85, 0xc3, 0x38, 0x3c, 0xb4, 0x56, 0x0c, 0x62,
14314
+	0xa5, 0xd2, 0x6f, 0xa5, 0xa0, 0x10, 0xeb, 0x39, 0xea, 0x41, 0x61, 0xe4, 0xb1, 0x11, 0x19, 0x88,
14315
+	0xbd, 0x5c, 0xcd, 0xc5, 0xfd, 0x97, 0x1a, 0x75, 0xa5, 0x3b, 0x55, 0xc4, 0x71, 0x2b, 0xfa, 0x49,
14316
+	0x12, 0x0a, 0xb1, 0x4a, 0xf4, 0x1e, 0xe4, 0x70, 0x17, 0xb7, 0x9e, 0x54, 0xfb, 0x4d, 0x6d, 0xae,
14317
+	0x74, 0xe7, 0xf8, 0xa4, 0xbc, 0x22, 0xac, 0xc5, 0x0d, 0x74, 0x3d, 0xfb, 0x90, 0x87, 0xde, 0x3b,
14318
+	0x30, 0x1f, 0x42, 0x13, 0xa5, 0xd7, 0x8e, 0x4f, 0xca, 0xaf, 0x5e, 0x84, 0xc6, 0x90, 0xb8, 0xb7,
14319
+	0x59, 0xc5, 0xcd, 0x86, 0x96, 0x9c, 0x8d, 0xc4, 0xbd, 0x7d, 0xe2, 0x51, 0x0b, 0xfd, 0x00, 0xb2,
14320
+	0x0a, 0x98, 0x2a, 0x95, 0x8e, 0x4f, 0xca, 0xb7, 0x2e, 0x02, 0xa7, 0x38, 0xdc, 0xdb, 0xaa, 0x3e,
14321
+	0x69, 0x6a, 0xe9, 0xd9, 0x38, 0xdc, 0x73, 0xc8, 0x21, 0x45, 0x6f, 0x41, 0x46, 0xc2, 0x32, 0xa5,
14322
+	0xdb, 0xc7, 0x27, 0xe5, 0x57, 0x5e, 0x30, 0xc7, 0x51, 0xa5, 0x95, 0xdf, 0xfd, 0xc3, 0xd5, 0xb9,
14323
+	0xbf, 0xf8, 0xa3, 0x55, 0xed, 0x62, 0x75, 0xe9, 0xbf, 0x13, 0xb0, 0x70, 0x6e, 0xca, 0x91, 0x0e,
14324
+	0x59, 0x97, 0x99, 0x6c, 0x24, 0xb7, 0xf8, 0x5c, 0x0d, 0xce, 0x4e, 0xd7, 0xb2, 0x6d, 0x56, 0x67,
14325
+	0xa3, 0x09, 0x56, 0x35, 0xe8, 0xf1, 0x85, 0x43, 0xea, 0xc1, 0x4b, 0xc6, 0xd3, 0xcc, 0x63, 0xea,
14326
+	0x73, 0x58, 0xb0, 0x3c, 0xfb, 0x90, 0x7a, 0x86, 0xc9, 0xdc, 0x3d, 0x7b, 0xa0, 0xb6, 0xef, 0xd2,
14327
+	0x2c, 0x9b, 0x0d, 0x01, 0xc4, 0x45, 0xa9, 0x50, 0x17, 0xf8, 0xef, 0x71, 0x40, 0x95, 0x9e, 0x40,
14328
+	0x31, 0x1e, 0xa1, 0xe8, 0x75, 0x00, 0xdf, 0xfe, 0x35, 0xaa, 0x38, 0x8f, 0x60, 0x48, 0x38, 0xcf,
14329
+	0x25, 0x82, 0xf1, 0xa0, 0xb7, 0x21, 0x3d, 0x64, 0x96, 0xb4, 0xb3, 0x50, 0xbb, 0xc9, 0xcf, 0xc9,
14330
+	0x7f, 0x3c, 0x5d, 0x2b, 0x30, 0xbf, 0xb2, 0x61, 0x3b, 0x74, 0x9b, 0x59, 0x14, 0x0b, 0x80, 0x7e,
14331
+	0x08, 0x69, 0xbe, 0x55, 0xa0, 0xd7, 0x20, 0x5d, 0x6b, 0xb5, 0x1b, 0xda, 0x5c, 0xe9, 0xc6, 0xf1,
14332
+	0x49, 0x79, 0x41, 0xb8, 0x84, 0x57, 0xf0, 0xd8, 0x45, 0x6b, 0x90, 0x7d, 0xd2, 0xd9, 0xda, 0xd9,
14333
+	0xe6, 0xe1, 0x75, 0xf3, 0xf8, 0xa4, 0xbc, 0x14, 0x55, 0x4b, 0xa7, 0xa1, 0xd7, 0x21, 0xd3, 0xdf,
14334
+	0xee, 0x6e, 0xf4, 0xb4, 0x64, 0x09, 0x1d, 0x9f, 0x94, 0x17, 0xa3, 0x7a, 0xd1, 0xe7, 0xd2, 0x0d,
14335
+	0x35, 0xab, 0xf9, 0x48, 0xae, 0xff, 0x22, 0x09, 0x0b, 0x98, 0x93, 0x6d, 0x2f, 0xe8, 0x32, 0xc7,
14336
+	0x36, 0x27, 0xa8, 0x0b, 0x79, 0x93, 0xb9, 0x96, 0x1d, 0x5b, 0x53, 0xeb, 0x97, 0x1c, 0x8c, 0x53,
14337
+	0xad, 0xb0, 0x54, 0x0f, 0x35, 0xf1, 0xd4, 0x08, 0xfa, 0x00, 0x32, 0x16, 0x75, 0xc8, 0x44, 0x9d,
14338
+	0xd0, 0xb7, 0x2b, 0x92, 0xce, 0x57, 0x42, 0x3a, 0x5f, 0x69, 0x28, 0x3a, 0x8f, 0x25, 0x4e, 0x50,
14339
+	0x49, 0xf2, 0xcc, 0x20, 0x41, 0x40, 0x87, 0xa3, 0x40, 0x1e, 0xcf, 0x69, 0x5c, 0x18, 0x92, 0x67,
14340
+	0x55, 0x25, 0x42, 0xf7, 0x21, 0x7b, 0x64, 0xbb, 0x16, 0x3b, 0x52, 0x27, 0xf0, 0x15, 0x46, 0x15,
14341
+	0x50, 0x3f, 0xe6, 0xa7, 0xee, 0x85, 0x6e, 0x72, 0x7f, 0xb7, 0x3b, 0xed, 0x66, 0xe8, 0x6f, 0x55,
14342
+	0xdf, 0x71, 0xdb, 0xcc, 0xe5, 0x6b, 0x05, 0x3a, 0x6d, 0x63, 0xa3, 0xda, 0xda, 0xda, 0xc1, 0xdc,
14343
+	0xe7, 0xcb, 0xc7, 0x27, 0x65, 0x2d, 0x82, 0x6c, 0x10, 0xdb, 0xe1, 0x94, 0xf0, 0x36, 0xa4, 0xaa,
14344
+	0xed, 0x2f, 0xb5, 0x64, 0x49, 0x3b, 0x3e, 0x29, 0x17, 0xa3, 0xea, 0xaa, 0x3b, 0x99, 0x2e, 0xa3,
14345
+	0x8b, 0xed, 0xea, 0x7f, 0x93, 0x82, 0xe2, 0xce, 0xc8, 0x22, 0x01, 0x95, 0x31, 0x89, 0xca, 0x50,
14346
+	0x18, 0x11, 0x8f, 0x38, 0x0e, 0x75, 0x6c, 0x7f, 0xa8, 0x12, 0x95, 0xb8, 0x08, 0x7d, 0xfc, 0xb2,
14347
+	0x6e, 0xac, 0xe5, 0x78, 0x9c, 0xfd, 0xfe, 0x3f, 0xaf, 0x25, 0x42, 0x87, 0xee, 0xc0, 0xe2, 0x9e,
14348
+	0xec, 0xad, 0x41, 0x4c, 0x31, 0xb1, 0x29, 0x31, 0xb1, 0x95, 0x59, 0x13, 0x1b, 0xef, 0x56, 0x45,
14349
+	0x0d, 0xb2, 0x2a, 0xb4, 0xf0, 0xc2, 0x5e, 0xbc, 0x88, 0x1e, 0xc0, 0xfc, 0x90, 0xb9, 0x76, 0xc0,
14350
+	0xbc, 0xeb, 0x67, 0x21, 0x44, 0xa2, 0xf7, 0xe0, 0x06, 0x9f, 0xdc, 0xb0, 0x3f, 0xa2, 0x5a, 0x9c,
14351
+	0x58, 0x49, 0xbc, 0x34, 0x24, 0xcf, 0x54, 0x83, 0x98, 0x8b, 0x51, 0x0d, 0x32, 0xcc, 0xe3, 0x94,
14352
+	0x28, 0x2b, 0xba, 0xfb, 0xfe, 0xb5, 0xdd, 0x95, 0x85, 0x0e, 0xd7, 0xc1, 0x52, 0x55, 0xff, 0x08,
14353
+	0x16, 0xce, 0x0d, 0x82, 0x33, 0x81, 0x6e, 0x75, 0xa7, 0xd7, 0xd4, 0xe6, 0x50, 0x11, 0x72, 0xf5,
14354
+	0x4e, 0xbb, 0xdf, 0x6a, 0xef, 0x70, 0x2a, 0x53, 0x84, 0x1c, 0xee, 0x6c, 0x6d, 0xd5, 0xaa, 0xf5,
14355
+	0xc7, 0x5a, 0x52, 0xaf, 0x40, 0x21, 0x66, 0x0d, 0x2d, 0x02, 0xf4, 0xfa, 0x9d, 0xae, 0xb1, 0xd1,
14356
+	0xc2, 0xbd, 0xbe, 0x24, 0x42, 0xbd, 0x7e, 0x15, 0xf7, 0x95, 0x20, 0xa1, 0xff, 0x47, 0x32, 0x9c,
14357
+	0x51, 0xc5, 0x7d, 0x6a, 0xe7, 0xb9, 0xcf, 0x15, 0x9d, 0x57, 0xec, 0x67, 0x5a, 0x88, 0x38, 0xd0,
14358
+	0xc7, 0x00, 0x22, 0x70, 0xa8, 0x65, 0x90, 0x40, 0x4d, 0x7c, 0xe9, 0x05, 0x27, 0xf7, 0xc3, 0x7c,
14359
+	0x19, 0xe7, 0x15, 0xba, 0x1a, 0xa0, 0x1f, 0x43, 0xd1, 0x64, 0xc3, 0x91, 0x43, 0x95, 0x72, 0xea,
14360
+	0x5a, 0xe5, 0x42, 0x84, 0xaf, 0x06, 0x71, 0xf6, 0x95, 0x3e, 0xcf, 0x0f, 0x7f, 0x3b, 0x11, 0x7a,
14361
+	0x66, 0x06, 0xe1, 0x2a, 0x42, 0x6e, 0xa7, 0xdb, 0xa8, 0xf6, 0x5b, 0xed, 0x47, 0x5a, 0x02, 0x01,
14362
+	0x64, 0x85, 0xab, 0x1b, 0x5a, 0x92, 0x13, 0xc5, 0x7a, 0x67, 0xbb, 0xbb, 0xd5, 0x14, 0x94, 0x0b,
14363
+	0x2d, 0x83, 0x16, 0x3a, 0xdb, 0x10, 0x8e, 0x6c, 0x36, 0xb4, 0x34, 0xba, 0x09, 0x4b, 0x91, 0x54,
14364
+	0x69, 0x66, 0xd0, 0x2d, 0x40, 0x91, 0x70, 0x6a, 0x22, 0xab, 0xff, 0x06, 0x2c, 0xd5, 0x99, 0x1b,
14365
+	0x10, 0xdb, 0x8d, 0x48, 0xf4, 0x3a, 0x1f, 0xb4, 0x12, 0x19, 0xb6, 0x25, 0xf7, 0xf4, 0xda, 0xd2,
14366
+	0xd9, 0xe9, 0x5a, 0x21, 0x82, 0xb6, 0x1a, 0x7c, 0xa4, 0x61, 0xc1, 0xe2, 0xeb, 0x77, 0x64, 0x5b,
14367
+	0xc2, 0xb9, 0x99, 0xda, 0xfc, 0xd9, 0xe9, 0x5a, 0xaa, 0xdb, 0x6a, 0x60, 0x2e, 0x43, 0xaf, 0x41,
14368
+	0x9e, 0x3e, 0xb3, 0x03, 0xc3, 0xe4, 0x7b, 0x38, 0x77, 0x60, 0x06, 0xe7, 0xb8, 0xa0, 0xce, 0xb7,
14369
+	0xec, 0x1a, 0x40, 0x97, 0x79, 0x81, 0x6a, 0xf9, 0x47, 0x90, 0x19, 0x31, 0x4f, 0x64, 0xb0, 0x97,
14370
+	0xe6, 0xeb, 0x1c, 0x2e, 0x03, 0x15, 0x4b, 0xb0, 0xfe, 0x97, 0x49, 0x80, 0x3e, 0xf1, 0x0f, 0x94,
14371
+	0x91, 0x87, 0x90, 0x8f, 0xee, 0x3e, 0x54, 0x2a, 0x7c, 0xe5, 0x6c, 0x47, 0x60, 0xf4, 0x20, 0x0c,
14372
+	0x36, 0x99, 0x1e, 0xcc, 0x4c, 0x65, 0xc2, 0x86, 0x66, 0x31, 0xec, 0xf3, 0x39, 0x00, 0x3f, 0x12,
14373
+	0xa9, 0xe7, 0xa9, 0x99, 0xe7, 0x9f, 0xa8, 0x2e, 0x8e, 0x05, 0xe9, 0x34, 0x45, 0x30, 0xdf, 0x9c,
14374
+	0xd5, 0xc8, 0x85, 0x19, 0xd9, 0x9c, 0xc3, 0x53, 0x3d, 0xf4, 0x39, 0x14, 0xf8, 0xb8, 0x0d, 0x5f,
14375
+	0xd4, 0x29, 0x6e, 0x79, 0xa9, 0xab, 0xa4, 0x05, 0x0c, 0xa3, 0xe8, 0xbb, 0xa6, 0xc1, 0xa2, 0x37,
14376
+	0x76, 0xf9, 0xb0, 0x95, 0x0d, 0xdd, 0x86, 0x57, 0xdb, 0x34, 0x38, 0x62, 0xde, 0x41, 0x35, 0x08,
14377
+	0x88, 0xb9, 0x3f, 0xa4, 0xae, 0xf2, 0x71, 0x8c, 0x58, 0x27, 0xce, 0x11, 0xeb, 0x15, 0x98, 0x27,
14378
+	0x8e, 0x4d, 0x7c, 0x2a, 0xd9, 0x48, 0x1e, 0x87, 0x45, 0x4e, 0xff, 0x79, 0x32, 0x41, 0x7d, 0x9f,
14379
+	0xca, 0x14, 0x38, 0x8f, 0xa7, 0x02, 0xfd, 0xef, 0x93, 0x00, 0xad, 0x6e, 0x75, 0x5b, 0x99, 0x6f,
14380
+	0x40, 0x76, 0x8f, 0x0c, 0x6d, 0x67, 0x72, 0xd5, 0x02, 0x9f, 0xe2, 0x2b, 0x55, 0x69, 0x68, 0x43,
14381
+	0xe8, 0x60, 0xa5, 0x2b, 0xb2, 0x82, 0xf1, 0xae, 0x4b, 0x83, 0x28, 0x2b, 0x10, 0x25, 0x4e, 0x41,
14382
+	0x3c, 0xe2, 0x46, 0x33, 0x23, 0x0b, 0xbc, 0xeb, 0x03, 0x12, 0xd0, 0x23, 0x32, 0x09, 0x57, 0xa5,
14383
+	0x2a, 0xa2, 0x4d, 0x9e, 0x2d, 0xf8, 0xd4, 0x3b, 0xa4, 0xd6, 0x4a, 0x46, 0x84, 0xe0, 0x75, 0xfd,
14384
+	0xc1, 0x0a, 0x2e, 0xc9, 0x55, 0xa4, 0x5d, 0xfa, 0x54, 0x30, 0x82, 0x69, 0xd5, 0x77, 0x4a, 0xe0,
14385
+	0xef, 0xc1, 0xc2, 0xb9, 0x71, 0xbe, 0x90, 0x8e, 0xb5, 0xba, 0x4f, 0x7e, 0xa4, 0xa5, 0xd5, 0xd7,
14386
+	0x47, 0x5a, 0x56, 0xff, 0xe3, 0x94, 0x5c, 0x47, 0xca, 0xab, 0xb3, 0xaf, 0xd4, 0x72, 0x22, 0xfa,
14387
+	0x4d, 0xe6, 0xa8, 0xf8, 0x7e, 0xfb, 0xea, 0xe5, 0xc5, 0xe9, 0xbd, 0x80, 0xe3, 0x48, 0x11, 0xad,
14388
+	0x41, 0x41, 0xce, 0xbf, 0xc1, 0xe3, 0x49, 0xb8, 0x75, 0x01, 0x83, 0x14, 0x71, 0x4d, 0x74, 0x17,
14389
+	0x16, 0x47, 0xe3, 0x5d, 0xc7, 0xf6, 0xf7, 0xa9, 0x25, 0x31, 0x69, 0x81, 0x59, 0x88, 0xa4, 0x02,
14390
+	0xb6, 0x0d, 0x45, 0x25, 0x30, 0x04, 0xb5, 0xcb, 0x88, 0x0e, 0xbd, 0x77, 0x5d, 0x87, 0xa4, 0x8a,
14391
+	0x60, 0x7c, 0x85, 0xd1, 0xb4, 0xa0, 0x37, 0x20, 0x17, 0x76, 0x16, 0xad, 0x40, 0xaa, 0x5f, 0xef,
14392
+	0x6a, 0x73, 0xa5, 0xa5, 0xe3, 0x93, 0x72, 0x21, 0x14, 0xf7, 0xeb, 0x5d, 0x5e, 0xb3, 0xd3, 0xe8,
14393
+	0x6a, 0x89, 0xf3, 0x35, 0x3b, 0x8d, 0x6e, 0x29, 0xcd, 0x29, 0x86, 0xbe, 0x07, 0x85, 0x58, 0x0b,
14394
+	0xe8, 0x4d, 0x98, 0x6f, 0xb5, 0x1f, 0xe1, 0x66, 0xaf, 0xa7, 0xcd, 0x95, 0x6e, 0x1d, 0x9f, 0x94,
14395
+	0x51, 0xac, 0xb6, 0xe5, 0x0e, 0xf8, 0xfc, 0xa0, 0xd7, 0x21, 0xbd, 0xd9, 0xe1, 0x47, 0x97, 0xe4,
14396
+	0x92, 0x31, 0xc4, 0x26, 0xf3, 0x83, 0xd2, 0x4d, 0xc5, 0x5d, 0xe2, 0x86, 0xf5, 0x3f, 0x48, 0x40,
14397
+	0x56, 0x52, 0xea, 0x99, 0x13, 0x55, 0x85, 0xf9, 0x30, 0xd1, 0x93, 0x3c, 0xff, 0xed, 0xcb, 0x39,
14398
+	0x79, 0x45, 0x51, 0x68, 0x19, 0x7e, 0xa1, 0x5e, 0xe9, 0x13, 0x28, 0xc6, 0x2b, 0xbe, 0x53, 0xf0,
14399
+	0xfd, 0x3a, 0x14, 0x78, 0x7c, 0x87, 0xdc, 0x7c, 0x1d, 0xb2, 0x92, 0xf6, 0x47, 0x5b, 0xe9, 0xe5,
14400
+	0x09, 0x82, 0x42, 0xa2, 0x87, 0x30, 0x2f, 0x93, 0x8a, 0xf0, 0x0a, 0x6c, 0xf5, 0xea, 0x55, 0x84,
14401
+	0x43, 0xb8, 0xfe, 0x39, 0xa4, 0xbb, 0x94, 0x7a, 0xdc, 0xf7, 0x2e, 0xb3, 0xe8, 0xf4, 0xf4, 0x51,
14402
+	0xf9, 0x90, 0x45, 0x5b, 0x0d, 0x9e, 0x0f, 0x59, 0xb4, 0x65, 0x45, 0x37, 0x18, 0xc9, 0xd8, 0x0d,
14403
+	0x46, 0x1f, 0x8a, 0x4f, 0xa9, 0x3d, 0xd8, 0x0f, 0xa8, 0x25, 0x0c, 0xbd, 0x0f, 0xe9, 0x11, 0x8d,
14404
+	0x3a, 0xbf, 0x32, 0x33, 0xc0, 0x28, 0xf5, 0xb0, 0x40, 0xf1, 0x7d, 0xe4, 0x48, 0x68, 0xab, 0x8b,
14405
+	0x57, 0x55, 0xd2, 0xff, 0x2e, 0x09, 0x8b, 0x2d, 0xdf, 0x1f, 0x13, 0xd7, 0x0c, 0x89, 0xc9, 0x67,
14406
+	0xe7, 0x89, 0xc9, 0x3b, 0x33, 0x47, 0x78, 0x4e, 0xe5, 0xfc, 0xc5, 0x8c, 0x3a, 0x1c, 0x92, 0xd1,
14407
+	0xe1, 0xa0, 0xff, 0x7b, 0x22, 0xbc, 0x7d, 0xb9, 0x1b, 0x5b, 0xee, 0xa5, 0x95, 0xe3, 0x93, 0xf2,
14408
+	0x72, 0xdc, 0x12, 0xdd, 0x71, 0x0f, 0x5c, 0x76, 0xe4, 0xa2, 0x37, 0x20, 0x83, 0x9b, 0xed, 0xe6,
14409
+	0x53, 0x2d, 0x21, 0xc3, 0xf3, 0x1c, 0x08, 0x53, 0x97, 0x1e, 0x71, 0x4b, 0xdd, 0x66, 0xbb, 0xc1,
14410
+	0x89, 0x44, 0x72, 0x86, 0xa5, 0x2e, 0x75, 0x2d, 0xdb, 0x1d, 0xa0, 0x37, 0x21, 0xdb, 0xea, 0xf5,
14411
+	0x76, 0x44, 0x7e, 0xfc, 0xea, 0xf1, 0x49, 0xf9, 0xe6, 0x39, 0x14, 0x2f, 0x50, 0x8b, 0x83, 0x38,
14412
+	0x8b, 0xe7, 0x14, 0x63, 0x06, 0x88, 0xd3, 0x43, 0x09, 0xc2, 0x9d, 0x3e, 0x4f, 0xde, 0x33, 0x33,
14413
+	0x40, 0x98, 0xf1, 0xbf, 0x6a, 0xb9, 0xfd, 0x53, 0x12, 0xb4, 0xaa, 0x69, 0xd2, 0x51, 0xc0, 0xeb,
14414
+	0x55, 0xe2, 0xd4, 0x87, 0xdc, 0x88, 0x7f, 0xd9, 0x34, 0x24, 0x01, 0x0f, 0x67, 0x5e, 0xfd, 0x5f,
14415
+	0xd0, 0xab, 0x60, 0xe6, 0xd0, 0xaa, 0x35, 0xb4, 0x7d, 0xdf, 0x66, 0xae, 0x94, 0xe1, 0xc8, 0x52,
14416
+	0xe9, 0x3f, 0x13, 0x70, 0x73, 0x06, 0x02, 0xdd, 0x83, 0xb4, 0xc7, 0x9c, 0x70, 0x0e, 0xef, 0x5c,
14417
+	0x76, 0xb1, 0xc6, 0x55, 0xb1, 0x40, 0xa2, 0x55, 0x00, 0x32, 0x0e, 0x18, 0x11, 0xed, 0x8b, 0xd9,
14418
+	0xcb, 0xe1, 0x98, 0x04, 0x3d, 0x85, 0xac, 0x4f, 0x4d, 0x8f, 0x86, 0x54, 0xf1, 0xf3, 0xff, 0x6b,
14419
+	0xef, 0x2b, 0x3d, 0x61, 0x06, 0x2b, 0x73, 0xa5, 0x0a, 0x64, 0xa5, 0x84, 0x87, 0xbd, 0x45, 0x02,
14420
+	0x22, 0x3a, 0x5d, 0xc4, 0xe2, 0x9b, 0x47, 0x13, 0x71, 0x06, 0x61, 0x34, 0x11, 0x67, 0xa0, 0xff,
14421
+	0x75, 0x12, 0xa0, 0xf9, 0x2c, 0xa0, 0x9e, 0x4b, 0x9c, 0x7a, 0x15, 0x35, 0x63, 0xbb, 0xbf, 0x1c,
14422
+	0xed, 0xbb, 0x33, 0xaf, 0x5b, 0x23, 0x8d, 0x4a, 0xbd, 0x3a, 0x63, 0xff, 0xbf, 0x0d, 0xa9, 0xb1,
14423
+	0xa7, 0x5e, 0x73, 0x24, 0xcd, 0xdb, 0xc1, 0x5b, 0x98, 0xcb, 0x50, 0x73, 0xba, 0x6d, 0xa5, 0x2e,
14424
+	0x7f, 0xb3, 0x89, 0x35, 0x30, 0x73, 0xeb, 0xe2, 0x2b, 0xdf, 0x24, 0x86, 0x49, 0xd5, 0xc9, 0x51,
14425
+	0x94, 0x2b, 0xbf, 0x5e, 0xad, 0x53, 0x2f, 0xc0, 0x59, 0x93, 0xf0, 0xff, 0xdf, 0x6b, 0x7f, 0x7b,
14426
+	0x1f, 0x60, 0x3a, 0x34, 0xb4, 0x0a, 0x99, 0xfa, 0x46, 0xaf, 0xb7, 0xa5, 0xcd, 0xc9, 0x0d, 0x7c,
14427
+	0x5a, 0x25, 0xc4, 0xfa, 0x9f, 0x27, 0x21, 0x57, 0xaf, 0xaa, 0x63, 0xb5, 0x0e, 0x9a, 0xd8, 0x95,
14428
+	0x78, 0xef, 0x0c, 0xfa, 0x6c, 0x64, 0x7b, 0x13, 0xb5, 0xb1, 0x5c, 0x91, 0xb3, 0x2d, 0x72, 0x15,
14429
+	0xde, 0xeb, 0xa6, 0x50, 0x40, 0x18, 0x8a, 0x54, 0x39, 0xc1, 0x30, 0x49, 0xb8, 0xc7, 0xaf, 0x5e,
14430
+	0xed, 0x2c, 0xc9, 0xbe, 0xa7, 0x65, 0x1f, 0x17, 0x42, 0x23, 0x75, 0xe2, 0xa3, 0x8f, 0x61, 0xc9,
14431
+	0xb7, 0x07, 0xae, 0xed, 0x0e, 0x8c, 0xd0, 0x79, 0x29, 0xe1, 0xbc, 0x1b, 0x67, 0xa7, 0x6b, 0x0b,
14432
+	0x3d, 0x59, 0xa5, 0x7c, 0xb8, 0xa0, 0x90, 0x75, 0xe1, 0x4a, 0xf4, 0x11, 0x2c, 0xc6, 0x54, 0xb9,
14433
+	0x17, 0xa5, 0xdb, 0xb5, 0xb3, 0xd3, 0xb5, 0x62, 0xa4, 0xf9, 0x98, 0x4e, 0x70, 0x31, 0x52, 0x7c,
14434
+	0x4c, 0xc5, 0xf5, 0xc2, 0x1e, 0xf3, 0x4c, 0x6a, 0x78, 0x62, 0x4d, 0x8b, 0x13, 0x3c, 0x8d, 0x0b,
14435
+	0x42, 0x26, 0x97, 0xb9, 0xfe, 0x04, 0x6e, 0x76, 0x3c, 0x73, 0x9f, 0xfa, 0x81, 0x74, 0x85, 0xf2,
14436
+	0xe2, 0xe7, 0x70, 0x27, 0x20, 0xfe, 0x81, 0xb1, 0x6f, 0xfb, 0x01, 0xf3, 0x26, 0x86, 0x47, 0x03,
14437
+	0xea, 0xf2, 0x7a, 0x43, 0xbc, 0x48, 0xa9, 0xfb, 0x9f, 0xdb, 0x1c, 0xb3, 0x29, 0x21, 0x38, 0x44,
14438
+	0x6c, 0x71, 0x80, 0xde, 0x82, 0x22, 0x67, 0xe1, 0x0d, 0xba, 0x47, 0xc6, 0x4e, 0xc0, 0x47, 0x0f,
14439
+	0x0e, 0x1b, 0x18, 0x2f, 0x7d, 0x4c, 0xe5, 0x1d, 0x36, 0x90, 0x9f, 0xfa, 0x4f, 0x41, 0x6b, 0xd8,
14440
+	0xfe, 0x88, 0x04, 0xe6, 0x7e, 0x78, 0xb1, 0x85, 0x1a, 0xa0, 0xed, 0x53, 0xe2, 0x05, 0xbb, 0x94,
14441
+	0x04, 0xc6, 0x88, 0x7a, 0x36, 0xb3, 0xae, 0x9f, 0xe5, 0xa5, 0x48, 0xa5, 0x2b, 0x34, 0xf4, 0xff,
14442
+	0x4a, 0x00, 0x60, 0xb2, 0x17, 0x32, 0xb2, 0x1f, 0xc2, 0x0d, 0xdf, 0x25, 0x23, 0x7f, 0x9f, 0x05,
14443
+	0x86, 0xed, 0x06, 0xd4, 0x3b, 0x24, 0x8e, 0xba, 0x9f, 0xd0, 0xc2, 0x8a, 0x96, 0x92, 0xa3, 0xf7,
14444
+	0x01, 0x1d, 0x50, 0x3a, 0x32, 0x98, 0x63, 0x19, 0x61, 0xa5, 0x7c, 0x2f, 0x4b, 0x63, 0x8d, 0xd7,
14445
+	0x74, 0x1c, 0xab, 0x17, 0xca, 0x51, 0x0d, 0x56, 0xf9, 0xf0, 0xa9, 0x1b, 0x78, 0x36, 0xf5, 0x8d,
14446
+	0x3d, 0xe6, 0x19, 0xbe, 0xc3, 0x8e, 0x8c, 0x3d, 0xe6, 0x38, 0xec, 0x88, 0x7a, 0xe1, 0xd5, 0x4f,
14447
+	0xc9, 0x61, 0x83, 0xa6, 0x04, 0x6d, 0x30, 0xaf, 0xe7, 0xb0, 0xa3, 0x8d, 0x10, 0xc1, 0x69, 0xdb,
14448
+	0x74, 0xcc, 0x81, 0x6d, 0x1e, 0x84, 0xb4, 0x2d, 0x92, 0xf6, 0x6d, 0xf3, 0x00, 0xbd, 0x09, 0x0b,
14449
+	0xd4, 0xa1, 0xe2, 0x06, 0x40, 0xa2, 0x32, 0x02, 0x55, 0x0c, 0x85, 0x1c, 0xa4, 0x7f, 0x01, 0x5a,
14450
+	0xd3, 0x35, 0xbd, 0xc9, 0x28, 0x36, 0xe7, 0xef, 0x03, 0xe2, 0x9b, 0xa4, 0xe1, 0x30, 0xf3, 0xc0,
14451
+	0x18, 0x12, 0x97, 0x0c, 0x78, 0xbf, 0xe4, 0x1b, 0x8d, 0xc6, 0x6b, 0xb6, 0x98, 0x79, 0xb0, 0xad,
14452
+	0xe4, 0xfa, 0xc7, 0x00, 0xbd, 0x91, 0x47, 0x89, 0xd5, 0xe1, 0x6c, 0x82, 0xbb, 0x4e, 0x94, 0x0c,
14453
+	0x4b, 0x3d, 0x03, 0x31, 0x4f, 0x2d, 0x75, 0x4d, 0x56, 0x34, 0x22, 0xb9, 0xfe, 0xcb, 0x70, 0xb3,
14454
+	0xeb, 0x10, 0x53, 0x3c, 0x89, 0x76, 0xa3, 0x47, 0x07, 0xf4, 0x10, 0xb2, 0x12, 0xaa, 0x66, 0x72,
14455
+	0xe6, 0x72, 0x9b, 0xb6, 0xb9, 0x39, 0x87, 0x15, 0xbe, 0x56, 0x04, 0x98, 0xda, 0xd1, 0x9f, 0x41,
14456
+	0x3e, 0x32, 0x8f, 0xca, 0xc0, 0x53, 0x60, 0x1e, 0xdd, 0xb6, 0xab, 0x72, 0xd6, 0x3c, 0x8e, 0x8b,
14457
+	0x50, 0x0b, 0x0a, 0xa3, 0x48, 0xf9, 0x4a, 0x3a, 0x37, 0xa3, 0xd3, 0x38, 0xae, 0xab, 0x7f, 0x06,
14458
+	0xf0, 0x13, 0x66, 0xbb, 0x7d, 0x76, 0x40, 0x5d, 0xf1, 0xce, 0xc5, 0xb3, 0x35, 0x1a, 0x3a, 0x42,
14459
+	0x95, 0x44, 0x32, 0x2a, 0xbd, 0x18, 0x3d, 0xf7, 0xc8, 0xa2, 0xfe, 0x57, 0x49, 0xc8, 0x62, 0xc6,
14460
+	0x82, 0x7a, 0x15, 0x95, 0x21, 0xab, 0x96, 0xba, 0x38, 0x42, 0x6a, 0xf9, 0xb3, 0xd3, 0xb5, 0x8c,
14461
+	0x5c, 0xe3, 0x19, 0x53, 0x2c, 0xee, 0xd8, 0x26, 0x9c, 0xbc, 0x6c, 0x13, 0x46, 0xf7, 0xa0, 0xa8,
14462
+	0x40, 0xc6, 0x3e, 0xf1, 0xf7, 0x65, 0x8e, 0x55, 0x5b, 0x3c, 0x3b, 0x5d, 0x03, 0x89, 0xdc, 0x24,
14463
+	0xfe, 0x3e, 0x06, 0x89, 0xe6, 0xdf, 0xa8, 0x09, 0x85, 0xaf, 0x98, 0xed, 0x1a, 0x81, 0x18, 0x84,
14464
+	0xba, 0xee, 0x9a, 0x39, 0x15, 0xd3, 0xa1, 0xaa, 0x77, 0x51, 0xf8, 0x6a, 0x3a, 0xf8, 0x26, 0x2c,
14465
+	0x78, 0x8c, 0x05, 0x72, 0xe7, 0xb1, 0x99, 0xab, 0x32, 0xe9, 0xf2, 0xcc, 0x0b, 0x56, 0xc6, 0x02,
14466
+	0xac, 0x70, 0xb8, 0xe8, 0xc5, 0x4a, 0xe8, 0x1e, 0x2c, 0x3b, 0xc4, 0x0f, 0x0c, 0xb1, 0x65, 0x59,
14467
+	0x53, 0x6b, 0x59, 0xb1, 0x5a, 0x10, 0xaf, 0xdb, 0x10, 0x55, 0xa1, 0x86, 0xfe, 0x0f, 0x09, 0x28,
14468
+	0xf0, 0xc1, 0xd8, 0x7b, 0xb6, 0xc9, 0x79, 0xda, 0x77, 0xa7, 0x0f, 0xb7, 0x21, 0x65, 0xfa, 0x9e,
14469
+	0x72, 0xaa, 0x38, 0x3f, 0xeb, 0x3d, 0x8c, 0xb9, 0x0c, 0x7d, 0x01, 0x59, 0x95, 0xd1, 0x4b, 0xe6,
14470
+	0xa0, 0x5f, 0xcf, 0x28, 0x95, 0x6f, 0x94, 0x9e, 0x88, 0xc7, 0x69, 0xef, 0xe4, 0x3e, 0x8e, 0xe3,
14471
+	0x22, 0x74, 0x0b, 0x92, 0xa6, 0x74, 0x97, 0x7a, 0x78, 0xaf, 0xb7, 0x71, 0xd2, 0x74, 0xf5, 0xbf,
14472
+	0x4d, 0xc0, 0xc2, 0x74, 0xcd, 0xf2, 0x08, 0xb8, 0x03, 0x79, 0x7f, 0xbc, 0xeb, 0x4f, 0xfc, 0x80,
14473
+	0x0e, 0xc3, 0x37, 0xbc, 0x48, 0x80, 0x5a, 0x90, 0x27, 0xce, 0x80, 0x79, 0x76, 0xb0, 0x3f, 0x54,
14474
+	0xc9, 0xe4, 0xec, 0xd3, 0x3e, 0x6e, 0xb3, 0x52, 0x0d, 0x55, 0xf0, 0x54, 0x3b, 0x3c, 0xba, 0xc5,
14475
+	0x71, 0x25, 0x8f, 0xee, 0x37, 0xa0, 0xe8, 0x90, 0xa1, 0xb8, 0xe2, 0x08, 0xec, 0xa1, 0x1c, 0x47,
14476
+	0x1a, 0x17, 0x94, 0xac, 0x6f, 0x0f, 0xa9, 0xae, 0x43, 0x3e, 0x32, 0x86, 0x96, 0xa0, 0x50, 0x6d,
14477
+	0xf6, 0x8c, 0xfb, 0xeb, 0x0f, 0x8d, 0x47, 0xf5, 0x6d, 0x6d, 0x4e, 0xd1, 0xcb, 0x3f, 0x4b, 0xc0,
14478
+	0x82, 0xda, 0x51, 0x14, 0x65, 0x7f, 0x13, 0xe6, 0x3d, 0xb2, 0x17, 0x84, 0x49, 0x45, 0x5a, 0x46,
14479
+	0x35, 0xdf, 0xa4, 0x79, 0x52, 0xc1, 0xab, 0x66, 0x27, 0x15, 0xb1, 0x57, 0xe5, 0xd4, 0x95, 0xaf,
14480
+	0xca, 0xe9, 0xff, 0x97, 0x57, 0x65, 0xfd, 0x4f, 0x92, 0xb0, 0xa4, 0xd8, 0x5f, 0xb4, 0x81, 0xbd,
14481
+	0x0b, 0x79, 0x49, 0x04, 0xa7, 0x29, 0x91, 0x78, 0xc8, 0x94, 0xb8, 0x56, 0x03, 0xe7, 0x64, 0x75,
14482
+	0xcb, 0xe2, 0x39, 0xba, 0x82, 0xc6, 0x7e, 0x23, 0x01, 0x52, 0xd4, 0xe6, 0x09, 0x66, 0x03, 0xd2,
14483
+	0x7b, 0xb6, 0x43, 0x55, 0x9c, 0xcd, 0xbc, 0xbe, 0xbe, 0xd0, 0xbc, 0x78, 0x68, 0xe9, 0x8b, 0x2c,
14484
+	0x7f, 0x73, 0x0e, 0x0b, 0xed, 0xd2, 0x6f, 0x02, 0x4c, 0xa5, 0x33, 0x13, 0x59, 0x4e, 0x16, 0xd5,
14485
+	0x9d, 0x60, 0x48, 0x16, 0x5b, 0x0d, 0xcc, 0x65, 0xbc, 0x6a, 0x60, 0x5b, 0x6a, 0xcb, 0x10, 0x55,
14486
+	0x8f, 0x78, 0xd5, 0xc0, 0xb6, 0xa2, 0xd7, 0x9e, 0xf4, 0x35, 0xaf, 0x3d, 0xb5, 0x5c, 0x78, 0x33,
14487
+	0xa5, 0x6f, 0xc1, 0xad, 0x9a, 0x43, 0xcc, 0x03, 0xc7, 0xf6, 0x03, 0x6a, 0xc5, 0x57, 0xe8, 0x3a,
14488
+	0x64, 0xcf, 0xf1, 0xb4, 0xab, 0x2e, 0x02, 0x15, 0x52, 0xff, 0xb7, 0x04, 0x14, 0x37, 0x29, 0x71,
14489
+	0x82, 0xfd, 0xe9, 0x6d, 0x4a, 0x40, 0xfd, 0x40, 0x6d, 0xf0, 0xe2, 0x1b, 0x7d, 0x08, 0xb9, 0xe8,
14490
+	0x18, 0xbf, 0xf6, 0x45, 0x26, 0x82, 0xa2, 0x07, 0x30, 0xcf, 0x63, 0x9a, 0x8d, 0xc3, 0xfc, 0xe0,
14491
+	0xaa, 0xcb, 0x7e, 0x85, 0xe4, 0x9b, 0xba, 0x47, 0xc5, 0xb9, 0x2d, 0x9c, 0x92, 0xc1, 0x61, 0x11,
14492
+	0xfd, 0x12, 0x14, 0xc5, 0x5d, 0x75, 0x48, 0x53, 0x32, 0xd7, 0xd9, 0x2c, 0xc8, 0xe7, 0x26, 0x49,
14493
+	0x51, 0xfe, 0x27, 0x01, 0xcb, 0xdb, 0x64, 0xb2, 0x4b, 0xd5, 0x32, 0xa5, 0x16, 0xa6, 0x26, 0xf3,
14494
+	0x2c, 0xd4, 0x8d, 0x2f, 0xef, 0x2b, 0x5e, 0xaf, 0x66, 0x29, 0xcf, 0x5e, 0xe5, 0x61, 0xce, 0x92,
14495
+	0x8c, 0xe5, 0x2c, 0xcb, 0x90, 0x71, 0x99, 0x6b, 0x52, 0xb5, 0xf6, 0x65, 0x41, 0xb7, 0xe3, 0x4b,
14496
+	0xbb, 0x14, 0x3d, 0x2c, 0x89, 0x67, 0xa1, 0x36, 0x0b, 0xa2, 0xd6, 0xd0, 0x17, 0x50, 0xea, 0x35,
14497
+	0xeb, 0xb8, 0xd9, 0xaf, 0x75, 0x7e, 0x6a, 0xf4, 0xaa, 0x5b, 0xbd, 0xea, 0xfa, 0x3d, 0xa3, 0xdb,
14498
+	0xd9, 0xfa, 0xf2, 0xfe, 0x83, 0x7b, 0x1f, 0x6a, 0x89, 0x52, 0xf9, 0xf8, 0xa4, 0x7c, 0xa7, 0x5d,
14499
+	0xad, 0x6f, 0xc9, 0x58, 0xde, 0x65, 0xcf, 0x7a, 0xc4, 0xf1, 0xc9, 0xfa, 0xbd, 0x2e, 0x73, 0x26,
14500
+	0x1c, 0xa3, 0x9f, 0x24, 0xa0, 0x18, 0x3f, 0x1f, 0xe2, 0xc7, 0x5e, 0xe2, 0xd2, 0x63, 0x6f, 0x7a,
14501
+	0x7a, 0x26, 0x2f, 0x39, 0x3d, 0x37, 0x60, 0xd9, 0xf4, 0x98, 0xef, 0x1b, 0x9c, 0x30, 0x53, 0xeb,
14502
+	0x02, 0x25, 0x7f, 0xe5, 0xec, 0x74, 0xed, 0x46, 0x9d, 0xd7, 0xf7, 0x44, 0xb5, 0x32, 0x7f, 0xc3,
14503
+	0x8c, 0x89, 0x44, 0x4b, 0xef, 0xfd, 0x22, 0x05, 0xf9, 0xe8, 0xba, 0x99, 0x2f, 0x19, 0x9e, 0xeb,
14504
+	0x2b, 0x57, 0x44, 0xf2, 0x36, 0x3d, 0x42, 0x6f, 0x4c, 0xb3, 0xfc, 0x2f, 0xe4, 0xfb, 0x5a, 0x54,
14505
+	0x1d, 0x66, 0xf8, 0x6f, 0x41, 0xae, 0xda, 0xeb, 0xb5, 0x1e, 0xb5, 0x9b, 0x0d, 0xed, 0xeb, 0x44,
14506
+	0xe9, 0x95, 0xe3, 0x93, 0xf2, 0x8d, 0x08, 0x54, 0xf5, 0x65, 0x4f, 0x05, 0xaa, 0x5e, 0x6f, 0x76,
14507
+	0xfb, 0xcd, 0x86, 0xf6, 0x3c, 0x79, 0x11, 0x25, 0xb2, 0x56, 0xf1, 0x4a, 0x9e, 0xef, 0xe2, 0x66,
14508
+	0xb7, 0x8a, 0x79, 0x83, 0x5f, 0x27, 0xe5, 0xe5, 0xc3, 0xb4, 0x45, 0x8f, 0x8e, 0x88, 0xc7, 0xdb,
14509
+	0x5c, 0x0d, 0x7f, 0x2d, 0xf2, 0x3c, 0x25, 0x5f, 0x52, 0xa7, 0x77, 0xe7, 0x94, 0x58, 0x13, 0xde,
14510
+	0x9a, 0x78, 0xb4, 0x10, 0x66, 0x52, 0x17, 0x5a, 0xeb, 0xf1, 0x40, 0xe5, 0x56, 0x74, 0x98, 0xc7,
14511
+	0x3b, 0xed, 0x36, 0x07, 0x3d, 0x4f, 0x5f, 0x18, 0x1d, 0x1e, 0xbb, 0x3c, 0x23, 0x41, 0x77, 0x21,
14512
+	0x17, 0xbe, 0x69, 0x68, 0x5f, 0xa7, 0x2f, 0x74, 0xa8, 0x1e, 0x3e, 0xc8, 0x88, 0x06, 0x37, 0x77,
14513
+	0xfa, 0xe2, 0xc7, 0x2c, 0xcf, 0x33, 0x17, 0x1b, 0xdc, 0x1f, 0x07, 0x16, 0x3b, 0x72, 0xf9, 0x04,
14514
+	0xab, 0x7b, 0x8e, 0xaf, 0x33, 0x32, 0x29, 0x8c, 0x30, 0xea, 0x92, 0xe3, 0x2d, 0xc8, 0xe1, 0xe6,
14515
+	0x4f, 0xe4, 0xef, 0x5e, 0x9e, 0x67, 0x2f, 0xd8, 0xc1, 0xf4, 0x2b, 0x6a, 0xaa, 0xd6, 0x3a, 0xb8,
14516
+	0xbb, 0x59, 0x15, 0x2e, 0xbf, 0x88, 0xea, 0x78, 0xa3, 0x7d, 0xe2, 0x52, 0x6b, 0xfa, 0x9c, 0x1c,
14517
+	0x55, 0xbd, 0xf7, 0x2b, 0x90, 0x0b, 0x69, 0x03, 0x5a, 0x85, 0xec, 0xd3, 0x0e, 0x7e, 0xdc, 0xc4,
14518
+	0xda, 0x9c, 0xf4, 0x61, 0x58, 0xf3, 0x54, 0x12, 0xbe, 0x32, 0xcc, 0x6f, 0x57, 0xdb, 0xd5, 0x47,
14519
+	0x4d, 0x1c, 0x5e, 0x41, 0x86, 0x00, 0x75, 0xf6, 0x95, 0x34, 0xd5, 0x40, 0x64, 0xb3, 0xb6, 0xf2,
14520
+	0xcd, 0xb7, 0xab, 0x73, 0x3f, 0xff, 0x76, 0x75, 0xee, 0xf9, 0xd9, 0x6a, 0xe2, 0x9b, 0xb3, 0xd5,
14521
+	0xc4, 0xcf, 0xce, 0x56, 0x13, 0xff, 0x72, 0xb6, 0x9a, 0xd8, 0xcd, 0x8a, 0x1d, 0xe3, 0xc1, 0xff,
14522
+	0x06, 0x00, 0x00, 0xff, 0xff, 0x45, 0x07, 0xa3, 0xee, 0x6e, 0x2a, 0x00, 0x00,
14518 14523
 }
... ...
@@ -668,6 +668,21 @@ message CAConfig {
668 668
 	// ExternalCAs is a list of CAs to which a manager node will make
669 669
 	// certificate signing requests for node certificates.
670 670
 	repeated ExternalCA external_cas = 2 [(gogoproto.customname) = "ExternalCAs"];
671
+
672
+	// SigningCACert is the desired CA certificate to be used as the root and
673
+	// signing CA for the swarm.  If not provided, indicates that we are either happy
674
+	// with the current configuration, or (together with a bump in the ForceRotate value)
675
+	// that we want a certificate and key generated for us.
676
+	bytes signing_ca_cert = 3 [(gogoproto.customname) = "SigningCACert"];
677
+
678
+	// SigningCAKey is the desired private key, matching the signing CA cert, to be used
679
+	// to sign certificates for the swarm
680
+	bytes signing_ca_key = 4 [(gogoproto.customname) = "SigningCAKey"];
681
+
682
+	// ForceRotate is a counter that triggers a root CA rotation even if no relevant
683
+	// parameters have been in the spec. This will force the manager to generate a new
684
+	// certificate and key, if none have been provided.
685
+	uint64 force_rotate = 5;
671 686
 }
672 687
 
673 688
 // OrchestrationConfig defines cluster-level orchestration settings.
... ...
@@ -771,6 +786,10 @@ message RootCA {
771 771
 	// RootRotation contains the new root cert and key we want to rotate to - if this is nil, we are not in the
772 772
 	// middle of a root rotation
773 773
 	RootRotation root_rotation = 5;
774
+
775
+	// LastForcedRotation matches the Cluster Spec's CAConfig's ForceRotation counter.
776
+	// It indicates when the current CA cert and key were generated (or updated).
777
+	uint64 last_forced_rotation = 6;
774 778
 }
775 779
 
776 780
 
... ...
@@ -922,5 +941,5 @@ message RootRotation {
922 922
 	bytes ca_cert = 1 [(gogoproto.customname) = "CACert"];
923 923
 	bytes ca_key = 2 [(gogoproto.customname) = "CAKey"];
924 924
 	// cross-signed CA cert is the CACert that has been cross-signed by the previous root
925
-	bytes cross_signed_ca_cert = 3 [(gogoproto.customname) = "CrossSignedCACert"];;
925
+	bytes cross_signed_ca_cert = 3 [(gogoproto.customname) = "CrossSignedCACert"];
926 926
 }
... ...
@@ -244,7 +244,6 @@ func (rca *RootCA) RequestAndSaveNewCertificates(ctx context.Context, kw KeyWrit
244 244
 		// the local connection will not be returned by the connection
245 245
 		// broker anymore.
246 246
 		config.ForceRemote = true
247
-
248 247
 	}
249 248
 	if err != nil {
250 249
 		return nil, err
... ...
@@ -284,9 +283,9 @@ func (rca *RootCA) RequestAndSaveNewCertificates(ctx context.Context, kw KeyWrit
284 284
 	return &tlsKeyPair, nil
285 285
 }
286 286
 
287
-func (rca *RootCA) getKEKUpdate(ctx context.Context, cert *x509.Certificate, keypair tls.Certificate, connBroker *connectionbroker.Broker) (*KEKData, error) {
287
+func (rca *RootCA) getKEKUpdate(ctx context.Context, leafCert *x509.Certificate, keypair tls.Certificate, connBroker *connectionbroker.Broker) (*KEKData, error) {
288 288
 	var managerRole bool
289
-	for _, ou := range cert.Subject.OrganizationalUnit {
289
+	for _, ou := range leafCert.Subject.OrganizationalUnit {
290 290
 		if ou == ManagerRole {
291 291
 			managerRole = true
292 292
 			break
... ...
@@ -773,7 +772,6 @@ func GetRemoteSignedCertificate(ctx context.Context, csr []byte, rootCAPool *x50
773 773
 	if rootCAPool == nil {
774 774
 		return nil, errors.New("valid root CA pool required")
775 775
 	}
776
-
777 776
 	creds := config.Credentials
778 777
 
779 778
 	if creds == nil {
... ...
@@ -810,17 +808,29 @@ func GetRemoteSignedCertificate(ctx context.Context, csr []byte, rootCAPool *x50
810 810
 
811 811
 	// Exponential backoff with Max of 30 seconds to wait for a new retry
812 812
 	for {
813
+		timeout := 5 * time.Second
814
+		if config.NodeCertificateStatusRequestTimeout > 0 {
815
+			timeout = config.NodeCertificateStatusRequestTimeout
816
+		}
813 817
 		// Send the Request and retrieve the certificate
814
-		ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
818
+		stateCtx, cancel := context.WithTimeout(ctx, timeout)
815 819
 		defer cancel()
816
-		statusResponse, err := caClient.NodeCertificateStatus(ctx, statusRequest)
817
-		if err != nil {
820
+		statusResponse, err := caClient.NodeCertificateStatus(stateCtx, statusRequest)
821
+		switch {
822
+		case err != nil && grpc.Code(err) != codes.DeadlineExceeded:
818 823
 			conn.Close(false)
819
-			return nil, err
820
-		}
824
+			// Because IssueNodeCertificate succeeded, if this call failed likely it is due to an issue with this
825
+			// particular connection, so we need to get another.  We should try a remote connection - the local node
826
+			// may be a manager that was demoted, so the local connection (which is preferred) may not work.
827
+			config.ForceRemote = true
828
+			conn, err = getGRPCConnection(creds, config.ConnBroker, config.ForceRemote)
829
+			if err != nil {
830
+				return nil, err
831
+			}
832
+			caClient = api.NewNodeCAClient(conn.ClientConn)
821 833
 
822
-		// If the certificate was issued, return
823
-		if statusResponse.Status.State == api.IssuanceStateIssued {
834
+		// If there was no deadline exceeded error, and the certificate was issued, return
835
+		case err == nil && statusResponse.Status.State == api.IssuanceStateIssued:
824 836
 			if statusResponse.Certificate == nil {
825 837
 				conn.Close(false)
826 838
 				return nil, errors.New("no certificate in CertificateStatus response")
... ...
@@ -837,10 +847,15 @@ func GetRemoteSignedCertificate(ctx context.Context, csr []byte, rootCAPool *x50
837 837
 			}
838 838
 		}
839 839
 
840
-		// If we're still pending, the issuance failed, or the state is unknown
841
-		// let's continue trying.
840
+		// If NodeCertificateStatus timed out, we're still pending, the issuance failed, or
841
+		// the state is unknown let's continue trying after an exponential backoff
842 842
 		expBackoff.Failure(nil, nil)
843
-		time.Sleep(expBackoff.Proceed(nil))
843
+		select {
844
+		case <-ctx.Done():
845
+			conn.Close(true)
846
+			return nil, err
847
+		case <-time.After(expBackoff.Proceed(nil)):
848
+		}
844 849
 	}
845 850
 }
846 851
 
... ...
@@ -350,6 +350,9 @@ type CertificateRequestConfig struct {
350 350
 	// where the local node is running a manager, but is in the process of
351 351
 	// being demoted.
352 352
 	ForceRemote bool
353
+	// NodeCertificateStatusRequestTimeout determines how long to wait for a node
354
+	// status RPC result.  If not provided (zero value), will default to 5 seconds.
355
+	NodeCertificateStatusRequestTimeout time.Duration
353 356
 }
354 357
 
355 358
 // CreateSecurityConfig creates a new key and cert for this node, either locally
... ...
@@ -11,6 +11,7 @@ import (
11 11
 	"io/ioutil"
12 12
 	"net/http"
13 13
 	"sync"
14
+	"time"
14 15
 
15 16
 	"github.com/Sirupsen/logrus"
16 17
 	"github.com/cloudflare/cfssl/api"
... ...
@@ -29,6 +30,8 @@ var ErrNoExternalCAURLs = errors.New("no external CA URLs")
29 29
 // ExternalCA is able to make certificate signing requests to one of a list
30 30
 // remote CFSSL API endpoints.
31 31
 type ExternalCA struct {
32
+	ExternalRequestTimeout time.Duration
33
+
32 34
 	mu     sync.Mutex
33 35
 	rootCA *RootCA
34 36
 	urls   []string
... ...
@@ -39,8 +42,9 @@ type ExternalCA struct {
39 39
 // authenticate to any of the given URLS of CFSSL API endpoints.
40 40
 func NewExternalCA(rootCA *RootCA, tlsConfig *tls.Config, urls ...string) *ExternalCA {
41 41
 	return &ExternalCA{
42
-		rootCA: rootCA,
43
-		urls:   urls,
42
+		ExternalRequestTimeout: 5 * time.Second,
43
+		rootCA:                 rootCA,
44
+		urls:                   urls,
44 45
 		client: &http.Client{
45 46
 			Transport: &http.Transport{
46 47
 				TLSClientConfig: tlsConfig,
... ...
@@ -49,6 +53,19 @@ func NewExternalCA(rootCA *RootCA, tlsConfig *tls.Config, urls ...string) *Exter
49 49
 	}
50 50
 }
51 51
 
52
+// Copy returns a copy of the external CA that can be updated independently
53
+func (eca *ExternalCA) Copy() *ExternalCA {
54
+	eca.mu.Lock()
55
+	defer eca.mu.Unlock()
56
+
57
+	return &ExternalCA{
58
+		ExternalRequestTimeout: eca.ExternalRequestTimeout,
59
+		rootCA:                 eca.rootCA,
60
+		urls:                   eca.urls,
61
+		client:                 eca.client,
62
+	}
63
+}
64
+
52 65
 // UpdateTLSConfig updates the HTTP Client for this ExternalCA by creating
53 66
 // a new client which uses the given tlsConfig.
54 67
 func (eca *ExternalCA) UpdateTLSConfig(tlsConfig *tls.Config) {
... ...
@@ -93,7 +110,9 @@ func (eca *ExternalCA) Sign(ctx context.Context, req signer.SignRequest) (cert [
93 93
 	// Try each configured proxy URL. Return after the first success. If
94 94
 	// all fail then the last error will be returned.
95 95
 	for _, url := range urls {
96
-		cert, err = makeExternalSignRequest(ctx, client, url, csrJSON)
96
+		requestCtx, cancel := context.WithTimeout(ctx, eca.ExternalRequestTimeout)
97
+		cert, err = makeExternalSignRequest(requestCtx, client, url, csrJSON)
98
+		cancel()
97 99
 		if err == nil {
98 100
 			return append(cert, eca.rootCA.Intermediates...), err
99 101
 		}
... ...
@@ -12,7 +12,6 @@ import (
12 12
 	"github.com/docker/swarmkit/api/equality"
13 13
 	"github.com/docker/swarmkit/identity"
14 14
 	"github.com/docker/swarmkit/log"
15
-	"github.com/docker/swarmkit/manager/state"
16 15
 	"github.com/docker/swarmkit/manager/state/store"
17 16
 	gogotypes "github.com/gogo/protobuf/types"
18 17
 	"github.com/pkg/errors"
... ...
@@ -129,7 +128,7 @@ func (s *Server) NodeCertificateStatus(ctx context.Context, request *api.NodeCer
129 129
 
130 130
 	event := api.EventUpdateNode{
131 131
 		Node:   &api.Node{ID: request.NodeID},
132
-		Checks: []api.NodeCheckFunc{state.NodeCheckID},
132
+		Checks: []api.NodeCheckFunc{api.NodeCheckID},
133 133
 	}
134 134
 
135 135
 	// Retrieve the current value of the certificate with this token, and create a watcher
... ...
@@ -542,7 +541,6 @@ func (s *Server) UpdateRootCA(ctx context.Context, cluster *api.Cluster) error {
542 542
 
543 543
 	s.secConfigMu.Lock()
544 544
 	defer s.secConfigMu.Unlock()
545
-	var err error
546 545
 	rCA := cluster.RootCA
547 546
 	rootCAChanged := len(rCA.CACert) != 0 && !equality.RootCAEqualStable(s.lastSeenClusterRootCA, &cluster.RootCA)
548 547
 	externalCAChanged := !equality.ExternalCAsEqualStable(s.lastSeenExternalCAs, cluster.Spec.CAConfig.ExternalCAs)
... ...
@@ -565,7 +563,7 @@ func (s *Server) UpdateRootCA(ctx context.Context, cluster *api.Cluster) error {
565 565
 			}
566 566
 		} else {
567 567
 			// NodeCertExpiry seems to be nil
568
-			logger.WithError(err).Warn("failed to parse certificate expiration, using default")
568
+			logger.Warn("no certificate expiration specified, using default")
569 569
 		}
570 570
 		// Attempt to update our local RootCA with the new parameters
571 571
 		var intermediates []byte
... ...
@@ -291,7 +291,7 @@ func (a *Allocator) doNetworkAlloc(ctx context.Context, ev events.Event) {
291 291
 	case api.EventDeleteNetwork:
292 292
 		n := v.Network.Copy()
293 293
 
294
-		if IsIngressNetwork(n) && nc.ingressNetwork.ID == n.ID {
294
+		if IsIngressNetwork(n) && nc.ingressNetwork != nil && nc.ingressNetwork.ID == n.ID {
295 295
 			nc.ingressNetwork = nil
296 296
 			if err := a.deallocateNodes(ctx); err != nil {
297 297
 				log.G(ctx).WithError(err).Error(err)
... ...
@@ -591,7 +591,7 @@ func (a *Allocator) taskCreateNetworkAttachments(t *api.Task, s *api.Service) {
591 591
 	}
592 592
 
593 593
 	var networks []*api.NetworkAttachment
594
-	if IsIngressNetworkNeeded(s) {
594
+	if IsIngressNetworkNeeded(s) && a.netCtx.ingressNetwork != nil {
595 595
 		networks = append(networks, &api.NetworkAttachment{Network: a.netCtx.ingressNetwork})
596 596
 	}
597 597
 
... ...
@@ -804,7 +804,7 @@ func (a *Allocator) allocateService(ctx context.Context, s *api.Service) error {
804 804
 	// If the service doesn't expose ports any more and if we have
805 805
 	// any lingering virtual IP references for ingress network
806 806
 	// clean them up here.
807
-	if !IsIngressNetworkNeeded(s) {
807
+	if !IsIngressNetworkNeeded(s) && nc.ingressNetwork != nil {
808 808
 		if s.Endpoint != nil {
809 809
 			for i, vip := range s.Endpoint.VirtualIPs {
810 810
 				if vip.NetworkID == nc.ingressNetwork.ID {
... ...
@@ -9,6 +9,7 @@ import (
9 9
 	"github.com/docker/libnetwork/driverapi"
10 10
 	"github.com/docker/libnetwork/drvregistry"
11 11
 	"github.com/docker/libnetwork/ipamapi"
12
+	"github.com/docker/libnetwork/netlabel"
12 13
 	"github.com/docker/swarmkit/api"
13 14
 	"github.com/docker/swarmkit/log"
14 15
 	"github.com/pkg/errors"
... ...
@@ -773,7 +774,7 @@ func (na *NetworkAllocator) allocatePools(n *api.Network) (map[string]string, er
773 773
 	}
774 774
 
775 775
 	for i, ic := range ipamConfigs {
776
-		poolID, poolIP, _, err := ipam.RequestPool(asName, ic.Subnet, ic.Range, dOptions, false)
776
+		poolID, poolIP, meta, err := ipam.RequestPool(asName, ic.Subnet, ic.Range, dOptions, false)
777 777
 		if err != nil {
778 778
 			// Rollback by releasing all the resources allocated so far.
779 779
 			releasePools(ipam, ipamConfigs[:i], pools)
... ...
@@ -781,11 +782,29 @@ func (na *NetworkAllocator) allocatePools(n *api.Network) (map[string]string, er
781 781
 		}
782 782
 		pools[poolIP.String()] = poolID
783 783
 
784
-		gwIP, _, err := ipam.RequestAddress(poolID, net.ParseIP(ic.Gateway), nil)
785
-		if err != nil {
786
-			// Rollback by releasing all the resources allocated so far.
787
-			releasePools(ipam, ipamConfigs[:i], pools)
788
-			return nil, err
784
+		// The IPAM contract allows the IPAM driver to autonomously
785
+		// provide a network gateway in response to the pool request.
786
+		// But if the network spec contains a gateway, we will allocate
787
+		// it irrespective of whether the ipam driver returned one already.
788
+		// If none of the above is true, we need to allocate one now, and
789
+		// let the driver know this request is for the network gateway.
790
+		var (
791
+			gwIP *net.IPNet
792
+			ip   net.IP
793
+		)
794
+		if gws, ok := meta[netlabel.Gateway]; ok {
795
+			if ip, gwIP, err = net.ParseCIDR(gws); err != nil {
796
+				return nil, fmt.Errorf("failed to parse gateway address (%v) returned by ipam driver: %v", gws, err)
797
+			}
798
+			gwIP.IP = ip
799
+		}
800
+		if ic.Gateway != "" || gwIP == nil {
801
+			gwIP, _, err = ipam.RequestAddress(poolID, net.ParseIP(ic.Gateway), map[string]string{ipamapi.RequestAddressType: netlabel.Gateway})
802
+			if err != nil {
803
+				// Rollback by releasing all the resources allocated so far.
804
+				releasePools(ipam, ipamConfigs[:i], pools)
805
+				return nil, err
806
+			}
789 807
 		}
790 808
 
791 809
 		if ic.Subnet == "" {
792 810
new file mode 100644
... ...
@@ -0,0 +1,265 @@
0
+package controlapi
1
+
2
+import (
3
+	"bytes"
4
+	"context"
5
+	"crypto/tls"
6
+	"crypto/x509"
7
+	"errors"
8
+	"net"
9
+	"net/url"
10
+	"time"
11
+
12
+	"google.golang.org/grpc"
13
+	"google.golang.org/grpc/codes"
14
+
15
+	"github.com/cloudflare/cfssl/helpers"
16
+	"github.com/docker/swarmkit/api"
17
+	"github.com/docker/swarmkit/ca"
18
+	"github.com/docker/swarmkit/log"
19
+)
20
+
21
+var minRootExpiration = 1 * helpers.OneYear
22
+
23
+// determines whether an api.RootCA, api.RootRotation, or api.CAConfig has a signing key (local signer)
24
+func hasSigningKey(a interface{}) bool {
25
+	switch b := a.(type) {
26
+	case api.RootCA:
27
+		return len(b.CAKey) > 0
28
+	case *api.RootRotation:
29
+		return b != nil && len(b.CAKey) > 0
30
+	case api.CAConfig:
31
+		return len(b.SigningCACert) > 0 && len(b.SigningCAKey) > 0
32
+	default:
33
+		panic("needsExternalCAs should be called something of type api.RootCA, *api.RootRotation, or api.CAConfig")
34
+	}
35
+}
36
+
37
+// Creates a cross-signed intermediate and new api.RootRotation object.
38
+// This function assumes that the root cert and key and the external CAs have already been validated.
39
+func newRootRotationObject(ctx context.Context, securityConfig *ca.SecurityConfig, cluster *api.Cluster, newRootCA ca.RootCA, version uint64) (*api.RootCA, error) {
40
+	var (
41
+		rootCert, rootKey, crossSignedCert []byte
42
+		newRootHasSigner                   bool
43
+		err                                error
44
+	)
45
+
46
+	rootCert = newRootCA.Certs
47
+	if s, err := newRootCA.Signer(); err == nil {
48
+		rootCert, rootKey = s.Cert, s.Key
49
+		newRootHasSigner = true
50
+	}
51
+
52
+	// we have to sign with the original signer, not whatever is in the SecurityConfig's RootCA (which may have an intermediate signer, if
53
+	// a root rotation is already in progress)
54
+	switch {
55
+	case hasSigningKey(cluster.RootCA):
56
+		var oldRootCA ca.RootCA
57
+		oldRootCA, err = ca.NewRootCA(cluster.RootCA.CACert, cluster.RootCA.CACert, cluster.RootCA.CAKey, ca.DefaultNodeCertExpiration, nil)
58
+		if err == nil {
59
+			crossSignedCert, err = oldRootCA.CrossSignCACertificate(rootCert)
60
+		}
61
+	case !newRootHasSigner: // the original CA and the new CA both require external CAs
62
+		return nil, grpc.Errorf(codes.InvalidArgument, "rotating from one external CA to a different external CA is not supported")
63
+	default:
64
+		// We need the same credentials but to connect to the original URLs (in case we are in the middle of a root rotation already)
65
+		externalCA := securityConfig.ExternalCA().Copy()
66
+		var urls []string
67
+		for _, c := range cluster.Spec.CAConfig.ExternalCAs {
68
+			if c.Protocol == api.ExternalCA_CAProtocolCFSSL && bytes.Equal(c.CACert, cluster.RootCA.CACert) {
69
+				urls = append(urls, c.URL)
70
+			}
71
+		}
72
+		if len(urls) == 0 {
73
+			return nil, grpc.Errorf(codes.InvalidArgument,
74
+				"must provide an external CA for the current external root CA to generate a cross-signed certificate")
75
+		}
76
+		externalCA.UpdateURLs(urls...)
77
+		crossSignedCert, err = externalCA.CrossSignRootCA(ctx, newRootCA)
78
+	}
79
+
80
+	if err != nil {
81
+		log.G(ctx).WithError(err).Error("unable to generate a cross-signed certificate for root rotation")
82
+		return nil, grpc.Errorf(codes.Internal, "unable to generate a cross-signed certificate for root rotation")
83
+	}
84
+
85
+	copied := cluster.RootCA.Copy()
86
+	copied.RootRotation = &api.RootRotation{
87
+		CACert:            rootCert,
88
+		CAKey:             rootKey,
89
+		CrossSignedCACert: crossSignedCert,
90
+	}
91
+	copied.LastForcedRotation = version
92
+	return copied, nil
93
+}
94
+
95
+// Checks that a CA URL is connectable using the credentials we have and that its server certificate is signed by the
96
+// root CA that we expect.  This uses a TCP dialer rather than an HTTP client; because we have custom TLS configuration,
97
+// if we wanted to use an HTTP client we'd have to create a new transport for every connection.  The docs specify that
98
+// Transports cache connections for future re-use, which could cause many open connections.
99
+func validateExternalCAURL(dialer *net.Dialer, tlsOpts *tls.Config, caURL string) error {
100
+	parsed, err := url.Parse(caURL)
101
+	if err != nil {
102
+		return err
103
+	}
104
+	if parsed.Scheme != "https" {
105
+		return errors.New("invalid HTTP scheme")
106
+	}
107
+	host, port, err := net.SplitHostPort(parsed.Host)
108
+	if err != nil {
109
+		// It either has no port or is otherwise invalid (e.g. too many colons).  If it's otherwise invalid the dialer
110
+		// will error later, so just assume it's no port and set the port to the default HTTPS port.
111
+		host = parsed.Host
112
+		port = "443"
113
+	}
114
+
115
+	conn, err := tls.DialWithDialer(dialer, "tcp", net.JoinHostPort(host, port), tlsOpts)
116
+	if conn != nil {
117
+		conn.Close()
118
+	}
119
+	return err
120
+}
121
+
122
+// Iterates over all the external CAs, and validates that there is at least 1 reachable, valid external CA for the
123
+// given CA certificate.  Returns true if there is, false otherwise.
124
+func hasAtLeastOneExternalCA(ctx context.Context, externalCAs []*api.ExternalCA, securityConfig *ca.SecurityConfig, wantedCert []byte) bool {
125
+	pool := x509.NewCertPool()
126
+	pool.AppendCertsFromPEM(wantedCert)
127
+	dialer := net.Dialer{Timeout: 5 * time.Second}
128
+	opts := tls.Config{
129
+		RootCAs:      pool,
130
+		Certificates: securityConfig.ClientTLSCreds.Config().Certificates,
131
+	}
132
+	for i, ca := range externalCAs {
133
+		if ca.Protocol == api.ExternalCA_CAProtocolCFSSL && bytes.Equal(wantedCert, ca.CACert) {
134
+			err := validateExternalCAURL(&dialer, &opts, ca.URL)
135
+			if err == nil {
136
+				return true
137
+			}
138
+			log.G(ctx).WithError(err).Warnf("external CA # %d is unreachable or invalid", i+1)
139
+		}
140
+	}
141
+	return false
142
+}
143
+
144
+// All new external CA definitions must include the CA cert associated with the external CA.
145
+// If the current root CA requires an external CA, then at least one, reachable valid external CA must be provided that
146
+// corresponds with the current RootCA's certificate.
147
+//
148
+// Similarly for the desired CA certificate, if one is specified.  Similarly for the current outstanding root CA rotation,
149
+// if one is specified and will not be replaced with the desired CA.
150
+func validateHasRequiredExternalCAs(ctx context.Context, securityConfig *ca.SecurityConfig, cluster *api.Cluster) error {
151
+	config := cluster.Spec.CAConfig
152
+	for _, ca := range config.ExternalCAs {
153
+		if len(ca.CACert) == 0 {
154
+			return grpc.Errorf(codes.InvalidArgument, "must specify CA certificate for each external CA")
155
+		}
156
+	}
157
+
158
+	if !hasSigningKey(cluster.RootCA) && !hasAtLeastOneExternalCA(ctx, config.ExternalCAs, securityConfig, cluster.RootCA.CACert) {
159
+		return grpc.Errorf(codes.InvalidArgument, "there must be at least one valid, reachable external CA corresponding to the current CA certificate")
160
+	}
161
+
162
+	if len(config.SigningCACert) > 0 { // a signing cert is specified
163
+		if !hasSigningKey(config) && !hasAtLeastOneExternalCA(ctx, config.ExternalCAs, securityConfig, config.SigningCACert) {
164
+			return grpc.Errorf(codes.InvalidArgument, "there must be at least one valid, reachable external CA corresponding to the desired CA certificate")
165
+		}
166
+	} else if config.ForceRotate == cluster.RootCA.LastForcedRotation && cluster.RootCA.RootRotation != nil {
167
+		// no cert is specified but force rotation hasn't changed (so we are happy with the current configuration) and there's an outstanding root rotation
168
+		if !hasSigningKey(cluster.RootCA.RootRotation) && !hasAtLeastOneExternalCA(ctx, config.ExternalCAs, securityConfig, cluster.RootCA.RootRotation.CACert) {
169
+			return grpc.Errorf(codes.InvalidArgument, "there must be at least one valid, reachable external CA corresponding to the next CA certificate")
170
+		}
171
+	}
172
+
173
+	return nil
174
+}
175
+
176
+// validateAndUpdateCA validates a cluster's desired CA configuration spec, and returns a RootCA value on success representing
177
+// current RootCA as it should be.  Validation logic and return values are as follows:
178
+// 1. Validates that the contents are complete - e.g. a signing key is not provided without a signing cert, and that external
179
+//    CAs are not removed if they are needed.  Otherwise, returns an error.
180
+// 2. If no desired signing cert or key are provided, then either:
181
+//    - we are happy with the current CA configuration (force rotation value has not changed), and we return the current RootCA
182
+//      object as is
183
+//    - we want to generate a new internal CA cert and key (force rotation value has changed), and we return the updated RootCA
184
+//      object
185
+// 3. Signing cert and key have been provided: validate that these match (the cert and key match). Otherwise, return an error.
186
+// 4. Return the updated RootCA object according to the following criteria:
187
+//    - If the desired cert is the same as the current CA cert then abort any outstanding rotations. The current signing key
188
+//      is replaced with the desired signing key (this could lets us switch between external->internal or internal->external
189
+//      without an actual CA rotation, which is not needed because any leaf cert issued with one CA cert can be validated using
190
+//       the second CA certificate).
191
+//    - If the desired cert is the same as the current to-be-rotated-to CA cert then a new root rotation is not needed. The
192
+//      current to-be-rotated-to signing key is replaced with the desired signing key (this could lets us switch between
193
+//      external->internal or internal->external without an actual CA rotation, which is not needed because any leaf cert
194
+//      issued with one CA cert can be validated using the second CA certificate).
195
+//    - Otherwise, start a new root rotation using the desired signing cert and desired signing key as the root rotation
196
+//      signing cert and key.  If a root rotation is already in progress, just replace it and start over.
197
+func validateCAConfig(ctx context.Context, securityConfig *ca.SecurityConfig, cluster *api.Cluster) (*api.RootCA, error) {
198
+	newConfig := cluster.Spec.CAConfig
199
+
200
+	if len(newConfig.SigningCAKey) > 0 && len(newConfig.SigningCACert) == 0 {
201
+		return nil, grpc.Errorf(codes.InvalidArgument, "if a signing CA key is provided, the signing CA cert must also be provided")
202
+	}
203
+
204
+	if err := validateHasRequiredExternalCAs(ctx, securityConfig, cluster); err != nil {
205
+		return nil, err
206
+	}
207
+
208
+	// if the desired CA cert and key are not set, then we are happy with the current root CA configuration, unless
209
+	// the ForceRotate version has changed
210
+	if len(newConfig.SigningCACert) == 0 {
211
+		if cluster.RootCA.LastForcedRotation != newConfig.ForceRotate {
212
+			newRootCA, err := ca.CreateRootCA(ca.DefaultRootCN)
213
+			if err != nil {
214
+				return nil, grpc.Errorf(codes.Internal, err.Error())
215
+			}
216
+			return newRootRotationObject(ctx, securityConfig, cluster, newRootCA, newConfig.ForceRotate)
217
+		}
218
+		return &cluster.RootCA, nil // no change, return as is
219
+	}
220
+
221
+	// A desired cert and maybe key were provided - we need to make sure the cert and key (if provided) match.
222
+	var signingCert []byte
223
+	if hasSigningKey(newConfig) {
224
+		signingCert = newConfig.SigningCACert
225
+	}
226
+	newRootCA, err := ca.NewRootCA(newConfig.SigningCACert, signingCert, newConfig.SigningCAKey, ca.DefaultNodeCertExpiration, nil)
227
+	if err != nil {
228
+		return nil, grpc.Errorf(codes.InvalidArgument, err.Error())
229
+	}
230
+
231
+	if len(newRootCA.Pool.Subjects()) != 1 {
232
+		return nil, grpc.Errorf(codes.InvalidArgument, "the desired CA certificate cannot contain multiple certificates")
233
+	}
234
+
235
+	parsedCert, err := helpers.ParseCertificatePEM(newConfig.SigningCACert)
236
+	if err != nil {
237
+		return nil, grpc.Errorf(codes.InvalidArgument, "could not parse the desired CA certificate")
238
+	}
239
+
240
+	// The new certificate's expiry must be at least one year away
241
+	if parsedCert.NotAfter.Before(time.Now().Add(minRootExpiration)) {
242
+		return nil, grpc.Errorf(codes.InvalidArgument, "CA certificate expires too soon")
243
+	}
244
+
245
+	// check if we can abort any existing root rotations
246
+	if bytes.Equal(cluster.RootCA.CACert, cluster.Spec.CAConfig.SigningCACert) {
247
+		copied := cluster.RootCA.Copy()
248
+		copied.CAKey = newConfig.SigningCAKey
249
+		copied.RootRotation = nil
250
+		copied.LastForcedRotation = newConfig.ForceRotate
251
+		return copied, nil
252
+	}
253
+
254
+	// check if this is the same desired cert as an existing root rotation
255
+	if r := cluster.RootCA.RootRotation; r != nil && bytes.Equal(r.CACert, cluster.Spec.CAConfig.SigningCACert) {
256
+		copied := cluster.RootCA.Copy()
257
+		copied.RootRotation.CAKey = newConfig.SigningCAKey
258
+		copied.LastForcedRotation = newConfig.ForceRotate
259
+		return copied, nil
260
+	}
261
+
262
+	// ok, everything's different; we have to begin a new root rotation which means generating a new cross-signed cert
263
+	return newRootRotationObject(ctx, securityConfig, cluster, newRootCA, newConfig.ForceRotate)
264
+}
... ...
@@ -103,7 +103,6 @@ func (s *Server) UpdateCluster(ctx context.Context, request *api.UpdateClusterRe
103 103
 		cluster = store.GetCluster(tx, request.ClusterID)
104 104
 		if cluster == nil {
105 105
 			return grpc.Errorf(codes.NotFound, "cluster %s not found", request.ClusterID)
106
-
107 106
 		}
108 107
 		// This ensures that we always have the latest security config, so our ca.SecurityConfig.RootCA and
109 108
 		// ca.SecurityConfig.externalCA objects are up-to-date with the current api.Cluster.RootCA and
... ...
@@ -129,6 +128,12 @@ func (s *Server) UpdateCluster(ctx context.Context, request *api.UpdateClusterRe
129 129
 			cluster.RootCA.JoinTokens.Manager = ca.GenerateJoinToken(rootCA)
130 130
 		}
131 131
 
132
+		updatedRootCA, err := validateCAConfig(ctx, s.securityConfig, cluster)
133
+		if err != nil {
134
+			return err
135
+		}
136
+		cluster.RootCA = *updatedRootCA
137
+
132 138
 		var unlockKeys []*api.EncryptionKey
133 139
 		var managerKey *api.EncryptionKey
134 140
 		for _, eKey := range cluster.UnlockKeys {
... ...
@@ -239,19 +244,22 @@ func redactClusters(clusters []*api.Cluster) []*api.Cluster {
239 239
 	// Only add public fields to the new clusters
240 240
 	for _, cluster := range clusters {
241 241
 		// Copy all the mandatory fields
242
-		// Do not copy secret key
242
+		// Do not copy secret keys
243
+		redactedSpec := cluster.Spec.Copy()
244
+		redactedSpec.CAConfig.SigningCAKey = nil
245
+
246
+		redactedRootCA := cluster.RootCA.Copy()
247
+		redactedRootCA.CAKey = nil
248
+		if r := redactedRootCA.RootRotation; r != nil {
249
+			r.CAKey = nil
250
+		}
243 251
 		newCluster := &api.Cluster{
244
-			ID:   cluster.ID,
245
-			Meta: cluster.Meta,
246
-			Spec: cluster.Spec,
247
-			RootCA: api.RootCA{
248
-				CACert:     cluster.RootCA.CACert,
249
-				CACertHash: cluster.RootCA.CACertHash,
250
-				JoinTokens: cluster.RootCA.JoinTokens,
251
-			},
252
+			ID:                      cluster.ID,
253
+			Meta:                    cluster.Meta,
254
+			Spec:                    *redactedSpec,
255
+			RootCA:                  *redactedRootCA,
252 256
 			BlacklistedCertificates: cluster.BlacklistedCertificates,
253 257
 		}
254
-
255 258
 		redactedClusters = append(redactedClusters, newCluster)
256 259
 	}
257 260
 
... ...
@@ -10,6 +10,7 @@ import (
10 10
 
11 11
 	"github.com/docker/distribution/reference"
12 12
 	"github.com/docker/swarmkit/api"
13
+	"github.com/docker/swarmkit/api/defaults"
13 14
 	"github.com/docker/swarmkit/api/naming"
14 15
 	"github.com/docker/swarmkit/identity"
15 16
 	"github.com/docker/swarmkit/manager/allocator"
... ...
@@ -525,6 +526,10 @@ func (s *Server) GetService(ctx context.Context, request *api.GetServiceRequest)
525 525
 		return nil, grpc.Errorf(codes.NotFound, "service %s not found", request.ServiceID)
526 526
 	}
527 527
 
528
+	if request.InsertDefaults {
529
+		service.Spec = *defaults.InterpolateService(&service.Spec)
530
+	}
531
+
528 532
 	return &api.GetServiceResponse{
529 533
 		Service: service,
530 534
 	}, nil
... ...
@@ -17,7 +17,6 @@ import (
17 17
 	"github.com/docker/swarmkit/api/equality"
18 18
 	"github.com/docker/swarmkit/ca"
19 19
 	"github.com/docker/swarmkit/log"
20
-	"github.com/docker/swarmkit/manager/state"
21 20
 	"github.com/docker/swarmkit/manager/state/store"
22 21
 	"github.com/docker/swarmkit/remotes"
23 22
 	"github.com/docker/swarmkit/watch"
... ...
@@ -702,11 +701,11 @@ func (d *Dispatcher) Tasks(r *api.TasksRequest, stream api.Dispatcher_TasksServe
702 702
 			return nil
703 703
 		},
704 704
 		api.EventCreateTask{Task: &api.Task{NodeID: nodeID},
705
-			Checks: []api.TaskCheckFunc{state.TaskCheckNodeID}},
705
+			Checks: []api.TaskCheckFunc{api.TaskCheckNodeID}},
706 706
 		api.EventUpdateTask{Task: &api.Task{NodeID: nodeID},
707
-			Checks: []api.TaskCheckFunc{state.TaskCheckNodeID}},
707
+			Checks: []api.TaskCheckFunc{api.TaskCheckNodeID}},
708 708
 		api.EventDeleteTask{Task: &api.Task{NodeID: nodeID},
709
-			Checks: []api.TaskCheckFunc{state.TaskCheckNodeID}},
709
+			Checks: []api.TaskCheckFunc{api.TaskCheckNodeID}},
710 710
 	)
711 711
 	if err != nil {
712 712
 		return err
... ...
@@ -916,9 +915,9 @@ func (d *Dispatcher) Assignments(r *api.AssignmentsRequest, stream api.Dispatche
916 916
 			return nil
917 917
 		},
918 918
 		api.EventUpdateTask{Task: &api.Task{NodeID: nodeID},
919
-			Checks: []api.TaskCheckFunc{state.TaskCheckNodeID}},
919
+			Checks: []api.TaskCheckFunc{api.TaskCheckNodeID}},
920 920
 		api.EventDeleteTask{Task: &api.Task{NodeID: nodeID},
921
-			Checks: []api.TaskCheckFunc{state.TaskCheckNodeID}},
921
+			Checks: []api.TaskCheckFunc{api.TaskCheckNodeID}},
922 922
 		api.EventUpdateSecret{},
923 923
 		api.EventDeleteSecret{},
924 924
 	)
... ...
@@ -1337,7 +1336,7 @@ func (d *Dispatcher) Session(r *api.SessionRequest, stream api.Dispatcher_Sessio
1337 1337
 		nodeObj = store.GetNode(readTx, nodeID)
1338 1338
 		return nil
1339 1339
 	}, api.EventUpdateNode{Node: &api.Node{ID: nodeID},
1340
-		Checks: []api.NodeCheckFunc{state.NodeCheckID}},
1340
+		Checks: []api.NodeCheckFunc{api.NodeCheckID}},
1341 1341
 	)
1342 1342
 	if cancel != nil {
1343 1343
 		defer cancel()
... ...
@@ -33,9 +33,9 @@ import (
33 33
 	"github.com/docker/swarmkit/manager/orchestrator/taskreaper"
34 34
 	"github.com/docker/swarmkit/manager/resourceapi"
35 35
 	"github.com/docker/swarmkit/manager/scheduler"
36
-	"github.com/docker/swarmkit/manager/state"
37 36
 	"github.com/docker/swarmkit/manager/state/raft"
38 37
 	"github.com/docker/swarmkit/manager/state/store"
38
+	"github.com/docker/swarmkit/manager/storeapi"
39 39
 	"github.com/docker/swarmkit/remotes"
40 40
 	"github.com/docker/swarmkit/xnet"
41 41
 	gogotypes "github.com/gogo/protobuf/types"
... ...
@@ -390,11 +390,13 @@ func (m *Manager) Run(parent context.Context) error {
390 390
 	}
391 391
 
392 392
 	baseControlAPI := controlapi.NewServer(m.raftNode.MemoryStore(), m.raftNode, m.config.SecurityConfig, m.caserver, m.config.PluginGetter)
393
+	baseStoreAPI := storeapi.NewServer(m.raftNode.MemoryStore())
393 394
 	baseResourceAPI := resourceapi.New(m.raftNode.MemoryStore())
394 395
 	healthServer := health.NewHealthServer()
395 396
 	localHealthServer := health.NewHealthServer()
396 397
 
397 398
 	authenticatedControlAPI := api.NewAuthenticatedWrapperControlServer(baseControlAPI, authorize)
399
+	authenticatedStoreAPI := api.NewAuthenticatedWrapperStoreServer(baseStoreAPI, authorize)
398 400
 	authenticatedResourceAPI := api.NewAuthenticatedWrapperResourceAllocatorServer(baseResourceAPI, authorize)
399 401
 	authenticatedLogsServerAPI := api.NewAuthenticatedWrapperLogsServer(m.logbroker, authorize)
400 402
 	authenticatedLogBrokerAPI := api.NewAuthenticatedWrapperLogBrokerServer(m.logbroker, authorize)
... ...
@@ -444,6 +446,7 @@ func (m *Manager) Run(parent context.Context) error {
444 444
 		return context.WithValue(ctx, ca.LocalRequestKey, nodeInfo), nil
445 445
 	}
446 446
 	localProxyControlAPI := api.NewRaftProxyControlServer(baseControlAPI, m.raftNode, handleRequestLocally, forwardAsOwnRequest)
447
+	localProxyStoreAPI := api.NewRaftProxyStoreServer(baseStoreAPI, m.raftNode, handleRequestLocally, forwardAsOwnRequest)
447 448
 	localProxyLogsAPI := api.NewRaftProxyLogsServer(m.logbroker, m.raftNode, handleRequestLocally, forwardAsOwnRequest)
448 449
 	localProxyDispatcherAPI := api.NewRaftProxyDispatcherServer(m.dispatcher, m.raftNode, handleRequestLocally, forwardAsOwnRequest)
449 450
 	localProxyCAAPI := api.NewRaftProxyCAServer(m.caserver, m.raftNode, handleRequestLocally, forwardAsOwnRequest)
... ...
@@ -459,6 +462,7 @@ func (m *Manager) Run(parent context.Context) error {
459 459
 	api.RegisterHealthServer(m.server, authenticatedHealthAPI)
460 460
 	api.RegisterRaftMembershipServer(m.server, proxyRaftMembershipAPI)
461 461
 	api.RegisterControlServer(m.server, authenticatedControlAPI)
462
+	api.RegisterStoreServer(m.server, authenticatedStoreAPI)
462 463
 	api.RegisterLogsServer(m.server, authenticatedLogsServerAPI)
463 464
 	api.RegisterLogBrokerServer(m.server, proxyLogBrokerAPI)
464 465
 	api.RegisterResourceAllocatorServer(m.server, proxyResourceAPI)
... ...
@@ -466,6 +470,7 @@ func (m *Manager) Run(parent context.Context) error {
466 466
 	grpc_prometheus.Register(m.server)
467 467
 
468 468
 	api.RegisterControlServer(m.localserver, localProxyControlAPI)
469
+	api.RegisterStoreServer(m.localserver, localProxyStoreAPI)
469 470
 	api.RegisterLogsServer(m.localserver, localProxyLogsAPI)
470 471
 	api.RegisterHealthServer(m.localserver, localHealthServer)
471 472
 	api.RegisterDispatcherServer(m.localserver, localProxyDispatcherAPI)
... ...
@@ -695,7 +700,7 @@ func (m *Manager) watchForClusterChanges(ctx context.Context) error {
695 695
 		},
696 696
 		api.EventUpdateCluster{
697 697
 			Cluster: &api.Cluster{ID: clusterID},
698
-			Checks:  []api.ClusterCheckFunc{state.ClusterCheckID},
698
+			Checks:  []api.ClusterCheckFunc{api.ClusterCheckID},
699 699
 		},
700 700
 	)
701 701
 	if err != nil {
... ...
@@ -8,6 +8,7 @@ import (
8 8
 
9 9
 	"github.com/docker/go-events"
10 10
 	"github.com/docker/swarmkit/api"
11
+	"github.com/docker/swarmkit/api/defaults"
11 12
 	"github.com/docker/swarmkit/log"
12 13
 	"github.com/docker/swarmkit/manager/orchestrator"
13 14
 	"github.com/docker/swarmkit/manager/state"
... ...
@@ -159,10 +160,10 @@ func (r *Supervisor) Restart(ctx context.Context, tx store.Tx, cluster *api.Clus
159 159
 			restartDelay, err = gogotypes.DurationFromProto(t.Spec.Restart.Delay)
160 160
 			if err != nil {
161 161
 				log.G(ctx).WithError(err).Error("invalid restart delay; using default")
162
-				restartDelay = orchestrator.DefaultRestartDelay
162
+				restartDelay, _ = gogotypes.DurationFromProto(defaults.Service.Task.Restart.Delay)
163 163
 			}
164 164
 		} else {
165
-			restartDelay = orchestrator.DefaultRestartDelay
165
+			restartDelay, _ = gogotypes.DurationFromProto(defaults.Service.Task.Restart.Delay)
166 166
 		}
167 167
 	}
168 168
 
... ...
@@ -329,15 +330,15 @@ func (r *Supervisor) DelayStart(ctx context.Context, _ store.Tx, oldTask *api.Ta
329 329
 			r.store.WatchQueue(),
330 330
 			api.EventUpdateTask{
331 331
 				Task:   &api.Task{ID: oldTask.ID, Status: api.TaskStatus{State: api.TaskStateRunning}},
332
-				Checks: []api.TaskCheckFunc{state.TaskCheckID, state.TaskCheckStateGreaterThan},
332
+				Checks: []api.TaskCheckFunc{api.TaskCheckID, state.TaskCheckStateGreaterThan},
333 333
 			},
334 334
 			api.EventUpdateNode{
335 335
 				Node:   &api.Node{ID: oldTask.NodeID, Status: api.NodeStatus{State: api.NodeStatus_DOWN}},
336
-				Checks: []api.NodeCheckFunc{state.NodeCheckID, state.NodeCheckState},
336
+				Checks: []api.NodeCheckFunc{api.NodeCheckID, state.NodeCheckState},
337 337
 			},
338 338
 			api.EventDeleteNode{
339 339
 				Node:   &api.Node{ID: oldTask.NodeID},
340
-				Checks: []api.NodeCheckFunc{state.NodeCheckID},
340
+				Checks: []api.NodeCheckFunc{api.NodeCheckID},
341 341
 			},
342 342
 		)
343 343
 	}
... ...
@@ -9,10 +9,6 @@ import (
9 9
 	"github.com/docker/swarmkit/protobuf/ptypes"
10 10
 )
11 11
 
12
-// DefaultRestartDelay is the restart delay value to use when none is
13
-// specified.
14
-const DefaultRestartDelay = 5 * time.Second
15
-
16 12
 // NewTask creates a new task.
17 13
 func NewTask(cluster *api.Cluster, service *api.Service, slot uint64, nodeID string) *api.Task {
18 14
 	var logDriver *api.Driver
... ...
@@ -4,8 +4,8 @@ import (
4 4
 	"time"
5 5
 
6 6
 	"github.com/docker/swarmkit/api"
7
+	"github.com/docker/swarmkit/api/defaults"
7 8
 	"github.com/docker/swarmkit/log"
8
-	"github.com/docker/swarmkit/manager/orchestrator"
9 9
 	"github.com/docker/swarmkit/manager/orchestrator/restart"
10 10
 	"github.com/docker/swarmkit/manager/state/store"
11 11
 	gogotypes "github.com/gogo/protobuf/types"
... ...
@@ -55,13 +55,13 @@ func CheckTasks(ctx context.Context, s *store.MemoryStore, readTx store.ReadTx,
55 55
 			if t.DesiredState != api.TaskStateReady || t.Status.State > api.TaskStateRunning {
56 56
 				continue
57 57
 			}
58
-			restartDelay := orchestrator.DefaultRestartDelay
58
+			restartDelay, _ := gogotypes.DurationFromProto(defaults.Service.Task.Restart.Delay)
59 59
 			if t.Spec.Restart != nil && t.Spec.Restart.Delay != nil {
60 60
 				var err error
61 61
 				restartDelay, err = gogotypes.DurationFromProto(t.Spec.Restart.Delay)
62 62
 				if err != nil {
63 63
 					log.G(ctx).WithError(err).Error("invalid restart delay")
64
-					restartDelay = orchestrator.DefaultRestartDelay
64
+					restartDelay, _ = gogotypes.DurationFromProto(defaults.Service.Task.Restart.Delay)
65 65
 				}
66 66
 			}
67 67
 			if restartDelay != 0 {
... ...
@@ -11,6 +11,7 @@ import (
11 11
 
12 12
 	"github.com/docker/go-events"
13 13
 	"github.com/docker/swarmkit/api"
14
+	"github.com/docker/swarmkit/api/defaults"
14 15
 	"github.com/docker/swarmkit/log"
15 16
 	"github.com/docker/swarmkit/manager/orchestrator"
16 17
 	"github.com/docker/swarmkit/manager/orchestrator/restart"
... ...
@@ -21,8 +22,6 @@ import (
21 21
 	gogotypes "github.com/gogo/protobuf/types"
22 22
 )
23 23
 
24
-const defaultMonitor = 5 * time.Second
25
-
26 24
 // Supervisor supervises a set of updates. It's responsible for keeping track of updates,
27 25
 // shutting them down and replacing them.
28 26
 type Supervisor struct {
... ...
@@ -156,14 +155,12 @@ func (u *Updater) Run(ctx context.Context, slots []orchestrator.Slot) {
156 156
 		u.startUpdate(ctx, service.ID)
157 157
 	}
158 158
 
159
-	var (
160
-		parallelism            = 1
161
-		delay                  time.Duration
162
-		failureAction          = api.UpdateConfig_PAUSE
163
-		allowedFailureFraction = float32(0)
164
-		monitoringPeriod       = defaultMonitor
165
-		order                  = api.UpdateConfig_STOP_FIRST
166
-	)
159
+	delay := defaults.Service.Update.Delay
160
+	parallelism := int(defaults.Service.Update.Parallelism)
161
+	failureAction := defaults.Service.Update.FailureAction
162
+	allowedFailureFraction := defaults.Service.Update.MaxFailureRatio
163
+	monitoringPeriod, _ := gogotypes.DurationFromProto(defaults.Service.Update.Monitor)
164
+	order := defaults.Service.Update.Order
167 165
 
168 166
 	updateConfig := service.Spec.Update
169 167
 	if service.UpdateStatus != nil && service.UpdateStatus.State == api.UpdateStatus_ROLLBACK_STARTED {
... ...
@@ -181,7 +178,7 @@ func (u *Updater) Run(ctx context.Context, slots []orchestrator.Slot) {
181 181
 		if updateConfig.Monitor != nil {
182 182
 			monitoringPeriod, err = gogotypes.DurationFromProto(updateConfig.Monitor)
183 183
 			if err != nil {
184
-				monitoringPeriod = defaultMonitor
184
+				monitoringPeriod, _ = gogotypes.DurationFromProto(defaults.Service.Update.Monitor)
185 185
 			}
186 186
 		}
187 187
 	}
... ...
@@ -211,7 +208,7 @@ func (u *Updater) Run(ctx context.Context, slots []orchestrator.Slot) {
211 211
 			u.store.WatchQueue(),
212 212
 			api.EventUpdateTask{
213 213
 				Task:   &api.Task{ServiceID: service.ID, Status: api.TaskStatus{State: api.TaskStateRunning}},
214
-				Checks: []api.TaskCheckFunc{state.TaskCheckServiceID, state.TaskCheckStateGreaterThan},
214
+				Checks: []api.TaskCheckFunc{api.TaskCheckServiceID, state.TaskCheckStateGreaterThan},
215 215
 			},
216 216
 		)
217 217
 		defer cancelWatch()
... ...
@@ -368,7 +365,7 @@ func (u *Updater) updateTask(ctx context.Context, slot orchestrator.Slot, update
368 368
 	// Kick off the watch before even creating the updated task. This is in order to avoid missing any event.
369 369
 	taskUpdates, cancel := state.Watch(u.watchQueue, api.EventUpdateTask{
370 370
 		Task:   &api.Task{ID: updated.ID},
371
-		Checks: []api.TaskCheckFunc{state.TaskCheckID},
371
+		Checks: []api.TaskCheckFunc{api.TaskCheckID},
372 372
 	})
373 373
 	defer cancel()
374 374
 
... ...
@@ -5,6 +5,13 @@ import (
5 5
 	"golang.org/x/net/context"
6 6
 )
7 7
 
8
+// A Change includes a version number and a set of store actions from a
9
+// particular log entry.
10
+type Change struct {
11
+	StoreActions []api.StoreAction
12
+	Version      api.Version
13
+}
14
+
8 15
 // A Proposer can propose actions to a cluster.
9 16
 type Proposer interface {
10 17
 	// ProposeValue adds storeAction to the distributed log. If this
... ...
@@ -13,5 +20,11 @@ type Proposer interface {
13 13
 	// sure that the changes are committed before it interacts further
14 14
 	// with the store.
15 15
 	ProposeValue(ctx context.Context, storeAction []api.StoreAction, cb func()) error
16
+	// GetVersion returns the monotonic index of the most recent item in
17
+	// the distributed log.
16 18
 	GetVersion() *api.Version
19
+	// ChangesBetween returns the changes starting after "from", up to and
20
+	// including "to". If these changes are not available because the log
21
+	// has been compacted, an error will be returned.
22
+	ChangesBetween(from, to api.Version) ([]Change, error)
17 23
 }
... ...
@@ -9,22 +9,17 @@ import (
9 9
 	"sync/atomic"
10 10
 	"time"
11 11
 
12
-	"google.golang.org/grpc"
13
-	"google.golang.org/grpc/codes"
14
-	"google.golang.org/grpc/credentials"
15
-	"google.golang.org/grpc/peer"
16
-
17
-	"golang.org/x/net/context"
18
-
19 12
 	"github.com/Sirupsen/logrus"
20 13
 	"github.com/coreos/etcd/pkg/idutil"
21 14
 	"github.com/coreos/etcd/raft"
22 15
 	"github.com/coreos/etcd/raft/raftpb"
16
+	"github.com/docker/docker/pkg/signal"
23 17
 	"github.com/docker/go-events"
24 18
 	"github.com/docker/swarmkit/api"
25 19
 	"github.com/docker/swarmkit/ca"
26 20
 	"github.com/docker/swarmkit/log"
27 21
 	"github.com/docker/swarmkit/manager/raftselector"
22
+	"github.com/docker/swarmkit/manager/state"
28 23
 	"github.com/docker/swarmkit/manager/state/raft/membership"
29 24
 	"github.com/docker/swarmkit/manager/state/raft/storage"
30 25
 	"github.com/docker/swarmkit/manager/state/raft/transport"
... ...
@@ -33,6 +28,12 @@ import (
33 33
 	"github.com/gogo/protobuf/proto"
34 34
 	"github.com/pivotal-golang/clock"
35 35
 	"github.com/pkg/errors"
36
+	"golang.org/x/net/context"
37
+	"golang.org/x/time/rate"
38
+	"google.golang.org/grpc"
39
+	"google.golang.org/grpc/codes"
40
+	"google.golang.org/grpc/credentials"
41
+	"google.golang.org/grpc/peer"
36 42
 )
37 43
 
38 44
 var (
... ...
@@ -170,8 +171,10 @@ type NodeOptions struct {
170 170
 	// nodes. Leave this as 0 to get the default value.
171 171
 	SendTimeout    time.Duration
172 172
 	TLSCredentials credentials.TransportCredentials
173
-
174
-	KeyRotator EncryptionKeyRotator
173
+	KeyRotator     EncryptionKeyRotator
174
+	// DisableStackDump prevents Run from dumping goroutine stacks when the
175
+	// store becomes stuck.
176
+	DisableStackDump bool
175 177
 }
176 178
 
177 179
 func init() {
... ...
@@ -519,6 +522,7 @@ func (n *Node) Run(ctx context.Context) error {
519 519
 	}()
520 520
 
521 521
 	wasLeader := false
522
+	transferLeadershipLimit := rate.NewLimiter(rate.Every(time.Minute), 1)
522 523
 
523 524
 	for {
524 525
 		select {
... ...
@@ -532,6 +536,22 @@ func (n *Node) Run(ctx context.Context) error {
532 532
 				return errors.Wrap(err, "failed to save entries to storage")
533 533
 			}
534 534
 
535
+			if wasLeader &&
536
+				(rd.SoftState == nil || rd.SoftState.RaftState == raft.StateLeader) &&
537
+				n.memoryStore.Wedged() &&
538
+				transferLeadershipLimit.Allow() {
539
+				if !n.opts.DisableStackDump {
540
+					signal.DumpStacks("")
541
+				}
542
+				transferee, err := n.transport.LongestActive()
543
+				if err != nil {
544
+					log.G(ctx).WithError(err).Error("failed to get longest-active member")
545
+				} else {
546
+					log.G(ctx).Error("data store lock held too long - transferring leadership")
547
+					n.raftNode.TransferLeadership(ctx, n.Config.ID, transferee)
548
+				}
549
+			}
550
+
535 551
 			for _, msg := range rd.Messages {
536 552
 				// Send raft messages to peers
537 553
 				if err := n.transport.Send(msg); err != nil {
... ...
@@ -1434,6 +1454,52 @@ func (n *Node) GetVersion() *api.Version {
1434 1434
 	return &api.Version{Index: status.Commit}
1435 1435
 }
1436 1436
 
1437
+// ChangesBetween returns the changes starting after "from", up to and
1438
+// including "to". If these changes are not available because the log
1439
+// has been compacted, an error will be returned.
1440
+func (n *Node) ChangesBetween(from, to api.Version) ([]state.Change, error) {
1441
+	n.stopMu.RLock()
1442
+	defer n.stopMu.RUnlock()
1443
+
1444
+	if from.Index > to.Index {
1445
+		return nil, errors.New("versions are out of order")
1446
+	}
1447
+
1448
+	if !n.IsMember() {
1449
+		return nil, ErrNoRaftMember
1450
+	}
1451
+
1452
+	// never returns error
1453
+	last, _ := n.raftStore.LastIndex()
1454
+
1455
+	if to.Index > last {
1456
+		return nil, errors.New("last version is out of bounds")
1457
+	}
1458
+
1459
+	pbs, err := n.raftStore.Entries(from.Index+1, to.Index+1, math.MaxUint64)
1460
+	if err != nil {
1461
+		return nil, err
1462
+	}
1463
+
1464
+	var changes []state.Change
1465
+	for _, pb := range pbs {
1466
+		if pb.Type != raftpb.EntryNormal || pb.Data == nil {
1467
+			continue
1468
+		}
1469
+		r := &api.InternalRaftRequest{}
1470
+		err := proto.Unmarshal(pb.Data, r)
1471
+		if err != nil {
1472
+			return nil, errors.Wrap(err, "error umarshalling internal raft request")
1473
+		}
1474
+
1475
+		if r.Action != nil {
1476
+			changes = append(changes, state.Change{StoreActions: r.Action, Version: api.Version{Index: pb.Index}})
1477
+		}
1478
+	}
1479
+
1480
+	return changes, nil
1481
+}
1482
+
1437 1483
 // SubscribePeers subscribes to peer updates in cluster. It sends always full
1438 1484
 // list of peers.
1439 1485
 func (n *Node) SubscribePeers() (q chan events.Event, cancel func()) {
... ...
@@ -18,16 +18,16 @@ func init() {
18 18
 				indexID: {
19 19
 					Name:    indexID,
20 20
 					Unique:  true,
21
-					Indexer: api.ExtensionIndexerByID{},
21
+					Indexer: extensionIndexerByID{},
22 22
 				},
23 23
 				indexName: {
24 24
 					Name:    indexName,
25 25
 					Unique:  true,
26
-					Indexer: api.ExtensionIndexerByName{},
26
+					Indexer: extensionIndexerByName{},
27 27
 				},
28 28
 				indexCustom: {
29 29
 					Name:         indexCustom,
30
-					Indexer:      api.ExtensionCustomIndexer{},
30
+					Indexer:      extensionCustomIndexer{},
31 31
 					AllowMissing: true,
32 32
 				},
33 33
 			},
... ...
@@ -76,6 +76,10 @@ type extensionEntry struct {
76 76
 	*api.Extension
77 77
 }
78 78
 
79
+func (e extensionEntry) CopyStoreObject() api.StoreObject {
80
+	return extensionEntry{Extension: e.Extension.Copy()}
81
+}
82
+
79 83
 // CreateExtension adds a new extension to the store.
80 84
 // Returns ErrExist if the ID is already taken.
81 85
 func CreateExtension(tx Tx, e *api.Extension) error {
... ...
@@ -148,3 +152,39 @@ func FindExtensions(tx ReadTx, by By) ([]*api.Extension, error) {
148 148
 	err := tx.find(tableExtension, by, checkType, appendResult)
149 149
 	return extensionList, err
150 150
 }
151
+
152
+type extensionIndexerByID struct{}
153
+
154
+func (indexer extensionIndexerByID) FromArgs(args ...interface{}) ([]byte, error) {
155
+	return api.ExtensionIndexerByID{}.FromArgs(args...)
156
+}
157
+func (indexer extensionIndexerByID) PrefixFromArgs(args ...interface{}) ([]byte, error) {
158
+	return api.ExtensionIndexerByID{}.PrefixFromArgs(args...)
159
+}
160
+func (indexer extensionIndexerByID) FromObject(obj interface{}) (bool, []byte, error) {
161
+	return api.ExtensionIndexerByID{}.FromObject(obj.(extensionEntry).Extension)
162
+}
163
+
164
+type extensionIndexerByName struct{}
165
+
166
+func (indexer extensionIndexerByName) FromArgs(args ...interface{}) ([]byte, error) {
167
+	return api.ExtensionIndexerByName{}.FromArgs(args...)
168
+}
169
+func (indexer extensionIndexerByName) PrefixFromArgs(args ...interface{}) ([]byte, error) {
170
+	return api.ExtensionIndexerByName{}.PrefixFromArgs(args...)
171
+}
172
+func (indexer extensionIndexerByName) FromObject(obj interface{}) (bool, []byte, error) {
173
+	return api.ExtensionIndexerByName{}.FromObject(obj.(extensionEntry).Extension)
174
+}
175
+
176
+type extensionCustomIndexer struct{}
177
+
178
+func (indexer extensionCustomIndexer) FromArgs(args ...interface{}) ([]byte, error) {
179
+	return api.ExtensionCustomIndexer{}.FromArgs(args...)
180
+}
181
+func (indexer extensionCustomIndexer) PrefixFromArgs(args ...interface{}) ([]byte, error) {
182
+	return api.ExtensionCustomIndexer{}.PrefixFromArgs(args...)
183
+}
184
+func (indexer extensionCustomIndexer) FromObject(obj interface{}) (bool, [][]byte, error) {
185
+	return api.ExtensionCustomIndexer{}.FromObject(obj.(extensionEntry).Extension)
186
+}
... ...
@@ -7,6 +7,7 @@ import (
7 7
 	"strconv"
8 8
 	"strings"
9 9
 	"sync"
10
+	"sync/atomic"
10 11
 	"time"
11 12
 
12 13
 	"github.com/docker/go-events"
... ...
@@ -70,6 +71,10 @@ var (
70 70
 		Tables: map[string]*memdb.TableSchema{},
71 71
 	}
72 72
 	errUnknownStoreAction = errors.New("unknown store action")
73
+
74
+	// WedgeTimeout is the maximum amount of time the store lock may be
75
+	// held before declaring a suspected deadlock.
76
+	WedgeTimeout = 30 * time.Second
73 77
 )
74 78
 
75 79
 func register(os ObjectStoreConfig) {
... ...
@@ -77,11 +82,36 @@ func register(os ObjectStoreConfig) {
77 77
 	schema.Tables[os.Table.Name] = os.Table
78 78
 }
79 79
 
80
+// timedMutex wraps a sync.Mutex, and keeps track of how long it has been
81
+// locked.
82
+type timedMutex struct {
83
+	sync.Mutex
84
+	lockedAt atomic.Value
85
+}
86
+
87
+func (m *timedMutex) Lock() {
88
+	m.Mutex.Lock()
89
+	m.lockedAt.Store(time.Now())
90
+}
91
+
92
+func (m *timedMutex) Unlock() {
93
+	m.Mutex.Unlock()
94
+	m.lockedAt.Store(time.Time{})
95
+}
96
+
97
+func (m *timedMutex) LockedAt() time.Time {
98
+	lockedTimestamp := m.lockedAt.Load()
99
+	if lockedTimestamp == nil {
100
+		return time.Time{}
101
+	}
102
+	return lockedTimestamp.(time.Time)
103
+}
104
+
80 105
 // MemoryStore is a concurrency-safe, in-memory implementation of the Store
81 106
 // interface.
82 107
 type MemoryStore struct {
83 108
 	// updateLock must be held during an update transaction.
84
-	updateLock sync.Mutex
109
+	updateLock timedMutex
85 110
 
86 111
 	memDB *memdb.MemDB
87 112
 	queue *watch.Queue
... ...
@@ -180,6 +210,33 @@ type tx struct {
180 180
 	changelist []api.Event
181 181
 }
182 182
 
183
+// changelistBetweenVersions returns the changes after "from" up to and
184
+// including "to".
185
+func (s *MemoryStore) changelistBetweenVersions(from, to api.Version) ([]api.Event, error) {
186
+	if s.proposer == nil {
187
+		return nil, errors.New("store does not support versioning")
188
+	}
189
+	changes, err := s.proposer.ChangesBetween(from, to)
190
+	if err != nil {
191
+		return nil, err
192
+	}
193
+
194
+	var changelist []api.Event
195
+
196
+	for _, change := range changes {
197
+		for _, sa := range change.StoreActions {
198
+			event, err := api.EventFromStoreAction(sa, nil)
199
+			if err != nil {
200
+				return nil, err
201
+			}
202
+			changelist = append(changelist, event)
203
+		}
204
+		changelist = append(changelist, state.EventCommit{Version: change.Version.Copy()})
205
+	}
206
+
207
+	return changelist, nil
208
+}
209
+
183 210
 // ApplyStoreActions updates a store based on StoreAction messages.
184 211
 func (s *MemoryStore) ApplyStoreActions(actions []api.StoreAction) error {
185 212
 	s.updateLock.Lock()
... ...
@@ -261,7 +318,11 @@ func (s *MemoryStore) update(proposer state.Proposer, cb func(Tx) error) error {
261 261
 			s.queue.Publish(c)
262 262
 		}
263 263
 		if len(tx.changelist) != 0 {
264
-			s.queue.Publish(state.EventCommit{})
264
+			if proposer != nil {
265
+				curVersion = proposer.GetVersion()
266
+			}
267
+
268
+			s.queue.Publish(state.EventCommit{Version: curVersion})
265 269
 		}
266 270
 	} else {
267 271
 		memDBTx.Abort()
... ...
@@ -498,7 +559,7 @@ func (tx *tx) update(table string, o api.StoreObject) error {
498 498
 
499 499
 	err := tx.memDBTx.Insert(table, copy)
500 500
 	if err == nil {
501
-		tx.changelist = append(tx.changelist, copy.EventUpdate())
501
+		tx.changelist = append(tx.changelist, copy.EventUpdate(oldN))
502 502
 		o.SetMeta(meta)
503 503
 	}
504 504
 	return err
... ...
@@ -755,6 +816,91 @@ func ViewAndWatch(store *MemoryStore, cb func(ReadTx) error, specifiers ...api.E
755 755
 	return
756 756
 }
757 757
 
758
+// WatchFrom returns a channel that will return past events from starting
759
+// from "version", and new events until the channel is closed. If "version"
760
+// is nil, this function is equivalent to
761
+//
762
+//     state.Watch(store.WatchQueue(), specifiers...).
763
+//
764
+// If the log has been compacted and it's not possible to produce the exact
765
+// set of events leading from "version" to the current state, this function
766
+// will return an error, and the caller should re-sync.
767
+//
768
+// The watch channel must be released with watch.StopWatch when it is no
769
+// longer needed.
770
+func WatchFrom(store *MemoryStore, version *api.Version, specifiers ...api.Event) (chan events.Event, func(), error) {
771
+	if version == nil {
772
+		ch, cancel := state.Watch(store.WatchQueue(), specifiers...)
773
+		return ch, cancel, nil
774
+	}
775
+
776
+	if store.proposer == nil {
777
+		return nil, nil, errors.New("store does not support versioning")
778
+	}
779
+
780
+	var (
781
+		curVersion  *api.Version
782
+		watch       chan events.Event
783
+		cancelWatch func()
784
+	)
785
+	// Using Update to lock the store
786
+	err := store.Update(func(tx Tx) error {
787
+		// Get current version
788
+		curVersion = store.proposer.GetVersion()
789
+		// Start the watch with the store locked so events cannot be
790
+		// missed
791
+		watch, cancelWatch = state.Watch(store.WatchQueue(), specifiers...)
792
+		return nil
793
+	})
794
+	if watch != nil && err != nil {
795
+		cancelWatch()
796
+		return nil, nil, err
797
+	}
798
+
799
+	if curVersion == nil {
800
+		cancelWatch()
801
+		return nil, nil, errors.New("could not get current version from store")
802
+	}
803
+
804
+	changelist, err := store.changelistBetweenVersions(*version, *curVersion)
805
+	if err != nil {
806
+		cancelWatch()
807
+		return nil, nil, err
808
+	}
809
+
810
+	ch := make(chan events.Event)
811
+	stop := make(chan struct{})
812
+	cancel := func() {
813
+		close(stop)
814
+	}
815
+
816
+	go func() {
817
+		defer cancelWatch()
818
+
819
+		matcher := state.Matcher(specifiers...)
820
+		for _, change := range changelist {
821
+			if matcher(change) {
822
+				select {
823
+				case ch <- change:
824
+				case <-stop:
825
+					return
826
+				}
827
+			}
828
+		}
829
+
830
+		for {
831
+			select {
832
+			case <-stop:
833
+				return
834
+			case e := <-watch:
835
+				ch <- e
836
+			}
837
+		}
838
+	}()
839
+
840
+	return ch, cancel, nil
841
+}
842
+
758 843
 // touchMeta updates an object's timestamps when necessary and bumps the version
759 844
 // if provided.
760 845
 func touchMeta(meta *api.Meta, version *api.Version) error {
... ...
@@ -780,3 +926,14 @@ func touchMeta(meta *api.Meta, version *api.Version) error {
780 780
 
781 781
 	return nil
782 782
 }
783
+
784
+// Wedged returns true if the store lock has been held for a long time,
785
+// possibly indicating a deadlock.
786
+func (s *MemoryStore) Wedged() bool {
787
+	lockedAt := s.updateLock.LockedAt()
788
+	if lockedAt.IsZero() {
789
+		return false
790
+	}
791
+
792
+	return time.Since(lockedAt) > WedgeTimeout
793
+}
... ...
@@ -16,12 +16,12 @@ func init() {
16 16
 				indexID: {
17 17
 					Name:    indexID,
18 18
 					Unique:  true,
19
-					Indexer: api.ResourceIndexerByID{},
19
+					Indexer: resourceIndexerByID{},
20 20
 				},
21 21
 				indexName: {
22 22
 					Name:    indexName,
23 23
 					Unique:  true,
24
-					Indexer: api.ResourceIndexerByName{},
24
+					Indexer: resourceIndexerByName{},
25 25
 				},
26 26
 				indexKind: {
27 27
 					Name:    indexKind,
... ...
@@ -29,7 +29,7 @@ func init() {
29 29
 				},
30 30
 				indexCustom: {
31 31
 					Name:         indexCustom,
32
-					Indexer:      api.ResourceCustomIndexer{},
32
+					Indexer:      resourceCustomIndexer{},
33 33
 					AllowMissing: true,
34 34
 				},
35 35
 			},
... ...
@@ -78,6 +78,10 @@ type resourceEntry struct {
78 78
 	*api.Resource
79 79
 }
80 80
 
81
+func (r resourceEntry) CopyStoreObject() api.StoreObject {
82
+	return resourceEntry{Resource: r.Resource.Copy()}
83
+}
84
+
81 85
 func confirmExtension(tx Tx, r *api.Resource) error {
82 86
 	// There must be an extension corresponding to the Kind field.
83 87
 	extensions, err := FindExtensions(tx, ByName(r.Kind))
... ...
@@ -157,3 +161,39 @@ func (ri resourceIndexerByKind) FromObject(obj interface{}) (bool, []byte, error
157 157
 	val := r.Resource.Kind + "\x00"
158 158
 	return true, []byte(val), nil
159 159
 }
160
+
161
+type resourceIndexerByID struct{}
162
+
163
+func (indexer resourceIndexerByID) FromArgs(args ...interface{}) ([]byte, error) {
164
+	return api.ResourceIndexerByID{}.FromArgs(args...)
165
+}
166
+func (indexer resourceIndexerByID) PrefixFromArgs(args ...interface{}) ([]byte, error) {
167
+	return api.ResourceIndexerByID{}.PrefixFromArgs(args...)
168
+}
169
+func (indexer resourceIndexerByID) FromObject(obj interface{}) (bool, []byte, error) {
170
+	return api.ResourceIndexerByID{}.FromObject(obj.(resourceEntry).Resource)
171
+}
172
+
173
+type resourceIndexerByName struct{}
174
+
175
+func (indexer resourceIndexerByName) FromArgs(args ...interface{}) ([]byte, error) {
176
+	return api.ResourceIndexerByName{}.FromArgs(args...)
177
+}
178
+func (indexer resourceIndexerByName) PrefixFromArgs(args ...interface{}) ([]byte, error) {
179
+	return api.ResourceIndexerByName{}.PrefixFromArgs(args...)
180
+}
181
+func (indexer resourceIndexerByName) FromObject(obj interface{}) (bool, []byte, error) {
182
+	return api.ResourceIndexerByName{}.FromObject(obj.(resourceEntry).Resource)
183
+}
184
+
185
+type resourceCustomIndexer struct{}
186
+
187
+func (indexer resourceCustomIndexer) FromArgs(args ...interface{}) ([]byte, error) {
188
+	return api.ResourceCustomIndexer{}.FromArgs(args...)
189
+}
190
+func (indexer resourceCustomIndexer) PrefixFromArgs(args ...interface{}) ([]byte, error) {
191
+	return api.ResourceCustomIndexer{}.PrefixFromArgs(args...)
192
+}
193
+func (indexer resourceCustomIndexer) FromObject(obj interface{}) (bool, [][]byte, error) {
194
+	return api.ResourceCustomIndexer{}.FromObject(obj.(resourceEntry).Resource)
195
+}
... ...
@@ -7,7 +7,9 @@ import (
7 7
 )
8 8
 
9 9
 // EventCommit delineates a transaction boundary.
10
-type EventCommit struct{}
10
+type EventCommit struct {
11
+	Version *api.Version
12
+}
11 13
 
12 14
 // Matches returns true if this event is a commit event.
13 15
 func (e EventCommit) Matches(watchEvent events.Event) bool {
... ...
@@ -15,76 +17,16 @@ func (e EventCommit) Matches(watchEvent events.Event) bool {
15 15
 	return ok
16 16
 }
17 17
 
18
-// TaskCheckID is a TaskCheckFunc for matching task IDs.
19
-func TaskCheckID(t1, t2 *api.Task) bool {
20
-	return t1.ID == t2.ID
21
-}
22
-
23
-// TaskCheckNodeID is a TaskCheckFunc for matching node IDs.
24
-func TaskCheckNodeID(t1, t2 *api.Task) bool {
25
-	return t1.NodeID == t2.NodeID
26
-}
27
-
28
-// TaskCheckServiceID is a TaskCheckFunc for matching service IDs.
29
-func TaskCheckServiceID(t1, t2 *api.Task) bool {
30
-	return t1.ServiceID == t2.ServiceID
31
-}
32
-
33 18
 // TaskCheckStateGreaterThan is a TaskCheckFunc for checking task state.
34 19
 func TaskCheckStateGreaterThan(t1, t2 *api.Task) bool {
35 20
 	return t2.Status.State > t1.Status.State
36 21
 }
37 22
 
38
-// ServiceCheckID is a ServiceCheckFunc for matching service IDs.
39
-func ServiceCheckID(j1, j2 *api.Service) bool {
40
-	return j1.ID == j2.ID
41
-}
42
-
43
-// NetworkCheckID is a NetworkCheckFunc for matching network IDs.
44
-func NetworkCheckID(n1, n2 *api.Network) bool {
45
-	return n1.ID == n2.ID
46
-}
47
-
48
-// NodeCheckID is a NodeCheckFunc for matching node IDs.
49
-func NodeCheckID(n1, n2 *api.Node) bool {
50
-	return n1.ID == n2.ID
51
-}
52
-
53 23
 // NodeCheckState is a NodeCheckFunc for matching node state.
54 24
 func NodeCheckState(n1, n2 *api.Node) bool {
55 25
 	return n1.Status.State == n2.Status.State
56 26
 }
57 27
 
58
-// ClusterCheckID is a ClusterCheckFunc for matching volume IDs.
59
-func ClusterCheckID(v1, v2 *api.Cluster) bool {
60
-	return v1.ID == v2.ID
61
-}
62
-
63
-// SecretCheckID is a SecretCheckFunc for matching secret IDs.
64
-func SecretCheckID(v1, v2 *api.Secret) bool {
65
-	return v1.ID == v2.ID
66
-}
67
-
68
-// ResourceCheckID is a ResourceCheckFunc for matching resource IDs.
69
-func ResourceCheckID(v1, v2 *api.Resource) bool {
70
-	return v1.ID == v2.ID
71
-}
72
-
73
-// ResourceCheckKind is a ResourceCheckFunc for matching resource kinds.
74
-func ResourceCheckKind(v1, v2 *api.Resource) bool {
75
-	return v1.Kind == v2.Kind
76
-}
77
-
78
-// ExtensionCheckID is a ExtensionCheckFunc for matching extension IDs.
79
-func ExtensionCheckID(v1, v2 *api.Extension) bool {
80
-	return v1.ID == v2.ID
81
-}
82
-
83
-// ExtensionCheckName is a ExtensionCheckFunc for matching extension names names.
84
-func ExtensionCheckName(v1, v2 *api.Extension) bool {
85
-	return v1.Annotations.Name == v2.Annotations.Name
86
-}
87
-
88 28
 // Watch takes a variable number of events to match against. The subscriber
89 29
 // will receive events that match any of the arguments passed to Watch.
90 30
 //
91 31
new file mode 100644
... ...
@@ -0,0 +1,17 @@
0
+package storeapi
1
+
2
+import (
3
+	"github.com/docker/swarmkit/manager/state/store"
4
+)
5
+
6
+// Server is the store API gRPC server.
7
+type Server struct {
8
+	store *store.MemoryStore
9
+}
10
+
11
+// NewServer creates a store API server.
12
+func NewServer(store *store.MemoryStore) *Server {
13
+	return &Server{
14
+		store: store,
15
+	}
16
+}
0 17
new file mode 100644
... ...
@@ -0,0 +1,56 @@
0
+package storeapi
1
+
2
+import (
3
+	"google.golang.org/grpc"
4
+	"google.golang.org/grpc/codes"
5
+
6
+	"github.com/docker/swarmkit/api"
7
+	"github.com/docker/swarmkit/manager/state"
8
+	"github.com/docker/swarmkit/manager/state/store"
9
+)
10
+
11
+// Watch starts a stream that returns any changes to objects that match
12
+// the specified selectors. When the stream begins, it immediately sends
13
+// an empty message back to the client. It is important to wait for
14
+// this message before taking any actions that depend on an established
15
+// stream of changes for consistency.
16
+func (s *Server) Watch(request *api.WatchRequest, stream api.Store_WatchServer) error {
17
+	ctx := stream.Context()
18
+
19
+	watchArgs, err := api.ConvertWatchArgs(request.Entries)
20
+	if err != nil {
21
+		return grpc.Errorf(codes.InvalidArgument, "%s", err.Error())
22
+	}
23
+
24
+	watchArgs = append(watchArgs, state.EventCommit{})
25
+	watch, cancel, err := store.WatchFrom(s.store, request.ResumeFrom, watchArgs...)
26
+	if err != nil {
27
+		return err
28
+	}
29
+	defer cancel()
30
+
31
+	// TODO(aaronl): Send current version in this WatchMessage?
32
+	if err := stream.Send(&api.WatchMessage{}); err != nil {
33
+		return err
34
+	}
35
+
36
+	var events []*api.WatchMessage_Event
37
+	for {
38
+		select {
39
+		case <-ctx.Done():
40
+			return ctx.Err()
41
+		case event := <-watch:
42
+			if commitEvent, ok := event.(state.EventCommit); ok && len(events) > 0 {
43
+				if err := stream.Send(&api.WatchMessage{Events: events, Version: commitEvent.Version}); err != nil {
44
+					return err
45
+				}
46
+				events = nil
47
+			} else if eventMessage := api.WatchMessageEvent(event.(api.Event)); eventMessage != nil {
48
+				if !request.IncludeOldObject {
49
+					eventMessage.OldObject = nil
50
+				}
51
+				events = append(events, eventMessage)
52
+			}
53
+		}
54
+	}
55
+}
... ...
@@ -9,6 +9,7 @@
9 9
 		plugin.proto
10 10
 
11 11
 	It has these top-level messages:
12
+		WatchSelectors
12 13
 		StoreObject
13 14
 		TLSAuthorization
14 15
 */
... ...
@@ -19,6 +20,8 @@ import fmt "fmt"
19 19
 import math "math"
20 20
 import google_protobuf "github.com/gogo/protobuf/protoc-gen-gogo/descriptor"
21 21
 
22
+import github_com_gogo_protobuf_proto "github.com/gogo/protobuf/proto"
23
+
22 24
 import strings "strings"
23 25
 import reflect "reflect"
24 26
 
... ...
@@ -35,13 +38,39 @@ var _ = math.Inf
35 35
 // proto package needs to be updated.
36 36
 const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package
37 37
 
38
-type StoreObject struct {
38
+type WatchSelectors struct {
39
+	// supported by all object types
40
+	ID           *bool `protobuf:"varint,1,opt,name=id" json:"id,omitempty"`
41
+	IDPrefix     *bool `protobuf:"varint,2,opt,name=id_prefix,json=idPrefix" json:"id_prefix,omitempty"`
42
+	Name         *bool `protobuf:"varint,3,opt,name=name" json:"name,omitempty"`
43
+	NamePrefix   *bool `protobuf:"varint,4,opt,name=name_prefix,json=namePrefix" json:"name_prefix,omitempty"`
44
+	Custom       *bool `protobuf:"varint,5,opt,name=custom" json:"custom,omitempty"`
45
+	CustomPrefix *bool `protobuf:"varint,6,opt,name=custom_prefix,json=customPrefix" json:"custom_prefix,omitempty"`
46
+	// supported by tasks only
47
+	ServiceID    *bool `protobuf:"varint,7,opt,name=service_id,json=serviceId" json:"service_id,omitempty"`
48
+	NodeID       *bool `protobuf:"varint,8,opt,name=node_id,json=nodeId" json:"node_id,omitempty"`
49
+	Slot         *bool `protobuf:"varint,9,opt,name=slot" json:"slot,omitempty"`
50
+	DesiredState *bool `protobuf:"varint,10,opt,name=desired_state,json=desiredState" json:"desired_state,omitempty"`
51
+	// supported by nodes only
52
+	Role       *bool `protobuf:"varint,11,opt,name=role" json:"role,omitempty"`
53
+	Membership *bool `protobuf:"varint,12,opt,name=membership" json:"membership,omitempty"`
54
+	// supported by: resource
55
+	Kind             *bool  `protobuf:"varint,13,opt,name=kind" json:"kind,omitempty"`
39 56
 	XXX_unrecognized []byte `json:"-"`
40 57
 }
41 58
 
59
+func (m *WatchSelectors) Reset()                    { *m = WatchSelectors{} }
60
+func (*WatchSelectors) ProtoMessage()               {}
61
+func (*WatchSelectors) Descriptor() ([]byte, []int) { return fileDescriptorPlugin, []int{0} }
62
+
63
+type StoreObject struct {
64
+	WatchSelectors   *WatchSelectors `protobuf:"bytes,1,req,name=watch_selectors,json=watchSelectors" json:"watch_selectors,omitempty"`
65
+	XXX_unrecognized []byte          `json:"-"`
66
+}
67
+
42 68
 func (m *StoreObject) Reset()                    { *m = StoreObject{} }
43 69
 func (*StoreObject) ProtoMessage()               {}
44
-func (*StoreObject) Descriptor() ([]byte, []int) { return fileDescriptorPlugin, []int{0} }
70
+func (*StoreObject) Descriptor() ([]byte, []int) { return fileDescriptorPlugin, []int{1} }
45 71
 
46 72
 type TLSAuthorization struct {
47 73
 	// Roles contains the acceptable TLS OU roles for the handler.
... ...
@@ -55,7 +84,7 @@ type TLSAuthorization struct {
55 55
 
56 56
 func (m *TLSAuthorization) Reset()                    { *m = TLSAuthorization{} }
57 57
 func (*TLSAuthorization) ProtoMessage()               {}
58
-func (*TLSAuthorization) Descriptor() ([]byte, []int) { return fileDescriptorPlugin, []int{1} }
58
+func (*TLSAuthorization) Descriptor() ([]byte, []int) { return fileDescriptorPlugin, []int{2} }
59 59
 
60 60
 var E_Deepcopy = &proto.ExtensionDesc{
61 61
 	ExtendedType:  (*google_protobuf.MessageOptions)(nil),
... ...
@@ -82,12 +111,164 @@ var E_TlsAuthorization = &proto.ExtensionDesc{
82 82
 }
83 83
 
84 84
 func init() {
85
+	proto.RegisterType((*WatchSelectors)(nil), "docker.protobuf.plugin.WatchSelectors")
85 86
 	proto.RegisterType((*StoreObject)(nil), "docker.protobuf.plugin.StoreObject")
86 87
 	proto.RegisterType((*TLSAuthorization)(nil), "docker.protobuf.plugin.TLSAuthorization")
87 88
 	proto.RegisterExtension(E_Deepcopy)
88 89
 	proto.RegisterExtension(E_StoreObject)
89 90
 	proto.RegisterExtension(E_TlsAuthorization)
90 91
 }
92
+func (m *WatchSelectors) Marshal() (dAtA []byte, err error) {
93
+	size := m.Size()
94
+	dAtA = make([]byte, size)
95
+	n, err := m.MarshalTo(dAtA)
96
+	if err != nil {
97
+		return nil, err
98
+	}
99
+	return dAtA[:n], nil
100
+}
101
+
102
+func (m *WatchSelectors) MarshalTo(dAtA []byte) (int, error) {
103
+	var i int
104
+	_ = i
105
+	var l int
106
+	_ = l
107
+	if m.ID != nil {
108
+		dAtA[i] = 0x8
109
+		i++
110
+		if *m.ID {
111
+			dAtA[i] = 1
112
+		} else {
113
+			dAtA[i] = 0
114
+		}
115
+		i++
116
+	}
117
+	if m.IDPrefix != nil {
118
+		dAtA[i] = 0x10
119
+		i++
120
+		if *m.IDPrefix {
121
+			dAtA[i] = 1
122
+		} else {
123
+			dAtA[i] = 0
124
+		}
125
+		i++
126
+	}
127
+	if m.Name != nil {
128
+		dAtA[i] = 0x18
129
+		i++
130
+		if *m.Name {
131
+			dAtA[i] = 1
132
+		} else {
133
+			dAtA[i] = 0
134
+		}
135
+		i++
136
+	}
137
+	if m.NamePrefix != nil {
138
+		dAtA[i] = 0x20
139
+		i++
140
+		if *m.NamePrefix {
141
+			dAtA[i] = 1
142
+		} else {
143
+			dAtA[i] = 0
144
+		}
145
+		i++
146
+	}
147
+	if m.Custom != nil {
148
+		dAtA[i] = 0x28
149
+		i++
150
+		if *m.Custom {
151
+			dAtA[i] = 1
152
+		} else {
153
+			dAtA[i] = 0
154
+		}
155
+		i++
156
+	}
157
+	if m.CustomPrefix != nil {
158
+		dAtA[i] = 0x30
159
+		i++
160
+		if *m.CustomPrefix {
161
+			dAtA[i] = 1
162
+		} else {
163
+			dAtA[i] = 0
164
+		}
165
+		i++
166
+	}
167
+	if m.ServiceID != nil {
168
+		dAtA[i] = 0x38
169
+		i++
170
+		if *m.ServiceID {
171
+			dAtA[i] = 1
172
+		} else {
173
+			dAtA[i] = 0
174
+		}
175
+		i++
176
+	}
177
+	if m.NodeID != nil {
178
+		dAtA[i] = 0x40
179
+		i++
180
+		if *m.NodeID {
181
+			dAtA[i] = 1
182
+		} else {
183
+			dAtA[i] = 0
184
+		}
185
+		i++
186
+	}
187
+	if m.Slot != nil {
188
+		dAtA[i] = 0x48
189
+		i++
190
+		if *m.Slot {
191
+			dAtA[i] = 1
192
+		} else {
193
+			dAtA[i] = 0
194
+		}
195
+		i++
196
+	}
197
+	if m.DesiredState != nil {
198
+		dAtA[i] = 0x50
199
+		i++
200
+		if *m.DesiredState {
201
+			dAtA[i] = 1
202
+		} else {
203
+			dAtA[i] = 0
204
+		}
205
+		i++
206
+	}
207
+	if m.Role != nil {
208
+		dAtA[i] = 0x58
209
+		i++
210
+		if *m.Role {
211
+			dAtA[i] = 1
212
+		} else {
213
+			dAtA[i] = 0
214
+		}
215
+		i++
216
+	}
217
+	if m.Membership != nil {
218
+		dAtA[i] = 0x60
219
+		i++
220
+		if *m.Membership {
221
+			dAtA[i] = 1
222
+		} else {
223
+			dAtA[i] = 0
224
+		}
225
+		i++
226
+	}
227
+	if m.Kind != nil {
228
+		dAtA[i] = 0x68
229
+		i++
230
+		if *m.Kind {
231
+			dAtA[i] = 1
232
+		} else {
233
+			dAtA[i] = 0
234
+		}
235
+		i++
236
+	}
237
+	if m.XXX_unrecognized != nil {
238
+		i += copy(dAtA[i:], m.XXX_unrecognized)
239
+	}
240
+	return i, nil
241
+}
242
+
91 243
 func (m *StoreObject) Marshal() (dAtA []byte, err error) {
92 244
 	size := m.Size()
93 245
 	dAtA = make([]byte, size)
... ...
@@ -103,6 +284,18 @@ func (m *StoreObject) MarshalTo(dAtA []byte) (int, error) {
103 103
 	_ = i
104 104
 	var l int
105 105
 	_ = l
106
+	if m.WatchSelectors == nil {
107
+		return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("watch_selectors")
108
+	} else {
109
+		dAtA[i] = 0xa
110
+		i++
111
+		i = encodeVarintPlugin(dAtA, i, uint64(m.WatchSelectors.Size()))
112
+		n1, err := m.WatchSelectors.MarshalTo(dAtA[i:])
113
+		if err != nil {
114
+			return 0, err
115
+		}
116
+		i += n1
117
+	}
106 118
 	if m.XXX_unrecognized != nil {
107 119
 		i += copy(dAtA[i:], m.XXX_unrecognized)
108 120
 	}
... ...
@@ -182,9 +375,61 @@ func encodeVarintPlugin(dAtA []byte, offset int, v uint64) int {
182 182
 	dAtA[offset] = uint8(v)
183 183
 	return offset + 1
184 184
 }
185
+func (m *WatchSelectors) Size() (n int) {
186
+	var l int
187
+	_ = l
188
+	if m.ID != nil {
189
+		n += 2
190
+	}
191
+	if m.IDPrefix != nil {
192
+		n += 2
193
+	}
194
+	if m.Name != nil {
195
+		n += 2
196
+	}
197
+	if m.NamePrefix != nil {
198
+		n += 2
199
+	}
200
+	if m.Custom != nil {
201
+		n += 2
202
+	}
203
+	if m.CustomPrefix != nil {
204
+		n += 2
205
+	}
206
+	if m.ServiceID != nil {
207
+		n += 2
208
+	}
209
+	if m.NodeID != nil {
210
+		n += 2
211
+	}
212
+	if m.Slot != nil {
213
+		n += 2
214
+	}
215
+	if m.DesiredState != nil {
216
+		n += 2
217
+	}
218
+	if m.Role != nil {
219
+		n += 2
220
+	}
221
+	if m.Membership != nil {
222
+		n += 2
223
+	}
224
+	if m.Kind != nil {
225
+		n += 2
226
+	}
227
+	if m.XXX_unrecognized != nil {
228
+		n += len(m.XXX_unrecognized)
229
+	}
230
+	return n
231
+}
232
+
185 233
 func (m *StoreObject) Size() (n int) {
186 234
 	var l int
187 235
 	_ = l
236
+	if m.WatchSelectors != nil {
237
+		l = m.WatchSelectors.Size()
238
+		n += 1 + l + sovPlugin(uint64(l))
239
+	}
188 240
 	if m.XXX_unrecognized != nil {
189 241
 		n += len(m.XXX_unrecognized)
190 242
 	}
... ...
@@ -222,11 +467,35 @@ func sovPlugin(x uint64) (n int) {
222 222
 func sozPlugin(x uint64) (n int) {
223 223
 	return sovPlugin(uint64((x << 1) ^ uint64((int64(x) >> 63))))
224 224
 }
225
+func (this *WatchSelectors) String() string {
226
+	if this == nil {
227
+		return "nil"
228
+	}
229
+	s := strings.Join([]string{`&WatchSelectors{`,
230
+		`ID:` + valueToStringPlugin(this.ID) + `,`,
231
+		`IDPrefix:` + valueToStringPlugin(this.IDPrefix) + `,`,
232
+		`Name:` + valueToStringPlugin(this.Name) + `,`,
233
+		`NamePrefix:` + valueToStringPlugin(this.NamePrefix) + `,`,
234
+		`Custom:` + valueToStringPlugin(this.Custom) + `,`,
235
+		`CustomPrefix:` + valueToStringPlugin(this.CustomPrefix) + `,`,
236
+		`ServiceID:` + valueToStringPlugin(this.ServiceID) + `,`,
237
+		`NodeID:` + valueToStringPlugin(this.NodeID) + `,`,
238
+		`Slot:` + valueToStringPlugin(this.Slot) + `,`,
239
+		`DesiredState:` + valueToStringPlugin(this.DesiredState) + `,`,
240
+		`Role:` + valueToStringPlugin(this.Role) + `,`,
241
+		`Membership:` + valueToStringPlugin(this.Membership) + `,`,
242
+		`Kind:` + valueToStringPlugin(this.Kind) + `,`,
243
+		`XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`,
244
+		`}`,
245
+	}, "")
246
+	return s
247
+}
225 248
 func (this *StoreObject) String() string {
226 249
 	if this == nil {
227 250
 		return "nil"
228 251
 	}
229 252
 	s := strings.Join([]string{`&StoreObject{`,
253
+		`WatchSelectors:` + strings.Replace(fmt.Sprintf("%v", this.WatchSelectors), "WatchSelectors", "WatchSelectors", 1) + `,`,
230 254
 		`XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`,
231 255
 		`}`,
232 256
 	}, "")
... ...
@@ -252,7 +521,332 @@ func valueToStringPlugin(v interface{}) string {
252 252
 	pv := reflect.Indirect(rv).Interface()
253 253
 	return fmt.Sprintf("*%v", pv)
254 254
 }
255
+func (m *WatchSelectors) Unmarshal(dAtA []byte) error {
256
+	l := len(dAtA)
257
+	iNdEx := 0
258
+	for iNdEx < l {
259
+		preIndex := iNdEx
260
+		var wire uint64
261
+		for shift := uint(0); ; shift += 7 {
262
+			if shift >= 64 {
263
+				return ErrIntOverflowPlugin
264
+			}
265
+			if iNdEx >= l {
266
+				return io.ErrUnexpectedEOF
267
+			}
268
+			b := dAtA[iNdEx]
269
+			iNdEx++
270
+			wire |= (uint64(b) & 0x7F) << shift
271
+			if b < 0x80 {
272
+				break
273
+			}
274
+		}
275
+		fieldNum := int32(wire >> 3)
276
+		wireType := int(wire & 0x7)
277
+		if wireType == 4 {
278
+			return fmt.Errorf("proto: WatchSelectors: wiretype end group for non-group")
279
+		}
280
+		if fieldNum <= 0 {
281
+			return fmt.Errorf("proto: WatchSelectors: illegal tag %d (wire type %d)", fieldNum, wire)
282
+		}
283
+		switch fieldNum {
284
+		case 1:
285
+			if wireType != 0 {
286
+				return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType)
287
+			}
288
+			var v int
289
+			for shift := uint(0); ; shift += 7 {
290
+				if shift >= 64 {
291
+					return ErrIntOverflowPlugin
292
+				}
293
+				if iNdEx >= l {
294
+					return io.ErrUnexpectedEOF
295
+				}
296
+				b := dAtA[iNdEx]
297
+				iNdEx++
298
+				v |= (int(b) & 0x7F) << shift
299
+				if b < 0x80 {
300
+					break
301
+				}
302
+			}
303
+			b := bool(v != 0)
304
+			m.ID = &b
305
+		case 2:
306
+			if wireType != 0 {
307
+				return fmt.Errorf("proto: wrong wireType = %d for field IDPrefix", wireType)
308
+			}
309
+			var v int
310
+			for shift := uint(0); ; shift += 7 {
311
+				if shift >= 64 {
312
+					return ErrIntOverflowPlugin
313
+				}
314
+				if iNdEx >= l {
315
+					return io.ErrUnexpectedEOF
316
+				}
317
+				b := dAtA[iNdEx]
318
+				iNdEx++
319
+				v |= (int(b) & 0x7F) << shift
320
+				if b < 0x80 {
321
+					break
322
+				}
323
+			}
324
+			b := bool(v != 0)
325
+			m.IDPrefix = &b
326
+		case 3:
327
+			if wireType != 0 {
328
+				return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType)
329
+			}
330
+			var v int
331
+			for shift := uint(0); ; shift += 7 {
332
+				if shift >= 64 {
333
+					return ErrIntOverflowPlugin
334
+				}
335
+				if iNdEx >= l {
336
+					return io.ErrUnexpectedEOF
337
+				}
338
+				b := dAtA[iNdEx]
339
+				iNdEx++
340
+				v |= (int(b) & 0x7F) << shift
341
+				if b < 0x80 {
342
+					break
343
+				}
344
+			}
345
+			b := bool(v != 0)
346
+			m.Name = &b
347
+		case 4:
348
+			if wireType != 0 {
349
+				return fmt.Errorf("proto: wrong wireType = %d for field NamePrefix", wireType)
350
+			}
351
+			var v int
352
+			for shift := uint(0); ; shift += 7 {
353
+				if shift >= 64 {
354
+					return ErrIntOverflowPlugin
355
+				}
356
+				if iNdEx >= l {
357
+					return io.ErrUnexpectedEOF
358
+				}
359
+				b := dAtA[iNdEx]
360
+				iNdEx++
361
+				v |= (int(b) & 0x7F) << shift
362
+				if b < 0x80 {
363
+					break
364
+				}
365
+			}
366
+			b := bool(v != 0)
367
+			m.NamePrefix = &b
368
+		case 5:
369
+			if wireType != 0 {
370
+				return fmt.Errorf("proto: wrong wireType = %d for field Custom", wireType)
371
+			}
372
+			var v int
373
+			for shift := uint(0); ; shift += 7 {
374
+				if shift >= 64 {
375
+					return ErrIntOverflowPlugin
376
+				}
377
+				if iNdEx >= l {
378
+					return io.ErrUnexpectedEOF
379
+				}
380
+				b := dAtA[iNdEx]
381
+				iNdEx++
382
+				v |= (int(b) & 0x7F) << shift
383
+				if b < 0x80 {
384
+					break
385
+				}
386
+			}
387
+			b := bool(v != 0)
388
+			m.Custom = &b
389
+		case 6:
390
+			if wireType != 0 {
391
+				return fmt.Errorf("proto: wrong wireType = %d for field CustomPrefix", wireType)
392
+			}
393
+			var v int
394
+			for shift := uint(0); ; shift += 7 {
395
+				if shift >= 64 {
396
+					return ErrIntOverflowPlugin
397
+				}
398
+				if iNdEx >= l {
399
+					return io.ErrUnexpectedEOF
400
+				}
401
+				b := dAtA[iNdEx]
402
+				iNdEx++
403
+				v |= (int(b) & 0x7F) << shift
404
+				if b < 0x80 {
405
+					break
406
+				}
407
+			}
408
+			b := bool(v != 0)
409
+			m.CustomPrefix = &b
410
+		case 7:
411
+			if wireType != 0 {
412
+				return fmt.Errorf("proto: wrong wireType = %d for field ServiceID", wireType)
413
+			}
414
+			var v int
415
+			for shift := uint(0); ; shift += 7 {
416
+				if shift >= 64 {
417
+					return ErrIntOverflowPlugin
418
+				}
419
+				if iNdEx >= l {
420
+					return io.ErrUnexpectedEOF
421
+				}
422
+				b := dAtA[iNdEx]
423
+				iNdEx++
424
+				v |= (int(b) & 0x7F) << shift
425
+				if b < 0x80 {
426
+					break
427
+				}
428
+			}
429
+			b := bool(v != 0)
430
+			m.ServiceID = &b
431
+		case 8:
432
+			if wireType != 0 {
433
+				return fmt.Errorf("proto: wrong wireType = %d for field NodeID", wireType)
434
+			}
435
+			var v int
436
+			for shift := uint(0); ; shift += 7 {
437
+				if shift >= 64 {
438
+					return ErrIntOverflowPlugin
439
+				}
440
+				if iNdEx >= l {
441
+					return io.ErrUnexpectedEOF
442
+				}
443
+				b := dAtA[iNdEx]
444
+				iNdEx++
445
+				v |= (int(b) & 0x7F) << shift
446
+				if b < 0x80 {
447
+					break
448
+				}
449
+			}
450
+			b := bool(v != 0)
451
+			m.NodeID = &b
452
+		case 9:
453
+			if wireType != 0 {
454
+				return fmt.Errorf("proto: wrong wireType = %d for field Slot", wireType)
455
+			}
456
+			var v int
457
+			for shift := uint(0); ; shift += 7 {
458
+				if shift >= 64 {
459
+					return ErrIntOverflowPlugin
460
+				}
461
+				if iNdEx >= l {
462
+					return io.ErrUnexpectedEOF
463
+				}
464
+				b := dAtA[iNdEx]
465
+				iNdEx++
466
+				v |= (int(b) & 0x7F) << shift
467
+				if b < 0x80 {
468
+					break
469
+				}
470
+			}
471
+			b := bool(v != 0)
472
+			m.Slot = &b
473
+		case 10:
474
+			if wireType != 0 {
475
+				return fmt.Errorf("proto: wrong wireType = %d for field DesiredState", wireType)
476
+			}
477
+			var v int
478
+			for shift := uint(0); ; shift += 7 {
479
+				if shift >= 64 {
480
+					return ErrIntOverflowPlugin
481
+				}
482
+				if iNdEx >= l {
483
+					return io.ErrUnexpectedEOF
484
+				}
485
+				b := dAtA[iNdEx]
486
+				iNdEx++
487
+				v |= (int(b) & 0x7F) << shift
488
+				if b < 0x80 {
489
+					break
490
+				}
491
+			}
492
+			b := bool(v != 0)
493
+			m.DesiredState = &b
494
+		case 11:
495
+			if wireType != 0 {
496
+				return fmt.Errorf("proto: wrong wireType = %d for field Role", wireType)
497
+			}
498
+			var v int
499
+			for shift := uint(0); ; shift += 7 {
500
+				if shift >= 64 {
501
+					return ErrIntOverflowPlugin
502
+				}
503
+				if iNdEx >= l {
504
+					return io.ErrUnexpectedEOF
505
+				}
506
+				b := dAtA[iNdEx]
507
+				iNdEx++
508
+				v |= (int(b) & 0x7F) << shift
509
+				if b < 0x80 {
510
+					break
511
+				}
512
+			}
513
+			b := bool(v != 0)
514
+			m.Role = &b
515
+		case 12:
516
+			if wireType != 0 {
517
+				return fmt.Errorf("proto: wrong wireType = %d for field Membership", wireType)
518
+			}
519
+			var v int
520
+			for shift := uint(0); ; shift += 7 {
521
+				if shift >= 64 {
522
+					return ErrIntOverflowPlugin
523
+				}
524
+				if iNdEx >= l {
525
+					return io.ErrUnexpectedEOF
526
+				}
527
+				b := dAtA[iNdEx]
528
+				iNdEx++
529
+				v |= (int(b) & 0x7F) << shift
530
+				if b < 0x80 {
531
+					break
532
+				}
533
+			}
534
+			b := bool(v != 0)
535
+			m.Membership = &b
536
+		case 13:
537
+			if wireType != 0 {
538
+				return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType)
539
+			}
540
+			var v int
541
+			for shift := uint(0); ; shift += 7 {
542
+				if shift >= 64 {
543
+					return ErrIntOverflowPlugin
544
+				}
545
+				if iNdEx >= l {
546
+					return io.ErrUnexpectedEOF
547
+				}
548
+				b := dAtA[iNdEx]
549
+				iNdEx++
550
+				v |= (int(b) & 0x7F) << shift
551
+				if b < 0x80 {
552
+					break
553
+				}
554
+			}
555
+			b := bool(v != 0)
556
+			m.Kind = &b
557
+		default:
558
+			iNdEx = preIndex
559
+			skippy, err := skipPlugin(dAtA[iNdEx:])
560
+			if err != nil {
561
+				return err
562
+			}
563
+			if skippy < 0 {
564
+				return ErrInvalidLengthPlugin
565
+			}
566
+			if (iNdEx + skippy) > l {
567
+				return io.ErrUnexpectedEOF
568
+			}
569
+			m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
570
+			iNdEx += skippy
571
+		}
572
+	}
573
+
574
+	if iNdEx > l {
575
+		return io.ErrUnexpectedEOF
576
+	}
577
+	return nil
578
+}
255 579
 func (m *StoreObject) Unmarshal(dAtA []byte) error {
580
+	var hasFields [1]uint64
256 581
 	l := len(dAtA)
257 582
 	iNdEx := 0
258 583
 	for iNdEx < l {
... ...
@@ -281,6 +875,40 @@ func (m *StoreObject) Unmarshal(dAtA []byte) error {
281 281
 			return fmt.Errorf("proto: StoreObject: illegal tag %d (wire type %d)", fieldNum, wire)
282 282
 		}
283 283
 		switch fieldNum {
284
+		case 1:
285
+			if wireType != 2 {
286
+				return fmt.Errorf("proto: wrong wireType = %d for field WatchSelectors", wireType)
287
+			}
288
+			var msglen int
289
+			for shift := uint(0); ; shift += 7 {
290
+				if shift >= 64 {
291
+					return ErrIntOverflowPlugin
292
+				}
293
+				if iNdEx >= l {
294
+					return io.ErrUnexpectedEOF
295
+				}
296
+				b := dAtA[iNdEx]
297
+				iNdEx++
298
+				msglen |= (int(b) & 0x7F) << shift
299
+				if b < 0x80 {
300
+					break
301
+				}
302
+			}
303
+			if msglen < 0 {
304
+				return ErrInvalidLengthPlugin
305
+			}
306
+			postIndex := iNdEx + msglen
307
+			if postIndex > l {
308
+				return io.ErrUnexpectedEOF
309
+			}
310
+			if m.WatchSelectors == nil {
311
+				m.WatchSelectors = &WatchSelectors{}
312
+			}
313
+			if err := m.WatchSelectors.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
314
+				return err
315
+			}
316
+			iNdEx = postIndex
317
+			hasFields[0] |= uint64(0x00000001)
284 318
 		default:
285 319
 			iNdEx = preIndex
286 320
 			skippy, err := skipPlugin(dAtA[iNdEx:])
... ...
@@ -297,6 +925,9 @@ func (m *StoreObject) Unmarshal(dAtA []byte) error {
297 297
 			iNdEx += skippy
298 298
 		}
299 299
 	}
300
+	if hasFields[0]&uint64(0x00000001) == 0 {
301
+		return github_com_gogo_protobuf_proto.NewRequiredNotSetError("watch_selectors")
302
+	}
300 303
 
301 304
 	if iNdEx > l {
302 305
 		return io.ErrUnexpectedEOF
... ...
@@ -512,24 +1143,40 @@ var (
512 512
 func init() { proto.RegisterFile("plugin.proto", fileDescriptorPlugin) }
513 513
 
514 514
 var fileDescriptorPlugin = []byte{
515
-	// 296 bytes of a gzipped FileDescriptorProto
516
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0xe2, 0x29, 0xc8, 0x29, 0x4d,
517
-	0xcf, 0xcc, 0xd3, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x4b, 0xc9, 0x4f, 0xce, 0x4e, 0x2d,
518
-	0x82, 0xf0, 0x92, 0x4a, 0xd3, 0xf4, 0x20, 0xb2, 0x52, 0x0a, 0xe9, 0xf9, 0xf9, 0xe9, 0x39, 0xa9,
519
-	0xfa, 0x30, 0x71, 0xfd, 0x94, 0xd4, 0xe2, 0xe4, 0xa2, 0xcc, 0x82, 0x92, 0x7c, 0xa8, 0x5a, 0x25,
520
-	0x5e, 0x2e, 0xee, 0xe0, 0x92, 0xfc, 0xa2, 0x54, 0xff, 0xa4, 0xac, 0xd4, 0xe4, 0x12, 0x25, 0x17,
521
-	0x2e, 0x81, 0x10, 0x9f, 0x60, 0xc7, 0xd2, 0x92, 0x8c, 0xfc, 0xa2, 0xcc, 0xaa, 0xc4, 0x92, 0xcc,
522
-	0xfc, 0x3c, 0x21, 0x11, 0x2e, 0xd6, 0xa2, 0xfc, 0x9c, 0xd4, 0x62, 0x09, 0x46, 0x05, 0x66, 0x0d,
523
-	0xce, 0x20, 0x08, 0x47, 0x48, 0x8a, 0x8b, 0x23, 0x33, 0xaf, 0x38, 0x35, 0xb9, 0xb4, 0x28, 0x55,
524
-	0x82, 0x49, 0x81, 0x51, 0x83, 0x23, 0x08, 0xce, 0xb7, 0x72, 0xe6, 0xe2, 0x48, 0x49, 0x4d, 0x2d,
525
-	0x48, 0xce, 0x2f, 0xa8, 0x14, 0x92, 0xd7, 0x83, 0xb8, 0x01, 0xe1, 0x36, 0xdf, 0xd4, 0xe2, 0xe2,
526
-	0xc4, 0xf4, 0x54, 0xff, 0x02, 0x90, 0xe9, 0xc5, 0x12, 0x1f, 0x16, 0xb1, 0x80, 0xb4, 0x5b, 0xb1,
527
-	0x94, 0x14, 0x95, 0xa6, 0x06, 0xc1, 0x35, 0x5a, 0x65, 0x72, 0xf1, 0x14, 0x83, 0x5c, 0x16, 0x9f,
528
-	0x0f, 0x76, 0x1a, 0x61, 0x83, 0x3e, 0x82, 0x0d, 0xe2, 0x36, 0x52, 0xd6, 0xc3, 0x1e, 0x1a, 0x7a,
529
-	0x48, 0x1e, 0x0d, 0xe2, 0x2e, 0x46, 0x70, 0xac, 0x2a, 0xb8, 0x04, 0x4b, 0x72, 0x8a, 0xe3, 0x13,
530
-	0x51, 0xbc, 0x2d, 0x87, 0xc5, 0xbe, 0x92, 0x8c, 0xfc, 0x14, 0x98, 0x75, 0x2f, 0x9f, 0xf6, 0x2a,
531
-	0x83, 0xed, 0xd3, 0xc0, 0x65, 0x1f, 0x7a, 0x48, 0x06, 0x09, 0x94, 0xe4, 0x14, 0xa3, 0x88, 0x38,
532
-	0x49, 0x9c, 0x78, 0x28, 0xc7, 0x70, 0xe3, 0xa1, 0x1c, 0x43, 0xc3, 0x23, 0x39, 0xc6, 0x13, 0x8f,
533
-	0xe4, 0x18, 0x2f, 0x3c, 0x92, 0x63, 0x7c, 0xf0, 0x48, 0x8e, 0x11, 0x10, 0x00, 0x00, 0xff, 0xff,
534
-	0xc2, 0x49, 0xd6, 0x3b, 0xe1, 0x01, 0x00, 0x00,
515
+	// 551 bytes of a gzipped FileDescriptorProto
516
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x84, 0x52, 0xc1, 0x6e, 0xd3, 0x40,
517
+	0x10, 0xad, 0xd3, 0x36, 0x4d, 0xc6, 0x69, 0x29, 0x2b, 0x54, 0xad, 0x7a, 0xb0, 0xab, 0x46, 0x42,
518
+	0x41, 0x42, 0xa9, 0xd4, 0x63, 0x6e, 0x94, 0x5c, 0x22, 0x01, 0x45, 0x0e, 0x12, 0x37, 0x2c, 0xd7,
519
+	0x3b, 0x4d, 0x96, 0x3a, 0x5e, 0x6b, 0x77, 0x4d, 0x0b, 0x27, 0x7e, 0x80, 0x0f, 0xe0, 0xca, 0xd7,
520
+	0xf4, 0xc8, 0x91, 0x53, 0x44, 0x2d, 0x71, 0xe0, 0x06, 0x7f, 0x80, 0x76, 0xd7, 0x69, 0x09, 0x6a,
521
+	0xc5, 0xc9, 0x33, 0x6f, 0xe6, 0xcd, 0xcc, 0xdb, 0x67, 0xe8, 0x14, 0x59, 0x39, 0xe1, 0x79, 0xbf,
522
+	0x90, 0x42, 0x0b, 0xb2, 0xc3, 0x44, 0x7a, 0x86, 0xd2, 0x65, 0x27, 0xe5, 0x69, 0xdf, 0x55, 0x77,
523
+	0xf7, 0x26, 0x42, 0x4c, 0x32, 0x3c, 0x58, 0xe0, 0x07, 0x0c, 0x55, 0x2a, 0x79, 0xa1, 0x45, 0xdd,
524
+	0xbb, 0xff, 0x79, 0x15, 0xb6, 0x5e, 0x27, 0x3a, 0x9d, 0x8e, 0x31, 0xc3, 0x54, 0x0b, 0xa9, 0xc8,
525
+	0x0e, 0x34, 0x38, 0xa3, 0xde, 0x9e, 0xd7, 0x6b, 0x1d, 0x35, 0xab, 0x79, 0xd8, 0x18, 0x0d, 0xa3,
526
+	0x06, 0x67, 0xe4, 0x11, 0xb4, 0x39, 0x8b, 0x0b, 0x89, 0xa7, 0xfc, 0x82, 0x36, 0x6c, 0xb9, 0x53,
527
+	0xcd, 0xc3, 0xd6, 0x68, 0xf8, 0xd2, 0x62, 0x51, 0x8b, 0x33, 0x17, 0x11, 0x02, 0x6b, 0x79, 0x32,
528
+	0x43, 0xba, 0x6a, 0xba, 0x22, 0x1b, 0x93, 0x10, 0x7c, 0xf3, 0x5d, 0x0c, 0x58, 0xb3, 0x25, 0x30,
529
+	0x50, 0x4d, 0xda, 0x81, 0x66, 0x5a, 0x2a, 0x2d, 0x66, 0x74, 0xdd, 0xd6, 0xea, 0x8c, 0x74, 0x61,
530
+	0xd3, 0x45, 0x0b, 0x6a, 0xd3, 0x96, 0x3b, 0x0e, 0xac, 0xc9, 0x8f, 0x01, 0x14, 0xca, 0x77, 0x3c,
531
+	0xc5, 0x98, 0x33, 0xba, 0x61, 0xaf, 0xdb, 0xac, 0xe6, 0x61, 0x7b, 0xec, 0xd0, 0xd1, 0x30, 0x6a,
532
+	0xd7, 0x0d, 0x23, 0x46, 0xba, 0xb0, 0x91, 0x0b, 0x66, 0x5b, 0x5b, 0xb6, 0x15, 0xaa, 0x79, 0xd8,
533
+	0x7c, 0x21, 0x98, 0xe9, 0x6b, 0x9a, 0xd2, 0x88, 0x19, 0x11, 0x2a, 0x13, 0x9a, 0xb6, 0x9d, 0x08,
534
+	0x13, 0x9b, 0x5b, 0x18, 0x2a, 0x2e, 0x91, 0xc5, 0x4a, 0x27, 0x1a, 0x29, 0xb8, 0x5b, 0x6a, 0x70,
535
+	0x6c, 0x30, 0x43, 0x94, 0x22, 0x43, 0xea, 0x3b, 0xa2, 0x89, 0x49, 0x00, 0x30, 0xc3, 0xd9, 0x09,
536
+	0x4a, 0x35, 0xe5, 0x05, 0xed, 0x38, 0xf1, 0x37, 0x88, 0xe1, 0x9c, 0xf1, 0x9c, 0xd1, 0x4d, 0xc7,
537
+	0x31, 0xf1, 0xfe, 0x1b, 0xf0, 0xc7, 0x5a, 0x48, 0x3c, 0x3e, 0x79, 0x8b, 0xa9, 0x26, 0xc7, 0x70,
538
+	0xef, 0xdc, 0x38, 0x15, 0xab, 0x85, 0x55, 0xd4, 0xdb, 0x6b, 0xf4, 0xfc, 0xc3, 0x87, 0xfd, 0xdb,
539
+	0xed, 0xef, 0x2f, 0x1b, 0x1b, 0x6d, 0x9d, 0x2f, 0xe5, 0xfb, 0x43, 0xd8, 0x7e, 0xf5, 0x6c, 0xfc,
540
+	0xa4, 0xd4, 0x53, 0x21, 0xf9, 0x87, 0x44, 0x73, 0x91, 0x93, 0x07, 0xb0, 0x6e, 0xee, 0x35, 0xa3,
541
+	0x57, 0x7b, 0xed, 0xc8, 0x25, 0x64, 0x17, 0x5a, 0x3c, 0x57, 0x98, 0x96, 0x12, 0x9d, 0xf3, 0xd1,
542
+	0x75, 0x3e, 0x78, 0x0a, 0x2d, 0x86, 0x58, 0xa4, 0xa2, 0x78, 0x4f, 0xc2, 0xbe, 0xfb, 0xe1, 0x6e,
543
+	0x2e, 0x79, 0x8e, 0x4a, 0x25, 0x13, 0x3c, 0x2e, 0xcc, 0x74, 0x45, 0x7f, 0x7d, 0xb1, 0xbe, 0x0f,
544
+	0xd6, 0xb4, 0x2c, 0x31, 0xba, 0x26, 0x0e, 0x38, 0x74, 0x94, 0x91, 0x1a, 0x0b, 0xa7, 0xf5, 0xbf,
545
+	0x83, 0x7e, 0xdb, 0x41, 0xfe, 0x61, 0xf7, 0x2e, 0xed, 0x7f, 0xbd, 0x5c, 0xe4, 0xab, 0x9b, 0x64,
546
+	0x70, 0x01, 0xf7, 0x75, 0xa6, 0xe2, 0x64, 0x49, 0x76, 0x70, 0xcb, 0x3e, 0x3d, 0x15, 0x6c, 0xb1,
547
+	0xee, 0xe7, 0x8f, 0x4f, 0x5d, 0xbb, 0xaf, 0x77, 0xd7, 0xbe, 0x7f, 0x5f, 0x32, 0xda, 0xd6, 0x99,
548
+	0x5a, 0x42, 0x8e, 0xe8, 0xe5, 0x55, 0xb0, 0xf2, 0xed, 0x2a, 0x58, 0xf9, 0x58, 0x05, 0xde, 0x65,
549
+	0x15, 0x78, 0x5f, 0xab, 0xc0, 0xfb, 0x5e, 0x05, 0xde, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x94,
550
+	0xd6, 0x21, 0x73, 0xce, 0x03, 0x00, 0x00,
535 551
 }
... ...
@@ -4,7 +4,31 @@ package docker.protobuf.plugin;
4 4
 
5 5
 import "google/protobuf/descriptor.proto";
6 6
 
7
+message WatchSelectors {
8
+	// supported by all object types
9
+	optional bool id = 1;
10
+	optional bool id_prefix = 2;
11
+	optional bool name = 3;
12
+	optional bool name_prefix = 4;
13
+	optional bool custom = 5;
14
+	optional bool custom_prefix = 6;
15
+
16
+	// supported by tasks only
17
+	optional bool service_id = 7;
18
+	optional bool node_id = 8;
19
+	optional bool slot = 9;
20
+	optional bool desired_state = 10;
21
+
22
+	// supported by nodes only
23
+	optional bool role = 11;
24
+	optional bool membership = 12;
25
+
26
+	// supported by: resource
27
+	optional bool kind = 13;
28
+}
29
+
7 30
 message StoreObject {
31
+	required WatchSelectors watch_selectors = 1;
8 32
 }
9 33
 
10 34
 extend google.protobuf.MessageOptions {