From 4f23da2a6d2e54fb5aae548a5718cbf20965226d Mon Sep 17 00:00:00 2001 From: Adam Chalmers Date: Wed, 18 Sep 2019 14:57:20 -0500 Subject: [PATCH] TUN-2315: Replace Scope with IntentLabel --- cmd/cloudflared/tunnel/cmd.go | 29 +- connection/manager.go | 4 +- tunnelrpc/pogs/tunnelrpc.go | 90 +---- tunnelrpc/pogs/tunnelrpc_test.go | 33 +- tunnelrpc/tunnelrpc.capnp | 13 +- tunnelrpc/tunnelrpc.capnp.go | 603 ++++++++++++------------------- 6 files changed, 244 insertions(+), 528 deletions(-) diff --git a/cmd/cloudflared/tunnel/cmd.go b/cmd/cloudflared/tunnel/cmd.go index ce978720..a9830c54 100644 --- a/cmd/cloudflared/tunnel/cmd.go +++ b/cmd/cloudflared/tunnel/cmd.go @@ -76,6 +76,8 @@ const ( // disablePortForwarding disables both remote and local ssh port forwarding enablePortForwardingFlag = "enable-port-forwarding" + + noIntentMsg = "The --intent argument is required. Cloudflared looks up an Intent to determine what configuration to use (i.e. which tunnels to start). If you don't have any Intents yet, you can use a placeholder Intent Label for now. Then, when you make an Intent with that label, cloudflared will get notified and open the tunnels you specified in that Intent." ) var ( @@ -520,21 +522,16 @@ func startDeclarativeTunnel(ctx context.Context, return err } - var scope pogs.Scope - if c.IsSet("group") == c.IsSet("system-name") { - err = fmt.Errorf("exactly one of --group or --system-name must be specified") - logger.WithError(err).Error("unable to determine scope") - return err - } else if c.IsSet("group") { - scope = pogs.NewGroup(c.String("group")) - } else { - scope = pogs.NewSystemName(c.String("system-name")) + intentLabel := c.String("intent") + if intentLabel == "" { + logger.Error("--intent was empty") + return fmt.Errorf(noIntentMsg) } cloudflaredConfig := &connection.CloudflaredConfig{ BuildInfo: buildInfo, CloudflaredID: cloudflaredID, - Scope: scope, + IntentLabel: intentLabel, Tags: tags, } @@ -958,15 +955,9 @@ func tunnelFlags(shouldHide bool) []cli.Flag { Hidden: true, }), altsrc.NewStringFlag(&cli.StringFlag{ - Name: "system-name", - Usage: "Unique identifier for this cloudflared instance. It can be configured individually in the Declarative Tunnel UI. Mutually exclusive with `--group`.", - EnvVars: []string{"TUNNEL_SYSTEM_NAME"}, - Hidden: true, - }), - altsrc.NewStringFlag(&cli.StringFlag{ - Name: "group", - Usage: "Name of a group of cloudflared instances, of which this instance should be an identical copy. They can be configured collectively in the Declarative Tunnel UI. Mutually exclusive with `--system-name`.", - EnvVars: []string{"TUNNEL_GROUP"}, + Name: "intent", + Usage: "The label of an Intent from which `cloudflared` should gets its tunnels from. Intents can be created in the Origin Registry UI.", + EnvVars: []string{"TUNNEL_INTENT"}, Hidden: true, }), altsrc.NewDurationFlag(&cli.DurationFlag{ diff --git a/connection/manager.go b/connection/manager.go index 29949062..b998c0e0 100644 --- a/connection/manager.go +++ b/connection/manager.go @@ -47,7 +47,7 @@ type CloudflaredConfig struct { CloudflaredID uuid.UUID Tags []pogs.Tag BuildInfo *buildinfo.BuildInfo - Scope pogs.Scope + IntentLabel string } func NewEdgeManager( @@ -136,7 +136,7 @@ func (em *EdgeManager) newConnection(ctx context.Context) error { CloudflaredVersion: em.cloudflaredConfig.BuildInfo.CloudflaredVersion, NumPreviousAttempts: 0, OriginCert: em.state.getUserCredential(), - Scope: em.cloudflaredConfig.Scope, + IntentLabel: em.cloudflaredConfig.IntentLabel, Tags: em.cloudflaredConfig.Tags, }, em.logger) if err != nil { diff --git a/tunnelrpc/pogs/tunnelrpc.go b/tunnelrpc/pogs/tunnelrpc.go index 8d41b63a..079c7945 100644 --- a/tunnelrpc/pogs/tunnelrpc.go +++ b/tunnelrpc/pogs/tunnelrpc.go @@ -2,7 +2,6 @@ package pogs import ( "context" - "fmt" "time" "github.com/cloudflare/cloudflared/tunnelrpc" @@ -129,82 +128,13 @@ func UnmarshalServerInfo(s tunnelrpc.ServerInfo) (*ServerInfo, error) { return p, err } -//go-sumtype:decl Scope -type Scope interface { - Value() string - PostgresType() string - GraphQLType() string - isScope() -} - -type SystemName struct { - systemName string -} - -func NewSystemName(systemName string) *SystemName { - return &SystemName{systemName: systemName} -} - -func (s *SystemName) Value() string { return s.systemName } -func (_ *SystemName) PostgresType() string { return "system_name" } -func (_ *SystemName) GraphQLType() string { return "SYSTEM_NAME" } - -func (_ *SystemName) isScope() {} - -type Group struct { - group string -} - -func NewGroup(group string) *Group { - return &Group{group: group} -} - -func (g *Group) Value() string { return g.group } -func (_ *Group) PostgresType() string { return "group" } -func (_ *Group) GraphQLType() string { return "GROUP" } - -func (_ *Group) isScope() {} - -func MarshalScope(s tunnelrpc.Scope, p Scope) error { - ss := s.Value() - switch scope := p.(type) { - case *SystemName: - ss.SetSystemName(scope.systemName) - case *Group: - ss.SetGroup(scope.group) - default: - return fmt.Errorf("unexpected Scope value: %v", p) - } - return nil -} - -func UnmarshalScope(s tunnelrpc.Scope) (Scope, error) { - ss := s.Value() - switch ss.Which() { - case tunnelrpc.Scope_value_Which_systemName: - systemName, err := ss.SystemName() - if err != nil { - return nil, err - } - return NewSystemName(systemName), nil - case tunnelrpc.Scope_value_Which_group: - group, err := ss.Group() - if err != nil { - return nil, err - } - return NewGroup(group), nil - default: - return nil, fmt.Errorf("unexpected Scope tag: %v", ss.Which()) - } -} - type ConnectParameters struct { OriginCert []byte CloudflaredID uuid.UUID NumPreviousAttempts uint8 Tags []Tag CloudflaredVersion string - Scope Scope + IntentLabel string } func MarshalConnectParameters(s tunnelrpc.CapnpConnectParameters, p *ConnectParameters) error { @@ -237,11 +167,7 @@ func MarshalConnectParameters(s tunnelrpc.CapnpConnectParameters, p *ConnectPara if err := s.SetCloudflaredVersion(p.CloudflaredVersion); err != nil { return err } - scope, err := s.NewScope() - if err != nil { - return err - } - return MarshalScope(scope, p.Scope) + return s.SetIntentLabel(p.IntentLabel) } func UnmarshalConnectParameters(s tunnelrpc.CapnpConnectParameters) (*ConnectParameters, error) { @@ -282,22 +208,14 @@ func UnmarshalConnectParameters(s tunnelrpc.CapnpConnectParameters) (*ConnectPar return nil, err } - scopeCapnp, err := s.Scope() - if err != nil { - return nil, err - } - scope, err := UnmarshalScope(scopeCapnp) - if err != nil { - return nil, err - } - + intentLabel, err := s.IntentLabel() return &ConnectParameters{ OriginCert: originCert, CloudflaredID: cloudflaredID, NumPreviousAttempts: s.NumPreviousAttempts(), Tags: tags, CloudflaredVersion: cloudflaredVersion, - Scope: scope, + IntentLabel: intentLabel, }, nil } diff --git a/tunnelrpc/pogs/tunnelrpc_test.go b/tunnelrpc/pogs/tunnelrpc_test.go index b2f2e71e..c4aad592 100644 --- a/tunnelrpc/pogs/tunnelrpc_test.go +++ b/tunnelrpc/pogs/tunnelrpc_test.go @@ -11,35 +11,6 @@ import ( capnp "zombiezen.com/go/capnproto2" ) -// Assert *SystemName implements Scope -var _ Scope = (*SystemName)(nil) - -// Assert *Group implements Scope -var _ Scope = (*Group)(nil) - -func TestScope(t *testing.T) { - testCases := []Scope{ - &SystemName{systemName: "my_system"}, - &Group{group: "my_group"}, - } - for i, testCase := range testCases { - _, seg, err := capnp.NewMessage(capnp.SingleSegment(nil)) - capnpEntity, err := tunnelrpc.NewScope(seg) - if !assert.NoError(t, err) { - t.Fatal("Couldn't initialize a new message") - } - err = MarshalScope(capnpEntity, testCase) - if !assert.NoError(t, err, "testCase index %v failed to marshal", i) { - continue - } - result, err := UnmarshalScope(capnpEntity) - if !assert.NoError(t, err, "testCase index %v failed to unmarshal", i) { - continue - } - assert.Equal(t, testCase, result, "testCase index %v didn't preserve struct through marshalling and unmarshalling", i) - } -} - func sampleTestConnectResult() *ConnectResult { return &ConnectResult{ Err: &ConnectError{ @@ -78,7 +49,7 @@ func TestConnectParameters(t *testing.T) { testCases := []*ConnectParameters{ sampleConnectParameters(), sampleConnectParameters(func(c *ConnectParameters) { - c.Scope = &SystemName{systemName: "my_system"} + c.IntentLabel = "my_intent" }), sampleConnectParameters(func(c *ConnectParameters) { c.Tags = nil @@ -118,7 +89,7 @@ func sampleConnectParameters(overrides ...func(*ConnectParameters)) *ConnectPara }, }, CloudflaredVersion: "7.0", - Scope: &Group{group: "my_group"}, + IntentLabel: "my_intent", } sample.ensureNoZeroFields() for _, f := range overrides { diff --git a/tunnelrpc/tunnelrpc.capnp b/tunnelrpc/tunnelrpc.capnp index d572ae8a..fb7b9121 100644 --- a/tunnelrpc/tunnelrpc.capnp +++ b/tunnelrpc/tunnelrpc.capnp @@ -57,17 +57,8 @@ struct CapnpConnectParameters { tags @3 :List(Tag); # release version of cloudflared cloudflaredVersion @4 :Text; - # identifier for this cloudflared instance - scope @5 :Scope; -} - -struct Scope { - value :union { - # Standalone instance - systemName @0 :Text; - # Associated with a group of identical cloudflared instances - group @1 :Text; - } + # which intent this cloudflared instance should get its behaviour from + intentLabel @5 :Text; } struct ConnectResult { diff --git a/tunnelrpc/tunnelrpc.capnp.go b/tunnelrpc/tunnelrpc.capnp.go index 87d92490..649dddce 100644 --- a/tunnelrpc/tunnelrpc.capnp.go +++ b/tunnelrpc/tunnelrpc.capnp.go @@ -603,29 +603,23 @@ func (s CapnpConnectParameters) SetCloudflaredVersion(v string) error { return s.Struct.SetText(3, v) } -func (s CapnpConnectParameters) Scope() (Scope, error) { +func (s CapnpConnectParameters) IntentLabel() (string, error) { p, err := s.Struct.Ptr(4) - return Scope{Struct: p.Struct()}, err + return p.Text(), err } -func (s CapnpConnectParameters) HasScope() bool { +func (s CapnpConnectParameters) HasIntentLabel() bool { p, err := s.Struct.Ptr(4) return p.IsValid() || err != nil } -func (s CapnpConnectParameters) SetScope(v Scope) error { - return s.Struct.SetPtr(4, v.Struct.ToPtr()) +func (s CapnpConnectParameters) IntentLabelBytes() ([]byte, error) { + p, err := s.Struct.Ptr(4) + return p.TextBytes(), err } -// NewScope sets the scope field to a newly -// allocated Scope struct, preferring placement in s's segment. -func (s CapnpConnectParameters) NewScope() (Scope, error) { - ss, err := NewScope(s.Struct.Segment()) - if err != nil { - return Scope{}, err - } - err = s.Struct.SetPtr(4, ss.Struct.ToPtr()) - return ss, err +func (s CapnpConnectParameters) SetIntentLabel(v string) error { + return s.Struct.SetText(4, v) } // CapnpConnectParameters_List is a list of CapnpConnectParameters. @@ -658,147 +652,6 @@ func (p CapnpConnectParameters_Promise) Struct() (CapnpConnectParameters, error) return CapnpConnectParameters{s}, err } -func (p CapnpConnectParameters_Promise) Scope() Scope_Promise { - return Scope_Promise{Pipeline: p.Pipeline.GetPipeline(4)} -} - -type Scope struct{ capnp.Struct } -type Scope_value Scope -type Scope_value_Which uint16 - -const ( - Scope_value_Which_systemName Scope_value_Which = 0 - Scope_value_Which_group Scope_value_Which = 1 -) - -func (w Scope_value_Which) String() string { - const s = "systemNamegroup" - switch w { - case Scope_value_Which_systemName: - return s[0:10] - case Scope_value_Which_group: - return s[10:15] - - } - return "Scope_value_Which(" + strconv.FormatUint(uint64(w), 10) + ")" -} - -// Scope_TypeID is the unique identifier for the type Scope. -const Scope_TypeID = 0xc54a4a6fd4d87596 - -func NewScope(s *capnp.Segment) (Scope, error) { - st, err := capnp.NewStruct(s, capnp.ObjectSize{DataSize: 8, PointerCount: 1}) - return Scope{st}, err -} - -func NewRootScope(s *capnp.Segment) (Scope, error) { - st, err := capnp.NewRootStruct(s, capnp.ObjectSize{DataSize: 8, PointerCount: 1}) - return Scope{st}, err -} - -func ReadRootScope(msg *capnp.Message) (Scope, error) { - root, err := msg.RootPtr() - return Scope{root.Struct()}, err -} - -func (s Scope) String() string { - str, _ := text.Marshal(0xc54a4a6fd4d87596, s.Struct) - return str -} - -func (s Scope) Value() Scope_value { return Scope_value(s) } - -func (s Scope_value) Which() Scope_value_Which { - return Scope_value_Which(s.Struct.Uint16(0)) -} -func (s Scope_value) SystemName() (string, error) { - if s.Struct.Uint16(0) != 0 { - panic("Which() != systemName") - } - p, err := s.Struct.Ptr(0) - return p.Text(), err -} - -func (s Scope_value) HasSystemName() bool { - if s.Struct.Uint16(0) != 0 { - return false - } - p, err := s.Struct.Ptr(0) - return p.IsValid() || err != nil -} - -func (s Scope_value) SystemNameBytes() ([]byte, error) { - p, err := s.Struct.Ptr(0) - return p.TextBytes(), err -} - -func (s Scope_value) SetSystemName(v string) error { - s.Struct.SetUint16(0, 0) - return s.Struct.SetText(0, v) -} - -func (s Scope_value) Group() (string, error) { - if s.Struct.Uint16(0) != 1 { - panic("Which() != group") - } - p, err := s.Struct.Ptr(0) - return p.Text(), err -} - -func (s Scope_value) HasGroup() bool { - if s.Struct.Uint16(0) != 1 { - return false - } - p, err := s.Struct.Ptr(0) - return p.IsValid() || err != nil -} - -func (s Scope_value) GroupBytes() ([]byte, error) { - p, err := s.Struct.Ptr(0) - return p.TextBytes(), err -} - -func (s Scope_value) SetGroup(v string) error { - s.Struct.SetUint16(0, 1) - return s.Struct.SetText(0, v) -} - -// Scope_List is a list of Scope. -type Scope_List struct{ capnp.List } - -// NewScope creates a new list of Scope. -func NewScope_List(s *capnp.Segment, sz int32) (Scope_List, error) { - l, err := capnp.NewCompositeList(s, capnp.ObjectSize{DataSize: 8, PointerCount: 1}, sz) - return Scope_List{l}, err -} - -func (s Scope_List) At(i int) Scope { return Scope{s.List.Struct(i)} } - -func (s Scope_List) Set(i int, v Scope) error { return s.List.SetStruct(i, v.Struct) } - -func (s Scope_List) String() string { - str, _ := text.MarshalList(0xc54a4a6fd4d87596, s.List) - return str -} - -// Scope_Promise is a wrapper for a Scope promised by a client call. -type Scope_Promise struct{ *capnp.Pipeline } - -func (p Scope_Promise) Struct() (Scope, error) { - s, err := p.Pipeline.Struct() - return Scope{s}, err -} - -func (p Scope_Promise) Value() Scope_value_Promise { return Scope_value_Promise{p.Pipeline} } - -// Scope_value_Promise is a wrapper for a Scope_value promised by a client call. -type Scope_value_Promise struct{ *capnp.Pipeline } - -func (p Scope_value_Promise) Struct() (Scope_value, error) { - s, err := p.Pipeline.Struct() - return Scope_value{s}, err -} - type ConnectResult struct{ capnp.Struct } // ConnectResult_TypeID is the unique identifier for the type ConnectResult. @@ -3706,228 +3559,222 @@ func (p ClientService_useConfiguration_Results_Promise) Result() UseConfiguratio return UseConfigurationResult_Promise{Pipeline: p.Pipeline.GetPipeline(0)} } -const schema_db8274f9144abc7e = "x\xda\xacY}p\x1c\xe5y\x7f\x9e}OZ\xc9\xd6" + - "\xf9n\xd9\xcb`\x09k\x94z\xc8$&\xd8\xc5Vi" + - "\xb1Zr\x96d;\x92\xe2\x8f[}\x18b\xcc\x8c\xd7" + - "w\xaf\xa4\x95\xf7vO\xfba$\x8f\x89\xb1\xeb\x14\xac" + - "B0$\xee`b2\xe0\xc6\xe5c\x9c\x06\x133-" + - "\x142i\xa7\x14\xdc$\x03\xb4\xd0!-\xfc\x13\xf0t" + - "\xca\x94\xa1&\xc90\xc9$l\xe7\xd9o\x9d\x0e\xd9\xee" + - "\xf4\x1f\xfb\xe6\xd9\xe7}\xdf\xe7\xf3\xf7|\xe8\x86\\\xeb" + - "\x06am\x93\x99\x05PN65{\x7fR}\xf5\xd4" + - "\x1f\x1e\xff\xf1\x11\x90:\x04\xefk/\x0c\x15~\xed\x1c" + - "\xfe\x0f\x00\xec~\xa4y?\xcag\x9bE\x00\xf9{\xcd" + - "\xdb\x01\xbd\x7f\xbd\xe1\xc0{\xbb\x7f\xf1\xc0= u`" + - "\xc2\x99\x11\x01\xba_j\x9eC\xf9\x9df\x11\x98\xf7\xc8" + - "m\x85\x7f\xc6G?~\x00\xa4/ @\x13\xd2\xe7\xe7" + - "\x9a\x97\x08\x80\xf2\xeb\xcdE@\xef\xd5\xeb_x\xfe\xd8" + - "\x0f\xee\xfe6(\x9fG\x84\xe0\xfc\xc5\xe6\xdf \xa0\xdc" + - "$\x12\xc3\xc5\xef~1\xf3\xbdW\xaf\xfa\x8e\xcf\xe0\x9d" + - "~\xfd\x96g\x8e\xfd\xe0\xb3\xef\xc3\x98 b\x06\xa0{" + - "\xb5h\x11\xefz\xf1?\x01\xbdo\xbd\xf5\xe2\xb6\xea\x03" + - "\x0f\x9f\x02\xe9\xf3\xd1]\xed-\x82\x00\x19\xef\xc6\x7f\xbf" + - "\xb0}\xeb3\xe3\x8f\x07_\x029\xb2-\xcf\xd0\xd1\xce" + - "\x16z\xe6\x95;\xf2\xf7\xf6\xfe\xd1\xfd\x8f\x83\xd2\x81)" + - "}\x9a\x9a\x88\xb3\xb7e\x0e\xe5\xaf\xb6\xd0\xcf\xb1\x96[" + - "\x10\xd0\x9b[\xff\xe2\x8e_\xfc\x99\xfd\x14(\xab1\xe3" + - "\xfd\xe3\xd1w\xf7\xadzr\xfce_*\x06\xd0}\xbe" + - "\xf5_\xe8\xeawZ\xbf\x0f\xe8e\xff\xee\xbam\xf7\xbf" + - "\xb7\xe5,]\x9d2j \xc4\x9dKzP\xbeo\x09" + - "\xd9\xf5\xe8\x12\xe2~\xed\xfa\x1d?\xfc\xe1\xd3\x13g\xeb" + - "\x05\x11\x88{\xd5\xd2!\x94o^J\xdc\xeb\x97\x12\xf7" + - "g\x06\xf1\xed\x1f\xad\xcd\xfcM\xa8\x17#\xa6\x0f\x96\xbe" + - "O\x8fc\x1b1\xdc\xf6\xdbg\xffa\xd3\x87o<\x97" + - "v\xc0cm\x029\xe0\xd96R\xbc\xf3\x83\xbe\xac\xf1" + - "\xe1\xe1\x1f\xcd\xf7cp\xd3;mC(_l\xa3\xe7" + - ">\xf0o\xfb\x0b\xf7\xad7\xcc\xa1\xa1\x97\xea\x85\xf3\xaf" + - "=\x9a\x15P>\x9e%\xee\x07\xb2E\xc0\x8f\x9f\xba\xfb" + - "\xd8\xe0\xbb\x1b_V:0S\xcf{<\xbb\x1f\xe5'" + - "\x89\xb7\xfbt\xb6\x8b,\x1a\xdb\xb0\x8e\xdd\xd7\xfb\xcde" + - "S(\xff\xd72\xfaya\x99\xcf>t\xdb7\x1fl" + - "\xba\xf0\xcd\x97\xeb\x8d*\xfa\x01\x94\xb3Pn\xca\xd3O" + - "\xcc?.\x00z\xbf9\xf3\xa7\xfc\xc2\x9aW\xce\x83\xf2" + - "YL\xa91\x86\"\x0ad\xb2\xab\xd6\x91\xc9~u\xd5" + - "\x1d\x80^\xc7\xd3\x7f\xfc\xd7}\x95\x9f\xfd\xb8\xce\"$" + - "\x88<&\x7f$\xab2\xfd\xba]&\xde\xbb\xbf8\xbb" + - "\x7f\xdb\xe7\xe6\xdelh\x90\xe7\xe49\x94_\xf7\xb9\x7f" + - "\xeas\x0b\x17\xd4\xf6\xbb\xfe\xedKo\xa7\xe2\xf3\xe6\xc2" + - "\xcf\x112\xde\xb6\x1d\xb7M\xb5\xde\xf9\xee\xbb\xe9\xf8\\" + - "[\xf0\xfd\xb8\xa9@n:'=(\xbf\xf0\xd8_\xbd" + - "G\x0f\x89\xf5~\xe2\x85\x9d(\xcf\x16\xe8\xa7[\xf0\xf5" + - "\x8d\xf3\xa4Q\x14M_\xdd\x83\xf2\xa1\xabI\xae;\xaf" + - "&\xb9n\xdc\xdd\xcbw\xddt\xeb\xfb u\xb0yY" + - "\xff\"q\xfe\x948\xbb\xcf_-\xa2<\xbb\\\x04\xf0" + - "\xbe1\xb1\xf3\xfc\xc5\xfe\xc7\xfe\xa7\xfer_!uy" + - "\x0f\xca\xd3\xc4\xd7]]\xee\xbb\xaa{\xed\x9f\x7fp\xfc" + - "/\xfb/.\xb8\xfd\xb9\xf6>\x94\xcf\xb7\x93\x1c/\xb5" + - "\x7fY\xfeU\xbb\x7f\xf9\xd76n_\xbf\xf2\xef?J" + - "[\xe2\x9d\xf6\x8f\xc8\x12\x17\xdb\xc9\x12\xe37\xfd\xf7\x97" + - "?\xf7\x8d\x7f\xfa\xa8\xce=>\xa3\xd4q\x1d\xca\xbf\xd7" + - "A7vv\x14\x01?\xdc\xfc\x9d7:r\x1d\xbfl" + - "$ho\xc7\x14\xcac\xc4\xdb\xadt\xf8\x82\xde\xfa\xf3" + - "\x87\xef(~\xfb\x97\x1f\x93^\xac\x0e\xd3\x0e]\xb3\x13" + - "\xe5\xe3\xd7\xf8\xc1}\x0d\xa5\xc2\x963?\xfb\xd2\xe4\xf1" + - "W~]o\x04\xdf!7\xaf8\x8c\xb2\xb2\x82\xb8\xb7" + - "\xae d:\xf0\xe1\x89\x81\xfbw\x9d\xf9$\xad\xd5\x8d" + - "\x9d\xcf\xfb\xfe\xed$\xad\xa6\x8e\x1fp\x06\x1e\xba\xcfk" + - "\x94\x86\xbc\xb3\x0fe\xb7\x93n\x9b\xee\xfc>\xac\xf6\x1c" + - "\xd70\xb8n\xd52\xe5\xdf\x8f~\x96\xd7\x94\xd5\x9aQ" + - "\xeb\xd94\xa3\xd9\x8efL\x8c\xfa\xf4b\xc9\xd4\xb5\xf2" + - "l\x09Qi\xa3@\x97:{\x00\x10\xa5\xcf\xec\x04@" + - "A\x92\xfa\x00\x8a\xda\x84aZ\xdc\xabhv\xd94\x0c" + - "\x0e\xac\xec\x1c\xdc\xa3\xea\xaaQ\xe6\xf1CM\x0b\x1f\x1a" + - "\xe0\xban\xdebZze\xbb\xa5MhF\xbfi\x8c" + - "k\x13\x00%\xc4\xf8\x98\xb8\xf0X\xbf\xaeq\xc3\x19\xe1" + - "\xd6>\xad\xcc\xd7\xb86\x0f\xce\xb9\x96\xeah\xa6q\xed" + - "0\xb7]\xdd\xb1\x01\x94\x0c\xcb\x00d\x10@\xca\xf6\x00" + - "(-\x0c\x95\x82\x80E\xcbg\xc0|\x92y\x80\x98\x87" + - "\xe4\xcd\xe6\x85o\x06\xb6\xa07\xb9\xb5\xc65,>\xa1" + - "\xd9\x0e\xb7\x02\xf2\xb5\xc5\x92j\xa9U;\xfd\xe0\xc3\x00" + - "J\x9e\xa1\xb2B@o\xc2R\xcb\xbc\xc4-\xd4\xcc\xca" + - "6\xd50G\x18/c\x13\x08\xd8\x94z\xb4\x81#6" + - "\xab\x9a\xce+\x81vk\xca]\xfe\xffJ\x9ee\xda<" + - "\xcf\x7fD\xdd\x09\xa0\xecf\xa8\xe8\x02f\xf1\x13\xaf@" + - "\xe5O\xd2\xf6\x03(\x93\x0c\x15G\xc0\xac\xf0;\xaf\xe0" + - "{mz%\x80\xa23Tf\x04\xcc\xb2\xdfz\x05*" + - "2\x92;\x05\xa08\x0c\x95\xbb\x04\xf4l\xb7F6\xb5" + - "\x81\x99\x16\xe6\x93P\x0e\xad\xc3+\x13di\x03\x8a\xbc" + - "L\x86\xc6|\x84\xce\x01\x83X1'1\x9f\x14\x9f\xf0" + - "\x98\xc5\xf7q\xcb\xe6%\xc8Y\xe6\xcc,\xe6\x13\x94\xae" + - "\xb3z\xf6J\xad\x1e9:>\xb5\xf8y?4\xcb\xce" + - "\xb5\xa5\xae\x05\xce\";\xb61T\x96\x0b\xe8\xd5\xe8+" + - "w80\xcb\xc6|R\xd4\xeb\xa4m\x10\xce\xfd\xf4o" + - "\x7f\xf0J)\xbc\xc5\xb2\xfdpV\x96\xc7\x8f\x9d\xa0\xc7" + - "\x1eb\xa8|W@\x091\xf0\xd9c\x16\x80\xf2(C" + - "\xe5\x8c\x80(\x04\x1e{\xf2\x14\x80r\x86\xa1\xf2\xb7\x02" + - "JL\x08\x1c\xf6\xecu\x00\xca\xd3\x0c\x95\x9f\x08(e" + - "X\x81\x1a\x18\xe9<\x05\xdbO\x18*o\x09(5e" + - "\x0a\xd8\x04 \xbd\xb9\x0e@y\x8d\xa1\xf2\xb6\x80\x9e\x19" + - "\xe4\x17)\xe5`\x16\x04\xcc\x02ze\xddt+\xe3\xba" + - "\x0a]\x16\xaf\x0cn\x8c\xe9\x86[-Y|\x9f\x86\xa6" + - "k\xf7:\x0e\xaf\x8a5\xc7\xc6f\x10\xb0\x190\xe7\xa8" + - "\x136.\x03,1\xc4|R\xe8\x00\x89\x18\xdf\x89\x16" + - "\xaf\xec\xe0\x96\xad1\xd3\xc06\x10\xb0\x0d\xb0\xcb.\x9b" + - "5\x8e\xf9\xa4v^:\xef\x86\xc3\xe8\xa1\xd8\x09\x13\xc1" + - "L\xb0\x02'\x946\x96Y\xe1y\xa1\x197\x91u6" + - "0T\xb6\x08\xd8\x89\x9f\x10\x99,98\x0c\xa0\x0c0" + - "TF\x05\xec\x14~Gd\xb2\xa5B\x9e(1Tv" + - "\x09\x98\x9bt\x9c\x1a\xe6\x93\x1a\x19\x8av\x07\xdfc\x9b" + - "\xe5\xbd\x1c\x90\x00#\x06\xec\xf0\xebd\x08`\xc0\xf4\x0a" + - "\xe6\x93~\xb6N/\xd6 V\xfc0):\x9b,\xcb" + - "\xb4|l\x8d\x03d\xd3\xbaD\x89(>\x06w&\x1a" + - "H\xc2\x86@-eO\"\x7fWYum\x1eY\xda" + - "\xb3\xb8c\xcd\xf6\x8e;\xc0\xb8\x15#\x8d=i\xbaz" + - "e\x98\x83\xe8X\xb3\x88 .\x8e?\x1b\xcd\x81\x94" + - "\xe1\x83@N\xc9I2md\xa8\x94\x129\xb7\x12m" + - "\x0bC\xe5V\x9234\xff\x18\x99\x7f\x94\xa1R\x13\xd0" + - "\xd3)\x83\x8d\x01\x13\x98\xed\xc4\xe2\x06\xc4\x92\xe9\x87\xa7" + - "\x08\x02\x8a\x80\x9e[\xb3\x1d\x8b\xabU\xc08\xde\x88\x7f" + - "\xd9\x15\x00u\x1d`\x94\xd4\x9c\x9f\xf9\x8du\x88\x93q" + - "\xebPZ\x890\x1b\xc7\xfa\x12c7N\xa7I\xd3v" + - "\x0c\xb5\xca\x01 R\xec\xa0Y#\xa4$\x1c\x89\x9b\xcd" + - "\xba\xd8\xb8\xf2\xfa\x16\xd4\x9ay\xd5\xedT\xaa\xd8\x94\xc3" + - "\xd3\xe8\x1f\xef7\x0dq\\\x9b\xc0|\xd2q\xd5\x09\xd0" + - "\xc0\xef\xbd\xae3\xc9\x0dG+\xfb\x0f.\xf0\xfb\xca$" + - ">c\x9b\x0d\xaeK\x192\xb2\xd9\xd6=\x89!\xc5\xbd" + - "|6\x06\x02^U5=\xf6~h\xcd^\x10\xbf\x92" + - "\xf0,\x96<#\x84#\xbeT\xbe\x0d0\xd5\x9bK\xd9" + - "u t\xedSu\x97/\xda\xe2\x84\xb5,\xa8d\xc5" + - "\xc0\xc0ta!V\xf3\xce9\x00\xe5.\x86\xca\xbd)" + - "5\x8f>\x08\xa0\xdc\xcbPy(\xa5\xe6q\x0a\x8dc" + - "\x0c\x95\x93\x04\xd4,\x00\x97\x13\xe4\x93\x93\x0c\x95'\x04" + - "\xc4L\x80\xd3\xa7\x09\xa7\x9f`\xa8\x9c\x13|\x94\x1d\xe8" + - "\xed7\x0d\x0c\x85\xb0\x01\"\x8c\xf5&\xb9j9{\xb8" + - "\x8a\xce\xa0\xe1pk\x9f\x8az\x94\xc5\x07\x1d\xad\xcaM" + - "\xd7\x89\xb3\xba\xaa\xce\xf8}\x02V\x06\x82S\xa2\xea\xd8" + - "\xd8\x0a\x02\xb6R\x12\xd9\xdc\xea\xb7x\x05\xc9\x9f\xaa^" + - "R\x993\xb9\xc0\xc4\x99K\xe1n\xae\x81y\xa8\xcb8" + - "\xc0P\xb9\x87\xb2\x1fS\xe3\xac\xf4\xf5)\x10\xfc\xe4'" + - "\x9d\xa7\xfb\x92\xbe\xc3\xafbT\x9b\\2\xe3\x0cC\xe5" + - "HX\xc5\x9a\x01\xa4Cd\x9d#\x0c\x95cB$\xda" + - "\x80\x09\xc5 \xa9\xea\x83\xc5\x04_\xa6\x83\x04t\x1aO" + - "\xf4\x0d\x8b\xbc\x86\xa61\xea\x1b\x0a\x13K\x95\xcdj\xcd" + - "\xe2\xb6\x8d\x9ai(\xae\xaak\xcc\x99\x8d\x0f.j\x0b" + - "B\x91 \xfb\xb6\xd7\xba|g\x911n\x88\x8c!\xf7" + - "\xe2\x10\xc0\xc8\x06d8\xb2\x05\x93p\x91\x07\xb1\x0f`" + - "d#\xd1K\x98D\x8c\xbc\x15;\x00F\x06\x88>\x8a" + - "\x02b\x103\xb2\x82O\x01\x8c\x8c\x12y7&\xf5]" + - "\xbe\xdd\xbf~\x17\xd1'1)\xf12\xc7\xeb\x00Fv" + - "\x13\xfd\x00\xd1\x9b\x05\xdf\x92\xf2,N\x01\x8c\xcc\x10\xfd" + - "\x08\xd1\xc5\xa6\x02M\x0b\xf2!\xb4\x00F\xee\"\xfa\xbd" + - "DoY^\xc0\x16\x00\xf9\xa8O\xbf\x87\xe8\xdf\"z" + - "k{\x01[iJ\xc1\xc3\x00#\xc7\x88~\x92\xe8K" + - "\xb0\x80K\x00\xe4\x13\xf80\xc0\xc8I\xa2?A\xf4\xa5" + - "\xcd\x05\\\x0a \x9f\xf6\xe5y\x94\xe8g0\x86\xa2\xc1" + - "J\x1a\x11)\xac\xb4\xa4'`\xa6\x1d\xbb\x96\x87s\x07" + - "\x06p]2s4x`.\xd9(\x01b\x0e\xd0\xab" + - "\x99\xa6\xbem>\xd2^\xaa-\x09\xc3\x02r\xa61X" + - "\x89\xf3,\x08\xa6-&t\x95U}\xb0\x16K\xa2\xd9" + - "\xbd\xaec\xba5\xe8\xaa\xa8\x0e\xaf\xc4\xb5\xd2r\x8d\xcd" + - "\x96Y\x1dEnU5C\xd5!\xfe\xb2Xl\xe5\\" + - "W\xab\\6\xae\xad\x09\xd0KiI\xfa\xfcUT\xa5" + - "\xbe\xc0P\xf9\x83t\x9f\xbf\x96 \xf7z\x86\xcaM\xd4" + - "\xbb\xcf\xda\x0e\xafnS\x81%\xb9\xd25a\x99nm" + - "\xc1\xc3B\xfd\xc3]\xb5\x9eQ\xd5O\xef\x968\xbdW" + - "Q'u-C\xe5\x86\x14\xfa\xad^\x97\xc8\x91Kg" + - "e \xf2\x82\x97\x1a\xf4\xc8cu\xd5,\xe8\xe1\x83\x12" + - "\x93z\xbd/y=~\xdc\x0a\xd5\x1d\x10\xf0\xa0\xed\x96" + - "\xcbd\xed\xc8\xfc\xe3\xe1\xa4\x04]tw*\x10\xe2%" + - "F\x18\x08\x97\xdb9Lp'\xf85h\x8c\x9bTr" + - "E\xb5j\xff\x1fO\x0fs;G\x83\xca%\xe7\xd1x" + - "-q\xe9\x12=0:ZJ\x86f\x16\xa0s\x1a\x90" + - "\x86\xd3\x80\x94\xe0\xd1T\x1aw\xa2NRV|\x00(" + - "\x11}\x17&\xd3\x86\xfcU<5\x0fx2\xbd\x01 " + - "q\xff\xfa\x0a\xd1k> a\x00HU\xff~\x9d\xe8" + - "3i@rqn> \xb1\x08\x90\x08H\x8e\x10\xfd" + - "\x98\x0fH\x99\x00\x90\xee\xc3g\xe6\x01OkS\x00H" + - "'\xf0\xf9y\xc0\xb3\xa49\x00\xa4\xd3>\xff\x13D?" + - "\xe7\x03R_\x00Hg}\x00{\x9a\xe8/\x10 \xb9" + - "\x96>\xe2X\x9a\x018\x91\x04k\xb9\xf6\x15\xcek\xbd" + - "\x90\xd3\xb5}<.\x16\x15M\xd57\xba\xaa\x0e]#" + - "\x8eZ\xde\x9b\xb4\xcb\xba=\xa0\x1a\x15\x1b'\xd5\xbd\x9c" + - "J\x8c\x98.\xc6\x8en\xef\xe0\x966\x0e\x984\xd8q" + - "{\x93+\x99f}\xd7\xe3\xf7i\xdc\x0a\xd0,\xfeV" + - "Ug\x06+:\xef\xc7\xa8EaFR\xe24\xfab" + - "\x1a\x06\x06}\xc3\xa8\xd65\xbf!\xa8\x85-{\xd4X" + - "\x8c\x16\xeb:\x06>S\xe3e\xa7\xdfD\xc3\xd1\x0c\x97" + - "/\xb8\xa0<\xe9\x1a{ye\x13\x1ae\xb3\xa2\x19\x13" + - "\xb0`V`\x9f\xb6\xabHuR-ak\x16/\xdf" + - "\xa5U= \xf8XB}\x81\xd4\x93\xcc\xdc\xc5\xb2\x7f" + - "\xaahq\xd5NJ\xc3b\xaf\x85\xab\xa9 \xc9\xe8\xb5" + - "m\x14h\xdc\x9f" + - "\xf6%=T\x84\x91\x87\xe6\x92\x16*\x1e\xbf\xee{*" + - "\xdd\x9e\x86{\x84\x13\x87\xc3-\xc4\xb9\xd4\x1e\xe1,\xf5" + - "\xac\xe7\x18*\xaf\x09I\xa1\x8e\xc2.\xda\x0e\xa1iE" + - "\xf3\xe0\"K\xa208\xc3\xd6\xb1~U\xe4U\xccI" + - "\xbf\xb5\xc4\xe0*\x1b\x12\xc4N\xef\x8f\x96\xa5\xf6G\x18" + - "M\xa2\xe2<\x80Oo\x93\x96-\x8e\x99\xf3\xe6\xaap" + - "|\xa0\xa8\x89\xfe\xbe\x81\xd1_\x9a$\x89\xbc\x9f\x15\xbd" + - "h\xf6\xc2\xa8\\\x91\xf3\xd2.\xbb\xc2\x01t\x98w\xd9" + - "\x97S\x09\xa2\x9d\xf3\xa5\xf7\x08\xc1;9\x0a\xb6x\x1e" + - "\x0a\xee\x9dJ\xed\xb4t3\x1c\xe5r\xdb\xd2\xbd\xf4\"" + - "\xb6\x0a\x04\x8e:\xdf\x1c\x1d\xae\x0b\xbf\x95\xa9\x16>\x8e" + - "\xbf\x95\xc9P\x10\x8fG_\x1f\x0a\x83\xf2\xd1\xb8\xd3\x95" + - "\x1e\x99K\xf6]q\xf8=9\x94\x8cG\"\xb7\xacH" + - "N\xd1\xb5\x12\xd8\xd4\xcd\x89-\x9a\xc1m\xea\xfd\xea\xb6" + - "\x025nUU\x83\x1b\xe8\x10\x18\xb9\x16!\xea|\xe4" + - "\x1a\xdc\x98j\x19\x17S\x7f$\x0c\xf6 \xd6\xc3\xf2\x9a" + - "\x1a\x81O\xa5\xd61\x91\xf2\xca\xf3\xe1\x9acwJ\xf9" + - "\xdbi\x04\xde\xc5P\x99\x14\xd0S]\xc7\x1c\xabUT" + - "t\xf8f\x8bO\xbb\\4\xca\xb3\xc9 G\xa3L\xd9" + - "\x1e\xc3\x1a5\x9d\x9b-^\x9cvy\x9a!Z#\x83" + - "\xa8\x99\x95\x05\xfb\xe3\x06\xcd\xd6-|\xcf\x88Y\xde\xcb" + - "\x9dy\xeb\xf5\x00.#U\xd4\xe1d\x87\x1ci\xa2\x0d" + - "'\x1b\xe4\x18F\xa6)\xa0j\x0c\x95\x03)\x18\x99\x9d" + - "K\x1c\xde\xb8\xba\xfe\xff\x14\xc4E\x94l\xb8\xe3\x1d." + - "\xf2\xcbJ\xb4\xe4o&\x97n\xb9\xc2}A\xd8\xb1^" + - "\xceNd\xde\xd2.\x0c\x08e*\xd9#\xf9A\x9eO" + - "\xfe\xb8\x1b\xca`\x87\xad#\xb0q\xb3AW\x18LU" + - "\xd1\x04\xbcp\xb3\xf3\xbf\x01\x00\x00\xff\xff\x82\xd9\x7f\x1e" +const schema_db8274f9144abc7e = "x\xda\xacY\x7f\x8c\x1c\xf5u\x7fo\xbe\xbb;>s" + + "\xe7\xdd\xf1\x1c\xe0;\x8c\xb6\xb2\x88\x12\x13L!.m" + + "\xb8VY\xdf\x9d\xcf\xb9u\xfcc\xe7\xf6\xce\x801\x92" + + "\xc7\xbb\xdf\xdb\x9b\xf3\xec\xccz~\x98;\xcb\xc4`\xd9" + + "\x05_q\xb0\x09\x960\xc1\x11\xb8q\xc1\xc8\x14L\x8c" + + "Z(I\x93\xaa-\xa1IE\xdaB\x95\xb4\xf9\xa3\x0d" + + "\xa0*\xa8\x115I\x85R\x05\xa6z\xf3\xfb\xf66g" + + "\xbb\xea?\xf6\xe8\xed\xf7\xc7\xfb~\xde{\x9f\xf7\xe3n" + + "y}\xc9:\xe1\xd6\xec_v\x03(\x8fes\xde\x1f" + + "4\xdf<\xfd\xbb'\xbe\x7f\x08\xa4~\xc1\xfb\xf2k\x1b" + + "{\x7f\xe5\x1c\xfcW\x00\\;\x92\xdb\x87\xf2]9\x11" + + "@\x9e\xc8m\x05\xf4\xfe\xe9\x96\xfd\xef\xee\xfc\xc5\xf1\x87" + + "@\xea\xc7deF\x04X\xdb\xcc\xcd\xa1|8'\x02" + + "\xf3N\xdd\xdd\xfbw\xf8\xd4G\xc7A\xfa\x0c\x02d\x91" + + "~VsK\x05@y6W\x02\xf4\xde\xbc\xe9\xb5W" + + "\x8f}\xf3\xc1\xaf\x81\xf2iD\x08\xf6\x9f\xcc\xfd\x0f\x02" + + "\xca\xcf\xfb\x0b.~\xe3\xb3\x99\xe7\xdf\\\xfeu\x7f\x81" + + "w\xe6\x1f\xeex\xe9\xd87\x7f\xeb}\x98\x10D\xcc\x00" + + "\xac};g\xd1\xda\x7f\xcf\xfd\x07\xa0\xf7\xd8\x8f\xbe\xb5" + + "\xa5y\xfc\x89\xd3 }::\xeb\xbb\xa2 @\xc6\xbb" + + "\xed_\xde\xdb\xba\xf9\xa5\xc9g\x82_\x02=^\x16_" + + "\xa2\xad\x7f#\xd25\xdf\xbb\xb7\xf0\xf0\xe0\xef=\xf2\x0c" + + "(\xfd\x98zO6K+\x7f&\xce\xa1\x8cK\xe8\xf3" + + "c\xf1\x0e\x04\xf4\xe6n\xff\xd6\xb6_\xfc\xa1\xfd\x1c(" + + "k0\xe3\xfd\xf5\x91w\xf6\xae>;\xf9\xba\xaf\x15\x03" + + "X\xebv\xfd#\x1d}\xa4\xeb\x05@\xaf\xe7/n\xdc" + + "\xf2\xc8\xbb\x9b\xce\xd3\xd1)P\x03%V/\x1d@\xf9" + + "\xf6\xa5\x84\xebmKi\xf5\x0fo\xda\xf6\xedo\xbf\xd8" + + "8\xdf\xae\x88@\xab\xdf^\xba\x11\xe5\x9f\xf9\xab\xdf\xf3" + + "W_]\xc6\x9f|\xe7\xd6\xcc\x9f\x85\xefb>|W" + + "\xbd\xef\xc3w\x15-\xb8\xfb\xd7/\xff\xd5\xc8\x07o\xbd" + + "\x926\xc0\xe6n\x81\x0c\xa0v\xd3\xc3\xaf\xff\xf9P\x8f" + + "\xf1\xc1\xc1\xef\xcc\xb7cp\xd2\x91\xee\x8d(\x9f\xea\xa6" + + "\xebNv\xbf\x00\xf8\xd1s\x0f\x1e+\xbf\xb3\xfeu\xa5" + + "\x1f3\xed\x0f\xb9\xadg\x1f\xca\xe5\x1e\xfa\x1c\xe9)\x12" + + "F1*m\xcb\xfd\x97\xb8\xcb\xa6Q>\xb2\x8c>\x0f" + + "/\xf3\x97o\xbc\xfb\xab\x8ff\xdf\xfb\xea\xeb\xed0\x89" + + "\xb4\xe6x\xdeB\xf9L\x9e>\x9f\xce?#\x00z\xfd" + + "/\xfe\xfe\x9f\x0e\xd5\x7f\xfc\xfd6\xbd\xe9p\xf9\xe8\xf2" + + "\x0f\xe5\x93\xcb\xe9\xeb\xc4\xf2{\x01\xbd\x07?;\xbbo" + + "\xcb\xa7\xe6\xden\xc7\xd4W\xfc\xe2\xf29\x94\xbbdZ" + + "\x9d\x95i\xb5\xf0\x9e\xdaw\xff?\x7f\xe1')/r" + + "\xe5\x9f\"d\xbc-\xdb\xee\x9e\xee\xba\xef\x9dw\xd2^" + + "\xa4\xc9>\xda\xf7\xc9\x04\xe6\x05\xe9Q\xf9\xb5\xa7\xff\xe4" + + "]\xbaHlG\xf3\x94\xbc\x1d\xe5\xf3t\xd1\xda\xe7e" + + "\xff\x0d\xb17w\xb2\xf5\xd9k\x06P~\xe5\x1a\xd2\xeb" + + "\xe5kH\xaf\xdbv\x0e\xf2\x1d\x9f\xbf\xf3}\x90\xfa\xd9" + + "\xbc\xd8\xfcoZ\x99\xbd\x966\xe1\xb5\"\xca\xe7\xe9\xd3" + + "\xfbJc\xfb\x1b\x17\x87\x9f\xfe\xaf\xf6\xc3\x83\x10\xbbv" + + "\x00\xe5\xb3\xfe\x963\xd7\xfa\xf0\xaf\xbd\xf5\x8f~~\xe2" + + "\x8f\x87/.8\xfd\xe2\x8a!\x94\xb1\x8f\xf4\xf8x\xc5" + + "\x17\xe55}\xfe\xe1_^\xbf\xf5\xf6U\xdf\xfd0\x8d" + + "\xc4\xd5}\x1f\x12\x12\xab\xfb\x08\x89\xc9\xcf\xff\xe7\x17?" + + "\xf5\x95\xbf\xfd\xb0\xcd<\xfe\xc2r\xdf\x8d(\xdf\xe5\x9f" + + "8A\x8b?\xd8\xf0\xf5\xb7\xfa\xf3\xfd\xbf\xec\xa4\xe8l" + + "\xdf4\xcaG\xfb|o\xec\xf3\x15\xbd\xf3\xa7O\xdc[" + + "\xfa\xda/?\xa2w\xb16\xe6y\xa5\x7f;\xca\x7f\xdf" + + "O'\xbf\xd1O\xee\xbf\xe9\xdc\x8f\xbf0u\xe2{\xbf" + + "j\x07\xc17\x88{\xddA\x94\x8f\\G\xab\x0f_G" + + "\xfc\xb1\xff\x83\x93\xa3\x8f\xec8\xf7I\xfaU\xcd\x95\xaf" + + "\xfa\xf6]I\xaf\x9a>\xb1\xdf\x19}\xfc\xa8\xd7)X" + + "N\xad\x1cB\xf9\xf9\x95t\xda\xd9\x95/\xc0\x1a\xcfq" + + "\x0d\x83\xebV+S\xfb\xed\xe8\xb3vsMm\x19\xad" + + "\x81\x91\x19\xcdv4\xa31\xee\xcbK\x15S\xd7j\xb3" + + "\x15D\xa5\x1b\x05\x00\xe9\xfa\x01\x00D\xe9\xea\xed\x00(" + + "H\xd2\x10@Ik\x18\xa6\xc5\xbd\xbaf\xd7L\xc3\xe0" + + "\xc0j\xce\x81]\xaa\xae\x1a5\x1e_\x94]x\xd1(" + + "\xd7u\xf3\x0e\xd3\xd2\xeb[-\xad\xa1\x19\xc3\xa61\xa9" + + "5\x00*\x88\xf16q\xe1\xb6a]\xe3\x86S\xe5\xd6" + + "^\xad\xc6ovm\x1e\xecs-\xd5\xd1L\xe3\x861" + + "n\xbb\xbac\x03(\x19\x96\x01\xc8 \x80\xd43\x00\xa0" + + ",a\xa8\xf4\x0aX\xb2\xfc\x05XH\"\x0f\x10\x0b\x90" + + "\xdc\x99[xg\x80\x05\xdd\xc9\xad\x9b]\xc3\xe2\x0d\xcd" + + "v\xb8\x15\x88o(UTKm\xda\xe9\x0b\x9f\x00P" + + "\x0a\x0c\x95\x95\x02z\x0dK\xad\xf1\x0a\xb7P3\xeb[" + + "T\xc3\xac2^\xc3,\x08\x98M]\xda\xc1\x10\x1bT" + + "M\xe7\xf5\xe0u7\xd7\x8a\xfe\xffJ\x81e\xba=\xcf" + + "\xbfD\xdd\x0e\xa0\xecd\xa8\xe8\x02\xf6\xe0'^/%" + + ")I\xdb\x07\xa0L1T\x1c\x01{\x84\x8f\xbd^\xdf" + + "j{V\x01(:CeF\xc0\x1e\xf6k\xaf\x97R" + + "\x81\xe4N\x03(\x0eC\xe5~\x01=\xdbm\x11\xa66" + + "0\xd3\xc2B\xe2\xca!:\xbc\xde \xa4\x0d(\xf1\x1a" + + "\x01\x8d\x85\x88q\x83\x05b\xdd\x9c\xc2B\x92\"\xc2m" + + "\x16\xdf\xcb-\x9bW o\x993\xb3XH\x98\xb7\x0d" + + "\xf5\x9e+E=2t\xbck\xf1\xfd\xbek\xd6\x9c\x1b" + + "*\xc5\x05\xc6\"\x1c\xbb\x19*+\x04\xf4Z\xf4+w" + + "80\xcb\xc6B\x92z\xdb\xb4\xed\xe0\xce\xc3\xf4\xefp" + + "pK%<\xc5\xb2}wVV\xc4\x97\x9d\xa4\xcb\x1e" + + "g\xa8|C@\x091\xb0\xd9\xd3\x16\x80\xf2\x14C\xe5" + + "\x9c\x80(\x04\x16;{\x1a@9\xc7P\xf9s\x01%" + + "&\x04\x06{\xf9F\x00\xe5E\x86\xca\x0f\x04\x942\xac" + + "\x97\xca\x0c\xe9\x0dr\xb6\x1f0T~$\xa0\x94\xcd\xf4" + + "b\x16@z{\x17\x80\xf2\x16C\xe5\xdf\x04\xf4\xcc " + + "\xbe\xe8Q\x0e\xf6\x80\x80=\x80^M7\xdd\xfa\xa4\xae" + + "B\xd1\xe2\xf5\xf2\xfaXn\xb8\xcd\x8a\xc5\xf7jh\xba" + + "\xf6\xa0\xe3\xf0\xa6\xd8rl\xcc\x81\x809\xc0\xbc\xa36" + + "l\\\x06Xa\x88\x85$\xd1\x01\x920>\x13-^" + + "\xdf\xc6-[c\xa6\x81\xdd `7\xa0\xa7\x19\x0e7" + + "\x9cM*\x88\xbb\xb8\x1eK\x17\x89\xba\xb1\xd0w\xc8s" + + "\xc200\x13\xa6\xc0\x86\xd2\xcd2+=/\x04q\x84" + + "\xb0Y\xc7P\xd9$\xe0\xf5\xf8\x09\x89\x09\xc7\xf2\x18\x80" + + "2\xcaP\x19\x17\xf0z\xe1c\x12\x13\x92\x0a\xd9\xa1\xc2" + + "P\xd9!`~\xcaqZXH2dh\xec{\xf9" + + ".\xdb\xac\xed\xe6\x80D\x171]\x87\xbfN\x85\xf4\x05" + + "L\xafc!\xa99\xdb<\x85u\xf0\x14\xdfIJ\xce" + + "\x88e\x99\x96\xcf\xac\xb1{\x8c|.yD\xe4\x1d\xe5" + + "\xed\xc9\x0b$a]\xf0,eW\xa2\x7f\xb1\xa6\xba6" + + "\x8f\x11\xb5\xb8c\xcd\x0eN:\xc0\xb8\x15\xf3\x8c=e" + + "\xbaz}\x8c\x83\xe8X\xb3\x88 .\xce>\xeb\xcd" + + "\xd1\x14\xf0\x81\x1b\xa7\xf4$\x9d\xd63T*\x89\x9e\x9b" + + "I\xb6\x89\xa1r'\xe9\x19\xc2?A\xf0\x8f3TZ" + + "\x02z:\xc5\xaf1j\x02\xb3\x9dX\xdd@X1}" + + "\xe7\x14A@\x11\xd0s[\xb6cq\xb5\x09\x18{\x1b" + + "\xad_v\x054\xddF\x17\x155\xef\xc7}\xe77\xc4" + + "\xa1\xb8yc\xfa\x11a,N\x0c%`w\x0e\xa6)" + + "\xd3v\x0c\xb5\xc9\x01 z\xd8\x01\xb3El\x1a\xe2\xa4\xd6\xc0BRo\xb5" + + ")\xd0\xc1\xee\x83\xae3\xc5\x0dG\xab\xf9\x17.\xb0\xfb" + + "\xaa\xc4?c\xcc\xca\x9fK\x01\x19a\xb6yW\x02\xa4" + + "\xb8\x9b\xcfF\xb0\x14yS\xd5\x92\xf0\x0f\xd1\x1c\x04\xf1" + + "K\xc9\x9aE\xcb\x930\x0f\x05Y\xa8\x14\xc0CJ\xf6" + + "\xc6J\xde7\x07\xa0\xdc\xcfPy8\xa5\xe4\x91G\x01" + + "\x94\x87\x19*\x8f\xa7\x94\x1a\xec\x12U\xc7\xc6.\x10\xb0\x8b" + + "B\xc0\xe6\xd6\xb0\xc5\xebH\xd6P\xf5\x8a\xca\x9c\xa9\xcb" + + "\x01h>k\xe6;\xc0C\x15\xc2~\x86\xcaC\x14\xbb" + + "\x98j\x18\xa5\xc3\xd3 \xf8\xa1Ko\xde3\x94\xd4\x0c" + + "~\x06\xa2\xbc\xe2\x12\x8c3\x0c\x95Ca\x06\xca\x01H" + + "\x0f\x10:\x87\x18*\xc7\x84H\xb5Q\x13JAH\xb4" + + "\x9b\xda\x04_\xa7\x03DS\x1aO\xde\x1b&h\x0dM" + + "c\xdc\x07\x0a\x13\xa4jf\xb3eq\xdbF\xcd4\x14" + + "W\xd55\xe6\xcc\xc6\x1b\x17\xc5\x828 \x88\x9d\xad\xad" + + "\xa2o,\x02\xe3\x96\x08\x0cy\x107\x02T\xd7!\xc3" + + "\xea&L\xdcE.\xe3\x10@u=\xc9+\x98x\x8c" + + "\xbc\x19\xfb\x01\xaa\xa3$\x1fG\x011\xf0\x19Y\xc1\xe7" + + "\x00\xaa\xe3$\xde\x89In\x96\xef\xf1\x8f\xdfA\xf2)" + + "L\xd2\xb3\xcc\xf1F\x80\xeaN\x92\xef'yN\xf0\x91" + + "\x94gq\x1a\xa0:C\xf2C$\x17\xb3\xbdT\xe9\xcb" + + "\x0f\xa0\x05P\xbd\x9f\xe4\x0f\x93|\xc9\x8a^\\\x02 " + + "\x1f\xf1\xe5\x0f\x91\xfc1\x92w\xf5\xf5b\x17\x80|\x1c" + + "\x0f\x02T\x8f\x91\xfcI\x92/\xc5^\\J\xad2>" + + "\x01P}\x92\xe4\xcf\x92\xfc\xaa\\/^\x05 \x9f\xf1" + + "\xf5y\x8a\xe4\xe70&\x92r=\xcdg\xe4VZ\x92" + + "\xcf\x99i\xc7\xa6\xe5a\xcf\x80\x01\xd9V\xcc<5\x0d" + + "\x98Of6\x80\x98\x07\xf4Z\xa6\xa9o\x99\xcf\x93\x97" + + "*)B\xb7\x80\xbci\x94\xebq\x9c\x05\xce\xb4\xc9\x84" + + "bM\xd5\xcb\xad\xa4\xc8\xb0\x07]\xc7t[P\xac\xab" + + "\x0e\xaf\xc7\x99\xcer\x8d\x0d\x96\xd9\x1cGn55C" + + "\xd5!\xfee1\xdf\xca\xbb\xaeV_\x10tB\xbb\xa3" + + "\x15[\x03\xe3\xaa\x1feK\xe2([M\xe5\xc8\x0d\x0c" + + "\x95[R$\xb4\x86\x98\xf23\x0c\x95\xdf\x110\x9f\x0e" + + "\x8e\xe2^Uw\xf9\x82\x9b:\x94\x99\x13m)!(" + + "\x83\x03\x9eN\xdd>\x94\xdc\x1e_NU\xe6M\x0c\x95" + + "Q\x01\x0f\xd8n\xadF\x8f\x8eP\x98\x0c\x9b\x0d(\xd2" + + "\xd9){\xc4s\x80\xd0\x1e\x97\x9b~\x1b\xdc\x09\xbe\xca" + + "\xc6\xa4IyKT\x9b\xf6\xffq\xf7\x18\xb7\xf3T\xeb" + + "_\xb2\xa5\x8b;\xfbK\xe7\xb9\xd1\xf1\xf1J\xd2w\xb2" + + "\x80$\xd3\xbc0\x96\xe6\x85\x84\x16\xa6\xd3\xe1\x1f\x95c" + + "\xb2\xe2\xc7a\x85\xe4;0)\xd8\xe5\xbb\xf0\xf4\xbc\xf8" + + "\xcf\x0c\x06\xbc\xc0\xfd\xe3\xeb$o\xf9\xbc\x80\x01/4" + + "\xfd\xf3u\x92\xcf\xa4y\xc1\xc5\xb9\xf9\xbc\xc0\"^\xa0" + + "x>D\xf2c>/d\x02^8\x8a/\xcd\x8b\xff" + + "\xael\xc0\x0b'\xf1\xd5y\xf1\xbf4\x17\xf0\xc2\x19\x7f" + + "\xfd\xb3$\xbf\xe0\xf3\xc2P\xc0\x0b\xe7}\x1ey\x91\xe4" + + "\xaf\x11/\xb8\x96^u,\xcd\x00l$\xceZk}" + + "\x89\xf3\xd6 \xe4um/\x8f9\xbb\xae\xa9\xfazW" + + "\xd5\xa1Xu\xd4\xda\xee\xa4\xe6\xd4\xedQ\xd5\xa8\xdb8" + + "\xa5\xee\xe6\xc4\xf4b:':\xba\xbd\x8d[\xda$`" + + "R\xa5\xc65B\xbeb\x9a\xed\xa5\x83_\xecp+ " + + "\x95\xf8\xb7\xa6:S\xae\xeb|\x18\xa3J\x81\x19I\xa6" + + "\xd1\xe8\x17\xd300H\xdf\xe3Zq~^n\x85u" + + "o\x94\xdf\xc7Km\x89\x9b\xcf\xb4x\xcd\x196\xd1p" + + "4\xc3\xe5\x0b\x0e\xa8M\xb9\xc6n^\x1fA\xa3f\xd6" + + "5\xa3\x01\x0b\x0an\xf6\x9b\xda\xfdTA\xe3G3\xa6" + + "\xa6\xcc\xd2\xea\x01\x10|.\xa1\xf4,\x0d$mk\xa9" + + "\xe6\xef*Y\\\xb5S\x1d\xd7\"\xb7\x85\xd3\x9d \xc8" + + "\xe8\xb6\x02\xcb\x02\xc43[\x8c\x86h\xd2\x9e} H" + + "\x9a\x88\xc9\xec\x11\xa3Q\xa3t\x8f\x05\x824!\xa2\x10" + + "\x8f\xca1\x1asK\xe59\x10\xa4\x11\x11Y<\xdf\xc6" + + "h\x84%\xdd>\x04\x82\xb4F\xf4\xa2\x12\x1dJ\x81:" + + "\xeb\xd0\x8b\x02\x1f\x8a~\xe8\xafC/j\xfc1*\xe5" + + "\x01\xd6\xe1\x810-\xac\xc3\xf4\xb4\x88\xfd\xa6z\xbas" + + "\x998\x94\x942\x11G>0\x97T2q\x0fs\xf4" + + "\xb9t\x95\x18\xb6\xe2'\x0f\x86\x8d\xfc\x85T+~\x9e" + + "J\xc7\x0b\x0c\x95\x1f\x0aI\xbe\x8c\xdc.\x1a\xb0\xa0i" + + "EM\xd5\"s\x96\xd09\xc3\x0a\xae}\xda\xe2\xd5\xcd" + + ")\xbf\xc2\xc3\xe0(\x1b\x12\xc6N\x8f`\x96\xa5F0" + + "\x18\xb5s\xe2<\x82O\x0fd\x96-\xce\x99\xf3\x9a\x13" + + "?\xe3d|\xaf\x89\x06\xf9\x18\xfdIE\x92\xc8\xfa=" + + "\xa2\x1750\x18\xa5+2^\xdadW\xd8\xc5\x8d\xf1" + + "\xa2}9\x99 \x1a\xdb^\xba\x19\x0f\xee\xc9\x93\xb3\x05" + + "\x0f\x8a\xcf\x9dN\x8d\x85t3\xec\x87\xf2[\xd2%\xed" + + "\"X\x05\x0aG\x05h\x9e6\xb7\xb9\xdf\xaaT%\x1d" + + "\xfb\xdf\xaa\xa46\x8f\xbb\x94\xc3\x1bC\xa7|*.8" + + "\xa5Ss\xc9\xc8(v\xbf\xb3\x1b\x93.E\xe4\x96\x15" + + "\xe9)\xbaVB\x9b\xba\xd9\xd8\xa4\x19\xdc\xa6\x12\xac\xad" + + "\xb5nq\xab\xa9\x1a\xdc@\x87\xc8\xc8\xb5\x88Q\xe73" + + "Wy}\xaar[\xec\xf9\xd5\xd0\xd9\x03_\x0f\xd3k" + + "\xaa\x8f<\x9d\x9aiD\x8fW^\x0dg\x05;S\x8f" + + "\xbf\x87\xfa\xc8\x1d\x0c\x95)\x01=\xd5u\xcc\x89V]" + + "E\x87o\xb0\xf8\x1e\x97\x8bFm6\xe9\xa7\xa8\xa3\xa8" + + "\xd9\x13\xd8\xa2\xdao\x83\xc5K{\\\x9e^\x10Mb" + + "A\xd4\xcc\xfa\x82\x11l\x87b\xeb\x0e\xbe\xabj\xd6v" + + "sg\xde\x84:\xa0\xcb\xe8)\xeaX2\x86\x8d^\xa2" + + "\x8d%C\xd8\x98F\xf6\x90C\xb5\x18*\xfbS42" + + ";\x97\x18\xbcsv\xfd\xffI\x88\x8b<\xb2\xe3\x98t" + + "\xac\xc4/+\xd0\x92?;\\\xba\xe4\x0a\xdb\xf6\xb0b" + + "\xbd\x9c\xc1\xc2\xbc\xc9W\xe8\x10\xcat2\x8c\xf1\x9d\xbc" + + "\x90\xfc\x153\xd4\xc1\x0eKG`\x93f\x87\xaa0h" + + "n\xa2Ft\xe1x\xe4\x7f\x03\x00\x00\xff\xffYM," + + "\\" func init() { schemas.Register(schema_db8274f9144abc7e, @@ -3945,11 +3792,9 @@ func init() { 0xb70431c0dc014915, 0xb9d4ef45c2b5fc5b, 0xc082ef6e0d42ed1d, - 0xc54a4a6fd4d87596, 0xc744e349009087aa, 0xc766a92976e389c4, 0xc793e50592935b4a, - 0xc9c82ee56583acfa, 0xcbd96442ae3bb01a, 0xd58a254e7a792b87, 0xdc3ed6801961e502,