Browse code

Global Default AddressPool - Update

Addressing few review comments as part of code refactoring.
Also moved validation logic from CLI to Moby.

Signed-off-by: selansen <elango.siva@docker.com>

selansen authored on 2018/08/30 12:28:22
Showing 15 changed files
... ...
@@ -3,6 +3,7 @@ package cluster // import "github.com/docker/docker/daemon/cluster"
3 3
 import (
4 4
 	"fmt"
5 5
 	"net"
6
+	"strings"
6 7
 )
7 8
 
8 9
 const (
... ...
@@ -87,6 +88,36 @@ func (c *Cluster) resolveAdvertiseAddr(advertiseAddr, listenAddrPort string) (st
87 87
 	return systemAddr.String(), listenAddrPort, nil
88 88
 }
89 89
 
90
+// validateDefaultAddrPool validates default address pool
91
+// it also strips white space from the string before validation
92
+func validateDefaultAddrPool(defaultAddrPool []string, size uint32) error {
93
+	if defaultAddrPool == nil {
94
+		// defaultAddrPool is not defined
95
+		return nil
96
+	}
97
+	//if size is not set, then we use default value 24
98
+	if size == 0 {
99
+		size = 24
100
+	}
101
+	if size > 32 {
102
+		return fmt.Errorf("subnet size is out of range: %d", size)
103
+	}
104
+	for i := range defaultAddrPool {
105
+		// trim leading and trailing white spaces
106
+		defaultAddrPool[i] = strings.TrimSpace(defaultAddrPool[i])
107
+		_, b, err := net.ParseCIDR(defaultAddrPool[i])
108
+		if err != nil {
109
+			return fmt.Errorf("invalid base pool %s: %v", defaultAddrPool[i], err)
110
+		}
111
+		ones, _ := b.Mask.Size()
112
+		if size < uint32(ones) {
113
+			return fmt.Errorf("invalid CIDR: %q. Subnet size is too small for pool: %d", defaultAddrPool[i], size)
114
+		}
115
+	}
116
+
117
+	return nil
118
+}
119
+
90 120
 func resolveDataPathAddr(dataPathAddr string) (string, error) {
91 121
 	if dataPathAddr == "" {
92 122
 		// dataPathAddr is not defined
... ...
@@ -3,7 +3,6 @@ package cluster // import "github.com/docker/docker/daemon/cluster"
3 3
 import (
4 4
 	"context"
5 5
 	"fmt"
6
-	"net"
7 6
 	"path/filepath"
8 7
 	"runtime"
9 8
 	"strings"
... ...
@@ -14,6 +13,7 @@ import (
14 14
 	"github.com/docker/docker/daemon/cluster/executor/container"
15 15
 	lncluster "github.com/docker/libnetwork/cluster"
16 16
 	swarmapi "github.com/docker/swarmkit/api"
17
+	swarmallocator "github.com/docker/swarmkit/manager/allocator/cnmallocator"
17 18
 	swarmnode "github.com/docker/swarmkit/node"
18 19
 	"github.com/pkg/errors"
19 20
 	"github.com/sirupsen/logrus"
... ...
@@ -115,12 +115,6 @@ func (n *nodeRunner) start(conf nodeStartConfig) error {
115 115
 		joinAddr = conf.RemoteAddr
116 116
 	}
117 117
 
118
-	var defaultAddrPool []*net.IPNet
119
-	for _, address := range conf.DefaultAddressPool {
120
-		if _, b, err := net.ParseCIDR(address); err == nil {
121
-			defaultAddrPool = append(defaultAddrPool, b)
122
-		}
123
-	}
124 118
 	// Hostname is not set here. Instead, it is obtained from
125 119
 	// the node description that is reported periodically
126 120
 	swarmnodeConfig := swarmnode.Config{
... ...
@@ -128,11 +122,13 @@ func (n *nodeRunner) start(conf nodeStartConfig) error {
128 128
 		ListenControlAPI:   control,
129 129
 		ListenRemoteAPI:    conf.ListenAddr,
130 130
 		AdvertiseRemoteAPI: conf.AdvertiseAddr,
131
-		DefaultAddrPool:    defaultAddrPool,
132
-		SubnetSize:         int(conf.SubnetSize),
133
-		JoinAddr:           joinAddr,
134
-		StateDir:           n.cluster.root,
135
-		JoinToken:          conf.joinToken,
131
+		NetworkConfig: &swarmallocator.NetworkConfig{
132
+			DefaultAddrPool: conf.DefaultAddressPool,
133
+			SubnetSize:      conf.SubnetSize,
134
+		},
135
+		JoinAddr:  joinAddr,
136
+		StateDir:  n.cluster.root,
137
+		JoinToken: conf.joinToken,
136 138
 		Executor: container.NewExecutor(
137 139
 			n.cluster.config.Backend,
138 140
 			n.cluster.config.PluginBackend,
... ...
@@ -92,6 +92,10 @@ func (c *Cluster) Init(req types.InitRequest) (string, error) {
92 92
 		}
93 93
 	}
94 94
 
95
+	//Validate Default Address Pool input
96
+	if err := validateDefaultAddrPool(req.DefaultAddrPool, req.SubnetSize); err != nil {
97
+		return "", err
98
+	}
95 99
 	nr, err := c.newNodeRunner(nodeStartConfig{
96 100
 		forceNewCluster:    req.ForceNewCluster,
97 101
 		autolock:           req.AutoLockManagers,
... ...
@@ -353,7 +353,7 @@ func TestServiceWithDefaultAddressPoolInit(t *testing.T) {
353 353
 	d.Stop(t)
354 354
 
355 355
 	// Clean up , set it back to original one to make sure other tests don't fail
356
-	ipAddr = []string{"10.10.0.0/8"}
356
+	ipAddr = []string{"10.0.0.0/8"}
357 357
 	ops = append(ops, daemon.WithSwarmDefaultAddrPool(ipAddr))
358 358
 	ops = append(ops, daemon.WithSwarmDefaultAddrPoolSubnetSize(24))
359 359
 	d = swarm.NewSwarm(t, testEnv, ops...)
... ...
@@ -125,7 +125,7 @@ github.com/containerd/ttrpc 94dde388801693c54f88a6596f713b51a8b30b2d
125 125
 github.com/gogo/googleapis 08a7655d27152912db7aaf4f983275eaf8d128ef
126 126
 
127 127
 # cluster
128
-github.com/docker/swarmkit cfa742c8abe6f8e922f6e4e920153c408e7d9c3b
128
+github.com/docker/swarmkit d7d23d763a2d47ad6e540f81ab3609f6c323e9be
129 129
 github.com/gogo/protobuf v1.0.0
130 130
 github.com/cloudflare/cfssl 1.3.2
131 131
 github.com/fernet/fernet-go 1b2437bc582b3cfbb341ee5a29f8ef5b42912ff2
... ...
@@ -136,7 +136,7 @@ func (s *session) start(ctx context.Context, description *api.NodeDescription) e
136 136
 	// then in `run` it's possible that we just terminate the function because
137 137
 	// `ctx` is done and hence fail to propagate the timeout error to the agent.
138 138
 	// If the error is not propogated to the agent, the agent will not close
139
-	// the session or rebuild a new sesssion.
139
+	// the session or rebuild a new session.
140 140
 	sessionCtx, cancelSession := context.WithCancel(ctx)
141 141
 
142 142
 	// Need to run Session in a goroutine since there's no way to set a
... ...
@@ -622,6 +622,20 @@ type ContainerSpec struct {
622 622
 	// PidsLimit prevents from OS resource damage by applications inside the container
623 623
 	// using fork bomb attack.
624 624
 	PidsLimit int64 `protobuf:"varint,25,opt,name=pidsLimit,proto3" json:"pidsLimit,omitempty"`
625
+	// Sysctls sets namespaced kernel parameters (sysctls) in the container. This
626
+	// option is equivalent to passing --sysctl to docker run.
627
+	//
628
+	// Note that while options are subject to the same restrictions as arguments
629
+	// passed to the --sysctl flag on docker run, those options are not further
630
+	// validated to ensure that they are safe or sensible in a clustered
631
+	// environment.
632
+	//
633
+	// Additionally, sysctls are not validated for support in the underlying
634
+	// daemon. For information about supported options, refer to the
635
+	// documentation at:
636
+	//
637
+	// https://docs.docker.com/engine/reference/commandline/run/#configure-namespaced-kernel-parameters-sysctls-at-runtime
638
+	Sysctls map[string]string `protobuf:"bytes,26,rep,name=sysctls" json:"sysctls,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
625 639
 }
626 640
 
627 641
 func (m *ContainerSpec) Reset()                    { *m = ContainerSpec{} }
... ...
@@ -1176,6 +1190,13 @@ func (m *ContainerSpec) CopyFrom(src interface{}) {
1176 1176
 		m.Healthcheck = &HealthConfig{}
1177 1177
 		deepcopy.Copy(m.Healthcheck, o.Healthcheck)
1178 1178
 	}
1179
+	if o.Sysctls != nil {
1180
+		m.Sysctls = make(map[string]string, len(o.Sysctls))
1181
+		for k, v := range o.Sysctls {
1182
+			m.Sysctls[k] = v
1183
+		}
1184
+	}
1185
+
1179 1186
 }
1180 1187
 
1181 1188
 func (m *ContainerSpec_PullOptions) Copy() *ContainerSpec_PullOptions {
... ...
@@ -2064,6 +2085,25 @@ func (m *ContainerSpec) MarshalTo(dAtA []byte) (int, error) {
2064 2064
 		i++
2065 2065
 		i = encodeVarintSpecs(dAtA, i, uint64(m.PidsLimit))
2066 2066
 	}
2067
+	if len(m.Sysctls) > 0 {
2068
+		for k, _ := range m.Sysctls {
2069
+			dAtA[i] = 0xd2
2070
+			i++
2071
+			dAtA[i] = 0x1
2072
+			i++
2073
+			v := m.Sysctls[k]
2074
+			mapSize := 1 + len(k) + sovSpecs(uint64(len(k))) + 1 + len(v) + sovSpecs(uint64(len(v)))
2075
+			i = encodeVarintSpecs(dAtA, i, uint64(mapSize))
2076
+			dAtA[i] = 0xa
2077
+			i++
2078
+			i = encodeVarintSpecs(dAtA, i, uint64(len(k)))
2079
+			i += copy(dAtA[i:], k)
2080
+			dAtA[i] = 0x12
2081
+			i++
2082
+			i = encodeVarintSpecs(dAtA, i, uint64(len(v)))
2083
+			i += copy(dAtA[i:], v)
2084
+		}
2085
+	}
2067 2086
 	return i, nil
2068 2087
 }
2069 2088
 
... ...
@@ -2781,6 +2821,14 @@ func (m *ContainerSpec) Size() (n int) {
2781 2781
 	if m.PidsLimit != 0 {
2782 2782
 		n += 2 + sovSpecs(uint64(m.PidsLimit))
2783 2783
 	}
2784
+	if len(m.Sysctls) > 0 {
2785
+		for k, v := range m.Sysctls {
2786
+			_ = k
2787
+			_ = v
2788
+			mapEntrySize := 1 + len(k) + sovSpecs(uint64(len(k))) + 1 + len(v) + sovSpecs(uint64(len(v)))
2789
+			n += mapEntrySize + 2 + sovSpecs(uint64(mapEntrySize))
2790
+		}
2791
+	}
2784 2792
 	return n
2785 2793
 }
2786 2794
 
... ...
@@ -3103,6 +3151,16 @@ func (this *ContainerSpec) String() string {
3103 3103
 		mapStringForLabels += fmt.Sprintf("%v: %v,", k, this.Labels[k])
3104 3104
 	}
3105 3105
 	mapStringForLabels += "}"
3106
+	keysForSysctls := make([]string, 0, len(this.Sysctls))
3107
+	for k, _ := range this.Sysctls {
3108
+		keysForSysctls = append(keysForSysctls, k)
3109
+	}
3110
+	sortkeys.Strings(keysForSysctls)
3111
+	mapStringForSysctls := "map[string]string{"
3112
+	for _, k := range keysForSysctls {
3113
+		mapStringForSysctls += fmt.Sprintf("%v: %v,", k, this.Sysctls[k])
3114
+	}
3115
+	mapStringForSysctls += "}"
3106 3116
 	s := strings.Join([]string{`&ContainerSpec{`,
3107 3117
 		`Image:` + fmt.Sprintf("%v", this.Image) + `,`,
3108 3118
 		`Labels:` + mapStringForLabels + `,`,
... ...
@@ -3129,6 +3187,7 @@ func (this *ContainerSpec) String() string {
3129 3129
 		`Init:` + strings.Replace(fmt.Sprintf("%v", this.Init), "BoolValue", "google_protobuf4.BoolValue", 1) + `,`,
3130 3130
 		`Isolation:` + fmt.Sprintf("%v", this.Isolation) + `,`,
3131 3131
 		`PidsLimit:` + fmt.Sprintf("%v", this.PidsLimit) + `,`,
3132
+		`Sysctls:` + mapStringForSysctls + `,`,
3132 3133
 		`}`,
3133 3134
 	}, "")
3134 3135
 	return s
... ...
@@ -5277,6 +5336,124 @@ func (m *ContainerSpec) Unmarshal(dAtA []byte) error {
5277 5277
 					break
5278 5278
 				}
5279 5279
 			}
5280
+		case 26:
5281
+			if wireType != 2 {
5282
+				return fmt.Errorf("proto: wrong wireType = %d for field Sysctls", wireType)
5283
+			}
5284
+			var msglen int
5285
+			for shift := uint(0); ; shift += 7 {
5286
+				if shift >= 64 {
5287
+					return ErrIntOverflowSpecs
5288
+				}
5289
+				if iNdEx >= l {
5290
+					return io.ErrUnexpectedEOF
5291
+				}
5292
+				b := dAtA[iNdEx]
5293
+				iNdEx++
5294
+				msglen |= (int(b) & 0x7F) << shift
5295
+				if b < 0x80 {
5296
+					break
5297
+				}
5298
+			}
5299
+			if msglen < 0 {
5300
+				return ErrInvalidLengthSpecs
5301
+			}
5302
+			postIndex := iNdEx + msglen
5303
+			if postIndex > l {
5304
+				return io.ErrUnexpectedEOF
5305
+			}
5306
+			if m.Sysctls == nil {
5307
+				m.Sysctls = make(map[string]string)
5308
+			}
5309
+			var mapkey string
5310
+			var mapvalue string
5311
+			for iNdEx < postIndex {
5312
+				entryPreIndex := iNdEx
5313
+				var wire uint64
5314
+				for shift := uint(0); ; shift += 7 {
5315
+					if shift >= 64 {
5316
+						return ErrIntOverflowSpecs
5317
+					}
5318
+					if iNdEx >= l {
5319
+						return io.ErrUnexpectedEOF
5320
+					}
5321
+					b := dAtA[iNdEx]
5322
+					iNdEx++
5323
+					wire |= (uint64(b) & 0x7F) << shift
5324
+					if b < 0x80 {
5325
+						break
5326
+					}
5327
+				}
5328
+				fieldNum := int32(wire >> 3)
5329
+				if fieldNum == 1 {
5330
+					var stringLenmapkey uint64
5331
+					for shift := uint(0); ; shift += 7 {
5332
+						if shift >= 64 {
5333
+							return ErrIntOverflowSpecs
5334
+						}
5335
+						if iNdEx >= l {
5336
+							return io.ErrUnexpectedEOF
5337
+						}
5338
+						b := dAtA[iNdEx]
5339
+						iNdEx++
5340
+						stringLenmapkey |= (uint64(b) & 0x7F) << shift
5341
+						if b < 0x80 {
5342
+							break
5343
+						}
5344
+					}
5345
+					intStringLenmapkey := int(stringLenmapkey)
5346
+					if intStringLenmapkey < 0 {
5347
+						return ErrInvalidLengthSpecs
5348
+					}
5349
+					postStringIndexmapkey := iNdEx + intStringLenmapkey
5350
+					if postStringIndexmapkey > l {
5351
+						return io.ErrUnexpectedEOF
5352
+					}
5353
+					mapkey = string(dAtA[iNdEx:postStringIndexmapkey])
5354
+					iNdEx = postStringIndexmapkey
5355
+				} else if fieldNum == 2 {
5356
+					var stringLenmapvalue uint64
5357
+					for shift := uint(0); ; shift += 7 {
5358
+						if shift >= 64 {
5359
+							return ErrIntOverflowSpecs
5360
+						}
5361
+						if iNdEx >= l {
5362
+							return io.ErrUnexpectedEOF
5363
+						}
5364
+						b := dAtA[iNdEx]
5365
+						iNdEx++
5366
+						stringLenmapvalue |= (uint64(b) & 0x7F) << shift
5367
+						if b < 0x80 {
5368
+							break
5369
+						}
5370
+					}
5371
+					intStringLenmapvalue := int(stringLenmapvalue)
5372
+					if intStringLenmapvalue < 0 {
5373
+						return ErrInvalidLengthSpecs
5374
+					}
5375
+					postStringIndexmapvalue := iNdEx + intStringLenmapvalue
5376
+					if postStringIndexmapvalue > l {
5377
+						return io.ErrUnexpectedEOF
5378
+					}
5379
+					mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue])
5380
+					iNdEx = postStringIndexmapvalue
5381
+				} else {
5382
+					iNdEx = entryPreIndex
5383
+					skippy, err := skipSpecs(dAtA[iNdEx:])
5384
+					if err != nil {
5385
+						return err
5386
+					}
5387
+					if skippy < 0 {
5388
+						return ErrInvalidLengthSpecs
5389
+					}
5390
+					if (iNdEx + skippy) > postIndex {
5391
+						return io.ErrUnexpectedEOF
5392
+					}
5393
+					iNdEx += skippy
5394
+				}
5395
+			}
5396
+			m.Sysctls[mapkey] = mapvalue
5397
+			iNdEx = postIndex
5280 5398
 		default:
5281 5399
 			iNdEx = preIndex
5282 5400
 			skippy, err := skipSpecs(dAtA[iNdEx:])
... ...
@@ -6588,139 +6765,141 @@ var (
6588 6588
 func init() { proto.RegisterFile("github.com/docker/swarmkit/api/specs.proto", fileDescriptorSpecs) }
6589 6589
 
6590 6590
 var fileDescriptorSpecs = []byte{
6591
-	// 2131 bytes of a gzipped FileDescriptorProto
6592
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x58, 0x4f, 0x6f, 0x1b, 0xc7,
6593
-	0x15, 0x17, 0x25, 0x8a, 0x22, 0xdf, 0x52, 0x36, 0x35, 0x71, 0x9c, 0x15, 0x6d, 0x4b, 0x34, 0xe3,
6594
-	0xb8, 0x4a, 0x82, 0x52, 0xa8, 0x1a, 0xa4, 0x4e, 0xdc, 0xb4, 0x25, 0x45, 0x46, 0x66, 0x6d, 0x4b,
6595
-	0xc4, 0x50, 0x56, 0x6b, 0xa0, 0x00, 0x31, 0xda, 0x1d, 0x91, 0x03, 0x2d, 0x77, 0xb6, 0xb3, 0x43,
6596
-	0x19, 0xbc, 0xf5, 0x18, 0xa8, 0x9f, 0x41, 0xe8, 0xa1, 0xe8, 0xbd, 0xfd, 0x16, 0x3e, 0xf6, 0xd8,
6597
-	0x5e, 0x84, 0x44, 0x5f, 0xa1, 0xb7, 0x5e, 0x5a, 0xcc, 0xec, 0xec, 0x92, 0x94, 0x57, 0x96, 0x81,
6598
-	0xfa, 0xd0, 0xdb, 0xcc, 0xdb, 0xdf, 0xef, 0xcd, 0xbf, 0xdf, 0xbc, 0xf7, 0x66, 0xe1, 0xb3, 0x3e,
6599
-	0x93, 0x83, 0xd1, 0x61, 0xcd, 0xe1, 0xc3, 0x4d, 0x97, 0x3b, 0xc7, 0x54, 0x6c, 0x86, 0xaf, 0x88,
6600
-	0x18, 0x1e, 0x33, 0xb9, 0x49, 0x02, 0xb6, 0x19, 0x06, 0xd4, 0x09, 0x6b, 0x81, 0xe0, 0x92, 0x23,
6601
-	0x14, 0x01, 0x6a, 0x31, 0xa0, 0x76, 0xf2, 0x93, 0xf2, 0x75, 0x7c, 0x39, 0x0e, 0xa8, 0xe1, 0x97,
6602
-	0x6f, 0xf5, 0x79, 0x9f, 0xeb, 0xe6, 0xa6, 0x6a, 0x19, 0xeb, 0x5a, 0x9f, 0xf3, 0xbe, 0x47, 0x37,
6603
-	0x75, 0xef, 0x70, 0x74, 0xb4, 0xe9, 0x8e, 0x04, 0x91, 0x8c, 0xfb, 0xe6, 0xfb, 0xea, 0xe5, 0xef,
6604
-	0xc4, 0x1f, 0x5f, 0x45, 0x7d, 0x25, 0x48, 0x10, 0x50, 0x61, 0x06, 0xac, 0x9e, 0x65, 0x21, 0xbf,
6605
-	0xcb, 0x5d, 0xda, 0x0d, 0xa8, 0x83, 0x76, 0xc0, 0x22, 0xbe, 0xcf, 0xa5, 0xf6, 0x1d, 0xda, 0x99,
6606
-	0x4a, 0x66, 0xc3, 0xda, 0x5a, 0xaf, 0xbd, 0xb9, 0xa6, 0x5a, 0x7d, 0x02, 0x6b, 0x64, 0x5f, 0x9f,
6607
-	0xaf, 0xcf, 0xe1, 0x69, 0x26, 0xfa, 0x25, 0x14, 0x5d, 0x1a, 0x32, 0x41, 0xdd, 0x9e, 0xe0, 0x1e,
6608
-	0xb5, 0xe7, 0x2b, 0x99, 0x8d, 0x1b, 0x5b, 0x77, 0xd3, 0x3c, 0xa9, 0xc1, 0x31, 0xf7, 0x28, 0xb6,
6609
-	0x0c, 0x43, 0x75, 0xd0, 0x0e, 0xc0, 0x90, 0x0e, 0x0f, 0xa9, 0x08, 0x07, 0x2c, 0xb0, 0x17, 0x34,
6610
-	0xfd, 0x47, 0x57, 0xd1, 0xd5, 0xdc, 0x6b, 0xcf, 0x13, 0x38, 0x9e, 0xa2, 0xa2, 0xe7, 0x50, 0x24,
6611
-	0x27, 0x84, 0x79, 0xe4, 0x90, 0x79, 0x4c, 0x8e, 0xed, 0xac, 0x76, 0xf5, 0xe9, 0x5b, 0x5d, 0xd5,
6612
-	0xa7, 0x08, 0x78, 0x86, 0x5e, 0x75, 0x01, 0x26, 0x03, 0xa1, 0x87, 0xb0, 0xd4, 0x69, 0xed, 0x36,
6613
-	0xdb, 0xbb, 0x3b, 0xa5, 0xb9, 0xf2, 0xea, 0xe9, 0x59, 0xe5, 0x43, 0xe5, 0x63, 0x02, 0xe8, 0x50,
6614
-	0xdf, 0x65, 0x7e, 0x1f, 0x6d, 0x40, 0xbe, 0xbe, 0xbd, 0xdd, 0xea, 0xec, 0xb7, 0x9a, 0xa5, 0x4c,
6615
-	0xb9, 0x7c, 0x7a, 0x56, 0xb9, 0x3d, 0x0b, 0xac, 0x3b, 0x0e, 0x0d, 0x24, 0x75, 0xcb, 0xd9, 0xef,
6616
-	0xfe, 0xbc, 0x36, 0x57, 0xfd, 0x2e, 0x03, 0xc5, 0xe9, 0x49, 0xa0, 0x87, 0x90, 0xab, 0x6f, 0xef,
6617
-	0xb7, 0x0f, 0x5a, 0xa5, 0xb9, 0x09, 0x7d, 0x1a, 0x51, 0x77, 0x24, 0x3b, 0xa1, 0xe8, 0x01, 0x2c,
6618
-	0x76, 0xea, 0x2f, 0xba, 0xad, 0x52, 0x66, 0x32, 0x9d, 0x69, 0x58, 0x87, 0x8c, 0x42, 0x8d, 0x6a,
6619
-	0xe2, 0x7a, 0x7b, 0xb7, 0x34, 0x9f, 0x8e, 0x6a, 0x0a, 0xc2, 0x7c, 0x33, 0x95, 0x3f, 0x65, 0xc1,
6620
-	0xea, 0x52, 0x71, 0xc2, 0x9c, 0xf7, 0x2c, 0x91, 0x2f, 0x21, 0x2b, 0x49, 0x78, 0xac, 0xa5, 0x61,
6621
-	0xa5, 0x4b, 0x63, 0x9f, 0x84, 0xc7, 0x6a, 0x50, 0x43, 0xd7, 0x78, 0xa5, 0x0c, 0x41, 0x03, 0x8f,
6622
-	0x39, 0x44, 0x52, 0x57, 0x2b, 0xc3, 0xda, 0xfa, 0x24, 0x8d, 0x8d, 0x13, 0x94, 0x99, 0xff, 0x93,
6623
-	0x39, 0x3c, 0x45, 0x45, 0x8f, 0x21, 0xd7, 0xf7, 0xf8, 0x21, 0xf1, 0xb4, 0x26, 0xac, 0xad, 0xfb,
6624
-	0x69, 0x4e, 0x76, 0x34, 0x62, 0xe2, 0xc0, 0x50, 0xd0, 0x23, 0xc8, 0x8d, 0x02, 0x97, 0x48, 0x6a,
6625
-	0xe7, 0x34, 0xb9, 0x92, 0x46, 0x7e, 0xa1, 0x11, 0xdb, 0xdc, 0x3f, 0x62, 0x7d, 0x6c, 0xf0, 0xe8,
6626
-	0x29, 0xe4, 0x7d, 0x2a, 0x5f, 0x71, 0x71, 0x1c, 0xda, 0x4b, 0x95, 0x85, 0x0d, 0x6b, 0xeb, 0xf3,
6627
-	0x54, 0x31, 0x46, 0x98, 0xba, 0x94, 0xc4, 0x19, 0x0c, 0xa9, 0x2f, 0x23, 0x37, 0x8d, 0x79, 0x3b,
6628
-	0x83, 0x13, 0x07, 0xe8, 0xe7, 0x90, 0xa7, 0xbe, 0x1b, 0x70, 0xe6, 0x4b, 0x3b, 0x7f, 0xf5, 0x44,
6629
-	0x5a, 0x06, 0xa3, 0x36, 0x13, 0x27, 0x0c, 0xc5, 0x16, 0xdc, 0xf3, 0x0e, 0x89, 0x73, 0x6c, 0x17,
6630
-	0xde, 0x71, 0x19, 0x09, 0xa3, 0x91, 0x83, 0xec, 0x90, 0xbb, 0xb4, 0xba, 0x09, 0x2b, 0x6f, 0x6c,
6631
-	0x35, 0x2a, 0x43, 0xde, 0x6c, 0x75, 0xa4, 0x91, 0x2c, 0x4e, 0xfa, 0xd5, 0x9b, 0xb0, 0x3c, 0xb3,
6632
-	0xad, 0xd5, 0xbf, 0x2e, 0x42, 0x3e, 0x3e, 0x6b, 0x54, 0x87, 0x82, 0xc3, 0x7d, 0x49, 0x98, 0x4f,
6633
-	0x85, 0x91, 0x57, 0xea, 0xc9, 0x6c, 0xc7, 0x20, 0xc5, 0x7a, 0x32, 0x87, 0x27, 0x2c, 0xf4, 0x2d,
6634
-	0x14, 0x04, 0x0d, 0xf9, 0x48, 0x38, 0x34, 0x34, 0xfa, 0xda, 0x48, 0x57, 0x48, 0x04, 0xc2, 0xf4,
6635
-	0xf7, 0x23, 0x26, 0xa8, 0xda, 0xe5, 0x10, 0x4f, 0xa8, 0xe8, 0x31, 0x2c, 0x09, 0x1a, 0x4a, 0x22,
6636
-	0xe4, 0xdb, 0x24, 0x82, 0x23, 0x48, 0x87, 0x7b, 0xcc, 0x19, 0xe3, 0x98, 0x81, 0x1e, 0x43, 0x21,
6637
-	0xf0, 0x88, 0xa3, 0xbd, 0xda, 0x8b, 0x9a, 0x7e, 0x2f, 0x8d, 0xde, 0x89, 0x41, 0x78, 0x82, 0x47,
6638
-	0x5f, 0x01, 0x78, 0xbc, 0xdf, 0x73, 0x05, 0x3b, 0xa1, 0xc2, 0x48, 0xac, 0x9c, 0xc6, 0x6e, 0x6a,
6639
-	0x04, 0x2e, 0x78, 0xbc, 0x1f, 0x35, 0xd1, 0xce, 0xff, 0xa4, 0xaf, 0x29, 0x6d, 0x3d, 0x05, 0x20,
6640
-	0xc9, 0x57, 0xa3, 0xae, 0x4f, 0xdf, 0xc9, 0x95, 0x39, 0x91, 0x29, 0x3a, 0xba, 0x0f, 0xc5, 0x23,
6641
-	0x2e, 0x1c, 0xda, 0x33, 0xb7, 0xa6, 0xa0, 0x35, 0x61, 0x69, 0x5b, 0xa4, 0x2f, 0xd4, 0x80, 0xa5,
6642
-	0x3e, 0xf5, 0xa9, 0x60, 0x8e, 0x0d, 0x7a, 0xb0, 0x87, 0xa9, 0x17, 0x32, 0x82, 0xe0, 0x91, 0x2f,
6643
-	0xd9, 0x90, 0x9a, 0x91, 0x62, 0x22, 0xfa, 0x1d, 0x7c, 0x10, 0x1f, 0x5f, 0x4f, 0xd0, 0x23, 0x2a,
6644
-	0xa8, 0xaf, 0x34, 0x60, 0xe9, 0x7d, 0xf8, 0xe4, 0xed, 0x1a, 0x30, 0x68, 0x13, 0x6c, 0x90, 0xb8,
6645
-	0xfc, 0x21, 0x6c, 0x14, 0x60, 0x49, 0x44, 0xe3, 0x56, 0xff, 0x98, 0x51, 0xaa, 0xbf, 0x84, 0x40,
6646
-	0x9b, 0x60, 0x25, 0xc3, 0x33, 0x57, 0xab, 0xb7, 0xd0, 0xb8, 0x71, 0x71, 0xbe, 0x0e, 0x31, 0xb6,
6647
-	0xdd, 0x54, 0x31, 0xc8, 0xb4, 0x5d, 0xd4, 0x82, 0xe5, 0x84, 0xa0, 0xca, 0x00, 0x93, 0x28, 0x2b,
6648
-	0x6f, 0x9b, 0xe9, 0xfe, 0x38, 0xa0, 0xb8, 0x28, 0xa6, 0x7a, 0xd5, 0xdf, 0x02, 0x7a, 0x73, 0x5f,
6649
-	0x10, 0x82, 0xec, 0x31, 0xf3, 0xcd, 0x34, 0xb0, 0x6e, 0xa3, 0x1a, 0x2c, 0x05, 0x64, 0xec, 0x71,
6650
-	0xe2, 0x9a, 0x8b, 0x71, 0xab, 0x16, 0x15, 0x08, 0xb5, 0xb8, 0x40, 0xa8, 0xd5, 0xfd, 0x31, 0x8e,
6651
-	0x41, 0xd5, 0xa7, 0xf0, 0x61, 0xea, 0xf1, 0xa2, 0x2d, 0x28, 0x26, 0x17, 0x6e, 0xb2, 0xd6, 0x9b,
6652
-	0x17, 0xe7, 0xeb, 0x56, 0x72, 0x33, 0xdb, 0x4d, 0x6c, 0x25, 0xa0, 0xb6, 0x5b, 0xfd, 0xde, 0x82,
6653
-	0xe5, 0x99, 0x6b, 0x8b, 0x6e, 0xc1, 0x22, 0x1b, 0x92, 0x3e, 0x35, 0x73, 0x8c, 0x3a, 0xa8, 0x05,
6654
-	0x39, 0x8f, 0x1c, 0x52, 0x4f, 0x5d, 0x5e, 0x75, 0x70, 0x3f, 0xbe, 0xf6, 0xfe, 0xd7, 0x9e, 0x69,
6655
-	0x7c, 0xcb, 0x97, 0x62, 0x8c, 0x0d, 0x19, 0xd9, 0xb0, 0xe4, 0xf0, 0xe1, 0x90, 0xf8, 0x2a, 0x4d,
6656
-	0x2c, 0x6c, 0x14, 0x70, 0xdc, 0x55, 0x3b, 0x43, 0x44, 0x3f, 0xb4, 0xb3, 0xda, 0xac, 0xdb, 0xa8,
6657
-	0x04, 0x0b, 0xd4, 0x3f, 0xb1, 0x17, 0xb5, 0x49, 0x35, 0x95, 0xc5, 0x65, 0xd1, 0xed, 0x2b, 0x60,
6658
-	0xd5, 0x54, 0xbc, 0x51, 0x48, 0x85, 0xbd, 0x14, 0xed, 0xa8, 0x6a, 0xa3, 0x9f, 0x41, 0x6e, 0xc8,
6659
-	0x47, 0xbe, 0x0c, 0xed, 0xbc, 0x9e, 0xec, 0x6a, 0xda, 0x64, 0x9f, 0x2b, 0x84, 0x51, 0x96, 0x81,
6660
-	0xa3, 0x16, 0xac, 0x84, 0x92, 0x07, 0xbd, 0xbe, 0x20, 0x0e, 0xed, 0x05, 0x54, 0x30, 0xee, 0x9a,
6661
-	0x30, 0xbc, 0xfa, 0xc6, 0xa1, 0x34, 0x4d, 0xc1, 0x87, 0x6f, 0x2a, 0xce, 0x8e, 0xa2, 0x74, 0x34,
6662
-	0x03, 0x75, 0xa0, 0x18, 0x8c, 0x3c, 0xaf, 0xc7, 0x83, 0x28, 0x23, 0x47, 0x77, 0xe7, 0x1d, 0xb6,
6663
-	0xac, 0x33, 0xf2, 0xbc, 0xbd, 0x88, 0x84, 0xad, 0x60, 0xd2, 0x41, 0xb7, 0x21, 0xd7, 0x17, 0x7c,
6664
-	0x14, 0x44, 0xf7, 0xa6, 0x80, 0x4d, 0x0f, 0x7d, 0x03, 0x4b, 0x21, 0x75, 0x04, 0x95, 0xa1, 0x5d,
6665
-	0xd4, 0x4b, 0xfd, 0x38, 0x6d, 0x90, 0xae, 0x86, 0x24, 0x77, 0x02, 0xc7, 0x1c, 0xb4, 0x0a, 0x0b,
6666
-	0x52, 0x8e, 0xed, 0xe5, 0x4a, 0x66, 0x23, 0xdf, 0x58, 0xba, 0x38, 0x5f, 0x5f, 0xd8, 0xdf, 0x7f,
6667
-	0x89, 0x95, 0x4d, 0x65, 0x8b, 0x01, 0x0f, 0xa5, 0x4f, 0x86, 0xd4, 0xbe, 0xa1, 0xf7, 0x36, 0xe9,
6668
-	0xa3, 0x97, 0x00, 0xae, 0x1f, 0xf6, 0x1c, 0x1d, 0x9e, 0xec, 0x9b, 0x7a, 0x75, 0x9f, 0x5f, 0xbf,
6669
-	0xba, 0xe6, 0x6e, 0xd7, 0x64, 0xcc, 0xe5, 0x8b, 0xf3, 0xf5, 0x42, 0xd2, 0xc5, 0x05, 0xd7, 0x0f,
6670
-	0xa3, 0x26, 0x6a, 0x80, 0x35, 0xa0, 0xc4, 0x93, 0x03, 0x67, 0x40, 0x9d, 0x63, 0xbb, 0x74, 0x75,
6671
-	0x0a, 0x7c, 0xa2, 0x61, 0xc6, 0xc3, 0x34, 0x49, 0x29, 0x58, 0x4d, 0x35, 0xb4, 0x57, 0xf4, 0x5e,
6672
-	0x45, 0x1d, 0x74, 0x0f, 0x80, 0x07, 0xd4, 0xef, 0x85, 0xd2, 0x65, 0xbe, 0x8d, 0xd4, 0x92, 0x71,
6673
-	0x41, 0x59, 0xba, 0xca, 0x80, 0xee, 0xa8, 0x04, 0x45, 0xdc, 0x1e, 0xf7, 0xbd, 0xb1, 0xfd, 0x81,
6674
-	0xfe, 0x9a, 0x57, 0x86, 0x3d, 0xdf, 0x1b, 0xa3, 0x75, 0xb0, 0xb4, 0x2e, 0x42, 0xd6, 0xf7, 0x89,
6675
-	0x67, 0xdf, 0xd2, 0xfb, 0x01, 0xca, 0xd4, 0xd5, 0x16, 0x75, 0x0e, 0xd1, 0x6e, 0x84, 0xf6, 0x87,
6676
-	0x57, 0x9f, 0x83, 0x99, 0xec, 0xe4, 0x1c, 0x0c, 0x07, 0xfd, 0x02, 0x20, 0x10, 0xec, 0x84, 0x79,
6677
-	0xb4, 0x4f, 0x43, 0xfb, 0xb6, 0x5e, 0xf4, 0x5a, 0x6a, 0x66, 0x4a, 0x50, 0x78, 0x8a, 0x81, 0x6a,
6678
-	0x90, 0x65, 0x3e, 0x93, 0xf6, 0x47, 0x26, 0x2b, 0x5d, 0x96, 0x6a, 0x83, 0x73, 0xef, 0x80, 0x78,
6679
-	0x23, 0x8a, 0x35, 0x0e, 0xb5, 0xa1, 0xc0, 0x42, 0xee, 0x69, 0xf9, 0xda, 0xb6, 0x8e, 0x6f, 0xef,
6680
-	0x70, 0x7e, 0xed, 0x98, 0x82, 0x27, 0x6c, 0x74, 0x17, 0x0a, 0x01, 0x73, 0xc3, 0x67, 0x6c, 0xc8,
6681
-	0xa4, 0xbd, 0x5a, 0xc9, 0x6c, 0x2c, 0xe0, 0x89, 0xa1, 0xfc, 0x15, 0x58, 0x53, 0x61, 0x40, 0x5d,
6682
-	0xdf, 0x63, 0x3a, 0x36, 0x91, 0x45, 0x35, 0xd5, 0x59, 0x9d, 0xa8, 0x89, 0xe9, 0xd0, 0x57, 0xc0,
6683
-	0x51, 0xe7, 0xeb, 0xf9, 0x47, 0x99, 0xf2, 0x16, 0x58, 0x53, 0xd7, 0x01, 0x7d, 0xac, 0xc2, 0x72,
6684
-	0x9f, 0x85, 0x52, 0x8c, 0x7b, 0x64, 0x24, 0x07, 0xf6, 0xaf, 0x34, 0xa1, 0x18, 0x1b, 0xeb, 0x23,
6685
-	0x39, 0x28, 0xf7, 0x60, 0xa2, 0x2a, 0x54, 0x01, 0x4b, 0xa9, 0x35, 0xa4, 0xe2, 0x84, 0x0a, 0x55,
6686
-	0xf2, 0x28, 0x31, 0x4c, 0x9b, 0xd4, 0xad, 0x0a, 0x29, 0x11, 0xce, 0x40, 0x07, 0xb5, 0x02, 0x36,
6687
-	0x3d, 0x15, 0xa5, 0xe2, 0xab, 0x6b, 0xa2, 0x94, 0xe9, 0x56, 0xff, 0x96, 0x81, 0x42, 0xb2, 0x0d,
6688
-	0xe8, 0x0b, 0x58, 0x69, 0x77, 0xf7, 0x9e, 0xd5, 0xf7, 0xdb, 0x7b, 0xbb, 0xbd, 0x66, 0xeb, 0xdb,
6689
-	0xfa, 0x8b, 0x67, 0xfb, 0xa5, 0xb9, 0xf2, 0xbd, 0xd3, 0xb3, 0xca, 0xea, 0x24, 0xe2, 0xc6, 0xf0,
6690
-	0x26, 0x3d, 0x22, 0x23, 0x4f, 0xce, 0xb2, 0x3a, 0x78, 0x6f, 0xbb, 0xd5, 0xed, 0x96, 0x32, 0x57,
6691
-	0xb1, 0x3a, 0x82, 0x3b, 0x34, 0x0c, 0xd1, 0x16, 0x94, 0x26, 0xac, 0x27, 0x2f, 0x3b, 0x2d, 0x7c,
6692
-	0x50, 0x9a, 0x2f, 0xdf, 0x3d, 0x3d, 0xab, 0xd8, 0x6f, 0x92, 0x9e, 0x8c, 0x03, 0x2a, 0x0e, 0xcc,
6693
-	0x73, 0xe1, 0x5f, 0x19, 0x28, 0x4e, 0x57, 0x9b, 0x68, 0x3b, 0xaa, 0x12, 0xf5, 0x31, 0xdc, 0xd8,
6694
-	0xda, 0xbc, 0xae, 0x3a, 0xd5, 0x59, 0xce, 0x1b, 0x29, 0xbf, 0xcf, 0xd5, 0xc3, 0x50, 0x93, 0xd1,
6695
-	0x17, 0xb0, 0x18, 0x70, 0x21, 0xe3, 0x7c, 0x90, 0xae, 0x56, 0x2e, 0xe2, 0x1a, 0x26, 0x02, 0x57,
6696
-	0x07, 0x70, 0x63, 0xd6, 0x1b, 0x7a, 0x00, 0x0b, 0x07, 0xed, 0x4e, 0x69, 0xae, 0x7c, 0xe7, 0xf4,
6697
-	0xac, 0xf2, 0xd1, 0xec, 0xc7, 0x03, 0x26, 0xe4, 0x88, 0x78, 0xed, 0x0e, 0xfa, 0x0c, 0x16, 0x9b,
6698
-	0xbb, 0x5d, 0x8c, 0x4b, 0x99, 0xf2, 0xfa, 0xe9, 0x59, 0xe5, 0xce, 0x2c, 0x4e, 0x7d, 0xe2, 0x23,
6699
-	0xdf, 0xc5, 0xfc, 0x30, 0x79, 0x24, 0xfd, 0x7b, 0x1e, 0x2c, 0x93, 0x26, 0xdf, 0xf7, 0x3b, 0x7a,
6700
-	0x39, 0xaa, 0x01, 0xe3, 0xf8, 0x37, 0x7f, 0x6d, 0x29, 0x58, 0x8c, 0x08, 0x46, 0x97, 0xf7, 0xa1,
6701
-	0xc8, 0x82, 0x93, 0x2f, 0x7b, 0xd4, 0x27, 0x87, 0x9e, 0x79, 0x2f, 0xe5, 0xb1, 0xa5, 0x6c, 0xad,
6702
-	0xc8, 0xa4, 0x82, 0x2f, 0xf3, 0x25, 0x15, 0xbe, 0x79, 0x09, 0xe5, 0x71, 0xd2, 0x47, 0xdf, 0x40,
6703
-	0x96, 0x05, 0x64, 0x68, 0xea, 0xd7, 0xd4, 0x15, 0xb4, 0x3b, 0xf5, 0xe7, 0xe6, 0xde, 0x34, 0xf2,
6704
-	0x17, 0xe7, 0xeb, 0x59, 0x65, 0xc0, 0x9a, 0x86, 0xd6, 0xe2, 0x12, 0x52, 0x8d, 0xa4, 0x13, 0x69,
6705
-	0x1e, 0x4f, 0x59, 0x94, 0xf6, 0x99, 0xdf, 0x17, 0x34, 0x0c, 0x75, 0x4a, 0xcd, 0xe3, 0xb8, 0x8b,
6706
-	0xca, 0xb0, 0x64, 0x0a, 0x51, 0x5d, 0x79, 0x16, 0x54, 0x91, 0x67, 0x0c, 0x8d, 0x65, 0xb0, 0xa2,
6707
-	0xdd, 0xe8, 0x1d, 0x09, 0x3e, 0xac, 0xfe, 0x27, 0x0b, 0xd6, 0xb6, 0x37, 0x0a, 0xa5, 0xa9, 0x29,
6708
-	0xde, 0xdb, 0xe6, 0xbf, 0x84, 0x15, 0xa2, 0xdf, 0xe5, 0xc4, 0x57, 0x09, 0x5a, 0xd7, 0xf7, 0xe6,
6709
-	0x00, 0x1e, 0xa4, 0xba, 0x4b, 0xc0, 0xd1, 0x5b, 0xa0, 0x91, 0x53, 0x3e, 0xed, 0x0c, 0x2e, 0x91,
6710
-	0x4b, 0x5f, 0x50, 0x17, 0x96, 0xb9, 0x70, 0x06, 0x34, 0x94, 0x51, 0x5a, 0x37, 0xef, 0xd8, 0xd4,
6711
-	0x3f, 0x1c, 0x7b, 0xd3, 0x40, 0x93, 0xd3, 0xa2, 0xd9, 0xce, 0xfa, 0x40, 0x8f, 0x20, 0x2b, 0xc8,
6712
-	0x51, 0xfc, 0x56, 0x49, 0xbd, 0x24, 0x98, 0x1c, 0xc9, 0x19, 0x17, 0x9a, 0x81, 0x7e, 0x0d, 0xe0,
6713
-	0xb2, 0x30, 0x20, 0xd2, 0x19, 0x50, 0x61, 0x0e, 0x3b, 0x75, 0x89, 0xcd, 0x04, 0x35, 0xe3, 0x65,
6714
-	0x8a, 0x8d, 0x9e, 0x42, 0xc1, 0x21, 0xb1, 0x5c, 0x73, 0x57, 0x3f, 0xee, 0xb7, 0xeb, 0xc6, 0x45,
6715
-	0x49, 0xb9, 0xb8, 0x38, 0x5f, 0xcf, 0xc7, 0x16, 0x9c, 0x77, 0x88, 0x91, 0xef, 0x53, 0x58, 0x56,
6716
-	0x8f, 0xfe, 0x9e, 0x1b, 0x85, 0xb3, 0x48, 0x26, 0x57, 0xe4, 0x68, 0xf5, 0x82, 0x34, 0x61, 0x2f,
6717
-	0x3e, 0xce, 0xa2, 0x9c, 0xb2, 0xa1, 0xdf, 0xc0, 0x0a, 0xf5, 0x1d, 0x31, 0xd6, 0x62, 0x8d, 0x67,
6718
-	0x98, 0xbf, 0x7a, 0xb1, 0xad, 0x04, 0x3c, 0xb3, 0xd8, 0x12, 0xbd, 0x64, 0xaf, 0xfe, 0x33, 0x03,
6719
-	0x10, 0x95, 0x3d, 0xef, 0x57, 0x80, 0x08, 0xb2, 0x2e, 0x91, 0x44, 0x6b, 0xae, 0x88, 0x75, 0x1b,
6720
-	0x7d, 0x0d, 0x20, 0xe9, 0x30, 0x50, 0xa1, 0xd7, 0xef, 0x1b, 0xd9, 0xbc, 0x2d, 0x1c, 0x4c, 0xa1,
6721
-	0xd1, 0x16, 0xe4, 0xcc, 0x8b, 0x32, 0x7b, 0x2d, 0xcf, 0x20, 0xab, 0x7f, 0xc9, 0x00, 0x44, 0xcb,
6722
-	0xfc, 0xbf, 0x5e, 0x5b, 0xc3, 0x7e, 0xfd, 0xc3, 0xda, 0xdc, 0x3f, 0x7e, 0x58, 0x9b, 0xfb, 0xc3,
6723
-	0xc5, 0x5a, 0xe6, 0xf5, 0xc5, 0x5a, 0xe6, 0xef, 0x17, 0x6b, 0x99, 0xef, 0x2f, 0xd6, 0x32, 0x87,
6724
-	0x39, 0x5d, 0x99, 0xfc, 0xf4, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xb8, 0xa3, 0x85, 0xdc, 0xc7,
6725
-	0x15, 0x00, 0x00,
6591
+	// 2166 bytes of a gzipped FileDescriptorProto
6592
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x58, 0x4d, 0x6f, 0x1b, 0xc9,
6593
+	0xd1, 0x16, 0x25, 0x8a, 0x1f, 0x35, 0x94, 0x4d, 0xf5, 0xda, 0xde, 0x11, 0x6d, 0x4b, 0x34, 0xd7,
6594
+	0xeb, 0x57, 0xbb, 0x8b, 0x97, 0x42, 0x94, 0xc5, 0xc6, 0x6b, 0x67, 0x93, 0x90, 0x22, 0x57, 0x62,
6595
+	0x6c, 0x4b, 0x44, 0x53, 0x56, 0x62, 0x20, 0x00, 0xd1, 0x9a, 0x69, 0x91, 0x03, 0x0d, 0xa7, 0x27,
6596
+	0xdd, 0x4d, 0x19, 0xbc, 0xe5, 0xb8, 0x50, 0x7e, 0x83, 0x90, 0x43, 0x90, 0x7b, 0xf2, 0x2f, 0x7c,
6597
+	0xcc, 0x31, 0xb9, 0x08, 0x59, 0x1d, 0xf2, 0x07, 0x72, 0xcb, 0x25, 0x41, 0xf7, 0xf4, 0xf0, 0x43,
6598
+	0x1e, 0x59, 0x0e, 0xe2, 0x43, 0x6e, 0xdd, 0x35, 0xcf, 0x53, 0xfd, 0xf5, 0x54, 0x75, 0xf5, 0xc0,
6599
+	0xe7, 0x3d, 0x4f, 0xf6, 0x87, 0x87, 0x55, 0x87, 0x0d, 0x36, 0x5c, 0xe6, 0x1c, 0x53, 0xbe, 0x21,
6600
+	0x5e, 0x13, 0x3e, 0x38, 0xf6, 0xe4, 0x06, 0x09, 0xbd, 0x0d, 0x11, 0x52, 0x47, 0x54, 0x43, 0xce,
6601
+	0x24, 0x43, 0x28, 0x02, 0x54, 0x63, 0x40, 0xf5, 0xe4, 0x07, 0xa5, 0xeb, 0xf8, 0x72, 0x14, 0x52,
6602
+	0xc3, 0x2f, 0xdd, 0xea, 0xb1, 0x1e, 0xd3, 0xcd, 0x0d, 0xd5, 0x32, 0xd6, 0xd5, 0x1e, 0x63, 0x3d,
6603
+	0x9f, 0x6e, 0xe8, 0xde, 0xe1, 0xf0, 0x68, 0xc3, 0x1d, 0x72, 0x22, 0x3d, 0x16, 0x98, 0xef, 0x2b,
6604
+	0x97, 0xbf, 0x93, 0x60, 0x74, 0x15, 0xf5, 0x35, 0x27, 0x61, 0x48, 0xb9, 0x19, 0xb0, 0x72, 0x96,
6605
+	0x86, 0xdc, 0x2e, 0x73, 0x69, 0x27, 0xa4, 0x0e, 0xda, 0x06, 0x8b, 0x04, 0x01, 0x93, 0xda, 0xb7,
6606
+	0xb0, 0x53, 0xe5, 0xd4, 0xba, 0xb5, 0xb9, 0x56, 0x7d, 0x7b, 0x4d, 0xd5, 0xda, 0x04, 0x56, 0x4f,
6607
+	0xbf, 0x39, 0x5f, 0x9b, 0xc3, 0xd3, 0x4c, 0xf4, 0x53, 0x28, 0xb8, 0x54, 0x78, 0x9c, 0xba, 0x5d,
6608
+	0xce, 0x7c, 0x6a, 0xcf, 0x97, 0x53, 0xeb, 0x37, 0x36, 0xef, 0x25, 0x79, 0x52, 0x83, 0x63, 0xe6,
6609
+	0x53, 0x6c, 0x19, 0x86, 0xea, 0xa0, 0x6d, 0x80, 0x01, 0x1d, 0x1c, 0x52, 0x2e, 0xfa, 0x5e, 0x68,
6610
+	0x2f, 0x68, 0xfa, 0xff, 0x5d, 0x45, 0x57, 0x73, 0xaf, 0xbe, 0x18, 0xc3, 0xf1, 0x14, 0x15, 0xbd,
6611
+	0x80, 0x02, 0x39, 0x21, 0x9e, 0x4f, 0x0e, 0x3d, 0xdf, 0x93, 0x23, 0x3b, 0xad, 0x5d, 0x7d, 0xf6,
6612
+	0x4e, 0x57, 0xb5, 0x29, 0x02, 0x9e, 0xa1, 0x57, 0x5c, 0x80, 0xc9, 0x40, 0xe8, 0x11, 0x64, 0xdb,
6613
+	0xcd, 0xdd, 0x46, 0x6b, 0x77, 0xbb, 0x38, 0x57, 0x5a, 0x39, 0x3d, 0x2b, 0xdf, 0x56, 0x3e, 0x26,
6614
+	0x80, 0x36, 0x0d, 0x5c, 0x2f, 0xe8, 0xa1, 0x75, 0xc8, 0xd5, 0xb6, 0xb6, 0x9a, 0xed, 0xfd, 0x66,
6615
+	0xa3, 0x98, 0x2a, 0x95, 0x4e, 0xcf, 0xca, 0x77, 0x66, 0x81, 0x35, 0xc7, 0xa1, 0xa1, 0xa4, 0x6e,
6616
+	0x29, 0xfd, 0xdd, 0xef, 0x57, 0xe7, 0x2a, 0xdf, 0xa5, 0xa0, 0x30, 0x3d, 0x09, 0xf4, 0x08, 0x32,
6617
+	0xb5, 0xad, 0xfd, 0xd6, 0x41, 0xb3, 0x38, 0x37, 0xa1, 0x4f, 0x23, 0x6a, 0x8e, 0xf4, 0x4e, 0x28,
6618
+	0x7a, 0x08, 0x8b, 0xed, 0xda, 0xcb, 0x4e, 0xb3, 0x98, 0x9a, 0x4c, 0x67, 0x1a, 0xd6, 0x26, 0x43,
6619
+	0xa1, 0x51, 0x0d, 0x5c, 0x6b, 0xed, 0x16, 0xe7, 0x93, 0x51, 0x0d, 0x4e, 0xbc, 0xc0, 0x4c, 0xe5,
6620
+	0x77, 0x69, 0xb0, 0x3a, 0x94, 0x9f, 0x78, 0xce, 0x07, 0x96, 0xc8, 0x57, 0x90, 0x96, 0x44, 0x1c,
6621
+	0x6b, 0x69, 0x58, 0xc9, 0xd2, 0xd8, 0x27, 0xe2, 0x58, 0x0d, 0x6a, 0xe8, 0x1a, 0xaf, 0x94, 0xc1,
6622
+	0x69, 0xe8, 0x7b, 0x0e, 0x91, 0xd4, 0xd5, 0xca, 0xb0, 0x36, 0x3f, 0x4d, 0x62, 0xe3, 0x31, 0xca,
6623
+	0xcc, 0x7f, 0x67, 0x0e, 0x4f, 0x51, 0xd1, 0x53, 0xc8, 0xf4, 0x7c, 0x76, 0x48, 0x7c, 0xad, 0x09,
6624
+	0x6b, 0xf3, 0x41, 0x92, 0x93, 0x6d, 0x8d, 0x98, 0x38, 0x30, 0x14, 0xf4, 0x18, 0x32, 0xc3, 0xd0,
6625
+	0x25, 0x92, 0xda, 0x19, 0x4d, 0x2e, 0x27, 0x91, 0x5f, 0x6a, 0xc4, 0x16, 0x0b, 0x8e, 0xbc, 0x1e,
6626
+	0x36, 0x78, 0xf4, 0x0c, 0x72, 0x01, 0x95, 0xaf, 0x19, 0x3f, 0x16, 0x76, 0xb6, 0xbc, 0xb0, 0x6e,
6627
+	0x6d, 0x7e, 0x91, 0x28, 0xc6, 0x08, 0x53, 0x93, 0x92, 0x38, 0xfd, 0x01, 0x0d, 0x64, 0xe4, 0xa6,
6628
+	0x3e, 0x6f, 0xa7, 0xf0, 0xd8, 0x01, 0xfa, 0x31, 0xe4, 0x68, 0xe0, 0x86, 0xcc, 0x0b, 0xa4, 0x9d,
6629
+	0xbb, 0x7a, 0x22, 0x4d, 0x83, 0x51, 0x9b, 0x89, 0xc7, 0x0c, 0xc5, 0xe6, 0xcc, 0xf7, 0x0f, 0x89,
6630
+	0x73, 0x6c, 0xe7, 0xdf, 0x73, 0x19, 0x63, 0x46, 0x3d, 0x03, 0xe9, 0x01, 0x73, 0x69, 0x65, 0x03,
6631
+	0x96, 0xdf, 0xda, 0x6a, 0x54, 0x82, 0x9c, 0xd9, 0xea, 0x48, 0x23, 0x69, 0x3c, 0xee, 0x57, 0x6e,
6632
+	0xc2, 0xd2, 0xcc, 0xb6, 0x56, 0xfe, 0xb8, 0x08, 0xb9, 0xf8, 0xac, 0x51, 0x0d, 0xf2, 0x0e, 0x0b,
6633
+	0x24, 0xf1, 0x02, 0xca, 0x8d, 0xbc, 0x12, 0x4f, 0x66, 0x2b, 0x06, 0x29, 0xd6, 0xce, 0x1c, 0x9e,
6634
+	0xb0, 0xd0, 0xb7, 0x90, 0xe7, 0x54, 0xb0, 0x21, 0x77, 0xa8, 0x30, 0xfa, 0x5a, 0x4f, 0x56, 0x48,
6635
+	0x04, 0xc2, 0xf4, 0xd7, 0x43, 0x8f, 0x53, 0xb5, 0xcb, 0x02, 0x4f, 0xa8, 0xe8, 0x29, 0x64, 0x39,
6636
+	0x15, 0x92, 0x70, 0xf9, 0x2e, 0x89, 0xe0, 0x08, 0xd2, 0x66, 0xbe, 0xe7, 0x8c, 0x70, 0xcc, 0x40,
6637
+	0x4f, 0x21, 0x1f, 0xfa, 0xc4, 0xd1, 0x5e, 0xed, 0x45, 0x4d, 0xbf, 0x9f, 0x44, 0x6f, 0xc7, 0x20,
6638
+	0x3c, 0xc1, 0xa3, 0xaf, 0x01, 0x7c, 0xd6, 0xeb, 0xba, 0xdc, 0x3b, 0xa1, 0xdc, 0x48, 0xac, 0x94,
6639
+	0xc4, 0x6e, 0x68, 0x04, 0xce, 0xfb, 0xac, 0x17, 0x35, 0xd1, 0xf6, 0x7f, 0xa5, 0xaf, 0x29, 0x6d,
6640
+	0x3d, 0x03, 0x20, 0xe3, 0xaf, 0x46, 0x5d, 0x9f, 0xbd, 0x97, 0x2b, 0x73, 0x22, 0x53, 0x74, 0xf4,
6641
+	0x00, 0x0a, 0x47, 0x8c, 0x3b, 0xb4, 0x6b, 0xa2, 0x26, 0xaf, 0x35, 0x61, 0x69, 0x5b, 0xa4, 0x2f,
6642
+	0x54, 0x87, 0x6c, 0x8f, 0x06, 0x94, 0x7b, 0x8e, 0x0d, 0x7a, 0xb0, 0x47, 0x89, 0x01, 0x19, 0x41,
6643
+	0xf0, 0x30, 0x90, 0xde, 0x80, 0x9a, 0x91, 0x62, 0x22, 0xfa, 0x15, 0x7c, 0x14, 0x1f, 0x5f, 0x97,
6644
+	0xd3, 0x23, 0xca, 0x69, 0xa0, 0x34, 0x60, 0xe9, 0x7d, 0xf8, 0xf4, 0xdd, 0x1a, 0x30, 0x68, 0x93,
6645
+	0x6c, 0x10, 0xbf, 0xfc, 0x41, 0xd4, 0xf3, 0x90, 0xe5, 0xd1, 0xb8, 0x95, 0xdf, 0xa6, 0x94, 0xea,
6646
+	0x2f, 0x21, 0xd0, 0x06, 0x58, 0xe3, 0xe1, 0x3d, 0x57, 0xab, 0x37, 0x5f, 0xbf, 0x71, 0x71, 0xbe,
6647
+	0x06, 0x31, 0xb6, 0xd5, 0x50, 0x39, 0xc8, 0xb4, 0x5d, 0xd4, 0x84, 0xa5, 0x31, 0x41, 0x95, 0x01,
6648
+	0xe6, 0xa2, 0x2c, 0xbf, 0x6b, 0xa6, 0xfb, 0xa3, 0x90, 0xe2, 0x02, 0x9f, 0xea, 0x55, 0x7e, 0x09,
6649
+	0xe8, 0xed, 0x7d, 0x41, 0x08, 0xd2, 0xc7, 0x5e, 0x60, 0xa6, 0x81, 0x75, 0x1b, 0x55, 0x21, 0x1b,
6650
+	0x92, 0x91, 0xcf, 0x88, 0x6b, 0x02, 0xe3, 0x56, 0x35, 0x2a, 0x10, 0xaa, 0x71, 0x81, 0x50, 0xad,
6651
+	0x05, 0x23, 0x1c, 0x83, 0x2a, 0xcf, 0xe0, 0x76, 0xe2, 0xf1, 0xa2, 0x4d, 0x28, 0x8c, 0x03, 0x6e,
6652
+	0xb2, 0xd6, 0x9b, 0x17, 0xe7, 0x6b, 0xd6, 0x38, 0x32, 0x5b, 0x0d, 0x6c, 0x8d, 0x41, 0x2d, 0xb7,
6653
+	0xf2, 0xf7, 0x02, 0x2c, 0xcd, 0x84, 0x2d, 0xba, 0x05, 0x8b, 0xde, 0x80, 0xf4, 0xa8, 0x99, 0x63,
6654
+	0xd4, 0x41, 0x4d, 0xc8, 0xf8, 0xe4, 0x90, 0xfa, 0x2a, 0x78, 0xd5, 0xc1, 0xfd, 0xff, 0xb5, 0xf1,
6655
+	0x5f, 0x7d, 0xae, 0xf1, 0xcd, 0x40, 0xf2, 0x11, 0x36, 0x64, 0x64, 0x43, 0xd6, 0x61, 0x83, 0x01,
6656
+	0x09, 0xd4, 0x35, 0xb1, 0xb0, 0x9e, 0xc7, 0x71, 0x57, 0xed, 0x0c, 0xe1, 0x3d, 0x61, 0xa7, 0xb5,
6657
+	0x59, 0xb7, 0x51, 0x11, 0x16, 0x68, 0x70, 0x62, 0x2f, 0x6a, 0x93, 0x6a, 0x2a, 0x8b, 0xeb, 0x45,
6658
+	0xd1, 0x97, 0xc7, 0xaa, 0xa9, 0x78, 0x43, 0x41, 0xb9, 0x9d, 0x8d, 0x76, 0x54, 0xb5, 0xd1, 0x8f,
6659
+	0x20, 0x33, 0x60, 0xc3, 0x40, 0x0a, 0x3b, 0xa7, 0x27, 0xbb, 0x92, 0x34, 0xd9, 0x17, 0x0a, 0x61,
6660
+	0x94, 0x65, 0xe0, 0xa8, 0x09, 0xcb, 0x42, 0xb2, 0xb0, 0xdb, 0xe3, 0xc4, 0xa1, 0xdd, 0x90, 0x72,
6661
+	0x8f, 0xb9, 0x26, 0x0d, 0xaf, 0xbc, 0x75, 0x28, 0x0d, 0x53, 0xf0, 0xe1, 0x9b, 0x8a, 0xb3, 0xad,
6662
+	0x28, 0x6d, 0xcd, 0x40, 0x6d, 0x28, 0x84, 0x43, 0xdf, 0xef, 0xb2, 0x30, 0xba, 0x91, 0xa3, 0xd8,
6663
+	0x79, 0x8f, 0x2d, 0x6b, 0x0f, 0x7d, 0x7f, 0x2f, 0x22, 0x61, 0x2b, 0x9c, 0x74, 0xd0, 0x1d, 0xc8,
6664
+	0xf4, 0x38, 0x1b, 0x86, 0x51, 0xdc, 0xe4, 0xb1, 0xe9, 0xa1, 0x6f, 0x20, 0x2b, 0xa8, 0xc3, 0xa9,
6665
+	0x14, 0x76, 0x41, 0x2f, 0xf5, 0x93, 0xa4, 0x41, 0x3a, 0x1a, 0x32, 0x8e, 0x09, 0x1c, 0x73, 0xd0,
6666
+	0x0a, 0x2c, 0x48, 0x39, 0xb2, 0x97, 0xca, 0xa9, 0xf5, 0x5c, 0x3d, 0x7b, 0x71, 0xbe, 0xb6, 0xb0,
6667
+	0xbf, 0xff, 0x0a, 0x2b, 0x9b, 0xba, 0x2d, 0xfa, 0x4c, 0xc8, 0x80, 0x0c, 0xa8, 0x7d, 0x43, 0xef,
6668
+	0xed, 0xb8, 0x8f, 0x5e, 0x01, 0xb8, 0x81, 0xe8, 0x3a, 0x3a, 0x3d, 0xd9, 0x37, 0xf5, 0xea, 0xbe,
6669
+	0xb8, 0x7e, 0x75, 0x8d, 0xdd, 0x8e, 0xb9, 0x31, 0x97, 0x2e, 0xce, 0xd7, 0xf2, 0xe3, 0x2e, 0xce,
6670
+	0xbb, 0x81, 0x88, 0x9a, 0xa8, 0x0e, 0x56, 0x9f, 0x12, 0x5f, 0xf6, 0x9d, 0x3e, 0x75, 0x8e, 0xed,
6671
+	0xe2, 0xd5, 0x57, 0xe0, 0x8e, 0x86, 0x19, 0x0f, 0xd3, 0x24, 0xa5, 0x60, 0x35, 0x55, 0x61, 0x2f,
6672
+	0xeb, 0xbd, 0x8a, 0x3a, 0xe8, 0x3e, 0x00, 0x0b, 0x69, 0xd0, 0x15, 0xd2, 0xf5, 0x02, 0x1b, 0xa9,
6673
+	0x25, 0xe3, 0xbc, 0xb2, 0x74, 0x94, 0x01, 0xdd, 0x55, 0x17, 0x14, 0x71, 0xbb, 0x2c, 0xf0, 0x47,
6674
+	0xf6, 0x47, 0xfa, 0x6b, 0x4e, 0x19, 0xf6, 0x02, 0x7f, 0x84, 0xd6, 0xc0, 0xd2, 0xba, 0x10, 0x5e,
6675
+	0x2f, 0x20, 0xbe, 0x7d, 0x4b, 0xef, 0x07, 0x28, 0x53, 0x47, 0x5b, 0xd4, 0x39, 0x44, 0xbb, 0x21,
6676
+	0xec, 0xdb, 0x57, 0x9f, 0x83, 0x99, 0xec, 0xe4, 0x1c, 0x0c, 0x07, 0xfd, 0x04, 0x20, 0xe4, 0xde,
6677
+	0x89, 0xe7, 0xd3, 0x1e, 0x15, 0xf6, 0x1d, 0xbd, 0xe8, 0xd5, 0xc4, 0x9b, 0x69, 0x8c, 0xc2, 0x53,
6678
+	0x0c, 0x54, 0x85, 0xb4, 0x17, 0x78, 0xd2, 0xfe, 0xd8, 0xdc, 0x4a, 0x97, 0xa5, 0x5a, 0x67, 0xcc,
6679
+	0x3f, 0x20, 0xfe, 0x90, 0x62, 0x8d, 0x43, 0x2d, 0xc8, 0x7b, 0x82, 0xf9, 0x5a, 0xbe, 0xb6, 0xad,
6680
+	0xf3, 0xdb, 0x7b, 0x9c, 0x5f, 0x2b, 0xa6, 0xe0, 0x09, 0x1b, 0xdd, 0x83, 0x7c, 0xe8, 0xb9, 0xe2,
6681
+	0xb9, 0x37, 0xf0, 0xa4, 0xbd, 0x52, 0x4e, 0xad, 0x2f, 0xe0, 0x89, 0x01, 0xed, 0x40, 0x56, 0x8c,
6682
+	0x84, 0x23, 0x7d, 0x61, 0x97, 0xf4, 0xbe, 0x54, 0xaf, 0x1f, 0xa6, 0x13, 0x11, 0xa2, 0xc4, 0x11,
6683
+	0xd3, 0x4b, 0x5f, 0x83, 0x35, 0x95, 0x50, 0x54, 0x22, 0x38, 0xa6, 0x23, 0x93, 0xa3, 0x54, 0x53,
6684
+	0x9d, 0xfa, 0x89, 0x5a, 0xa2, 0x4e, 0xa2, 0x79, 0x1c, 0x75, 0x9e, 0xcc, 0x3f, 0x4e, 0x95, 0x36,
6685
+	0xc1, 0x9a, 0x0a, 0x2c, 0xf4, 0x89, 0x4a, 0xf0, 0x3d, 0x4f, 0x48, 0x3e, 0xea, 0x92, 0xa1, 0xec,
6686
+	0xdb, 0x3f, 0xd3, 0x84, 0x42, 0x6c, 0xac, 0x0d, 0x65, 0xbf, 0xd4, 0x85, 0x89, 0x3e, 0x51, 0x19,
6687
+	0x2c, 0xa5, 0x7b, 0x41, 0xf9, 0x09, 0xe5, 0xaa, 0x78, 0x52, 0xb2, 0x9a, 0x36, 0xa9, 0xf8, 0x14,
6688
+	0x94, 0x70, 0xa7, 0xaf, 0xd3, 0x63, 0x1e, 0x9b, 0x9e, 0xca, 0x77, 0x71, 0x12, 0x30, 0xf9, 0xce,
6689
+	0x74, 0x4b, 0x4f, 0xa0, 0x30, 0xbd, 0xd0, 0xff, 0x64, 0x41, 0x95, 0x3f, 0xa5, 0x20, 0x3f, 0x3e,
6690
+	0x0c, 0xf4, 0x25, 0x2c, 0xb7, 0x3a, 0x7b, 0xcf, 0x6b, 0xfb, 0xad, 0xbd, 0xdd, 0x6e, 0xa3, 0xf9,
6691
+	0x6d, 0xed, 0xe5, 0xf3, 0xfd, 0xe2, 0x5c, 0xe9, 0xfe, 0xe9, 0x59, 0x79, 0x65, 0x92, 0xf7, 0x63,
6692
+	0x78, 0x83, 0x1e, 0x91, 0xa1, 0x2f, 0x67, 0x59, 0x6d, 0xbc, 0xb7, 0xd5, 0xec, 0x74, 0x8a, 0xa9,
6693
+	0xab, 0x58, 0x6d, 0xce, 0x1c, 0x2a, 0x04, 0xda, 0x84, 0xe2, 0x84, 0xb5, 0xf3, 0xaa, 0xdd, 0xc4,
6694
+	0x07, 0xc5, 0xf9, 0xd2, 0xbd, 0xd3, 0xb3, 0xb2, 0xfd, 0x36, 0x69, 0x67, 0x14, 0x52, 0x7e, 0x60,
6695
+	0x1e, 0x2d, 0xff, 0x48, 0x41, 0x61, 0xba, 0xe6, 0x45, 0x5b, 0x51, 0xad, 0xaa, 0x57, 0x7c, 0x63,
6696
+	0x73, 0xe3, 0xba, 0x1a, 0x59, 0xdf, 0xb5, 0xfe, 0x50, 0xf9, 0x7d, 0xa1, 0x9e, 0xa7, 0x9a, 0x8c,
6697
+	0xbe, 0x84, 0xc5, 0x90, 0x71, 0x19, 0xdf, 0x4a, 0xc9, 0x31, 0xc3, 0x78, 0x5c, 0x49, 0x45, 0xe0,
6698
+	0x4a, 0x1f, 0x6e, 0xcc, 0x7a, 0x43, 0x0f, 0x61, 0xe1, 0xa0, 0xd5, 0x2e, 0xce, 0x95, 0xee, 0x9e,
6699
+	0x9e, 0x95, 0x3f, 0x9e, 0xfd, 0x78, 0xe0, 0x71, 0x39, 0x24, 0x7e, 0xab, 0x8d, 0x3e, 0x87, 0xc5,
6700
+	0xc6, 0x6e, 0x07, 0xe3, 0x62, 0xaa, 0xb4, 0x76, 0x7a, 0x56, 0xbe, 0x3b, 0x8b, 0x53, 0x9f, 0xd8,
6701
+	0x30, 0x70, 0x31, 0x3b, 0x1c, 0x3f, 0xd5, 0xfe, 0x39, 0x0f, 0x96, 0xb9, 0xac, 0x3f, 0xf4, 0x6b,
6702
+	0x7e, 0x29, 0xaa, 0x44, 0xe3, 0x2c, 0x3c, 0x7f, 0x6d, 0x41, 0x5a, 0x88, 0x08, 0x46, 0xd3, 0x0f,
6703
+	0xa0, 0xe0, 0x85, 0x27, 0x5f, 0x75, 0x69, 0x40, 0x0e, 0x7d, 0xf3, 0x6a, 0xcb, 0x61, 0x4b, 0xd9,
6704
+	0x9a, 0x91, 0x49, 0x5d, 0x01, 0x5e, 0x20, 0x29, 0x0f, 0xcc, 0x7b, 0x2c, 0x87, 0xc7, 0x7d, 0xf4,
6705
+	0x0d, 0xa4, 0xbd, 0x90, 0x0c, 0x4c, 0x15, 0x9d, 0xb8, 0x82, 0x56, 0xbb, 0xf6, 0xc2, 0xc4, 0x5c,
6706
+	0x3d, 0x77, 0x71, 0xbe, 0x96, 0x56, 0x06, 0xac, 0x69, 0x68, 0x35, 0x2e, 0x64, 0xd5, 0x48, 0xfa,
6707
+	0x3a, 0xcf, 0xe1, 0x29, 0x8b, 0x8a, 0x1b, 0x2f, 0xe8, 0x71, 0x2a, 0x84, 0xbe, 0xd8, 0x73, 0x38,
6708
+	0xee, 0xa2, 0x12, 0x64, 0x4d, 0x39, 0xac, 0xeb, 0xdf, 0xbc, 0x2a, 0x35, 0x8d, 0xa1, 0xbe, 0x04,
6709
+	0x56, 0xb4, 0x1b, 0xdd, 0x23, 0xce, 0x06, 0x95, 0x7f, 0xa5, 0xc1, 0xda, 0xf2, 0x87, 0x42, 0x9a,
6710
+	0xca, 0xe6, 0x83, 0x6d, 0xfe, 0x2b, 0x58, 0x26, 0xfa, 0xef, 0x00, 0x09, 0x54, 0x99, 0xa0, 0x5f,
6711
+	0x19, 0xe6, 0x00, 0x1e, 0x26, 0xba, 0x1b, 0x83, 0xa3, 0x17, 0x49, 0x3d, 0xa3, 0x7c, 0xda, 0x29,
6712
+	0x5c, 0x24, 0x97, 0xbe, 0xa0, 0x0e, 0x2c, 0x31, 0xee, 0xf4, 0xa9, 0x90, 0x51, 0x71, 0x61, 0x5e,
6713
+	0xd3, 0x89, 0xff, 0x59, 0xf6, 0xa6, 0x81, 0xe6, 0x66, 0x8d, 0x66, 0x3b, 0xeb, 0x03, 0x3d, 0x86,
6714
+	0x34, 0x27, 0x47, 0xf1, 0x8b, 0x29, 0x31, 0x48, 0x30, 0x39, 0x92, 0x33, 0x2e, 0x34, 0x03, 0xfd,
6715
+	0x1c, 0xc0, 0xf5, 0x44, 0x48, 0xa4, 0xd3, 0xa7, 0xdc, 0x1c, 0x76, 0xe2, 0x12, 0x1b, 0x63, 0xd4,
6716
+	0x8c, 0x97, 0x29, 0x36, 0x7a, 0x06, 0x79, 0x87, 0xc4, 0x72, 0xcd, 0x5c, 0xfd, 0x8b, 0x61, 0xab,
6717
+	0x66, 0x5c, 0x14, 0x95, 0x8b, 0x8b, 0xf3, 0xb5, 0x5c, 0x6c, 0xc1, 0x39, 0x87, 0x18, 0xf9, 0x3e,
6718
+	0x83, 0x25, 0x49, 0xc4, 0x71, 0xd7, 0x8d, 0xd2, 0x59, 0x24, 0x93, 0x2b, 0x2a, 0x05, 0xf5, 0x8e,
6719
+	0x35, 0x69, 0x2f, 0x3e, 0xce, 0x82, 0x9c, 0xb2, 0xa1, 0x5f, 0xc0, 0x32, 0x0d, 0x1c, 0x3e, 0xd2,
6720
+	0x62, 0x8d, 0x67, 0x98, 0xbb, 0x7a, 0xb1, 0xcd, 0x31, 0x78, 0x66, 0xb1, 0x45, 0x7a, 0xc9, 0x5e,
6721
+	0xf9, 0x6b, 0x0a, 0x20, 0x2a, 0xbe, 0x3e, 0xac, 0x00, 0x11, 0xa4, 0x5d, 0x22, 0x89, 0xd6, 0x5c,
6722
+	0x01, 0xeb, 0x36, 0x7a, 0x02, 0x20, 0xe9, 0x20, 0x54, 0xa9, 0x37, 0xe8, 0x19, 0xd9, 0xbc, 0x2b,
6723
+	0x1d, 0x4c, 0xa1, 0xd1, 0x26, 0x64, 0xcc, 0xbb, 0x36, 0x7d, 0x2d, 0xcf, 0x20, 0x2b, 0x7f, 0x48,
6724
+	0x01, 0x44, 0xcb, 0xfc, 0x9f, 0x5e, 0x5b, 0xdd, 0x7e, 0xf3, 0xfd, 0xea, 0xdc, 0x5f, 0xbe, 0x5f,
6725
+	0x9d, 0xfb, 0xcd, 0xc5, 0x6a, 0xea, 0xcd, 0xc5, 0x6a, 0xea, 0xcf, 0x17, 0xab, 0xa9, 0xbf, 0x5d,
6726
+	0xac, 0xa6, 0x0e, 0x33, 0xba, 0x3e, 0xfa, 0xe1, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0x32, 0x89,
6727
+	0x54, 0x8a, 0x4d, 0x16, 0x00, 0x00,
6726 6728
 }
... ...
@@ -315,9 +315,24 @@ message ContainerSpec {
315 315
 	// Runtimes that don't support it ignore that field
316 316
 	Isolation isolation = 24;
317 317
 
318
-	// PidsLimit prevents from OS resource damage by applications inside the container 
318
+	// PidsLimit prevents from OS resource damage by applications inside the container
319 319
 	// using fork bomb attack.
320 320
 	int64 pidsLimit = 25;
321
+
322
+	// Sysctls sets namespaced kernel parameters (sysctls) in the container. This
323
+	// option is equivalent to passing --sysctl to docker run.
324
+	//
325
+	// Note that while options are subject to the same restrictions as arguments
326
+	// passed to the --sysctl flag on docker run, those options are not further
327
+	// validated to ensure that they are safe or sensible in a clustered
328
+	// environment.
329
+	//
330
+	// Additionally, sysctls are not validated for support in the underlying
331
+	// daemon. For information about supported options, refer to the
332
+	// documentation at:
333
+	//
334
+	// https://docs.docker.com/engine/reference/commandline/run/#configure-namespaced-kernel-parameters-sysctls-at-runtime
335
+	map<string, string> sysctls = 26;
321 336
 }
322 337
 
323 338
 // EndpointSpec defines the properties that can be configured to
... ...
@@ -1,12 +1,12 @@
1 1
 package allocator
2 2
 
3 3
 import (
4
-	"net"
5 4
 	"sync"
6 5
 
7 6
 	"github.com/docker/docker/pkg/plugingetter"
8 7
 	"github.com/docker/go-events"
9 8
 	"github.com/docker/swarmkit/api"
9
+	"github.com/docker/swarmkit/manager/allocator/cnmallocator"
10 10
 	"github.com/docker/swarmkit/manager/state"
11 11
 	"github.com/docker/swarmkit/manager/state/store"
12 12
 	"golang.org/x/net/context"
... ...
@@ -34,12 +34,8 @@ type Allocator struct {
34 34
 	// pluginGetter provides access to docker's plugin inventory.
35 35
 	pluginGetter plugingetter.PluginGetter
36 36
 
37
-	// DefaultAddrPool specifies default subnet pool for global scope networks
38
-	defaultAddrPool []*net.IPNet
39
-
40
-	// SubnetSize specifies the subnet size of the networks created from
41
-	// the default subnet pool
42
-	subnetSize int
37
+	// networkConfig stores network related config for the cluster
38
+	networkConfig *cnmallocator.NetworkConfig
43 39
 }
44 40
 
45 41
 // taskBallot controls how the voting for task allocation is
... ...
@@ -73,17 +69,16 @@ type allocActor struct {
73 73
 
74 74
 // New returns a new instance of Allocator for use during allocation
75 75
 // stage of the manager.
76
-func New(store *store.MemoryStore, pg plugingetter.PluginGetter, defaultAddrPool []*net.IPNet, subnetSize int) (*Allocator, error) {
76
+func New(store *store.MemoryStore, pg plugingetter.PluginGetter, netConfig *cnmallocator.NetworkConfig) (*Allocator, error) {
77 77
 	a := &Allocator{
78 78
 		store: store,
79 79
 		taskBallot: &taskBallot{
80 80
 			votes: make(map[string][]string),
81 81
 		},
82
-		stopChan:        make(chan struct{}),
83
-		doneChan:        make(chan struct{}),
84
-		pluginGetter:    pg,
85
-		defaultAddrPool: defaultAddrPool,
86
-		subnetSize:      subnetSize,
82
+		stopChan:      make(chan struct{}),
83
+		doneChan:      make(chan struct{}),
84
+		pluginGetter:  pg,
85
+		networkConfig: netConfig,
87 86
 	}
88 87
 
89 88
 	return a, nil
... ...
@@ -1,7 +1,6 @@
1 1
 package cnmallocator
2 2
 
3 3
 import (
4
-	"net"
5 4
 	"strconv"
6 5
 	"strings"
7 6
 
... ...
@@ -14,7 +13,7 @@ import (
14 14
 	"github.com/sirupsen/logrus"
15 15
 )
16 16
 
17
-func initIPAMDrivers(r *drvregistry.DrvRegistry, defaultAddrPool []*net.IPNet, subnetSize int) error {
17
+func initIPAMDrivers(r *drvregistry.DrvRegistry, netConfig *NetworkConfig) error {
18 18
 	var addressPool []*ipamutils.NetworkToSplit
19 19
 	var str strings.Builder
20 20
 	str.WriteString("Subnetlist - ")
... ...
@@ -22,16 +21,16 @@ func initIPAMDrivers(r *drvregistry.DrvRegistry, defaultAddrPool []*net.IPNet, s
22 22
 	// from the info. We will be using it to call Libnetwork API
23 23
 	// We also need to log new address pool info whenever swarm init
24 24
 	// happens with default address pool option
25
-	if defaultAddrPool != nil {
26
-		for _, p := range defaultAddrPool {
25
+	if netConfig != nil {
26
+		for _, p := range netConfig.DefaultAddrPool {
27 27
 			addressPool = append(addressPool, &ipamutils.NetworkToSplit{
28
-				Base: p.String(),
29
-				Size: subnetSize,
28
+				Base: p,
29
+				Size: int(netConfig.SubnetSize),
30 30
 			})
31
-			str.WriteString(p.String() + ",")
31
+			str.WriteString(p + ",")
32 32
 		}
33 33
 		str.WriteString(": Size ")
34
-		str.WriteString(strconv.Itoa(subnetSize))
34
+		str.WriteString(strconv.Itoa(int(netConfig.SubnetSize)))
35 35
 	}
36 36
 	if err := ipamutils.ConfigGlobalScopeDefaultNetworks(addressPool); err != nil {
37 37
 		return err
... ...
@@ -86,8 +86,18 @@ type initializer struct {
86 86
 	ntype string
87 87
 }
88 88
 
89
+// NetworkConfig is used to store network related cluster config in the Manager.
90
+type NetworkConfig struct {
91
+	// DefaultAddrPool specifies default subnet pool for global scope networks
92
+	DefaultAddrPool []string
93
+
94
+	// SubnetSize specifies the subnet size of the networks created from
95
+	// the default subnet pool
96
+	SubnetSize uint32
97
+}
98
+
89 99
 // New returns a new NetworkAllocator handle
90
-func New(pg plugingetter.PluginGetter, defaultAddrPool []*net.IPNet, subnetSize int) (networkallocator.NetworkAllocator, error) {
100
+func New(pg plugingetter.PluginGetter, netConfig *NetworkConfig) (networkallocator.NetworkAllocator, error) {
91 101
 	na := &cnmNetworkAllocator{
92 102
 		networks: make(map[string]*network),
93 103
 		services: make(map[string]struct{}),
... ...
@@ -106,7 +116,7 @@ func New(pg plugingetter.PluginGetter, defaultAddrPool []*net.IPNet, subnetSize
106 106
 		return nil, err
107 107
 	}
108 108
 
109
-	if err = initIPAMDrivers(reg, defaultAddrPool, subnetSize); err != nil {
109
+	if err = initIPAMDrivers(reg, netConfig); err != nil {
110 110
 		return nil, err
111 111
 	}
112 112
 
... ...
@@ -68,7 +68,15 @@ type networkContext struct {
68 68
 }
69 69
 
70 70
 func (a *Allocator) doNetworkInit(ctx context.Context) (err error) {
71
-	na, err := cnmallocator.New(a.pluginGetter, a.defaultAddrPool, a.subnetSize)
71
+	var netConfig *cnmallocator.NetworkConfig
72
+	if a.networkConfig != nil && a.networkConfig.DefaultAddrPool != nil {
73
+		netConfig = &cnmallocator.NetworkConfig{
74
+			DefaultAddrPool: a.networkConfig.DefaultAddrPool,
75
+			SubnetSize:      a.networkConfig.SubnetSize,
76
+		}
77
+	}
78
+
79
+	na, err := cnmallocator.New(a.pluginGetter, netConfig)
72 80
 	if err != nil {
73 81
 		return err
74 82
 	}
... ...
@@ -19,6 +19,13 @@ const (
19 19
 	// expiredCertGrace is the amount of time to keep a node in the
20 20
 	// blacklist beyond its certificate expiration timestamp.
21 21
 	expiredCertGrace = 24 * time.Hour * 7
22
+	// inbuilt default subnet size
23
+	inbuiltSubnetSize = 24
24
+)
25
+
26
+var (
27
+	// inbuilt default address pool
28
+	inbuiltDefaultAddressPool = []string{"10.0.0.0/8"}
22 29
 )
23 30
 
24 31
 func validateClusterSpec(spec *api.ClusterSpec) error {
... ...
@@ -268,6 +275,12 @@ func redactClusters(clusters []*api.Cluster) []*api.Cluster {
268 268
 			DefaultAddressPool:      cluster.DefaultAddressPool,
269 269
 			SubnetSize:              cluster.SubnetSize,
270 270
 		}
271
+		if newCluster.DefaultAddressPool == nil {
272
+			// This is just for CLI display. Set the inbuilt default pool for
273
+			// user reference.
274
+			newCluster.DefaultAddressPool = inbuiltDefaultAddressPool
275
+			newCluster.SubnetSize = inbuiltSubnetSize
276
+		}
271 277
 		redactedClusters = append(redactedClusters, newCluster)
272 278
 	}
273 279
 
... ...
@@ -20,6 +20,7 @@ import (
20 20
 	"github.com/docker/swarmkit/identity"
21 21
 	"github.com/docker/swarmkit/log"
22 22
 	"github.com/docker/swarmkit/manager/allocator"
23
+	"github.com/docker/swarmkit/manager/allocator/cnmallocator"
23 24
 	"github.com/docker/swarmkit/manager/allocator/networkallocator"
24 25
 	"github.com/docker/swarmkit/manager/controlapi"
25 26
 	"github.com/docker/swarmkit/manager/dispatcher"
... ...
@@ -127,12 +128,8 @@ type Config struct {
127 127
 	// FIPS setting.
128 128
 	FIPS bool
129 129
 
130
-	// DefaultAddrPool specifies default subnet pool for global scope networks
131
-	DefaultAddrPool []*net.IPNet
132
-
133
-	// SubnetSize specifies the subnet size of the networks created from
134
-	// the default subnet pool
135
-	SubnetSize int
130
+	// NetworkConfig stores network related config for the cluster
131
+	NetworkConfig *cnmallocator.NetworkConfig
136 132
 }
137 133
 
138 134
 // Manager is the cluster manager for Swarm.
... ...
@@ -947,14 +944,10 @@ func (m *Manager) becomeLeader(ctx context.Context) {
947 947
 			nil,
948 948
 			0)
949 949
 
950
-		var defaultAddrPool []string
951
-		for _, p := range m.config.DefaultAddrPool {
952
-			defaultAddrPool = append(defaultAddrPool, p.String())
953
-		}
954 950
 		// If defaultAddrPool is valid we update cluster object with new value
955
-		if defaultAddrPool != nil {
956
-			clusterObj.DefaultAddressPool = defaultAddrPool
957
-			clusterObj.SubnetSize = uint32(m.config.SubnetSize)
951
+		if m.config.NetworkConfig != nil && m.config.NetworkConfig.DefaultAddrPool != nil {
952
+			clusterObj.DefaultAddressPool = m.config.NetworkConfig.DefaultAddrPool
953
+			clusterObj.SubnetSize = m.config.NetworkConfig.SubnetSize
958 954
 		}
959 955
 
960 956
 		err := store.CreateCluster(tx, clusterObj)
... ...
@@ -1003,24 +996,20 @@ func (m *Manager) becomeLeader(ctx context.Context) {
1003 1003
 
1004 1004
 	// If DefaultAddrPool is null, Read from store and check if
1005 1005
 	// DefaultAddrPool info is stored in cluster object
1006
-	if m.config.DefaultAddrPool == nil {
1006
+	if m.config.NetworkConfig == nil || m.config.NetworkConfig.DefaultAddrPool == nil {
1007 1007
 		var cluster *api.Cluster
1008 1008
 		s.View(func(tx store.ReadTx) {
1009 1009
 			cluster = store.GetCluster(tx, clusterID)
1010 1010
 		})
1011 1011
 		if cluster.DefaultAddressPool != nil {
1012 1012
 			for _, address := range cluster.DefaultAddressPool {
1013
-				_, b, err := net.ParseCIDR(address)
1014
-				if err != nil {
1015
-					log.G(ctx).WithError(err).Error("Default Address Pool reading failed for cluster object  %s", address)
1016
-				}
1017
-				m.config.DefaultAddrPool = append(m.config.DefaultAddrPool, b)
1013
+				m.config.NetworkConfig.DefaultAddrPool = append(m.config.NetworkConfig.DefaultAddrPool, address)
1018 1014
 			}
1015
+			m.config.NetworkConfig.SubnetSize = cluster.SubnetSize
1019 1016
 		}
1020
-		m.config.SubnetSize = int(cluster.SubnetSize)
1021 1017
 	}
1022 1018
 
1023
-	m.allocator, err = allocator.New(s, m.config.PluginGetter, m.config.DefaultAddrPool, m.config.SubnetSize)
1019
+	m.allocator, err = allocator.New(s, m.config.PluginGetter, m.config.NetworkConfig)
1024 1020
 	if err != nil {
1025 1021
 		log.G(ctx).WithError(err).Error("failed to create allocator")
1026 1022
 		// TODO(stevvooe): It doesn't seem correct here to fail
... ...
@@ -1144,7 +1133,7 @@ func defaultClusterObject(
1144 1144
 	rootCA *ca.RootCA,
1145 1145
 	fips bool,
1146 1146
 	defaultAddressPool []string,
1147
-	subnetSize int) *api.Cluster {
1147
+	subnetSize uint32) *api.Cluster {
1148 1148
 	var caKey []byte
1149 1149
 	if rcaSigner, err := rootCA.Signer(); err == nil {
1150 1150
 		caKey = rcaSigner.Key
... ...
@@ -1178,7 +1167,7 @@ func defaultClusterObject(
1178 1178
 		UnlockKeys:         initialUnlockKeys,
1179 1179
 		FIPS:               fips,
1180 1180
 		DefaultAddressPool: defaultAddressPool,
1181
-		SubnetSize:         uint32(subnetSize),
1181
+		SubnetSize:         subnetSize,
1182 1182
 	}
1183 1183
 }
1184 1184
 
... ...
@@ -28,6 +28,7 @@ import (
28 28
 	"github.com/docker/swarmkit/ioutils"
29 29
 	"github.com/docker/swarmkit/log"
30 30
 	"github.com/docker/swarmkit/manager"
31
+	"github.com/docker/swarmkit/manager/allocator/cnmallocator"
31 32
 	"github.com/docker/swarmkit/manager/encryption"
32 33
 	"github.com/docker/swarmkit/remotes"
33 34
 	"github.com/docker/swarmkit/xnet"
... ...
@@ -105,12 +106,8 @@ type Config struct {
105 105
 	// for connections to the remote API (including the raft service).
106 106
 	AdvertiseRemoteAPI string
107 107
 
108
-	// DefaultAddrPool specifies default subnet pool for global scope networks
109
-	DefaultAddrPool []*net.IPNet
110
-
111
-	// SubnetSize specifies the subnet size of the networks created from
112
-	// the default subnet pool
113
-	SubnetSize int
108
+	// NetworkConfig stores network related config for the cluster
109
+	NetworkConfig *cnmallocator.NetworkConfig
114 110
 
115 111
 	// Executor specifies the executor to use for the agent.
116 112
 	Executor exec.Executor
... ...
@@ -1002,8 +999,7 @@ func (n *Node) runManager(ctx context.Context, securityConfig *ca.SecurityConfig
1002 1002
 		PluginGetter:     n.config.PluginGetter,
1003 1003
 		RootCAPaths:      rootPaths,
1004 1004
 		FIPS:             n.config.FIPS,
1005
-		DefaultAddrPool:  n.config.DefaultAddrPool,
1006
-		SubnetSize:       n.config.SubnetSize,
1005
+		NetworkConfig:    n.config.NetworkConfig,
1007 1006
 	})
1008 1007
 	if err != nil {
1009 1008
 		return false, err