TUN-2315: Replace Scope with IntentLabel

This commit is contained in:
Adam Chalmers 2019-09-18 14:57:20 -05:00
parent fe032843f3
commit 4f23da2a6d
6 changed files with 244 additions and 528 deletions

View File

@ -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{

View File

@ -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 {

View File

@ -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
}

View File

@ -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 {

View File

@ -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 {

View File

@ -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" +
"<k\x02\x88W\xd9\x18m\x00\xa5\xe9\xfd H\x9a\x88" +
"\xc9\xe2\x14\xa3=\xa9t\xbb\x05\x824&\xa2\x10\xff\x05" +
"\x01\xa3\xed\xbf48\x07\x82\xb4ID\x16\xaf\xfd1\xda" +
"\xbfI\xeb\xfb@\x90V\x8b^4]@1\x10g\x03" +
"zQ\xe2C\x97\x9f\xfa\x1b\xd0\x8b\xb6\x16\x18M!\x00" +
"\x1b\xf0`X\x8f6`z\xd5\xc5>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\xb3E<I,\x12" +
"\x97\x8fm\xbeq\xe5\xd9-\xc84\xf3r\xdb\xe9T\xaa" +
"\xa9\x85\xbb\xd1\xdf>l\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<A\x86=\xc6Py\x92H" +
"\x96\x05\xd4p\x92\x10}\x92\xa1\xf2\xac\x80\x98\x098\xf6" +
"\x0cq\xec\xb3\x0c\x95\x0b\x82\xcf\x90\xa3\x83\xc3\xa6\x81\xa1" +
"\x126@\xc4\x8f\xde\x14W-g\x17W\xd1)\x1b\x0e" +
"\xb7\xf6\xaa\xa8G1x\xc0\xd1\x9a\xdct\x9d8&\x9b" +
"\xea\x8c\x9f\xe3\xb1>\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,