diff --git a/appscode/appscode.go b/auth/providers/appscode/appscode.go similarity index 92% rename from appscode/appscode.go rename to auth/providers/appscode/appscode.go index ba7b92273..048fe6207 100644 --- a/appscode/appscode.go +++ b/auth/providers/appscode/appscode.go @@ -11,15 +11,20 @@ import ( "appscode.com/api/dtypes" "appscode.com/client-go" _env "github.com/appscode/go/env" + "github.com/appscode/guard/auth" "github.com/json-iterator/go" "github.com/pkg/errors" - auth "k8s.io/api/authentication/v1" + authv1 "k8s.io/api/authentication/v1" ) const ( OrgType = "appscode" ) +func init() { + auth.SupportedOrgs = append(auth.SupportedOrgs, OrgType) +} + var json = jsoniter.ConfigCompatibleWithStandardLibrary type WhoAmIResponse struct { @@ -46,7 +51,7 @@ type ConduitClient struct { Token string } -func Check(name, token string) (*auth.UserInfo, error) { +func Check(name, token string) (*authv1.UserInfo, error) { ctx := context.Background() options := client.NewOption(_env.ProdApiServer) options.UserAgent("appscode/guard") @@ -73,7 +78,7 @@ func Check(name, token string) (*auth.UserInfo, error) { return nil, errors.Wrapf(err, "failed to load user's teams for Org %s", name) } - resp := &auth.UserInfo{ + resp := &authv1.UserInfo{ Username: user.User.UserName, UID: user.User.Phid, } diff --git a/appscode/kubectl.go b/auth/providers/appscode/kubectl.go similarity index 100% rename from appscode/kubectl.go rename to auth/providers/appscode/kubectl.go diff --git a/azure/azure.go b/auth/providers/azure/azure.go similarity index 89% rename from azure/azure.go rename to auth/providers/azure/azure.go index 8a4714fcb..ebe2a3b7b 100644 --- a/azure/azure.go +++ b/auth/providers/azure/azure.go @@ -4,10 +4,11 @@ import ( "context" "fmt" - "github.com/appscode/guard/azure/graph" + "github.com/appscode/guard/auth" + "github.com/appscode/guard/auth/providers/azure/graph" "github.com/coreos/go-oidc" "github.com/pkg/errors" - auth "k8s.io/api/authentication/v1" + authv1 "k8s.io/api/authentication/v1" ) /* @@ -27,6 +28,10 @@ const ( azureUsernameClaim = "upn" ) +func init() { + auth.SupportedOrgs = append(auth.SupportedOrgs, OrgType) +} + var ( // ErrorClaimNotFound indicates the given key was not found in the claims ErrorClaimNotFound = fmt.Errorf("claim not found") @@ -64,7 +69,7 @@ func New(opts Options) (*Authenticator, error) { return c, nil } -func (s Authenticator) Check(token string) (*auth.UserInfo, error) { +func (s Authenticator) Check(token string) (*authv1.UserInfo, error) { idToken, err := s.verifier.Verify(s.ctx, token) if err != nil { return nil, errors.Wrap(err, "failed to verify token for azure") @@ -98,8 +103,8 @@ func getClaims(token *oidc.IDToken) (claims, error) { // ReviewFromClaims creates a new TokenReview object from the claims object // the claims object -func (c claims) getUserInfo(usernameClaim string) (*auth.UserInfo, error) { - var resp = &auth.UserInfo{} +func (c claims) getUserInfo(usernameClaim string) (*authv1.UserInfo, error) { + var resp = &authv1.UserInfo{} username, err := c.String(usernameClaim) if err != nil { diff --git a/azure/azure_test.go b/auth/providers/azure/azure_test.go similarity index 97% rename from azure/azure_test.go rename to auth/providers/azure/azure_test.go index fd6c644a6..1d8522e64 100644 --- a/azure/azure_test.go +++ b/auth/providers/azure/azure_test.go @@ -11,13 +11,13 @@ import ( "strconv" "testing" - "github.com/appscode/guard/azure/graph" + "github.com/appscode/guard/auth/providers/azure/graph" "github.com/appscode/pat" "github.com/coreos/go-oidc" "github.com/json-iterator/go" "github.com/stretchr/testify/assert" "gopkg.in/square/go-jose.v2" - auth "k8s.io/api/authentication/v1" + authv1 "k8s.io/api/authentication/v1" "k8s.io/apimachinery/pkg/util/sets" ) @@ -193,7 +193,7 @@ func getGroupsAndIds(t *testing.T, groupSz int) ([]byte, []byte) { return gId, gList } -func assertUserInfo(t *testing.T, info *auth.UserInfo, groupSize int) { +func assertUserInfo(t *testing.T, info *authv1.UserInfo, groupSize int) { if info.Username != username { t.Errorf("expected username %v, got %v", username, info.Username) } @@ -326,7 +326,7 @@ var testClaims = claims{ func TestReviewFromClaims(t *testing.T) { // valid user claim t.Run("valid user claim", func(t *testing.T) { - var validUserInfo = &auth.UserInfo{ + var validUserInfo = &authv1.UserInfo{ Username: username, } diff --git a/azure/graph/graph.go b/auth/providers/azure/graph/graph.go similarity index 100% rename from azure/graph/graph.go rename to auth/providers/azure/graph/graph.go diff --git a/azure/graph/graph_test.go b/auth/providers/azure/graph/graph_test.go similarity index 100% rename from azure/graph/graph_test.go rename to auth/providers/azure/graph/graph_test.go diff --git a/azure/graph/types.go b/auth/providers/azure/graph/types.go similarity index 100% rename from azure/graph/types.go rename to auth/providers/azure/graph/types.go diff --git a/auth/providers/azure/options.go b/auth/providers/azure/options.go new file mode 100644 index 000000000..d501be901 --- /dev/null +++ b/auth/providers/azure/options.go @@ -0,0 +1,101 @@ +package azure + +import ( + "fmt" + "os" + + "github.com/appscode/go/types" + "github.com/spf13/pflag" + "k8s.io/api/apps/v1beta1" + core "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" +) + +type Options struct { + ClientID string + ClientSecret string + TenantID string +} + +func NewOptions() Options { + return Options{ + ClientSecret: os.Getenv("AZURE_CLIENT_SECRET"), + } +} + +func (o *Options) AddFlags(fs *pflag.FlagSet) { + fs.StringVar(&o.ClientID, "azure.client-id", o.ClientID, "MS Graph application client ID to use") + fs.StringVar(&o.ClientSecret, "azure.client-secret", o.ClientSecret, "MS Graph application client secret to use") + fs.StringVar(&o.TenantID, "azure.tenant-id", o.TenantID, "MS Graph application tenant id to use") +} + +func (o *Options) Validate() []error { + return nil +} + +func (o Options) IsSet() bool { + return o.ClientID != "" || o.ClientSecret != "" || o.TenantID != "" +} + +func (o Options) Apply(d *v1beta1.Deployment) (extraObjs []runtime.Object, err error) { + if !o.IsSet() { + return nil, nil // nothing to apply + } + + container := d.Spec.Template.Spec.Containers[0] + + // create auth secret + authSecret := &core.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: "guard-azure-auth", + Namespace: d.Namespace, + Labels: d.Labels, + }, + Data: map[string][]byte{ + "client-secret": []byte(o.ClientSecret), + }, + } + extraObjs = append(extraObjs, authSecret) + + // mount auth secret into deployment + volMount := core.VolumeMount{ + Name: authSecret.Name, + MountPath: "/etc/guard/auth/azure", + } + container.VolumeMounts = append(container.VolumeMounts, volMount) + + vol := core.Volume{ + Name: authSecret.Name, + VolumeSource: core.VolumeSource{ + Secret: &core.SecretVolumeSource{ + SecretName: authSecret.Name, + DefaultMode: types.Int32P(0555), + }, + }, + } + d.Spec.Template.Spec.Volumes = append(d.Spec.Template.Spec.Volumes, vol) + + // use auth secret in container[0] args + container.Env = append(container.Env, core.EnvVar{ + Name: "AZURE_CLIENT_SECRET", + ValueFrom: &core.EnvVarSource{ + SecretKeyRef: &core.SecretKeySelector{ + LocalObjectReference: core.LocalObjectReference{ + Name: authSecret.Name, + }, + Key: "client-secret", + }, + }, + }) + + args := container.Args + if o.ClientID != "" { + args = append(args, fmt.Sprintf("--azure.client-id=%s", o.ClientID)) + } + if o.TenantID != "" { + args = append(args, fmt.Sprintf("--azure.tenant-id=%s", o.TenantID)) + } + + return extraObjs, nil +} diff --git a/github/github.go b/auth/providers/github/github.go similarity index 84% rename from github/github.go rename to auth/providers/github/github.go index 8c9e10e69..698acc71e 100644 --- a/github/github.go +++ b/auth/providers/github/github.go @@ -4,16 +4,21 @@ import ( "context" "fmt" + "github.com/appscode/guard/auth" "github.com/google/go-github/github" "github.com/pkg/errors" "golang.org/x/oauth2" - auth "k8s.io/api/authentication/v1" + authv1 "k8s.io/api/authentication/v1" ) const ( OrgType = "github" ) +func init() { + auth.SupportedOrgs = append(auth.SupportedOrgs, OrgType) +} + type Authenticator struct { Client *github.Client ctx context.Context @@ -32,13 +37,13 @@ func New(name, token string) *Authenticator { return g } -func (g *Authenticator) Check() (*auth.UserInfo, error) { +func (g *Authenticator) Check() (*authv1.UserInfo, error) { mem, _, err := g.Client.Organizations.GetOrgMembership(g.ctx, "", g.OrgName) if err != nil { return nil, errors.Wrapf(err, "failed to check user's membership in Org %s", g.OrgName) } - resp := &auth.UserInfo{ + resp := &authv1.UserInfo{ Username: mem.User.GetLogin(), UID: fmt.Sprintf("%d", mem.User.GetID()), } diff --git a/github/github_test.go b/auth/providers/github/github_test.go similarity index 100% rename from github/github_test.go rename to auth/providers/github/github_test.go diff --git a/github/kubectl.go b/auth/providers/github/kubectl.go similarity index 100% rename from github/kubectl.go rename to auth/providers/github/kubectl.go diff --git a/gitlab/gitlab.go b/auth/providers/gitlab/gitlab.go similarity index 80% rename from gitlab/gitlab.go rename to auth/providers/gitlab/gitlab.go index 0254e0c55..b0cf6531d 100644 --- a/gitlab/gitlab.go +++ b/auth/providers/gitlab/gitlab.go @@ -3,15 +3,20 @@ package gitlab import ( "strconv" + "github.com/appscode/guard/auth" "github.com/pkg/errors" "github.com/xanzy/go-gitlab" - auth "k8s.io/api/authentication/v1" + authv1 "k8s.io/api/authentication/v1" ) const ( OrgType = "gitlab" ) +func init() { + auth.SupportedOrgs = append(auth.SupportedOrgs, OrgType) +} + type Authenticator struct { Client *gitlab.Client } @@ -22,13 +27,13 @@ func New(token string) *Authenticator { } } -func (g *Authenticator) Check() (*auth.UserInfo, error) { +func (g *Authenticator) Check() (*authv1.UserInfo, error) { user, _, err := g.Client.Users.CurrentUser() if err != nil { return nil, errors.WithStack(err) } - resp := &auth.UserInfo{ + resp := &authv1.UserInfo{ Username: user.Username, UID: strconv.Itoa(user.ID), } diff --git a/gitlab/gitlab_test.go b/auth/providers/gitlab/gitlab_test.go similarity index 100% rename from gitlab/gitlab_test.go rename to auth/providers/gitlab/gitlab_test.go diff --git a/gitlab/kubectl.go b/auth/providers/gitlab/kubectl.go similarity index 100% rename from gitlab/kubectl.go rename to auth/providers/gitlab/kubectl.go diff --git a/google/google.go b/auth/providers/google/google.go similarity index 92% rename from google/google.go rename to auth/providers/google/google.go index df5aa94e8..d791b6656 100644 --- a/google/google.go +++ b/auth/providers/google/google.go @@ -4,12 +4,13 @@ import ( "context" "io/ioutil" + "github.com/appscode/guard/auth" "github.com/coreos/go-oidc" "github.com/pkg/errors" "golang.org/x/oauth2/google" gdir "google.golang.org/api/admin/directory/v1" gauth "google.golang.org/api/oauth2/v1" - auth "k8s.io/api/authentication/v1" + authv1 "k8s.io/api/authentication/v1" ) const ( @@ -21,6 +22,10 @@ const ( GoogleOauth2ClientSecret = "pB9ITCuMPLj-bkObrTqKbt57" ) +func init() { + auth.SupportedOrgs = append(auth.SupportedOrgs, OrgType) +} + type Authenticator struct { Options verifier *oidc.IDTokenVerifier @@ -74,7 +79,7 @@ func New(opts Options, domain string) (*Authenticator, error) { } // https://developers.google.com/identity/protocols/OpenIDConnect#validatinganidtoken -func (g *Authenticator) Check(name, token string) (*auth.UserInfo, error) { +func (g *Authenticator) Check(name, token string) (*authv1.UserInfo, error) { idToken, err := g.verifier.Verify(g.ctx, token) if err != nil { return nil, errors.Wrap(err, "failed to verify token for google") @@ -91,7 +96,7 @@ func (g *Authenticator) Check(name, token string) (*auth.UserInfo, error) { return nil, errors.Errorf("user is not a member of domain %s", name) } - resp := &auth.UserInfo{ + resp := &authv1.UserInfo{ Username: info.Email, UID: info.UserId, } diff --git a/google/google_test.go b/auth/providers/google/google_test.go similarity index 98% rename from google/google_test.go rename to auth/providers/google/google_test.go index 2551e4a6d..3eddda4cd 100644 --- a/google/google_test.go +++ b/auth/providers/google/google_test.go @@ -20,7 +20,7 @@ import ( "github.com/stretchr/testify/assert" gdir "google.golang.org/api/admin/directory/v1" "gopkg.in/square/go-jose.v2" - auth "k8s.io/api/authentication/v1" + authv1 "k8s.io/api/authentication/v1" "k8s.io/apimachinery/pkg/util/sets" ) @@ -248,7 +248,7 @@ func assertGroups(t *testing.T, groupNames []string, expectedSize int) { } } -func assertUserInfo(t *testing.T, info *auth.UserInfo, groupSize int) { +func assertUserInfo(t *testing.T, info *authv1.UserInfo, groupSize int) { if info.Username != userEmail { t.Errorf("expected username %v, got %v", userEmail, info.Username) } diff --git a/google/kubectl.go b/auth/providers/google/kubectl.go similarity index 100% rename from google/kubectl.go rename to auth/providers/google/kubectl.go diff --git a/auth/providers/google/options.go b/auth/providers/google/options.go new file mode 100644 index 000000000..57ffdac7c --- /dev/null +++ b/auth/providers/google/options.go @@ -0,0 +1,89 @@ +package google + +import ( + "fmt" + "io/ioutil" + + "github.com/appscode/go/types" + "github.com/spf13/pflag" + "k8s.io/api/apps/v1beta1" + core "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" +) + +type Options struct { + ServiceAccountJsonFile string + AdminEmail string +} + +func NewOptions() Options { + return Options{} +} + +func (o *Options) AddFlags(fs *pflag.FlagSet) { + fs.StringVar(&o.ServiceAccountJsonFile, "google.sa-json-file", o.ServiceAccountJsonFile, "Path to Google service account json file") + fs.StringVar(&o.AdminEmail, "google.admin-email", o.AdminEmail, "Email of G Suite administrator") +} + +func (o *Options) Validate() []error { + return nil +} + +func (o Options) IsSet() bool { + return o.ServiceAccountJsonFile != "" +} + +func (o Options) Apply(d *v1beta1.Deployment) (extraObjs []runtime.Object, err error) { + if !o.IsSet() { + return nil, nil // nothing to apply + } + + container := d.Spec.Template.Spec.Containers[0] + + // create auth secret + sa, err := ioutil.ReadFile(o.ServiceAccountJsonFile) + if err != nil { + return nil, err + } + authSecret := &core.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: "guard-google-auth", + Namespace: d.Namespace, + Labels: d.Labels, + }, + Data: map[string][]byte{ + "sa.json": sa, + }, + } + extraObjs = append(extraObjs, authSecret) + + // mount auth secret into deployment + volMount := core.VolumeMount{ + Name: authSecret.Name, + MountPath: "/etc/guard/auth/google", + } + container.VolumeMounts = append(container.VolumeMounts, volMount) + + vol := core.Volume{ + Name: authSecret.Name, + VolumeSource: core.VolumeSource{ + Secret: &core.SecretVolumeSource{ + SecretName: authSecret.Name, + DefaultMode: types.Int32P(0555), + }, + }, + } + d.Spec.Template.Spec.Volumes = append(d.Spec.Template.Spec.Volumes, vol) + + // use auth secret in container[0] args + args := container.Args + if o.ServiceAccountJsonFile != "" { + args = append(args, "--google.sa-json-file=/etc/guard/auth/google/sa.json") + } + if o.AdminEmail != "" { + args = append(args, fmt.Sprintf("--google.admin-email=%s", o.AdminEmail)) + } + + return extraObjs, nil +} diff --git a/ldap/kubectl.go b/auth/providers/ldap/kubectl.go similarity index 100% rename from ldap/kubectl.go rename to auth/providers/ldap/kubectl.go diff --git a/ldap/ldap.go b/auth/providers/ldap/ldap.go similarity index 95% rename from ldap/ldap.go rename to auth/providers/ldap/ldap.go index f55c6c162..d844dfebb 100644 --- a/ldap/ldap.go +++ b/auth/providers/ldap/ldap.go @@ -6,12 +6,13 @@ import ( "fmt" "strings" + "github.com/appscode/guard/auth" "github.com/go-ldap/ldap" "github.com/pkg/errors" "gopkg.in/jcmturner/gokrb5.v4/keytab" "gopkg.in/jcmturner/gokrb5.v4/messages" "gopkg.in/jcmturner/gokrb5.v4/service" - auth "k8s.io/api/authentication/v1" + authv1 "k8s.io/api/authentication/v1" ) const ( @@ -24,6 +25,10 @@ const ( DefaultGroupNameAttribute = "cn" ) +func init() { + auth.SupportedOrgs = append(auth.SupportedOrgs, OrgType) +} + type Authenticator struct { opts Options keyTab keytab.Keytab @@ -43,7 +48,7 @@ func New(opts Options) (*Authenticator, error) { return au, nil } -func (s Authenticator) Check(token string) (*auth.UserInfo, error) { +func (s Authenticator) Check(token string) (*authv1.UserInfo, error) { var ( err error conn *ldap.Conn @@ -123,7 +128,7 @@ func (s Authenticator) Check(token string) (*auth.UserInfo, error) { } } - resp := &auth.UserInfo{} + resp := &authv1.UserInfo{} resp.Username = username resp.Groups = groups return resp, nil diff --git a/ldap/ldap_test.go b/auth/providers/ldap/ldap_test.go similarity index 100% rename from ldap/ldap_test.go rename to auth/providers/ldap/ldap_test.go diff --git a/ldap/options.go b/auth/providers/ldap/options.go similarity index 73% rename from ldap/options.go rename to auth/providers/ldap/options.go index 2c03bd3df..ad4106f58 100644 --- a/ldap/options.go +++ b/auth/providers/ldap/options.go @@ -3,9 +3,16 @@ package ldap import ( "crypto/x509" "fmt" + "io/ioutil" + "os" + "github.com/appscode/go/types" "github.com/go-ldap/ldap" "github.com/spf13/pflag" + "k8s.io/api/apps/v1beta1" + core "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" ) type Options struct { @@ -78,6 +85,13 @@ type Options struct { ServiceAccountName string } +func NewOptions() Options { + return Options{ + BindDN: os.Getenv("LDAP_BIND_DN"), + BindPassword: os.Getenv("LDAP_BIND_PASSWORD"), + } +} + func (o *Options) AddFlags(fs *pflag.FlagSet) { fs.StringVar(&o.ServerAddress, "ldap.server-address", o.ServerAddress, "Host or IP of the LDAP server") fs.StringVar(&o.ServerPort, "ldap.server-port", "389", "LDAP server port") @@ -99,20 +113,130 @@ func (o *Options) AddFlags(fs *pflag.FlagSet) { fs.StringVar(&o.ServiceAccountName, "ldap.service-account", "", "service account name") } -func (o Options) ToArgs() []string { - var args []string +// request to search user +func (o *Options) newUserSearchRequest(username string) *ldap.SearchRequest { + userFilter := fmt.Sprintf("(&%s(%s=%s))", o.UserSearchFilter, o.UserAttribute, username) + return &ldap.SearchRequest{ + BaseDN: o.UserSearchDN, + Scope: ldap.ScopeWholeSubtree, + DerefAliases: ldap.NeverDerefAliases, + SizeLimit: 2, // limit number of entries in result + TimeLimit: 10, + TypesOnly: false, + Filter: userFilter, // filter default format : (&(objectClass=person)(uid=%s)) + } +} + +// request to get user group list +func (o *Options) newGroupSearchRequest(userDN string) *ldap.SearchRequest { + groupFilter := fmt.Sprintf("(&%s(%s=%s))", o.GroupSearchFilter, o.GroupMemberAttribute, userDN) + return &ldap.SearchRequest{ + BaseDN: o.GroupSearchDN, + Scope: ldap.ScopeWholeSubtree, + DerefAliases: ldap.NeverDerefAliases, + SizeLimit: 0, // limit number of entries in result, 0 values means no limitations + TimeLimit: 10, + TypesOnly: false, + Filter: groupFilter, // filter default format : (&(objectClass=groupOfNames)(member=%s)) + Attributes: []string{o.GroupNameAttribute}, + } +} + +func (o *Options) Validate() []error { + return nil +} + +func (o Options) IsSet() bool { + return o.BindDN != "" || o.BindPassword != "" +} + +func (o Options) Apply(d *v1beta1.Deployment) (extraObjs []runtime.Object, err error) { + if !o.IsSet() { + return nil, nil // nothing to apply + } + + container := d.Spec.Template.Spec.Containers[0] + + // create auth secret + ldapData := map[string][]byte{ + "bind-dn": []byte(o.BindDN), // username kept in secret, since password is in secret + "bind-password": []byte(o.BindPassword), + } + if o.CaCertFile != "" { + cert, err := ioutil.ReadFile(o.CaCertFile) + if err != nil { + return nil, err + } + ldapData["ca.crt"] = cert + } + if o.KeytabFile != "" { + key, err := ioutil.ReadFile(o.KeytabFile) + if err != nil { + return nil, err + } + ldapData["krb5.keytab"] = key + } + authSecret := &core.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: "guard-ldap-auth", + Namespace: d.Namespace, + Labels: d.Labels, + }, + Data: ldapData, + } + extraObjs = append(extraObjs, authSecret) + + // mount auth secret into deployment + volMount := core.VolumeMount{ + Name: authSecret.Name, + MountPath: "/etc/guard/auth/ldap", + } + container.VolumeMounts = append(container.VolumeMounts, volMount) + + vol := core.Volume{ + Name: authSecret.Name, + VolumeSource: core.VolumeSource{ + Secret: &core.SecretVolumeSource{ + SecretName: authSecret.Name, + DefaultMode: types.Int32P(0444), + }, + }, + } + d.Spec.Template.Spec.Volumes = append(d.Spec.Template.Spec.Volumes, vol) + + // use auth secret in container[0] args + container.Env = append(container.Env, + core.EnvVar{ + Name: "LDAP_BIND_DN", + ValueFrom: &core.EnvVarSource{ + SecretKeyRef: &core.SecretKeySelector{ + LocalObjectReference: core.LocalObjectReference{ + Name: authSecret.Name, + }, + Key: "bind-dn", + }, + }, + }, + core.EnvVar{ + Name: "LDAP_BIND_PASSWORD", + ValueFrom: &core.EnvVarSource{ + SecretKeyRef: &core.SecretKeySelector{ + LocalObjectReference: core.LocalObjectReference{ + Name: authSecret.Name, + }, + Key: "bind-password", + }, + }, + }, + ) + + args := container.Args if o.ServerAddress != "" { args = append(args, fmt.Sprintf("--ldap.server-address=%s", o.ServerAddress)) } if o.ServerPort != "" { args = append(args, fmt.Sprintf("--ldap.server-port=%s", o.ServerPort)) } - if o.BindDN != "" { - args = append(args, fmt.Sprintf("--ldap.bind-dn=%s", o.BindDN)) - } - if o.BindPassword != "" { - args = append(args, fmt.Sprintf("--ldap.bind-password=%s", o.BindPassword)) - } if o.UserSearchDN != "" { args = append(args, fmt.Sprintf("--ldap.user-search-dn=%s", o.UserSearchDN)) } @@ -144,48 +268,15 @@ func (o Options) ToArgs() []string { args = append(args, "--ldap.start-tls") } if o.CaCertFile != "" { - args = append(args, fmt.Sprintf("--ldap.ca-cert-file=/etc/guard/ldap/ca.crt")) + args = append(args, fmt.Sprintf("--ldap.ca-cert-file=/etc/guard/auth/ldap/ca.crt")) } if o.ServiceAccountName != "" { args = append(args, fmt.Sprintf("--ldap.service-account=%s", o.ServiceAccountName)) } if o.KeytabFile != "" { - args = append(args, fmt.Sprintf("--ldap.keytab-file=/etc/guard/ldap/krb5.keytab")) + args = append(args, fmt.Sprintf("--ldap.keytab-file=/etc/guard/auth/ldap/krb5.keytab")) } args = append(args, fmt.Sprintf("--ldap.auth-choice=%v", o.AuthenticationChoice)) - return args -} - -// request to search user -func (o *Options) newUserSearchRequest(username string) *ldap.SearchRequest { - userFilter := fmt.Sprintf("(&%s(%s=%s))", o.UserSearchFilter, o.UserAttribute, username) - return &ldap.SearchRequest{ - BaseDN: o.UserSearchDN, - Scope: ldap.ScopeWholeSubtree, - DerefAliases: ldap.NeverDerefAliases, - SizeLimit: 2, // limit number of entries in result - TimeLimit: 10, - TypesOnly: false, - Filter: userFilter, // filter default format : (&(objectClass=person)(uid=%s)) - } -} - -// request to get user group list -func (o *Options) newGroupSearchRequest(userDN string) *ldap.SearchRequest { - groupFilter := fmt.Sprintf("(&%s(%s=%s))", o.GroupSearchFilter, o.GroupMemberAttribute, userDN) - return &ldap.SearchRequest{ - BaseDN: o.GroupSearchDN, - Scope: ldap.ScopeWholeSubtree, - DerefAliases: ldap.NeverDerefAliases, - SizeLimit: 0, // limit number of entries in result, 0 values means no limitations - TimeLimit: 10, - TypesOnly: false, - Filter: groupFilter, // filter default format : (&(objectClass=groupOfNames)(member=%s)) - Attributes: []string{o.GroupNameAttribute}, - } -} - -func (o *Options) Validate() []error { - return nil + return extraObjs, nil } diff --git a/auth/providers/providers.go b/auth/providers/providers.go new file mode 100644 index 000000000..e4da2f492 --- /dev/null +++ b/auth/providers/providers.go @@ -0,0 +1,10 @@ +package providers + +import ( + _ "github.com/appscode/guard/auth/providers/appscode" + _ "github.com/appscode/guard/auth/providers/azure" + _ "github.com/appscode/guard/auth/providers/github" + _ "github.com/appscode/guard/auth/providers/gitlab" + _ "github.com/appscode/guard/auth/providers/google" + _ "github.com/appscode/guard/auth/providers/ldap" +) diff --git a/auth/providers/token/options.go b/auth/providers/token/options.go new file mode 100644 index 000000000..6018f47f6 --- /dev/null +++ b/auth/providers/token/options.go @@ -0,0 +1,87 @@ +package token + +import ( + "io/ioutil" + + "github.com/appscode/go/types" + "github.com/spf13/pflag" + "k8s.io/api/apps/v1beta1" + core "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" +) + +type Options struct { + AuthFile string +} + +func NewOptions() Options { + return Options{} +} + +func (o *Options) AddFlags(fs *pflag.FlagSet) { + fs.StringVar(&o.AuthFile, "token-auth-file", "", "To enable static token authentication") +} + +func (o *Options) Validate() []error { + return nil +} + +func (o Options) IsSet() bool { + return o.AuthFile != "" +} + +func (o Options) Apply(d *v1beta1.Deployment) (extraObjs []runtime.Object, err error) { + if !o.IsSet() { + return nil, nil // nothing to apply + } + + container := d.Spec.Template.Spec.Containers[0] + + // create auth secret + _, err = LoadTokenFile(o.AuthFile) + if err != nil { + return nil, err + } + tokens, err := ioutil.ReadFile(o.AuthFile) + if err != nil { + return nil, err + } + authSecret := &core.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: "guard-token-auth", + Namespace: d.Namespace, + Labels: d.Labels, + }, + Data: map[string][]byte{ + "token.csv": tokens, + }, + } + extraObjs = append(extraObjs, authSecret) + + // mount auth secret into deployment + volMount := core.VolumeMount{ + Name: authSecret.Name, + MountPath: "/etc/guard/auth/token", + } + container.VolumeMounts = append(container.VolumeMounts, volMount) + + vol := core.Volume{ + Name: authSecret.Name, + VolumeSource: core.VolumeSource{ + Secret: &core.SecretVolumeSource{ + SecretName: authSecret.Name, + DefaultMode: types.Int32P(0555), + }, + }, + } + d.Spec.Template.Spec.Volumes = append(d.Spec.Template.Spec.Volumes, vol) + + // use auth secret in container[0] args + args := container.Args + if o.AuthFile != "" { + args = append(args, "--token-auth-file=/etc/guard/auth/token/token.csv") + } + + return extraObjs, nil +} diff --git a/token/token_auth.go b/auth/providers/token/token_file.go similarity index 88% rename from token/token_auth.go rename to auth/providers/token/token_file.go index 1aa1e8c07..f984d43e3 100644 --- a/token/token_auth.go +++ b/auth/providers/token/token_file.go @@ -9,19 +9,19 @@ import ( "sync" "github.com/pkg/errors" - auth "k8s.io/api/authentication/v1" + authv1 "k8s.io/api/authentication/v1" ) type Authenticator struct { options Options - tokenMap map[string]auth.UserInfo + tokenMap map[string]authv1.UserInfo lock sync.RWMutex } func New(opts Options) *Authenticator { return &Authenticator{ options: opts, - tokenMap: map[string]auth.UserInfo{}, + tokenMap: map[string]authv1.UserInfo{}, } } @@ -37,7 +37,7 @@ func (s *Authenticator) Configure() error { return nil } -func (s *Authenticator) Check(token string) (*auth.UserInfo, error) { +func (s *Authenticator) Check(token string) (*authv1.UserInfo, error) { s.lock.RLock() defer s.lock.RUnlock() @@ -54,7 +54,7 @@ func (s *Authenticator) Check(token string) (*auth.UserInfo, error) { // - groups can be empty, others cannot be empty // - token should be unique // - one user can have multiple token -func LoadTokenFile(file string) (map[string]auth.UserInfo, error) { +func LoadTokenFile(file string) (map[string]authv1.UserInfo, error) { csvFile, err := os.Open(file) if err != nil { return nil, err @@ -63,7 +63,7 @@ func LoadTokenFile(file string) (map[string]auth.UserInfo, error) { reader := csv.NewReader(bufio.NewReader(csvFile)) reader.FieldsPerRecord = -1 - data := map[string]auth.UserInfo{} + data := map[string]authv1.UserInfo{} lineNum := 0 for { row, err := reader.Read() @@ -87,7 +87,7 @@ func LoadTokenFile(file string) (map[string]auth.UserInfo, error) { return nil, errors.Errorf("line #%d of token auth file reuses token", lineNum) } - user := auth.UserInfo{ + user := authv1.UserInfo{ Username: strings.TrimSpace(row[1]), UID: strings.TrimSpace(row[2]), } diff --git a/token/token_auth_test.go b/auth/providers/token/token_file_test.go similarity index 100% rename from token/token_auth_test.go rename to auth/providers/token/token_file_test.go diff --git a/auth/types.go b/auth/types.go new file mode 100644 index 000000000..948ef1bd8 --- /dev/null +++ b/auth/types.go @@ -0,0 +1,21 @@ +package auth + +import "strings" + +type orgs []string + +var SupportedOrgs orgs + +func (o orgs) Has(name string) bool { + name = strings.TrimSpace(strings.ToLower(name)) + for _, org := range o { + if org == name { + return true + } + } + return false +} + +func (o orgs) String() string { + return strings.Join(o, "/") +} diff --git a/azure/options.go b/azure/options.go deleted file mode 100644 index dd878130a..000000000 --- a/azure/options.go +++ /dev/null @@ -1,39 +0,0 @@ -package azure - -import ( - "fmt" - - "github.com/spf13/pflag" -) - -type Options struct { - ClientID string - ClientSecret string - TenantID string -} - -func (o *Options) AddFlags(fs *pflag.FlagSet) { - fs.StringVar(&o.ClientID, "azure.client-id", o.ClientID, "MS Graph application client ID to use") - fs.StringVar(&o.ClientSecret, "azure.client-secret", o.ClientSecret, "MS Graph application client secret to use") - fs.StringVar(&o.TenantID, "azure.tenant-id", o.TenantID, "MS Graph application tenant id to use") -} - -func (o Options) ToArgs() []string { - var args []string - - if o.ClientID != "" { - args = append(args, fmt.Sprintf("--azure.client-id=%s", o.ClientID)) - } - if o.ClientSecret != "" { - args = append(args, fmt.Sprintf("--azure.client-secret=%s", o.ClientSecret)) - } - if o.TenantID != "" { - args = append(args, fmt.Sprintf("--azure.tenant-id=%s", o.TenantID)) - } - - return args -} - -func (o *Options) Validate() []error { - return nil -} diff --git a/commands/initclient.go b/commands/initclient.go index 062835cad..24e77261e 100644 --- a/commands/initclient.go +++ b/commands/initclient.go @@ -9,7 +9,7 @@ import ( "github.com/appscode/go/log" "github.com/appscode/go/term" - "github.com/appscode/guard/server" + "github.com/appscode/guard/auth" "github.com/appscode/kutil/tools/certstore" "github.com/spf13/afero" "github.com/spf13/cobra" @@ -44,23 +44,12 @@ func NewCmdInitClient() *cobra.Command { Usages: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth}, } - switch org { - case "github": - cfg.Organization = []string{"Github"} - case "google": - cfg.Organization = []string{"Google"} - case "appscode": - cfg.Organization = []string{"Appscode"} - case "gitlab": - cfg.Organization = []string{"Gitlab"} - case "azure": - cfg.Organization = []string{"Azure"} - case "ldap": - cfg.Organization = []string{"Ldap"} - case "": - log.Fatalln("Missing organization name. Set flag -o Google|Github.") - default: + if org == "" { + log.Fatalf("Missing organization name. Set flag -o %s", auth.SupportedOrgs) + } else if !auth.SupportedOrgs.Has(org) { log.Fatalf("Unknown organization %s.", org) + } else { + cfg.Organization = []string{org} } store, err := certstore.NewCertStore(afero.NewOsFs(), filepath.Join(rootDir, "pki"), cfg.Organization...) @@ -90,6 +79,6 @@ func NewCmdInitClient() *cobra.Command { } cmd.Flags().StringVar(&rootDir, "pki-dir", rootDir, "Path to directory where pki files are stored.") - cmd.Flags().StringVarP(&org, "organization", "o", org, fmt.Sprintf("Name of Organization (%v).", server.SupportedOrgPrintForm())) + cmd.Flags().StringVarP(&org, "organization", "o", org, fmt.Sprintf("Name of Organization (%v).", auth.SupportedOrgs)) return cmd } diff --git a/commands/installer.go b/commands/installer.go index e5ad56f0d..420c5a540 100644 --- a/commands/installer.go +++ b/commands/installer.go @@ -1,465 +1,27 @@ package commands import ( - "bytes" "fmt" - "io/ioutil" - "net" - "path/filepath" - "strconv" + "log" - "github.com/appscode/go/log" - stringz "github.com/appscode/go/strings" - "github.com/appscode/go/types" - v "github.com/appscode/go/version" - "github.com/appscode/guard/azure" - "github.com/appscode/guard/google" - "github.com/appscode/guard/ldap" - "github.com/appscode/guard/server" - "github.com/appscode/guard/token" - "github.com/appscode/kutil/meta" - "github.com/appscode/kutil/tools/certstore" - "github.com/spf13/afero" + "github.com/appscode/guard/installer" "github.com/spf13/cobra" - apps "k8s.io/api/apps/v1beta1" - core "k8s.io/api/core/v1" - rbac "k8s.io/api/rbac/v1beta1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/util/intstr" ) -type options struct { - namespace string - addr string - runOnMaster bool - privateRegistry string - imagePullSecret string - - Token token.Options - Google google.Options - Azure azure.Options - LDAP ldap.Options -} - func NewCmdInstaller() *cobra.Command { - opts := options{ - namespace: metav1.NamespaceSystem, - addr: "10.96.10.96:443", - privateRegistry: "appscode", - runOnMaster: true, - } + opts := installer.New() cmd := &cobra.Command{ Use: "installer", Short: "Prints Kubernetes objects for deploying guard server", DisableAutoGenTag: true, Run: func(cmd *cobra.Command, args []string) { - _, port, err := net.SplitHostPort(opts.addr) - if err != nil { - log.Fatalf("Guard server address is invalid. Reason: %v.", err) - } - _, err = strconv.Atoi(port) - if err != nil { - log.Fatalf("Guard server port is invalid. Reason: %v.", err) - } - - store, err := certstore.NewCertStore(afero.NewOsFs(), filepath.Join(rootDir, "pki")) - if err != nil { - log.Fatalf("Failed to create certificate store. Reason: %v.", err) - } - if !store.PairExists("ca") { - log.Fatalf("CA certificates not found in %s. Run `guard init ca`", store.Location()) - } - if !store.PairExists("server") { - log.Fatalf("Server certificate not found in %s. Run `guard init server`", store.Location()) - } - - caCert, _, err := store.ReadBytes("ca") - if err != nil { - log.Fatalf("Failed to load ca certificate. Reason: %v.", err) - } - serverCert, serverKey, err := store.ReadBytes("server") + data, err := installer.Generate(opts) if err != nil { - log.Fatalf("Failed to load ca certificate. Reason: %v.", err) + log.Fatal(err) } - - var buf bytes.Buffer - var data []byte - - if opts.namespace != metav1.NamespaceSystem && opts.namespace != metav1.NamespaceDefault { - data, err = meta.MarshalToYAML(newNamespace(opts.namespace), core.SchemeGroupVersion) - if err != nil { - log.Fatalln(err) - } - buf.Write(data) - buf.WriteString("---\n") - } - - data, err = meta.MarshalToYAML(newServiceAccount(opts.namespace), core.SchemeGroupVersion) - if err != nil { - log.Fatalln(err) - } - buf.Write(data) - buf.WriteString("---\n") - - data, err = meta.MarshalToYAML(newClusterRole(opts.namespace), rbac.SchemeGroupVersion) - if err != nil { - log.Fatalln(err) - } - buf.Write(data) - buf.WriteString("---\n") - - data, err = meta.MarshalToYAML(newClusterRoleBinding(opts.namespace), rbac.SchemeGroupVersion) - if err != nil { - log.Fatalln(err) - } - buf.Write(data) - buf.WriteString("---\n") - - data, err = meta.MarshalToYAML(newSecret(opts.namespace, serverCert, serverKey, caCert), core.SchemeGroupVersion) - if err != nil { - log.Fatalln(err) - } - buf.Write(data) - buf.WriteString("---\n") - - secretData := map[string][]byte{} - if opts.Token.AuthFile != "" { - _, err := token.LoadTokenFile(opts.Token.AuthFile) - if err != nil { - log.Fatalln(err) - } - tokens, err := ioutil.ReadFile(opts.Token.AuthFile) - if err != nil { - log.Fatalln(err) - } - secretData["token.csv"] = tokens - } - if opts.Google.ServiceAccountJsonFile != "" { - sa, err := ioutil.ReadFile(opts.Google.ServiceAccountJsonFile) - if err != nil { - log.Fatalln(err) - } - secretData["sa.json"] = sa - } - if len(secretData) > 0 { - data, err = meta.MarshalToYAML(newSecretForTokenAuth(opts.namespace, secretData), core.SchemeGroupVersion) - if err != nil { - log.Fatalln(err) - } - buf.Write(data) - buf.WriteString("---\n") - } - - ldapData := map[string][]byte{} - if opts.LDAP.CaCertFile != "" { - cert, err := ioutil.ReadFile(opts.LDAP.CaCertFile) - if err != nil { - log.Fatalln(err) - } - ldapData["ca.crt"] = cert - } - if opts.LDAP.KeytabFile != "" { - key, err := ioutil.ReadFile(opts.LDAP.KeytabFile) - if err != nil { - log.Fatalln(err) - } - ldapData["krb5.keytab"] = key - } - if len(ldapData) > 0 { - data, err = meta.MarshalToYAML(newSecretForLDAP(opts.namespace, ldapData), core.SchemeGroupVersion) - if err != nil { - log.Fatalln(err) - } - buf.Write(data) - buf.WriteString("---\n") - } - - data, err = meta.MarshalToYAML(newDeployment(opts), apps.SchemeGroupVersion) - if err != nil { - log.Fatalln(err) - } - buf.Write(data) - buf.WriteString("---\n") - - data, err = meta.MarshalToYAML(newService(opts.namespace, opts.addr), core.SchemeGroupVersion) - if err != nil { - log.Fatalln(err) - } - buf.Write(data) - - fmt.Println(buf.String()) + fmt.Println(string(data)) }, } - - cmd.Flags().StringVar(&rootDir, "pki-dir", rootDir, "Path to directory where pki files are stored.") - cmd.Flags().StringVarP(&opts.namespace, "namespace", "n", opts.namespace, "Name of Kubernetes namespace used to run guard server.") - cmd.Flags().StringVar(&opts.addr, "addr", opts.addr, "Address (host:port) of guard server.") - cmd.Flags().BoolVar(&opts.runOnMaster, "run-on-master", opts.runOnMaster, "If true, runs Guard server on master instances") - cmd.Flags().StringVar(&opts.privateRegistry, "private-registry", opts.privateRegistry, "Private Docker registry") - cmd.Flags().StringVar(&opts.imagePullSecret, "image-pull-secret", opts.imagePullSecret, "Name of image pull secret") - opts.Token.AddFlags(cmd.Flags()) - opts.Google.AddFlags(cmd.Flags()) - opts.Azure.AddFlags(cmd.Flags()) - opts.LDAP.AddFlags(cmd.Flags()) + opts.AddFlags(cmd.Flags()) return cmd } - -var labels = map[string]string{ - "app": "guard", -} - -func newNamespace(namespace string) runtime.Object { - return &core.Namespace{ - ObjectMeta: metav1.ObjectMeta{ - Name: namespace, - Labels: labels, - }, - } -} - -func newSecret(namespace string, cert, key, caCert []byte) runtime.Object { - return &core.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: "guard-pki", - Namespace: namespace, - Labels: labels, - }, - Data: map[string][]byte{ - "ca.crt": caCert, - "tls.crt": cert, - "tls.key": key, - }, - } -} - -func newDeployment(opts options) runtime.Object { - d := apps.Deployment{ - ObjectMeta: metav1.ObjectMeta{ - Name: "guard", - Namespace: opts.namespace, - Labels: labels, - }, - Spec: apps.DeploymentSpec{ - Replicas: types.Int32P(1), - Template: core.PodTemplateSpec{ - ObjectMeta: metav1.ObjectMeta{ - Labels: labels, - Annotations: map[string]string{ - "scheduler.alpha.kubernetes.io/critical-pod": "", - }, - }, - Spec: core.PodSpec{ - ServiceAccountName: "guard", - Containers: []core.Container{ - { - Name: "guard", - Image: fmt.Sprintf("%s/guard:%v", opts.privateRegistry, stringz.Val(v.Version.Version, "canary")), - Args: []string{ - "run", - "--v=3", - }, - Ports: []core.ContainerPort{ - { - ContainerPort: server.ServingPort, - }, - }, - VolumeMounts: []core.VolumeMount{ - { - Name: "guard-pki", - MountPath: "/etc/guard/pki", - }, - }, - ReadinessProbe: &core.Probe{ - Handler: core.Handler{ - HTTPGet: &core.HTTPGetAction{ - Path: "/healthz", - Port: intstr.FromInt(server.ServingPort), - Scheme: core.URISchemeHTTPS, - }, - }, - InitialDelaySeconds: int32(30), - }, - }, - }, - Volumes: []core.Volume{ - { - Name: "guard-pki", - VolumeSource: core.VolumeSource{ - Secret: &core.SecretVolumeSource{ - SecretName: "guard-pki", - DefaultMode: types.Int32P(0555), - }, - }, - }, - }, - Tolerations: []core.Toleration{ - { - Key: "CriticalAddonsOnly", - Operator: core.TolerationOpExists, - }, - }, - }, - }, - }, - } - if opts.imagePullSecret != "" { - d.Spec.Template.Spec.ImagePullSecrets = []core.LocalObjectReference{ - { - Name: opts.imagePullSecret, - }, - } - } - if opts.runOnMaster { - d.Spec.Template.Spec.NodeSelector = map[string]string{ - "node-role.kubernetes.io/master": "", - } - d.Spec.Template.Spec.Tolerations = append(d.Spec.Template.Spec.Tolerations, core.Toleration{ - Key: "node-role.kubernetes.io/master", - Operator: core.TolerationOpExists, - Effect: core.TaintEffectNoSchedule, - }) - } - - if opts.Token.AuthFile != "" || opts.Google.ServiceAccountJsonFile != "" { - volMount := core.VolumeMount{ - Name: "guard-auth", - MountPath: "/etc/guard/auth", - } - d.Spec.Template.Spec.Containers[0].VolumeMounts = append(d.Spec.Template.Spec.Containers[0].VolumeMounts, volMount) - - vol := core.Volume{ - Name: "guard-auth", - VolumeSource: core.VolumeSource{ - Secret: &core.SecretVolumeSource{ - SecretName: "guard-auth", - DefaultMode: types.Int32P(0555), - }, - }, - } - d.Spec.Template.Spec.Volumes = append(d.Spec.Template.Spec.Volumes, vol) - } - - if opts.LDAP.CaCertFile != "" || opts.LDAP.KeytabFile != "" { - volMount := core.VolumeMount{ - Name: "guard-ldap", - MountPath: "/etc/guard/ldap/", - } - d.Spec.Template.Spec.Containers[0].VolumeMounts = append(d.Spec.Template.Spec.Containers[0].VolumeMounts, volMount) - - vol := core.Volume{ - Name: "guard-ldap", - VolumeSource: core.VolumeSource{ - Secret: &core.SecretVolumeSource{ - SecretName: "guard-ldap", - DefaultMode: types.Int32P(0444), - }, - }, - } - d.Spec.Template.Spec.Volumes = append(d.Spec.Template.Spec.Volumes, vol) - } - - d.Spec.Template.Spec.Containers[0].Args = append(d.Spec.Template.Spec.Containers[0].Args, server.SecureServingOptions{}.ToArgs()...) - d.Spec.Template.Spec.Containers[0].Args = append(d.Spec.Template.Spec.Containers[0].Args, opts.Token.ToArgs()...) - d.Spec.Template.Spec.Containers[0].Args = append(d.Spec.Template.Spec.Containers[0].Args, opts.Google.ToArgs()...) - d.Spec.Template.Spec.Containers[0].Args = append(d.Spec.Template.Spec.Containers[0].Args, opts.Azure.ToArgs()...) - d.Spec.Template.Spec.Containers[0].Args = append(d.Spec.Template.Spec.Containers[0].Args, opts.LDAP.ToArgs()...) - - return &d -} - -func newService(namespace, addr string) runtime.Object { - host, port, _ := net.SplitHostPort(addr) - svcPort, _ := strconv.Atoi(port) - return &core.Service{ - ObjectMeta: metav1.ObjectMeta{ - Name: "guard", - Namespace: namespace, - Labels: labels, - }, - Spec: core.ServiceSpec{ - Type: core.ServiceTypeClusterIP, - ClusterIP: host, - Ports: []core.ServicePort{ - { - Name: "api", - Port: int32(svcPort), - Protocol: core.ProtocolTCP, - TargetPort: intstr.FromInt(server.ServingPort), - }, - }, - Selector: labels, - }, - } -} - -func newServiceAccount(namespace string) runtime.Object { - return &core.ServiceAccount{ - ObjectMeta: metav1.ObjectMeta{ - Name: "guard", - Namespace: namespace, - Labels: labels, - }, - } -} - -func newClusterRole(namespace string) runtime.Object { - return &rbac.ClusterRole{ - ObjectMeta: metav1.ObjectMeta{ - Name: "guard", - Namespace: namespace, - Labels: labels, - }, - Rules: []rbac.PolicyRule{ - { - APIGroups: []string{core.GroupName}, - Resources: []string{"nodes"}, - Verbs: []string{"list"}, - }, - }, - } -} - -func newClusterRoleBinding(namespace string) runtime.Object { - return &rbac.ClusterRoleBinding{ - ObjectMeta: metav1.ObjectMeta{ - Name: "guard", - Namespace: namespace, - Labels: labels, - }, - RoleRef: rbac.RoleRef{ - APIGroup: rbac.GroupName, - Kind: "ClusterRole", - Name: "guard", - }, - Subjects: []rbac.Subject{ - { - Kind: rbac.ServiceAccountKind, - Name: "guard", - Namespace: namespace, - }, - }, - } -} - -func newSecretForTokenAuth(namespace string, data map[string][]byte) runtime.Object { - return &core.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: "guard-auth", - Namespace: namespace, - Labels: labels, - }, - Data: data, - } -} - -func newSecretForLDAP(namespace string, data map[string][]byte) runtime.Object { - return &core.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: "guard-ldap", - Namespace: namespace, - Labels: labels, - }, - Data: data, - } -} diff --git a/commands/token.go b/commands/token.go index c365b61cf..3053bafac 100644 --- a/commands/token.go +++ b/commands/token.go @@ -5,12 +5,12 @@ import ( "strings" "github.com/appscode/go/log" - "github.com/appscode/guard/appscode" - "github.com/appscode/guard/github" - "github.com/appscode/guard/gitlab" - "github.com/appscode/guard/google" - "github.com/appscode/guard/ldap" - "github.com/appscode/guard/server" + "github.com/appscode/guard/auth" + "github.com/appscode/guard/auth/providers/appscode" + "github.com/appscode/guard/auth/providers/github" + "github.com/appscode/guard/auth/providers/gitlab" + "github.com/appscode/guard/auth/providers/google" + "github.com/appscode/guard/auth/providers/ldap" "github.com/spf13/cobra" ) @@ -24,7 +24,7 @@ func NewCmdGetToken() *cobra.Command { cmd := &cobra.Command{ Use: "token", - Short: fmt.Sprintf("Get tokens for %v", server.SupportedOrgPrintForm()), + Short: fmt.Sprintf("Get tokens for %v", auth.SupportedOrgs), DisableAutoGenTag: true, Run: func(cmd *cobra.Command, args []string) { opts.Org = strings.ToLower(opts.Org) @@ -61,7 +61,7 @@ func NewCmdGetToken() *cobra.Command { }, } - cmd.Flags().StringVarP(&opts.Org, "organization", "o", opts.Org, fmt.Sprintf("Name of Organization (%v).", server.SupportedOrgPrintForm())) + cmd.Flags().StringVarP(&opts.Org, "organization", "o", opts.Org, fmt.Sprintf("Name of Organization (%v).", auth.SupportedOrgs)) opts.LDAP.AddFlags(cmd.Flags()) return cmd } diff --git a/commands/webhok_config.go b/commands/webhok_config.go index b4a2b2298..507410cb4 100644 --- a/commands/webhok_config.go +++ b/commands/webhok_config.go @@ -6,7 +6,7 @@ import ( "strings" "github.com/appscode/go/log" - "github.com/appscode/guard/server" + "github.com/appscode/guard/auth" "github.com/appscode/kutil/tools/certstore" "github.com/spf13/afero" "github.com/spf13/cobra" @@ -41,23 +41,12 @@ func NewCmdGetWebhookConfig() *cobra.Command { cfg := cert.Config{ CommonName: args[0], } - switch org { - case "github": - cfg.Organization = []string{"Github"} - case "google": - cfg.Organization = []string{"Google"} - case "appscode": - cfg.Organization = []string{"Appscode"} - case "gitlab": - cfg.Organization = []string{"Gitlab"} - case "azure": - cfg.Organization = []string{"Azure"} - case "ldap": - cfg.Organization = []string{"Ldap"} - case "": - log.Fatalln("Missing organization name. Set flag -o Google|Github.") - default: + if org == "" { + log.Fatalf("Missing organization name. Set flag -o %s", auth.SupportedOrgs) + } else if !auth.SupportedOrgs.Has(org) { log.Fatalf("Unknown organization %s.", org) + } else { + cfg.Organization = []string{org} } store, err := certstore.NewCertStore(afero.NewOsFs(), filepath.Join(rootDir, "pki")) @@ -112,7 +101,7 @@ func NewCmdGetWebhookConfig() *cobra.Command { } cmd.Flags().StringVar(&rootDir, "pki-dir", rootDir, "Path to directory where pki files are stored.") - cmd.Flags().StringVarP(&org, "organization", "o", org, fmt.Sprintf("Name of Organization (%v).", server.SupportedOrgPrintForm())) + cmd.Flags().StringVarP(&org, "organization", "o", org, fmt.Sprintf("Name of Organization (%v).", auth.SupportedOrgs)) cmd.Flags().StringVar(&addr, "addr", "10.96.10.96:443", "Address (host:port) of guard server.") return cmd } diff --git a/docs/README.md b/docs/README.md index eace07cb7..192ee11ce 100644 --- a/docs/README.md +++ b/docs/README.md @@ -30,7 +30,7 @@ From here you can learn all about Guard's architecture and how to deploy and use - [Guides](/docs/guides/). Guides show you how to perform tasks with Guard. - [Reference](/docs/reference/). Detailed exhaustive lists of -command-line options, configuration options, API definitions, and procedures. +command-line Options, configuration Options, API definitions, and procedures. We're always looking for help improving our documentation, so please don't hesitate to [file an issue](https://github.com/appscode/guard/issues/new) if you see some problem. Or better yet, submit your own [contributions](/docs/CONTRIBUTING.md) to help make our docs better. diff --git a/glide.lock b/glide.lock index abfacb5fc..94387ea68 100644 --- a/glide.lock +++ b/glide.lock @@ -1,8 +1,8 @@ hash: 3be3a1514c65c8432448361c4fd0f062126412529412e26d13c932ce27af8044 -updated: 2018-03-20T06:04:55.076042108-07:00 +updated: 2018-03-21T00:32:23.464177319-07:00 imports: - name: appscode.com/api - version: 4563b7ddd49c3a332c9159b84417f15c3c5e574b + version: a87c2861c187a10b79b6e49f523233cbbd8bb009 repo: https://bitbucket.org/appscode/api.git subpackages: - auth/v1alpha1 @@ -46,7 +46,7 @@ imports: - name: github.com/appscode/jsonpatch version: ee757872f6aca6d412d0d80543725bd4cf48f793 - name: github.com/appscode/kutil - version: 27d2cfe8446ebe2627406a43081ff7d0f222e8e7 + version: 436b54978ae275a61a06baa3f0a119864691cf12 subpackages: - meta - tools/analytics @@ -67,7 +67,7 @@ imports: subpackages: - md2man - name: github.com/davecgh/go-spew - version: 782f4967f2dc4564575ca782fe2d04090b5faca8 + version: 6d212800a42e8ab5c146b8ace3490ee17e5225f9 subpackages: - spew - name: github.com/emicklei/go-restful @@ -190,7 +190,7 @@ imports: - name: github.com/peterbourgon/diskv version: 5f041e8faa004a95c88a202771f4cc3e991971e6 - name: github.com/pharmer/pharmer - version: 6ed3cd5a27e0a1bce99baa93b3aec9458c686e36 + version: 9b0d9ff112041d85a706af71d0e8f3ba2d4c66a4 subpackages: - apis/v1alpha1 - name: github.com/pkg/errors @@ -251,7 +251,7 @@ imports: - name: github.com/spf13/pflag version: e57e3eeb33f795204c1ca35f56c44f83227c6e66 - name: github.com/stretchr/testify - version: 12b6f73e6084dad08a7c6e575284b177ecafbc71 + version: 69483b4bd14f5845b5a1e55bca19e954e827f1d0 subpackages: - assert - name: github.com/vjeantet/goldap @@ -498,7 +498,7 @@ imports: - third_party/forked/golang/json - third_party/forked/golang/reflect - name: k8s.io/apiserver - version: 91e14f394e4796abf5a994a349a222e7081d86b6 + version: ac8d2245af4cbb47d4ee5e0a6088a7e2294eaa2f subpackages: - pkg/util/feature - name: k8s.io/client-go diff --git a/google/options.go b/google/options.go deleted file mode 100644 index d285860e2..000000000 --- a/google/options.go +++ /dev/null @@ -1,34 +0,0 @@ -package google - -import ( - "fmt" - - "github.com/spf13/pflag" -) - -type Options struct { - ServiceAccountJsonFile string - AdminEmail string -} - -func (o *Options) AddFlags(fs *pflag.FlagSet) { - fs.StringVar(&o.ServiceAccountJsonFile, "google.sa-json-file", o.ServiceAccountJsonFile, "Path to Google service account json file") - fs.StringVar(&o.AdminEmail, "google.admin-email", o.AdminEmail, "Email of G Suite administrator") -} - -func (o Options) ToArgs() []string { - var args []string - - if o.ServiceAccountJsonFile != "" { - args = append(args, "--google.sa-json-file=/etc/guard/auth/sa.json") - } - if o.AdminEmail != "" { - args = append(args, fmt.Sprintf("--google.admin-email=%s", o.AdminEmail)) - } - - return args -} - -func (o *Options) Validate() []error { - return nil -} diff --git a/hack/make.py b/hack/make.py index 93a8908ed..8103234e7 100755 --- a/hack/make.py +++ b/hack/make.py @@ -81,9 +81,9 @@ def version(): def fmt(): - libbuild.ungroup_go_imports('*.go', 'appscode', 'azure', 'commands', 'github', 'gitlab', 'google', 'hack', 'ldap', 'server', 'token') - die(call('goimports -w *.go appscode azure commands github gitlab google hack ldap server token')) - call('gofmt -s -w *.go appscode azure commands github gitlab google hack ldap server token') + libbuild.ungroup_go_imports('*.go', 'auth', 'commands', 'docs', 'installer', 'server', 'util') + die(call('goimports -w *.go auth commands docs installer server util')) + call('gofmt -s -w *.go auth commands docs installer server util') def vet(): diff --git a/installer/deployment.go b/installer/deployment.go new file mode 100644 index 000000000..91dec11c6 --- /dev/null +++ b/installer/deployment.go @@ -0,0 +1,121 @@ +package installer + +import ( + "fmt" + + stringz "github.com/appscode/go/strings" + "github.com/appscode/go/types" + v "github.com/appscode/go/version" + "github.com/appscode/guard/server" + apps "k8s.io/api/apps/v1beta1" + core "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/util/intstr" +) + +func newDeployment(opts Options) (objects []runtime.Object, err error) { + d := &apps.Deployment{ + ObjectMeta: metav1.ObjectMeta{ + Name: "guard", + Namespace: opts.namespace, + Labels: labels, + }, + Spec: apps.DeploymentSpec{ + Replicas: types.Int32P(1), + Template: core.PodTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{ + Labels: labels, + Annotations: map[string]string{ + "scheduler.alpha.kubernetes.io/critical-pod": "", + }, + }, + Spec: core.PodSpec{ + ServiceAccountName: "guard", + Containers: []core.Container{ + { + Name: "guard", + Image: fmt.Sprintf("%s/guard:%v", opts.privateRegistry, stringz.Val(v.Version.Version, "canary")), + Args: []string{ + "run", + "--v=3", + }, + Ports: []core.ContainerPort{ + { + ContainerPort: server.ServingPort, + }, + }, + ReadinessProbe: &core.Probe{ + Handler: core.Handler{ + HTTPGet: &core.HTTPGetAction{ + Path: "/healthz", + Port: intstr.FromInt(server.ServingPort), + Scheme: core.URISchemeHTTPS, + }, + }, + InitialDelaySeconds: int32(30), + }, + }, + }, + Tolerations: []core.Toleration{ + { + Key: "CriticalAddonsOnly", + Operator: core.TolerationOpExists, + }, + }, + }, + }, + }, + } + if opts.imagePullSecret != "" { + d.Spec.Template.Spec.ImagePullSecrets = []core.LocalObjectReference{ + { + Name: opts.imagePullSecret, + }, + } + } + if opts.runOnMaster { + d.Spec.Template.Spec.NodeSelector = map[string]string{ + "node-role.kubernetes.io/master": "", + } + d.Spec.Template.Spec.Tolerations = append(d.Spec.Template.Spec.Tolerations, core.Toleration{ + Key: "node-role.kubernetes.io/master", + Operator: core.TolerationOpExists, + Effect: core.TaintEffectNoSchedule, + }) + } + objects = append(objects, d) + + servingOpts := server.NewSecureServingOptionsFromDir(opts.pkiDir) + if extras, err := servingOpts.Apply(d); err != nil { + return nil, err + } else { + objects = append(objects, extras...) + } + + if extras, err := opts.Token.Apply(d); err != nil { + return nil, err + } else { + objects = append(objects, extras...) + } + + if extras, err := opts.Google.Apply(d); err != nil { + return nil, err + } else { + objects = append(objects, extras...) + } + + if extras, err := opts.Azure.Apply(d); err != nil { + return nil, err + } else { + objects = append(objects, extras...) + } + + if extras, err := opts.LDAP.Apply(d); err != nil { + return nil, err + } else { + objects = append(objects, extras...) + } + + return +} diff --git a/installer/installer.go b/installer/installer.go new file mode 100644 index 000000000..437e04d2b --- /dev/null +++ b/installer/installer.go @@ -0,0 +1,55 @@ +package installer + +import ( + "bytes" + + "github.com/pkg/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/serializer/versioning" + clientsetscheme "k8s.io/client-go/kubernetes/scheme" +) + +var labels = map[string]string{ + "app": "guard", +} + +func Generate(opts Options) ([]byte, error) { + var objects []runtime.Object + + if opts.namespace != metav1.NamespaceSystem && opts.namespace != metav1.NamespaceDefault { + objects = append(objects, newNamespace(opts.namespace)) + } + objects = append(objects, newServiceAccount(opts.namespace)) + objects = append(objects, newClusterRole(opts.namespace)) + objects = append(objects, newClusterRoleBinding(opts.namespace)) + if deployObjects, err := newDeployment(opts); err != nil { + return nil, err + } else { + objects = append(objects, deployObjects...) + } + if svc, err := newService(opts.namespace, opts.addr); err != nil { + return nil, err + } else { + objects = append(objects, svc) + } + + mediaType := "application/yaml" + info, ok := runtime.SerializerInfoForMediaType(clientsetscheme.Codecs.SupportedMediaTypes(), mediaType) + if !ok { + return nil, errors.Errorf("unsupported media type %q", mediaType) + } + codec := versioning.NewCodecForScheme(clientsetscheme.Scheme, info.Serializer, info.Serializer, nil, nil) + + var buf bytes.Buffer + for i, obj := range objects { + if i > 0 { + buf.WriteString("---\n") + } + err := codec.Encode(obj, &buf) + if err != nil { + return nil, err + } + } + return buf.Bytes(), nil +} diff --git a/installer/namespace.go b/installer/namespace.go new file mode 100644 index 000000000..5939f96d2 --- /dev/null +++ b/installer/namespace.go @@ -0,0 +1,16 @@ +package installer + +import ( + core "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" +) + +func newNamespace(namespace string) runtime.Object { + return &core.Namespace{ + ObjectMeta: metav1.ObjectMeta{ + Name: namespace, + Labels: labels, + }, + } +} diff --git a/installer/options.go b/installer/options.go new file mode 100644 index 000000000..737ea9238 --- /dev/null +++ b/installer/options.go @@ -0,0 +1,50 @@ +package installer + +import ( + "github.com/appscode/guard/auth/providers/azure" + "github.com/appscode/guard/auth/providers/google" + "github.com/appscode/guard/auth/providers/ldap" + "github.com/appscode/guard/auth/providers/token" + "github.com/spf13/pflag" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +type Options struct { + pkiDir string + namespace string + addr string + runOnMaster bool + privateRegistry string + imagePullSecret string + + Token token.Options + Google google.Options + Azure azure.Options + LDAP ldap.Options +} + +func New() Options { + return Options{ + namespace: metav1.NamespaceSystem, + addr: "10.96.10.96:443", + privateRegistry: "appscode", + runOnMaster: true, + Token: token.NewOptions(), + Google: google.NewOptions(), + Azure: azure.NewOptions(), + LDAP: ldap.NewOptions(), + } +} + +func (o *Options) AddFlags(fs *pflag.FlagSet) { + fs.StringVar(&o.pkiDir, "pki-dir", o.pkiDir, "Path to directory where pki files are stored.") + fs.StringVarP(&o.namespace, "namespace", "n", o.namespace, "Name of Kubernetes namespace used to run guard server.") + fs.StringVar(&o.addr, "addr", o.addr, "Address (host:port) of guard server.") + fs.BoolVar(&o.runOnMaster, "run-on-master", o.runOnMaster, "If true, runs Guard server on master instances") + fs.StringVar(&o.privateRegistry, "private-registry", o.privateRegistry, "Private Docker registry") + fs.StringVar(&o.imagePullSecret, "image-pull-secret", o.imagePullSecret, "Name of image pull secret") + o.Token.AddFlags(fs) + o.Google.AddFlags(fs) + o.Azure.AddFlags(fs) + o.LDAP.AddFlags(fs) +} diff --git a/installer/rbac.go b/installer/rbac.go new file mode 100644 index 000000000..eea4f40fc --- /dev/null +++ b/installer/rbac.go @@ -0,0 +1,57 @@ +package installer + +import ( + core "k8s.io/api/core/v1" + rbac "k8s.io/api/rbac/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" +) + +func newServiceAccount(namespace string) runtime.Object { + return &core.ServiceAccount{ + ObjectMeta: metav1.ObjectMeta{ + Name: "guard", + Namespace: namespace, + Labels: labels, + }, + } +} + +func newClusterRole(namespace string) runtime.Object { + return &rbac.ClusterRole{ + ObjectMeta: metav1.ObjectMeta{ + Name: "guard", + Namespace: namespace, + Labels: labels, + }, + Rules: []rbac.PolicyRule{ + { + APIGroups: []string{core.GroupName}, + Resources: []string{"nodes"}, + Verbs: []string{"list"}, + }, + }, + } +} + +func newClusterRoleBinding(namespace string) runtime.Object { + return &rbac.ClusterRoleBinding{ + ObjectMeta: metav1.ObjectMeta{ + Name: "guard", + Namespace: namespace, + Labels: labels, + }, + RoleRef: rbac.RoleRef{ + APIGroup: rbac.GroupName, + Kind: "ClusterRole", + Name: "guard", + }, + Subjects: []rbac.Subject{ + { + Kind: rbac.ServiceAccountKind, + Name: "guard", + Namespace: namespace, + }, + }, + } +} diff --git a/installer/service.go b/installer/service.go new file mode 100644 index 000000000..21e2305f9 --- /dev/null +++ b/installer/service.go @@ -0,0 +1,45 @@ +package installer + +import ( + "net" + "strconv" + + "github.com/appscode/guard/server" + "github.com/pkg/errors" + core "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/util/intstr" +) + +func newService(namespace, addr string) (runtime.Object, error) { + host, port, err := net.SplitHostPort(addr) + if err != nil { + return nil, errors.Wrap(err, "Guard server address is invalid.") + } + svcPort, err := strconv.Atoi(port) + if err != nil { + return nil, errors.Wrap(err, "Guard server port is invalid.") + } + + return &core.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: "guard", + Namespace: namespace, + Labels: labels, + }, + Spec: core.ServiceSpec{ + Type: core.ServiceTypeClusterIP, + ClusterIP: host, + Ports: []core.ServicePort{ + { + Name: "api", + Port: int32(svcPort), + Protocol: core.ProtocolTCP, + TargetPort: intstr.FromInt(server.ServingPort), + }, + }, + Selector: labels, + }, + }, nil +} diff --git a/main.go b/main.go index c70b08358..8c8859e99 100644 --- a/main.go +++ b/main.go @@ -4,6 +4,7 @@ import ( "os" logs "github.com/appscode/go/log/golog" + _ "github.com/appscode/guard/auth/providers" "github.com/appscode/guard/commands" _ "github.com/stretchr/testify/assert" _ "github.com/vjeantet/ldapserver" diff --git a/server/handler.go b/server/handler.go index 6be47b4ba..35cc5ca00 100644 --- a/server/handler.go +++ b/server/handler.go @@ -5,12 +5,12 @@ import ( "strings" "github.com/appscode/go/log" - "github.com/appscode/guard/appscode" - "github.com/appscode/guard/azure" - "github.com/appscode/guard/github" - "github.com/appscode/guard/gitlab" - "github.com/appscode/guard/google" - "github.com/appscode/guard/ldap" + "github.com/appscode/guard/auth/providers/appscode" + "github.com/appscode/guard/auth/providers/azure" + "github.com/appscode/guard/auth/providers/github" + "github.com/appscode/guard/auth/providers/gitlab" + "github.com/appscode/guard/auth/providers/google" + "github.com/appscode/guard/auth/providers/ldap" "github.com/pkg/errors" auth "k8s.io/api/authentication/v1" ) diff --git a/server/recommended.go b/server/recommended.go index 3a3023014..909ca1676 100644 --- a/server/recommended.go +++ b/server/recommended.go @@ -1,10 +1,10 @@ package server import ( - "github.com/appscode/guard/azure" - "github.com/appscode/guard/google" - "github.com/appscode/guard/ldap" - "github.com/appscode/guard/token" + "github.com/appscode/guard/auth/providers/azure" + "github.com/appscode/guard/auth/providers/google" + "github.com/appscode/guard/auth/providers/ldap" + "github.com/appscode/guard/auth/providers/token" "github.com/spf13/pflag" ) diff --git a/server/server.go b/server/server.go index 9ffef030e..ddf79dbc8 100644 --- a/server/server.go +++ b/server/server.go @@ -13,7 +13,7 @@ import ( "github.com/appscode/go/ntp" "github.com/appscode/go/signals" v "github.com/appscode/go/version" - "github.com/appscode/guard/token" + "github.com/appscode/guard/auth/providers/token" "github.com/appscode/kutil/meta" "github.com/appscode/kutil/tools/fsnotify" "github.com/appscode/pat" diff --git a/server/serving.go b/server/serving.go index 37b34efae..4265eb8a6 100644 --- a/server/serving.go +++ b/server/serving.go @@ -2,8 +2,17 @@ package server import ( "fmt" + "path/filepath" + "github.com/appscode/go/types" + "github.com/appscode/kutil/tools/certstore" + "github.com/pkg/errors" + "github.com/spf13/afero" "github.com/spf13/pflag" + "k8s.io/api/apps/v1beta1" + core "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" ) const ( @@ -15,6 +24,8 @@ type SecureServingOptions struct { CACertFile string CertFile string KeyFile string + + pkiDir string } func NewSecureServingOptions() SecureServingOptions { @@ -23,24 +34,19 @@ func NewSecureServingOptions() SecureServingOptions { } } +func NewSecureServingOptionsFromDir(pkiDir string) SecureServingOptions { + return SecureServingOptions{ + pkiDir: pkiDir, + } +} + func (o *SecureServingOptions) AddFlags(fs *pflag.FlagSet) { fs.StringVar(&o.SecureAddr, "secure-addr", o.SecureAddr, "host:port used to serve secure apis") - fs.StringVar(&o.CACertFile, "tls-ca-file", o.CACertFile, "File containing CA certificate") fs.StringVar(&o.CertFile, "tls-cert-file", o.CertFile, "File container server TLS certificate") fs.StringVar(&o.KeyFile, "tls-private-key-file", o.KeyFile, "File containing server TLS private key") } -func (o SecureServingOptions) ToArgs() []string { - var args []string - - args = append(args, "--tls-ca-file=/etc/guard/pki/ca.crt") - args = append(args, "--tls-cert-file=/etc/guard/pki/tls.crt") - args = append(args, "--tls-private-key-file=/etc/guard/pki/tls.key") - - return args -} - func (o *SecureServingOptions) Validate() []error { return nil } @@ -48,3 +54,72 @@ func (o *SecureServingOptions) Validate() []error { func (o SecureServingOptions) UseTLS() bool { return o.CACertFile != "" && o.CertFile != "" && o.KeyFile != "" } + +func (o SecureServingOptions) Apply(d *v1beta1.Deployment) (extraObjs []runtime.Object, err error) { + if !o.UseTLS() { + return nil, nil // nothing to apply + } + + container := d.Spec.Template.Spec.Containers[0] + + // create auth secret + store, err := certstore.NewCertStore(afero.NewOsFs(), filepath.Join(o.pkiDir, "pki")) + if err != nil { + return nil, errors.Wrap(err, "failed to create certificate store.") + } + if !store.PairExists("ca") { + return nil, errors.Errorf("CA certificates not found in %s. Run `guard init ca`", store.Location()) + } + if !store.PairExists("server") { + return nil, errors.Errorf("Server certificate not found in %s. Run `guard init server`", store.Location()) + } + + caCert, _, err := store.ReadBytes("ca") + if err != nil { + return nil, errors.Wrap(err, "failed to load ca certificate.") + } + serverCert, serverKey, err := store.ReadBytes("server") + if err != nil { + return nil, errors.Wrap(err, "Failed to load ca certificate.") + } + + authSecret := &core.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: "guard-pki", + Namespace: d.Namespace, + Labels: d.Labels, + }, + Data: map[string][]byte{ + "ca.crt": caCert, + "tls.crt": serverCert, + "tls.key": serverKey, + }, + } + extraObjs = append(extraObjs, authSecret) + + // mount auth secret into deployment + volMount := core.VolumeMount{ + Name: authSecret.Name, + MountPath: "/etc/guard/pki", + } + container.VolumeMounts = append(container.VolumeMounts, volMount) + + vol := core.Volume{ + Name: authSecret.Name, + VolumeSource: core.VolumeSource{ + Secret: &core.SecretVolumeSource{ + SecretName: authSecret.Name, + DefaultMode: types.Int32P(0555), + }, + }, + } + d.Spec.Template.Spec.Volumes = append(d.Spec.Template.Spec.Volumes, vol) + + // use auth secret in container[0] args + args := container.Args + args = append(args, "--tls-ca-file=/etc/guard/pki/ca.crt") + args = append(args, "--tls-cert-file=/etc/guard/pki/tls.crt") + args = append(args, "--tls-private-key-file=/etc/guard/pki/tls.key") + + return extraObjs, nil +} diff --git a/server/utils.go b/server/utils.go index 8017b7320..d37ab3faa 100644 --- a/server/utils.go +++ b/server/utils.go @@ -4,7 +4,6 @@ import ( "fmt" "io" "net/http" - "strings" "github.com/appscode/go/log" "github.com/json-iterator/go" @@ -71,19 +70,6 @@ func printStackTrace(err error) { } } -func GetSupportedOrg() []string { - return []string{ - "Github", - "Gitlab", - "Google", - } -} - -// output form : Github/Google/Gitlab -func SupportedOrgPrintForm() string { - return strings.Join(GetSupportedOrg(), "/") -} - // WithCode annotates err with a new code. // If err is nil, WithCode returns nil. func WithCode(err error, code int) error { diff --git a/token/options.go b/token/options.go deleted file mode 100644 index 8a7fcd7b8..000000000 --- a/token/options.go +++ /dev/null @@ -1,27 +0,0 @@ -package token - -import ( - "github.com/spf13/pflag" -) - -type Options struct { - AuthFile string -} - -func (o *Options) AddFlags(fs *pflag.FlagSet) { - fs.StringVar(&o.AuthFile, "token-auth-file", "", "To enable static token authentication") -} - -func (o Options) ToArgs() []string { - var args []string - - if o.AuthFile != "" { - args = append(args, "--token-auth-file=/etc/guard/auth/token.csv") - } - - return args -} - -func (o *Options) Validate() []error { - return nil -} diff --git a/util/kubeconfig/utils.go b/util/kubeconfig/utils.go index 81c3314cf..0896ea032 100644 --- a/util/kubeconfig/utils.go +++ b/util/kubeconfig/utils.go @@ -53,5 +53,5 @@ func AddAuthInfo(username string, authInfo *clientcmdapi.AuthInfo) error { } func Path() string { - return filepath.Join(homedir.HomeDir(), ".kube", "config") + return filepath.Join(homedir.HomeDir(), ".kube", "config") } diff --git a/vendor/appscode.com/api/kubernetes/v1alpha1/client.pb.go b/vendor/appscode.com/api/kubernetes/v1alpha1/client.pb.go index 426453a1e..9e51bfb10 100644 --- a/vendor/appscode.com/api/kubernetes/v1alpha1/client.pb.go +++ b/vendor/appscode.com/api/kubernetes/v1alpha1/client.pb.go @@ -669,8 +669,6 @@ func (m *DeleteResourceRequest) GetApiVersion() string { } type KubeResourceList struct { - ApiVersion string `protobuf:"bytes,1,opt,name=api_version,json=apiVersion" json:"api_version,omitempty"` - Kind string `protobuf:"bytes,2,opt,name=kind" json:"kind,omitempty"` // Types that are valid to be assigned to Resource: // *KubeResourceList_ConfigMaps_ // *KubeResourceList_DaemonSets_ @@ -723,118 +721,118 @@ type isKubeResourceList_Resource interface { } type KubeResourceList_ConfigMaps_ struct { - ConfigMaps *KubeResourceList_ConfigMaps `protobuf:"bytes,3,opt,name=config_maps,json=configMaps,oneof"` + ConfigMaps *KubeResourceList_ConfigMaps `protobuf:"bytes,1,opt,name=config_maps,json=configMaps,oneof"` } type KubeResourceList_DaemonSets_ struct { - DaemonSets *KubeResourceList_DaemonSets `protobuf:"bytes,4,opt,name=daemon_sets,json=daemonSets,oneof"` + DaemonSets *KubeResourceList_DaemonSets `protobuf:"bytes,2,opt,name=daemon_sets,json=daemonSets,oneof"` } type KubeResourceList_Deployments_ struct { - Deployments *KubeResourceList_Deployments `protobuf:"bytes,5,opt,name=deployments,oneof"` + Deployments *KubeResourceList_Deployments `protobuf:"bytes,3,opt,name=deployments,oneof"` } type KubeResourceList_Jobs_ struct { - Jobs *KubeResourceList_Jobs `protobuf:"bytes,6,opt,name=jobs,oneof"` + Jobs *KubeResourceList_Jobs `protobuf:"bytes,4,opt,name=jobs,oneof"` } type KubeResourceList_Namespaces_ struct { - Namespaces *KubeResourceList_Namespaces `protobuf:"bytes,7,opt,name=namespaces,oneof"` + Namespaces *KubeResourceList_Namespaces `protobuf:"bytes,5,opt,name=namespaces,oneof"` } type KubeResourceList_Nodes_ struct { - Nodes *KubeResourceList_Nodes `protobuf:"bytes,8,opt,name=nodes,oneof"` + Nodes *KubeResourceList_Nodes `protobuf:"bytes,6,opt,name=nodes,oneof"` } type KubeResourceList_StatefulSets_ struct { - StatefulSets *KubeResourceList_StatefulSets `protobuf:"bytes,9,opt,name=stateful_sets,json=statefulSets,oneof"` + StatefulSets *KubeResourceList_StatefulSets `protobuf:"bytes,7,opt,name=stateful_sets,json=statefulSets,oneof"` } type KubeResourceList_Pods_ struct { - Pods *KubeResourceList_Pods `protobuf:"bytes,10,opt,name=pods,oneof"` + Pods *KubeResourceList_Pods `protobuf:"bytes,8,opt,name=pods,oneof"` } type KubeResourceList_ReplicaSets_ struct { - ReplicaSets *KubeResourceList_ReplicaSets `protobuf:"bytes,11,opt,name=replica_sets,json=replicaSets,oneof"` + ReplicaSets *KubeResourceList_ReplicaSets `protobuf:"bytes,9,opt,name=replica_sets,json=replicaSets,oneof"` } type KubeResourceList_Services_ struct { - Services *KubeResourceList_Services `protobuf:"bytes,12,opt,name=services,oneof"` + Services *KubeResourceList_Services `protobuf:"bytes,10,opt,name=services,oneof"` } type KubeResourceList_Secrets_ struct { - Secrets *KubeResourceList_Secrets `protobuf:"bytes,13,opt,name=secrets,oneof"` + Secrets *KubeResourceList_Secrets `protobuf:"bytes,11,opt,name=secrets,oneof"` } type KubeResourceList_ReplicationControllers_ struct { - ReplicationControllers *KubeResourceList_ReplicationControllers `protobuf:"bytes,14,opt,name=replication_controllers,json=replicationControllers,oneof"` + ReplicationControllers *KubeResourceList_ReplicationControllers `protobuf:"bytes,12,opt,name=replication_controllers,json=replicationControllers,oneof"` } type KubeResourceList_StorageClasses_ struct { - StorageClasses *KubeResourceList_StorageClasses `protobuf:"bytes,15,opt,name=storage_classes,json=storageClasses,oneof"` + StorageClasses *KubeResourceList_StorageClasses `protobuf:"bytes,13,opt,name=storage_classes,json=storageClasses,oneof"` } type KubeResourceList_PersistentVolumes_ struct { - PersistentVolumes *KubeResourceList_PersistentVolumes `protobuf:"bytes,16,opt,name=persistent_volumes,json=persistentVolumes,oneof"` + PersistentVolumes *KubeResourceList_PersistentVolumes `protobuf:"bytes,14,opt,name=persistent_volumes,json=persistentVolumes,oneof"` } type KubeResourceList_PersistentVolumeClaims_ struct { - PersistentVolumeClaims *KubeResourceList_PersistentVolumeClaims `protobuf:"bytes,17,opt,name=persistent_volume_claims,json=persistentVolumeClaims,oneof"` + PersistentVolumeClaims *KubeResourceList_PersistentVolumeClaims `protobuf:"bytes,15,opt,name=persistent_volume_claims,json=persistentVolumeClaims,oneof"` } type KubeResourceList_Roles_ struct { - Roles *KubeResourceList_Roles `protobuf:"bytes,18,opt,name=roles,oneof"` + Roles *KubeResourceList_Roles `protobuf:"bytes,16,opt,name=roles,oneof"` } type KubeResourceList_ClusterRoles_ struct { - ClusterRoles *KubeResourceList_ClusterRoles `protobuf:"bytes,19,opt,name=cluster_roles,json=clusterRoles,oneof"` + ClusterRoles *KubeResourceList_ClusterRoles `protobuf:"bytes,17,opt,name=cluster_roles,json=clusterRoles,oneof"` } type KubeResourceList_RoleBindings_ struct { - RoleBindings *KubeResourceList_RoleBindings `protobuf:"bytes,20,opt,name=role_bindings,json=roleBindings,oneof"` + RoleBindings *KubeResourceList_RoleBindings `protobuf:"bytes,18,opt,name=role_bindings,json=roleBindings,oneof"` } type KubeResourceList_ClusterRoleBindings_ struct { - ClusterRoleBindings *KubeResourceList_ClusterRoleBindings `protobuf:"bytes,21,opt,name=cluster_role_bindings,json=clusterRoleBindings,oneof"` + ClusterRoleBindings *KubeResourceList_ClusterRoleBindings `protobuf:"bytes,19,opt,name=cluster_role_bindings,json=clusterRoleBindings,oneof"` } type KubeResourceList_Certificates_ struct { - Certificates *KubeResourceList_Certificates `protobuf:"bytes,22,opt,name=certificates,oneof"` + Certificates *KubeResourceList_Certificates `protobuf:"bytes,20,opt,name=certificates,oneof"` } type KubeResourceList_CronJobs_ struct { - CronJobs *KubeResourceList_CronJobs `protobuf:"bytes,23,opt,name=cron_jobs,json=cronJobs,oneof"` + CronJobs *KubeResourceList_CronJobs `protobuf:"bytes,21,opt,name=cron_jobs,json=cronJobs,oneof"` } type KubeResourceList_Restics_ struct { - Restics *KubeResourceList_Restics `protobuf:"bytes,24,opt,name=restics,oneof"` + Restics *KubeResourceList_Restics `protobuf:"bytes,22,opt,name=restics,oneof"` } type KubeResourceList_Postgreses_ struct { - Postgreses *KubeResourceList_Postgreses `protobuf:"bytes,25,opt,name=postgreses,oneof"` + Postgreses *KubeResourceList_Postgreses `protobuf:"bytes,23,opt,name=postgreses,oneof"` } type KubeResourceList_Elasticsearches_ struct { - Elasticsearches *KubeResourceList_Elasticsearches `protobuf:"bytes,26,opt,name=elasticsearches,oneof"` + Elasticsearches *KubeResourceList_Elasticsearches `protobuf:"bytes,24,opt,name=elasticsearches,oneof"` } type KubeResourceList_DormantDatabases_ struct { - DormantDatabases *KubeResourceList_DormantDatabases `protobuf:"bytes,27,opt,name=dormant_databases,json=dormantDatabases,oneof"` + DormantDatabases *KubeResourceList_DormantDatabases `protobuf:"bytes,25,opt,name=dormant_databases,json=dormantDatabases,oneof"` } type KubeResourceList_Snapshots_ struct { - Snapshots *KubeResourceList_Snapshots `protobuf:"bytes,28,opt,name=snapshots,oneof"` + Snapshots *KubeResourceList_Snapshots `protobuf:"bytes,26,opt,name=snapshots,oneof"` } type KubeResourceList_Events_ struct { - Events *KubeResourceList_Events `protobuf:"bytes,29,opt,name=events,oneof"` + Events *KubeResourceList_Events `protobuf:"bytes,27,opt,name=events,oneof"` } type KubeResourceList_Ingresses_ struct { - Ingresses *KubeResourceList_Ingresses `protobuf:"bytes,30,opt,name=ingresses,oneof"` + Ingresses *KubeResourceList_Ingresses `protobuf:"bytes,28,opt,name=ingresses,oneof"` } type KubeResourceList_Prometheuses_ struct { - Prometheuses *KubeResourceList_Prometheuses `protobuf:"bytes,31,opt,name=prometheuses,oneof"` + Prometheuses *KubeResourceList_Prometheuses `protobuf:"bytes,29,opt,name=prometheuses,oneof"` } type KubeResourceList_ServiceMonitors_ struct { - ServiceMonitors *KubeResourceList_ServiceMonitors `protobuf:"bytes,32,opt,name=service_monitors,json=serviceMonitors,oneof"` + ServiceMonitors *KubeResourceList_ServiceMonitors `protobuf:"bytes,30,opt,name=service_monitors,json=serviceMonitors,oneof"` } type KubeResourceList_ClusterAlerts_ struct { - ClusterAlerts *KubeResourceList_ClusterAlerts `protobuf:"bytes,33,opt,name=cluster_alerts,json=clusterAlerts,oneof"` + ClusterAlerts *KubeResourceList_ClusterAlerts `protobuf:"bytes,31,opt,name=cluster_alerts,json=clusterAlerts,oneof"` } type KubeResourceList_NodeAlerts_ struct { - NodeAlerts *KubeResourceList_NodeAlerts `protobuf:"bytes,34,opt,name=node_alerts,json=nodeAlerts,oneof"` + NodeAlerts *KubeResourceList_NodeAlerts `protobuf:"bytes,32,opt,name=node_alerts,json=nodeAlerts,oneof"` } type KubeResourceList_PodAlerts_ struct { - PodAlerts *KubeResourceList_PodAlerts `protobuf:"bytes,35,opt,name=pod_alerts,json=podAlerts,oneof"` + PodAlerts *KubeResourceList_PodAlerts `protobuf:"bytes,33,opt,name=pod_alerts,json=podAlerts,oneof"` } type KubeResourceList_Mysqls_ struct { - Mysqls *KubeResourceList_Mysqls `protobuf:"bytes,36,opt,name=mysqls,oneof"` + Mysqls *KubeResourceList_Mysqls `protobuf:"bytes,34,opt,name=mysqls,oneof"` } type KubeResourceList_Redises_ struct { - Redises *KubeResourceList_Redises `protobuf:"bytes,37,opt,name=redises,oneof"` + Redises *KubeResourceList_Redises `protobuf:"bytes,35,opt,name=redises,oneof"` } type KubeResourceList_Mongodbs_ struct { - Mongodbs *KubeResourceList_Mongodbs `protobuf:"bytes,38,opt,name=mongodbs,oneof"` + Mongodbs *KubeResourceList_Mongodbs `protobuf:"bytes,36,opt,name=mongodbs,oneof"` } type KubeResourceList_Memcacheds_ struct { - Memcacheds *KubeResourceList_Memcacheds `protobuf:"bytes,39,opt,name=memcacheds,oneof"` + Memcacheds *KubeResourceList_Memcacheds `protobuf:"bytes,37,opt,name=memcacheds,oneof"` } type KubeResourceList_Recoveries_ struct { - Recoveries *KubeResourceList_Recoveries `protobuf:"bytes,40,opt,name=recoveries,oneof"` + Recoveries *KubeResourceList_Recoveries `protobuf:"bytes,38,opt,name=recoveries,oneof"` } func (*KubeResourceList_ConfigMaps_) isKubeResourceList_Resource() {} @@ -883,20 +881,6 @@ func (m *KubeResourceList) GetResource() isKubeResourceList_Resource { return nil } -func (m *KubeResourceList) GetApiVersion() string { - if m != nil { - return m.ApiVersion - } - return "" -} - -func (m *KubeResourceList) GetKind() string { - if m != nil { - return m.Kind - } - return "" -} - func (m *KubeResourceList) GetConfigMaps() *KubeResourceList_ConfigMaps { if x, ok := m.GetResource().(*KubeResourceList_ConfigMaps_); ok { return x.ConfigMaps @@ -1212,192 +1196,192 @@ func _KubeResourceList_OneofMarshaler(msg proto.Message, b *proto.Buffer) error // resource switch x := m.Resource.(type) { case *KubeResourceList_ConfigMaps_: - b.EncodeVarint(3<<3 | proto.WireBytes) + b.EncodeVarint(1<<3 | proto.WireBytes) if err := b.EncodeMessage(x.ConfigMaps); err != nil { return err } case *KubeResourceList_DaemonSets_: - b.EncodeVarint(4<<3 | proto.WireBytes) + b.EncodeVarint(2<<3 | proto.WireBytes) if err := b.EncodeMessage(x.DaemonSets); err != nil { return err } case *KubeResourceList_Deployments_: - b.EncodeVarint(5<<3 | proto.WireBytes) + b.EncodeVarint(3<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Deployments); err != nil { return err } case *KubeResourceList_Jobs_: - b.EncodeVarint(6<<3 | proto.WireBytes) + b.EncodeVarint(4<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Jobs); err != nil { return err } case *KubeResourceList_Namespaces_: - b.EncodeVarint(7<<3 | proto.WireBytes) + b.EncodeVarint(5<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Namespaces); err != nil { return err } case *KubeResourceList_Nodes_: - b.EncodeVarint(8<<3 | proto.WireBytes) + b.EncodeVarint(6<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Nodes); err != nil { return err } case *KubeResourceList_StatefulSets_: - b.EncodeVarint(9<<3 | proto.WireBytes) + b.EncodeVarint(7<<3 | proto.WireBytes) if err := b.EncodeMessage(x.StatefulSets); err != nil { return err } case *KubeResourceList_Pods_: - b.EncodeVarint(10<<3 | proto.WireBytes) + b.EncodeVarint(8<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Pods); err != nil { return err } case *KubeResourceList_ReplicaSets_: - b.EncodeVarint(11<<3 | proto.WireBytes) + b.EncodeVarint(9<<3 | proto.WireBytes) if err := b.EncodeMessage(x.ReplicaSets); err != nil { return err } case *KubeResourceList_Services_: - b.EncodeVarint(12<<3 | proto.WireBytes) + b.EncodeVarint(10<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Services); err != nil { return err } case *KubeResourceList_Secrets_: - b.EncodeVarint(13<<3 | proto.WireBytes) + b.EncodeVarint(11<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Secrets); err != nil { return err } case *KubeResourceList_ReplicationControllers_: - b.EncodeVarint(14<<3 | proto.WireBytes) + b.EncodeVarint(12<<3 | proto.WireBytes) if err := b.EncodeMessage(x.ReplicationControllers); err != nil { return err } case *KubeResourceList_StorageClasses_: - b.EncodeVarint(15<<3 | proto.WireBytes) + b.EncodeVarint(13<<3 | proto.WireBytes) if err := b.EncodeMessage(x.StorageClasses); err != nil { return err } case *KubeResourceList_PersistentVolumes_: - b.EncodeVarint(16<<3 | proto.WireBytes) + b.EncodeVarint(14<<3 | proto.WireBytes) if err := b.EncodeMessage(x.PersistentVolumes); err != nil { return err } case *KubeResourceList_PersistentVolumeClaims_: - b.EncodeVarint(17<<3 | proto.WireBytes) + b.EncodeVarint(15<<3 | proto.WireBytes) if err := b.EncodeMessage(x.PersistentVolumeClaims); err != nil { return err } case *KubeResourceList_Roles_: - b.EncodeVarint(18<<3 | proto.WireBytes) + b.EncodeVarint(16<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Roles); err != nil { return err } case *KubeResourceList_ClusterRoles_: - b.EncodeVarint(19<<3 | proto.WireBytes) + b.EncodeVarint(17<<3 | proto.WireBytes) if err := b.EncodeMessage(x.ClusterRoles); err != nil { return err } case *KubeResourceList_RoleBindings_: - b.EncodeVarint(20<<3 | proto.WireBytes) + b.EncodeVarint(18<<3 | proto.WireBytes) if err := b.EncodeMessage(x.RoleBindings); err != nil { return err } case *KubeResourceList_ClusterRoleBindings_: - b.EncodeVarint(21<<3 | proto.WireBytes) + b.EncodeVarint(19<<3 | proto.WireBytes) if err := b.EncodeMessage(x.ClusterRoleBindings); err != nil { return err } case *KubeResourceList_Certificates_: - b.EncodeVarint(22<<3 | proto.WireBytes) + b.EncodeVarint(20<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Certificates); err != nil { return err } case *KubeResourceList_CronJobs_: - b.EncodeVarint(23<<3 | proto.WireBytes) + b.EncodeVarint(21<<3 | proto.WireBytes) if err := b.EncodeMessage(x.CronJobs); err != nil { return err } case *KubeResourceList_Restics_: - b.EncodeVarint(24<<3 | proto.WireBytes) + b.EncodeVarint(22<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Restics); err != nil { return err } case *KubeResourceList_Postgreses_: - b.EncodeVarint(25<<3 | proto.WireBytes) + b.EncodeVarint(23<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Postgreses); err != nil { return err } case *KubeResourceList_Elasticsearches_: - b.EncodeVarint(26<<3 | proto.WireBytes) + b.EncodeVarint(24<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Elasticsearches); err != nil { return err } case *KubeResourceList_DormantDatabases_: - b.EncodeVarint(27<<3 | proto.WireBytes) + b.EncodeVarint(25<<3 | proto.WireBytes) if err := b.EncodeMessage(x.DormantDatabases); err != nil { return err } case *KubeResourceList_Snapshots_: - b.EncodeVarint(28<<3 | proto.WireBytes) + b.EncodeVarint(26<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Snapshots); err != nil { return err } case *KubeResourceList_Events_: - b.EncodeVarint(29<<3 | proto.WireBytes) + b.EncodeVarint(27<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Events); err != nil { return err } case *KubeResourceList_Ingresses_: - b.EncodeVarint(30<<3 | proto.WireBytes) + b.EncodeVarint(28<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Ingresses); err != nil { return err } case *KubeResourceList_Prometheuses_: - b.EncodeVarint(31<<3 | proto.WireBytes) + b.EncodeVarint(29<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Prometheuses); err != nil { return err } case *KubeResourceList_ServiceMonitors_: - b.EncodeVarint(32<<3 | proto.WireBytes) + b.EncodeVarint(30<<3 | proto.WireBytes) if err := b.EncodeMessage(x.ServiceMonitors); err != nil { return err } case *KubeResourceList_ClusterAlerts_: - b.EncodeVarint(33<<3 | proto.WireBytes) + b.EncodeVarint(31<<3 | proto.WireBytes) if err := b.EncodeMessage(x.ClusterAlerts); err != nil { return err } case *KubeResourceList_NodeAlerts_: - b.EncodeVarint(34<<3 | proto.WireBytes) + b.EncodeVarint(32<<3 | proto.WireBytes) if err := b.EncodeMessage(x.NodeAlerts); err != nil { return err } case *KubeResourceList_PodAlerts_: - b.EncodeVarint(35<<3 | proto.WireBytes) + b.EncodeVarint(33<<3 | proto.WireBytes) if err := b.EncodeMessage(x.PodAlerts); err != nil { return err } case *KubeResourceList_Mysqls_: - b.EncodeVarint(36<<3 | proto.WireBytes) + b.EncodeVarint(34<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Mysqls); err != nil { return err } case *KubeResourceList_Redises_: - b.EncodeVarint(37<<3 | proto.WireBytes) + b.EncodeVarint(35<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Redises); err != nil { return err } case *KubeResourceList_Mongodbs_: - b.EncodeVarint(38<<3 | proto.WireBytes) + b.EncodeVarint(36<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Mongodbs); err != nil { return err } case *KubeResourceList_Memcacheds_: - b.EncodeVarint(39<<3 | proto.WireBytes) + b.EncodeVarint(37<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Memcacheds); err != nil { return err } case *KubeResourceList_Recoveries_: - b.EncodeVarint(40<<3 | proto.WireBytes) + b.EncodeVarint(38<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Recoveries); err != nil { return err } @@ -1411,7 +1395,7 @@ func _KubeResourceList_OneofMarshaler(msg proto.Message, b *proto.Buffer) error func _KubeResourceList_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { m := msg.(*KubeResourceList) switch tag { - case 3: // resource.config_maps + case 1: // resource.config_maps if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -1419,7 +1403,7 @@ func _KubeResourceList_OneofUnmarshaler(msg proto.Message, tag, wire int, b *pro err := b.DecodeMessage(msg) m.Resource = &KubeResourceList_ConfigMaps_{msg} return true, err - case 4: // resource.daemon_sets + case 2: // resource.daemon_sets if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -1427,7 +1411,7 @@ func _KubeResourceList_OneofUnmarshaler(msg proto.Message, tag, wire int, b *pro err := b.DecodeMessage(msg) m.Resource = &KubeResourceList_DaemonSets_{msg} return true, err - case 5: // resource.deployments + case 3: // resource.deployments if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -1435,7 +1419,7 @@ func _KubeResourceList_OneofUnmarshaler(msg proto.Message, tag, wire int, b *pro err := b.DecodeMessage(msg) m.Resource = &KubeResourceList_Deployments_{msg} return true, err - case 6: // resource.jobs + case 4: // resource.jobs if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -1443,7 +1427,7 @@ func _KubeResourceList_OneofUnmarshaler(msg proto.Message, tag, wire int, b *pro err := b.DecodeMessage(msg) m.Resource = &KubeResourceList_Jobs_{msg} return true, err - case 7: // resource.namespaces + case 5: // resource.namespaces if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -1451,7 +1435,7 @@ func _KubeResourceList_OneofUnmarshaler(msg proto.Message, tag, wire int, b *pro err := b.DecodeMessage(msg) m.Resource = &KubeResourceList_Namespaces_{msg} return true, err - case 8: // resource.nodes + case 6: // resource.nodes if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -1459,7 +1443,7 @@ func _KubeResourceList_OneofUnmarshaler(msg proto.Message, tag, wire int, b *pro err := b.DecodeMessage(msg) m.Resource = &KubeResourceList_Nodes_{msg} return true, err - case 9: // resource.stateful_sets + case 7: // resource.stateful_sets if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -1467,7 +1451,7 @@ func _KubeResourceList_OneofUnmarshaler(msg proto.Message, tag, wire int, b *pro err := b.DecodeMessage(msg) m.Resource = &KubeResourceList_StatefulSets_{msg} return true, err - case 10: // resource.pods + case 8: // resource.pods if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -1475,7 +1459,7 @@ func _KubeResourceList_OneofUnmarshaler(msg proto.Message, tag, wire int, b *pro err := b.DecodeMessage(msg) m.Resource = &KubeResourceList_Pods_{msg} return true, err - case 11: // resource.replica_sets + case 9: // resource.replica_sets if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -1483,7 +1467,7 @@ func _KubeResourceList_OneofUnmarshaler(msg proto.Message, tag, wire int, b *pro err := b.DecodeMessage(msg) m.Resource = &KubeResourceList_ReplicaSets_{msg} return true, err - case 12: // resource.services + case 10: // resource.services if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -1491,7 +1475,7 @@ func _KubeResourceList_OneofUnmarshaler(msg proto.Message, tag, wire int, b *pro err := b.DecodeMessage(msg) m.Resource = &KubeResourceList_Services_{msg} return true, err - case 13: // resource.secrets + case 11: // resource.secrets if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -1499,7 +1483,7 @@ func _KubeResourceList_OneofUnmarshaler(msg proto.Message, tag, wire int, b *pro err := b.DecodeMessage(msg) m.Resource = &KubeResourceList_Secrets_{msg} return true, err - case 14: // resource.replication_controllers + case 12: // resource.replication_controllers if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -1507,7 +1491,7 @@ func _KubeResourceList_OneofUnmarshaler(msg proto.Message, tag, wire int, b *pro err := b.DecodeMessage(msg) m.Resource = &KubeResourceList_ReplicationControllers_{msg} return true, err - case 15: // resource.storage_classes + case 13: // resource.storage_classes if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -1515,7 +1499,7 @@ func _KubeResourceList_OneofUnmarshaler(msg proto.Message, tag, wire int, b *pro err := b.DecodeMessage(msg) m.Resource = &KubeResourceList_StorageClasses_{msg} return true, err - case 16: // resource.persistent_volumes + case 14: // resource.persistent_volumes if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -1523,7 +1507,7 @@ func _KubeResourceList_OneofUnmarshaler(msg proto.Message, tag, wire int, b *pro err := b.DecodeMessage(msg) m.Resource = &KubeResourceList_PersistentVolumes_{msg} return true, err - case 17: // resource.persistent_volume_claims + case 15: // resource.persistent_volume_claims if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -1531,7 +1515,7 @@ func _KubeResourceList_OneofUnmarshaler(msg proto.Message, tag, wire int, b *pro err := b.DecodeMessage(msg) m.Resource = &KubeResourceList_PersistentVolumeClaims_{msg} return true, err - case 18: // resource.roles + case 16: // resource.roles if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -1539,7 +1523,7 @@ func _KubeResourceList_OneofUnmarshaler(msg proto.Message, tag, wire int, b *pro err := b.DecodeMessage(msg) m.Resource = &KubeResourceList_Roles_{msg} return true, err - case 19: // resource.cluster_roles + case 17: // resource.cluster_roles if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -1547,7 +1531,7 @@ func _KubeResourceList_OneofUnmarshaler(msg proto.Message, tag, wire int, b *pro err := b.DecodeMessage(msg) m.Resource = &KubeResourceList_ClusterRoles_{msg} return true, err - case 20: // resource.role_bindings + case 18: // resource.role_bindings if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -1555,7 +1539,7 @@ func _KubeResourceList_OneofUnmarshaler(msg proto.Message, tag, wire int, b *pro err := b.DecodeMessage(msg) m.Resource = &KubeResourceList_RoleBindings_{msg} return true, err - case 21: // resource.cluster_role_bindings + case 19: // resource.cluster_role_bindings if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -1563,7 +1547,7 @@ func _KubeResourceList_OneofUnmarshaler(msg proto.Message, tag, wire int, b *pro err := b.DecodeMessage(msg) m.Resource = &KubeResourceList_ClusterRoleBindings_{msg} return true, err - case 22: // resource.certificates + case 20: // resource.certificates if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -1571,7 +1555,7 @@ func _KubeResourceList_OneofUnmarshaler(msg proto.Message, tag, wire int, b *pro err := b.DecodeMessage(msg) m.Resource = &KubeResourceList_Certificates_{msg} return true, err - case 23: // resource.cron_jobs + case 21: // resource.cron_jobs if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -1579,7 +1563,7 @@ func _KubeResourceList_OneofUnmarshaler(msg proto.Message, tag, wire int, b *pro err := b.DecodeMessage(msg) m.Resource = &KubeResourceList_CronJobs_{msg} return true, err - case 24: // resource.restics + case 22: // resource.restics if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -1587,7 +1571,7 @@ func _KubeResourceList_OneofUnmarshaler(msg proto.Message, tag, wire int, b *pro err := b.DecodeMessage(msg) m.Resource = &KubeResourceList_Restics_{msg} return true, err - case 25: // resource.postgreses + case 23: // resource.postgreses if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -1595,7 +1579,7 @@ func _KubeResourceList_OneofUnmarshaler(msg proto.Message, tag, wire int, b *pro err := b.DecodeMessage(msg) m.Resource = &KubeResourceList_Postgreses_{msg} return true, err - case 26: // resource.elasticsearches + case 24: // resource.elasticsearches if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -1603,7 +1587,7 @@ func _KubeResourceList_OneofUnmarshaler(msg proto.Message, tag, wire int, b *pro err := b.DecodeMessage(msg) m.Resource = &KubeResourceList_Elasticsearches_{msg} return true, err - case 27: // resource.dormant_databases + case 25: // resource.dormant_databases if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -1611,7 +1595,7 @@ func _KubeResourceList_OneofUnmarshaler(msg proto.Message, tag, wire int, b *pro err := b.DecodeMessage(msg) m.Resource = &KubeResourceList_DormantDatabases_{msg} return true, err - case 28: // resource.snapshots + case 26: // resource.snapshots if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -1619,7 +1603,7 @@ func _KubeResourceList_OneofUnmarshaler(msg proto.Message, tag, wire int, b *pro err := b.DecodeMessage(msg) m.Resource = &KubeResourceList_Snapshots_{msg} return true, err - case 29: // resource.events + case 27: // resource.events if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -1627,7 +1611,7 @@ func _KubeResourceList_OneofUnmarshaler(msg proto.Message, tag, wire int, b *pro err := b.DecodeMessage(msg) m.Resource = &KubeResourceList_Events_{msg} return true, err - case 30: // resource.ingresses + case 28: // resource.ingresses if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -1635,7 +1619,7 @@ func _KubeResourceList_OneofUnmarshaler(msg proto.Message, tag, wire int, b *pro err := b.DecodeMessage(msg) m.Resource = &KubeResourceList_Ingresses_{msg} return true, err - case 31: // resource.prometheuses + case 29: // resource.prometheuses if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -1643,7 +1627,7 @@ func _KubeResourceList_OneofUnmarshaler(msg proto.Message, tag, wire int, b *pro err := b.DecodeMessage(msg) m.Resource = &KubeResourceList_Prometheuses_{msg} return true, err - case 32: // resource.service_monitors + case 30: // resource.service_monitors if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -1651,7 +1635,7 @@ func _KubeResourceList_OneofUnmarshaler(msg proto.Message, tag, wire int, b *pro err := b.DecodeMessage(msg) m.Resource = &KubeResourceList_ServiceMonitors_{msg} return true, err - case 33: // resource.cluster_alerts + case 31: // resource.cluster_alerts if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -1659,7 +1643,7 @@ func _KubeResourceList_OneofUnmarshaler(msg proto.Message, tag, wire int, b *pro err := b.DecodeMessage(msg) m.Resource = &KubeResourceList_ClusterAlerts_{msg} return true, err - case 34: // resource.node_alerts + case 32: // resource.node_alerts if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -1667,7 +1651,7 @@ func _KubeResourceList_OneofUnmarshaler(msg proto.Message, tag, wire int, b *pro err := b.DecodeMessage(msg) m.Resource = &KubeResourceList_NodeAlerts_{msg} return true, err - case 35: // resource.pod_alerts + case 33: // resource.pod_alerts if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -1675,7 +1659,7 @@ func _KubeResourceList_OneofUnmarshaler(msg proto.Message, tag, wire int, b *pro err := b.DecodeMessage(msg) m.Resource = &KubeResourceList_PodAlerts_{msg} return true, err - case 36: // resource.mysqls + case 34: // resource.mysqls if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -1683,7 +1667,7 @@ func _KubeResourceList_OneofUnmarshaler(msg proto.Message, tag, wire int, b *pro err := b.DecodeMessage(msg) m.Resource = &KubeResourceList_Mysqls_{msg} return true, err - case 37: // resource.redises + case 35: // resource.redises if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -1691,7 +1675,7 @@ func _KubeResourceList_OneofUnmarshaler(msg proto.Message, tag, wire int, b *pro err := b.DecodeMessage(msg) m.Resource = &KubeResourceList_Redises_{msg} return true, err - case 38: // resource.mongodbs + case 36: // resource.mongodbs if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -1699,7 +1683,7 @@ func _KubeResourceList_OneofUnmarshaler(msg proto.Message, tag, wire int, b *pro err := b.DecodeMessage(msg) m.Resource = &KubeResourceList_Mongodbs_{msg} return true, err - case 39: // resource.memcacheds + case 37: // resource.memcacheds if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -1707,7 +1691,7 @@ func _KubeResourceList_OneofUnmarshaler(msg proto.Message, tag, wire int, b *pro err := b.DecodeMessage(msg) m.Resource = &KubeResourceList_Memcacheds_{msg} return true, err - case 40: // resource.recoveries + case 38: // resource.recoveries if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -1726,192 +1710,192 @@ func _KubeResourceList_OneofSizer(msg proto.Message) (n int) { switch x := m.Resource.(type) { case *KubeResourceList_ConfigMaps_: s := proto.Size(x.ConfigMaps) - n += proto.SizeVarint(3<<3 | proto.WireBytes) + n += proto.SizeVarint(1<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResourceList_DaemonSets_: s := proto.Size(x.DaemonSets) - n += proto.SizeVarint(4<<3 | proto.WireBytes) + n += proto.SizeVarint(2<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResourceList_Deployments_: s := proto.Size(x.Deployments) - n += proto.SizeVarint(5<<3 | proto.WireBytes) + n += proto.SizeVarint(3<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResourceList_Jobs_: s := proto.Size(x.Jobs) - n += proto.SizeVarint(6<<3 | proto.WireBytes) + n += proto.SizeVarint(4<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResourceList_Namespaces_: s := proto.Size(x.Namespaces) - n += proto.SizeVarint(7<<3 | proto.WireBytes) + n += proto.SizeVarint(5<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResourceList_Nodes_: s := proto.Size(x.Nodes) - n += proto.SizeVarint(8<<3 | proto.WireBytes) + n += proto.SizeVarint(6<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResourceList_StatefulSets_: s := proto.Size(x.StatefulSets) - n += proto.SizeVarint(9<<3 | proto.WireBytes) + n += proto.SizeVarint(7<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResourceList_Pods_: s := proto.Size(x.Pods) - n += proto.SizeVarint(10<<3 | proto.WireBytes) + n += proto.SizeVarint(8<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResourceList_ReplicaSets_: s := proto.Size(x.ReplicaSets) - n += proto.SizeVarint(11<<3 | proto.WireBytes) + n += proto.SizeVarint(9<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResourceList_Services_: s := proto.Size(x.Services) - n += proto.SizeVarint(12<<3 | proto.WireBytes) + n += proto.SizeVarint(10<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResourceList_Secrets_: s := proto.Size(x.Secrets) - n += proto.SizeVarint(13<<3 | proto.WireBytes) + n += proto.SizeVarint(11<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResourceList_ReplicationControllers_: s := proto.Size(x.ReplicationControllers) - n += proto.SizeVarint(14<<3 | proto.WireBytes) + n += proto.SizeVarint(12<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResourceList_StorageClasses_: s := proto.Size(x.StorageClasses) - n += proto.SizeVarint(15<<3 | proto.WireBytes) + n += proto.SizeVarint(13<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResourceList_PersistentVolumes_: s := proto.Size(x.PersistentVolumes) - n += proto.SizeVarint(16<<3 | proto.WireBytes) + n += proto.SizeVarint(14<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResourceList_PersistentVolumeClaims_: s := proto.Size(x.PersistentVolumeClaims) - n += proto.SizeVarint(17<<3 | proto.WireBytes) + n += proto.SizeVarint(15<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResourceList_Roles_: s := proto.Size(x.Roles) - n += proto.SizeVarint(18<<3 | proto.WireBytes) + n += proto.SizeVarint(16<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResourceList_ClusterRoles_: s := proto.Size(x.ClusterRoles) - n += proto.SizeVarint(19<<3 | proto.WireBytes) + n += proto.SizeVarint(17<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResourceList_RoleBindings_: s := proto.Size(x.RoleBindings) - n += proto.SizeVarint(20<<3 | proto.WireBytes) + n += proto.SizeVarint(18<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResourceList_ClusterRoleBindings_: s := proto.Size(x.ClusterRoleBindings) - n += proto.SizeVarint(21<<3 | proto.WireBytes) + n += proto.SizeVarint(19<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResourceList_Certificates_: s := proto.Size(x.Certificates) - n += proto.SizeVarint(22<<3 | proto.WireBytes) + n += proto.SizeVarint(20<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResourceList_CronJobs_: s := proto.Size(x.CronJobs) - n += proto.SizeVarint(23<<3 | proto.WireBytes) + n += proto.SizeVarint(21<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResourceList_Restics_: s := proto.Size(x.Restics) - n += proto.SizeVarint(24<<3 | proto.WireBytes) + n += proto.SizeVarint(22<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResourceList_Postgreses_: s := proto.Size(x.Postgreses) - n += proto.SizeVarint(25<<3 | proto.WireBytes) + n += proto.SizeVarint(23<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResourceList_Elasticsearches_: s := proto.Size(x.Elasticsearches) - n += proto.SizeVarint(26<<3 | proto.WireBytes) + n += proto.SizeVarint(24<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResourceList_DormantDatabases_: s := proto.Size(x.DormantDatabases) - n += proto.SizeVarint(27<<3 | proto.WireBytes) + n += proto.SizeVarint(25<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResourceList_Snapshots_: s := proto.Size(x.Snapshots) - n += proto.SizeVarint(28<<3 | proto.WireBytes) + n += proto.SizeVarint(26<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResourceList_Events_: s := proto.Size(x.Events) - n += proto.SizeVarint(29<<3 | proto.WireBytes) + n += proto.SizeVarint(27<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResourceList_Ingresses_: s := proto.Size(x.Ingresses) - n += proto.SizeVarint(30<<3 | proto.WireBytes) + n += proto.SizeVarint(28<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResourceList_Prometheuses_: s := proto.Size(x.Prometheuses) - n += proto.SizeVarint(31<<3 | proto.WireBytes) + n += proto.SizeVarint(29<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResourceList_ServiceMonitors_: s := proto.Size(x.ServiceMonitors) - n += proto.SizeVarint(32<<3 | proto.WireBytes) + n += proto.SizeVarint(30<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResourceList_ClusterAlerts_: s := proto.Size(x.ClusterAlerts) - n += proto.SizeVarint(33<<3 | proto.WireBytes) + n += proto.SizeVarint(31<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResourceList_NodeAlerts_: s := proto.Size(x.NodeAlerts) - n += proto.SizeVarint(34<<3 | proto.WireBytes) + n += proto.SizeVarint(32<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResourceList_PodAlerts_: s := proto.Size(x.PodAlerts) - n += proto.SizeVarint(35<<3 | proto.WireBytes) + n += proto.SizeVarint(33<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResourceList_Mysqls_: s := proto.Size(x.Mysqls) - n += proto.SizeVarint(36<<3 | proto.WireBytes) + n += proto.SizeVarint(34<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResourceList_Redises_: s := proto.Size(x.Redises) - n += proto.SizeVarint(37<<3 | proto.WireBytes) + n += proto.SizeVarint(35<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResourceList_Mongodbs_: s := proto.Size(x.Mongodbs) - n += proto.SizeVarint(38<<3 | proto.WireBytes) + n += proto.SizeVarint(36<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResourceList_Memcacheds_: s := proto.Size(x.Memcacheds) - n += proto.SizeVarint(39<<3 | proto.WireBytes) + n += proto.SizeVarint(37<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResourceList_Recoveries_: s := proto.Size(x.Recoveries) - n += proto.SizeVarint(40<<3 | proto.WireBytes) + n += proto.SizeVarint(38<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case nil: @@ -2573,12 +2557,9 @@ func (m *KubeResourceList_ServiceMonitors) GetItems() []*ServiceMonitor { return nil } -// TODO: (@sadlil): when kubernetes moves to protobuf completely import fileds from there. type KubeResource struct { - ApiVersion string `protobuf:"bytes,1,opt,name=api_version,json=apiVersion" json:"api_version,omitempty"` - Kind string `protobuf:"bytes,2,opt,name=kind" json:"kind,omitempty"` - Raw *Raw `protobuf:"bytes,3,opt,name=raw" json:"raw,omitempty"` - Events []*Event `protobuf:"bytes,4,rep,name=events" json:"events,omitempty"` + Raw *Raw `protobuf:"bytes,1,opt,name=raw" json:"raw,omitempty"` + Events []*Event `protobuf:"bytes,2,rep,name=events" json:"events,omitempty"` // Types that are valid to be assigned to Resource: // *KubeResource_ConfigMap // *KubeResource_DaemonSet @@ -2630,115 +2611,115 @@ type isKubeResource_Resource interface { } type KubeResource_ConfigMap struct { - ConfigMap *ConfigMap `protobuf:"bytes,5,opt,name=config_map,json=configMap,oneof"` + ConfigMap *ConfigMap `protobuf:"bytes,3,opt,name=config_map,json=configMap,oneof"` } type KubeResource_DaemonSet struct { - DaemonSet *DaemonSet `protobuf:"bytes,6,opt,name=daemon_set,json=daemonSet,oneof"` + DaemonSet *DaemonSet `protobuf:"bytes,4,opt,name=daemon_set,json=daemonSet,oneof"` } type KubeResource_Deployment struct { - Deployment *Deployment `protobuf:"bytes,7,opt,name=deployment,oneof"` + Deployment *Deployment `protobuf:"bytes,5,opt,name=deployment,oneof"` } type KubeResource_Job struct { - Job *Job `protobuf:"bytes,8,opt,name=job,oneof"` + Job *Job `protobuf:"bytes,6,opt,name=job,oneof"` } type KubeResource_Namespace struct { - Namespace *Namespace `protobuf:"bytes,9,opt,name=namespace,oneof"` + Namespace *Namespace `protobuf:"bytes,7,opt,name=namespace,oneof"` } type KubeResource_Node struct { - Node *Node `protobuf:"bytes,10,opt,name=node,oneof"` + Node *Node `protobuf:"bytes,8,opt,name=node,oneof"` } type KubeResource_StatefulSet struct { - StatefulSet *StatefulSet `protobuf:"bytes,11,opt,name=stateful_set,json=statefulSet,oneof"` + StatefulSet *StatefulSet `protobuf:"bytes,9,opt,name=stateful_set,json=statefulSet,oneof"` } type KubeResource_Pod struct { - Pod *Pod `protobuf:"bytes,12,opt,name=pod,oneof"` + Pod *Pod `protobuf:"bytes,10,opt,name=pod,oneof"` } type KubeResource_ReplicaSet struct { - ReplicaSet *ReplicaSet `protobuf:"bytes,13,opt,name=replica_set,json=replicaSet,oneof"` + ReplicaSet *ReplicaSet `protobuf:"bytes,11,opt,name=replica_set,json=replicaSet,oneof"` } type KubeResource_Service struct { - Service *Service `protobuf:"bytes,14,opt,name=service,oneof"` + Service *Service `protobuf:"bytes,12,opt,name=service,oneof"` } type KubeResource_Secret struct { - Secret *Secret `protobuf:"bytes,15,opt,name=secret,oneof"` + Secret *Secret `protobuf:"bytes,13,opt,name=secret,oneof"` } type KubeResource_ReplicationController struct { - ReplicationController *ReplicationController `protobuf:"bytes,16,opt,name=replication_controller,json=replicationController,oneof"` + ReplicationController *ReplicationController `protobuf:"bytes,14,opt,name=replication_controller,json=replicationController,oneof"` } type KubeResource_StorageClass struct { - StorageClass *StorageClass `protobuf:"bytes,17,opt,name=storage_class,json=storageClass,oneof"` + StorageClass *StorageClass `protobuf:"bytes,15,opt,name=storage_class,json=storageClass,oneof"` } type KubeResource_PersistentVolume struct { - PersistentVolume *PersistentVolume `protobuf:"bytes,18,opt,name=persistent_volume,json=persistentVolume,oneof"` + PersistentVolume *PersistentVolume `protobuf:"bytes,16,opt,name=persistent_volume,json=persistentVolume,oneof"` } type KubeResource_PersistentVolumeClaim struct { - PersistentVolumeClaim *PersistentVolumeClaim `protobuf:"bytes,19,opt,name=persistent_volume_claim,json=persistentVolumeClaim,oneof"` + PersistentVolumeClaim *PersistentVolumeClaim `protobuf:"bytes,17,opt,name=persistent_volume_claim,json=persistentVolumeClaim,oneof"` } type KubeResource_Role struct { - Role *Role `protobuf:"bytes,20,opt,name=role,oneof"` + Role *Role `protobuf:"bytes,18,opt,name=role,oneof"` } type KubeResource_ClusterRole struct { - ClusterRole *ClusterRole `protobuf:"bytes,21,opt,name=cluster_role,json=clusterRole,oneof"` + ClusterRole *ClusterRole `protobuf:"bytes,19,opt,name=cluster_role,json=clusterRole,oneof"` } type KubeResource_RoleBinding struct { - RoleBinding *RoleBinding `protobuf:"bytes,22,opt,name=role_binding,json=roleBinding,oneof"` + RoleBinding *RoleBinding `protobuf:"bytes,20,opt,name=role_binding,json=roleBinding,oneof"` } type KubeResource_ClusterRoleBinding struct { - ClusterRoleBinding *ClusterRoleBinding `protobuf:"bytes,23,opt,name=cluster_role_binding,json=clusterRoleBinding,oneof"` + ClusterRoleBinding *ClusterRoleBinding `protobuf:"bytes,21,opt,name=cluster_role_binding,json=clusterRoleBinding,oneof"` } type KubeResource_Certificate struct { - Certificate *Certificate `protobuf:"bytes,24,opt,name=certificate,oneof"` + Certificate *Certificate `protobuf:"bytes,22,opt,name=certificate,oneof"` } type KubeResource_CronJob struct { - CronJob *CronJob `protobuf:"bytes,25,opt,name=cron_job,json=cronJob,oneof"` + CronJob *CronJob `protobuf:"bytes,23,opt,name=cron_job,json=cronJob,oneof"` } type KubeResource_Restic struct { - Restic *Restic `protobuf:"bytes,26,opt,name=restic,oneof"` + Restic *Restic `protobuf:"bytes,24,opt,name=restic,oneof"` } type KubeResource_Postgres struct { - Postgres *Postgres `protobuf:"bytes,27,opt,name=postgres,oneof"` + Postgres *Postgres `protobuf:"bytes,25,opt,name=postgres,oneof"` } type KubeResource_Elasticsearch struct { - Elasticsearch *Elasticsearch `protobuf:"bytes,28,opt,name=elasticsearch,oneof"` + Elasticsearch *Elasticsearch `protobuf:"bytes,26,opt,name=elasticsearch,oneof"` } type KubeResource_DormantDatabase struct { - DormantDatabase *DormantDatabase `protobuf:"bytes,29,opt,name=dormant_database,json=dormantDatabase,oneof"` + DormantDatabase *DormantDatabase `protobuf:"bytes,27,opt,name=dormant_database,json=dormantDatabase,oneof"` } type KubeResource_Snapshot struct { - Snapshot *Snapshot `protobuf:"bytes,30,opt,name=snapshot,oneof"` + Snapshot *Snapshot `protobuf:"bytes,28,opt,name=snapshot,oneof"` } type KubeResource_Ingress struct { - Ingress *Ingress `protobuf:"bytes,31,opt,name=ingress,oneof"` + Ingress *Ingress `protobuf:"bytes,29,opt,name=ingress,oneof"` } type KubeResource_Prometheus struct { - Prometheus *Prometheus `protobuf:"bytes,32,opt,name=prometheus,oneof"` + Prometheus *Prometheus `protobuf:"bytes,30,opt,name=prometheus,oneof"` } type KubeResource_ServiceMonitors struct { - ServiceMonitors *ServiceMonitor `protobuf:"bytes,33,opt,name=service_monitors,json=serviceMonitors,oneof"` + ServiceMonitors *ServiceMonitor `protobuf:"bytes,31,opt,name=service_monitors,json=serviceMonitors,oneof"` } type KubeResource_ClusterAlert struct { - ClusterAlert *ClusterAlert `protobuf:"bytes,34,opt,name=cluster_alert,json=clusterAlert,oneof"` + ClusterAlert *ClusterAlert `protobuf:"bytes,32,opt,name=cluster_alert,json=clusterAlert,oneof"` } type KubeResource_NodeAlert struct { - NodeAlert *NodeAlert `protobuf:"bytes,35,opt,name=node_alert,json=nodeAlert,oneof"` + NodeAlert *NodeAlert `protobuf:"bytes,33,opt,name=node_alert,json=nodeAlert,oneof"` } type KubeResource_PodAlert struct { - PodAlert *PodAlert `protobuf:"bytes,36,opt,name=pod_alert,json=podAlert,oneof"` + PodAlert *PodAlert `protobuf:"bytes,34,opt,name=pod_alert,json=podAlert,oneof"` } type KubeResource_Mysql struct { - Mysql *Mysql `protobuf:"bytes,37,opt,name=mysql,oneof"` + Mysql *Mysql `protobuf:"bytes,35,opt,name=mysql,oneof"` } type KubeResource_Redis struct { - Redis *Redis `protobuf:"bytes,38,opt,name=redis,oneof"` + Redis *Redis `protobuf:"bytes,36,opt,name=redis,oneof"` } type KubeResource_Mongodb struct { - Mongodb *Mongodb `protobuf:"bytes,39,opt,name=mongodb,oneof"` + Mongodb *Mongodb `protobuf:"bytes,37,opt,name=mongodb,oneof"` } type KubeResource_Memcached struct { - Memcached *Memcached `protobuf:"bytes,40,opt,name=memcached,oneof"` + Memcached *Memcached `protobuf:"bytes,38,opt,name=memcached,oneof"` } type KubeResource_Recovery struct { - Recovery *Recovery `protobuf:"bytes,41,opt,name=recovery,oneof"` + Recovery *Recovery `protobuf:"bytes,39,opt,name=recovery,oneof"` } func (*KubeResource_ConfigMap) isKubeResource_Resource() {} @@ -2786,20 +2767,6 @@ func (m *KubeResource) GetResource() isKubeResource_Resource { return nil } -func (m *KubeResource) GetApiVersion() string { - if m != nil { - return m.ApiVersion - } - return "" -} - -func (m *KubeResource) GetKind() string { - if m != nil { - return m.Kind - } - return "" -} - func (m *KubeResource) GetRaw() *Raw { if m != nil { return m.Raw @@ -3121,187 +3088,187 @@ func _KubeResource_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { // resource switch x := m.Resource.(type) { case *KubeResource_ConfigMap: - b.EncodeVarint(5<<3 | proto.WireBytes) + b.EncodeVarint(3<<3 | proto.WireBytes) if err := b.EncodeMessage(x.ConfigMap); err != nil { return err } case *KubeResource_DaemonSet: - b.EncodeVarint(6<<3 | proto.WireBytes) + b.EncodeVarint(4<<3 | proto.WireBytes) if err := b.EncodeMessage(x.DaemonSet); err != nil { return err } case *KubeResource_Deployment: - b.EncodeVarint(7<<3 | proto.WireBytes) + b.EncodeVarint(5<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Deployment); err != nil { return err } case *KubeResource_Job: - b.EncodeVarint(8<<3 | proto.WireBytes) + b.EncodeVarint(6<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Job); err != nil { return err } case *KubeResource_Namespace: - b.EncodeVarint(9<<3 | proto.WireBytes) + b.EncodeVarint(7<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Namespace); err != nil { return err } case *KubeResource_Node: - b.EncodeVarint(10<<3 | proto.WireBytes) + b.EncodeVarint(8<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Node); err != nil { return err } case *KubeResource_StatefulSet: - b.EncodeVarint(11<<3 | proto.WireBytes) + b.EncodeVarint(9<<3 | proto.WireBytes) if err := b.EncodeMessage(x.StatefulSet); err != nil { return err } case *KubeResource_Pod: - b.EncodeVarint(12<<3 | proto.WireBytes) + b.EncodeVarint(10<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Pod); err != nil { return err } case *KubeResource_ReplicaSet: - b.EncodeVarint(13<<3 | proto.WireBytes) + b.EncodeVarint(11<<3 | proto.WireBytes) if err := b.EncodeMessage(x.ReplicaSet); err != nil { return err } case *KubeResource_Service: - b.EncodeVarint(14<<3 | proto.WireBytes) + b.EncodeVarint(12<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Service); err != nil { return err } case *KubeResource_Secret: - b.EncodeVarint(15<<3 | proto.WireBytes) + b.EncodeVarint(13<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Secret); err != nil { return err } case *KubeResource_ReplicationController: - b.EncodeVarint(16<<3 | proto.WireBytes) + b.EncodeVarint(14<<3 | proto.WireBytes) if err := b.EncodeMessage(x.ReplicationController); err != nil { return err } case *KubeResource_StorageClass: - b.EncodeVarint(17<<3 | proto.WireBytes) + b.EncodeVarint(15<<3 | proto.WireBytes) if err := b.EncodeMessage(x.StorageClass); err != nil { return err } case *KubeResource_PersistentVolume: - b.EncodeVarint(18<<3 | proto.WireBytes) + b.EncodeVarint(16<<3 | proto.WireBytes) if err := b.EncodeMessage(x.PersistentVolume); err != nil { return err } case *KubeResource_PersistentVolumeClaim: - b.EncodeVarint(19<<3 | proto.WireBytes) + b.EncodeVarint(17<<3 | proto.WireBytes) if err := b.EncodeMessage(x.PersistentVolumeClaim); err != nil { return err } case *KubeResource_Role: - b.EncodeVarint(20<<3 | proto.WireBytes) + b.EncodeVarint(18<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Role); err != nil { return err } case *KubeResource_ClusterRole: - b.EncodeVarint(21<<3 | proto.WireBytes) + b.EncodeVarint(19<<3 | proto.WireBytes) if err := b.EncodeMessage(x.ClusterRole); err != nil { return err } case *KubeResource_RoleBinding: - b.EncodeVarint(22<<3 | proto.WireBytes) + b.EncodeVarint(20<<3 | proto.WireBytes) if err := b.EncodeMessage(x.RoleBinding); err != nil { return err } case *KubeResource_ClusterRoleBinding: - b.EncodeVarint(23<<3 | proto.WireBytes) + b.EncodeVarint(21<<3 | proto.WireBytes) if err := b.EncodeMessage(x.ClusterRoleBinding); err != nil { return err } case *KubeResource_Certificate: - b.EncodeVarint(24<<3 | proto.WireBytes) + b.EncodeVarint(22<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Certificate); err != nil { return err } case *KubeResource_CronJob: - b.EncodeVarint(25<<3 | proto.WireBytes) + b.EncodeVarint(23<<3 | proto.WireBytes) if err := b.EncodeMessage(x.CronJob); err != nil { return err } case *KubeResource_Restic: - b.EncodeVarint(26<<3 | proto.WireBytes) + b.EncodeVarint(24<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Restic); err != nil { return err } case *KubeResource_Postgres: - b.EncodeVarint(27<<3 | proto.WireBytes) + b.EncodeVarint(25<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Postgres); err != nil { return err } case *KubeResource_Elasticsearch: - b.EncodeVarint(28<<3 | proto.WireBytes) + b.EncodeVarint(26<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Elasticsearch); err != nil { return err } case *KubeResource_DormantDatabase: - b.EncodeVarint(29<<3 | proto.WireBytes) + b.EncodeVarint(27<<3 | proto.WireBytes) if err := b.EncodeMessage(x.DormantDatabase); err != nil { return err } case *KubeResource_Snapshot: - b.EncodeVarint(30<<3 | proto.WireBytes) + b.EncodeVarint(28<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Snapshot); err != nil { return err } case *KubeResource_Ingress: - b.EncodeVarint(31<<3 | proto.WireBytes) + b.EncodeVarint(29<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Ingress); err != nil { return err } case *KubeResource_Prometheus: - b.EncodeVarint(32<<3 | proto.WireBytes) + b.EncodeVarint(30<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Prometheus); err != nil { return err } case *KubeResource_ServiceMonitors: - b.EncodeVarint(33<<3 | proto.WireBytes) + b.EncodeVarint(31<<3 | proto.WireBytes) if err := b.EncodeMessage(x.ServiceMonitors); err != nil { return err } case *KubeResource_ClusterAlert: - b.EncodeVarint(34<<3 | proto.WireBytes) + b.EncodeVarint(32<<3 | proto.WireBytes) if err := b.EncodeMessage(x.ClusterAlert); err != nil { return err } case *KubeResource_NodeAlert: - b.EncodeVarint(35<<3 | proto.WireBytes) + b.EncodeVarint(33<<3 | proto.WireBytes) if err := b.EncodeMessage(x.NodeAlert); err != nil { return err } case *KubeResource_PodAlert: - b.EncodeVarint(36<<3 | proto.WireBytes) + b.EncodeVarint(34<<3 | proto.WireBytes) if err := b.EncodeMessage(x.PodAlert); err != nil { return err } case *KubeResource_Mysql: - b.EncodeVarint(37<<3 | proto.WireBytes) + b.EncodeVarint(35<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Mysql); err != nil { return err } case *KubeResource_Redis: - b.EncodeVarint(38<<3 | proto.WireBytes) + b.EncodeVarint(36<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Redis); err != nil { return err } case *KubeResource_Mongodb: - b.EncodeVarint(39<<3 | proto.WireBytes) + b.EncodeVarint(37<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Mongodb); err != nil { return err } case *KubeResource_Memcached: - b.EncodeVarint(40<<3 | proto.WireBytes) + b.EncodeVarint(38<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Memcached); err != nil { return err } case *KubeResource_Recovery: - b.EncodeVarint(41<<3 | proto.WireBytes) + b.EncodeVarint(39<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Recovery); err != nil { return err } @@ -3315,7 +3282,7 @@ func _KubeResource_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { func _KubeResource_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { m := msg.(*KubeResource) switch tag { - case 5: // resource.config_map + case 3: // resource.config_map if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -3323,7 +3290,7 @@ func _KubeResource_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.B err := b.DecodeMessage(msg) m.Resource = &KubeResource_ConfigMap{msg} return true, err - case 6: // resource.daemon_set + case 4: // resource.daemon_set if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -3331,7 +3298,7 @@ func _KubeResource_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.B err := b.DecodeMessage(msg) m.Resource = &KubeResource_DaemonSet{msg} return true, err - case 7: // resource.deployment + case 5: // resource.deployment if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -3339,7 +3306,7 @@ func _KubeResource_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.B err := b.DecodeMessage(msg) m.Resource = &KubeResource_Deployment{msg} return true, err - case 8: // resource.job + case 6: // resource.job if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -3347,7 +3314,7 @@ func _KubeResource_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.B err := b.DecodeMessage(msg) m.Resource = &KubeResource_Job{msg} return true, err - case 9: // resource.namespace + case 7: // resource.namespace if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -3355,7 +3322,7 @@ func _KubeResource_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.B err := b.DecodeMessage(msg) m.Resource = &KubeResource_Namespace{msg} return true, err - case 10: // resource.node + case 8: // resource.node if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -3363,7 +3330,7 @@ func _KubeResource_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.B err := b.DecodeMessage(msg) m.Resource = &KubeResource_Node{msg} return true, err - case 11: // resource.stateful_set + case 9: // resource.stateful_set if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -3371,7 +3338,7 @@ func _KubeResource_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.B err := b.DecodeMessage(msg) m.Resource = &KubeResource_StatefulSet{msg} return true, err - case 12: // resource.pod + case 10: // resource.pod if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -3379,7 +3346,7 @@ func _KubeResource_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.B err := b.DecodeMessage(msg) m.Resource = &KubeResource_Pod{msg} return true, err - case 13: // resource.replica_set + case 11: // resource.replica_set if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -3387,7 +3354,7 @@ func _KubeResource_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.B err := b.DecodeMessage(msg) m.Resource = &KubeResource_ReplicaSet{msg} return true, err - case 14: // resource.service + case 12: // resource.service if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -3395,7 +3362,7 @@ func _KubeResource_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.B err := b.DecodeMessage(msg) m.Resource = &KubeResource_Service{msg} return true, err - case 15: // resource.secret + case 13: // resource.secret if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -3403,7 +3370,7 @@ func _KubeResource_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.B err := b.DecodeMessage(msg) m.Resource = &KubeResource_Secret{msg} return true, err - case 16: // resource.replication_controller + case 14: // resource.replication_controller if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -3411,7 +3378,7 @@ func _KubeResource_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.B err := b.DecodeMessage(msg) m.Resource = &KubeResource_ReplicationController{msg} return true, err - case 17: // resource.storage_class + case 15: // resource.storage_class if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -3419,7 +3386,7 @@ func _KubeResource_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.B err := b.DecodeMessage(msg) m.Resource = &KubeResource_StorageClass{msg} return true, err - case 18: // resource.persistent_volume + case 16: // resource.persistent_volume if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -3427,7 +3394,7 @@ func _KubeResource_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.B err := b.DecodeMessage(msg) m.Resource = &KubeResource_PersistentVolume{msg} return true, err - case 19: // resource.persistent_volume_claim + case 17: // resource.persistent_volume_claim if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -3435,7 +3402,7 @@ func _KubeResource_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.B err := b.DecodeMessage(msg) m.Resource = &KubeResource_PersistentVolumeClaim{msg} return true, err - case 20: // resource.role + case 18: // resource.role if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -3443,7 +3410,7 @@ func _KubeResource_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.B err := b.DecodeMessage(msg) m.Resource = &KubeResource_Role{msg} return true, err - case 21: // resource.cluster_role + case 19: // resource.cluster_role if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -3451,7 +3418,7 @@ func _KubeResource_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.B err := b.DecodeMessage(msg) m.Resource = &KubeResource_ClusterRole{msg} return true, err - case 22: // resource.role_binding + case 20: // resource.role_binding if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -3459,7 +3426,7 @@ func _KubeResource_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.B err := b.DecodeMessage(msg) m.Resource = &KubeResource_RoleBinding{msg} return true, err - case 23: // resource.cluster_role_binding + case 21: // resource.cluster_role_binding if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -3467,7 +3434,7 @@ func _KubeResource_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.B err := b.DecodeMessage(msg) m.Resource = &KubeResource_ClusterRoleBinding{msg} return true, err - case 24: // resource.certificate + case 22: // resource.certificate if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -3475,7 +3442,7 @@ func _KubeResource_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.B err := b.DecodeMessage(msg) m.Resource = &KubeResource_Certificate{msg} return true, err - case 25: // resource.cron_job + case 23: // resource.cron_job if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -3483,7 +3450,7 @@ func _KubeResource_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.B err := b.DecodeMessage(msg) m.Resource = &KubeResource_CronJob{msg} return true, err - case 26: // resource.restic + case 24: // resource.restic if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -3491,7 +3458,7 @@ func _KubeResource_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.B err := b.DecodeMessage(msg) m.Resource = &KubeResource_Restic{msg} return true, err - case 27: // resource.postgres + case 25: // resource.postgres if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -3499,7 +3466,7 @@ func _KubeResource_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.B err := b.DecodeMessage(msg) m.Resource = &KubeResource_Postgres{msg} return true, err - case 28: // resource.elasticsearch + case 26: // resource.elasticsearch if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -3507,7 +3474,7 @@ func _KubeResource_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.B err := b.DecodeMessage(msg) m.Resource = &KubeResource_Elasticsearch{msg} return true, err - case 29: // resource.dormant_database + case 27: // resource.dormant_database if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -3515,7 +3482,7 @@ func _KubeResource_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.B err := b.DecodeMessage(msg) m.Resource = &KubeResource_DormantDatabase{msg} return true, err - case 30: // resource.snapshot + case 28: // resource.snapshot if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -3523,7 +3490,7 @@ func _KubeResource_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.B err := b.DecodeMessage(msg) m.Resource = &KubeResource_Snapshot{msg} return true, err - case 31: // resource.ingress + case 29: // resource.ingress if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -3531,7 +3498,7 @@ func _KubeResource_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.B err := b.DecodeMessage(msg) m.Resource = &KubeResource_Ingress{msg} return true, err - case 32: // resource.prometheus + case 30: // resource.prometheus if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -3539,7 +3506,7 @@ func _KubeResource_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.B err := b.DecodeMessage(msg) m.Resource = &KubeResource_Prometheus{msg} return true, err - case 33: // resource.service_monitors + case 31: // resource.service_monitors if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -3547,7 +3514,7 @@ func _KubeResource_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.B err := b.DecodeMessage(msg) m.Resource = &KubeResource_ServiceMonitors{msg} return true, err - case 34: // resource.cluster_alert + case 32: // resource.cluster_alert if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -3555,7 +3522,7 @@ func _KubeResource_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.B err := b.DecodeMessage(msg) m.Resource = &KubeResource_ClusterAlert{msg} return true, err - case 35: // resource.node_alert + case 33: // resource.node_alert if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -3563,7 +3530,7 @@ func _KubeResource_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.B err := b.DecodeMessage(msg) m.Resource = &KubeResource_NodeAlert{msg} return true, err - case 36: // resource.pod_alert + case 34: // resource.pod_alert if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -3571,7 +3538,7 @@ func _KubeResource_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.B err := b.DecodeMessage(msg) m.Resource = &KubeResource_PodAlert{msg} return true, err - case 37: // resource.mysql + case 35: // resource.mysql if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -3579,7 +3546,7 @@ func _KubeResource_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.B err := b.DecodeMessage(msg) m.Resource = &KubeResource_Mysql{msg} return true, err - case 38: // resource.redis + case 36: // resource.redis if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -3587,7 +3554,7 @@ func _KubeResource_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.B err := b.DecodeMessage(msg) m.Resource = &KubeResource_Redis{msg} return true, err - case 39: // resource.mongodb + case 37: // resource.mongodb if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -3595,7 +3562,7 @@ func _KubeResource_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.B err := b.DecodeMessage(msg) m.Resource = &KubeResource_Mongodb{msg} return true, err - case 40: // resource.memcached + case 38: // resource.memcached if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -3603,7 +3570,7 @@ func _KubeResource_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.B err := b.DecodeMessage(msg) m.Resource = &KubeResource_Memcached{msg} return true, err - case 41: // resource.recovery + case 39: // resource.recovery if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -3622,187 +3589,187 @@ func _KubeResource_OneofSizer(msg proto.Message) (n int) { switch x := m.Resource.(type) { case *KubeResource_ConfigMap: s := proto.Size(x.ConfigMap) - n += proto.SizeVarint(5<<3 | proto.WireBytes) + n += proto.SizeVarint(3<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResource_DaemonSet: s := proto.Size(x.DaemonSet) - n += proto.SizeVarint(6<<3 | proto.WireBytes) + n += proto.SizeVarint(4<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResource_Deployment: s := proto.Size(x.Deployment) - n += proto.SizeVarint(7<<3 | proto.WireBytes) + n += proto.SizeVarint(5<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResource_Job: s := proto.Size(x.Job) - n += proto.SizeVarint(8<<3 | proto.WireBytes) + n += proto.SizeVarint(6<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResource_Namespace: s := proto.Size(x.Namespace) - n += proto.SizeVarint(9<<3 | proto.WireBytes) + n += proto.SizeVarint(7<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResource_Node: s := proto.Size(x.Node) - n += proto.SizeVarint(10<<3 | proto.WireBytes) + n += proto.SizeVarint(8<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResource_StatefulSet: s := proto.Size(x.StatefulSet) - n += proto.SizeVarint(11<<3 | proto.WireBytes) + n += proto.SizeVarint(9<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResource_Pod: s := proto.Size(x.Pod) - n += proto.SizeVarint(12<<3 | proto.WireBytes) + n += proto.SizeVarint(10<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResource_ReplicaSet: s := proto.Size(x.ReplicaSet) - n += proto.SizeVarint(13<<3 | proto.WireBytes) + n += proto.SizeVarint(11<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResource_Service: s := proto.Size(x.Service) - n += proto.SizeVarint(14<<3 | proto.WireBytes) + n += proto.SizeVarint(12<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResource_Secret: s := proto.Size(x.Secret) - n += proto.SizeVarint(15<<3 | proto.WireBytes) + n += proto.SizeVarint(13<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResource_ReplicationController: s := proto.Size(x.ReplicationController) - n += proto.SizeVarint(16<<3 | proto.WireBytes) + n += proto.SizeVarint(14<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResource_StorageClass: s := proto.Size(x.StorageClass) - n += proto.SizeVarint(17<<3 | proto.WireBytes) + n += proto.SizeVarint(15<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResource_PersistentVolume: s := proto.Size(x.PersistentVolume) - n += proto.SizeVarint(18<<3 | proto.WireBytes) + n += proto.SizeVarint(16<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResource_PersistentVolumeClaim: s := proto.Size(x.PersistentVolumeClaim) - n += proto.SizeVarint(19<<3 | proto.WireBytes) + n += proto.SizeVarint(17<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResource_Role: s := proto.Size(x.Role) - n += proto.SizeVarint(20<<3 | proto.WireBytes) + n += proto.SizeVarint(18<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResource_ClusterRole: s := proto.Size(x.ClusterRole) - n += proto.SizeVarint(21<<3 | proto.WireBytes) + n += proto.SizeVarint(19<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResource_RoleBinding: s := proto.Size(x.RoleBinding) - n += proto.SizeVarint(22<<3 | proto.WireBytes) + n += proto.SizeVarint(20<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResource_ClusterRoleBinding: s := proto.Size(x.ClusterRoleBinding) - n += proto.SizeVarint(23<<3 | proto.WireBytes) + n += proto.SizeVarint(21<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResource_Certificate: s := proto.Size(x.Certificate) - n += proto.SizeVarint(24<<3 | proto.WireBytes) + n += proto.SizeVarint(22<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResource_CronJob: s := proto.Size(x.CronJob) - n += proto.SizeVarint(25<<3 | proto.WireBytes) + n += proto.SizeVarint(23<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResource_Restic: s := proto.Size(x.Restic) - n += proto.SizeVarint(26<<3 | proto.WireBytes) + n += proto.SizeVarint(24<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResource_Postgres: s := proto.Size(x.Postgres) - n += proto.SizeVarint(27<<3 | proto.WireBytes) + n += proto.SizeVarint(25<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResource_Elasticsearch: s := proto.Size(x.Elasticsearch) - n += proto.SizeVarint(28<<3 | proto.WireBytes) + n += proto.SizeVarint(26<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResource_DormantDatabase: s := proto.Size(x.DormantDatabase) - n += proto.SizeVarint(29<<3 | proto.WireBytes) + n += proto.SizeVarint(27<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResource_Snapshot: s := proto.Size(x.Snapshot) - n += proto.SizeVarint(30<<3 | proto.WireBytes) + n += proto.SizeVarint(28<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResource_Ingress: s := proto.Size(x.Ingress) - n += proto.SizeVarint(31<<3 | proto.WireBytes) + n += proto.SizeVarint(29<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResource_Prometheus: s := proto.Size(x.Prometheus) - n += proto.SizeVarint(32<<3 | proto.WireBytes) + n += proto.SizeVarint(30<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResource_ServiceMonitors: s := proto.Size(x.ServiceMonitors) - n += proto.SizeVarint(33<<3 | proto.WireBytes) + n += proto.SizeVarint(31<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResource_ClusterAlert: s := proto.Size(x.ClusterAlert) - n += proto.SizeVarint(34<<3 | proto.WireBytes) + n += proto.SizeVarint(32<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResource_NodeAlert: s := proto.Size(x.NodeAlert) - n += proto.SizeVarint(35<<3 | proto.WireBytes) + n += proto.SizeVarint(33<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResource_PodAlert: s := proto.Size(x.PodAlert) - n += proto.SizeVarint(36<<3 | proto.WireBytes) + n += proto.SizeVarint(34<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResource_Mysql: s := proto.Size(x.Mysql) - n += proto.SizeVarint(37<<3 | proto.WireBytes) + n += proto.SizeVarint(35<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResource_Redis: s := proto.Size(x.Redis) - n += proto.SizeVarint(38<<3 | proto.WireBytes) + n += proto.SizeVarint(36<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResource_Mongodb: s := proto.Size(x.Mongodb) - n += proto.SizeVarint(39<<3 | proto.WireBytes) + n += proto.SizeVarint(37<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResource_Memcached: s := proto.Size(x.Memcached) - n += proto.SizeVarint(40<<3 | proto.WireBytes) + n += proto.SizeVarint(38<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *KubeResource_Recovery: s := proto.Size(x.Recovery) - n += proto.SizeVarint(41<<3 | proto.WireBytes) + n += proto.SizeVarint(39<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case nil: @@ -13090,762 +13057,761 @@ var _Disks_serviceDesc = grpc.ServiceDesc{ func init() { proto.RegisterFile("client.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 12106 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x6c, 0x1d, 0xc9, - 0x95, 0x18, 0xcc, 0xbe, 0x2f, 0xde, 0x7b, 0x2e, 0x9f, 0x25, 0x4a, 0xba, 0x73, 0xe7, 0xa5, 0xb9, - 0xf3, 0x96, 0x67, 0xc8, 0x79, 0x8f, 0x1e, 0xa3, 0xd1, 0x50, 0x24, 0x25, 0x72, 0x44, 0x49, 0x9c, - 0x26, 0xa5, 0xb1, 0x3c, 0x1e, 0xdf, 0x69, 0xde, 0x2e, 0x92, 0x3d, 0xea, 0xdb, 0xdd, 0xee, 0xee, - 0x4b, 0x89, 0x63, 0x8c, 0x3f, 0x7b, 0xfd, 0x61, 0xd7, 0x8f, 0xd8, 0x40, 0xb2, 0x89, 0xed, 0x04, - 0x30, 0x36, 0xd8, 0x35, 0x92, 0x0d, 0x9c, 0xd7, 0xc6, 0x31, 0x02, 0x6c, 0x12, 0x03, 0x41, 0x9c, - 0x6c, 0xf2, 0x23, 0x09, 0x1c, 0xc3, 0x3f, 0x36, 0x08, 0x90, 0xd7, 0x22, 0x08, 0x82, 0x0d, 0x1c, - 0x18, 0xfb, 0x23, 0xc1, 0x62, 0xb3, 0x41, 0x3d, 0xbb, 0xba, 0x6f, 0x53, 0xb7, 0xfb, 0x8a, 0x23, - 0xcb, 0x9b, 0xf9, 0x43, 0xde, 0x3a, 0x5d, 0x75, 0xaa, 0xea, 0x54, 0xd5, 0xa9, 0x53, 0xe7, 0x9c, - 0x3a, 0x05, 0x63, 0x1d, 0xdb, 0xc2, 0x4e, 0x38, 0xeb, 0xf9, 0x6e, 0xe8, 0xa2, 0x07, 0x0c, 0xcf, - 0x0b, 0x3a, 0xae, 0x89, 0x67, 0x6f, 0xf4, 0x36, 0xb1, 0xef, 0xe0, 0x10, 0x07, 0xb3, 0xbb, 0xcf, - 0x1b, 0xb6, 0xb7, 0x63, 0x3c, 0xdf, 0x7c, 0x60, 0xdb, 0x75, 0xb7, 0x6d, 0x3c, 0x67, 0x78, 0xd6, - 0x9c, 0xe1, 0x38, 0x6e, 0x68, 0x84, 0x96, 0xeb, 0x04, 0xac, 0x6c, 0xf3, 0x21, 0x51, 0x76, 0x9f, - 0xef, 0x8f, 0x4a, 0xdc, 0x1d, 0xb7, 0x4b, 0xf3, 0x98, 0xe1, 0x9e, 0x87, 0x83, 0x39, 0xfa, 0x97, - 0x67, 0x6a, 0xdd, 0x38, 0x11, 0xcc, 0x5a, 0x2e, 0xfd, 0xdc, 0x71, 0x7d, 0x3c, 0xb7, 0xfb, 0xfc, - 0xdc, 0x36, 0x76, 0xb0, 0x6f, 0x84, 0xd8, 0x64, 0x79, 0x5a, 0xff, 0x43, 0x83, 0x43, 0xab, 0x56, - 0x10, 0xea, 0x38, 0x70, 0x7b, 0x7e, 0x07, 0xeb, 0xf8, 0xb3, 0x3d, 0x1c, 0x84, 0xa8, 0x01, 0xa3, - 0x1d, 0xbb, 0x17, 0x84, 0xd8, 0x6f, 0x68, 0xc7, 0xb4, 0xa7, 0x6a, 0xba, 0x48, 0x22, 0x04, 0x25, - 0x52, 0x49, 0xa3, 0x40, 0xc1, 0xf4, 0x37, 0x7a, 0x00, 0x6a, 0x8e, 0xd1, 0xc5, 0x81, 0x67, 0x74, - 0x70, 0xa3, 0x48, 0x3f, 0x44, 0x00, 0xf4, 0x30, 0xd4, 0x0d, 0xcf, 0x6a, 0xef, 0x62, 0x3f, 0xb0, - 0x5c, 0xa7, 0x51, 0xa2, 0xdf, 0xc1, 0xf0, 0xac, 0x6b, 0x0c, 0x82, 0x9e, 0x84, 0x49, 0xcb, 0xe9, - 0xd8, 0x3d, 0x13, 0xb7, 0xbb, 0x38, 0xf4, 0xad, 0x4e, 0xd0, 0x28, 0x1f, 0xd3, 0x9e, 0xaa, 0xea, - 0x13, 0x1c, 0x7c, 0x89, 0x41, 0x51, 0x13, 0xaa, 0x01, 0xb6, 0x71, 0x27, 0x74, 0xfd, 0x46, 0x85, - 0xa2, 0x91, 0x69, 0xf4, 0x18, 0x8c, 0x6f, 0x59, 0xd8, 0x36, 0xd7, 0x45, 0x86, 0x51, 0x9a, 0x21, - 0x0e, 0x6c, 0xfd, 0x50, 0x83, 0xfb, 0x75, 0x4c, 0x9a, 0x82, 0x57, 0x1c, 0x13, 0xdf, 0xba, 0xb3, - 0x7e, 0x23, 0x28, 0x91, 0x6e, 0xf2, 0x2e, 0xd3, 0xdf, 0x71, 0x5a, 0x94, 0x06, 0xd0, 0xa2, 0xdc, - 0x47, 0x8b, 0x87, 0x00, 0x42, 0xc3, 0xdf, 0xc6, 0xe1, 0x06, 0xa9, 0x8c, 0xf5, 0x41, 0x81, 0xb4, - 0x4c, 0x98, 0x89, 0x8f, 0x57, 0xe0, 0xb9, 0x4e, 0x80, 0xd1, 0x2a, 0xd4, 0x7c, 0x0e, 0x0b, 0x68, - 0xd3, 0xeb, 0x2f, 0xcc, 0xce, 0xde, 0x6e, 0x06, 0xce, 0x5e, 0xec, 0x6d, 0x62, 0x81, 0x86, 0xa2, - 0x8c, 0x10, 0xb4, 0x7e, 0xaa, 0xc1, 0xd1, 0x45, 0x1c, 0x74, 0x7c, 0x2b, 0xca, 0xf3, 0x51, 0x4c, - 0x0d, 0x41, 0xc0, 0x92, 0x42, 0xc0, 0x29, 0x28, 0xfa, 0xc6, 0x4d, 0x4e, 0x1a, 0xf2, 0x33, 0x6d, - 0x7e, 0x54, 0x52, 0xe7, 0x47, 0x82, 0xba, 0xa3, 0x49, 0xea, 0xb6, 0x36, 0xa1, 0xd1, 0xdf, 0x2d, - 0x4e, 0xc1, 0xf3, 0x50, 0x15, 0x04, 0xe0, 0x04, 0x3c, 0x9e, 0x9d, 0x80, 0xba, 0x2c, 0xdb, 0xfa, - 0x57, 0x1a, 0x1c, 0xbe, 0xea, 0x99, 0x46, 0x78, 0xd7, 0x29, 0xf7, 0x62, 0x44, 0xb9, 0xfa, 0x0b, - 0x8f, 0xdc, 0xbe, 0xf1, 0xba, 0x71, 0x93, 0x11, 0x37, 0x41, 0xb3, 0x4a, 0x1f, 0xcd, 0xbe, 0x59, - 0x84, 0x99, 0x05, 0xd7, 0xd9, 0xb2, 0xb6, 0x2f, 0x19, 0xde, 0x92, 0x69, 0x85, 0x83, 0xbb, 0x13, - 0x6b, 0x7a, 0x61, 0xbf, 0xa6, 0xab, 0xab, 0xe6, 0x12, 0x14, 0x0d, 0xd3, 0x6c, 0x94, 0x8e, 0x15, - 0x9f, 0xaa, 0xbf, 0x70, 0xfa, 0xf6, 0x4d, 0x4f, 0x6b, 0xcc, 0xec, 0xbc, 0x69, 0x2e, 0x39, 0xa1, - 0xbf, 0xa7, 0x13, 0x3c, 0xe8, 0x1a, 0x54, 0x7a, 0x74, 0x08, 0x1a, 0x65, 0x8a, 0xf1, 0xf5, 0x21, - 0x30, 0xb2, 0x31, 0x64, 0x48, 0x39, 0x36, 0xd2, 0x65, 0x13, 0xdb, 0x38, 0xc4, 0x66, 0xa3, 0x72, - 0xac, 0x48, 0xba, 0xcc, 0x93, 0xcd, 0x57, 0xa0, 0x2a, 0x9a, 0x40, 0x66, 0xf0, 0x0d, 0xbc, 0xc7, - 0x89, 0x42, 0x7e, 0xa2, 0x19, 0x28, 0xef, 0x1a, 0x76, 0x4f, 0x10, 0x83, 0x25, 0x4e, 0x15, 0x4e, - 0x68, 0xcd, 0x93, 0x50, 0x57, 0x2a, 0xca, 0x53, 0xb4, 0xf5, 0xf5, 0x22, 0x4c, 0xaf, 0xe3, 0x8e, - 0x8f, 0xc3, 0x8f, 0x6a, 0x54, 0xde, 0x54, 0x47, 0xe5, 0xc4, 0xed, 0x69, 0xd8, 0xd7, 0x92, 0xc4, - 0x90, 0xac, 0x27, 0x86, 0xe4, 0x74, 0x5e, 0x74, 0xf7, 0xfc, 0x78, 0xfc, 0x48, 0x83, 0x43, 0x0b, - 0xae, 0xb7, 0x97, 0x5c, 0xf6, 0x6f, 0x40, 0x25, 0xc6, 0x56, 0x9e, 0x1a, 0xcc, 0x56, 0xae, 0x6c, - 0xbe, 0x8f, 0x3b, 0xa1, 0xce, 0xcb, 0xa1, 0x37, 0xa1, 0x6e, 0xe2, 0x20, 0xb4, 0x1c, 0x2a, 0x04, - 0xd0, 0x9a, 0xf3, 0xa0, 0x51, 0x0b, 0x27, 0xd7, 0x7b, 0xb1, 0x6f, 0xbd, 0xff, 0x1d, 0x0d, 0x0e, - 0x2f, 0xf8, 0xf8, 0x8e, 0xf9, 0xd7, 0xdd, 0xe3, 0x50, 0xdf, 0xd6, 0xe0, 0xf0, 0x22, 0x1d, 0xf7, - 0xbb, 0xcd, 0x71, 0x07, 0x6d, 0xe7, 0xad, 0xef, 0xbe, 0x04, 0x53, 0xc9, 0x8d, 0x36, 0x59, 0x4a, - 0xeb, 0x13, 0x02, 0x10, 0x94, 0x6e, 0x58, 0x8e, 0x29, 0x1a, 0x47, 0x7e, 0xa3, 0x4f, 0x43, 0xbd, - 0x43, 0xd9, 0x54, 0xbb, 0x6b, 0x78, 0x01, 0x6d, 0x5e, 0xfd, 0x85, 0x93, 0xf9, 0xb6, 0xf8, 0x88, - 0xd1, 0x05, 0xcb, 0x23, 0x3a, 0x74, 0x64, 0x8a, 0x60, 0x37, 0x0d, 0xdc, 0x75, 0x9d, 0x76, 0x80, - 0xc3, 0x80, 0xf6, 0x31, 0x3f, 0xf6, 0x45, 0x8a, 0x61, 0x1d, 0x87, 0x14, 0xbb, 0x29, 0x53, 0xe8, - 0x33, 0x64, 0xfe, 0x7a, 0xb6, 0xbb, 0xd7, 0xc5, 0x4e, 0x18, 0xf0, 0xe1, 0x3f, 0x95, 0x17, 0x7b, - 0x84, 0x61, 0x79, 0x44, 0x57, 0x11, 0xa2, 0x15, 0x28, 0xbd, 0xef, 0x6e, 0x32, 0xa9, 0xa0, 0xfe, - 0xc2, 0x8b, 0x39, 0x11, 0xbf, 0xe9, 0x6e, 0x12, 0x8c, 0x14, 0x05, 0x7a, 0x07, 0x40, 0x0e, 0x79, - 0x40, 0x25, 0x88, 0xfc, 0x74, 0xb8, 0x2c, 0x11, 0x10, 0x3a, 0x44, 0xe8, 0xd0, 0x2a, 0x94, 0x1d, - 0xd7, 0xc4, 0x41, 0xa3, 0x4a, 0xf1, 0xbe, 0x94, 0x17, 0x2f, 0x29, 0xbb, 0x3c, 0xa2, 0x33, 0x24, - 0x68, 0x13, 0xc6, 0x83, 0xd0, 0x08, 0xf1, 0x56, 0xcf, 0x66, 0xa3, 0x56, 0xa3, 0x58, 0x4f, 0xe7, - 0xc4, 0xba, 0xce, 0x71, 0xf0, 0x71, 0x1b, 0x0b, 0x94, 0x34, 0xa1, 0xac, 0xe7, 0x9a, 0x41, 0x03, - 0x86, 0xa2, 0xec, 0x9a, 0x6b, 0x52, 0xca, 0x12, 0x14, 0xa8, 0x0d, 0x63, 0x3e, 0xf6, 0x6c, 0xab, - 0x63, 0xb0, 0xd6, 0xd6, 0x87, 0x9a, 0x05, 0x3a, 0x43, 0xc1, 0x1b, 0x5b, 0xf7, 0xa3, 0x24, 0xba, - 0x4a, 0x4e, 0x07, 0xfe, 0xae, 0x45, 0x06, 0x6e, 0x8c, 0x22, 0x7f, 0x35, 0x2f, 0x29, 0x78, 0xf1, - 0xe5, 0x11, 0x5d, 0xa2, 0x42, 0x3a, 0x8c, 0x06, 0x74, 0x33, 0x0a, 0x1a, 0xe3, 0x14, 0xeb, 0x2b, - 0xb9, 0xb1, 0xd2, 0xd2, 0xcb, 0x23, 0xba, 0x40, 0x84, 0xbe, 0xa0, 0xc1, 0x51, 0xde, 0x74, 0xc2, - 0x94, 0xdb, 0x1d, 0xd7, 0x09, 0x7d, 0xd7, 0xb6, 0xb1, 0x1f, 0x34, 0x26, 0x68, 0x25, 0x4b, 0xc3, - 0xd1, 0x85, 0x60, 0x5b, 0x88, 0x90, 0x2d, 0x8f, 0xe8, 0x47, 0xfc, 0xd4, 0x2f, 0x68, 0x07, 0x26, - 0x83, 0xd0, 0xf5, 0x8d, 0x6d, 0xdc, 0xee, 0xd8, 0x46, 0x10, 0xe0, 0xa0, 0x31, 0x49, 0x6b, 0x3e, - 0x93, 0x7b, 0xfe, 0x50, 0x2c, 0x0b, 0x0c, 0xc9, 0xf2, 0x88, 0x3e, 0x11, 0xc4, 0x20, 0xe8, 0xb3, - 0x80, 0x3c, 0xc2, 0xd8, 0x82, 0x10, 0x3b, 0x61, 0x7b, 0xd7, 0xb5, 0x7b, 0x5d, 0x1c, 0x34, 0xa6, - 0x68, 0x65, 0x6f, 0xe4, 0x9d, 0x51, 0x12, 0xd1, 0x35, 0x86, 0x67, 0x79, 0x44, 0x9f, 0xf6, 0x92, - 0x40, 0xf4, 0x45, 0x0d, 0x1a, 0x7d, 0x75, 0x92, 0x7e, 0x5a, 0xdd, 0xa0, 0x31, 0x3d, 0x14, 0x81, - 0x93, 0x35, 0x2f, 0x50, 0x64, 0x84, 0xc0, 0x5e, 0xea, 0x17, 0xb2, 0xd8, 0x7d, 0xd7, 0xc6, 0x41, - 0x03, 0x0d, 0xb5, 0xd8, 0x75, 0x52, 0x96, 0x2c, 0x76, 0x8a, 0x84, 0x2c, 0x76, 0xbe, 0x75, 0xb5, - 0x19, 0xd6, 0x43, 0x43, 0x2d, 0xf6, 0x05, 0x86, 0x43, 0x20, 0x1f, 0xeb, 0x28, 0x69, 0x52, 0x07, - 0xc1, 0xdd, 0xde, 0xb4, 0x1c, 0xd3, 0x72, 0xb6, 0x83, 0xc6, 0xcc, 0x50, 0x75, 0x10, 0x64, 0xe7, - 0x38, 0x0a, 0x52, 0x87, 0xaf, 0xa4, 0xd1, 0x2d, 0x38, 0xac, 0xf6, 0x23, 0xaa, 0xeb, 0x30, 0xad, - 0xeb, 0xdc, 0xf0, 0xfd, 0x51, 0xaa, 0x3c, 0xd4, 0xe9, 0x07, 0x23, 0x03, 0xc6, 0x3a, 0xd8, 0x0f, - 0xad, 0x2d, 0xb2, 0x18, 0x70, 0xd0, 0x38, 0x32, 0x1c, 0x01, 0x15, 0x14, 0x94, 0x80, 0x4a, 0x1a, - 0x5d, 0x83, 0x5a, 0xc7, 0x77, 0x9d, 0x36, 0xdd, 0x8c, 0x8e, 0x0e, 0xc5, 0x82, 0x16, 0x7c, 0xd7, - 0xe1, 0x1b, 0x52, 0xb5, 0xc3, 0x7f, 0x13, 0x16, 0xe4, 0x13, 0x11, 0xae, 0x13, 0x34, 0x1a, 0x43, - 0xb1, 0x20, 0x9d, 0x95, 0x26, 0x2c, 0x88, 0x23, 0x22, 0x1b, 0x9d, 0xe7, 0x06, 0xe1, 0xb6, 0x8f, - 0xc9, 0xd2, 0xbf, 0x6f, 0xa8, 0x8d, 0x6e, 0x4d, 0x22, 0x20, 0x1b, 0x5d, 0x84, 0x0e, 0xbd, 0x0f, - 0x93, 0xd8, 0x36, 0x68, 0x45, 0xd8, 0xf0, 0x3b, 0x3b, 0x38, 0x68, 0x34, 0x69, 0x0d, 0xaf, 0xe7, - 0xac, 0x61, 0x29, 0x8e, 0x65, 0x79, 0x44, 0x4f, 0x22, 0x46, 0x0e, 0x4c, 0x9b, 0xae, 0xdf, 0x35, - 0x9c, 0xb0, 0x6d, 0x1a, 0xa1, 0xb1, 0x69, 0x90, 0xfe, 0xdc, 0x4f, 0x6b, 0x3b, 0x9b, 0x57, 0xc4, - 0x60, 0x78, 0x16, 0x05, 0x9a, 0xe5, 0x11, 0x7d, 0xca, 0x4c, 0xc0, 0xd0, 0x27, 0xa1, 0x16, 0x38, - 0x86, 0x17, 0xec, 0xb8, 0x61, 0xd0, 0x78, 0x80, 0xd6, 0x73, 0x22, 0x2f, 0xcb, 0x14, 0xe5, 0x97, - 0x47, 0xf4, 0x08, 0x19, 0xba, 0x02, 0x15, 0xbc, 0x4b, 0x25, 0xa4, 0x07, 0x29, 0xda, 0x97, 0xf3, - 0x12, 0x6b, 0x97, 0x0b, 0x47, 0x1c, 0x0d, 0x69, 0xaa, 0xe5, 0x90, 0x21, 0x21, 0x24, 0x79, 0x68, - 0xa8, 0xa6, 0xae, 0x88, 0xf2, 0xa4, 0xa9, 0x12, 0x19, 0x59, 0x4c, 0x9e, 0xef, 0x76, 0x71, 0xb8, - 0x83, 0x7b, 0x04, 0xf9, 0xc3, 0x43, 0x2d, 0xa6, 0x35, 0x05, 0x05, 0x59, 0x4c, 0x2a, 0x4a, 0x74, - 0x03, 0xa6, 0xf8, 0x1e, 0xdc, 0xee, 0xba, 0x8e, 0x15, 0xba, 0x7e, 0xd0, 0x38, 0x36, 0xd4, 0x24, - 0xe2, 0xdb, 0xfa, 0x25, 0x8e, 0x85, 0x4c, 0xa2, 0x20, 0x0e, 0x42, 0x18, 0x26, 0x04, 0x5b, 0x32, - 0x6c, 0xec, 0x87, 0x41, 0xe3, 0x11, 0x5a, 0xd5, 0x6b, 0xc3, 0xf1, 0xa3, 0x79, 0x8a, 0x63, 0x79, - 0x44, 0x17, 0x4c, 0x9b, 0x01, 0x88, 0x98, 0x4d, 0x64, 0x37, 0x51, 0x47, 0x6b, 0x38, 0xf1, 0xd2, - 0x35, 0xb1, 0xac, 0x00, 0x1c, 0x99, 0x42, 0xd7, 0xc9, 0x92, 0x36, 0x05, 0xf2, 0x47, 0x87, 0x1a, - 0xef, 0x35, 0xd7, 0x94, 0xb8, 0x6b, 0x9e, 0x48, 0x90, 0xa9, 0xd9, 0xdd, 0x0b, 0x3e, 0x6b, 0x07, - 0x8d, 0xc7, 0x86, 0x9a, 0x9a, 0x97, 0x68, 0x61, 0x32, 0x35, 0x19, 0x1a, 0xc6, 0xd2, 0x4c, 0x8b, - 0xcc, 0x9d, 0xc7, 0x87, 0x64, 0x69, 0xb4, 0x34, 0x63, 0x69, 0xf4, 0x27, 0x11, 0x00, 0xbb, 0xae, - 0xb3, 0xed, 0x9a, 0x9b, 0x41, 0xe3, 0x89, 0xa1, 0xb8, 0xef, 0x25, 0x5e, 0x9c, 0x70, 0x5f, 0x81, - 0x8a, 0x70, 0xca, 0x2e, 0xee, 0x76, 0x8c, 0xce, 0x0e, 0x36, 0x83, 0xc6, 0x93, 0x43, 0x8d, 0xd9, - 0x25, 0x89, 0x80, 0x8c, 0x59, 0x84, 0x8e, 0x20, 0xf7, 0x71, 0xc7, 0xdd, 0xc5, 0xbe, 0x85, 0x83, - 0xc6, 0x53, 0x43, 0x21, 0xd7, 0x25, 0x02, 0x82, 0x3c, 0x42, 0xd7, 0x5c, 0x80, 0x0a, 0xe3, 0x09, - 0xe8, 0x24, 0x94, 0xad, 0x10, 0x77, 0x83, 0x86, 0x46, 0x95, 0x2f, 0x8f, 0xde, 0xbe, 0x06, 0x5a, - 0x48, 0x67, 0x25, 0x9a, 0x17, 0x01, 0xa2, 0x63, 0x23, 0x3a, 0x13, 0x47, 0xf4, 0x64, 0x46, 0xc5, - 0x9a, 0x82, 0x2c, 0x3a, 0x25, 0xe6, 0x44, 0x26, 0x0b, 0x0a, 0x64, 0x97, 0xa0, 0xae, 0x1c, 0x0a, - 0xd1, 0xeb, 0x71, 0x6c, 0x03, 0xf4, 0x23, 0x51, 0x49, 0x81, 0xee, 0x2c, 0x94, 0xe8, 0x6e, 0xfb, - 0x6a, 0x1c, 0xcf, 0x00, 0x35, 0xc5, 0x9b, 0xee, 0xa6, 0xd2, 0xb9, 0xe8, 0xe8, 0x97, 0xb3, 0x73, - 0xb2, 0xa0, 0x40, 0x36, 0x0f, 0x65, 0x7a, 0xde, 0x43, 0x27, 0xe2, 0x78, 0x5a, 0x03, 0xf0, 0xb8, - 0xa6, 0x44, 0x71, 0x05, 0xc6, 0xd4, 0xc3, 0x1d, 0x3a, 0x1b, 0xc7, 0xf4, 0xf4, 0x00, 0x0d, 0x5c, - 0x54, 0x54, 0xa1, 0x10, 0x39, 0xd2, 0xe5, 0xa4, 0xd0, 0x9a, 0x6b, 0x2a, 0x23, 0xa6, 0x1c, 0xe0, - 0x72, 0x8e, 0x58, 0x54, 0x52, 0xa0, 0xbb, 0x00, 0x55, 0x71, 0x64, 0x43, 0xa7, 0xe3, 0xb8, 0x1e, - 0x1f, 0xa4, 0x5e, 0xa4, 0xc5, 0x04, 0xa2, 0x25, 0x18, 0xe5, 0xa7, 0x34, 0x74, 0x2a, 0x8e, 0xe7, - 0xb1, 0x2c, 0x6a, 0x4a, 0x81, 0xa6, 0x03, 0x47, 0xd2, 0xcf, 0x61, 0x68, 0x25, 0x8e, 0xf5, 0xc5, - 0x4c, 0x3d, 0x8d, 0x23, 0x11, 0x95, 0xe8, 0x30, 0x11, 0x3f, 0x72, 0xa1, 0x37, 0xe2, 0xc8, 0x8f, - 0x0f, 0x1a, 0xd7, 0xa8, 0xb0, 0xc0, 0x79, 0x1d, 0xa6, 0xfb, 0x4e, 0x56, 0x68, 0x31, 0x8e, 0x76, - 0x80, 0x39, 0x29, 0x59, 0x5e, 0xa1, 0x49, 0xfa, 0xd1, 0x29, 0x27, 0x4d, 0x52, 0x91, 0x88, 0x4a, - 0xde, 0x82, 0xf1, 0xd8, 0xce, 0x9b, 0x93, 0x24, 0x6a, 0x59, 0x75, 0x31, 0x47, 0x5b, 0x6b, 0xce, - 0xc5, 0x2c, 0x0a, 0x0a, 0x64, 0x2b, 0x50, 0x93, 0x1b, 0x2b, 0x7a, 0x2d, 0x8e, 0xeb, 0x89, 0x81, - 0xab, 0x27, 0x86, 0x6a, 0x1e, 0xca, 0xec, 0xb4, 0x96, 0x8f, 0x2f, 0x90, 0x32, 0x0a, 0x5f, 0x50, - 0xcf, 0x81, 0x39, 0xf9, 0x82, 0x52, 0x54, 0x41, 0x18, 0x3b, 0x6a, 0xe5, 0x43, 0xa8, 0x14, 0x15, - 0x08, 0xdf, 0x85, 0x43, 0x29, 0x27, 0x3b, 0x74, 0x3e, 0x8e, 0xf7, 0xb9, 0xcc, 0x0d, 0x4d, 0xa0, - 0x27, 0x04, 0x50, 0xcf, 0x6d, 0x39, 0x09, 0x10, 0x15, 0x55, 0x18, 0x91, 0x38, 0xb8, 0xe5, 0x64, - 0x44, 0xbc, 0x98, 0x40, 0xf4, 0x26, 0x40, 0x74, 0xa8, 0xca, 0x3d, 0x53, 0x58, 0x41, 0x81, 0x6b, - 0x03, 0x26, 0x13, 0xc7, 0x27, 0x34, 0x1f, 0x47, 0xf8, 0x89, 0x01, 0x62, 0x80, 0x5a, 0x5a, 0x60, - 0x7d, 0x1b, 0xa6, 0x92, 0xc7, 0x24, 0xb4, 0x10, 0x47, 0xfb, 0xec, 0x80, 0x9d, 0x37, 0x5e, 0x5c, - 0x20, 0x5e, 0x80, 0x0a, 0x93, 0x12, 0x73, 0x0a, 0x2b, 0xb4, 0x90, 0x40, 0xb2, 0x08, 0xa3, 0x5c, - 0x30, 0xcc, 0x89, 0x85, 0x96, 0x52, 0x86, 0x53, 0x48, 0x82, 0x39, 0x87, 0x93, 0x17, 0x53, 0x98, - 0x48, 0x24, 0xf9, 0xe5, 0x64, 0x22, 0xb2, 0xa0, 0x32, 0x37, 0x22, 0x49, 0x2f, 0xe7, 0xdc, 0xe0, - 0x05, 0xf7, 0x14, 0x86, 0x24, 0x0f, 0xa1, 0x11, 0xaa, 0x42, 0x16, 0x54, 0xa2, 0x9c, 0xb2, 0x77, - 0x72, 0xf5, 0x42, 0xce, 0xbd, 0x93, 0x95, 0x12, 0x68, 0x96, 0xa1, 0x26, 0xcf, 0x9a, 0x39, 0x89, - 0xce, 0xcb, 0x09, 0x4c, 0x97, 0x61, 0x4c, 0x3d, 0x58, 0xe6, 0x94, 0x32, 0xa2, 0xa2, 0x02, 0xdf, - 0x55, 0x98, 0x4c, 0x9c, 0x20, 0xd1, 0xb9, 0x38, 0xca, 0x67, 0x32, 0x09, 0x1b, 0xbc, 0x34, 0x47, - 0x7b, 0x0e, 0x22, 0x7f, 0x83, 0xd6, 0xf7, 0x8e, 0xc2, 0x98, 0x2a, 0xd6, 0x0f, 0x67, 0x22, 0xe2, - 0xd6, 0xb5, 0x62, 0x2e, 0xeb, 0xda, 0x69, 0xa9, 0x74, 0x28, 0x65, 0x3f, 0x1a, 0x08, 0x05, 0xc3, - 0x32, 0x40, 0x64, 0x94, 0xe2, 0x76, 0x9d, 0xac, 0x47, 0x02, 0x72, 0xc0, 0x94, 0x16, 0x28, 0x82, - 0x29, 0x32, 0x40, 0x71, 0x43, 0x4e, 0xd6, 0xf3, 0x00, 0xc1, 0x24, 0xad, 0x4d, 0xe8, 0x4d, 0x80, - 0xc8, 0x36, 0xc4, 0x2d, 0x38, 0x99, 0xcf, 0x02, 0xd4, 0x70, 0x25, 0x53, 0xe8, 0x65, 0x28, 0xbe, - 0xef, 0x6e, 0x72, 0x73, 0xcd, 0xe0, 0x83, 0xc0, 0xf2, 0x88, 0x4e, 0xf2, 0xa3, 0x0b, 0xaa, 0x21, - 0xb1, 0x96, 0xa5, 0x2f, 0x52, 0xfc, 0x27, 0x7d, 0x89, 0x6c, 0x8e, 0x27, 0xa0, 0x44, 0xce, 0xf7, - 0xdc, 0xfc, 0x92, 0x41, 0xf4, 0x5f, 0x1e, 0xd1, 0x69, 0x09, 0x74, 0x19, 0xc6, 0x54, 0xe3, 0x10, - 0xb7, 0xb6, 0x64, 0x17, 0xf9, 0x97, 0x47, 0xf4, 0xba, 0x62, 0x09, 0x22, 0x94, 0xf0, 0x5c, 0x93, - 0xdb, 0x55, 0x06, 0x0b, 0xfc, 0x84, 0x12, 0x9e, 0x6b, 0xa2, 0x8b, 0x50, 0x57, 0x8c, 0x3e, 0xdc, - 0x80, 0x92, 0x59, 0xce, 0x67, 0xc7, 0x59, 0x91, 0x42, 0xf3, 0x30, 0xca, 0xf5, 0x36, 0xdc, 0x48, - 0x92, 0x4d, 0xc8, 0x67, 0x86, 0x17, 0xfa, 0x13, 0xbd, 0x0e, 0x15, 0x66, 0x83, 0xe1, 0xc6, 0x8e, - 0x4c, 0xe2, 0xfd, 0xf2, 0x88, 0xce, 0x4b, 0x21, 0x1b, 0x8e, 0xa4, 0xdb, 0x6d, 0xb8, 0x3d, 0x63, - 0x18, 0xc1, 0x7e, 0x79, 0x44, 0x3f, 0x9c, 0x6a, 0xa4, 0x41, 0x6f, 0xc1, 0x78, 0xcc, 0x46, 0xc3, - 0x4d, 0x17, 0x39, 0x04, 0x7c, 0x66, 0xd0, 0x8b, 0xd2, 0xe8, 0x5d, 0x98, 0xee, 0x33, 0x8c, 0x70, - 0x0b, 0x45, 0x4e, 0x01, 0x7f, 0x79, 0x44, 0x9f, 0x4a, 0x9a, 0x3e, 0x50, 0x17, 0x8e, 0xee, 0x63, - 0x77, 0xe1, 0x06, 0x8b, 0x61, 0xa4, 0x7c, 0x42, 0xa0, 0x54, 0x23, 0x0b, 0x59, 0x1f, 0xbe, 0x6b, - 0x63, 0x6e, 0xa8, 0xc8, 0x20, 0x02, 0x93, 0xf5, 0x41, 0x4a, 0x90, 0xf5, 0xa1, 0xda, 0x21, 0xb8, - 0xf9, 0x21, 0xbb, 0xe8, 0x4b, 0xd6, 0x87, 0x62, 0x65, 0x20, 0xf8, 0x54, 0x7b, 0x06, 0xb7, 0x2e, - 0x64, 0x97, 0x7c, 0xa9, 0x31, 0x33, 0x4a, 0x22, 0x13, 0x66, 0xd2, 0xec, 0x24, 0xdc, 0xaa, 0x90, - 0x5b, 0xf2, 0x5d, 0x1e, 0xd1, 0x51, 0xbf, 0x51, 0x04, 0x5d, 0x82, 0xba, 0x62, 0xc0, 0xe0, 0xc6, - 0x85, 0xec, 0xe2, 0x2f, 0x25, 0x42, 0x94, 0x44, 0xe7, 0xa0, 0x2a, 0xec, 0x1f, 0xdc, 0xa2, 0x90, - 0x4d, 0xfa, 0x25, 0x2b, 0x94, 0x1b, 0x3b, 0xc8, 0x0a, 0x65, 0x26, 0x0a, 0x6e, 0x31, 0xc8, 0x24, - 0x44, 0x90, 0x15, 0xca, 0x4a, 0xa1, 0x45, 0xa8, 0x0a, 0x43, 0x04, 0xb7, 0x02, 0x64, 0x14, 0x9b, - 0x97, 0x47, 0x74, 0x59, 0x12, 0xad, 0xc3, 0x78, 0xcc, 0xce, 0xc0, 0x15, 0xfd, 0x79, 0x04, 0xe6, - 0xe5, 0x11, 0x3d, 0x8e, 0x03, 0x7d, 0x0a, 0xa6, 0x92, 0x96, 0x0a, 0xae, 0xe9, 0xcf, 0x27, 0x31, - 0x2f, 0x8f, 0xe8, 0x93, 0x09, 0xb3, 0x04, 0xe9, 0xb6, 0x30, 0x24, 0x70, 0x4d, 0x7f, 0x46, 0x31, - 0x8e, 0xda, 0xba, 0xf9, 0x6f, 0xc2, 0x61, 0xb9, 0x8e, 0x9f, 0x6b, 0xf4, 0xb3, 0x49, 0x5e, 0x64, - 0xfc, 0x78, 0x39, 0xb2, 0xfd, 0x46, 0x6a, 0x7c, 0xae, 0xb0, 0xcf, 0x2c, 0x72, 0x51, 0x33, 0x92, - 0x4c, 0xa1, 0xeb, 0x29, 0x26, 0x00, 0xa6, 0x97, 0xcf, 0x25, 0x71, 0xa5, 0x29, 0xfc, 0xdf, 0x8a, - 0xec, 0xa9, 0x54, 0x5f, 0xce, 0x75, 0xf1, 0x39, 0x14, 0x05, 0x8a, 0xf9, 0x94, 0xa6, 0x89, 0x08, - 0x13, 0x29, 0xf7, 0xb9, 0xfa, 0x3d, 0xab, 0xa2, 0x80, 0x6e, 0xfb, 0x22, 0x81, 0x96, 0xa0, 0x26, - 0x15, 0xf9, 0x5c, 0xe1, 0x9e, 0x51, 0x4b, 0xc0, 0x26, 0x31, 0xfb, 0x4d, 0xa4, 0x68, 0xaa, 0x6d, - 0xe7, 0x1a, 0xf6, 0x2c, 0xe7, 0xa8, 0xe5, 0x11, 0x9d, 0x95, 0x21, 0x85, 0xa9, 0x5e, 0x9d, 0x6b, - 0xd2, 0xb3, 0x1c, 0x9f, 0xa8, 0xb5, 0x9a, 0xfc, 0x20, 0xf3, 0x88, 0xab, 0xcf, 0xb9, 0xbe, 0x3c, - 0xdb, 0xb1, 0x89, 0xcc, 0x23, 0x5e, 0x8e, 0xc8, 0x50, 0x52, 0x4d, 0xce, 0xf5, 0xe2, 0x59, 0x0f, - 0x4c, 0x84, 0x98, 0xb2, 0x2c, 0x59, 0x19, 0x5c, 0x25, 0xbe, 0xd7, 0x78, 0x3a, 0x0b, 0x2d, 0xc5, - 0x59, 0x89, 0xd0, 0x52, 0x94, 0x8c, 0x49, 0xeb, 0x7f, 0x5c, 0x84, 0xd2, 0x25, 0x1c, 0x1a, 0xd2, - 0x25, 0x4c, 0xdb, 0xcf, 0xff, 0xbb, 0xcf, 0xcb, 0xf2, 0x7e, 0xa8, 0x05, 0xd8, 0xde, 0x6a, 0xdb, - 0x96, 0x73, 0x83, 0xbb, 0x98, 0x55, 0x09, 0x60, 0xd5, 0x72, 0x6e, 0xa0, 0xa7, 0x61, 0x4a, 0xd4, - 0x91, 0xf0, 0x96, 0x9f, 0x14, 0x70, 0x21, 0xfe, 0x3f, 0x0b, 0xa8, 0xe3, 0x63, 0x26, 0x84, 0x84, - 0x56, 0x17, 0x07, 0xa1, 0xd1, 0x65, 0x02, 0x78, 0x51, 0x9f, 0x16, 0x5f, 0x36, 0xc4, 0x07, 0xf4, - 0x10, 0x00, 0xf7, 0xfc, 0x17, 0x1e, 0x74, 0x45, 0x5d, 0x81, 0xa0, 0xf3, 0x50, 0xb1, 0x8d, 0x4d, - 0x6c, 0x07, 0x8d, 0xd1, 0x2c, 0xba, 0x3e, 0xd2, 0xf9, 0xd9, 0x55, 0x5a, 0x80, 0xfb, 0x63, 0xb2, - 0xd2, 0xe8, 0x2a, 0xd4, 0x95, 0xcb, 0x0a, 0x8d, 0x6a, 0x16, 0xc5, 0x1e, 0x45, 0x36, 0x1f, 0x95, - 0x62, 0x18, 0x55, 0x3c, 0x68, 0x0a, 0x8a, 0x3d, 0xcb, 0xa4, 0x92, 0x74, 0x4d, 0x27, 0x3f, 0x9b, - 0x27, 0xa1, 0xae, 0xd4, 0x9f, 0xcb, 0xc3, 0xf3, 0x75, 0x98, 0x4a, 0xd6, 0x96, 0xcb, 0xcd, 0xd3, - 0x06, 0x88, 0x7c, 0x2b, 0x3f, 0x6a, 0x0f, 0xc3, 0x56, 0x17, 0xea, 0x2b, 0x1d, 0xcb, 0xd9, 0x36, - 0xa8, 0x6c, 0x8e, 0x26, 0xa0, 0x70, 0xe5, 0x22, 0xad, 0xa9, 0xac, 0x17, 0xae, 0x5c, 0x24, 0xd5, - 0xbf, 0x6d, 0xf8, 0x0e, 0x91, 0x0c, 0x0a, 0x14, 0x28, 0x92, 0xa8, 0x09, 0xd5, 0x05, 0xdf, 0x0a, - 0xad, 0x8e, 0x61, 0xd3, 0x9a, 0xca, 0xba, 0x4c, 0x93, 0x52, 0x57, 0x9d, 0x1b, 0x8e, 0x7b, 0x93, - 0xcd, 0xaf, 0xb2, 0x2e, 0x92, 0xad, 0xdf, 0x2b, 0xc3, 0xe8, 0x9a, 0x6b, 0xae, 0x7b, 0xb8, 0x83, - 0x5e, 0x87, 0x51, 0xe1, 0xac, 0x93, 0xe9, 0x3c, 0xcf, 0xf5, 0xbe, 0xa2, 0x10, 0xba, 0x42, 0x0f, - 0x87, 0xa1, 0x61, 0x39, 0xd8, 0x17, 0xba, 0x85, 0xb9, 0x81, 0x6c, 0x8c, 0x54, 0x4d, 0x0e, 0x89, - 0xac, 0x9c, 0xae, 0xa0, 0x40, 0x9f, 0x86, 0x71, 0xca, 0x60, 0xe5, 0x1d, 0x90, 0x22, 0xc5, 0xf9, - 0x6a, 0x36, 0x9c, 0x84, 0xd7, 0x8a, 0x7b, 0x20, 0x6c, 0x8e, 0x8d, 0x39, 0x0a, 0x08, 0x3d, 0x07, - 0x33, 0x62, 0xb3, 0x31, 0x3a, 0x1d, 0xb7, 0xe7, 0x84, 0x6d, 0x65, 0x34, 0x10, 0xff, 0x36, 0xcf, - 0x3e, 0x91, 0xf3, 0x1a, 0x59, 0xcc, 0xb4, 0x3d, 0x34, 0x1b, 0xf3, 0xfd, 0xac, 0x12, 0x00, 0xfd, - 0xf8, 0x0c, 0x20, 0xab, 0x4b, 0x24, 0x77, 0xaf, 0x67, 0x93, 0x23, 0x18, 0xf3, 0x20, 0x63, 0x5e, - 0xca, 0x53, 0xf4, 0xcb, 0x5a, 0xcf, 0xb6, 0xb9, 0xd5, 0xa1, 0x79, 0x16, 0xa6, 0xfb, 0xda, 0x97, - 0x6b, 0x56, 0x7f, 0xa3, 0x00, 0x35, 0x49, 0xb5, 0x54, 0xc6, 0x34, 0x03, 0x65, 0x5a, 0xad, 0x28, - 0x4b, 0x13, 0x64, 0x9a, 0x74, 0xdc, 0x6e, 0xd7, 0x70, 0xcc, 0x80, 0x92, 0xb3, 0xa6, 0xcb, 0x34, - 0xba, 0x0c, 0xe3, 0x5c, 0x82, 0xef, 0x92, 0x3e, 0x0b, 0x0d, 0xc1, 0xd3, 0x59, 0xa6, 0xc1, 0x25, - 0x52, 0x42, 0x1f, 0xdb, 0x8d, 0x12, 0x01, 0x69, 0x95, 0xe1, 0x6f, 0x07, 0xd4, 0x01, 0xbc, 0xa6, - 0xd3, 0xdf, 0xe8, 0x61, 0xa8, 0xdf, 0x74, 0xfd, 0x1b, 0x96, 0xb3, 0xdd, 0x36, 0x2d, 0x71, 0xab, - 0x07, 0x38, 0x68, 0xd1, 0xf2, 0xd1, 0x2b, 0x50, 0xc4, 0xce, 0x2e, 0xe7, 0x4b, 0x03, 0x66, 0xe0, - 0x92, 0xb3, 0x7b, 0xcd, 0xf0, 0x75, 0x52, 0xa0, 0xb5, 0x09, 0x15, 0x7e, 0x26, 0x49, 0x23, 0xc6, - 0x22, 0xf0, 0xa6, 0xad, 0x33, 0xcf, 0x6c, 0xe6, 0x52, 0x7d, 0x6c, 0x96, 0x5d, 0x99, 0x9a, 0x35, - 0x3c, 0x6b, 0xb6, 0xe3, 0xfa, 0x78, 0x76, 0x57, 0xf4, 0x87, 0xe5, 0xd3, 0x63, 0xa5, 0x5a, 0xef, - 0x42, 0x5d, 0xe9, 0x6d, 0x6a, 0x45, 0xf7, 0x43, 0xcd, 0xc7, 0x86, 0xd9, 0x76, 0x1d, 0x7b, 0x8f, - 0xd6, 0x52, 0x25, 0x9b, 0x8a, 0x61, 0x5e, 0x71, 0xec, 0x3d, 0xf4, 0x20, 0x00, 0xa5, 0x6c, 0xdb, - 0x33, 0xc2, 0x1d, 0xc1, 0x0f, 0x28, 0x64, 0xcd, 0x08, 0x77, 0x5a, 0xcf, 0x43, 0x51, 0x37, 0x6e, - 0xa2, 0x23, 0x50, 0xd9, 0x22, 0xd2, 0x5e, 0xc8, 0x11, 0xf3, 0x14, 0xa9, 0x8e, 0x88, 0x91, 0x82, - 0xc1, 0x90, 0xdf, 0xad, 0x7f, 0xaa, 0xd1, 0x69, 0xc0, 0x95, 0x2a, 0xaf, 0x40, 0xa9, 0x8b, 0x43, - 0x83, 0xfb, 0x9d, 0xb7, 0x06, 0xf3, 0x61, 0x9d, 0xe6, 0x47, 0x4b, 0x12, 0x33, 0x21, 0xfa, 0xf3, - 0x19, 0x15, 0x3a, 0xb3, 0x44, 0x18, 0x65, 0x2b, 0x8b, 0x16, 0x6f, 0xbe, 0x0a, 0x35, 0x09, 0xca, - 0xc5, 0x62, 0x7f, 0x58, 0x84, 0x22, 0x39, 0x0b, 0x0c, 0xdb, 0xfe, 0x29, 0x28, 0x1a, 0x9e, 0xc7, - 0xf1, 0x92, 0x9f, 0xe8, 0x24, 0x94, 0x02, 0x0f, 0x77, 0xb8, 0x6e, 0xec, 0xf1, 0x81, 0x9a, 0x1c, - 0xc2, 0x31, 0x74, 0x5a, 0x84, 0xba, 0xef, 0x87, 0x46, 0xd8, 0x13, 0x5e, 0xd1, 0x4f, 0x0d, 0x2c, - 0x4c, 0xf5, 0x28, 0xbd, 0x40, 0xe7, 0xe5, 0x9a, 0x3f, 0xd3, 0xa0, 0xc2, 0x40, 0x64, 0xc4, 0x83, - 0xd0, 0xf0, 0x43, 0xba, 0x69, 0xd3, 0x7e, 0x15, 0xf5, 0x1a, 0x85, 0x90, 0xcd, 0x1a, 0x3d, 0x09, - 0x93, 0x1d, 0xb7, 0xeb, 0xd9, 0x58, 0x6e, 0xec, 0xb4, 0x13, 0x45, 0x7d, 0x22, 0x02, 0xd3, 0x8c, - 0x47, 0xa0, 0x62, 0x74, 0x42, 0x6b, 0x17, 0x73, 0xde, 0xce, 0x53, 0x64, 0x83, 0x09, 0x7a, 0x9d, - 0x0e, 0xc6, 0x26, 0x36, 0x39, 0x6f, 0x8f, 0x00, 0x74, 0x26, 0x19, 0x96, 0x8d, 0x4d, 0xca, 0xad, - 0xca, 0x3a, 0x4f, 0x71, 0x4e, 0x6d, 0x5a, 0x6c, 0xd7, 0xae, 0x64, 0xe1, 0xd4, 0x42, 0x53, 0xb9, - 0x20, 0xca, 0xe9, 0x0a, 0x8a, 0xd6, 0xbf, 0xd0, 0x60, 0x94, 0x53, 0x11, 0x1d, 0x83, 0xba, 0x67, - 0xf8, 0x86, 0x6d, 0x63, 0xdb, 0x0a, 0xba, 0x7c, 0xef, 0x52, 0x41, 0x24, 0x47, 0xd4, 0xbd, 0x80, - 0x6f, 0x64, 0x2a, 0x08, 0xcd, 0x43, 0x35, 0xc4, 0x5d, 0xcf, 0x26, 0x87, 0xd4, 0x4c, 0x43, 0xc8, - 0x99, 0xbe, 0x2e, 0x8b, 0xa1, 0x57, 0xe0, 0x28, 0xa3, 0x51, 0xdb, 0xc4, 0x86, 0x69, 0x5b, 0x0e, - 0xd9, 0x47, 0x48, 0x93, 0xd9, 0xb8, 0x16, 0xf5, 0xc3, 0xec, 0xf3, 0x22, 0xff, 0xba, 0xce, 0x3e, - 0xb6, 0xfe, 0x7a, 0x01, 0x6a, 0x52, 0x3b, 0x37, 0xf4, 0x8c, 0x3c, 0x2f, 0x27, 0x51, 0x21, 0x8b, - 0xae, 0x45, 0x56, 0x98, 0x98, 0x4a, 0x68, 0x25, 0x36, 0x8f, 0x5f, 0xce, 0x8a, 0x45, 0xfe, 0x8a, - 0xe6, 0x75, 0x73, 0x0e, 0xc6, 0x63, 0x60, 0x22, 0x24, 0x6e, 0x59, 0x8e, 0x61, 0x5b, 0x1f, 0x90, - 0xfd, 0x5a, 0xa3, 0x4c, 0x5a, 0x81, 0x34, 0x1f, 0x92, 0xb3, 0x78, 0x06, 0xca, 0xde, 0x0e, 0x39, - 0xbd, 0xb2, 0xd5, 0xcc, 0x12, 0xad, 0xbf, 0x3a, 0x01, 0x25, 0xb2, 0x89, 0x0d, 0x4d, 0xa4, 0xd3, - 0xbc, 0x73, 0x85, 0xac, 0x47, 0xa7, 0x59, 0x65, 0x99, 0xde, 0x0f, 0x35, 0x2b, 0x68, 0x77, 0x0d, - 0x2a, 0x8a, 0x15, 0x19, 0xa3, 0xb5, 0x82, 0x4b, 0x34, 0x8d, 0x96, 0x12, 0x6b, 0xf8, 0xd9, 0x0c, - 0xb8, 0xe9, 0x7e, 0x1c, 0xa7, 0xfe, 0x59, 0x18, 0x55, 0x2f, 0xa8, 0x0e, 0x3e, 0xd6, 0xb0, 0xcc, - 0xba, 0x28, 0xd5, 0xfc, 0xb2, 0x06, 0x25, 0x4a, 0xeb, 0x87, 0xa1, 0x8e, 0x6f, 0x85, 0xd8, 0x77, - 0x0c, 0xbb, 0x6d, 0x99, 0x42, 0xbf, 0x2f, 0x40, 0x2b, 0x26, 0xc9, 0xe0, 0xf9, 0xee, 0xae, 0x65, - 0x62, 0x9f, 0x64, 0x60, 0xac, 0x0c, 0x04, 0x68, 0xc5, 0x44, 0x8f, 0xc1, 0x78, 0xcf, 0x09, 0xc8, - 0x09, 0xa7, 0x67, 0x1b, 0x9b, 0x36, 0xe6, 0x7d, 0x8e, 0x03, 0x89, 0xa4, 0xe7, 0xb9, 0xe6, 0xc2, - 0xca, 0xa2, 0xce, 0xe5, 0x18, 0x91, 0x6c, 0xfe, 0x1c, 0x98, 0x81, 0x9b, 0x0f, 0xa9, 0x0e, 0xd5, - 0x8e, 0xe1, 0x19, 0x1d, 0x2b, 0xdc, 0xe3, 0xe3, 0xf6, 0x4a, 0x2e, 0x1a, 0xcd, 0x2e, 0xf0, 0xd2, - 0xba, 0xc4, 0x13, 0x4d, 0x93, 0x82, 0x32, 0x4d, 0xd0, 0x75, 0x2e, 0x35, 0x59, 0xce, 0x96, 0xcb, - 0xe7, 0xf1, 0x6b, 0xf9, 0xaa, 0xa2, 0x3f, 0xf7, 0x82, 0x10, 0x77, 0x57, 0x9c, 0x2d, 0x97, 0xc9, - 0x5c, 0xe4, 0x17, 0xfa, 0x24, 0xd4, 0x0d, 0xdb, 0x76, 0x3b, 0x46, 0x48, 0x29, 0x52, 0xba, 0xa3, - 0x7e, 0xa8, 0xa8, 0x12, 0x1c, 0xb2, 0x7c, 0xc7, 0x1c, 0x12, 0xad, 0xc3, 0xa8, 0x61, 0x9a, 0x54, - 0xd3, 0xc2, 0xf8, 0xed, 0xc9, 0xfc, 0x34, 0x98, 0x67, 0x08, 0x74, 0x81, 0x09, 0x6d, 0x40, 0x85, - 0x4a, 0x75, 0xe2, 0x18, 0x97, 0x93, 0xae, 0x52, 0x7e, 0x5c, 0x21, 0x48, 0x74, 0x8e, 0x0b, 0x3d, - 0x06, 0x13, 0x5c, 0xa4, 0x6f, 0x5b, 0x4e, 0xbb, 0x17, 0x60, 0x7a, 0xae, 0xab, 0x09, 0x59, 0x28, - 0x58, 0x71, 0xae, 0x06, 0x18, 0x6d, 0xc3, 0x94, 0xc8, 0x65, 0x84, 0x21, 0x3b, 0xb6, 0xd7, 0x86, - 0x69, 0xc5, 0x3c, 0x2f, 0xcd, 0x8f, 0x13, 0x93, 0x1c, 0xab, 0x00, 0x37, 0x37, 0xa1, 0x2a, 0xc6, - 0x88, 0x6c, 0xf4, 0x1d, 0xaf, 0xc7, 0xf7, 0x51, 0xf2, 0x93, 0x6c, 0x71, 0x5d, 0xdc, 0x75, 0xfd, - 0x3d, 0xbe, 0x71, 0xf2, 0x14, 0x11, 0x96, 0xe8, 0x45, 0x96, 0x22, 0x85, 0xb2, 0x1b, 0x29, 0x0d, - 0x18, 0xe5, 0xba, 0x71, 0xb1, 0x38, 0x78, 0xb2, 0xf9, 0xd5, 0x22, 0x4c, 0xc4, 0x67, 0x19, 0xd9, - 0x59, 0xbb, 0x46, 0x67, 0xc7, 0x72, 0xf0, 0xca, 0x22, 0x17, 0x53, 0x23, 0x00, 0xe1, 0x9d, 0x01, - 0xcd, 0x7b, 0xf5, 0xea, 0xca, 0xa2, 0xb8, 0x78, 0x1c, 0x41, 0x48, 0xb3, 0x36, 0x5d, 0x37, 0x5c, - 0x59, 0xa4, 0xb6, 0xa4, 0x9a, 0xce, 0x53, 0xe8, 0x71, 0x98, 0xb8, 0x41, 0x28, 0x62, 0x27, 0x4c, - 0x7d, 0xe3, 0x0c, 0x2a, 0x8e, 0xfb, 0xf7, 0x41, 0xd5, 0x0d, 0xda, 0xaa, 0xf8, 0x3e, 0xea, 0x06, - 0x74, 0x94, 0xd0, 0x29, 0xb8, 0x4f, 0x1e, 0x91, 0xda, 0x7e, 0xcf, 0x21, 0x42, 0x43, 0xe2, 0x76, - 0xdf, 0x51, 0x99, 0x41, 0x67, 0xdf, 0x95, 0x8b, 0xf7, 0x64, 0x44, 0x6c, 0x1c, 0x26, 0xf4, 0x0d, - 0x13, 0x1c, 0x2c, 0x32, 0x3e, 0x03, 0x88, 0x40, 0xda, 0x9e, 0xef, 0xde, 0xda, 0x4b, 0x5c, 0x77, - 0x9b, 0x22, 0x5f, 0xd6, 0xc8, 0x07, 0x91, 0xfb, 0x69, 0x98, 0x72, 0x3d, 0xaa, 0x5a, 0x70, 0xb6, - 0xdb, 0x8c, 0x08, 0xfc, 0xec, 0x3e, 0x29, 0xe1, 0x8c, 0xb2, 0xa8, 0x05, 0x63, 0x86, 0xdf, 0xd9, - 0xb1, 0x42, 0xdc, 0x09, 0x7b, 0x3e, 0x33, 0x74, 0xd5, 0xf4, 0x18, 0xac, 0x79, 0x1a, 0xea, 0xca, - 0x6c, 0x97, 0xe7, 0x6a, 0x4d, 0x39, 0x57, 0x37, 0xa2, 0xd5, 0xc4, 0xc9, 0xc3, 0x93, 0xcd, 0x25, - 0x98, 0x88, 0x4f, 0x6b, 0xc2, 0x95, 0xe8, 0x91, 0x9b, 0xef, 0x70, 0x2c, 0x41, 0x05, 0x33, 0xeb, - 0x03, 0xdc, 0xde, 0xdc, 0x0b, 0x71, 0xc0, 0xe7, 0x4e, 0x8d, 0x40, 0xce, 0x11, 0x00, 0x41, 0x13, - 0x9f, 0x97, 0xa9, 0xc2, 0xfe, 0xc3, 0x50, 0x37, 0x31, 0x3d, 0x41, 0x52, 0x81, 0x9e, 0x33, 0x6d, - 0x06, 0xa2, 0x12, 0xfd, 0xbf, 0x2e, 0x41, 0x71, 0xcd, 0x35, 0x7f, 0x51, 0x82, 0xad, 0x90, 0x8a, - 0xd8, 0x8e, 0xb9, 0x90, 0xd8, 0x14, 0x3f, 0x31, 0xb0, 0x30, 0x45, 0x70, 0xc0, 0x5b, 0xe2, 0x3f, - 0x2c, 0x50, 0xdf, 0xa8, 0xdb, 0x49, 0x16, 0x64, 0x78, 0xbb, 0x38, 0x08, 0x94, 0xd9, 0xcf, 0x93, - 0x64, 0x5d, 0xf9, 0xd8, 0x08, 0xe4, 0x54, 0xe7, 0x29, 0x02, 0xdf, 0x71, 0x83, 0x70, 0x65, 0x8d, - 0x4f, 0x68, 0x9e, 0xa2, 0xf8, 0x5d, 0x73, 0x65, 0x8d, 0xcf, 0x5d, 0x96, 0x38, 0x70, 0xf9, 0x37, - 0x21, 0xe6, 0x8f, 0x26, 0xc5, 0xfc, 0x65, 0x18, 0x13, 0xaa, 0x06, 0xba, 0x0b, 0x56, 0xf3, 0xb8, - 0x2c, 0xd6, 0x79, 0x51, 0xc2, 0x95, 0x5a, 0xbf, 0x57, 0x81, 0xa9, 0xa4, 0xcd, 0x6c, 0xe8, 0xd9, - 0xf5, 0x76, 0x4c, 0xfe, 0x5a, 0xc8, 0x67, 0xa9, 0xeb, 0x03, 0x28, 0x33, 0xed, 0x5d, 0x39, 0xd3, - 0x8a, 0x59, 0xee, 0x5e, 0x0d, 0x46, 0x1d, 0x3f, 0x5f, 0xfd, 0xc7, 0x22, 0xcc, 0xa4, 0xd5, 0x8e, - 0xba, 0x31, 0xa1, 0x86, 0xd0, 0xf8, 0xad, 0x03, 0xe8, 0x94, 0x14, 0x11, 0xd8, 0x59, 0x37, 0x92, - 0x77, 0x1e, 0x81, 0x31, 0xa3, 0xd3, 0xc1, 0x41, 0xd0, 0xee, 0xd2, 0x5b, 0x9e, 0x05, 0xca, 0x60, - 0xea, 0x0c, 0x76, 0x89, 0x3a, 0xf3, 0x5e, 0x80, 0x63, 0xfd, 0xf6, 0x51, 0x1f, 0x53, 0x0b, 0x69, - 0xdb, 0x73, 0x6d, 0xab, 0xb3, 0xc7, 0x67, 0xf2, 0x83, 0x49, 0x8b, 0xa7, 0xce, 0x72, 0xad, 0xd1, - 0x4c, 0xe8, 0x4d, 0xa8, 0xb1, 0x42, 0x3e, 0xde, 0xca, 0x26, 0xd4, 0xf2, 0xcb, 0xe0, 0x78, 0x0b, - 0xfb, 0xd8, 0xe9, 0x60, 0xbd, 0x4a, 0xcb, 0xeb, 0x78, 0x0b, 0x99, 0x69, 0x97, 0xe5, 0xf8, 0x95, - 0xf5, 0x32, 0x37, 0x8b, 0xa4, 0x28, 0x46, 0xfa, 0x68, 0xc3, 0x54, 0x24, 0x7d, 0xf7, 0xe1, 0x18, - 0xbc, 0x79, 0x1a, 0xc6, 0x63, 0x84, 0xcb, 0xa5, 0xde, 0x7a, 0xaf, 0xdf, 0x8b, 0xf4, 0x60, 0x39, - 0x46, 0xeb, 0x9b, 0x25, 0x38, 0x9c, 0x6a, 0x7d, 0x1e, 0x7a, 0x39, 0x5d, 0x8c, 0x2d, 0xa7, 0x57, - 0x87, 0x30, 0x7c, 0x2b, 0x4b, 0x68, 0x3b, 0xb1, 0x84, 0xae, 0x0c, 0x81, 0x6e, 0x9f, 0x4a, 0xe2, - 0x8b, 0xe9, 0x1b, 0x05, 0xb8, 0xff, 0x36, 0xf9, 0xf6, 0xa1, 0x77, 0x86, 0xa9, 0xbf, 0xa7, 0x2c, - 0x46, 0xa6, 0xb8, 0x7d, 0xf7, 0x80, 0xfb, 0xb0, 0xdf, 0xc2, 0xbc, 0xa3, 0xa9, 0xd7, 0xfa, 0xa3, - 0x12, 0xdc, 0xb7, 0xef, 0xe8, 0x10, 0xc9, 0x28, 0xe6, 0xa2, 0xd1, 0x56, 0x84, 0x82, 0x29, 0xd5, - 0xf3, 0x82, 0x2a, 0x85, 0x33, 0x90, 0xe9, 0x7d, 0x35, 0x90, 0x0f, 0x1b, 0xeb, 0xd5, 0x21, 0xa7, - 0xce, 0xac, 0x1a, 0x0e, 0xc1, 0xf2, 0x31, 0xbd, 0x26, 0xa1, 0x84, 0xf9, 0x21, 0xf2, 0x0a, 0x5f, - 0xed, 0x8a, 0xa6, 0x1b, 0x18, 0x88, 0xb4, 0xb7, 0xf9, 0xbf, 0x0a, 0x30, 0x93, 0x86, 0x04, 0x79, - 0x50, 0xb1, 0xad, 0xae, 0x15, 0x0a, 0xd3, 0xc0, 0x27, 0x0f, 0xb2, 0x89, 0xb3, 0xab, 0x14, 0xb5, - 0x30, 0x2d, 0xd1, 0x04, 0xda, 0x85, 0xaa, 0xcf, 0xa2, 0x3a, 0x08, 0x5b, 0xc2, 0xa7, 0x0e, 0xb4, - 0x4e, 0x1e, 0x32, 0x82, 0xd7, 0x2a, 0xeb, 0xa2, 0x96, 0xa6, 0xa8, 0x39, 0xb9, 0x98, 0xd6, 0x69, - 0x18, 0x8f, 0x61, 0xcd, 0x35, 0xed, 0x7e, 0xa0, 0xc1, 0x64, 0x82, 0x65, 0x4b, 0xa7, 0x3f, 0x4d, - 0x71, 0xfa, 0xcb, 0x1f, 0xd5, 0x85, 0x5b, 0xd3, 0x4a, 0xd2, 0x9a, 0x36, 0x38, 0x2a, 0x55, 0x9a, - 0x65, 0xb2, 0x92, 0x6a, 0x99, 0x6c, 0xfd, 0xd6, 0x28, 0x8c, 0x72, 0x51, 0xe5, 0x00, 0xc5, 0xdc, - 0xd7, 0x63, 0x62, 0xee, 0xf1, 0x4c, 0x92, 0x92, 0xaa, 0x1d, 0x5a, 0x4c, 0xc8, 0xba, 0xcf, 0x64, - 0xc4, 0x10, 0xe7, 0x8d, 0x7f, 0x5a, 0xe4, 0xea, 0x9b, 0xb4, 0x33, 0xc8, 0x12, 0x11, 0x2d, 0xfd, - 0x30, 0xa3, 0xa5, 0x4b, 0x6d, 0xe3, 0xec, 0x9a, 0xeb, 0x87, 0x3a, 0x2b, 0x1d, 0x8b, 0x71, 0x56, - 0x4c, 0xc4, 0x38, 0x7b, 0x80, 0x6c, 0xfa, 0xd4, 0xba, 0x28, 0x05, 0xdb, 0x08, 0x80, 0x8e, 0x45, - 0x3a, 0xa5, 0x95, 0x35, 0x61, 0x65, 0x51, 0x41, 0xe8, 0x09, 0x98, 0xb0, 0x5d, 0xc3, 0xdc, 0x34, - 0x6c, 0xc3, 0xe9, 0x50, 0x24, 0x6c, 0x10, 0x13, 0x50, 0xf4, 0x28, 0x8c, 0x4b, 0xed, 0x14, 0x9d, - 0x3e, 0xec, 0x40, 0x3b, 0x26, 0x80, 0x94, 0x97, 0x3d, 0x0d, 0x53, 0x01, 0x0e, 0xc8, 0x98, 0xb7, - 0x8d, 0xad, 0x2d, 0xcb, 0x21, 0x7c, 0x9d, 0x1d, 0x6e, 0x27, 0x39, 0x7c, 0x9e, 0x83, 0xd1, 0x19, - 0xb8, 0x9f, 0xd4, 0xd0, 0x16, 0x55, 0x70, 0xe1, 0xa2, 0xed, 0x1b, 0xce, 0x36, 0x0e, 0xa8, 0x9a, - 0xa0, 0xa6, 0x37, 0x48, 0x96, 0x73, 0x3c, 0x07, 0x97, 0x25, 0xe8, 0x77, 0xaa, 0x35, 0x23, 0x24, - 0x4a, 0x3d, 0x73, 0x35, 0xa1, 0x4a, 0x43, 0xd9, 0x75, 0x5c, 0x9b, 0x4f, 0x18, 0x99, 0x66, 0x87, - 0x7e, 0x3f, 0xe4, 0x3a, 0x72, 0xfa, 0x9b, 0xcc, 0x75, 0x16, 0x4e, 0xad, 0x4d, 0x3f, 0x95, 0xd4, - 0x08, 0x6b, 0xb4, 0x12, 0x61, 0xd5, 0xa3, 0x9f, 0x99, 0x9e, 0x9c, 0x6a, 0x98, 0xc8, 0xc7, 0xe6, - 0x3f, 0x8b, 0x54, 0xf9, 0x37, 0xe1, 0x88, 0x4a, 0xb6, 0x76, 0x74, 0xd3, 0x96, 0xb1, 0xc4, 0x37, - 0xf2, 0x4c, 0xb1, 0xd9, 0x55, 0xa5, 0xf3, 0xc2, 0x9f, 0xf9, 0x70, 0x6c, 0x58, 0x04, 0xfa, 0xe6, - 0x39, 0x38, 0x94, 0x92, 0x9b, 0xb4, 0x9b, 0x1c, 0x72, 0xd4, 0x0d, 0xa8, 0x4a, 0x00, 0x74, 0xb0, - 0x26, 0xa0, 0xb0, 0xb2, 0xc6, 0xe9, 0x53, 0x58, 0x59, 0x6b, 0xfd, 0x98, 0xf4, 0x83, 0xb9, 0x34, - 0x0e, 0xbb, 0x48, 0xcf, 0xc5, 0x8c, 0x44, 0xb3, 0x59, 0x1c, 0x29, 0x93, 0x16, 0x22, 0xb9, 0x8e, - 0x8a, 0xd1, 0x3a, 0x1a, 0xde, 0x6a, 0xf4, 0xa5, 0x12, 0x1c, 0x4e, 0x75, 0xb0, 0x3c, 0x40, 0x3e, - 0xb4, 0x1a, 0xe3, 0x43, 0x27, 0x86, 0xf0, 0xf6, 0x54, 0xb9, 0x92, 0x9e, 0xe0, 0x4a, 0xa7, 0x86, - 0xc2, 0x17, 0xe7, 0x51, 0xdf, 0x12, 0x2a, 0xe6, 0xa7, 0x61, 0xca, 0xc4, 0x81, 0xe5, 0x63, 0xb3, - 0xcd, 0xbd, 0x4b, 0x03, 0x6e, 0x7c, 0x99, 0xe4, 0x70, 0x8e, 0x2f, 0xce, 0x73, 0x0a, 0x09, 0x9e, - 0xb3, 0x0c, 0x63, 0x9e, 0x6b, 0xb6, 0x87, 0x33, 0xbf, 0xd4, 0x3d, 0xd7, 0xdc, 0xe0, 0x25, 0x9b, - 0xa6, 0x5c, 0x3a, 0x4f, 0xc3, 0x54, 0xa7, 0xe7, 0xfb, 0xe4, 0xb4, 0x91, 0x6c, 0x1a, 0x87, 0xcb, - 0xa6, 0xcd, 0xc1, 0x21, 0x77, 0x93, 0x9c, 0x78, 0xb1, 0xd9, 0x56, 0x5c, 0x58, 0x98, 0x82, 0x06, - 0x89, 0x4f, 0x17, 0xe4, 0x97, 0xd6, 0x7f, 0x2e, 0x02, 0x44, 0x1e, 0xc4, 0x07, 0x38, 0xf4, 0xf3, - 0xb1, 0xa1, 0x7f, 0x36, 0xab, 0x0f, 0xb3, 0x3a, 0xde, 0x17, 0x12, 0xe3, 0x3d, 0x97, 0x1d, 0xc9, - 0xc7, 0x83, 0xac, 0x0e, 0xf2, 0x9f, 0x14, 0x09, 0x93, 0x10, 0x1e, 0xff, 0x07, 0x37, 0xc6, 0x6f, - 0xc4, 0xc6, 0xf8, 0x99, 0x8c, 0xf7, 0x0f, 0xd4, 0x21, 0x3e, 0x9f, 0x18, 0xe2, 0xd9, 0xcc, 0x38, - 0xe2, 0x23, 0x6c, 0xf3, 0x01, 0x56, 0x47, 0x4d, 0x1b, 0x30, 0x6a, 0x85, 0xa1, 0x47, 0xed, 0x6f, - 0x45, 0xdb, 0xda, 0x09, 0x68, 0x88, 0x61, 0x73, 0x7a, 0xdd, 0x4d, 0xb2, 0x59, 0x33, 0x7b, 0x12, - 0x36, 0xf9, 0xf0, 0x1d, 0xe1, 0xdf, 0x2f, 0xd3, 0xcf, 0xeb, 0xe2, 0x2b, 0x19, 0x45, 0x5e, 0xa2, - 0x6b, 0x05, 0x51, 0x21, 0x66, 0xce, 0x45, 0xec, 0xd3, 0x25, 0xe5, 0x0b, 0xa9, 0x4a, 0x4c, 0xde, - 0xbe, 0xaa, 0xd8, 0x96, 0x7d, 0x84, 0x7f, 0x4f, 0x54, 0xd5, 0xfa, 0x4f, 0x00, 0x10, 0x5d, 0xda, - 0xf8, 0x45, 0x2d, 0xf2, 0xa8, 0x05, 0xea, 0x0c, 0x78, 0x2b, 0x31, 0x03, 0x4e, 0x66, 0x46, 0x12, - 0xfd, 0x4c, 0x4c, 0x86, 0xbf, 0x57, 0xb9, 0x47, 0x97, 0x3b, 0x3a, 0x0e, 0xd3, 0x5d, 0xcb, 0x69, - 0xfb, 0xd8, 0x30, 0xf7, 0x62, 0xf6, 0xf4, 0xb2, 0x3e, 0xd9, 0xb5, 0x1c, 0x9d, 0xc0, 0xb9, 0x25, - 0x1d, 0xbd, 0x04, 0x47, 0x7c, 0xbc, 0x6b, 0x51, 0x89, 0x71, 0xc7, 0x22, 0x67, 0xe3, 0xbd, 0x36, - 0x3d, 0xdc, 0x71, 0x29, 0x6b, 0x46, 0x7c, 0x5d, 0x66, 0x1f, 0xe9, 0xb1, 0x0b, 0x1d, 0x81, 0x8a, - 0x67, 0xf4, 0x02, 0x1a, 0xe1, 0x51, 0x7b, 0xaa, 0xaa, 0xf3, 0x14, 0x7a, 0x17, 0xea, 0x64, 0x03, - 0xdc, 0x34, 0x3a, 0x37, 0xda, 0xa1, 0xcb, 0xef, 0xf9, 0xbc, 0x96, 0x6b, 0xc0, 0x66, 0x75, 0x8e, - 0x80, 0xb9, 0xb0, 0xe8, 0x20, 0x10, 0x6e, 0xb8, 0xe8, 0x14, 0xdc, 0xe7, 0xf9, 0x2e, 0x95, 0xac, - 0xfa, 0x1d, 0x06, 0xaa, 0xb4, 0xbd, 0x47, 0x45, 0x86, 0x84, 0xcb, 0x00, 0xfa, 0x34, 0x54, 0x83, - 0xd0, 0x37, 0x42, 0xbc, 0xbd, 0xc7, 0x6f, 0xff, 0xbc, 0x91, 0xaf, 0x5d, 0xea, 0x44, 0x60, 0x78, - 0x74, 0x89, 0xb1, 0xf9, 0x4d, 0x0d, 0x50, 0x7f, 0x86, 0xd4, 0x23, 0x89, 0x0d, 0x13, 0xa4, 0x4b, - 0x96, 0xb3, 0xdd, 0xe6, 0xb1, 0x37, 0x0b, 0x59, 0xf4, 0xaf, 0x69, 0x64, 0xb2, 0x9c, 0x6d, 0x16, - 0x17, 0x53, 0x89, 0x9b, 0x30, 0xee, 0xab, 0x1f, 0x9a, 0x6d, 0x38, 0xba, 0x4f, 0x4e, 0xf4, 0x24, - 0x4c, 0x76, 0x8d, 0x5b, 0xed, 0x9e, 0x63, 0xec, 0x1a, 0x16, 0x33, 0x57, 0xb3, 0x76, 0x4e, 0x74, - 0x8d, 0x5b, 0x57, 0x23, 0x28, 0x11, 0x62, 0x49, 0xc6, 0xa0, 0xe7, 0x4b, 0xcd, 0x5d, 0xb5, 0x6b, - 0xdc, 0x5a, 0x27, 0xe9, 0xe6, 0x33, 0x30, 0x11, 0x1f, 0x31, 0x32, 0xc9, 0xc5, 0xa4, 0xe1, 0x46, - 0x40, 0x99, 0x6e, 0xfe, 0xe3, 0x02, 0x4c, 0x25, 0x57, 0xd4, 0x7e, 0x3b, 0x8d, 0xb6, 0xdf, 0x4e, - 0xc3, 0x6a, 0xe0, 0x2b, 0x8d, 0x71, 0x32, 0x99, 0x26, 0xab, 0x91, 0x91, 0x55, 0x59, 0x8d, 0x8c, - 0x6f, 0x4d, 0x72, 0xb8, 0x5c, 0x8d, 0xcf, 0x02, 0x92, 0x9d, 0x8c, 0x32, 0xb3, 0x85, 0x32, 0x2d, - 0xbf, 0xc8, 0xec, 0xcf, 0xc3, 0x8c, 0x42, 0xab, 0xa8, 0x00, 0x5b, 0x28, 0x87, 0x94, 0x6f, 0xb2, - 0xc8, 0x81, 0xfb, 0xf0, 0x7c, 0xb9, 0x04, 0x75, 0xe5, 0x42, 0xd8, 0x01, 0x32, 0xd9, 0x73, 0x31, - 0x26, 0x3b, 0x9b, 0xf9, 0x4e, 0x9a, 0xca, 0x65, 0x97, 0x13, 0x5c, 0xf6, 0xb9, 0x1c, 0x58, 0xe2, - 0xcc, 0xf5, 0x77, 0xef, 0x55, 0x59, 0x0a, 0x3d, 0x12, 0x99, 0x89, 0x14, 0xfd, 0x9c, 0xb0, 0xff, - 0x50, 0x05, 0xdd, 0xdd, 0x11, 0xb7, 0xbe, 0x54, 0x80, 0x31, 0xf5, 0x56, 0xd9, 0xd0, 0x73, 0xe1, - 0x18, 0xf7, 0x6a, 0x21, 0x0b, 0x14, 0x0b, 0xd2, 0xa9, 0x20, 0xf4, 0x29, 0x00, 0xcf, 0xf0, 0x8d, - 0x2e, 0x0e, 0xb1, 0x1f, 0x70, 0x3d, 0xf1, 0xa9, 0xec, 0xf7, 0xdd, 0x66, 0xd7, 0x64, 0x61, 0x76, - 0xce, 0x54, 0xb0, 0x35, 0xcf, 0xc0, 0x64, 0xe2, 0x73, 0xae, 0xf3, 0xe5, 0xdf, 0x2e, 0x40, 0x99, - 0x5e, 0x7f, 0x1d, 0xba, 0xfb, 0x91, 0xed, 0xa1, 0x10, 0xb3, 0x56, 0x2a, 0xd6, 0x8a, 0x62, 0xdc, - 0x5a, 0x31, 0x2f, 0x63, 0x07, 0x97, 0xb2, 0xdc, 0xcd, 0xa2, 0xcd, 0xe3, 0xba, 0x13, 0x11, 0x3c, - 0xf8, 0x49, 0x98, 0xdc, 0xb2, 0xfc, 0x20, 0xec, 0xbb, 0x27, 0x30, 0x41, 0xc1, 0xd1, 0x25, 0x81, - 0xc7, 0x61, 0xc2, 0x36, 0x62, 0xf9, 0xd8, 0x45, 0x81, 0x71, 0x02, 0x8d, 0xb2, 0xcd, 0x40, 0x99, - 0xba, 0x40, 0xd3, 0x2d, 0xb7, 0xac, 0xb3, 0x84, 0xdc, 0x7e, 0xaa, 0xd1, 0xf6, 0xd3, 0x3a, 0x0b, - 0x75, 0xa5, 0x41, 0x54, 0x7b, 0xe5, 0x76, 0x3d, 0xd7, 0xc1, 0x8e, 0x70, 0x65, 0x8d, 0x00, 0x04, - 0xc1, 0x8e, 0x1b, 0x84, 0xc2, 0x9b, 0x95, 0xfc, 0x6e, 0xfd, 0xa1, 0x06, 0xa3, 0x22, 0xb6, 0xfb, - 0x2a, 0xd4, 0x3a, 0x5e, 0xaf, 0xdd, 0xa3, 0x54, 0xd2, 0xb2, 0xb0, 0x37, 0x5e, 0x92, 0x2a, 0x1d, - 0xd6, 0x5c, 0xcb, 0x09, 0xf5, 0x6a, 0xc7, 0xeb, 0x5d, 0xa5, 0x74, 0xd5, 0x61, 0x8c, 0x39, 0x86, - 0x70, 0x84, 0x85, 0xe1, 0x10, 0xd6, 0x19, 0x12, 0x8a, 0xb3, 0x79, 0x96, 0x29, 0x2e, 0xe8, 0x17, - 0xd2, 0xd9, 0x88, 0x8e, 0xdc, 0xcf, 0x33, 0x54, 0x69, 0x18, 0x4d, 0xb2, 0x22, 0x9f, 0x64, 0xad, - 0x7f, 0xa4, 0xc1, 0xc3, 0x7d, 0x61, 0x54, 0xf0, 0xb6, 0x45, 0x6f, 0xed, 0x65, 0x89, 0x68, 0x4c, - 0xb9, 0x44, 0x41, 0x51, 0x8e, 0x3d, 0x04, 0x60, 0x99, 0xd8, 0x09, 0xad, 0x2d, 0x0b, 0x0b, 0x75, - 0xa2, 0x02, 0xa1, 0xc2, 0x95, 0xdd, 0xdb, 0xb6, 0x84, 0xdf, 0x07, 0x4f, 0xa1, 0xa3, 0x30, 0x4a, - 0xbd, 0x21, 0xb6, 0x37, 0xf9, 0x5c, 0xa9, 0x90, 0xe4, 0x85, 0x4d, 0xc2, 0xf8, 0xb0, 0x63, 0x7a, - 0xa4, 0x8b, 0xe2, 0x05, 0x06, 0x91, 0x6e, 0xbd, 0x05, 0x8f, 0x24, 0x5b, 0x7f, 0xd5, 0xb9, 0xa3, - 0xf6, 0xb7, 0xbe, 0xa6, 0xc1, 0x63, 0xe9, 0x81, 0x5f, 0xee, 0x88, 0x2c, 0x4a, 0xf7, 0x8a, 0xb1, - 0xee, 0xdd, 0xf6, 0xf1, 0x86, 0x56, 0x08, 0x4f, 0xa4, 0x36, 0xe6, 0x0e, 0x7b, 0x79, 0xfb, 0x5b, - 0x21, 0xad, 0x9f, 0x15, 0x65, 0xb8, 0x16, 0x76, 0xad, 0x6b, 0x58, 0xee, 0x73, 0x25, 0x66, 0x8f, - 0x3c, 0x9d, 0xfd, 0xa6, 0x5b, 0x2c, 0xa1, 0x78, 0x90, 0xfe, 0xb4, 0x00, 0x53, 0xc9, 0x4f, 0x94, - 0x3d, 0xec, 0xe0, 0xce, 0x0d, 0x61, 0x1f, 0xa4, 0x09, 0xc2, 0x5b, 0xe8, 0x8f, 0xb6, 0xe5, 0x84, - 0xd8, 0xdf, 0x35, 0x84, 0xae, 0x76, 0x9c, 0x42, 0x57, 0x38, 0x90, 0x64, 0xa3, 0x97, 0xde, 0xa2, - 0x6c, 0x8c, 0x1c, 0xe3, 0x14, 0x2a, 0xb3, 0xad, 0x40, 0xcd, 0xc7, 0x1d, 0x6c, 0xed, 0x92, 0x3d, - 0xa2, 0x94, 0x25, 0x94, 0x09, 0x0b, 0xa1, 0xc3, 0xcb, 0xe8, 0x51, 0x69, 0x74, 0x1d, 0x4a, 0xbb, - 0x86, 0x2f, 0x5c, 0xfa, 0x96, 0xee, 0x80, 0x28, 0xb3, 0xd7, 0x0c, 0xb1, 0xe9, 0x50, 0x94, 0xcd, - 0x57, 0xa1, 0x26, 0x41, 0xb9, 0x36, 0x9a, 0x6f, 0x97, 0xa1, 0x26, 0x6f, 0x06, 0x0e, 0x3d, 0xdc, - 0x2b, 0xb1, 0xe1, 0x7e, 0x39, 0xe3, 0x45, 0xc4, 0xe8, 0x97, 0x32, 0xd0, 0xbf, 0x56, 0x82, 0xf1, - 0x18, 0x1c, 0xb5, 0x63, 0x6a, 0x89, 0xe2, 0x60, 0x77, 0x91, 0x7d, 0x2a, 0x98, 0x8d, 0xdf, 0xc8, - 0x89, 0xa4, 0xa8, 0xd8, 0xdd, 0x9a, 0x42, 0xe2, 0x6e, 0x8d, 0x9c, 0x63, 0xc5, 0xdb, 0xcf, 0xb1, - 0x52, 0xb6, 0x39, 0x56, 0x1e, 0x38, 0xc7, 0x2a, 0x77, 0x34, 0xc7, 0xd6, 0xf9, 0x1c, 0x63, 0x4e, - 0x99, 0x67, 0x87, 0x23, 0x54, 0x72, 0x76, 0x9d, 0x86, 0xf1, 0xe1, 0x6f, 0x0b, 0x0d, 0x3d, 0x35, - 0xbf, 0x51, 0x82, 0xaa, 0xb8, 0x6b, 0x3a, 0xf4, 0xcc, 0xbc, 0x10, 0x9b, 0x99, 0x2f, 0x66, 0xbb, - 0xd9, 0x2a, 0x7f, 0x28, 0xf3, 0xf2, 0x0b, 0x45, 0x18, 0x53, 0xc1, 0xb7, 0xd5, 0x96, 0xdd, 0x07, - 0x55, 0x22, 0x97, 0x2b, 0x13, 0x6a, 0xd4, 0x73, 0xcd, 0x5f, 0xc6, 0xf9, 0xf4, 0x56, 0x6c, 0x3e, - 0x9d, 0x19, 0x82, 0x7e, 0x07, 0xc7, 0xab, 0xde, 0x82, 0xf1, 0x58, 0x3b, 0x49, 0x56, 0x1a, 0x37, - 0x44, 0xf0, 0xff, 0x40, 0xdc, 0x5b, 0x0c, 0x5d, 0xee, 0xee, 0x50, 0x08, 0x5d, 0x32, 0x50, 0x8e, - 0x1b, 0x13, 0x4b, 0x64, 0xba, 0x75, 0x0b, 0x4a, 0x34, 0xa4, 0xc2, 0xb0, 0xd3, 0xeb, 0x04, 0x94, - 0xfd, 0x9e, 0x8d, 0x85, 0x21, 0x76, 0x50, 0x54, 0x88, 0x9e, 0x8d, 0x75, 0x56, 0xa0, 0xf5, 0x6f, - 0x35, 0xa8, 0xab, 0xe1, 0x11, 0x86, 0x6d, 0xc1, 0x3c, 0x54, 0x83, 0x1e, 0xb5, 0xdd, 0x8b, 0x46, - 0x0c, 0xf2, 0xed, 0x63, 0xb9, 0x75, 0x59, 0x0c, 0x2d, 0x43, 0x95, 0xc6, 0x7d, 0xf0, 0xf1, 0x56, - 0x36, 0x65, 0x64, 0xd2, 0xbd, 0x6b, 0x94, 0x14, 0xd7, 0xf1, 0x56, 0xeb, 0xff, 0x83, 0xba, 0x12, - 0x0f, 0xe2, 0x17, 0x40, 0xd5, 0xdf, 0xd7, 0x00, 0xf5, 0x47, 0xa4, 0xf8, 0xb3, 0x41, 0xdc, 0xbf, - 0xa9, 0x41, 0x89, 0xf4, 0x95, 0xae, 0x10, 0xec, 0x6f, 0x4a, 0xaf, 0x62, 0x9a, 0x40, 0x0f, 0x02, - 0x18, 0x9e, 0xd5, 0xde, 0xf6, 0xdd, 0x9e, 0x27, 0xbc, 0x7d, 0x6a, 0x86, 0x67, 0x5d, 0xa0, 0x00, - 0x22, 0xf8, 0xa9, 0xbe, 0x3e, 0xf4, 0x6b, 0xe4, 0x9d, 0xf3, 0x38, 0x4c, 0x48, 0xa7, 0x0b, 0xe6, - 0xb1, 0x5c, 0xa2, 0x59, 0xc6, 0x05, 0x94, 0x5e, 0xdf, 0x41, 0xc7, 0x61, 0xda, 0x71, 0x9d, 0xb6, - 0xcc, 0xda, 0xf3, 0x6d, 0x61, 0xfc, 0x9f, 0x74, 0x5c, 0x47, 0x28, 0x79, 0xae, 0xfa, 0x76, 0xd0, - 0xb2, 0x61, 0x94, 0x53, 0x23, 0xd5, 0x97, 0xe4, 0x7e, 0xa8, 0xc9, 0xe6, 0x8a, 0x4d, 0x57, 0xb4, - 0x36, 0xff, 0x63, 0x67, 0xad, 0xdf, 0x06, 0xa8, 0xb0, 0xf8, 0x1c, 0x43, 0x0f, 0xf6, 0x99, 0xd8, - 0x56, 0xf1, 0x74, 0x96, 0x58, 0x20, 0xb3, 0xa9, 0x2e, 0xce, 0xc5, 0x2c, 0x2e, 0xce, 0x02, 0x41, - 0x5c, 0x41, 0xf4, 0x87, 0x95, 0x0c, 0xb6, 0x98, 0x0d, 0xa8, 0x6f, 0x59, 0x36, 0x56, 0x87, 0x3a, - 0x43, 0x34, 0x20, 0xd9, 0xde, 0xd9, 0xf3, 0x96, 0x8d, 0x29, 0x9d, 0x75, 0xd8, 0x12, 0x3f, 0x03, - 0xb4, 0x08, 0xa3, 0x9b, 0x46, 0xe7, 0x06, 0x76, 0xcc, 0x8c, 0x9e, 0x2f, 0xa1, 0x11, 0xec, 0x9c, - 0x63, 0x25, 0x74, 0x51, 0x94, 0xb6, 0x9b, 0x9b, 0x4e, 0xf8, 0x20, 0xc9, 0x34, 0x7a, 0x02, 0x26, - 0x7b, 0x01, 0x6e, 0x1b, 0xbd, 0xd0, 0x6d, 0x7b, 0x3e, 0xde, 0xb2, 0x6e, 0x89, 0xed, 0xab, 0x17, - 0xe0, 0xf9, 0x5e, 0xe8, 0xae, 0x51, 0x60, 0xff, 0x5d, 0xe0, 0xca, 0x9d, 0xdd, 0x05, 0xde, 0x86, - 0x69, 0x1f, 0x93, 0x73, 0x94, 0xe5, 0x3a, 0xd4, 0xa5, 0xd5, 0x92, 0xb7, 0x56, 0x4e, 0x66, 0xa7, - 0x9a, 0x1e, 0x43, 0xb1, 0xa7, 0xf7, 0xe3, 0x4c, 0x53, 0x4c, 0x34, 0x31, 0xd4, 0x24, 0xbd, 0xa9, - 0x93, 0x88, 0x11, 0xee, 0x88, 0x85, 0x40, 0x7e, 0xd3, 0x42, 0xc6, 0xb6, 0x58, 0xb1, 0xf4, 0x37, - 0x7a, 0x0e, 0x0e, 0xc5, 0xb1, 0xef, 0x5d, 0x8e, 0x96, 0x43, 0xda, 0xa7, 0xe6, 0xf7, 0x0b, 0x30, - 0x99, 0x68, 0xe1, 0x7e, 0x77, 0x84, 0x6f, 0x60, 0xec, 0xb5, 0x6d, 0x83, 0xeb, 0x3f, 0xca, 0x7a, - 0x95, 0x00, 0x56, 0x0d, 0xf6, 0x58, 0x10, 0xfd, 0xb8, 0xe3, 0xf6, 0x7c, 0x7b, 0x8f, 0xeb, 0x97, - 0x81, 0x80, 0x96, 0x29, 0x84, 0xf0, 0x18, 0x9a, 0xc1, 0x34, 0x2c, 0x7b, 0x4f, 0xdc, 0xf9, 0x24, - 0x90, 0x45, 0x02, 0x90, 0xe5, 0x6f, 0x62, 0x7c, 0xc3, 0xde, 0xe3, 0x1a, 0x64, 0x5a, 0xe2, 0x6d, - 0x0a, 0x41, 0x8f, 0xc0, 0x18, 0xcd, 0xd0, 0x75, 0x9d, 0x70, 0xc7, 0xde, 0xa3, 0xc7, 0xfa, 0xb2, - 0x4e, 0x0b, 0x5d, 0x62, 0x20, 0x89, 0x63, 0x0f, 0x1b, 0xa4, 0x0d, 0xa3, 0x11, 0x8e, 0xeb, 0x14, - 0x22, 0x7b, 0x40, 0x89, 0xc6, 0x6e, 0x07, 0xd1, 0x1e, 0x6c, 0x10, 0xc2, 0xcd, 0x40, 0xd9, 0xf3, - 0x7b, 0x0e, 0x8b, 0x84, 0x56, 0xd5, 0x59, 0x82, 0x9c, 0xc1, 0x4d, 0x7f, 0xaf, 0xed, 0xf7, 0x1c, - 0x7a, 0xe9, 0xa3, 0xaa, 0x57, 0x4c, 0x7f, 0x4f, 0xef, 0x39, 0xcd, 0x9f, 0x47, 0xb6, 0xc8, 0xe3, - 0x30, 0xcd, 0x54, 0x57, 0x64, 0x26, 0xf7, 0x3c, 0xf5, 0xd2, 0x2c, 0xd3, 0x69, 0x9d, 0xa3, 0x70, - 0xea, 0x53, 0xff, 0x14, 0x4c, 0x51, 0xed, 0x95, 0x9a, 0x95, 0xdf, 0x9d, 0x25, 0x70, 0x25, 0xe7, - 0x19, 0xb8, 0x9f, 0xe6, 0xa4, 0xf7, 0x62, 0x83, 0x60, 0xab, 0x67, 0xc7, 0x0a, 0x31, 0x8d, 0x40, - 0x83, 0x64, 0x59, 0x97, 0x39, 0x94, 0xe2, 0xcf, 0xc1, 0x8c, 0x5a, 0x91, 0xd9, 0xe3, 0xea, 0x53, - 0x1e, 0x27, 0x20, 0xaa, 0x6c, 0x91, 0x7f, 0x21, 0x14, 0xe6, 0x99, 0x99, 0xe2, 0x8c, 0xa9, 0x54, - 0xea, 0x0c, 0xb6, 0x40, 0x40, 0xad, 0xff, 0x52, 0xa1, 0xb1, 0x9a, 0xe5, 0xe2, 0x45, 0xb3, 0x70, - 0x48, 0xf8, 0x95, 0xb2, 0xd8, 0x01, 0xaa, 0x5f, 0xcf, 0x34, 0xff, 0xc4, 0xbc, 0x6a, 0xa8, 0x08, - 0xbb, 0x0a, 0x65, 0xdb, 0xed, 0xf0, 0x73, 0xf5, 0xc0, 0xd7, 0x46, 0xd4, 0xaa, 0x66, 0x57, 0x49, - 0x39, 0xb2, 0x9c, 0x96, 0x47, 0x74, 0x86, 0x04, 0x2d, 0x40, 0x21, 0x78, 0x91, 0xb3, 0x9c, 0xe7, - 0x73, 0xa0, 0x5a, 0x7f, 0x91, 0xe3, 0x29, 0x04, 0x2f, 0xa2, 0xf3, 0x50, 0xdc, 0xee, 0x08, 0xfd, - 0xfc, 0x0b, 0x39, 0xb0, 0x5c, 0x58, 0x58, 0xe7, 0x68, 0x08, 0x02, 0xd2, 0x35, 0xe3, 0x83, 0x9e, - 0x2f, 0x7c, 0xd1, 0xf3, 0x74, 0x6d, 0x9e, 0x94, 0x13, 0x5d, 0xa3, 0x48, 0x08, 0xb6, 0xe0, 0xa6, - 0xb5, 0x25, 0x62, 0x0c, 0xe6, 0xc1, 0xb6, 0x4e, 0xca, 0x09, 0x6c, 0x14, 0x49, 0xf3, 0x2b, 0x1a, - 0xd4, 0x24, 0xfd, 0xfa, 0xa2, 0x0a, 0x68, 0xc3, 0x44, 0x15, 0xa0, 0x37, 0xcd, 0x44, 0x0c, 0x00, - 0xe1, 0xd1, 0x29, 0x01, 0xf4, 0xd2, 0x5a, 0x6f, 0x73, 0x2d, 0x0a, 0x18, 0x20, 0x92, 0xcd, 0x0d, - 0xa8, 0x30, 0xfa, 0xc7, 0xb4, 0x74, 0x5a, 0x5c, 0x4b, 0x47, 0x6f, 0xa2, 0xf5, 0x3a, 0x37, 0xb0, - 0xd0, 0xb4, 0xf2, 0x14, 0x55, 0x05, 0x32, 0xfe, 0xcf, 0xfd, 0xe2, 0x59, 0xaa, 0x79, 0x12, 0x46, - 0xf9, 0x78, 0x28, 0x45, 0xb5, 0x7d, 0x8a, 0x16, 0x62, 0x45, 0xe7, 0xa1, 0x26, 0x07, 0x80, 0x69, - 0x7f, 0xf9, 0x45, 0xac, 0x48, 0xfb, 0x2b, 0x02, 0x56, 0xdc, 0x06, 0x85, 0xa4, 0xfa, 0x70, 0x28, - 0xce, 0xd5, 0xe4, 0x2d, 0xbf, 0xd6, 0xf7, 0x4b, 0x30, 0xca, 0x43, 0x8e, 0x0d, 0x2d, 0x91, 0xbc, - 0x1e, 0x93, 0x48, 0x8e, 0x67, 0x8a, 0x6f, 0x96, 0xee, 0x89, 0x9a, 0xc9, 0xc9, 0x44, 0x62, 0x88, - 0xcb, 0x24, 0xff, 0x5d, 0x53, 0x64, 0x12, 0xb1, 0xb7, 0x6b, 0x89, 0xbd, 0xfd, 0x14, 0xdc, 0x47, - 0xef, 0x1c, 0xd1, 0xe0, 0x1a, 0x49, 0x1b, 0x36, 0xe3, 0x8d, 0x47, 0x45, 0x86, 0xa4, 0x0d, 0xfb, - 0x59, 0x40, 0x1d, 0xd7, 0x61, 0x96, 0xa3, 0xce, 0x5e, 0xfc, 0x6a, 0xca, 0xb4, 0xf2, 0x85, 0x6f, - 0x6b, 0x74, 0x56, 0x06, 0x1e, 0x11, 0x54, 0x4a, 0x94, 0x9b, 0x8b, 0x64, 0xec, 0xea, 0x7e, 0x39, - 0x4f, 0xf4, 0x05, 0x59, 0xac, 0xf9, 0xa1, 0xdc, 0x10, 0x96, 0x64, 0xd8, 0x83, 0x4c, 0x91, 0x86, - 0x93, 0x62, 0xbb, 0x88, 0x92, 0xf0, 0x0c, 0x20, 0xb6, 0x03, 0x70, 0x4a, 0xa9, 0xbb, 0x05, 0xdd, - 0x45, 0x84, 0xa7, 0x09, 0x61, 0xf8, 0xad, 0xbf, 0x56, 0x80, 0xaa, 0x08, 0x12, 0x77, 0x77, 0xa6, - 0x8d, 0xa8, 0x4d, 0x99, 0x36, 0x4b, 0x89, 0x69, 0xf3, 0x6c, 0x36, 0x0c, 0xc9, 0x79, 0xf3, 0x8e, - 0x24, 0xe5, 0xa3, 0x30, 0x1e, 0x8b, 0x20, 0xc5, 0xf7, 0xd5, 0x31, 0x35, 0x78, 0xd4, 0x3e, 0x37, - 0xb8, 0xf7, 0xbb, 0x42, 0xf3, 0x45, 0x80, 0x31, 0xb5, 0xe9, 0x64, 0x56, 0xc4, 0xaf, 0xb5, 0x8a, - 0xe4, 0x6d, 0xcd, 0xea, 0x6f, 0x45, 0xd7, 0x72, 0x8b, 0x77, 0x76, 0x75, 0x46, 0xe0, 0x41, 0x57, - 0x60, 0x52, 0x44, 0xdc, 0xe3, 0xdb, 0x29, 0xdf, 0x96, 0x9e, 0x48, 0xe3, 0xcd, 0x6c, 0x5b, 0x8d, - 0x71, 0xe8, 0x09, 0x51, 0x9c, 0x3b, 0xcd, 0x1a, 0xc9, 0x50, 0x44, 0xe5, 0x2c, 0x57, 0x9d, 0x55, - 0xe2, 0x0c, 0x8c, 0x47, 0x74, 0x0a, 0x4a, 0x96, 0x63, 0x89, 0x7d, 0xea, 0x89, 0x41, 0x81, 0xf8, - 0x2c, 0xae, 0x18, 0x23, 0x65, 0xd0, 0x75, 0x98, 0xe4, 0x12, 0x87, 0x64, 0x0e, 0xa3, 0x59, 0xcc, - 0xe4, 0x4c, 0x70, 0x11, 0xb3, 0x9f, 0x22, 0x9c, 0xd8, 0x8c, 0xc1, 0xd0, 0x31, 0x18, 0x33, 0xdd, - 0xb6, 0xe3, 0x86, 0x6d, 0xea, 0x88, 0x43, 0xe5, 0xea, 0xaa, 0x0e, 0xa6, 0x7b, 0xd9, 0x0d, 0xd7, - 0x08, 0x04, 0x1d, 0x83, 0x7a, 0x10, 0x1a, 0x8e, 0xb9, 0xb9, 0x77, 0xc9, 0x35, 0x31, 0xbf, 0xf9, - 0xab, 0x82, 0xd0, 0x63, 0x30, 0x1e, 0x84, 0x3e, 0x36, 0xba, 0x96, 0xb3, 0x7d, 0x49, 0xc4, 0xb7, - 0xad, 0xe9, 0x71, 0x20, 0x7a, 0x07, 0xaa, 0xf4, 0x1e, 0xf0, 0x2e, 0xf6, 0x79, 0xf8, 0xda, 0xb3, - 0x39, 0xc8, 0x2b, 0x12, 0xf3, 0x1c, 0x05, 0xe3, 0x29, 0x02, 0x21, 0x5a, 0xa6, 0x11, 0xea, 0x2c, - 0x32, 0x74, 0x63, 0x59, 0x5f, 0xcb, 0xee, 0xba, 0xce, 0xfc, 0x36, 0x76, 0x18, 0xa1, 0x45, 0x71, - 0xb4, 0xa6, 0x1e, 0xe2, 0xc7, 0xb3, 0x08, 0x3b, 0x83, 0xae, 0xe5, 0x9c, 0x83, 0xaa, 0xf4, 0xa8, - 0x9f, 0xc8, 0x32, 0xfa, 0xc2, 0xd1, 0x5e, 0x97, 0xe5, 0x28, 0x89, 0xf9, 0x90, 0xf9, 0xf4, 0x9c, - 0x32, 0xc9, 0x49, 0xac, 0x02, 0xd1, 0x9b, 0x50, 0x0f, 0x5d, 0x9b, 0x9b, 0xf9, 0x83, 0xc6, 0x54, - 0x96, 0x00, 0xd9, 0x1b, 0xb2, 0x80, 0xae, 0x16, 0x46, 0x9f, 0x81, 0xbe, 0xb0, 0x56, 0x8d, 0x69, - 0x8a, 0x70, 0x00, 0x39, 0xa8, 0xfc, 0x94, 0x64, 0xd5, 0x1f, 0x41, 0x88, 0xac, 0x0e, 0xcc, 0xa4, - 0x4d, 0x0a, 0x74, 0x31, 0xe2, 0x37, 0x5a, 0x26, 0x89, 0x97, 0x47, 0xcb, 0xe4, 0x7e, 0x07, 0x31, - 0x4e, 0xd3, 0xfa, 0x41, 0x01, 0xc6, 0x63, 0x61, 0x40, 0x87, 0xde, 0x31, 0x16, 0x62, 0x3b, 0xc6, - 0x5c, 0x8e, 0xc8, 0xa3, 0xca, 0xb6, 0xf1, 0x66, 0x62, 0xdb, 0x78, 0x21, 0x07, 0x9a, 0xbb, 0xba, - 0x77, 0xfc, 0x74, 0x0c, 0xa6, 0xfb, 0x3a, 0x71, 0xef, 0x6c, 0x20, 0x5b, 0x49, 0x7e, 0xcf, 0xac, - 0x8e, 0xf3, 0x39, 0x47, 0x25, 0x33, 0xd3, 0x2f, 0x1f, 0x0c, 0xd3, 0xaf, 0x7c, 0x44, 0x4c, 0x7f, - 0xb4, 0x8f, 0xe9, 0xef, 0x40, 0x35, 0x74, 0x3d, 0xd7, 0x76, 0xb7, 0xf7, 0x78, 0xb8, 0xf4, 0xd5, - 0xbc, 0xb4, 0x89, 0x41, 0xb8, 0xc2, 0x78, 0x83, 0xe3, 0xd4, 0x25, 0x76, 0x72, 0x0a, 0xc0, 0x8e, - 0xb1, 0x69, 0xe3, 0xf5, 0xf5, 0x55, 0xae, 0x52, 0x88, 0x00, 0x68, 0x03, 0xa6, 0x95, 0x88, 0xc4, - 0x8c, 0x77, 0xf0, 0xf0, 0xe9, 0x59, 0xf7, 0xfa, 0x7e, 0x04, 0xe8, 0x32, 0x24, 0x04, 0x00, 0xbe, - 0x21, 0x0d, 0x2b, 0x3e, 0x7c, 0xbc, 0xfb, 0xfc, 0x3f, 0xb7, 0xfb, 0x7c, 0xaf, 0x00, 0x0f, 0xdc, - 0x6e, 0x86, 0xa3, 0xeb, 0x50, 0xe1, 0xd1, 0xab, 0xd8, 0x4e, 0x31, 0x7f, 0x47, 0xeb, 0x87, 0xbe, - 0x03, 0xc6, 0x11, 0xa2, 0xab, 0x4a, 0xa4, 0xc0, 0x03, 0x41, 0xcc, 0x6e, 0x6f, 0x5d, 0x87, 0x4a, - 0xc7, 0xb6, 0xb0, 0x13, 0x72, 0x36, 0x7b, 0x10, 0x2d, 0x66, 0x08, 0x9b, 0x17, 0x12, 0xbb, 0x01, - 0x8d, 0x2b, 0xa6, 0xf2, 0x7c, 0x2d, 0xc1, 0xf3, 0xf7, 0x39, 0xfd, 0xb7, 0xfe, 0xa4, 0x08, 0x93, - 0x89, 0xf0, 0xd9, 0x77, 0x10, 0xc4, 0x4d, 0xdd, 0x91, 0x5f, 0xc8, 0x15, 0xb3, 0x5b, 0x55, 0x01, - 0xac, 0x26, 0x36, 0xe5, 0x97, 0x72, 0x62, 0x8a, 0x6f, 0xcb, 0x37, 0xb9, 0x26, 0xe0, 0x3e, 0xa8, - 0xde, 0xb4, 0x3c, 0xdc, 0x76, 0x7b, 0x4c, 0x3f, 0x53, 0xd5, 0x47, 0x49, 0xfa, 0x4a, 0x2f, 0x64, - 0x9b, 0x6e, 0xd0, 0xe3, 0x67, 0xdc, 0xaa, 0xce, 0x53, 0xe8, 0x35, 0xa8, 0xb8, 0xbe, 0xb5, 0x6d, - 0x39, 0xbc, 0x21, 0x03, 0xc2, 0x6b, 0x5e, 0xa1, 0x79, 0x75, 0x5e, 0xa6, 0xf9, 0x9b, 0x5a, 0x3e, - 0x81, 0xe0, 0x11, 0x18, 0x23, 0xbb, 0x87, 0xe5, 0x6c, 0xab, 0xe7, 0xed, 0x3a, 0x87, 0xd1, 0x2c, - 0x2d, 0x18, 0x17, 0x7d, 0x50, 0x95, 0xb1, 0x75, 0xde, 0x91, 0xb8, 0x5c, 0x51, 0x4a, 0x97, 0x2b, - 0xca, 0x31, 0xb9, 0xe2, 0x3b, 0x05, 0x28, 0xd3, 0xc8, 0xd6, 0x77, 0x27, 0x2a, 0x1d, 0xad, 0x4a, - 0x19, 0xea, 0x73, 0x89, 0xa1, 0x3e, 0x9e, 0xa1, 0xf8, 0x5d, 0x95, 0xbb, 0xfe, 0xe7, 0x28, 0xd4, - 0x64, 0xa3, 0xef, 0x1d, 0x79, 0xeb, 0x33, 0xe9, 0xf2, 0xd6, 0xc9, 0x8c, 0xd4, 0xff, 0xb3, 0x2b, - 0x67, 0xf5, 0x4b, 0x22, 0xd5, 0x83, 0x92, 0x44, 0x6a, 0x07, 0x28, 0x89, 0xc0, 0x41, 0x4b, 0x22, - 0xf5, 0x83, 0x92, 0x44, 0xc6, 0x32, 0x48, 0x22, 0xe3, 0x07, 0x2d, 0x89, 0x4c, 0xdc, 0x43, 0x92, - 0x08, 0x65, 0x89, 0x34, 0x5e, 0xff, 0xdd, 0x61, 0x89, 0xb4, 0xaa, 0xe1, 0x59, 0x22, 0x2d, 0x7e, - 0x57, 0x59, 0xe2, 0x57, 0x2a, 0x50, 0x93, 0x8d, 0xfe, 0x65, 0x67, 0x89, 0xb2, 0x23, 0x03, 0x59, - 0x62, 0x92, 0xf7, 0x94, 0xfb, 0x78, 0x8f, 0xc2, 0x2b, 0x2a, 0x07, 0xc8, 0x2b, 0x46, 0x0f, 0x9a, - 0x57, 0x54, 0x0f, 0x8a, 0x57, 0xd4, 0x32, 0xf0, 0x0a, 0x38, 0x68, 0x5e, 0x51, 0xbf, 0x97, 0x78, - 0xc5, 0x6f, 0x15, 0x60, 0x94, 0x3f, 0xce, 0x71, 0x77, 0x7c, 0x78, 0x78, 0x65, 0xc3, 0x1b, 0xcc, - 0x38, 0x82, 0xbb, 0xca, 0x31, 0xfe, 0x68, 0x14, 0xea, 0x4a, 0xc3, 0xef, 0x1d, 0x9e, 0xf1, 0x5e, - 0x3a, 0xcf, 0x38, 0x9d, 0x79, 0x0c, 0x3e, 0x16, 0xa4, 0x3e, 0x16, 0xa4, 0x3e, 0x16, 0xa4, 0xf6, - 0x61, 0x8e, 0x7f, 0xa3, 0x00, 0x35, 0xf9, 0xe8, 0xd0, 0xd0, 0xec, 0xf1, 0x6c, 0x8c, 0x3d, 0x7e, - 0x22, 0xe3, 0x1b, 0x47, 0xa9, 0x21, 0x27, 0x32, 0x5d, 0xa8, 0x95, 0x28, 0xee, 0x2a, 0x8b, 0xfc, - 0x61, 0x19, 0xc6, 0x63, 0x8d, 0x1f, 0x92, 0x49, 0x6e, 0xa6, 0xbf, 0x01, 0x73, 0x26, 0x07, 0xd9, - 0x72, 0x4b, 0x42, 0xa5, 0xdb, 0x49, 0x42, 0xe5, 0x03, 0x5c, 0xec, 0x95, 0x83, 0x5e, 0xec, 0xa3, - 0x07, 0xb5, 0xd8, 0xab, 0x19, 0x16, 0x7b, 0xed, 0xa0, 0x17, 0x3b, 0xdc, 0x4b, 0x8b, 0xfd, 0x3f, - 0x8c, 0x42, 0x55, 0xbc, 0x0c, 0x76, 0x77, 0xd6, 0xba, 0xa8, 0x6d, 0x76, 0x78, 0x37, 0x90, 0x08, - 0x45, 0x7c, 0xa9, 0xff, 0xcb, 0x12, 0x57, 0x1a, 0x2a, 0x0e, 0xc6, 0xda, 0xf0, 0x0e, 0xc6, 0x84, - 0x15, 0x18, 0xe1, 0x8e, 0xf0, 0x97, 0x65, 0x09, 0xf4, 0x0e, 0x54, 0x6f, 0xba, 0xfe, 0x0d, 0xdb, - 0x35, 0x84, 0xf7, 0xf2, 0xd9, 0x1c, 0x1d, 0x66, 0x03, 0xbb, 0xb1, 0xe7, 0x61, 0x53, 0x89, 0x59, - 0x2b, 0x10, 0xa2, 0x87, 0x00, 0x3c, 0xd7, 0xbc, 0xe2, 0x9b, 0x96, 0x23, 0x2f, 0xe6, 0x28, 0x10, - 0x76, 0xc1, 0x84, 0x5d, 0x17, 0xeb, 0x7b, 0x9a, 0xc9, 0x80, 0x29, 0xfe, 0xae, 0x9b, 0x88, 0xe6, - 0x2d, 0xdc, 0x99, 0x5f, 0xce, 0xdd, 0x40, 0x3a, 0x36, 0x7d, 0xe8, 0x9a, 0xef, 0xc2, 0xa1, 0x94, - 0xf6, 0xa7, 0x3a, 0xdd, 0xef, 0x73, 0x6f, 0x37, 0x8a, 0xbe, 0x28, 0xee, 0xed, 0x46, 0x90, 0x7b, - 0xca, 0xed, 0xf0, 0x9f, 0x6b, 0xb7, 0x7f, 0x17, 0x04, 0xad, 0xb1, 0x1b, 0x41, 0xc2, 0x29, 0xfe, - 0x54, 0xae, 0x29, 0x4b, 0xdd, 0xbd, 0x5d, 0x9f, 0x46, 0xfb, 0x0d, 0xd8, 0x6d, 0xa2, 0xa0, 0xb9, - 0x01, 0x63, 0x2a, 0x38, 0xd5, 0x85, 0x3b, 0x7d, 0x7b, 0x6a, 0x42, 0x55, 0x3a, 0xec, 0xf2, 0x7b, - 0x47, 0x22, 0xdd, 0xfa, 0x41, 0x09, 0x2a, 0x4c, 0xc5, 0x7d, 0x77, 0x8e, 0x3a, 0xac, 0x2e, 0x65, - 0x75, 0x37, 0xbf, 0x2f, 0xe2, 0x4b, 0x5e, 0x4d, 0x3e, 0x3f, 0xaa, 0x0d, 0xe7, 0x04, 0x90, 0x78, - 0x80, 0xf4, 0xbc, 0xf2, 0x36, 0x6a, 0x7e, 0x47, 0xb4, 0xe8, 0x75, 0xd4, 0x33, 0xe2, 0x61, 0xc9, - 0x62, 0x3e, 0x9d, 0x38, 0x7f, 0x5a, 0x72, 0x21, 0x7a, 0x1d, 0xb2, 0x94, 0xf7, 0x4c, 0x28, 0xdf, - 0x87, 0x3c, 0x23, 0xde, 0xa7, 0x2c, 0xe7, 0x53, 0x42, 0xf1, 0x17, 0x2a, 0x57, 0xd4, 0xe7, 0x25, - 0x2b, 0xf9, 0x45, 0xaf, 0xa8, 0x74, 0xeb, 0x77, 0x4a, 0x50, 0x15, 0x3e, 0x21, 0x77, 0x67, 0x67, - 0x10, 0xb5, 0xdd, 0xc1, 0xce, 0x10, 0xa1, 0x88, 0xef, 0x0c, 0x7f, 0x20, 0x1c, 0x4b, 0x1f, 0x85, - 0x71, 0xe9, 0x32, 0xa7, 0xb8, 0x9e, 0x8f, 0x09, 0x20, 0xe5, 0xa4, 0x18, 0x0e, 0x8b, 0xb7, 0x63, - 0xdb, 0xd2, 0x5d, 0x3d, 0xea, 0xc6, 0x10, 0x8e, 0x34, 0x87, 0x82, 0x7e, 0x60, 0x5c, 0x48, 0x2a, - 0x1e, 0x80, 0x90, 0xd4, 0xfc, 0xfc, 0x81, 0xbf, 0xc8, 0x25, 0xf9, 0x4d, 0x31, 0x5d, 0x1c, 0x2e, - 0xc5, 0xc4, 0xe1, 0xdf, 0xd5, 0xa0, 0x2a, 0x4e, 0xc3, 0x68, 0x9d, 0x48, 0x5b, 0xbe, 0xe5, 0x85, - 0x22, 0xe8, 0xba, 0x96, 0x29, 0x30, 0x0e, 0x2d, 0xc2, 0x98, 0x37, 0x25, 0xdd, 0x58, 0xa0, 0x40, - 0xc8, 0xe1, 0x3a, 0x1a, 0x1a, 0xf5, 0x91, 0xbb, 0xe7, 0x32, 0x0e, 0x4a, 0x84, 0x78, 0x22, 0x88, - 0xc1, 0x5a, 0x1f, 0xc0, 0x54, 0xb2, 0x72, 0xf4, 0x30, 0xd4, 0x79, 0x1f, 0x14, 0x4e, 0x0c, 0x0c, - 0x44, 0x37, 0x90, 0x25, 0x79, 0x81, 0x28, 0xb8, 0x93, 0x27, 0xf7, 0xce, 0x03, 0xea, 0x6f, 0x61, - 0xfc, 0x1e, 0x9a, 0xb6, 0x5f, 0x10, 0x64, 0x35, 0xb2, 0xc4, 0x77, 0x35, 0x40, 0xfd, 0x7a, 0x04, - 0x3a, 0xdc, 0xbe, 0xeb, 0xb4, 0xf1, 0x2d, 0xcf, 0x67, 0x41, 0x6c, 0x45, 0xa0, 0x2a, 0x02, 0x5e, - 0x92, 0xd0, 0xbb, 0x34, 0xf3, 0x5b, 0x5f, 0x1f, 0x85, 0x43, 0x29, 0x99, 0x73, 0x5f, 0x0f, 0x59, - 0x8f, 0x5f, 0x0f, 0x39, 0x9d, 0xbb, 0x79, 0x69, 0xb7, 0x44, 0xde, 0x54, 0x6e, 0x89, 0x9c, 0xc8, - 0x8f, 0x31, 0x76, 0x59, 0xe4, 0x92, 0x7a, 0x59, 0xe4, 0x64, 0x7e, 0x64, 0x89, 0x3b, 0x23, 0xeb, - 0xf1, 0x3b, 0x23, 0x43, 0xf4, 0x37, 0xe5, 0xea, 0xc8, 0x7a, 0xfc, 0xea, 0xc8, 0x10, 0x48, 0x3f, - 0xbe, 0x41, 0xf2, 0x4b, 0x7e, 0x83, 0xe4, 0x57, 0x27, 0xa1, 0xae, 0x3c, 0x80, 0x7f, 0x27, 0xc1, - 0x93, 0x15, 0x6e, 0x31, 0x9b, 0xf9, 0xc5, 0xfd, 0xf4, 0x10, 0x68, 0xc5, 0x2c, 0x8c, 0x3d, 0x86, - 0x25, 0xbe, 0xe9, 0xff, 0xe6, 0x28, 0xdf, 0xf4, 0x1b, 0x30, 0x6a, 0xba, 0x5d, 0xc3, 0x72, 0xc4, - 0x3d, 0x66, 0x91, 0x44, 0xcf, 0xc3, 0xe1, 0xf9, 0x85, 0x4b, 0x4b, 0xed, 0x5e, 0x80, 0xfd, 0x18, - 0xcb, 0x61, 0xa4, 0x42, 0xe4, 0xe3, 0xd5, 0x00, 0xfb, 0x0a, 0xcf, 0x71, 0x01, 0x75, 0x76, 0x0c, - 0xdb, 0xc6, 0xce, 0x36, 0x7d, 0x39, 0x8a, 0xbe, 0x5c, 0xc7, 0xdb, 0xfa, 0x46, 0xbe, 0x1e, 0xcf, - 0x2e, 0x08, 0x44, 0x6b, 0x1c, 0x8f, 0x3e, 0xdd, 0x49, 0x82, 0xd0, 0x3b, 0xf1, 0xf7, 0xbc, 0x06, - 0x3a, 0x24, 0xf5, 0xd7, 0xa2, 0x38, 0xfe, 0x31, 0x44, 0xd1, 0x93, 0x60, 0x3f, 0xd2, 0x60, 0xba, - 0xaf, 0x15, 0xe8, 0x93, 0x50, 0xda, 0x09, 0x43, 0x8f, 0x8f, 0xff, 0x62, 0xce, 0xfa, 0x96, 0x37, - 0x36, 0xd6, 0xfa, 0x7b, 0x46, 0x31, 0xa2, 0xab, 0x50, 0x34, 0x9d, 0x20, 0xdb, 0x5b, 0x3c, 0x7d, - 0x88, 0x17, 0x2f, 0xaf, 0xf7, 0xe3, 0x25, 0xf8, 0x9a, 0xef, 0xc1, 0xe1, 0xd4, 0x5a, 0xd1, 0x85, - 0xe8, 0xe9, 0x7f, 0x6d, 0xa8, 0x2b, 0xf1, 0xbc, 0x74, 0x73, 0x07, 0x66, 0xd2, 0xaa, 0xe7, 0x81, - 0xda, 0xd9, 0x24, 0xd0, 0x64, 0xa0, 0x76, 0xf6, 0xed, 0x25, 0x38, 0xd2, 0xf1, 0x31, 0x8d, 0x4b, - 0x65, 0xd8, 0x29, 0xd3, 0x6b, 0x26, 0xfa, 0x1a, 0x4d, 0xb0, 0xe6, 0xef, 0x68, 0x80, 0xfa, 0x87, - 0x8c, 0xfa, 0x3c, 0x33, 0x8d, 0xbe, 0x96, 0x45, 0x54, 0x4c, 0x55, 0x20, 0x71, 0x0c, 0xe8, 0x0a, - 0x94, 0x77, 0x8d, 0x9e, 0x1d, 0xf2, 0x71, 0x38, 0x99, 0x73, 0x1c, 0xae, 0x91, 0xb2, 0xa4, 0x5d, - 0x58, 0x67, 0x78, 0x9a, 0x27, 0x00, 0x22, 0x60, 0xea, 0x6d, 0xe0, 0xfd, 0x18, 0xd9, 0xd7, 0x2a, - 0xf9, 0xf4, 0xb3, 0x38, 0x16, 0x10, 0xb2, 0x90, 0x29, 0xbe, 0x51, 0x1f, 0x8b, 0x50, 0x41, 0xe9, - 0x4f, 0x5d, 0x7d, 0x0e, 0x8e, 0xd2, 0xbb, 0x54, 0x56, 0x10, 0xf4, 0xb0, 0xd9, 0x56, 0x7c, 0x67, - 0xf9, 0x52, 0x5f, 0xb8, 0x93, 0x3a, 0x17, 0x71, 0x68, 0x58, 0x76, 0xa0, 0x1f, 0x26, 0x75, 0xac, - 0xd0, 0x2a, 0x94, 0xaf, 0xcd, 0xbf, 0xa0, 0xc1, 0x11, 0xc2, 0x79, 0xfa, 0x4b, 0x10, 0x32, 0x32, - 0xde, 0x25, 0xb6, 0x1a, 0x96, 0xa2, 0xa1, 0xb9, 0xb0, 0x1f, 0x5e, 0xd5, 0x57, 0x45, 0x14, 0x18, - 0x9e, 0xa4, 0xf1, 0x5e, 0xb0, 0x4f, 0xc4, 0x39, 0x63, 0xd3, 0xc6, 0x24, 0x03, 0x0f, 0x3e, 0x45, - 0xa0, 0xeb, 0x02, 0x48, 0x1f, 0xcb, 0xe0, 0xef, 0x83, 0x8b, 0xb7, 0x97, 0x6a, 0x3a, 0x70, 0x90, - 0x8e, 0xb7, 0x9a, 0xbf, 0xaa, 0xc1, 0x4c, 0x1a, 0xd9, 0x52, 0x43, 0xb4, 0xe6, 0x0f, 0x09, 0x28, - 0x2e, 0x3a, 0xb3, 0x10, 0xa3, 0x6c, 0xfc, 0x4b, 0xd1, 0x45, 0x67, 0x16, 0x7b, 0x95, 0xcc, 0x80, - 0xe6, 0xef, 0xc7, 0xd7, 0x87, 0xa0, 0xcc, 0xa3, 0x30, 0x1e, 0x60, 0x9f, 0x2c, 0x34, 0x16, 0x75, - 0x59, 0x9c, 0xec, 0x18, 0x90, 0x85, 0x5a, 0x26, 0xc7, 0x22, 0xc7, 0x0d, 0xdb, 0x9b, 0x78, 0xcb, - 0xf5, 0xc5, 0x91, 0xa7, 0xe6, 0xb8, 0xe1, 0x39, 0x0a, 0x60, 0xe1, 0x99, 0xc2, 0xb6, 0xb1, 0x25, - 0x5e, 0x5b, 0x2d, 0xd2, 0x00, 0x2e, 0xf3, 0x24, 0x8d, 0xee, 0x83, 0x2a, 0x25, 0x64, 0xcf, 0x17, - 0x9a, 0x39, 0x46, 0x63, 0xdf, 0x46, 0x4f, 0xc0, 0xa4, 0x42, 0x63, 0x9a, 0xa3, 0xdc, 0x47, 0x64, - 0xdf, 0x4e, 0x12, 0xb9, 0x92, 0x24, 0x72, 0xeb, 0x13, 0x30, 0xb9, 0x68, 0x05, 0x37, 0x56, 0xad, - 0x20, 0x1c, 0x18, 0x74, 0xad, 0xb5, 0x0a, 0x53, 0x51, 0xe6, 0xc0, 0x73, 0x9d, 0x00, 0xa3, 0x13, - 0x50, 0x36, 0xad, 0xe0, 0x86, 0x78, 0xad, 0x61, 0xc0, 0xd6, 0x4d, 0x8a, 0xeb, 0xac, 0x40, 0xab, - 0x0d, 0x87, 0x48, 0x72, 0x11, 0x93, 0xd3, 0xcd, 0x26, 0x1e, 0x2e, 0xe6, 0x9b, 0xca, 0x0d, 0x8b, - 0x71, 0x6e, 0xd8, 0xba, 0x0c, 0x33, 0xf1, 0x0a, 0x78, 0x93, 0x5f, 0x81, 0x12, 0x69, 0x41, 0x36, - 0x61, 0x83, 0xb6, 0x98, 0xe6, 0x6f, 0x7d, 0x4d, 0x83, 0x69, 0x92, 0x5c, 0x20, 0xec, 0x61, 0xc8, - 0xf6, 0x22, 0x28, 0x7d, 0xe0, 0x3a, 0x32, 0xfa, 0x07, 0xf9, 0x4d, 0x26, 0x01, 0xc1, 0xdf, 0xa6, - 0x93, 0x9a, 0x07, 0x96, 0x20, 0x80, 0x0d, 0x32, 0xb1, 0xf7, 0x0b, 0x21, 0xd8, 0x3a, 0xcb, 0x1a, - 0xb3, 0x88, 0x6d, 0x9c, 0xa5, 0x31, 0xfc, 0xb5, 0x9a, 0x82, 0x7c, 0xad, 0xa6, 0xf5, 0x97, 0x8b, - 0x50, 0x22, 0x18, 0x52, 0xb9, 0xe7, 0x04, 0x14, 0x64, 0xee, 0x82, 0x65, 0xde, 0x8e, 0xce, 0x6a, - 0x13, 0x4b, 0xb1, 0x30, 0x80, 0x62, 0xa1, 0x96, 0x95, 0x85, 0x2a, 0x08, 0x50, 0x51, 0x08, 0x70, - 0x44, 0x4a, 0x60, 0xec, 0x81, 0x14, 0xf1, 0x28, 0xa2, 0x2a, 0x3d, 0x57, 0x13, 0xd2, 0x33, 0x82, - 0x92, 0xe5, 0x7a, 0x01, 0x35, 0x12, 0x17, 0x75, 0xfa, 0x1b, 0xbd, 0x03, 0xd3, 0x7d, 0x0f, 0xb0, - 0x71, 0xcb, 0xef, 0x6c, 0x3e, 0x1f, 0x00, 0x7d, 0x2a, 0xf9, 0xfa, 0x1a, 0xba, 0x01, 0x47, 0xfb, - 0x5f, 0x77, 0xa3, 0x6f, 0xbf, 0x71, 0x5b, 0xf0, 0x8b, 0x43, 0xb8, 0x19, 0xe8, 0x87, 0xbd, 0x34, - 0x70, 0xeb, 0x27, 0x1a, 0x4c, 0xf7, 0x85, 0x15, 0xde, 0x8f, 0xf1, 0x29, 0x2f, 0x62, 0x47, 0xb4, - 0x9b, 0x85, 0x43, 0x94, 0xbd, 0xed, 0x60, 0xc3, 0x0f, 0x37, 0xb1, 0x11, 0x73, 0x04, 0x9e, 0x26, - 0x9f, 0x96, 0xc5, 0x97, 0x58, 0x38, 0x86, 0xd0, 0x37, 0x9c, 0xc0, 0x8a, 0xb6, 0x44, 0x36, 0xa2, - 0xf4, 0x9e, 0xef, 0x86, 0xfc, 0x24, 0xde, 0x4e, 0x4f, 0x73, 0x15, 0x56, 0x59, 0x6e, 0x25, 0xc6, - 0x72, 0x5b, 0xff, 0x0e, 0x00, 0xd6, 0x7c, 0xb7, 0x8b, 0xc3, 0x1d, 0xdc, 0x0b, 0xee, 0xd2, 0x83, - 0x70, 0xb2, 0x3e, 0xe5, 0x67, 0x6a, 0x98, 0xf9, 0x62, 0x16, 0xd1, 0x24, 0x1d, 0x5d, 0xfc, 0x18, - 0xf0, 0x9d, 0x51, 0x98, 0x88, 0xd7, 0x85, 0x4e, 0x40, 0x43, 0x84, 0x20, 0xe6, 0x16, 0xcb, 0x76, - 0x22, 0x04, 0xce, 0x11, 0xfe, 0xfd, 0x12, 0xfb, 0x2c, 0x8d, 0xa8, 0x8a, 0x79, 0xb7, 0x10, 0x37, - 0xef, 0x46, 0x11, 0xdd, 0x8b, 0xb1, 0x88, 0xee, 0x0f, 0x02, 0x50, 0x6d, 0x23, 0x7b, 0xe6, 0x96, - 0x47, 0x13, 0x22, 0x10, 0xf6, 0x6e, 0xeb, 0x7b, 0x80, 0xe8, 0x97, 0xb6, 0xd7, 0xb3, 0x85, 0x8c, - 0x28, 0xe2, 0x36, 0x1e, 0x88, 0x8d, 0x30, 0x66, 0x77, 0xae, 0x24, 0xec, 0xce, 0x34, 0x54, 0x13, - 0x0f, 0xe5, 0xc2, 0x57, 0x7b, 0x04, 0x40, 0x21, 0x4c, 0xca, 0x07, 0x93, 0x6c, 0x63, 0x13, 0xdb, - 0x01, 0x7f, 0xd3, 0xf3, 0xe2, 0x90, 0x83, 0x3c, 0xbb, 0xc4, 0xd1, 0xad, 0x52, 0x6c, 0xcc, 0x4a, - 0x3d, 0x81, 0x63, 0x40, 0xf4, 0x08, 0xc8, 0x17, 0x99, 0xe8, 0x4e, 0xca, 0x6f, 0xda, 0x0a, 0x18, - 0xd9, 0x47, 0x1f, 0x81, 0x31, 0xdf, 0xed, 0x85, 0x58, 0xc4, 0xf6, 0x61, 0x17, 0x6d, 0xeb, 0x14, - 0xc6, 0x23, 0xfb, 0x3c, 0x0a, 0xe3, 0x7e, 0xcf, 0x56, 0x2c, 0xea, 0x75, 0x26, 0x0e, 0x10, 0xa0, - 0x1c, 0x4d, 0x27, 0x69, 0x76, 0x1f, 0xa3, 0xdd, 0x5b, 0x19, 0xb6, 0x7b, 0x83, 0x4c, 0xf0, 0xcf, - 0xc1, 0x8c, 0x98, 0x77, 0x42, 0x0e, 0xa0, 0xac, 0x7e, 0x9c, 0x9d, 0x36, 0xf9, 0xb7, 0x79, 0xf6, - 0x89, 0x9e, 0x36, 0x1b, 0x30, 0x1a, 0x28, 0x4e, 0x22, 0x35, 0x5d, 0x24, 0xd1, 0x02, 0x54, 0x69, - 0x28, 0x3e, 0xcb, 0xd9, 0xa6, 0xf7, 0x90, 0x06, 0x1a, 0x0b, 0xa2, 0x30, 0x83, 0xb2, 0x60, 0x73, - 0x1e, 0x0e, 0xa5, 0x0c, 0x49, 0xae, 0x1b, 0x40, 0x77, 0x7c, 0x85, 0xe8, 0x27, 0x1a, 0x4c, 0x25, - 0x17, 0xaf, 0xb2, 0x9a, 0xb4, 0xd8, 0x6a, 0xfa, 0x65, 0x09, 0x5c, 0xdf, 0xea, 0x42, 0x2d, 0x0a, - 0xe0, 0xf8, 0x1e, 0x8c, 0x51, 0x92, 0x77, 0x0d, 0xc7, 0xd8, 0xc6, 0x22, 0xb6, 0xe8, 0x6b, 0x59, - 0xa7, 0xd9, 0xbc, 0x52, 0x76, 0x89, 0xef, 0xb8, 0x7a, 0x0c, 0x63, 0xeb, 0x37, 0x34, 0x78, 0xe8, - 0xf6, 0x05, 0xf2, 0x6b, 0x93, 0x53, 0x1f, 0x1a, 0x23, 0x1b, 0x5c, 0x67, 0x07, 0xcb, 0xb8, 0xed, - 0x3c, 0x45, 0x5f, 0xf6, 0x37, 0xc2, 0x9d, 0x78, 0xb4, 0x2d, 0x20, 0x20, 0xb6, 0x20, 0x5b, 0x5f, - 0x2a, 0xc3, 0xc4, 0x7a, 0x8c, 0xa9, 0x0e, 0xbd, 0xe3, 0xac, 0xc7, 0x76, 0x9c, 0xb3, 0x99, 0x5e, - 0x24, 0xe3, 0x75, 0x26, 0x92, 0x8a, 0x95, 0xf2, 0xcf, 0x17, 0x00, 0xf5, 0x7f, 0x24, 0xd2, 0xe0, - 0xfb, 0xee, 0x26, 0x63, 0x7f, 0xe2, 0x80, 0xff, 0xbe, 0xbb, 0x49, 0x57, 0x0b, 0x5a, 0x87, 0x9a, - 0x90, 0x80, 0xc4, 0x59, 0xf4, 0xe5, 0x5c, 0xad, 0x91, 0xa3, 0x19, 0xe1, 0xb9, 0xed, 0x53, 0x79, - 0x5d, 0x40, 0x72, 0xc8, 0x54, 0xf7, 0x47, 0x42, 0x87, 0xd7, 0x73, 0xd5, 0x7c, 0x59, 0xa0, 0x11, - 0x0b, 0x57, 0x9f, 0x76, 0x92, 0xa0, 0xe6, 0xaf, 0x69, 0x50, 0x5d, 0x52, 0x44, 0x3c, 0x3a, 0x1b, - 0x84, 0x39, 0x3a, 0xe5, 0xd9, 0xb9, 0x42, 0xdf, 0xb3, 0x73, 0xc2, 0x86, 0x5d, 0x54, 0x6c, 0xd8, - 0xfb, 0x4d, 0xa1, 0x26, 0x54, 0x13, 0xc1, 0x46, 0x65, 0xba, 0x79, 0x1e, 0xa6, 0xfb, 0x5a, 0x4c, - 0xdf, 0x60, 0x70, 0xf6, 0x38, 0x87, 0x20, 0x3f, 0x49, 0x7b, 0xba, 0x46, 0xd8, 0xd9, 0xe1, 0x91, - 0x05, 0x99, 0xe3, 0x06, 0x50, 0x10, 0x2d, 0xde, 0xfa, 0xd1, 0x7e, 0x4f, 0x7f, 0x5e, 0x4b, 0x3c, - 0xfd, 0xf9, 0x7a, 0x7e, 0x4b, 0x5c, 0xea, 0x03, 0x9f, 0x9f, 0xee, 0x7b, 0xe0, 0xf3, 0x8d, 0x21, - 0x30, 0xdf, 0x6b, 0xcf, 0x78, 0xfe, 0xe9, 0x11, 0x18, 0x15, 0x2f, 0xf4, 0xdd, 0x95, 0xd8, 0x31, - 0xbc, 0xb2, 0x3b, 0x08, 0x39, 0x24, 0x31, 0x24, 0x42, 0x0e, 0x95, 0xb9, 0x92, 0x58, 0x4f, 0xfa, - 0x0c, 0x9d, 0xc8, 0x86, 0x6f, 0x79, 0x63, 0x63, 0x8d, 0xff, 0xee, 0xf3, 0x20, 0x3a, 0x07, 0xc5, - 0x8d, 0xd5, 0x75, 0x3e, 0xee, 0xcf, 0x65, 0xc3, 0xc7, 0xff, 0x6f, 0xac, 0xae, 0xeb, 0xa4, 0x30, - 0xba, 0x0e, 0x13, 0x5b, 0xbe, 0xeb, 0x84, 0xd8, 0x31, 0xdb, 0x2c, 0x54, 0x69, 0x31, 0x8b, 0x70, - 0x28, 0xd0, 0x9d, 0xe7, 0x65, 0x69, 0xe8, 0xd2, 0xf1, 0x2d, 0x25, 0x15, 0xa0, 0x0b, 0x22, 0xf8, - 0x29, 0xf3, 0x9f, 0x7e, 0x3e, 0x57, 0x03, 0x95, 0x58, 0xa8, 0x83, 0x5e, 0xc2, 0x2c, 0xdf, 0xfe, - 0x25, 0xcc, 0x7b, 0xd4, 0x5b, 0xf0, 0x71, 0x98, 0x90, 0x8e, 0x81, 0x4c, 0x4c, 0xfb, 0xa5, 0x77, - 0x17, 0xfc, 0x3c, 0x8c, 0xa9, 0xf3, 0x21, 0xc6, 0xd2, 0xc5, 0x06, 0x3f, 0xa3, 0x46, 0xc4, 0xad, - 0x89, 0x11, 0x5e, 0x84, 0x92, 0xd1, 0xe3, 0x7c, 0x3c, 0xf3, 0x54, 0x9e, 0xef, 0x85, 0x3b, 0x57, - 0x3c, 0xda, 0x4d, 0x5a, 0xba, 0xf9, 0xdf, 0x34, 0x40, 0xfd, 0xeb, 0x85, 0x1c, 0x91, 0xe4, 0x1b, - 0x9f, 0xc2, 0x44, 0x53, 0x13, 0x8f, 0x7c, 0x06, 0x7d, 0x0f, 0xc6, 0x14, 0xfa, 0x1e, 0x8c, 0x51, - 0xb3, 0x28, 0x12, 0x8b, 0xc8, 0x42, 0x77, 0x22, 0x1e, 0xae, 0x50, 0x2c, 0x23, 0x1e, 0x75, 0xb6, - 0xce, 0x61, 0x94, 0x1c, 0x8f, 0xc3, 0x98, 0x8f, 0x6f, 0xfa, 0x56, 0x88, 0x59, 0x16, 0x3a, 0x6f, - 0xcf, 0x15, 0x1a, 0x9a, 0x5e, 0xe7, 0x70, 0x9a, 0xed, 0x51, 0xa8, 0xef, 0x60, 0xc3, 0xc4, 0x3e, - 0xcb, 0x55, 0x91, 0xb9, 0x80, 0x81, 0x49, 0xa6, 0xe6, 0x8e, 0x54, 0x6b, 0x7f, 0x06, 0xc6, 0x63, - 0x8b, 0x83, 0x6f, 0x30, 0x27, 0xb3, 0xd1, 0x30, 0xed, 0x05, 0xd5, 0x31, 0x75, 0x25, 0x1d, 0xc4, - 0xc3, 0xa9, 0xcd, 0x2f, 0x6b, 0x00, 0x11, 0xe3, 0x21, 0x73, 0x80, 0x64, 0x95, 0x61, 0x7f, 0x69, - 0x82, 0xf4, 0xbb, 0xcf, 0x86, 0xc1, 0xfa, 0x1d, 0x44, 0xe6, 0xb1, 0xb3, 0x50, 0x1c, 0x3a, 0xfe, - 0x30, 0x29, 0xd9, 0xfc, 0xa1, 0x06, 0x75, 0x85, 0xc5, 0xc8, 0x17, 0x54, 0xb4, 0xe8, 0x05, 0x15, - 0x74, 0x19, 0x4a, 0x64, 0x1a, 0xf1, 0xad, 0xe3, 0x54, 0x6e, 0x46, 0x4d, 0x10, 0x5f, 0x23, 0x9b, - 0x99, 0x4e, 0xf1, 0xa0, 0x8b, 0x50, 0xdc, 0x58, 0x58, 0xcb, 0xa6, 0x72, 0x10, 0xe8, 0x36, 0x16, - 0xfa, 0xb1, 0x11, 0x2c, 0xcd, 0xef, 0x69, 0x30, 0x93, 0x56, 0x57, 0xea, 0x6a, 0x3b, 0x0c, 0x15, - 0xc7, 0x6d, 0xb3, 0x4d, 0x82, 0x86, 0x11, 0x75, 0x5c, 0x32, 0x00, 0xb1, 0xd7, 0x7a, 0x8b, 0xf1, - 0xd7, 0x7a, 0xd1, 0x45, 0xe1, 0x97, 0x5a, 0xca, 0x22, 0x71, 0xa6, 0x74, 0x7f, 0xcd, 0x08, 0x77, - 0xb8, 0x3b, 0x6b, 0xf3, 0x9f, 0x68, 0x70, 0x28, 0xa5, 0x2b, 0x07, 0xd6, 0xd8, 0xcb, 0xd1, 0xb6, - 0x5a, 0xca, 0x12, 0x16, 0x20, 0xb1, 0xcb, 0xf4, 0x6d, 0xa9, 0x08, 0x4a, 0xf3, 0xab, 0x6b, 0x97, - 0xf9, 0x9e, 0x42, 0x7f, 0x37, 0xf7, 0x60, 0x32, 0xd1, 0xbb, 0x54, 0xdf, 0x49, 0x65, 0x87, 0x2f, - 0x1c, 0xd0, 0x0e, 0xdf, 0xfc, 0xb6, 0x06, 0x13, 0xf7, 0x26, 0x37, 0x6b, 0xfe, 0x45, 0x0d, 0x20, - 0xe2, 0xc0, 0x68, 0x09, 0xca, 0x9b, 0x46, 0x60, 0x75, 0xb2, 0x39, 0x5d, 0x8a, 0xbe, 0x9f, 0x23, - 0x45, 0x08, 0x16, 0x9d, 0x95, 0x26, 0xeb, 0x3b, 0xb4, 0x85, 0x01, 0xf7, 0xd9, 0x8c, 0x4b, 0x65, - 0x75, 0x9d, 0xa2, 0x20, 0x25, 0x9b, 0xe7, 0xa0, 0x26, 0x91, 0x52, 0xff, 0xaa, 0x3e, 0x47, 0x1f, - 0x95, 0x9d, 0x90, 0xdd, 0x08, 0x1b, 0x76, 0x57, 0x88, 0xa0, 0x34, 0xd1, 0xfc, 0x42, 0x01, 0x46, - 0x39, 0xd2, 0xc1, 0x28, 0x1e, 0x85, 0xf1, 0x5d, 0xec, 0x5b, 0x5b, 0x7b, 0x6d, 0x1e, 0xd6, 0x83, - 0xa1, 0x1a, 0x63, 0xc0, 0x05, 0x0a, 0x43, 0x1b, 0x30, 0xca, 0x98, 0x77, 0xc6, 0xd7, 0xb9, 0x12, - 0x5d, 0x9b, 0x5d, 0x66, 0x85, 0x99, 0x7c, 0x2e, 0x50, 0x91, 0xa9, 0x80, 0x7d, 0xdf, 0xf5, 0xdb, - 0x9e, 0xa2, 0xfb, 0xa3, 0x90, 0x35, 0x63, 0x1b, 0x37, 0x4f, 0xc1, 0x98, 0x5a, 0x2e, 0x97, 0x04, - 0xfe, 0x21, 0x4c, 0x25, 0xaf, 0x5f, 0x90, 0xdc, 0xc6, 0x76, 0xf4, 0x0c, 0x15, 0x4b, 0xa0, 0x75, - 0x00, 0x4f, 0x6a, 0x06, 0xb2, 0xbd, 0x4e, 0xc1, 0x31, 0x27, 0x34, 0xb4, 0x0a, 0x9a, 0xd6, 0x1f, - 0x6b, 0x70, 0x38, 0x35, 0x57, 0x2a, 0xe3, 0xb8, 0xfd, 0x6b, 0xfe, 0x6f, 0x43, 0x85, 0x6b, 0x17, - 0x8b, 0x59, 0x9e, 0x12, 0x49, 0xad, 0x76, 0x56, 0xd5, 0x28, 0x72, 0x74, 0xa4, 0x5a, 0x71, 0x80, - 0x0c, 0x04, 0xf5, 0x25, 0x80, 0x9e, 0x9d, 0x86, 0xd3, 0x79, 0xb5, 0xbe, 0xa5, 0x01, 0x44, 0x32, - 0x5c, 0x4a, 0xd1, 0x26, 0x54, 0x5d, 0x8f, 0x7c, 0x8e, 0x5e, 0xd2, 0x13, 0xe9, 0x08, 0x6d, 0x51, - 0x41, 0x4b, 0x0e, 0xc5, 0x78, 0x6b, 0x0b, 0x77, 0xc4, 0xdb, 0xed, 0x3c, 0x85, 0x9e, 0x05, 0x14, - 0x49, 0x88, 0x32, 0xcc, 0x29, 0xb3, 0x3d, 0x4d, 0x47, 0x5f, 0x78, 0x80, 0xd3, 0xd6, 0xff, 0x5f, - 0x80, 0xaa, 0x7c, 0xa0, 0xfe, 0x0a, 0x57, 0x6f, 0x4a, 0x51, 0x38, 0xd3, 0x65, 0x08, 0xfa, 0x40, - 0x8b, 0x10, 0x87, 0xa9, 0xfe, 0x52, 0x22, 0x5c, 0x65, 0x8f, 0x00, 0x4a, 0x7c, 0x99, 0x1c, 0xc2, - 0xd7, 0x5c, 0x53, 0xa2, 0xab, 0x7b, 0x51, 0x02, 0x5d, 0x87, 0x69, 0x8a, 0xcd, 0x09, 0xad, 0x08, - 0x65, 0xc6, 0x38, 0xa0, 0xe6, 0xbc, 0x13, 0x5a, 0x12, 0xed, 0xa4, 0x17, 0x07, 0xb4, 0xfe, 0x4d, - 0x01, 0xc6, 0xd4, 0x7e, 0xa0, 0x6f, 0x69, 0xf0, 0xa2, 0xcf, 0x0e, 0x0b, 0x66, 0xdb, 0xec, 0xf9, - 0x96, 0xb3, 0x2d, 0xae, 0x67, 0x92, 0x9f, 0xd6, 0xb6, 0xe3, 0x2a, 0x5f, 0xf0, 0x2d, 0xdc, 0xe9, - 0xc9, 0x27, 0x34, 0x33, 0x51, 0x4c, 0xaa, 0x51, 0x66, 0x45, 0x35, 0x8b, 0x14, 0xd7, 0xba, 0xac, - 0x64, 0x85, 0xd5, 0xc1, 0xc0, 0x4b, 0xa2, 0x06, 0xf4, 0x5d, 0x0d, 0x5e, 0xf2, 0x7c, 0x22, 0x03, - 0xe5, 0x6c, 0x5a, 0x26, 0x7d, 0xd3, 0x9a, 0xc0, 0x1c, 0xb5, 0x63, 0x03, 0xfb, 0x5d, 0x7d, 0x4e, - 0x56, 0x99, 0xad, 0x99, 0xad, 0x2f, 0x6a, 0x70, 0x74, 0x1f, 0x64, 0x64, 0xee, 0xde, 0xc4, 0xd6, - 0xf6, 0x8e, 0x58, 0xf4, 0x3c, 0x85, 0x2e, 0x13, 0xce, 0x23, 0xa4, 0xbb, 0x6c, 0x4e, 0x61, 0x2a, - 0x29, 0x69, 0x43, 0x15, 0x0c, 0x2d, 0x87, 0x0d, 0xaa, 0xd4, 0xff, 0x7c, 0x06, 0x0e, 0xc5, 0xd4, - 0xf7, 0xed, 0x10, 0xfb, 0x5d, 0xa1, 0xc0, 0xc9, 0x5b, 0xd1, 0xb4, 0x93, 0x80, 0x04, 0xad, 0x5d, - 0x98, 0x4a, 0x66, 0x43, 0x9b, 0x30, 0xcd, 0x34, 0x4c, 0x91, 0x2f, 0xad, 0xa8, 0xf1, 0xe5, 0x1c, - 0xb3, 0x24, 0x3a, 0xb7, 0xea, 0x53, 0x14, 0x5f, 0xe4, 0x84, 0x1b, 0xb4, 0xda, 0x70, 0x74, 0x9f, - 0xcc, 0x39, 0x59, 0xcd, 0x11, 0xa8, 0x50, 0xee, 0x22, 0x9e, 0xe1, 0xe0, 0xa9, 0xd6, 0x8f, 0x0b, - 0x50, 0x57, 0x96, 0x25, 0xfa, 0x2b, 0x43, 0xaf, 0x8e, 0x62, 0xb6, 0xc5, 0xca, 0x2b, 0xa2, 0x84, - 0xbe, 0xb7, 0x16, 0xc8, 0xdb, 0x74, 0xaa, 0x62, 0x33, 0xd9, 0xca, 0xdc, 0x0b, 0xe4, 0xb7, 0x35, - 0x98, 0x4c, 0x20, 0x41, 0x3a, 0x4c, 0xd0, 0xad, 0x28, 0x6e, 0x5d, 0x1c, 0x78, 0x11, 0x82, 0x6e, - 0x4b, 0x72, 0xf4, 0xc7, 0x6d, 0x35, 0x89, 0x1e, 0x02, 0x90, 0x5b, 0xa7, 0xd4, 0x70, 0x46, 0x10, - 0x22, 0x19, 0x8a, 0xa0, 0x82, 0x6d, 0x32, 0x55, 0xd8, 0x2e, 0x53, 0x17, 0xb0, 0x8b, 0x78, 0xaf, - 0xf5, 0x97, 0x0a, 0x30, 0x1e, 0xab, 0x03, 0xb5, 0x61, 0x8c, 0xcd, 0x6a, 0xbe, 0x11, 0x67, 0x32, - 0x50, 0xc4, 0x50, 0xcc, 0x5e, 0x22, 0xe5, 0xd5, 0x5d, 0x98, 0x69, 0x62, 0xb9, 0x51, 0xaf, 0x93, - 0xb6, 0x6c, 0xd8, 0x00, 0xbd, 0x92, 0x87, 0x18, 0xb7, 0x5b, 0x37, 0xcd, 0xd7, 0x61, 0x2a, 0xd9, - 0x8a, 0x5c, 0xdb, 0xfa, 0x7b, 0xd0, 0xd8, 0xaf, 0xb6, 0x03, 0x5a, 0x78, 0x7f, 0x4e, 0x83, 0xa3, - 0xfb, 0xcc, 0xb8, 0x7d, 0xb9, 0xa8, 0xd8, 0x26, 0x79, 0x5e, 0xca, 0xe4, 0xb2, 0xc9, 0xdf, 0xc9, - 0x39, 0x3d, 0xe9, 0xc5, 0x01, 0xad, 0x9f, 0x16, 0xd8, 0x9c, 0x55, 0xb6, 0xce, 0x8f, 0x79, 0xc1, - 0x01, 0xf0, 0x82, 0xe3, 0x30, 0x93, 0xa6, 0x91, 0x4b, 0x73, 0xed, 0x69, 0x7d, 0x08, 0x95, 0x25, - 0x67, 0xf7, 0x9a, 0xe1, 0xa7, 0x3a, 0xfe, 0xa4, 0x4e, 0x56, 0xb4, 0x02, 0x40, 0x7f, 0xb4, 0xb7, - 0x7c, 0xb7, 0x9b, 0x2d, 0xe0, 0x10, 0xab, 0x83, 0xab, 0x5d, 0x6b, 0xb4, 0xf4, 0x79, 0xdf, 0xed, - 0xb6, 0xfe, 0x77, 0x01, 0xc6, 0xd4, 0x6f, 0xe8, 0x32, 0xd4, 0xb6, 0x2c, 0x6c, 0x9b, 0xd4, 0x43, - 0x2d, 0x53, 0xe4, 0x60, 0xd6, 0xcb, 0xf3, 0xa4, 0x90, 0x5c, 0x39, 0x55, 0x8a, 0x43, 0xc7, 0x5b, - 0xc8, 0x00, 0x24, 0x1f, 0x71, 0x8a, 0x10, 0x67, 0x3a, 0x86, 0x08, 0x2d, 0x6f, 0x1c, 0xf5, 0x94, - 0xaf, 0x82, 0x49, 0x15, 0x6d, 0x1a, 0xd5, 0x7f, 0xcb, 0xda, 0x6e, 0x77, 0x0d, 0x8f, 0x30, 0x3d, - 0xe5, 0x09, 0xac, 0x01, 0x8a, 0x53, 0xf6, 0xe2, 0xfa, 0x25, 0xc3, 0xbb, 0x88, 0xf7, 0x64, 0x0d, - 0x93, 0x1d, 0x05, 0x4a, 0x2a, 0xb8, 0x0a, 0x13, 0xfc, 0x8c, 0x29, 0x90, 0x97, 0xb2, 0x1c, 0xa2, - 0x99, 0xda, 0x55, 0xc5, 0x3c, 0x16, 0x08, 0x90, 0x8e, 0xb7, 0x5a, 0x57, 0xe1, 0x50, 0x0a, 0xed, - 0xa8, 0x97, 0xa0, 0x67, 0xb5, 0xe3, 0x61, 0x04, 0x94, 0x7b, 0xb2, 0xe4, 0x58, 0xc9, 0x28, 0xe9, - 0x29, 0x37, 0x21, 0x28, 0x64, 0xcd, 0x08, 0x77, 0x5a, 0x21, 0x1c, 0x4e, 0xa5, 0x1c, 0x75, 0x05, - 0x15, 0xd7, 0x02, 0xd4, 0xd3, 0xf2, 0xb8, 0x84, 0x5e, 0xe6, 0x4e, 0x7c, 0x82, 0xc4, 0x82, 0xb1, - 0x89, 0x34, 0x75, 0xa5, 0xb7, 0x76, 0xad, 0x40, 0xda, 0x26, 0x45, 0xb2, 0xf5, 0x75, 0x0d, 0x66, - 0xd2, 0xa8, 0x89, 0x3a, 0x70, 0x84, 0x5e, 0xac, 0x69, 0xbb, 0xb4, 0xaf, 0xed, 0x48, 0x22, 0x1c, - 0xca, 0x23, 0x7b, 0xc6, 0x4e, 0x5b, 0x59, 0x9c, 0x3d, 0x17, 0x24, 0x7b, 0x6e, 0x7d, 0x55, 0x83, - 0xe9, 0xbe, 0x01, 0xf8, 0x05, 0x35, 0xe6, 0x85, 0xaf, 0x1e, 0x81, 0x51, 0xa6, 0x69, 0x08, 0xd0, - 0x0f, 0x35, 0x28, 0xad, 0x5a, 0x41, 0x88, 0x06, 0x2c, 0x2b, 0xee, 0xd7, 0x29, 0xed, 0x1c, 0x38, - 0x08, 0x9b, 0x2f, 0xe4, 0x29, 0xc2, 0xfc, 0x2b, 0x5b, 0x57, 0x7e, 0xe5, 0x07, 0x8d, 0x42, 0x55, - 0xfb, 0x95, 0x9f, 0xfc, 0xc1, 0xaf, 0x17, 0x16, 0xd0, 0xfc, 0x5c, 0x5b, 0xa0, 0x98, 0x33, 0x3c, - 0x6b, 0x2e, 0x42, 0x33, 0x27, 0xd0, 0xcc, 0x71, 0x27, 0xc5, 0x60, 0xee, 0x73, 0xfc, 0xd7, 0x87, - 0x73, 0x9f, 0x0b, 0xf7, 0x3c, 0xfc, 0xe1, 0xdc, 0xfb, 0x81, 0xeb, 0xa0, 0x1f, 0x6b, 0x50, 0x15, - 0x5e, 0x9c, 0x68, 0x00, 0x4b, 0x55, 0xbc, 0x3d, 0x63, 0x1d, 0x79, 0x25, 0x6f, 0x31, 0xde, 0x99, - 0x6b, 0x4a, 0x67, 0xde, 0x44, 0xcb, 0x77, 0xd4, 0x99, 0xcf, 0x91, 0x25, 0xc0, 0xfb, 0xf4, 0x77, - 0x35, 0xa8, 0x30, 0x47, 0x52, 0xf4, 0xe2, 0xa0, 0xa7, 0x4b, 0x98, 0xbb, 0x69, 0xbc, 0x3f, 0x0f, - 0x46, 0x85, 0x4c, 0x82, 0x3d, 0x98, 0xbd, 0xe6, 0x5a, 0xa6, 0x6c, 0xb6, 0xae, 0x34, 0xfb, 0x7c, - 0xeb, 0xce, 0xc7, 0xe0, 0x94, 0x76, 0x1c, 0xfd, 0x7d, 0x0d, 0x2a, 0xcc, 0xdd, 0x74, 0x50, 0x93, - 0x85, 0x53, 0x6a, 0xae, 0x26, 0xc7, 0x28, 0x7d, 0xfc, 0xe0, 0x28, 0xfd, 0x0f, 0x34, 0xa8, 0x30, - 0x6f, 0xee, 0x41, 0xcd, 0x66, 0xb9, 0x72, 0x36, 0xfb, 0xba, 0xd2, 0xec, 0x4b, 0xcd, 0x03, 0x6b, - 0x36, 0x21, 0xf8, 0x6f, 0x68, 0x50, 0x5a, 0x70, 0xbd, 0xbd, 0x41, 0x0b, 0x97, 0xe4, 0xc9, 0xd9, - 0xea, 0x25, 0xa5, 0xd5, 0x27, 0x9b, 0x2f, 0x65, 0x68, 0xb5, 0xd1, 0xa1, 0x26, 0xc3, 0xb9, 0x8e, - 0xeb, 0xed, 0xc9, 0x16, 0xfe, 0x57, 0x0d, 0xc6, 0x97, 0x4c, 0x2b, 0x94, 0x7c, 0x18, 0x65, 0xdd, - 0xfe, 0x48, 0xa9, 0x8c, 0x6d, 0xfd, 0xa2, 0xa6, 0x34, 0xb6, 0xd7, 0xf2, 0x86, 0x23, 0x71, 0x74, - 0x62, 0x61, 0x64, 0xa6, 0xbf, 0x3f, 0x9c, 0x63, 0x3b, 0x6f, 0xd7, 0xf0, 0x02, 0x41, 0x7d, 0xd1, - 0x51, 0x6c, 0x5a, 0xa1, 0xec, 0xe8, 0xbf, 0xd7, 0x00, 0x48, 0x93, 0x79, 0x94, 0xaa, 0x4c, 0xfb, - 0x70, 0x8e, 0x2e, 0x7e, 0x5e, 0xe9, 0xa1, 0xdf, 0xea, 0x1e, 0x68, 0x0f, 0xb9, 0xff, 0xde, 0x6d, - 0xbb, 0xf7, 0x33, 0x0d, 0x1a, 0xe2, 0xf1, 0xf5, 0xa4, 0xa3, 0x32, 0x3a, 0x93, 0xd3, 0x77, 0x3a, - 0xfe, 0x88, 0xfb, 0xa0, 0xae, 0xf7, 0x94, 0xae, 0x5b, 0x2d, 0x73, 0xb8, 0xae, 0x47, 0x5e, 0xd4, - 0xcc, 0x31, 0xbb, 0xaf, 0xb7, 0x3e, 0x6f, 0x94, 0xec, 0xf1, 0xcf, 0x35, 0x68, 0x5e, 0x75, 0xfc, - 0xfd, 0xfa, 0x7c, 0x36, 0x5f, 0x9f, 0xfb, 0x9e, 0xae, 0x1f, 0xd4, 0xeb, 0x50, 0xe9, 0xf5, 0xce, - 0xf1, 0xad, 0x8f, 0xa8, 0xd7, 0x3d, 0x27, 0xd6, 0x6f, 0xf4, 0x7f, 0x34, 0x78, 0x70, 0xbf, 0x61, - 0xa6, 0x8e, 0xe7, 0xe8, 0xdc, 0x30, 0x4e, 0xec, 0xf9, 0xba, 0xfe, 0x81, 0xd2, 0x75, 0xa7, 0x65, - 0x1d, 0x4c, 0xd7, 0xa9, 0x23, 0xfe, 0xe0, 0x51, 0xff, 0x62, 0x01, 0x1e, 0xde, 0x7f, 0xd4, 0x19, - 0x09, 0x16, 0x87, 0x20, 0x41, 0xee, 0xf1, 0xdf, 0x53, 0x88, 0xd0, 0x3d, 0x7e, 0xe3, 0xa3, 0x24, - 0x42, 0x72, 0x12, 0xfc, 0x4c, 0x83, 0x31, 0x1d, 0x13, 0x61, 0x1f, 0xaf, 0x38, 0x26, 0xbe, 0x85, - 0x06, 0x86, 0x3e, 0x8d, 0xf2, 0x1e, 0x84, 0x78, 0xe8, 0x29, 0x5d, 0x37, 0xd1, 0xe6, 0x41, 0x6c, - 0x98, 0x9f, 0x63, 0x0e, 0x80, 0x1b, 0x14, 0xe6, 0xb3, 0xf6, 0x5a, 0xa4, 0xbd, 0xb4, 0xc7, 0x2f, - 0x7c, 0xa5, 0x0c, 0xe5, 0x45, 0x2b, 0xb8, 0x11, 0xa0, 0xef, 0x08, 0x51, 0xf8, 0xd9, 0xc1, 0xb7, - 0x7e, 0x94, 0x3b, 0x51, 0xcd, 0xd9, 0xac, 0xd9, 0x79, 0x1f, 0x5f, 0x51, 0xfa, 0x78, 0x1c, 0x3d, - 0x95, 0xe8, 0x63, 0xc7, 0x76, 0x7b, 0x66, 0xd4, 0x3d, 0x7a, 0x1d, 0x4a, 0x4a, 0x85, 0x91, 0xa4, - 0xfb, 0xfc, 0xe0, 0x4a, 0x13, 0x97, 0xa7, 0x06, 0x8d, 0x47, 0xda, 0x75, 0xa8, 0xd6, 0x19, 0xa5, - 0xad, 0xcf, 0xa3, 0xb9, 0x2c, 0x6d, 0x55, 0xc5, 0xab, 0x5f, 0x8f, 0x04, 0xd9, 0xb9, 0xc1, 0xb5, - 0xc7, 0xee, 0x4e, 0x0d, 0x5a, 0x24, 0x27, 0x95, 0x96, 0x3d, 0xdb, 0xca, 0x4c, 0x45, 0xb2, 0xd0, - 0xbf, 0x19, 0xc9, 0xaa, 0x73, 0x59, 0x68, 0xa2, 0x5c, 0xa2, 0x1a, 0xd4, 0xaa, 0xd7, 0x94, 0x56, - 0x3d, 0x77, 0x7c, 0x36, 0x13, 0xbd, 0x7a, 0x96, 0xc9, 0xc8, 0x75, 0xee, 0x2c, 0x3c, 0xd6, 0x71, - 0xbb, 0x51, 0x0d, 0x86, 0x67, 0xa5, 0x35, 0xeb, 0x5c, 0x9d, 0x9d, 0xde, 0xd6, 0x7c, 0x37, 0x74, - 0xd7, 0xb4, 0x4f, 0x55, 0xc5, 0x87, 0xcd, 0x8a, 0x47, 0x40, 0x2f, 0xfe, 0xdf, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x17, 0x71, 0xf3, 0xe0, 0x26, 0xe9, 0x00, 0x00, + // 12095 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6b, 0x8c, 0x1c, 0xc9, + 0x79, 0xd8, 0xf6, 0xbc, 0xe7, 0x9b, 0x7d, 0x16, 0x97, 0xe4, 0xdc, 0xdc, 0x8b, 0xd7, 0xf7, 0xa6, + 0xee, 0x76, 0xef, 0xc8, 0x7b, 0xf0, 0x71, 0x3c, 0xde, 0xbe, 0xc8, 0xdd, 0xe3, 0x92, 0xdc, 0xeb, + 0x5d, 0xf2, 0x44, 0x9d, 0x4e, 0x73, 0xbd, 0xd3, 0xb5, 0xbb, 0x7d, 0xec, 0xe9, 0x6e, 0x77, 0xf7, + 0x2c, 0xb9, 0x27, 0x9c, 0x63, 0xd9, 0x81, 0x5f, 0x8a, 0x04, 0x24, 0x4e, 0x24, 0x25, 0x80, 0xe0, + 0xc0, 0x36, 0x12, 0x07, 0xce, 0xcb, 0x51, 0x84, 0x00, 0x4e, 0x22, 0x20, 0x88, 0x12, 0x27, 0x3f, + 0x92, 0x40, 0x11, 0xf4, 0xc3, 0x41, 0x80, 0xbc, 0x8c, 0x20, 0x08, 0x1c, 0x28, 0x10, 0x8c, 0x20, + 0x81, 0xe1, 0x38, 0xa8, 0x57, 0x77, 0x75, 0x4f, 0xef, 0x4e, 0xf7, 0x70, 0x8f, 0xa2, 0x9c, 0xfb, + 0xb3, 0x3b, 0xf5, 0x75, 0xd5, 0x57, 0x55, 0x5f, 0x55, 0x7d, 0xf5, 0xd5, 0xf7, 0x7d, 0xf5, 0x15, + 0x8c, 0x76, 0x2c, 0x13, 0xdb, 0xc1, 0x8c, 0xeb, 0x39, 0x81, 0x83, 0x1e, 0xd1, 0x5d, 0xd7, 0xef, + 0x38, 0x06, 0x9e, 0xb9, 0xdd, 0xdb, 0xc4, 0x9e, 0x8d, 0x03, 0xec, 0xcf, 0xec, 0xbe, 0xac, 0x5b, + 0xee, 0x8e, 0xfe, 0x72, 0xeb, 0x91, 0x6d, 0xc7, 0xd9, 0xb6, 0xf0, 0xac, 0xee, 0x9a, 0xb3, 0xba, + 0x6d, 0x3b, 0x81, 0x1e, 0x98, 0x8e, 0xed, 0xb3, 0xb2, 0xad, 0xc7, 0x44, 0xd9, 0x7d, 0xbe, 0x3f, + 0x19, 0xe2, 0xee, 0x38, 0x5d, 0x9a, 0xc7, 0x08, 0xf6, 0x5c, 0xec, 0xcf, 0xd2, 0xbf, 0x3c, 0x93, + 0x7a, 0xfb, 0x8c, 0x3f, 0x63, 0x3a, 0xf4, 0x73, 0xc7, 0xf1, 0xf0, 0xec, 0xee, 0xcb, 0xb3, 0xdb, + 0xd8, 0xc6, 0x9e, 0x1e, 0x60, 0x83, 0xe5, 0x51, 0xff, 0x87, 0x02, 0x47, 0x56, 0x4d, 0x3f, 0xd0, + 0xb0, 0xef, 0xf4, 0xbc, 0x0e, 0xd6, 0xf0, 0x4f, 0xf5, 0xb0, 0x1f, 0xa0, 0x26, 0x54, 0x3b, 0x56, + 0xcf, 0x0f, 0xb0, 0xd7, 0x54, 0x4e, 0x28, 0xcf, 0xd5, 0x35, 0x91, 0x44, 0x08, 0x4a, 0xa4, 0x92, + 0x66, 0x81, 0x82, 0xe9, 0x6f, 0xf4, 0x08, 0xd4, 0x6d, 0xbd, 0x8b, 0x7d, 0x57, 0xef, 0xe0, 0x66, + 0x91, 0x7e, 0x88, 0x00, 0xe8, 0x71, 0x68, 0xe8, 0xae, 0xd9, 0xde, 0xc5, 0x9e, 0x6f, 0x3a, 0x76, + 0xb3, 0x44, 0xbf, 0x83, 0xee, 0x9a, 0x37, 0x19, 0x04, 0x3d, 0x0b, 0x13, 0xa6, 0xdd, 0xb1, 0x7a, + 0x06, 0x6e, 0x77, 0x71, 0xe0, 0x99, 0x1d, 0xbf, 0x59, 0x3e, 0xa1, 0x3c, 0x57, 0xd3, 0xc6, 0x39, + 0xf8, 0x2a, 0x83, 0xa2, 0x16, 0xd4, 0x7c, 0x6c, 0xe1, 0x4e, 0xe0, 0x78, 0xcd, 0x0a, 0x45, 0x13, + 0xa6, 0xd1, 0x53, 0x30, 0xb6, 0x65, 0x62, 0xcb, 0x58, 0x17, 0x19, 0xaa, 0x34, 0x43, 0x1c, 0xa8, + 0x7e, 0x47, 0x81, 0x87, 0x35, 0x4c, 0x9a, 0x82, 0x57, 0x6c, 0x03, 0xdf, 0xbd, 0xb7, 0x7e, 0x23, + 0x28, 0x91, 0x6e, 0xf2, 0x2e, 0xd3, 0xdf, 0x71, 0x5a, 0x94, 0x06, 0xd0, 0xa2, 0xdc, 0x47, 0x8b, + 0xc7, 0x00, 0x02, 0xdd, 0xdb, 0xc6, 0xc1, 0x06, 0xa9, 0x8c, 0xf5, 0x41, 0x82, 0xa8, 0x06, 0x4c, + 0xc7, 0xc7, 0xcb, 0x77, 0x1d, 0xdb, 0xc7, 0x68, 0x15, 0xea, 0x1e, 0x87, 0xf9, 0xb4, 0xe9, 0x8d, + 0x53, 0x33, 0x33, 0x07, 0xcd, 0xc0, 0x99, 0x2b, 0xbd, 0x4d, 0x2c, 0xd0, 0x50, 0x94, 0x11, 0x02, + 0xf5, 0x07, 0x0a, 0x1c, 0x5f, 0xc4, 0x7e, 0xc7, 0x33, 0xa3, 0x3c, 0x9f, 0xc4, 0xd4, 0x10, 0x04, + 0x2c, 0x49, 0x04, 0x9c, 0x84, 0xa2, 0xa7, 0xdf, 0xe1, 0xa4, 0x21, 0x3f, 0xd3, 0xe6, 0x47, 0x25, + 0x75, 0x7e, 0x24, 0xa8, 0x5b, 0x4d, 0x52, 0x57, 0xdd, 0x84, 0x66, 0x7f, 0xb7, 0x38, 0x05, 0x2f, + 0x41, 0x4d, 0x10, 0x80, 0x13, 0xf0, 0x64, 0x76, 0x02, 0x6a, 0x61, 0x59, 0xf5, 0x5f, 0x29, 0x70, + 0xf4, 0x86, 0x6b, 0xe8, 0xc1, 0x7d, 0xa7, 0xdc, 0xe9, 0x88, 0x72, 0x8d, 0x53, 0x4f, 0x1c, 0xdc, + 0x78, 0x4d, 0xbf, 0xc3, 0x88, 0x9b, 0xa0, 0x59, 0xa5, 0x8f, 0x66, 0x5f, 0x2b, 0xc2, 0xf4, 0x82, + 0x63, 0x6f, 0x99, 0xdb, 0x57, 0x75, 0x77, 0xc9, 0x30, 0x83, 0xc1, 0xdd, 0x89, 0x35, 0xbd, 0xb0, + 0x5f, 0xd3, 0xe5, 0x55, 0x73, 0x15, 0x8a, 0xba, 0x61, 0x34, 0x4b, 0x27, 0x8a, 0xcf, 0x35, 0x4e, + 0x9d, 0x3f, 0xb8, 0xe9, 0x69, 0x8d, 0x99, 0x99, 0x33, 0x8c, 0x25, 0x3b, 0xf0, 0xf6, 0x34, 0x82, + 0x07, 0xdd, 0x84, 0x4a, 0x8f, 0x0e, 0x41, 0xb3, 0x4c, 0x31, 0xbe, 0x39, 0x04, 0x46, 0x36, 0x86, + 0x0c, 0x29, 0xc7, 0x46, 0xba, 0x6c, 0x60, 0x0b, 0x07, 0xd8, 0x68, 0x56, 0x4e, 0x14, 0x49, 0x97, + 0x79, 0xb2, 0xf5, 0x1a, 0xd4, 0x44, 0x13, 0xc8, 0x0c, 0xbe, 0x8d, 0xf7, 0x38, 0x51, 0xc8, 0x4f, + 0x34, 0x0d, 0xe5, 0x5d, 0xdd, 0xea, 0x09, 0x62, 0xb0, 0xc4, 0xb9, 0xc2, 0x19, 0xa5, 0x75, 0x16, + 0x1a, 0x52, 0x45, 0x79, 0x8a, 0xaa, 0x5f, 0x29, 0xc2, 0xd4, 0x3a, 0xee, 0x78, 0x38, 0xf8, 0xa4, + 0x46, 0xe5, 0x6d, 0x79, 0x54, 0xce, 0x1c, 0x4c, 0xc3, 0xbe, 0x96, 0x24, 0x86, 0x64, 0x3d, 0x31, + 0x24, 0xe7, 0xf3, 0xa2, 0x7b, 0xe0, 0xc7, 0xe3, 0xbb, 0x0a, 0x1c, 0x59, 0x70, 0xdc, 0xbd, 0xe4, + 0xb2, 0x7f, 0x0b, 0x2a, 0x31, 0xb6, 0xf2, 0xdc, 0x60, 0xb6, 0x72, 0x7d, 0xf3, 0x43, 0xdc, 0x09, + 0x34, 0x5e, 0x0e, 0xbd, 0x0d, 0x0d, 0x03, 0xfb, 0x81, 0x69, 0x53, 0x21, 0x80, 0xd6, 0x9c, 0x07, + 0x8d, 0x5c, 0x38, 0xb9, 0xde, 0x8b, 0x7d, 0xeb, 0xfd, 0xef, 0x28, 0x70, 0x74, 0xc1, 0xc3, 0xf7, + 0xcc, 0xbf, 0xee, 0x1f, 0x87, 0xfa, 0x86, 0x02, 0x47, 0x17, 0xe9, 0xb8, 0xdf, 0x6f, 0x8e, 0x3b, + 0x68, 0x3b, 0x57, 0x7f, 0x78, 0x1a, 0x26, 0x93, 0x1b, 0x2d, 0xfa, 0x3c, 0x34, 0x3a, 0x94, 0xe3, + 0xb4, 0xbb, 0xba, 0x2b, 0x76, 0xeb, 0xb3, 0xf9, 0x76, 0xeb, 0x88, 0x67, 0xf9, 0xcb, 0x23, 0x1a, + 0x74, 0xc2, 0x14, 0xc1, 0x6e, 0xe8, 0xb8, 0xeb, 0xd8, 0x6d, 0x1f, 0x07, 0x3e, 0x9f, 0x2c, 0x79, + 0xb1, 0x2f, 0x52, 0x0c, 0xeb, 0x38, 0xa0, 0xd8, 0x8d, 0x30, 0x85, 0xbe, 0x40, 0xa6, 0xa2, 0x6b, + 0x39, 0x7b, 0x5d, 0x6c, 0x07, 0x3e, 0xa5, 0x52, 0xe3, 0xd4, 0xb9, 0xbc, 0xd8, 0x23, 0x0c, 0xcb, + 0x23, 0x9a, 0x8c, 0x10, 0xad, 0x40, 0xe9, 0x43, 0x67, 0xd3, 0xa7, 0x54, 0x6e, 0x9c, 0x3a, 0x9d, + 0x13, 0xf1, 0xdb, 0xce, 0x26, 0xc1, 0x48, 0x51, 0xa0, 0xf7, 0x00, 0xc2, 0xd1, 0xf3, 0xf9, 0x9c, + 0xcb, 0x4b, 0x87, 0x6b, 0x21, 0x02, 0x42, 0x87, 0x08, 0x1d, 0x5a, 0x85, 0xb2, 0xed, 0x18, 0x98, + 0x49, 0x22, 0x8d, 0x53, 0xaf, 0xe4, 0xc5, 0x4b, 0xca, 0x2e, 0x8f, 0x68, 0x0c, 0x09, 0xda, 0x84, + 0x31, 0x3f, 0xd0, 0x03, 0xbc, 0xd5, 0xb3, 0xd8, 0xa8, 0x55, 0x29, 0xd6, 0xf3, 0x39, 0xb1, 0xae, + 0x73, 0x1c, 0x7c, 0xdc, 0x46, 0x7d, 0x29, 0x4d, 0x28, 0xeb, 0x3a, 0x86, 0xdf, 0xac, 0x0d, 0x45, + 0xd9, 0x35, 0xc7, 0xa0, 0x94, 0x25, 0x28, 0x50, 0x1b, 0x46, 0x3d, 0xec, 0x5a, 0x66, 0x47, 0x67, + 0xad, 0xad, 0x0f, 0x35, 0x0b, 0x34, 0x86, 0x82, 0x37, 0xb6, 0xe1, 0x45, 0x49, 0x74, 0x83, 0x08, + 0xfa, 0xde, 0xae, 0x49, 0x06, 0x0e, 0x28, 0xf2, 0xd7, 0xf3, 0x92, 0x82, 0x17, 0x5f, 0x1e, 0xd1, + 0x42, 0x54, 0x48, 0x83, 0xaa, 0x4f, 0xf7, 0x15, 0xbf, 0xd9, 0xa0, 0x58, 0x5f, 0xcb, 0x8d, 0x95, + 0x96, 0x5e, 0x1e, 0xd1, 0x04, 0x22, 0xf4, 0x33, 0x0a, 0x1c, 0xe7, 0x4d, 0x27, 0xfc, 0xb5, 0xdd, + 0x71, 0xec, 0xc0, 0x73, 0x2c, 0x0b, 0x7b, 0x7e, 0x73, 0x94, 0x56, 0xb2, 0x34, 0x1c, 0x5d, 0x08, + 0xb6, 0x85, 0x08, 0xd9, 0xf2, 0x88, 0x76, 0xcc, 0x4b, 0xfd, 0x82, 0x76, 0x60, 0xc2, 0x0f, 0x1c, + 0x4f, 0xdf, 0xc6, 0xed, 0x8e, 0xa5, 0xfb, 0x3e, 0xf6, 0x9b, 0x63, 0xb4, 0xe6, 0x0b, 0xb9, 0xe7, + 0x0f, 0xc5, 0xb2, 0xc0, 0x90, 0x2c, 0x8f, 0x68, 0xe3, 0x7e, 0x0c, 0x82, 0x7e, 0x0a, 0x90, 0x4b, + 0x38, 0x9b, 0x1f, 0x60, 0x3b, 0x68, 0xef, 0x3a, 0x56, 0xaf, 0x8b, 0xfd, 0xe6, 0x38, 0xad, 0xec, + 0xad, 0xbc, 0x33, 0x2a, 0x44, 0x74, 0x93, 0xe1, 0x59, 0x1e, 0xd1, 0xa6, 0xdc, 0x24, 0x10, 0x7d, + 0x49, 0x81, 0x66, 0x5f, 0x9d, 0xa4, 0x9f, 0x66, 0xd7, 0x6f, 0x4e, 0x0c, 0x45, 0xe0, 0x64, 0xcd, + 0x0b, 0x14, 0x19, 0x21, 0xb0, 0x9b, 0xfa, 0x85, 0x2c, 0x76, 0xcf, 0xb1, 0xb0, 0xdf, 0x9c, 0x1c, + 0x6a, 0xb1, 0x6b, 0xa4, 0x2c, 0x59, 0xec, 0x14, 0x09, 0x59, 0xec, 0x7c, 0x17, 0x6a, 0x33, 0xac, + 0x53, 0x43, 0x2d, 0xf6, 0x05, 0x86, 0x43, 0x20, 0x1f, 0xed, 0x48, 0x69, 0x52, 0x07, 0xc1, 0xdd, + 0xde, 0x34, 0x6d, 0xc3, 0xb4, 0xb7, 0xfd, 0x26, 0x1a, 0xaa, 0x0e, 0x82, 0x6c, 0x9e, 0xa3, 0x20, + 0x75, 0x78, 0x52, 0x1a, 0xdd, 0x85, 0xa3, 0x72, 0x3f, 0xa2, 0xba, 0x8e, 0xd0, 0xba, 0xe6, 0x87, + 0xef, 0x8f, 0x54, 0xe5, 0x91, 0x4e, 0x3f, 0x18, 0xe9, 0x30, 0xda, 0xc1, 0x5e, 0x60, 0x6e, 0x91, + 0xc5, 0x80, 0xfd, 0xe6, 0xf4, 0x70, 0x04, 0x94, 0x50, 0x50, 0x02, 0x4a, 0x69, 0x74, 0x13, 0xea, + 0x1d, 0xcf, 0xb1, 0xdb, 0x74, 0x33, 0x3a, 0x3a, 0x14, 0x0b, 0x5a, 0xf0, 0x1c, 0x9b, 0x6f, 0x48, + 0xb5, 0x0e, 0xff, 0x4d, 0x58, 0x90, 0x47, 0xa4, 0xb1, 0x8e, 0xdf, 0x3c, 0x36, 0x14, 0x0b, 0xd2, + 0x58, 0x69, 0xc2, 0x82, 0x38, 0x22, 0xb2, 0xd1, 0xb9, 0x8e, 0x1f, 0x6c, 0x7b, 0x98, 0x2c, 0xfd, + 0xe3, 0x43, 0x6d, 0x74, 0x6b, 0x21, 0x02, 0xb2, 0xd1, 0x45, 0xe8, 0xd0, 0x87, 0x30, 0x81, 0x2d, + 0x9d, 0x56, 0x84, 0x75, 0xaf, 0xb3, 0x83, 0xfd, 0x66, 0x93, 0xd6, 0xf0, 0x66, 0xce, 0x1a, 0x96, + 0xe2, 0x58, 0x96, 0x47, 0xb4, 0x24, 0x62, 0x64, 0xc3, 0x94, 0xe1, 0x78, 0x5d, 0xdd, 0x0e, 0xda, + 0x86, 0x1e, 0xe8, 0x9b, 0x3a, 0xe9, 0xcf, 0x43, 0xb4, 0xb6, 0x8b, 0x79, 0x45, 0x0c, 0x86, 0x67, + 0x51, 0xa0, 0x59, 0x1e, 0xd1, 0x26, 0x8d, 0x04, 0x0c, 0x7d, 0x16, 0xea, 0xbe, 0xad, 0xbb, 0xfe, + 0x8e, 0x13, 0xf8, 0xcd, 0x16, 0xad, 0xe7, 0x4c, 0x5e, 0x96, 0x29, 0xca, 0x2f, 0x8f, 0x68, 0x11, + 0x32, 0x74, 0x1d, 0x2a, 0x78, 0x97, 0x4a, 0x48, 0x0f, 0x53, 0xb4, 0xaf, 0xe6, 0x25, 0xd6, 0x2e, + 0x17, 0x8e, 0x38, 0x1a, 0xd2, 0x54, 0xd3, 0x26, 0x43, 0x42, 0x48, 0xf2, 0xc8, 0x50, 0x4d, 0x5d, + 0x11, 0xe5, 0x49, 0x53, 0x43, 0x64, 0x64, 0x31, 0xb9, 0x9e, 0xd3, 0xc5, 0xc1, 0x0e, 0xee, 0x11, + 0xe4, 0x8f, 0x0e, 0xb5, 0x98, 0xd6, 0x24, 0x14, 0x64, 0x31, 0xc9, 0x28, 0xd1, 0x6d, 0x98, 0xe4, + 0x7b, 0x70, 0xbb, 0xeb, 0xd8, 0x66, 0xe0, 0x78, 0x7e, 0xf3, 0xb1, 0xa1, 0x26, 0x11, 0xdf, 0xd6, + 0xaf, 0x72, 0x2c, 0x64, 0x12, 0xf9, 0x71, 0x10, 0xc2, 0x30, 0x2e, 0xd8, 0x92, 0x6e, 0x61, 0x2f, + 0xf0, 0x9b, 0x8f, 0xd3, 0xaa, 0xde, 0x18, 0x8e, 0x1f, 0xcd, 0x51, 0x1c, 0xcb, 0x23, 0x9a, 0x60, + 0xda, 0x0c, 0x40, 0xc4, 0x6c, 0x22, 0xbb, 0x89, 0x3a, 0x4e, 0x0c, 0x27, 0x5e, 0x3a, 0x06, 0x0e, + 0x2b, 0x00, 0x3b, 0x4c, 0xa1, 0x5b, 0x64, 0x49, 0x1b, 0x02, 0xf9, 0x13, 0x43, 0x8d, 0xf7, 0x9a, + 0x63, 0x84, 0xb8, 0xeb, 0xae, 0x48, 0x90, 0xa9, 0xd9, 0xdd, 0xf3, 0x7f, 0xca, 0xf2, 0x9b, 0xea, + 0x50, 0x53, 0xf3, 0x2a, 0x2d, 0x4c, 0xa6, 0x26, 0x43, 0xc3, 0x58, 0x9a, 0x61, 0x92, 0xb9, 0xf3, + 0xe4, 0x90, 0x2c, 0x8d, 0x96, 0x66, 0x2c, 0x8d, 0xfe, 0x24, 0x02, 0x60, 0xd7, 0xb1, 0xb7, 0x1d, + 0x63, 0xd3, 0x6f, 0x3e, 0x35, 0x14, 0xf7, 0xbd, 0xca, 0x8b, 0x13, 0xee, 0x2b, 0x50, 0x11, 0x4e, + 0xd9, 0xc5, 0xdd, 0x8e, 0xde, 0xd9, 0xc1, 0x86, 0xdf, 0x7c, 0x7a, 0xa8, 0x31, 0xbb, 0x1a, 0x22, + 0x20, 0x63, 0x16, 0xa1, 0x23, 0xc8, 0x3d, 0xdc, 0x71, 0x76, 0xb1, 0x67, 0x62, 0xbf, 0xf9, 0xcc, + 0x50, 0xc8, 0xb5, 0x10, 0x01, 0x41, 0x1e, 0xa1, 0x6b, 0x2d, 0x40, 0x85, 0xf1, 0x04, 0x74, 0x16, + 0xca, 0x66, 0x80, 0xbb, 0xe4, 0xdc, 0x58, 0x7c, 0xae, 0x71, 0xea, 0xc9, 0x83, 0x6b, 0xa0, 0x85, + 0x34, 0x56, 0xa2, 0x75, 0x05, 0x20, 0x3a, 0x36, 0xa2, 0x0b, 0x71, 0x44, 0xcf, 0x66, 0xd4, 0x91, + 0x49, 0xc8, 0xa2, 0x53, 0x62, 0x4e, 0x64, 0x61, 0x41, 0x81, 0xec, 0x2a, 0x34, 0xa4, 0x43, 0x21, + 0x7a, 0x33, 0x8e, 0x6d, 0x80, 0xaa, 0x23, 0x2a, 0x29, 0xd0, 0x5d, 0x84, 0x12, 0xdd, 0x6d, 0x5f, + 0x8f, 0xe3, 0x19, 0xa0, 0x71, 0x78, 0xdb, 0xd9, 0x94, 0x3a, 0x17, 0x1d, 0xfd, 0x72, 0x76, 0x2e, + 0x2c, 0x28, 0x90, 0xcd, 0x41, 0x99, 0x9e, 0xf7, 0xd0, 0x99, 0x38, 0x1e, 0x75, 0x00, 0x1e, 0xc7, + 0x08, 0x51, 0x5c, 0x87, 0x51, 0xf9, 0x70, 0x87, 0x2e, 0xc6, 0x31, 0x3d, 0x3f, 0x40, 0x99, 0x16, + 0x15, 0x95, 0x28, 0x44, 0x8e, 0x74, 0x39, 0x29, 0xb4, 0xe6, 0x18, 0xd2, 0x88, 0x49, 0x07, 0xb8, + 0x9c, 0x23, 0x16, 0x95, 0x14, 0xe8, 0x2e, 0x43, 0x4d, 0x1c, 0xd9, 0xd0, 0xf9, 0x38, 0xae, 0xa7, + 0x07, 0x69, 0x0a, 0x69, 0x31, 0x81, 0x68, 0x09, 0xaa, 0xfc, 0x94, 0x86, 0xce, 0xc5, 0xf1, 0x3c, + 0x95, 0x45, 0xe3, 0x28, 0xd0, 0x74, 0xe0, 0x58, 0xfa, 0x39, 0x0c, 0xad, 0xc4, 0xb1, 0x9e, 0xce, + 0xd4, 0xd3, 0x38, 0x12, 0x51, 0x89, 0x06, 0xe3, 0xf1, 0x23, 0x17, 0x7a, 0x2b, 0x8e, 0xfc, 0xe4, + 0xa0, 0x71, 0x8d, 0x0a, 0x0b, 0x9c, 0xb7, 0x60, 0xaa, 0xef, 0x64, 0x85, 0x16, 0xe3, 0x68, 0x07, + 0x58, 0x86, 0x92, 0xe5, 0x25, 0x9a, 0xa4, 0x1f, 0x9d, 0x72, 0xd2, 0x24, 0x15, 0x89, 0xa8, 0xe4, + 0x1d, 0x18, 0x8b, 0xed, 0xbc, 0x39, 0x49, 0x22, 0x97, 0x95, 0x17, 0x73, 0xb4, 0xb5, 0xe6, 0x5c, + 0xcc, 0xa2, 0xa0, 0x40, 0xb6, 0x02, 0xf5, 0x70, 0x63, 0x45, 0x6f, 0xc4, 0x71, 0x3d, 0x33, 0x70, + 0xf5, 0xc4, 0x50, 0xcd, 0x41, 0x99, 0x9d, 0xd6, 0xf2, 0xf1, 0x05, 0x52, 0x46, 0xe2, 0x0b, 0xf2, + 0x39, 0x30, 0x27, 0x5f, 0x90, 0x8a, 0x4a, 0x08, 0x63, 0x47, 0xad, 0x7c, 0x08, 0xa5, 0xa2, 0x02, + 0xe1, 0xfb, 0x70, 0x24, 0xe5, 0x64, 0x87, 0x2e, 0xc5, 0xf1, 0xbe, 0x94, 0xb9, 0xa1, 0x09, 0xf4, + 0x84, 0x00, 0xf2, 0xb9, 0x2d, 0x27, 0x01, 0xa2, 0xa2, 0x12, 0x23, 0x12, 0x07, 0xb7, 0x9c, 0x8c, + 0x88, 0x17, 0x13, 0x88, 0xde, 0x06, 0x88, 0x0e, 0x55, 0xb9, 0x67, 0x0a, 0x2b, 0x28, 0x70, 0x6d, + 0xc0, 0x44, 0xe2, 0xf8, 0x84, 0xe6, 0xe2, 0x08, 0x3f, 0x33, 0x40, 0x0c, 0x90, 0x4b, 0x0b, 0xac, + 0xef, 0xc2, 0x64, 0xf2, 0x98, 0x84, 0x16, 0xe2, 0x68, 0x5f, 0x1c, 0xb0, 0xf3, 0xc6, 0x8b, 0x0b, + 0xc4, 0x0b, 0x50, 0x61, 0x52, 0x62, 0x4e, 0x61, 0x85, 0x16, 0x12, 0x48, 0x16, 0xa1, 0xca, 0x05, + 0xc3, 0x9c, 0x58, 0x68, 0x29, 0x69, 0x38, 0x85, 0x24, 0x98, 0x73, 0x38, 0x79, 0x31, 0x89, 0x89, + 0x44, 0x92, 0x5f, 0x4e, 0x26, 0x12, 0x16, 0x94, 0xe6, 0x46, 0x24, 0xe9, 0xe5, 0x9c, 0x1b, 0xbc, + 0xe0, 0x9e, 0xc4, 0x90, 0xc2, 0x43, 0x68, 0x84, 0xaa, 0x90, 0x05, 0x95, 0x28, 0x27, 0xed, 0x9d, + 0x5c, 0xbd, 0x90, 0x73, 0xef, 0x64, 0xa5, 0x04, 0x9a, 0x65, 0xa8, 0x87, 0x67, 0xcd, 0x9c, 0x44, + 0xe7, 0xe5, 0x04, 0xa6, 0x6b, 0x30, 0x2a, 0x1f, 0x2c, 0x73, 0x4a, 0x19, 0x51, 0x51, 0x81, 0xef, + 0x06, 0x4c, 0x24, 0x4e, 0x90, 0x68, 0x3e, 0x8e, 0xf2, 0x85, 0x4c, 0xc2, 0x06, 0x2f, 0xcd, 0xd1, + 0xce, 0x43, 0xe4, 0x3a, 0xa0, 0xfe, 0xaf, 0x63, 0x30, 0x2a, 0x8b, 0xf5, 0xc2, 0xe6, 0xa5, 0xe4, + 0xb2, 0x79, 0x9d, 0x0f, 0xf5, 0x07, 0x85, 0xec, 0x52, 0xbe, 0xd0, 0x15, 0x2c, 0x03, 0x44, 0xf6, + 0x25, 0x6e, 0xa2, 0xc9, 0x2a, 0xdd, 0x93, 0xb3, 0x62, 0x68, 0x4c, 0x22, 0x98, 0x22, 0x5b, 0x12, + 0xb7, 0xc9, 0x64, 0x15, 0xed, 0x09, 0xa6, 0xd0, 0x70, 0x84, 0xde, 0x06, 0x88, 0xcc, 0x3c, 0xdc, + 0x18, 0x93, 0x59, 0xac, 0xa7, 0x36, 0xa8, 0x30, 0x85, 0x5e, 0x85, 0xe2, 0x87, 0xce, 0x26, 0xb7, + 0xbc, 0x0c, 0x96, 0xe9, 0x97, 0x47, 0x34, 0x92, 0x1f, 0x5d, 0x96, 0xcd, 0x7b, 0xd5, 0x2c, 0x7d, + 0x09, 0x25, 0x79, 0xd2, 0x97, 0xc8, 0x12, 0x78, 0x06, 0x4a, 0xe4, 0xa8, 0xce, 0x2d, 0x29, 0x19, + 0xa4, 0xf8, 0xe5, 0x11, 0x8d, 0x96, 0x40, 0xd7, 0x60, 0x54, 0xb6, 0xf3, 0x70, 0xc3, 0x49, 0x76, + 0xe9, 0x7d, 0x79, 0x44, 0x6b, 0x48, 0x46, 0x1d, 0x42, 0x09, 0xd7, 0x31, 0xb8, 0x89, 0x64, 0xb0, + 0xec, 0x4e, 0x28, 0xe1, 0x3a, 0x06, 0xba, 0x02, 0x0d, 0xc9, 0x7e, 0xc3, 0x6d, 0x21, 0x99, 0x45, + 0x76, 0x76, 0x32, 0x15, 0x29, 0x34, 0x07, 0x55, 0xae, 0x82, 0xe1, 0xf6, 0x8e, 0x6c, 0xf2, 0x3a, + 0xb3, 0xa1, 0xd0, 0x9f, 0xe8, 0x4d, 0xa8, 0x30, 0x73, 0x0a, 0xb7, 0x5b, 0x64, 0x92, 0xd4, 0x97, + 0x47, 0x34, 0x5e, 0x0a, 0x59, 0x70, 0x2c, 0xdd, 0x04, 0xc3, 0x4d, 0x13, 0xc3, 0xc8, 0xe8, 0xcb, + 0x23, 0xda, 0xd1, 0x54, 0x7b, 0x0b, 0x7a, 0x07, 0xc6, 0x62, 0xe6, 0x16, 0x6e, 0x85, 0xc8, 0x21, + 0xab, 0x33, 0xdb, 0x5c, 0x94, 0x46, 0xef, 0xc3, 0x54, 0x9f, 0x8d, 0x83, 0x1b, 0x1b, 0x72, 0xca, + 0xea, 0xcb, 0x23, 0xda, 0x64, 0xd2, 0x8a, 0x81, 0xba, 0x70, 0x7c, 0x1f, 0x13, 0x0a, 0xb7, 0x3d, + 0x0c, 0x23, 0xb0, 0x13, 0x02, 0xa5, 0xda, 0x4b, 0xc8, 0xfa, 0xf0, 0x1c, 0x0b, 0x73, 0x9b, 0x43, + 0x06, 0x69, 0x96, 0xac, 0x0f, 0x52, 0x82, 0xac, 0x0f, 0xd9, 0xa4, 0xc0, 0x2d, 0x09, 0xd9, 0xa5, + 0x58, 0xb2, 0x3e, 0x24, 0x83, 0x01, 0xc1, 0x27, 0x9b, 0x26, 0xb8, 0xa1, 0x20, 0xbb, 0x10, 0x4b, + 0xed, 0x92, 0x51, 0x12, 0x19, 0x30, 0x9d, 0x66, 0xf2, 0xe0, 0x06, 0x82, 0xdc, 0x42, 0xec, 0xf2, + 0x88, 0x86, 0xfa, 0xed, 0x1b, 0xe8, 0x2a, 0x34, 0x24, 0x5b, 0x04, 0xb7, 0x13, 0x64, 0x97, 0x64, + 0x29, 0x11, 0xa2, 0x24, 0x9a, 0x87, 0x9a, 0x30, 0x65, 0x70, 0xe3, 0x40, 0x36, 0x41, 0x96, 0xac, + 0x50, 0x6e, 0xb7, 0x20, 0x2b, 0x94, 0x59, 0x1b, 0xb8, 0xf2, 0x3f, 0x93, 0x3c, 0x40, 0x56, 0x28, + 0x2b, 0x85, 0x16, 0xa1, 0x26, 0x6c, 0x0a, 0x5c, 0xa1, 0x9f, 0x51, 0x02, 0x5e, 0x1e, 0xd1, 0xc2, + 0x92, 0x68, 0x1d, 0xc6, 0x62, 0x26, 0x03, 0xae, 0xb3, 0xcf, 0x23, 0xfb, 0x2e, 0x8f, 0x68, 0x71, + 0x1c, 0xe8, 0x73, 0x30, 0x99, 0x34, 0x3a, 0x70, 0xa5, 0x7d, 0x3e, 0xe1, 0x77, 0x79, 0x44, 0x9b, + 0x48, 0x58, 0x18, 0x48, 0xb7, 0x85, 0x4d, 0x80, 0x2b, 0xed, 0x33, 0x4a, 0x64, 0xd4, 0x6c, 0xcd, + 0x7f, 0x13, 0x0e, 0xcb, 0xd5, 0xf5, 0x5c, 0x39, 0x9f, 0x4d, 0x88, 0x22, 0xe3, 0xc7, 0xcb, 0x91, + 0xed, 0x37, 0xd2, 0xc8, 0x73, 0xdd, 0x7b, 0x66, 0xe9, 0x89, 0x5a, 0x84, 0xc2, 0x14, 0xba, 0x95, + 0xa2, 0xcd, 0x67, 0x2a, 0xf6, 0x5c, 0xc2, 0x53, 0x9a, 0xee, 0xfe, 0x9d, 0xc8, 0x34, 0x4a, 0x55, + 0xdf, 0x5c, 0xad, 0x9e, 0xe3, 0xcc, 0x2f, 0x59, 0x42, 0x69, 0x9a, 0x88, 0x30, 0x91, 0x9e, 0x9e, + 0x6b, 0xd2, 0xb3, 0x9e, 0xf9, 0xe9, 0xb6, 0x2f, 0x12, 0x68, 0x09, 0xea, 0xa1, 0x4e, 0x9e, 0xeb, + 0xce, 0x33, 0x1e, 0xf8, 0xd9, 0x24, 0x66, 0xbf, 0x89, 0x40, 0x4c, 0x15, 0xe7, 0x5c, 0x59, 0x9e, + 0xe5, 0x48, 0xb4, 0x3c, 0xa2, 0xb1, 0x32, 0xa4, 0x30, 0x55, 0x91, 0x73, 0xa5, 0x78, 0x96, 0x93, + 0x10, 0x35, 0x3c, 0x93, 0x1f, 0x64, 0x1e, 0x71, 0x4d, 0x38, 0x57, 0x7d, 0x67, 0x3b, 0x01, 0x91, + 0x79, 0xc4, 0xcb, 0x11, 0x19, 0x2a, 0xd4, 0x78, 0x73, 0x15, 0x77, 0xd6, 0xb3, 0x0f, 0x21, 0x66, + 0x58, 0x96, 0xac, 0x0c, 0xae, 0xdd, 0xde, 0x6b, 0x3e, 0x9b, 0x85, 0x96, 0xe2, 0xd8, 0x43, 0x68, + 0x29, 0x4a, 0xc6, 0x04, 0xef, 0x3f, 0x2a, 0x42, 0xe9, 0x2a, 0x0e, 0xf4, 0xd0, 0x51, 0x4b, 0xd9, + 0xcf, 0x2b, 0xbb, 0xcf, 0xf7, 0xf1, 0x61, 0xa8, 0xfb, 0xd8, 0xda, 0x6a, 0x5b, 0xa6, 0x7d, 0x9b, + 0x3b, 0x7e, 0xd5, 0x08, 0x60, 0xd5, 0xb4, 0x6f, 0xa3, 0xe7, 0x61, 0x52, 0xd4, 0x91, 0xf0, 0x61, + 0x9f, 0x10, 0x70, 0xe1, 0xbc, 0xfd, 0x22, 0xa0, 0x8e, 0x87, 0x99, 0x10, 0x12, 0x98, 0x5d, 0xec, + 0x07, 0x7a, 0xd7, 0xa5, 0xc2, 0x6e, 0x51, 0x9b, 0x12, 0x5f, 0x36, 0xc4, 0x07, 0xf4, 0x18, 0x00, + 0xf7, 0xc7, 0x17, 0x7e, 0x6d, 0x45, 0x4d, 0x82, 0xa0, 0x4b, 0x50, 0xb1, 0xf4, 0x4d, 0x6c, 0xf9, + 0xcd, 0x6a, 0x16, 0xb5, 0x1d, 0xe9, 0xfc, 0xcc, 0x2a, 0x2d, 0xc0, 0xbd, 0x24, 0x59, 0x69, 0x74, + 0x03, 0x1a, 0xd2, 0x15, 0x82, 0x66, 0x2d, 0x8b, 0x8e, 0x8e, 0x22, 0x9b, 0x8b, 0x4a, 0x31, 0x8c, + 0x32, 0x1e, 0x34, 0x09, 0xc5, 0x9e, 0x69, 0x50, 0x19, 0xb6, 0xae, 0x91, 0x9f, 0xad, 0xb3, 0xd0, + 0x90, 0xea, 0xcf, 0xe5, 0x77, 0xf9, 0x26, 0x4c, 0x26, 0x6b, 0xcb, 0xe5, 0x7c, 0x69, 0x01, 0x44, + 0x1e, 0x8f, 0x9f, 0xb4, 0xdf, 0x9f, 0xda, 0x85, 0xc6, 0x4a, 0xc7, 0xb4, 0xb7, 0x75, 0x2a, 0x9b, + 0xa3, 0x71, 0x28, 0x5c, 0xbf, 0x42, 0x6b, 0x2a, 0x6b, 0x85, 0xeb, 0x57, 0x48, 0xf5, 0xef, 0xea, + 0x9e, 0x4d, 0x24, 0x83, 0x02, 0x05, 0x8a, 0x24, 0x6a, 0x41, 0x6d, 0xc1, 0x33, 0x03, 0xb3, 0xa3, + 0x5b, 0xb4, 0xa6, 0xb2, 0x16, 0xa6, 0x49, 0xa9, 0x1b, 0xf6, 0x6d, 0xdb, 0xb9, 0xc3, 0xe6, 0x57, + 0x59, 0x13, 0x49, 0xf5, 0x77, 0xcb, 0x50, 0x5d, 0x73, 0x8c, 0x75, 0x17, 0x77, 0xd0, 0x9b, 0x50, + 0x15, 0x7e, 0x37, 0x99, 0x8e, 0xe6, 0x5c, 0x85, 0x2b, 0x0a, 0xa1, 0xeb, 0xf4, 0x70, 0x18, 0xe8, + 0xa6, 0x8d, 0x3d, 0x71, 0xba, 0x9c, 0x1d, 0xc8, 0xc6, 0x48, 0xd5, 0xe4, 0x90, 0xc8, 0xca, 0x69, + 0x12, 0x0a, 0xf4, 0x79, 0x18, 0xa3, 0x0c, 0x36, 0xbc, 0x99, 0x51, 0xa4, 0x38, 0x5f, 0xcf, 0x86, + 0x93, 0xf0, 0x5a, 0x71, 0x3b, 0x83, 0xcd, 0xb1, 0x51, 0x5b, 0x02, 0xa1, 0x97, 0x60, 0x5a, 0x6c, + 0x36, 0x7a, 0xa7, 0xe3, 0xf4, 0xec, 0xa0, 0x2d, 0x8d, 0x06, 0xe2, 0xdf, 0xe6, 0xd8, 0x27, 0x72, + 0x5e, 0x23, 0x8b, 0x99, 0xb6, 0x87, 0x66, 0x63, 0x1e, 0x99, 0x35, 0x02, 0xa0, 0x1f, 0x5f, 0x00, + 0x64, 0x76, 0x89, 0xe4, 0xee, 0xf6, 0x2c, 0x72, 0x04, 0x63, 0xce, 0x60, 0xcc, 0x77, 0x78, 0x92, + 0x7e, 0x59, 0xeb, 0x59, 0x16, 0x37, 0x20, 0xb4, 0x2e, 0xc2, 0x54, 0x5f, 0xfb, 0x72, 0xcd, 0xea, + 0xaf, 0x16, 0xa0, 0x1e, 0x52, 0x2d, 0x95, 0x31, 0x4d, 0x43, 0x99, 0x56, 0x2b, 0xca, 0xd2, 0x04, + 0x99, 0x26, 0x1d, 0xa7, 0xdb, 0xd5, 0x6d, 0xc3, 0xa7, 0xe4, 0xac, 0x6b, 0x61, 0x1a, 0x5d, 0x83, + 0x31, 0x2e, 0xc1, 0x77, 0x49, 0x9f, 0x7d, 0xee, 0x9e, 0xfd, 0x7c, 0x96, 0x69, 0x70, 0x95, 0x94, + 0xd0, 0x46, 0x77, 0xa3, 0x84, 0x4f, 0x5a, 0xa5, 0x7b, 0xdb, 0x3e, 0x75, 0xcb, 0xae, 0x6b, 0xf4, + 0x37, 0x7a, 0x1c, 0x1a, 0x77, 0x1c, 0xef, 0xb6, 0x69, 0x6f, 0xb7, 0x0d, 0x53, 0xdc, 0xb5, 0x01, + 0x0e, 0x5a, 0x34, 0x3d, 0xf4, 0x1a, 0x14, 0xb1, 0xbd, 0xcb, 0xf9, 0xd2, 0x80, 0x19, 0xb8, 0x64, + 0xef, 0xde, 0xd4, 0x3d, 0x8d, 0x14, 0x50, 0x37, 0xa1, 0xc2, 0xcf, 0x24, 0x69, 0xc4, 0x58, 0x04, + 0xde, 0xb4, 0x75, 0xe6, 0x2f, 0xcd, 0x7c, 0x57, 0x4f, 0xcc, 0xb0, 0x8b, 0x4c, 0x33, 0xba, 0x6b, + 0xce, 0x74, 0x1c, 0x0f, 0xcf, 0xec, 0x8a, 0xfe, 0xb0, 0x7c, 0x5a, 0xac, 0x94, 0xfa, 0x3e, 0x34, + 0xa4, 0xde, 0xa6, 0x56, 0xf4, 0x30, 0xd4, 0x3d, 0xac, 0x1b, 0x6d, 0xc7, 0xb6, 0xf6, 0x68, 0x2d, + 0x35, 0xb2, 0xa9, 0xe8, 0xc6, 0x75, 0xdb, 0xda, 0x43, 0x8f, 0x02, 0x50, 0xca, 0xb6, 0x5d, 0x3d, + 0xd8, 0x11, 0xfc, 0x80, 0x42, 0xd6, 0xf4, 0x60, 0x47, 0x7d, 0x19, 0x8a, 0x9a, 0x7e, 0x07, 0x1d, + 0x83, 0xca, 0x16, 0x91, 0xf6, 0x02, 0x8e, 0x98, 0xa7, 0x48, 0x75, 0x44, 0x8c, 0x14, 0x0c, 0x86, + 0xfc, 0x56, 0xff, 0xa9, 0x42, 0xa7, 0x01, 0x57, 0xaa, 0xbc, 0x06, 0xa5, 0x2e, 0x0e, 0x74, 0xae, + 0x11, 0x52, 0x07, 0xf3, 0x61, 0x8d, 0xe6, 0x47, 0x4b, 0x21, 0x66, 0x42, 0xf4, 0x97, 0x33, 0x2a, + 0x74, 0x66, 0x88, 0x30, 0xca, 0x56, 0x16, 0x2d, 0xde, 0x7a, 0x1d, 0xea, 0x21, 0x28, 0x17, 0x8b, + 0xfd, 0x4e, 0x11, 0x8a, 0xe4, 0x2c, 0x30, 0x6c, 0xfb, 0x27, 0xa1, 0xa8, 0xbb, 0x2e, 0xc7, 0x4b, + 0x7e, 0xa2, 0xb3, 0x50, 0xf2, 0x5d, 0xdc, 0xe1, 0x2a, 0xaa, 0xa7, 0x07, 0x6a, 0x72, 0x08, 0xc7, + 0xd0, 0x68, 0x11, 0xea, 0x54, 0x1f, 0xe8, 0x41, 0x4f, 0x78, 0x0a, 0x3f, 0x37, 0xb0, 0x30, 0xd5, + 0xa3, 0xf4, 0x7c, 0x8d, 0x97, 0x6b, 0xfd, 0x50, 0x81, 0x0a, 0x03, 0x91, 0x11, 0xf7, 0x03, 0xdd, + 0x0b, 0xe8, 0xa6, 0x4d, 0xfb, 0x55, 0xd4, 0xea, 0x14, 0x42, 0x36, 0x6b, 0xf4, 0x2c, 0x4c, 0x74, + 0x9c, 0xae, 0x6b, 0xe1, 0x70, 0x63, 0xa7, 0x9d, 0x28, 0x6a, 0xe3, 0x11, 0x98, 0x66, 0x3c, 0x06, + 0x15, 0xbd, 0x13, 0x98, 0xbb, 0x98, 0xf3, 0x76, 0x9e, 0x22, 0x1b, 0x8c, 0xdf, 0xeb, 0x74, 0x30, + 0x36, 0xb0, 0xc1, 0x79, 0x7b, 0x04, 0xa0, 0x33, 0x49, 0x37, 0x2d, 0x6c, 0x50, 0x6e, 0x55, 0xd6, + 0x78, 0x8a, 0x73, 0x6a, 0xc3, 0x64, 0xbb, 0x76, 0x25, 0x0b, 0xa7, 0x16, 0x4a, 0xc7, 0x05, 0x51, + 0x4e, 0x93, 0x50, 0xa8, 0xff, 0x42, 0x81, 0x2a, 0xa7, 0x22, 0x3a, 0x01, 0x0d, 0x57, 0xf7, 0x74, + 0xcb, 0xc2, 0x96, 0xe9, 0x77, 0xf9, 0xde, 0x25, 0x83, 0x48, 0x8e, 0xa8, 0x7b, 0x3e, 0xdf, 0xc8, + 0x64, 0x10, 0x9a, 0x83, 0x5a, 0x80, 0xbb, 0xae, 0x45, 0x0e, 0xa9, 0x99, 0x86, 0x90, 0x33, 0x7d, + 0x2d, 0x2c, 0x86, 0x5e, 0x83, 0xe3, 0x8c, 0x46, 0x6d, 0x03, 0xeb, 0x86, 0x65, 0xda, 0x64, 0x1f, + 0x21, 0x4d, 0x66, 0xe3, 0x5a, 0xd4, 0x8e, 0xb2, 0xcf, 0x8b, 0xfc, 0xeb, 0x3a, 0xfb, 0xa8, 0xfe, + 0xf5, 0x02, 0xd4, 0x43, 0xed, 0xdc, 0xd0, 0x33, 0xf2, 0x52, 0x38, 0x89, 0x0a, 0x59, 0x74, 0x2d, + 0x61, 0x85, 0x89, 0xa9, 0x84, 0x56, 0x62, 0xf3, 0xf8, 0xd5, 0xac, 0x58, 0xc2, 0x5f, 0xd1, 0xbc, + 0x6e, 0xcd, 0xc2, 0x58, 0x0c, 0x4c, 0x84, 0xc4, 0x2d, 0xd3, 0xd6, 0x2d, 0xf3, 0x23, 0xb2, 0x5f, + 0x2b, 0x94, 0x49, 0x4b, 0x90, 0xd6, 0x63, 0xe1, 0x2c, 0x9e, 0x86, 0xb2, 0xbb, 0x43, 0x4e, 0xaf, + 0x6c, 0x35, 0xb3, 0x84, 0xfa, 0x57, 0xc7, 0xa1, 0x44, 0x36, 0xb1, 0xa1, 0x89, 0x74, 0x9e, 0x77, + 0xae, 0x90, 0xf5, 0xe8, 0x34, 0x23, 0x2d, 0xd3, 0x87, 0xa1, 0x6e, 0xfa, 0xed, 0xae, 0x4e, 0x45, + 0xb1, 0x22, 0x63, 0xb4, 0xa6, 0x7f, 0x95, 0xa6, 0xd1, 0x52, 0x62, 0x0d, 0xbf, 0x98, 0x01, 0x37, + 0xdd, 0x8f, 0xe3, 0xd4, 0xbf, 0x08, 0x55, 0xf9, 0xda, 0xe8, 0xe0, 0x63, 0x0d, 0xcb, 0xac, 0x89, + 0x52, 0xad, 0x5f, 0x54, 0xa0, 0x44, 0x69, 0xfd, 0x38, 0x34, 0xf0, 0xdd, 0x00, 0x7b, 0xb6, 0x6e, + 0xb5, 0x4d, 0x83, 0xd3, 0x11, 0x04, 0x68, 0xc5, 0x20, 0x19, 0x5c, 0xcf, 0xd9, 0x35, 0x0d, 0xec, + 0x91, 0x0c, 0x8c, 0x95, 0x81, 0x00, 0xad, 0x18, 0xe8, 0x29, 0x18, 0xeb, 0xd9, 0x3e, 0x39, 0xe1, + 0xf4, 0x2c, 0x7d, 0xd3, 0xc2, 0xbc, 0xcf, 0x71, 0x20, 0x91, 0xf4, 0x5c, 0xc7, 0x58, 0x58, 0x59, + 0xd4, 0xb8, 0x1c, 0x23, 0x92, 0xad, 0x1f, 0x01, 0xb3, 0x55, 0xf3, 0x21, 0xd5, 0xa0, 0xd6, 0xd1, + 0x5d, 0xbd, 0x63, 0x06, 0x7b, 0x7c, 0xdc, 0x5e, 0xcb, 0x45, 0xa3, 0x99, 0x05, 0x5e, 0x5a, 0x0b, + 0xf1, 0x44, 0xd3, 0xa4, 0x20, 0x4d, 0x13, 0x74, 0x8b, 0x4b, 0x4d, 0xa6, 0xbd, 0xe5, 0xf0, 0x79, + 0xfc, 0x46, 0xbe, 0xaa, 0xe8, 0xcf, 0x3d, 0x3f, 0xc0, 0xdd, 0x15, 0x7b, 0xcb, 0x61, 0x32, 0x17, + 0xf9, 0x85, 0x3e, 0x0b, 0x0d, 0xdd, 0xb2, 0x9c, 0x8e, 0x1e, 0x50, 0x8a, 0x94, 0xee, 0xa9, 0x1f, + 0x32, 0xaa, 0x04, 0x87, 0x2c, 0xdf, 0x33, 0x87, 0x44, 0xeb, 0x50, 0xd5, 0x0d, 0x83, 0x6a, 0x5a, + 0x18, 0xbf, 0x3d, 0x9b, 0x9f, 0x06, 0x73, 0x0c, 0x81, 0x26, 0x30, 0xa1, 0x0d, 0xa8, 0x50, 0xa9, + 0x4e, 0x1c, 0xe3, 0x72, 0xd2, 0x35, 0x94, 0x1f, 0x57, 0x08, 0x12, 0x8d, 0xe3, 0x42, 0x4f, 0xc1, + 0x38, 0x17, 0xe9, 0xdb, 0xa6, 0xdd, 0xee, 0xf9, 0x98, 0x9e, 0xeb, 0xea, 0x42, 0x16, 0xf2, 0x57, + 0xec, 0x1b, 0x3e, 0x46, 0xdb, 0x30, 0x29, 0x72, 0xe9, 0x41, 0xc0, 0x8e, 0xed, 0xf5, 0x61, 0x5a, + 0x31, 0xc7, 0x4b, 0xf3, 0xe3, 0xc4, 0x04, 0xc7, 0x2a, 0xc0, 0xad, 0x4d, 0xa8, 0x89, 0x31, 0x22, + 0x1b, 0x7d, 0xc7, 0xed, 0xf1, 0x7d, 0x94, 0xfc, 0x24, 0x5b, 0x5c, 0x17, 0x77, 0x1d, 0x6f, 0x8f, + 0x6f, 0x9c, 0x3c, 0x45, 0x84, 0x25, 0x7a, 0x27, 0xa5, 0x48, 0xa1, 0xec, 0x72, 0x49, 0x13, 0xaa, + 0x5c, 0x37, 0x2e, 0x16, 0x07, 0x4f, 0xb6, 0x7e, 0xb9, 0x08, 0xe3, 0xf1, 0x59, 0x46, 0x76, 0xd6, + 0xae, 0xde, 0xd9, 0x31, 0x6d, 0xbc, 0xb2, 0xc8, 0xc5, 0xd4, 0x08, 0x40, 0x78, 0xa7, 0x4f, 0xf3, + 0xde, 0xb8, 0xb1, 0xb2, 0x28, 0xae, 0x03, 0x47, 0x10, 0xd2, 0xac, 0x4d, 0xc7, 0x09, 0x56, 0x16, + 0xa9, 0x29, 0xa7, 0xae, 0xf1, 0x14, 0x7a, 0x1a, 0xc6, 0x6f, 0x13, 0x8a, 0x58, 0xe1, 0x81, 0x9f, + 0xb1, 0x82, 0x31, 0x06, 0x15, 0xc7, 0xfd, 0x87, 0xa0, 0xe6, 0xf8, 0x6d, 0x59, 0x7c, 0xaf, 0x3a, + 0x3e, 0x1d, 0x25, 0x74, 0x0e, 0x1e, 0x0a, 0x8f, 0x48, 0x6d, 0xaf, 0x67, 0x13, 0xa1, 0x21, 0x71, + 0xe7, 0xee, 0x78, 0x98, 0x41, 0x63, 0xdf, 0xa5, 0xeb, 0xf0, 0x64, 0x44, 0x2c, 0x1c, 0x24, 0xf4, + 0x0d, 0xe3, 0x1c, 0x2c, 0x32, 0xbe, 0x00, 0x88, 0x40, 0xda, 0xae, 0xe7, 0xdc, 0xdd, 0x4b, 0x5c, + 0x42, 0x9b, 0x24, 0x5f, 0xd6, 0xc8, 0x07, 0x91, 0xfb, 0x79, 0x98, 0x74, 0x5c, 0xaa, 0x5a, 0xb0, + 0xb7, 0xdb, 0x8c, 0x08, 0xfc, 0xec, 0x3e, 0x11, 0xc2, 0x19, 0x65, 0x91, 0x0a, 0xa3, 0xba, 0xd7, + 0xd9, 0x31, 0x03, 0xdc, 0x09, 0x7a, 0x1e, 0xa6, 0xf6, 0xa5, 0xba, 0x16, 0x83, 0xb5, 0xce, 0x43, + 0x43, 0x9a, 0xed, 0xe1, 0xb9, 0x5a, 0x91, 0xce, 0xd5, 0xcd, 0x68, 0x35, 0x71, 0xf2, 0xf0, 0x64, + 0x6b, 0x09, 0xc6, 0xe3, 0xd3, 0x9a, 0x70, 0x25, 0x7a, 0xe4, 0xe6, 0x3b, 0x1c, 0x4b, 0x50, 0xc1, + 0xcc, 0xfc, 0x08, 0xb7, 0x37, 0xf7, 0x02, 0xec, 0xf3, 0xb9, 0x53, 0x27, 0x90, 0x79, 0x02, 0x20, + 0x68, 0xe2, 0xf3, 0x32, 0x55, 0xd8, 0x7f, 0x1c, 0x1a, 0x06, 0xa6, 0x27, 0x48, 0x2a, 0xd0, 0x73, + 0xa6, 0xcd, 0x40, 0x54, 0xa2, 0xff, 0xd7, 0x25, 0x28, 0xae, 0x39, 0xc6, 0x8f, 0x4b, 0xb0, 0x15, + 0x52, 0x11, 0xdb, 0x31, 0x17, 0x12, 0x9b, 0xe2, 0x67, 0x06, 0x16, 0xa6, 0x08, 0x0e, 0x79, 0x4b, + 0xfc, 0x87, 0x05, 0xea, 0xe6, 0x74, 0x90, 0x64, 0x41, 0x86, 0xb7, 0x8b, 0x7d, 0x5f, 0x9a, 0xfd, + 0x3c, 0x49, 0xd6, 0x95, 0x87, 0x75, 0x3f, 0x9c, 0xea, 0x3c, 0x45, 0xe0, 0x3b, 0x8e, 0x1f, 0xac, + 0xac, 0xf1, 0x09, 0xcd, 0x53, 0x14, 0xbf, 0x63, 0xac, 0xac, 0xf1, 0xb9, 0xcb, 0x12, 0x87, 0x2e, + 0xff, 0x26, 0xc4, 0xfc, 0x6a, 0x52, 0xcc, 0x5f, 0x86, 0x51, 0xa1, 0x6a, 0xa0, 0xbb, 0x60, 0x2d, + 0x8f, 0xf7, 0x61, 0x83, 0x17, 0x25, 0x5c, 0x49, 0xfd, 0xdd, 0x0a, 0x4c, 0x26, 0x6d, 0x66, 0x43, + 0xcf, 0xae, 0x77, 0x63, 0xf2, 0xd7, 0x42, 0x3e, 0x4b, 0x5d, 0x1f, 0x40, 0x9a, 0x69, 0xef, 0x87, + 0x33, 0xad, 0x98, 0xe5, 0x1a, 0xd5, 0x60, 0xd4, 0xf1, 0xf3, 0xd5, 0x7f, 0x2c, 0xc2, 0x74, 0x5a, + 0xed, 0xa8, 0x1b, 0x13, 0x6a, 0x08, 0x8d, 0xdf, 0x39, 0x84, 0x4e, 0x85, 0x22, 0x02, 0x3b, 0xeb, + 0x46, 0xf2, 0xce, 0x13, 0x30, 0xaa, 0x77, 0x3a, 0xd8, 0xf7, 0xdb, 0x5d, 0x7a, 0x61, 0xb3, 0x40, + 0x19, 0x4c, 0x83, 0xc1, 0xae, 0x52, 0xbf, 0xdc, 0xcb, 0x70, 0xa2, 0xdf, 0x3e, 0xea, 0x61, 0x6a, + 0x21, 0x6d, 0xbb, 0x8e, 0x65, 0x76, 0xf6, 0xf8, 0x4c, 0x7e, 0x34, 0x69, 0xf1, 0xd4, 0x58, 0xae, + 0x35, 0x9a, 0x09, 0xbd, 0x0d, 0x75, 0x56, 0xc8, 0xc3, 0x5b, 0xd9, 0x84, 0x5a, 0x7e, 0x45, 0x1b, + 0x6f, 0x61, 0x0f, 0xdb, 0x1d, 0xac, 0xd5, 0x68, 0x79, 0x0d, 0x6f, 0x21, 0x23, 0xed, 0xde, 0x1b, + 0xbf, 0x48, 0x5e, 0xe6, 0x66, 0x91, 0x14, 0xc5, 0x48, 0x1f, 0x6d, 0x98, 0x8a, 0xa4, 0xef, 0x6a, + 0x1b, 0x83, 0xb7, 0xce, 0xc3, 0x58, 0x8c, 0x70, 0xb9, 0xd4, 0x5b, 0x1f, 0xf4, 0x3b, 0x84, 0x1e, + 0x2e, 0xc7, 0x50, 0xbf, 0x56, 0x82, 0xa3, 0xa9, 0xd6, 0xe7, 0xa1, 0x97, 0xd3, 0x95, 0xd8, 0x72, + 0x7a, 0x7d, 0x08, 0xc3, 0xb7, 0xb4, 0x84, 0xb6, 0x13, 0x4b, 0xe8, 0xfa, 0x10, 0xe8, 0xf6, 0xa9, + 0x24, 0xbe, 0x98, 0xbe, 0x5a, 0x80, 0x87, 0x0f, 0xc8, 0xb7, 0x0f, 0xbd, 0x33, 0x4c, 0xfd, 0x3d, + 0x69, 0x31, 0x32, 0xc5, 0xed, 0xfb, 0x87, 0xdc, 0x87, 0xfd, 0x16, 0xe6, 0x3d, 0x4d, 0x3d, 0xf5, + 0x0f, 0x4b, 0xf0, 0xd0, 0xbe, 0xa3, 0x43, 0x24, 0xa3, 0x98, 0x8b, 0x46, 0x5b, 0x12, 0x0a, 0x26, + 0x65, 0xcf, 0x0b, 0xaa, 0x14, 0xce, 0x40, 0xa6, 0x0f, 0xe5, 0xf0, 0x3a, 0x6c, 0xac, 0x57, 0x87, + 0x9c, 0x3a, 0x33, 0x72, 0x90, 0x02, 0xd3, 0xc3, 0xf4, 0xc6, 0x83, 0x14, 0x7c, 0x87, 0xc8, 0x2b, + 0x7c, 0xb5, 0x4b, 0x9a, 0x6e, 0x60, 0x20, 0xd2, 0xde, 0xd6, 0xff, 0x2e, 0xc0, 0x74, 0x1a, 0x12, + 0xe4, 0x42, 0xc5, 0x32, 0xbb, 0x66, 0x20, 0x4c, 0x03, 0x9f, 0x3d, 0xcc, 0x26, 0xce, 0xac, 0x52, + 0xd4, 0xc2, 0xb4, 0x44, 0x13, 0x68, 0x17, 0x6a, 0x1e, 0x8b, 0xb5, 0x20, 0x6c, 0x09, 0x9f, 0x3b, + 0xd4, 0x3a, 0x79, 0x20, 0x07, 0x5e, 0x6b, 0x58, 0x17, 0xb5, 0x34, 0x45, 0xcd, 0xc9, 0xc5, 0xb4, + 0xce, 0xc3, 0x58, 0x0c, 0x6b, 0xae, 0x69, 0xf7, 0x6d, 0x05, 0x26, 0x12, 0x2c, 0x9b, 0xc8, 0x9c, + 0xb7, 0x4d, 0x5b, 0xa8, 0x0b, 0xe8, 0xef, 0x21, 0x62, 0xad, 0x70, 0x6b, 0x5a, 0x29, 0xb4, 0xa6, + 0x0d, 0x8e, 0x15, 0x95, 0x66, 0x99, 0xac, 0xa4, 0x5a, 0x26, 0xd5, 0x5f, 0xaf, 0x42, 0x95, 0x8b, + 0x2a, 0x87, 0x28, 0xe6, 0xbe, 0x19, 0x13, 0x73, 0x4f, 0x66, 0x92, 0x94, 0x64, 0xed, 0xd0, 0x62, + 0x42, 0xd6, 0x7d, 0x21, 0x23, 0x86, 0x38, 0x6f, 0xfc, 0x93, 0x22, 0x57, 0xdf, 0xa4, 0x9d, 0x41, + 0x96, 0x88, 0x68, 0xe9, 0x05, 0x19, 0x2d, 0x5d, 0x72, 0x1b, 0x67, 0xd6, 0x1c, 0x2f, 0xd0, 0x58, + 0xe9, 0x58, 0xe4, 0xb1, 0x62, 0x22, 0xf2, 0xd8, 0x23, 0x64, 0xd3, 0xa7, 0xd6, 0xc5, 0x50, 0xb0, + 0x8d, 0x00, 0xe8, 0x44, 0xa4, 0x53, 0x5a, 0x59, 0x13, 0x56, 0x16, 0x19, 0x84, 0x9e, 0x81, 0x71, + 0xcb, 0xd1, 0x8d, 0x4d, 0xdd, 0xd2, 0xed, 0x0e, 0x45, 0xc2, 0x06, 0x31, 0x01, 0x45, 0x4f, 0xc2, + 0x58, 0xa8, 0x9d, 0xa2, 0xd3, 0x87, 0x1d, 0x68, 0x47, 0x05, 0x90, 0xf2, 0xb2, 0xe7, 0x61, 0xd2, + 0xc7, 0x3e, 0x19, 0xf3, 0xb6, 0xbe, 0xb5, 0x65, 0xda, 0x84, 0xaf, 0xb3, 0xc3, 0xed, 0x04, 0x87, + 0xcf, 0x71, 0x30, 0xba, 0x00, 0x0f, 0x93, 0x1a, 0xda, 0xa2, 0x0a, 0x2e, 0x5c, 0xb4, 0x3d, 0xdd, + 0xde, 0xc6, 0x3e, 0x55, 0x13, 0xd4, 0xb5, 0x26, 0xc9, 0x32, 0xcf, 0x73, 0x70, 0x59, 0x82, 0x7e, + 0xa7, 0x5a, 0x33, 0x42, 0xa2, 0xd4, 0x33, 0x57, 0x0b, 0x6a, 0x34, 0xc0, 0x5c, 0xc7, 0xb1, 0xf8, + 0x84, 0x09, 0xd3, 0xec, 0xd0, 0xef, 0x05, 0x5c, 0x47, 0x4e, 0x7f, 0x93, 0xb9, 0xce, 0x82, 0x9c, + 0xb5, 0xe9, 0xa7, 0x92, 0x1c, 0xf7, 0x8c, 0x56, 0x22, 0xac, 0x7a, 0xf4, 0x33, 0xd3, 0x93, 0x53, + 0x0d, 0x13, 0xf9, 0xd8, 0xfa, 0x67, 0x91, 0x2a, 0xff, 0x0e, 0x1c, 0x93, 0xc9, 0xd6, 0x8e, 0x2e, + 0xcd, 0x32, 0x96, 0xf8, 0x56, 0x9e, 0x29, 0x36, 0xb3, 0x2a, 0x75, 0x5e, 0xb8, 0x26, 0x1f, 0x8d, + 0x0d, 0x8b, 0x40, 0xdf, 0x9a, 0x87, 0x23, 0x29, 0xb9, 0x49, 0xbb, 0xc9, 0x21, 0x47, 0xde, 0x80, + 0x6a, 0x04, 0x40, 0x07, 0x6b, 0x1c, 0x0a, 0x2b, 0x6b, 0x9c, 0x3e, 0x85, 0x95, 0x35, 0xf5, 0x7b, + 0xa4, 0x1f, 0xcc, 0xa5, 0x71, 0xd8, 0x45, 0x3a, 0x1f, 0x33, 0x12, 0xcd, 0x64, 0x71, 0xa4, 0x4c, + 0x5a, 0x88, 0xc2, 0x75, 0x54, 0x8c, 0xd6, 0xd1, 0xf0, 0x56, 0xa3, 0x9f, 0x2b, 0xc1, 0xd1, 0x54, + 0x07, 0xcb, 0x43, 0xe4, 0x43, 0xab, 0x31, 0x3e, 0x74, 0x66, 0x08, 0x6f, 0x4f, 0x99, 0x2b, 0x69, + 0x09, 0xae, 0x74, 0x6e, 0x28, 0x7c, 0x71, 0x1e, 0xf5, 0x75, 0xa1, 0x62, 0x7e, 0x1e, 0x26, 0x0d, + 0xec, 0x9b, 0x1e, 0x36, 0xda, 0xdc, 0xbb, 0xd4, 0xe7, 0xc6, 0x97, 0x09, 0x0e, 0xe7, 0xf8, 0xe2, + 0x3c, 0xa7, 0x90, 0xe0, 0x39, 0xcb, 0x30, 0xea, 0x3a, 0x46, 0x7b, 0x38, 0xf3, 0x4b, 0xc3, 0x75, + 0x8c, 0x0d, 0x5e, 0xb2, 0x65, 0x84, 0x4b, 0xe7, 0x79, 0x98, 0xec, 0xf4, 0x3c, 0x8f, 0x9c, 0x36, + 0x92, 0x4d, 0xe3, 0xf0, 0xb0, 0x69, 0xb3, 0x70, 0xc4, 0xd9, 0x24, 0x27, 0x5e, 0x6c, 0xb4, 0x25, + 0x17, 0x16, 0xa6, 0xa0, 0x41, 0xe2, 0xd3, 0xe5, 0xf0, 0x8b, 0xfa, 0x9f, 0x8b, 0x00, 0x91, 0x07, + 0xf1, 0x21, 0x0e, 0xfd, 0x5c, 0x6c, 0xe8, 0x5f, 0xcc, 0xea, 0xc3, 0x2c, 0x8f, 0xf7, 0xe5, 0xc4, + 0x78, 0xcf, 0x66, 0x47, 0xf2, 0xe9, 0x20, 0xcb, 0x83, 0xfc, 0xc7, 0x45, 0xc2, 0x24, 0x84, 0xc7, + 0xff, 0xe1, 0x8d, 0xf1, 0x5b, 0xb1, 0x31, 0x7e, 0x21, 0xe3, 0xfd, 0x03, 0x79, 0x88, 0x2f, 0x25, + 0x86, 0x78, 0x26, 0x33, 0x8e, 0xf8, 0x08, 0x5b, 0x7c, 0x80, 0xe5, 0x51, 0x53, 0x06, 0x8c, 0x5a, + 0x61, 0xe8, 0x51, 0xfb, 0x5b, 0xd1, 0xb6, 0x76, 0x06, 0x9a, 0x62, 0xd8, 0xec, 0x5e, 0x77, 0x93, + 0x6c, 0xd6, 0xcc, 0x9e, 0x84, 0x0d, 0x3e, 0x7c, 0xc7, 0xf8, 0xf7, 0x6b, 0xf4, 0xf3, 0xba, 0xf8, + 0x4a, 0x46, 0x91, 0x97, 0xe8, 0x9a, 0x7e, 0x54, 0x88, 0x99, 0x73, 0x11, 0xfb, 0x74, 0x55, 0xfa, + 0x42, 0xaa, 0x12, 0x93, 0xb7, 0xaf, 0x2a, 0xb6, 0x65, 0x1f, 0xe3, 0xdf, 0x13, 0x55, 0xa9, 0xff, + 0x09, 0x00, 0xa2, 0x4b, 0x1b, 0x3f, 0xae, 0x45, 0x1e, 0xb5, 0x40, 0x9e, 0x01, 0xef, 0x24, 0x66, + 0xc0, 0xd9, 0xcc, 0x48, 0xa2, 0x9f, 0x89, 0xc9, 0xf0, 0xf7, 0x2a, 0x0f, 0xe8, 0x72, 0x47, 0x27, + 0x61, 0xaa, 0x6b, 0xda, 0x6d, 0x0f, 0xeb, 0xc6, 0x5e, 0xcc, 0x9e, 0x5e, 0xd6, 0x26, 0xba, 0xa6, + 0xad, 0x11, 0x38, 0xb7, 0xa4, 0xa3, 0x57, 0xe0, 0x98, 0x87, 0x77, 0x4d, 0x2a, 0x31, 0xee, 0x98, + 0xe4, 0x6c, 0xbc, 0xd7, 0xa6, 0x87, 0x3b, 0x2e, 0x65, 0x4d, 0x8b, 0xaf, 0xcb, 0xec, 0x23, 0x3d, + 0x76, 0xa1, 0x63, 0x50, 0x71, 0xf5, 0x9e, 0x4f, 0xe3, 0x2e, 0x2a, 0xcf, 0xd5, 0x34, 0x9e, 0x42, + 0xef, 0x43, 0x83, 0x6c, 0x80, 0x9b, 0x7a, 0xe7, 0x76, 0x3b, 0x70, 0xf8, 0x2d, 0x9b, 0x37, 0x72, + 0x0d, 0xd8, 0x8c, 0xc6, 0x11, 0x30, 0x17, 0x16, 0x0d, 0x04, 0xc2, 0x0d, 0x07, 0x9d, 0x83, 0x87, + 0x5c, 0xcf, 0xa1, 0x92, 0x55, 0xbf, 0xc3, 0x40, 0x8d, 0xb6, 0xf7, 0xb8, 0xc8, 0x90, 0x70, 0x19, + 0x40, 0x9f, 0x87, 0x9a, 0x1f, 0x78, 0x7a, 0x80, 0xb7, 0xf7, 0xf8, 0xbd, 0x9b, 0xb7, 0xf2, 0xb5, + 0x4b, 0x9e, 0x08, 0x0c, 0x8f, 0x16, 0x62, 0x6c, 0x7d, 0x4d, 0x01, 0xd4, 0x9f, 0x21, 0xf5, 0x48, + 0x62, 0xc1, 0x38, 0xe9, 0x92, 0x69, 0x6f, 0xb7, 0x79, 0x44, 0xcc, 0x42, 0x16, 0xfd, 0x6b, 0x1a, + 0x99, 0x4c, 0x7b, 0x9b, 0x45, 0xab, 0x94, 0x42, 0x20, 0x8c, 0x79, 0xf2, 0x87, 0x56, 0x1b, 0x8e, + 0xef, 0x93, 0x13, 0x3d, 0x0b, 0x13, 0x5d, 0xfd, 0x6e, 0xbb, 0x67, 0xeb, 0xbb, 0xba, 0xc9, 0xcc, + 0xd5, 0xac, 0x9d, 0xe3, 0x5d, 0xfd, 0xee, 0x8d, 0x08, 0x4a, 0x84, 0x58, 0x92, 0xd1, 0xef, 0x79, + 0xa1, 0xe6, 0xae, 0xd6, 0xd5, 0xef, 0xae, 0x93, 0x74, 0xeb, 0x05, 0x18, 0x8f, 0x8f, 0x18, 0x99, + 0xe4, 0x62, 0xd2, 0x70, 0x23, 0x60, 0x98, 0x6e, 0xfd, 0xe3, 0x02, 0x4c, 0x26, 0x57, 0xd4, 0x7e, + 0x3b, 0x8d, 0xb2, 0xdf, 0x4e, 0xc3, 0x6a, 0xe0, 0x2b, 0x8d, 0x71, 0xb2, 0x30, 0x4d, 0x56, 0x23, + 0x23, 0xab, 0xb4, 0x1a, 0x19, 0xdf, 0x9a, 0xe0, 0xf0, 0x70, 0x35, 0xbe, 0x08, 0x28, 0xec, 0x64, + 0x94, 0x99, 0x2d, 0x94, 0xa9, 0xf0, 0x4b, 0x98, 0xfd, 0x65, 0x98, 0x96, 0x68, 0x15, 0x15, 0x60, + 0x0b, 0xe5, 0x88, 0xf4, 0x2d, 0x2c, 0x72, 0xe8, 0x3e, 0x3c, 0xbf, 0x58, 0x82, 0x86, 0x74, 0x21, + 0xec, 0x10, 0x99, 0xec, 0x7c, 0x8c, 0xc9, 0xce, 0x64, 0xbe, 0x93, 0x26, 0x73, 0xd9, 0xe5, 0x04, + 0x97, 0x7d, 0x29, 0x07, 0x96, 0x38, 0x73, 0xfd, 0x9d, 0x07, 0x55, 0x96, 0x42, 0x4f, 0x44, 0x66, + 0x22, 0x49, 0x3f, 0x27, 0xec, 0x3f, 0x54, 0x41, 0x77, 0x7f, 0xc4, 0xad, 0x9f, 0x2b, 0xc0, 0xa8, + 0x7c, 0xab, 0x6c, 0xe8, 0xb9, 0x70, 0x82, 0x7b, 0xb5, 0x90, 0x05, 0x8a, 0x05, 0xe9, 0x64, 0x10, + 0xfa, 0x1c, 0x80, 0xab, 0x7b, 0x7a, 0x17, 0x07, 0xd8, 0xf3, 0xb9, 0x9e, 0xf8, 0x5c, 0xf6, 0xfb, + 0x6e, 0x33, 0x6b, 0x61, 0x61, 0x76, 0xce, 0x94, 0xb0, 0xb5, 0x2e, 0xc0, 0x44, 0xe2, 0x73, 0xae, + 0xf3, 0xe5, 0xdf, 0x2e, 0x40, 0x99, 0x5e, 0x7f, 0x1d, 0xba, 0xfb, 0x91, 0xed, 0xa1, 0x10, 0xb3, + 0x56, 0x4a, 0xd6, 0x8a, 0x62, 0xdc, 0x5a, 0x31, 0x17, 0x46, 0xf4, 0x2d, 0x65, 0xb9, 0x9b, 0x45, + 0x9b, 0xc7, 0x75, 0x27, 0x22, 0xa4, 0xef, 0xb3, 0x30, 0xb1, 0x65, 0x7a, 0x7e, 0xd0, 0x77, 0x4f, + 0x60, 0x9c, 0x82, 0xa3, 0x4b, 0x02, 0x4f, 0xc3, 0xb8, 0xa5, 0xc7, 0xf2, 0xb1, 0x8b, 0x02, 0x63, + 0x04, 0x1a, 0x65, 0x9b, 0x86, 0x32, 0x75, 0x81, 0xa6, 0x5b, 0x6e, 0x59, 0x63, 0x89, 0x70, 0xfb, + 0xa9, 0x45, 0xdb, 0x8f, 0x7a, 0x11, 0x1a, 0x52, 0x83, 0xa8, 0xf6, 0xca, 0xe9, 0xba, 0x8e, 0x8d, + 0x6d, 0xe1, 0xca, 0x1a, 0x01, 0x08, 0x82, 0x1d, 0xc7, 0x0f, 0x84, 0x37, 0x2b, 0xf9, 0xad, 0xfe, + 0x81, 0x02, 0x55, 0x11, 0x71, 0x7d, 0x15, 0xea, 0x1d, 0xb7, 0xd7, 0xee, 0x51, 0x2a, 0x29, 0x59, + 0xd8, 0x1b, 0x2f, 0x49, 0x95, 0x0e, 0x6b, 0x8e, 0x69, 0x07, 0x5a, 0xad, 0xe3, 0xf6, 0x6e, 0x50, + 0xba, 0x6a, 0x30, 0xca, 0x1c, 0x43, 0x38, 0xc2, 0xc2, 0x70, 0x08, 0x1b, 0x0c, 0x09, 0xc5, 0xd9, + 0xba, 0xc8, 0x14, 0x17, 0xf4, 0x0b, 0xe9, 0x6c, 0x44, 0x47, 0xee, 0xe7, 0x19, 0xc8, 0x34, 0x8c, + 0x26, 0x59, 0x91, 0x4f, 0x32, 0xf5, 0x1f, 0x29, 0xf0, 0x78, 0x5f, 0x44, 0x14, 0xbc, 0x6d, 0xd2, + 0x5b, 0x7b, 0x59, 0xe2, 0x0c, 0x53, 0x2e, 0x51, 0x90, 0x94, 0x63, 0x8f, 0x01, 0x98, 0x06, 0xb6, + 0x03, 0x73, 0xcb, 0xc4, 0x42, 0x9d, 0x28, 0x41, 0xa8, 0x70, 0x65, 0xf5, 0xb6, 0x4d, 0xe1, 0xf7, + 0xc1, 0x53, 0xe8, 0x38, 0x54, 0xa9, 0x37, 0xc4, 0xf6, 0x26, 0x9f, 0x2b, 0x15, 0x92, 0xbc, 0xbc, + 0x49, 0x18, 0x1f, 0xb6, 0x0d, 0x97, 0x74, 0x51, 0xbc, 0x8b, 0x20, 0xd2, 0xea, 0x3b, 0xf0, 0x44, + 0xb2, 0xf5, 0x37, 0xec, 0x7b, 0x6a, 0xbf, 0xfa, 0x65, 0x05, 0x9e, 0x4a, 0x8f, 0xe1, 0x72, 0x4f, + 0x64, 0x91, 0xba, 0x57, 0x8c, 0x75, 0xef, 0xc0, 0x27, 0x15, 0xd4, 0x00, 0x9e, 0x49, 0x6d, 0xcc, + 0x3d, 0xf6, 0xf2, 0xe0, 0x5b, 0x21, 0xea, 0x0f, 0x8b, 0x61, 0xe4, 0x15, 0x76, 0xad, 0x6b, 0x58, + 0xee, 0x73, 0x3d, 0x66, 0x8f, 0x3c, 0x9f, 0xfd, 0xa6, 0x5b, 0x2c, 0x21, 0x79, 0x90, 0xfe, 0xa0, + 0x00, 0x93, 0xc9, 0x4f, 0x94, 0x3d, 0xec, 0xe0, 0xce, 0x6d, 0x61, 0x1f, 0xa4, 0x09, 0xc2, 0x5b, + 0xe8, 0x8f, 0xb6, 0x69, 0x07, 0xd8, 0xdb, 0xd5, 0x85, 0xae, 0x76, 0x8c, 0x42, 0x57, 0x38, 0x90, + 0x64, 0xa3, 0x97, 0xde, 0xa2, 0x6c, 0x8c, 0x1c, 0x63, 0x14, 0x1a, 0x66, 0x5b, 0x81, 0xba, 0x87, + 0x3b, 0xd8, 0xdc, 0x25, 0x7b, 0x44, 0x29, 0x4b, 0x54, 0x12, 0x16, 0x0d, 0x87, 0x97, 0xd1, 0xa2, + 0xd2, 0xe8, 0x16, 0x94, 0x76, 0x75, 0x4f, 0xb8, 0xf4, 0x2d, 0xdd, 0x03, 0x51, 0x66, 0x6e, 0xea, + 0x62, 0xd3, 0xa1, 0x28, 0x5b, 0xaf, 0x43, 0x3d, 0x04, 0xe5, 0xda, 0x68, 0xbe, 0x51, 0x86, 0x7a, + 0x78, 0x33, 0x70, 0xe8, 0xe1, 0x5e, 0x89, 0x0d, 0xf7, 0xab, 0x19, 0x2f, 0x22, 0x46, 0xbf, 0xa4, + 0x81, 0xfe, 0x85, 0x12, 0x8c, 0xc5, 0xe0, 0xa8, 0x1d, 0x53, 0x4b, 0x14, 0x07, 0xbb, 0x8b, 0xec, + 0x53, 0xc1, 0x4c, 0xfc, 0x46, 0x4e, 0x24, 0x45, 0xc5, 0xee, 0xd6, 0x14, 0x12, 0x77, 0x6b, 0xc2, + 0x39, 0x56, 0x3c, 0x78, 0x8e, 0x95, 0xb2, 0xcd, 0xb1, 0xf2, 0xc0, 0x39, 0x56, 0xb9, 0xa7, 0x39, + 0xb6, 0xce, 0xe7, 0x18, 0x73, 0xca, 0xbc, 0x38, 0x1c, 0xa1, 0x92, 0xb3, 0xeb, 0x3c, 0x8c, 0x0d, + 0x7f, 0x5b, 0x68, 0xe8, 0xa9, 0xf9, 0xd5, 0x12, 0xd4, 0xc4, 0x5d, 0xd3, 0xa1, 0x67, 0xe6, 0xe5, + 0xd8, 0xcc, 0x3c, 0x9d, 0xed, 0x66, 0x6b, 0xf8, 0x43, 0x9a, 0x97, 0x3f, 0x53, 0x84, 0x51, 0x19, + 0x7c, 0xa0, 0xb6, 0xec, 0x21, 0xa8, 0x11, 0xb9, 0x5c, 0x9a, 0x50, 0x55, 0xd7, 0x31, 0x7e, 0x12, + 0xe7, 0xd3, 0x3b, 0xb1, 0xf9, 0x74, 0x61, 0x08, 0xfa, 0x1d, 0x1e, 0xaf, 0x7a, 0x07, 0xc6, 0x62, + 0xed, 0x24, 0x59, 0x69, 0xdc, 0x10, 0xc1, 0xff, 0x7d, 0x71, 0x6f, 0x31, 0x70, 0xb8, 0xbb, 0x43, + 0x21, 0x70, 0xc8, 0x40, 0xd9, 0x4e, 0x4c, 0x2c, 0x09, 0xd3, 0xea, 0x5d, 0x28, 0xd1, 0x90, 0x0a, + 0xc3, 0x4e, 0xaf, 0x33, 0x50, 0xf6, 0x7a, 0x16, 0x16, 0x86, 0xd8, 0x41, 0x51, 0x21, 0x7a, 0x16, + 0xd6, 0x58, 0x01, 0xf5, 0xdf, 0x2a, 0xd0, 0x90, 0xc3, 0x23, 0x0c, 0xdb, 0x82, 0x39, 0xa8, 0xf9, + 0x3d, 0x6a, 0xbb, 0x17, 0x8d, 0x18, 0xe4, 0xdb, 0xc7, 0x72, 0x6b, 0x61, 0x31, 0xb4, 0x0c, 0x35, + 0x1a, 0xf7, 0xc1, 0xc3, 0x5b, 0xd9, 0x94, 0x91, 0x49, 0xf7, 0xae, 0x2a, 0x29, 0xae, 0xe1, 0x2d, + 0xf5, 0xcf, 0x40, 0x43, 0x8a, 0x07, 0xf1, 0x63, 0xa0, 0xea, 0xef, 0x29, 0x80, 0xfa, 0x23, 0x52, + 0xfc, 0xe9, 0x20, 0xee, 0xdf, 0x54, 0xa0, 0x44, 0xfa, 0x4a, 0x57, 0x08, 0xf6, 0x36, 0x43, 0xaf, + 0x62, 0x9a, 0x40, 0x8f, 0x02, 0xe8, 0xae, 0xd9, 0xde, 0xf6, 0x9c, 0x9e, 0x2b, 0xbc, 0x7d, 0xea, + 0xba, 0x6b, 0x5e, 0xa6, 0x00, 0x22, 0xf8, 0xc9, 0xbe, 0x3e, 0xf4, 0x6b, 0xe4, 0x9d, 0xf3, 0x34, + 0x8c, 0x87, 0x4e, 0x17, 0xcc, 0x63, 0xb9, 0x44, 0xb3, 0x8c, 0x09, 0x28, 0xbd, 0xbe, 0x83, 0x4e, + 0xc2, 0x94, 0xed, 0xd8, 0xed, 0x30, 0x6b, 0xcf, 0xb3, 0x84, 0xf1, 0x7f, 0xc2, 0x76, 0x6c, 0xa1, + 0xe4, 0xb9, 0xe1, 0x59, 0xbe, 0x6a, 0x41, 0x95, 0x53, 0x23, 0xd5, 0x97, 0xe4, 0x61, 0xa8, 0x87, + 0xcd, 0x15, 0x9b, 0xae, 0x68, 0x6d, 0xfe, 0x27, 0xc8, 0xd4, 0xdf, 0x04, 0xa8, 0xb0, 0xf8, 0x1c, + 0x43, 0x0f, 0xf6, 0x85, 0xd8, 0x56, 0xf1, 0x7c, 0x96, 0x58, 0x20, 0x33, 0xa9, 0x2e, 0xce, 0xc5, + 0x2c, 0x2e, 0xce, 0x02, 0x41, 0x5c, 0x41, 0xf4, 0x07, 0x95, 0x0c, 0xb6, 0x98, 0x0d, 0x68, 0x6c, + 0x99, 0x16, 0x96, 0x87, 0x3a, 0x43, 0x34, 0xa0, 0xb0, 0xbd, 0x33, 0x97, 0x4c, 0x0b, 0x53, 0x3a, + 0x6b, 0xb0, 0x25, 0x7e, 0xfa, 0x68, 0x11, 0xaa, 0x9b, 0x7a, 0xe7, 0x36, 0xb6, 0x8d, 0x8c, 0x9e, + 0x2f, 0x81, 0xee, 0xef, 0xcc, 0xb3, 0x12, 0x9a, 0x28, 0x4a, 0xdb, 0xcd, 0x4d, 0x27, 0x7c, 0x90, + 0xc2, 0x34, 0x7a, 0x06, 0x26, 0x7a, 0x3e, 0x6e, 0xeb, 0xbd, 0xc0, 0x69, 0xbb, 0x1e, 0xde, 0x32, + 0xef, 0x8a, 0xed, 0xab, 0xe7, 0xe3, 0xb9, 0x5e, 0xe0, 0xac, 0x51, 0x60, 0xff, 0x5d, 0xe0, 0xca, + 0xbd, 0xdd, 0x05, 0xde, 0x86, 0x29, 0x0f, 0x93, 0x73, 0x94, 0xe9, 0xd8, 0xd4, 0xa5, 0xd5, 0x0c, + 0x6f, 0xad, 0x9c, 0xcd, 0x4e, 0x35, 0x2d, 0x86, 0x62, 0x4f, 0xeb, 0xc7, 0x99, 0xa6, 0x98, 0x68, + 0x61, 0xa8, 0x87, 0xf4, 0xa6, 0x4e, 0x22, 0x7a, 0xb0, 0x23, 0x16, 0x02, 0xf9, 0x4d, 0x0b, 0xe9, + 0xdb, 0x62, 0xc5, 0xd2, 0xdf, 0xe8, 0x25, 0x38, 0x12, 0xc7, 0xbe, 0x77, 0x2d, 0x5a, 0x0e, 0x69, + 0x9f, 0x5a, 0xdf, 0x2a, 0xc0, 0x44, 0xa2, 0x85, 0xfb, 0xdd, 0x11, 0xbe, 0x8d, 0xb1, 0xdb, 0xb6, + 0x74, 0xae, 0xff, 0x28, 0x6b, 0x35, 0x02, 0x58, 0xd5, 0x7d, 0xea, 0xaf, 0x42, 0x3f, 0xee, 0x38, + 0x3d, 0xcf, 0xda, 0xe3, 0xfa, 0x65, 0x20, 0xa0, 0x65, 0x0a, 0x21, 0x3c, 0x86, 0x66, 0x30, 0x74, + 0xd3, 0xda, 0x13, 0x77, 0x3e, 0x09, 0x64, 0x91, 0x00, 0xc2, 0xf2, 0x77, 0x30, 0xbe, 0x6d, 0xed, + 0x71, 0x0d, 0x32, 0x2d, 0xf1, 0x2e, 0x85, 0xa0, 0x27, 0x60, 0x94, 0x66, 0xe8, 0x3a, 0x76, 0xb0, + 0x63, 0xed, 0xd1, 0x63, 0x7d, 0x59, 0xa3, 0x85, 0xae, 0x32, 0x50, 0x88, 0x63, 0x0f, 0xeb, 0xa4, + 0x0d, 0xd5, 0x08, 0xc7, 0x2d, 0x0a, 0x09, 0x7b, 0x40, 0x89, 0xc6, 0x6e, 0x07, 0xd1, 0x1e, 0x6c, + 0x10, 0xc2, 0x4d, 0x43, 0xd9, 0xf5, 0x7a, 0x36, 0xa6, 0xb6, 0x90, 0x9a, 0xc6, 0x12, 0xe4, 0x0c, + 0x6e, 0x78, 0x7b, 0x6d, 0xaf, 0x67, 0xd3, 0x4b, 0x1f, 0x35, 0xad, 0x62, 0x78, 0x7b, 0x5a, 0xcf, + 0x6e, 0xfd, 0x28, 0xb2, 0x45, 0x9e, 0x84, 0x29, 0xa6, 0xba, 0x22, 0x33, 0xb9, 0xe7, 0xca, 0x97, + 0x66, 0x99, 0x4e, 0x6b, 0x9e, 0xc2, 0xa9, 0x4f, 0xfd, 0x73, 0x30, 0x49, 0xb5, 0x57, 0x72, 0x56, + 0x7e, 0x77, 0x96, 0xc0, 0xa5, 0x9c, 0x17, 0xe0, 0x61, 0x9a, 0x93, 0xde, 0x8b, 0xf5, 0xfd, 0xad, + 0x9e, 0x15, 0x2b, 0xc4, 0x34, 0x02, 0x4d, 0x92, 0x65, 0x3d, 0xcc, 0x21, 0x15, 0x7f, 0x09, 0xa6, + 0xe5, 0x8a, 0x8c, 0x1e, 0x57, 0x9f, 0xf2, 0x38, 0x01, 0x51, 0x65, 0x8b, 0xfc, 0x0b, 0xa1, 0x30, + 0xcf, 0xcc, 0x14, 0x67, 0x4c, 0xa5, 0xd2, 0x60, 0xb0, 0x05, 0x02, 0x52, 0xff, 0x4b, 0x85, 0x86, + 0x5d, 0x0e, 0x17, 0x2f, 0x9a, 0x81, 0x23, 0xc2, 0xaf, 0x94, 0xc5, 0x0e, 0x90, 0xfd, 0x7a, 0xa6, + 0xf8, 0x27, 0xe6, 0x55, 0x43, 0x45, 0xd8, 0x55, 0x28, 0x5b, 0x4e, 0x87, 0x9f, 0xab, 0x07, 0x3e, + 0x1c, 0x22, 0x57, 0x35, 0xb3, 0x4a, 0xca, 0x91, 0xe5, 0xb4, 0x3c, 0xa2, 0x31, 0x24, 0x68, 0x01, + 0x0a, 0xfe, 0x69, 0xce, 0x72, 0x5e, 0xce, 0x81, 0x6a, 0xfd, 0x34, 0xc7, 0x53, 0xf0, 0x4f, 0xa3, + 0x4b, 0x50, 0xdc, 0xee, 0x08, 0xfd, 0xfc, 0xa9, 0x1c, 0x58, 0x2e, 0x2f, 0xac, 0x73, 0x34, 0x04, + 0x01, 0xe9, 0x9a, 0xfe, 0x51, 0xcf, 0x13, 0xbe, 0xe8, 0x79, 0xba, 0x36, 0x47, 0xca, 0x89, 0xae, + 0x51, 0x24, 0x04, 0x9b, 0x7f, 0xc7, 0xdc, 0x0a, 0xb2, 0x3d, 0xa7, 0x14, 0xef, 0x1d, 0x29, 0x27, + 0xb0, 0x51, 0x24, 0xad, 0x5f, 0x52, 0xa0, 0x1e, 0xd2, 0xaf, 0x2f, 0xaa, 0x80, 0x32, 0x4c, 0x54, + 0x01, 0x7a, 0xd3, 0x4c, 0xc4, 0x00, 0x10, 0x1e, 0x9d, 0x21, 0x80, 0x5e, 0x5a, 0xeb, 0x6d, 0xae, + 0x45, 0x01, 0x03, 0x44, 0xb2, 0xb5, 0x01, 0x15, 0x46, 0xff, 0x98, 0x96, 0x4e, 0x89, 0x6b, 0xe9, + 0xe8, 0x4d, 0xb4, 0x5e, 0xe7, 0x36, 0x16, 0x9a, 0x56, 0x9e, 0xa2, 0xaa, 0x40, 0xc6, 0xff, 0xb9, + 0x5f, 0x3c, 0x4b, 0xb5, 0xce, 0x42, 0x95, 0x8f, 0x87, 0x54, 0x54, 0xd9, 0xa7, 0x68, 0x21, 0x56, + 0x74, 0x0e, 0xea, 0xe1, 0x00, 0x30, 0xed, 0x2f, 0xbf, 0x88, 0x15, 0x69, 0x7f, 0x45, 0xc0, 0x8a, + 0x03, 0x50, 0x84, 0x54, 0x1f, 0x0e, 0xc5, 0x7c, 0x3d, 0xbc, 0xe5, 0xa7, 0x7e, 0xab, 0x04, 0x55, + 0x1e, 0x72, 0x6c, 0x68, 0x89, 0xe4, 0xcd, 0x98, 0x44, 0x72, 0x32, 0x53, 0x7c, 0xb3, 0x74, 0x4f, + 0xd4, 0x4c, 0x4e, 0x26, 0x21, 0x86, 0xb8, 0x4c, 0xf2, 0xdf, 0x15, 0x49, 0x26, 0x11, 0x7b, 0xbb, + 0x92, 0xd8, 0xdb, 0xcf, 0xc1, 0x43, 0xf4, 0xce, 0x11, 0x0d, 0xae, 0x91, 0xb4, 0x61, 0x33, 0xde, + 0x78, 0x5c, 0x64, 0x48, 0xda, 0xb0, 0x5f, 0x04, 0xd4, 0x71, 0x6c, 0x66, 0x39, 0xea, 0xec, 0xc5, + 0xaf, 0xa6, 0x4c, 0x49, 0x5f, 0xf8, 0xb6, 0x46, 0x67, 0xa5, 0xef, 0x12, 0x41, 0xa5, 0x44, 0xb9, + 0xb9, 0x48, 0xc6, 0xae, 0xee, 0x97, 0xf3, 0x44, 0x5f, 0x08, 0x8b, 0xb5, 0x3e, 0x0e, 0x37, 0x84, + 0xa5, 0x30, 0xec, 0x41, 0xa6, 0xa0, 0xc1, 0x49, 0xb1, 0x5d, 0x44, 0x49, 0x78, 0x01, 0x10, 0xdb, + 0x01, 0x38, 0xa5, 0xe4, 0xdd, 0x82, 0xee, 0x22, 0xc2, 0xd3, 0x84, 0x30, 0x7c, 0xf5, 0xaf, 0x15, + 0xa0, 0x26, 0x82, 0xc4, 0xdd, 0x9f, 0x69, 0x23, 0x6a, 0x93, 0xa6, 0xcd, 0x52, 0x62, 0xda, 0xbc, + 0x98, 0x0d, 0x43, 0x72, 0xde, 0xbc, 0x17, 0x92, 0xf2, 0x49, 0x18, 0x8b, 0x45, 0x90, 0xe2, 0xfb, + 0xea, 0xa8, 0x1c, 0x3c, 0x6a, 0x9f, 0x1b, 0xdc, 0xfb, 0x5d, 0xa1, 0xf9, 0x12, 0xc0, 0xa8, 0xdc, + 0x74, 0x32, 0x2b, 0xe2, 0xd7, 0x5a, 0x45, 0xf2, 0x40, 0xb3, 0xfa, 0x3b, 0xd1, 0xb5, 0xdc, 0xe2, + 0xbd, 0x5d, 0x9d, 0x11, 0x78, 0xd0, 0x75, 0x98, 0x10, 0x11, 0xf7, 0xf8, 0x76, 0xca, 0xb7, 0xa5, + 0x67, 0xd2, 0x78, 0x33, 0xdb, 0x56, 0x63, 0x1c, 0x7a, 0x5c, 0x14, 0xe7, 0x4e, 0xb3, 0x7a, 0x32, + 0x14, 0x51, 0x39, 0xcb, 0x55, 0x67, 0x99, 0x38, 0x03, 0xe3, 0x11, 0x9d, 0x83, 0x92, 0x69, 0x9b, + 0x62, 0x9f, 0x7a, 0x66, 0x50, 0x20, 0x3e, 0x93, 0x2b, 0xc6, 0x48, 0x19, 0x74, 0x0b, 0x26, 0xb8, + 0xc4, 0x11, 0x32, 0x87, 0x6a, 0x16, 0x33, 0x39, 0x13, 0x5c, 0xc4, 0xec, 0xa7, 0x08, 0xc7, 0x37, + 0x63, 0x30, 0x74, 0x02, 0x46, 0x0d, 0xa7, 0x6d, 0x3b, 0x41, 0x9b, 0x3a, 0xe2, 0x50, 0xb9, 0xba, + 0xa6, 0x81, 0xe1, 0x5c, 0x73, 0x82, 0x35, 0x02, 0x41, 0x27, 0xa0, 0xe1, 0x07, 0xba, 0x6d, 0x6c, + 0xee, 0x5d, 0x75, 0x0c, 0xcc, 0x6f, 0xfe, 0xca, 0x20, 0xf4, 0x14, 0x8c, 0xf9, 0x81, 0x87, 0xf5, + 0xae, 0x69, 0x6f, 0xd3, 0x3c, 0xec, 0xda, 0x6f, 0x1c, 0x88, 0xde, 0x83, 0x1a, 0xbd, 0x07, 0xbc, + 0x8b, 0x3d, 0x1e, 0x38, 0xf6, 0x62, 0x0e, 0xf2, 0x8a, 0xc4, 0x1c, 0x47, 0xc1, 0x78, 0x8a, 0x40, + 0x88, 0x96, 0x69, 0x84, 0x3a, 0x93, 0x0c, 0xdd, 0x68, 0xd6, 0x37, 0xac, 0xbb, 0x8e, 0x3d, 0xb7, + 0x8d, 0x6d, 0x46, 0x68, 0x51, 0x1c, 0xad, 0xc9, 0x87, 0xf8, 0xb1, 0x2c, 0xc2, 0xce, 0xa0, 0x6b, + 0x39, 0xf3, 0x50, 0x0b, 0x3d, 0xea, 0xc7, 0xb3, 0x8c, 0xbe, 0x70, 0xb4, 0xd7, 0xc2, 0x72, 0x94, + 0xc4, 0x7c, 0xc8, 0x3c, 0x7a, 0x4e, 0x99, 0xe0, 0x24, 0x96, 0x81, 0xe8, 0x6d, 0x68, 0x04, 0x8e, + 0xc5, 0xcd, 0xfc, 0x7e, 0x73, 0x32, 0x4b, 0xac, 0xeb, 0x8d, 0xb0, 0x80, 0x26, 0x17, 0x46, 0x5f, + 0x80, 0xbe, 0xb0, 0x56, 0xcd, 0x29, 0x8a, 0x70, 0x00, 0x39, 0xa8, 0xfc, 0x94, 0x64, 0xd5, 0x9f, + 0x40, 0x88, 0xac, 0x0e, 0x4c, 0xa7, 0x4d, 0x0a, 0x74, 0x25, 0xe2, 0x37, 0x4a, 0x26, 0x89, 0x97, + 0x47, 0xcb, 0xe4, 0x7e, 0x07, 0x31, 0x4e, 0xa3, 0x7e, 0xbb, 0x00, 0x63, 0xb1, 0x30, 0xa0, 0x43, + 0xef, 0x18, 0x0b, 0xb1, 0x1d, 0x63, 0x36, 0x47, 0xe4, 0x51, 0x69, 0xdb, 0x78, 0x3b, 0xb1, 0x6d, + 0x9c, 0xca, 0x81, 0xe6, 0xbe, 0xee, 0x1d, 0x3f, 0x18, 0x85, 0xa9, 0xbe, 0x4e, 0x3c, 0x38, 0x1b, + 0xc8, 0x56, 0x92, 0xdf, 0x33, 0xab, 0xe3, 0x5c, 0xce, 0x51, 0xc9, 0xcc, 0xf4, 0xcb, 0x87, 0xc3, + 0xf4, 0x2b, 0x9f, 0x10, 0xd3, 0xaf, 0xf6, 0x31, 0xfd, 0x1d, 0xa8, 0x05, 0x8e, 0xeb, 0x58, 0xce, + 0xf6, 0x1e, 0x8f, 0x56, 0xbe, 0x9a, 0x97, 0x36, 0x31, 0x08, 0x57, 0x18, 0x6f, 0x70, 0x9c, 0x5a, + 0x88, 0x9d, 0x9c, 0x02, 0xb0, 0xad, 0x6f, 0x5a, 0x78, 0x7d, 0x7d, 0x95, 0xab, 0x14, 0x22, 0x00, + 0xda, 0x80, 0x29, 0x29, 0x22, 0x31, 0xe3, 0x1d, 0x3c, 0x6a, 0x79, 0xd6, 0xbd, 0xbe, 0x1f, 0x01, + 0xba, 0x06, 0x09, 0x01, 0x80, 0x6f, 0x48, 0xc3, 0x8a, 0x0f, 0x9f, 0xee, 0x3e, 0xff, 0xdf, 0xed, + 0x3e, 0xbf, 0x55, 0x80, 0x47, 0x0e, 0x9a, 0xe1, 0xe8, 0x16, 0x54, 0x78, 0xf4, 0x2a, 0xb6, 0x53, + 0xcc, 0xdd, 0xd3, 0xfa, 0xa1, 0x4f, 0x7a, 0x71, 0x84, 0xe8, 0x86, 0x14, 0x29, 0xf0, 0x50, 0x10, + 0xb3, 0xdb, 0x5b, 0xb7, 0xa0, 0xd2, 0xb1, 0x4c, 0x6c, 0x07, 0x9c, 0xcd, 0x1e, 0x46, 0x8b, 0x19, + 0xc2, 0xd6, 0xe5, 0xc4, 0x6e, 0x40, 0xe3, 0x8a, 0xc9, 0x3c, 0x5f, 0x49, 0xf0, 0xfc, 0x7d, 0x4e, + 0xff, 0xea, 0x1f, 0x17, 0x61, 0x22, 0x11, 0x3e, 0xfb, 0x1e, 0x82, 0xb8, 0xc9, 0x3b, 0xf2, 0xa9, + 0x5c, 0x31, 0xbb, 0x65, 0x15, 0xc0, 0x6a, 0x62, 0x53, 0x7e, 0x25, 0x27, 0xa6, 0xf8, 0xb6, 0x7c, + 0x87, 0x6b, 0x02, 0x1e, 0x82, 0xda, 0x1d, 0xd3, 0xc5, 0x6d, 0xa7, 0xc7, 0xf4, 0x33, 0x35, 0xad, + 0x4a, 0xd2, 0xd7, 0x7b, 0x01, 0xdb, 0x74, 0xfd, 0x1e, 0x3f, 0xe3, 0xd6, 0x34, 0x9e, 0x42, 0x6f, + 0x40, 0xc5, 0xf1, 0xcc, 0x6d, 0xd3, 0xe6, 0x0d, 0x19, 0x10, 0x5e, 0xf3, 0x3a, 0xcd, 0xab, 0xf1, + 0x32, 0xad, 0x5f, 0x53, 0xf2, 0x09, 0x04, 0x4f, 0xc0, 0x28, 0xd9, 0x3d, 0x4c, 0x7b, 0x5b, 0x3e, + 0x6f, 0x37, 0x38, 0x8c, 0x66, 0x51, 0x61, 0x4c, 0xf4, 0x41, 0x56, 0xc6, 0x36, 0x78, 0x47, 0xe2, + 0x72, 0x45, 0x29, 0x5d, 0xae, 0x28, 0xc7, 0xe4, 0x8a, 0x6f, 0x16, 0xa0, 0x4c, 0x23, 0x5b, 0xdf, + 0x9f, 0xa8, 0x74, 0xb4, 0x2a, 0x69, 0xa8, 0xe7, 0x13, 0x43, 0x7d, 0x32, 0x43, 0xf1, 0xfb, 0x2a, + 0x77, 0xfd, 0xcf, 0x2a, 0xd4, 0xc3, 0x46, 0x3f, 0x38, 0xf2, 0xd6, 0x17, 0xd2, 0xe5, 0xad, 0xb3, + 0x19, 0xa9, 0xff, 0xa7, 0x57, 0xce, 0xea, 0x97, 0x44, 0x6a, 0x87, 0x25, 0x89, 0xd4, 0x0f, 0x51, + 0x12, 0x81, 0xc3, 0x96, 0x44, 0x1a, 0x87, 0x25, 0x89, 0x8c, 0x66, 0x90, 0x44, 0xc6, 0x0e, 0x5b, + 0x12, 0x19, 0x7f, 0x80, 0x24, 0x11, 0xca, 0x12, 0x69, 0xbc, 0xfe, 0xfb, 0xc3, 0x12, 0x69, 0x55, + 0xc3, 0xb3, 0x44, 0x5a, 0xfc, 0xbe, 0xb2, 0xc4, 0x5f, 0xaa, 0x40, 0x3d, 0x6c, 0xf4, 0x4f, 0x3a, + 0x4b, 0x0c, 0x3b, 0x32, 0x90, 0x25, 0x26, 0x79, 0x4f, 0xb9, 0x8f, 0xf7, 0x48, 0xbc, 0xa2, 0x72, + 0x88, 0xbc, 0xa2, 0x7a, 0xd8, 0xbc, 0xa2, 0x76, 0x58, 0xbc, 0xa2, 0x9e, 0x81, 0x57, 0xc0, 0x61, + 0xf3, 0x8a, 0xc6, 0x83, 0xc4, 0x2b, 0x7e, 0xbd, 0x00, 0x55, 0xfe, 0x38, 0xc7, 0xfd, 0xf1, 0xe1, + 0xe1, 0x95, 0x0d, 0x6f, 0x30, 0xe3, 0x08, 0xee, 0x2b, 0xc7, 0xf8, 0xc3, 0x2a, 0x34, 0xa4, 0x86, + 0x3f, 0x38, 0x3c, 0xe3, 0x83, 0x74, 0x9e, 0x71, 0x3e, 0xf3, 0x18, 0x7c, 0x2a, 0x48, 0x7d, 0x2a, + 0x48, 0x7d, 0x2a, 0x48, 0xed, 0xc3, 0x1c, 0xff, 0x46, 0x01, 0xea, 0xe1, 0xa3, 0x43, 0x43, 0xb3, + 0xc7, 0x8b, 0x31, 0xf6, 0xf8, 0x99, 0x8c, 0x6f, 0x1c, 0xa5, 0x86, 0x9c, 0xc8, 0x74, 0xa1, 0x36, + 0x44, 0x71, 0x5f, 0x59, 0xe4, 0x77, 0xca, 0x30, 0x16, 0x6b, 0xfc, 0x90, 0x4c, 0x72, 0x33, 0xfd, + 0x0d, 0x98, 0x0b, 0x39, 0xc8, 0x96, 0x5b, 0x12, 0x2a, 0x1d, 0x24, 0x09, 0x95, 0x0f, 0x71, 0xb1, + 0x57, 0x0e, 0x7b, 0xb1, 0x57, 0x0f, 0x6b, 0xb1, 0xd7, 0x32, 0x2c, 0xf6, 0xfa, 0x61, 0x2f, 0x76, + 0x78, 0x90, 0x16, 0xfb, 0x7f, 0xa8, 0x42, 0x4d, 0xbc, 0x0c, 0x76, 0x7f, 0xd6, 0xba, 0xa8, 0x6d, + 0x66, 0x78, 0x37, 0x90, 0x08, 0x45, 0x7c, 0xa9, 0xff, 0xcb, 0x12, 0x57, 0x1a, 0x4a, 0x0e, 0xc6, + 0xca, 0xf0, 0x0e, 0xc6, 0x84, 0x15, 0xe8, 0xc1, 0x8e, 0xf0, 0x97, 0x65, 0x09, 0xf4, 0x1e, 0xd4, + 0xee, 0x38, 0xde, 0x6d, 0xcb, 0xd1, 0x85, 0xf7, 0xf2, 0xc5, 0x1c, 0x1d, 0x66, 0x03, 0xbb, 0xb1, + 0xe7, 0x62, 0x43, 0x8a, 0x59, 0x2b, 0x10, 0xa2, 0xc7, 0x00, 0x5c, 0xc7, 0xb8, 0xee, 0x19, 0xa6, + 0x1d, 0x5e, 0xcc, 0x91, 0x20, 0xec, 0x82, 0x09, 0xbb, 0x2e, 0xd6, 0xf7, 0x34, 0x93, 0x0e, 0x93, + 0xfc, 0x5d, 0x37, 0x11, 0xcd, 0x5b, 0xb8, 0x33, 0xbf, 0x9a, 0xbb, 0x81, 0x74, 0x6c, 0xfa, 0xd0, + 0xb5, 0xde, 0x87, 0x23, 0x29, 0xed, 0x4f, 0x75, 0xba, 0xdf, 0xe7, 0xde, 0x6e, 0x14, 0x7d, 0x51, + 0xdc, 0xdb, 0x8d, 0x20, 0x0f, 0x94, 0xdb, 0xe1, 0x3f, 0x57, 0x0e, 0x7e, 0x17, 0x04, 0xad, 0xb1, + 0x1b, 0x41, 0xc2, 0x29, 0xfe, 0x5c, 0xae, 0x29, 0x4b, 0xdd, 0xbd, 0x1d, 0x8f, 0x46, 0xfb, 0xf5, + 0xd9, 0x6d, 0x22, 0xbf, 0xb5, 0x01, 0xa3, 0x32, 0x38, 0xd5, 0x85, 0x3b, 0x7d, 0x7b, 0x6a, 0x41, + 0x2d, 0x74, 0xd8, 0xe5, 0xf7, 0x8e, 0x44, 0x5a, 0xfd, 0x76, 0x09, 0x2a, 0x4c, 0xc5, 0x7d, 0x7f, + 0x8e, 0x3a, 0xac, 0x2e, 0x69, 0x75, 0xb7, 0xbe, 0x25, 0xe2, 0x4b, 0xde, 0x48, 0x3e, 0x3f, 0xaa, + 0x0c, 0xe7, 0x04, 0x90, 0x78, 0x80, 0xf4, 0x92, 0xf4, 0x36, 0x6a, 0x7e, 0x47, 0xb4, 0xe8, 0x75, + 0xd4, 0x0b, 0xe2, 0x61, 0xc9, 0x62, 0x3e, 0x9d, 0x38, 0x7f, 0x5a, 0x72, 0x21, 0x7a, 0x1d, 0xb2, + 0x94, 0xf7, 0x4c, 0x18, 0xbe, 0x0f, 0x79, 0x41, 0xbc, 0x4f, 0x59, 0xce, 0xa7, 0x84, 0xe2, 0x2f, + 0x54, 0xae, 0xc8, 0xcf, 0x4b, 0x56, 0xf2, 0x8b, 0x5e, 0x51, 0x69, 0xf5, 0xb7, 0x4b, 0x50, 0x13, + 0x3e, 0x21, 0xf7, 0x67, 0x67, 0x10, 0xb5, 0xdd, 0xc3, 0xce, 0x10, 0xa1, 0x88, 0xef, 0x0c, 0xbf, + 0x2f, 0x1c, 0x4b, 0x9f, 0x84, 0xb1, 0xd0, 0x65, 0x4e, 0x72, 0x3d, 0x1f, 0x15, 0x40, 0xca, 0x49, + 0x31, 0x1c, 0x15, 0x6f, 0xc7, 0xb6, 0x43, 0x77, 0xf5, 0xa8, 0x1b, 0x43, 0x38, 0xd2, 0x1c, 0xf1, + 0xfb, 0x81, 0x71, 0x21, 0xa9, 0x78, 0x08, 0x42, 0x52, 0xeb, 0xa7, 0x0f, 0xfd, 0x45, 0xae, 0x90, + 0xdf, 0x14, 0xd3, 0xc5, 0xe1, 0x52, 0x4c, 0x1c, 0xfe, 0x1d, 0x05, 0x6a, 0xe2, 0x34, 0x8c, 0xd6, + 0x89, 0xb4, 0xe5, 0x99, 0x6e, 0x20, 0x82, 0xae, 0x2b, 0x99, 0x02, 0xe3, 0xd0, 0x22, 0x8c, 0x79, + 0x53, 0xd2, 0x8d, 0xfa, 0x12, 0x84, 0x1c, 0xae, 0xa3, 0xa1, 0x91, 0x1f, 0xb9, 0x7b, 0x29, 0xe3, + 0xa0, 0x44, 0x88, 0xc7, 0xfd, 0x18, 0x4c, 0xfd, 0x08, 0x26, 0x93, 0x95, 0xa3, 0xc7, 0xa1, 0xc1, + 0xfb, 0x20, 0x71, 0x62, 0x60, 0x20, 0xba, 0x81, 0x2c, 0x85, 0x17, 0x88, 0xfc, 0x7b, 0x79, 0x72, + 0xef, 0x12, 0xa0, 0xfe, 0x16, 0xc6, 0xef, 0xa1, 0x29, 0xfb, 0x05, 0x41, 0x96, 0x23, 0x4b, 0xfc, + 0x86, 0x02, 0xa8, 0x5f, 0x8f, 0x40, 0x87, 0xdb, 0x73, 0xec, 0x36, 0xbe, 0xeb, 0x7a, 0x2c, 0x88, + 0xad, 0x08, 0x54, 0x45, 0xc0, 0x4b, 0x21, 0xf4, 0x3e, 0xcd, 0x7c, 0xf5, 0x2b, 0x55, 0x38, 0x92, + 0x92, 0x39, 0xf7, 0xf5, 0x90, 0xf5, 0xf8, 0xf5, 0x90, 0xf3, 0xb9, 0x9b, 0x97, 0x76, 0x4b, 0xe4, + 0x6d, 0xe9, 0x96, 0xc8, 0x99, 0xfc, 0x18, 0x63, 0x97, 0x45, 0xae, 0xca, 0x97, 0x45, 0xce, 0xe6, + 0x47, 0x96, 0xb8, 0x33, 0xb2, 0x1e, 0xbf, 0x33, 0x32, 0x44, 0x7f, 0x53, 0xae, 0x8e, 0xac, 0xc7, + 0xaf, 0x8e, 0x0c, 0x81, 0xf4, 0xd3, 0x1b, 0x24, 0x3f, 0xe1, 0x37, 0x48, 0x7e, 0x7e, 0x02, 0x1a, + 0xd2, 0x03, 0xf8, 0xf7, 0x12, 0x3c, 0x59, 0xe2, 0x16, 0x33, 0x99, 0x5f, 0xdc, 0x4f, 0x0f, 0x81, + 0x56, 0xcc, 0xc2, 0xd8, 0x63, 0x58, 0xe2, 0x9b, 0xfe, 0xaf, 0x55, 0xf9, 0xa6, 0xdf, 0x84, 0xaa, + 0xe1, 0x74, 0x75, 0xd3, 0x16, 0xf7, 0x98, 0x45, 0x12, 0xbd, 0x0c, 0x47, 0xe7, 0x16, 0xae, 0x2e, + 0xb5, 0x7b, 0x3e, 0xf6, 0x62, 0x2c, 0x87, 0x91, 0x0a, 0x91, 0x8f, 0x37, 0x7c, 0xec, 0x49, 0x3c, + 0xc7, 0x01, 0xd4, 0xd9, 0xd1, 0x2d, 0x0b, 0xdb, 0xdb, 0xf4, 0xe5, 0x28, 0xfa, 0x72, 0x1d, 0x6f, + 0xeb, 0x5b, 0xf9, 0x7a, 0x3c, 0xb3, 0x20, 0x10, 0xad, 0x71, 0x3c, 0xda, 0x54, 0x27, 0x09, 0x42, + 0xef, 0xc5, 0xdf, 0xf3, 0x1a, 0xe8, 0x90, 0xd4, 0x5f, 0x8b, 0xe4, 0xf8, 0xc7, 0x10, 0x45, 0x4f, + 0x82, 0x7d, 0x57, 0x81, 0xa9, 0xbe, 0x56, 0xa0, 0xcf, 0x42, 0x69, 0x27, 0x08, 0x5c, 0x3e, 0xfe, + 0x8b, 0x39, 0xeb, 0x5b, 0xde, 0xd8, 0x58, 0xeb, 0xef, 0x19, 0xc5, 0x88, 0x6e, 0x40, 0xd1, 0xb0, + 0xfd, 0x6c, 0x6f, 0xf1, 0xf4, 0x21, 0x5e, 0xbc, 0xb6, 0xde, 0x8f, 0x97, 0xe0, 0x6b, 0x7d, 0x00, + 0x47, 0x53, 0x6b, 0x45, 0x97, 0xa3, 0xa7, 0xff, 0x95, 0xa1, 0xae, 0xc4, 0xf3, 0xd2, 0xad, 0x1d, + 0x98, 0x4e, 0xab, 0x9e, 0x07, 0x6a, 0x67, 0x93, 0x40, 0x09, 0x03, 0xb5, 0xb3, 0x6f, 0xaf, 0xc0, + 0xb1, 0x8e, 0x87, 0x69, 0x5c, 0x2a, 0xdd, 0x4a, 0x99, 0x5e, 0xd3, 0xd1, 0xd7, 0x68, 0x82, 0xb5, + 0x7e, 0x5b, 0x01, 0xd4, 0x3f, 0x64, 0xd4, 0xe7, 0x99, 0x69, 0xf4, 0x95, 0x2c, 0xa2, 0x62, 0xaa, + 0x02, 0x89, 0x63, 0x40, 0xd7, 0xa1, 0xbc, 0xab, 0xf7, 0xac, 0x80, 0x8f, 0xc3, 0xd9, 0x9c, 0xe3, + 0x70, 0x93, 0x94, 0x25, 0xed, 0xc2, 0x1a, 0xc3, 0xd3, 0x3a, 0x03, 0x10, 0x01, 0x53, 0x6f, 0x03, + 0xef, 0xc7, 0xc8, 0xbe, 0x5c, 0xc9, 0xa7, 0x9f, 0xc5, 0xb1, 0x80, 0x90, 0x85, 0x4c, 0xf1, 0x8d, + 0xfa, 0x58, 0x84, 0x0c, 0x4a, 0x7f, 0xea, 0xea, 0x8b, 0x70, 0x9c, 0xde, 0xa5, 0x32, 0x7d, 0xbf, + 0x87, 0x8d, 0xb6, 0xe4, 0x3b, 0xcb, 0x97, 0xfa, 0xc2, 0xbd, 0xd4, 0xb9, 0x88, 0x03, 0xdd, 0xb4, + 0x7c, 0xed, 0x28, 0xa9, 0x63, 0x85, 0x56, 0x21, 0x7d, 0x6d, 0xfd, 0x05, 0x05, 0x8e, 0x11, 0xce, + 0xd3, 0x5f, 0x82, 0x90, 0x91, 0xf1, 0x2e, 0xb1, 0xd5, 0xb0, 0x14, 0x0d, 0xcd, 0x85, 0xbd, 0xe0, + 0x86, 0xb6, 0x2a, 0xa2, 0xc0, 0xf0, 0x24, 0x8d, 0xf7, 0x82, 0x3d, 0x22, 0xce, 0xe9, 0x9b, 0x16, + 0x26, 0x19, 0x78, 0xf0, 0x29, 0x02, 0x5d, 0x17, 0x40, 0xfa, 0x58, 0x06, 0x7f, 0x1f, 0x5c, 0xbc, + 0xbd, 0x54, 0xd7, 0x80, 0x83, 0x34, 0xbc, 0xd5, 0xfa, 0x79, 0x05, 0xa6, 0xd3, 0xc8, 0x96, 0x1a, + 0xa2, 0x35, 0x7f, 0x48, 0x40, 0x71, 0xd1, 0x99, 0x85, 0x18, 0x65, 0xe3, 0x5f, 0x8a, 0x2e, 0x3a, + 0xb3, 0xd8, 0xab, 0x64, 0x06, 0xb4, 0x7e, 0x2f, 0xbe, 0x3e, 0x04, 0x65, 0x9e, 0x84, 0x31, 0x1f, + 0x7b, 0x64, 0xa1, 0xb1, 0xa8, 0xcb, 0xe2, 0x64, 0xc7, 0x80, 0x2c, 0xd4, 0x32, 0x39, 0x16, 0xd9, + 0x4e, 0xd0, 0xde, 0xc4, 0x5b, 0x8e, 0x27, 0x8e, 0x3c, 0x75, 0xdb, 0x09, 0xe6, 0x29, 0x80, 0x85, + 0x67, 0x0a, 0xda, 0xfa, 0x96, 0x78, 0x6d, 0xb5, 0x48, 0x03, 0xb8, 0xcc, 0x91, 0x34, 0x7a, 0x08, + 0x6a, 0x94, 0x90, 0x3d, 0x4f, 0x68, 0xe6, 0x18, 0x8d, 0x3d, 0x0b, 0x3d, 0x03, 0x13, 0x12, 0x8d, + 0x69, 0x8e, 0x72, 0x1f, 0x91, 0x3d, 0x2b, 0x49, 0xe4, 0x4a, 0x92, 0xc8, 0xea, 0x67, 0x60, 0x62, + 0xd1, 0xf4, 0x6f, 0xaf, 0x9a, 0x7e, 0x30, 0x30, 0xe8, 0x9a, 0xba, 0x0a, 0x93, 0x51, 0x66, 0xdf, + 0x75, 0x6c, 0x1f, 0xa3, 0x33, 0x50, 0x36, 0x4c, 0xff, 0xb6, 0x78, 0xad, 0x61, 0xc0, 0xd6, 0x4d, + 0x8a, 0x6b, 0xac, 0x80, 0xda, 0x86, 0x23, 0x24, 0xb9, 0x88, 0xc9, 0xe9, 0x66, 0x13, 0x0f, 0x17, + 0xf3, 0x4d, 0xe6, 0x86, 0xc5, 0x38, 0x37, 0x54, 0xaf, 0xc1, 0x74, 0xbc, 0x02, 0xde, 0xe4, 0xd7, + 0xa0, 0x44, 0x5a, 0x90, 0x4d, 0xd8, 0xa0, 0x2d, 0xa6, 0xf9, 0xd5, 0x2f, 0x2b, 0x30, 0x45, 0x92, + 0x0b, 0x84, 0x3d, 0x0c, 0xd9, 0x5e, 0x04, 0xa5, 0x8f, 0x1c, 0x3b, 0x8c, 0xfe, 0x41, 0x7e, 0x93, + 0x49, 0x40, 0xf0, 0xb7, 0xe9, 0xa4, 0xe6, 0x81, 0x25, 0x08, 0x60, 0x83, 0x4c, 0xec, 0xfd, 0x42, + 0x08, 0xaa, 0x17, 0x59, 0x63, 0x16, 0xb1, 0x85, 0xb3, 0x34, 0x86, 0xbf, 0x56, 0x53, 0x08, 0x5f, + 0xab, 0x51, 0xff, 0x72, 0x11, 0x4a, 0x04, 0x43, 0x2a, 0xf7, 0x1c, 0x87, 0x42, 0x98, 0xbb, 0x60, + 0x1a, 0x07, 0xd1, 0x59, 0x6e, 0x62, 0x29, 0x16, 0x06, 0x50, 0x2c, 0xd4, 0xb2, 0xb4, 0x50, 0x05, + 0x01, 0x2a, 0x12, 0x01, 0x8e, 0x85, 0x12, 0x18, 0x7b, 0x20, 0x45, 0x3c, 0x8a, 0x28, 0x4b, 0xcf, + 0xb5, 0x84, 0xf4, 0x8c, 0xa0, 0x64, 0x3a, 0xae, 0x4f, 0x8d, 0xc4, 0x45, 0x8d, 0xfe, 0x46, 0xef, + 0xc1, 0x54, 0xdf, 0x03, 0x6c, 0xdc, 0xf2, 0x3b, 0x93, 0xcf, 0x07, 0x40, 0x9b, 0x4c, 0xbe, 0xbe, + 0x86, 0x6e, 0xc3, 0xf1, 0xfe, 0xd7, 0xdd, 0xe8, 0xdb, 0x6f, 0xdc, 0x16, 0x7c, 0x7a, 0x08, 0x37, + 0x03, 0xed, 0xa8, 0x9b, 0x06, 0x56, 0xbf, 0xaf, 0xc0, 0x54, 0x5f, 0x58, 0xe1, 0xfd, 0x18, 0x9f, + 0xf4, 0x22, 0x76, 0x44, 0xbb, 0x19, 0x38, 0x42, 0xd9, 0xdb, 0x0e, 0xd6, 0xbd, 0x60, 0x13, 0xeb, + 0x31, 0x47, 0xe0, 0x29, 0xf2, 0x69, 0x59, 0x7c, 0x89, 0x85, 0x63, 0x08, 0x3c, 0xdd, 0xf6, 0xcd, + 0x68, 0x4b, 0x64, 0x23, 0x4a, 0xef, 0xf9, 0x6e, 0x84, 0x9f, 0xc4, 0xdb, 0xe9, 0x69, 0xae, 0xc2, + 0x32, 0xcb, 0xad, 0xc4, 0x58, 0xae, 0xfa, 0xef, 0x00, 0x60, 0xcd, 0x73, 0xba, 0x38, 0xd8, 0xc1, + 0x3d, 0xff, 0x3e, 0x3d, 0x08, 0x17, 0xd6, 0x27, 0xfd, 0x4c, 0x0d, 0x33, 0x5f, 0xcc, 0x22, 0x9a, + 0xa4, 0xa3, 0x8b, 0x1f, 0x03, 0xbe, 0x59, 0x85, 0xf1, 0x78, 0x5d, 0xe8, 0x0c, 0x34, 0x45, 0x08, + 0x62, 0x6e, 0xb1, 0x6c, 0x27, 0x42, 0xe0, 0x1c, 0xe3, 0xdf, 0xaf, 0xb2, 0xcf, 0xa1, 0x11, 0x55, + 0x32, 0xef, 0x16, 0xe2, 0xe6, 0xdd, 0x28, 0xa2, 0x7b, 0x31, 0x16, 0xd1, 0xfd, 0x51, 0x00, 0xaa, + 0x6d, 0x64, 0xcf, 0xdc, 0xf2, 0x68, 0x42, 0x04, 0xc2, 0xde, 0x6d, 0xfd, 0x00, 0x10, 0xfd, 0xd2, + 0x76, 0x7b, 0x96, 0x90, 0x11, 0x45, 0xdc, 0xc6, 0x43, 0xb1, 0x11, 0xc6, 0xec, 0xce, 0x95, 0x84, + 0xdd, 0x99, 0x86, 0x6a, 0xe2, 0xa1, 0x5c, 0xf8, 0x6a, 0x8f, 0x00, 0x28, 0x80, 0x89, 0xf0, 0xc1, + 0x24, 0x4b, 0xdf, 0xc4, 0x96, 0xcf, 0xdf, 0xf4, 0xbc, 0x32, 0xe4, 0x20, 0xcf, 0x2c, 0x71, 0x74, + 0xab, 0x14, 0x1b, 0xb3, 0x52, 0x8f, 0xe3, 0x18, 0x10, 0x3d, 0x01, 0xe1, 0x8b, 0x4c, 0x74, 0x27, + 0xe5, 0x37, 0x6d, 0x05, 0x8c, 0xec, 0xa3, 0x4f, 0xc0, 0xa8, 0xe7, 0xf4, 0x02, 0x2c, 0x62, 0xfb, + 0xb0, 0x8b, 0xb6, 0x0d, 0x0a, 0xe3, 0x91, 0x7d, 0x9e, 0x84, 0x31, 0xaf, 0x67, 0x49, 0x16, 0xf5, + 0x06, 0x13, 0x07, 0x08, 0x30, 0x1c, 0x4d, 0x3b, 0x69, 0x76, 0x1f, 0xa5, 0xdd, 0x5b, 0x19, 0xb6, + 0x7b, 0x83, 0x4c, 0xf0, 0x2f, 0xc1, 0xb4, 0x98, 0x77, 0x42, 0x0e, 0xa0, 0xac, 0x7e, 0x8c, 0x9d, + 0x36, 0xf9, 0xb7, 0x39, 0xf6, 0x89, 0x9e, 0x36, 0x9b, 0x50, 0xf5, 0x25, 0x27, 0x91, 0xba, 0x26, + 0x92, 0x68, 0x01, 0x6a, 0x34, 0x14, 0x9f, 0x69, 0x6f, 0xd3, 0x7b, 0x48, 0x03, 0x8d, 0x05, 0x51, + 0x98, 0xc1, 0xb0, 0x60, 0x6b, 0x0e, 0x8e, 0xa4, 0x0c, 0x49, 0xae, 0x1b, 0x40, 0xf7, 0x7c, 0x85, + 0xe8, 0xfb, 0x0a, 0x4c, 0x26, 0x17, 0xaf, 0xb4, 0x9a, 0x94, 0xd8, 0x6a, 0xfa, 0x49, 0x09, 0x5c, + 0xaf, 0x76, 0xa1, 0x1e, 0x05, 0x70, 0xfc, 0x00, 0x46, 0x29, 0xc9, 0xbb, 0xba, 0xad, 0x6f, 0x63, + 0x11, 0x5b, 0xf4, 0x8d, 0xac, 0xd3, 0x6c, 0x4e, 0x2a, 0xbb, 0xc4, 0x77, 0x5c, 0x2d, 0x86, 0x51, + 0xfd, 0x55, 0x05, 0x1e, 0x3b, 0xb8, 0x40, 0x7e, 0x6d, 0x72, 0xea, 0x43, 0x63, 0x64, 0x83, 0xeb, + 0xec, 0xe0, 0x30, 0x6e, 0x3b, 0x4f, 0xd1, 0x97, 0xfd, 0xf5, 0x60, 0x27, 0x1e, 0x6d, 0x0b, 0x08, + 0x88, 0x2d, 0x48, 0xf5, 0xe7, 0xca, 0x30, 0xbe, 0x1e, 0x63, 0xaa, 0x43, 0xef, 0x38, 0xeb, 0xb1, + 0x1d, 0xe7, 0x62, 0xa6, 0x17, 0xc9, 0x78, 0x9d, 0x89, 0xa4, 0x64, 0xa5, 0xfc, 0xf3, 0x05, 0x40, + 0xfd, 0x1f, 0x89, 0x34, 0xf8, 0xa1, 0xb3, 0xc9, 0xd8, 0x9f, 0x38, 0xe0, 0x7f, 0xe8, 0x6c, 0xd2, + 0xd5, 0x82, 0xd6, 0xa1, 0x2e, 0x24, 0x20, 0x71, 0x16, 0x7d, 0x35, 0x57, 0x6b, 0xc2, 0xd1, 0x8c, + 0xf0, 0x1c, 0xf8, 0x54, 0x5e, 0x17, 0x50, 0x38, 0x64, 0xb2, 0xfb, 0x23, 0xa1, 0xc3, 0x9b, 0xb9, + 0x6a, 0xbe, 0x26, 0xd0, 0x88, 0x85, 0xab, 0x4d, 0xd9, 0x49, 0x50, 0xeb, 0x17, 0x14, 0xa8, 0x2d, + 0x49, 0x22, 0x1e, 0x9d, 0x0d, 0xc2, 0x1c, 0x9d, 0xf2, 0xec, 0x5c, 0xa1, 0xef, 0xd9, 0x39, 0x61, + 0xc3, 0x2e, 0x4a, 0x36, 0xec, 0xfd, 0xa6, 0x50, 0x0b, 0x6a, 0x89, 0x60, 0xa3, 0x61, 0xba, 0x75, + 0x09, 0xa6, 0xfa, 0x5a, 0x4c, 0xdf, 0x60, 0xb0, 0xf7, 0x38, 0x87, 0x20, 0x3f, 0x49, 0x7b, 0xba, + 0x7a, 0xd0, 0xd9, 0xe1, 0x91, 0x05, 0x99, 0xe3, 0x06, 0x50, 0x10, 0x2d, 0xae, 0x7e, 0x77, 0xbf, + 0xa7, 0x3f, 0x6f, 0x26, 0x9e, 0xfe, 0x7c, 0x33, 0xbf, 0x25, 0x2e, 0xf5, 0x81, 0xcf, 0xcf, 0xf7, + 0x3d, 0xf0, 0xf9, 0xd6, 0x10, 0x98, 0x1f, 0xb4, 0x67, 0x3c, 0xff, 0xe4, 0x18, 0x54, 0xc5, 0x0b, + 0x7d, 0xf7, 0x25, 0x76, 0x0c, 0xaf, 0xec, 0x1e, 0x42, 0x0e, 0x85, 0x18, 0x12, 0x21, 0x87, 0xca, + 0x5c, 0x49, 0xac, 0x25, 0x7d, 0x86, 0xce, 0x64, 0xc3, 0xb7, 0xbc, 0xb1, 0xb1, 0xc6, 0x7f, 0xf7, + 0x79, 0x10, 0xcd, 0x43, 0x71, 0x63, 0x75, 0x9d, 0x8f, 0xfb, 0x4b, 0xd9, 0xf0, 0xf1, 0xff, 0x1b, + 0xab, 0xeb, 0x1a, 0x29, 0x8c, 0x6e, 0xc1, 0xf8, 0x96, 0xe7, 0xd8, 0x01, 0xb6, 0x8d, 0x36, 0x0b, + 0x55, 0x5a, 0xcc, 0x22, 0x1c, 0x0a, 0x74, 0x97, 0x78, 0x59, 0x1a, 0xba, 0x74, 0x6c, 0x4b, 0x4a, + 0xf9, 0xe8, 0xb2, 0x08, 0x7e, 0xca, 0xfc, 0xa7, 0x5f, 0xce, 0xd5, 0x40, 0x29, 0x16, 0xea, 0xa0, + 0x97, 0x30, 0xcb, 0x07, 0xbf, 0x84, 0xf9, 0x80, 0x7a, 0x0b, 0x3e, 0x0d, 0xe3, 0xa1, 0x63, 0x20, + 0x13, 0xd3, 0x7e, 0xe2, 0xdd, 0x05, 0x7f, 0x1a, 0x46, 0xe5, 0xf9, 0x10, 0x63, 0xe9, 0x62, 0x83, + 0x9f, 0x96, 0x23, 0xe2, 0xd6, 0xc5, 0x08, 0x2f, 0x42, 0x49, 0xef, 0x71, 0x3e, 0x9e, 0x79, 0x2a, + 0xcf, 0xf5, 0x82, 0x9d, 0xeb, 0x2e, 0xed, 0x26, 0x2d, 0xdd, 0xfa, 0x6f, 0x0a, 0xa0, 0xfe, 0xf5, + 0x42, 0x8e, 0x48, 0xe1, 0x1b, 0x9f, 0xc2, 0x44, 0x53, 0x17, 0x8f, 0x7c, 0xfa, 0x7d, 0x0f, 0xc6, + 0x14, 0xfa, 0x1e, 0x8c, 0x91, 0xb3, 0x48, 0x12, 0x8b, 0xc8, 0x42, 0x77, 0x22, 0x1e, 0xae, 0x50, + 0x2c, 0x23, 0x1e, 0x75, 0xb6, 0xc1, 0x61, 0x94, 0x1c, 0x4f, 0xc3, 0xa8, 0x87, 0xef, 0x78, 0x66, + 0x80, 0x59, 0x16, 0x3a, 0x6f, 0xe7, 0x0b, 0x4d, 0x45, 0x6b, 0x70, 0x38, 0xcd, 0xf6, 0x24, 0x34, + 0x76, 0xb0, 0x6e, 0x60, 0x8f, 0xe5, 0xaa, 0x84, 0xb9, 0x80, 0x81, 0x49, 0xa6, 0xd6, 0x4e, 0xa8, + 0xd6, 0xfe, 0x02, 0x8c, 0xc5, 0x16, 0x07, 0xdf, 0x60, 0xce, 0x66, 0xa3, 0x61, 0xda, 0x0b, 0xaa, + 0xa3, 0xf2, 0x4a, 0x3a, 0x8c, 0x87, 0x53, 0x5b, 0xbf, 0xa8, 0x00, 0x44, 0x8c, 0x87, 0xcc, 0x01, + 0x92, 0x35, 0x0c, 0xfb, 0x4b, 0x13, 0xa4, 0xdf, 0x7d, 0x36, 0x0c, 0xd6, 0x6f, 0x3f, 0x32, 0x8f, + 0x5d, 0x84, 0xe2, 0xd0, 0xf1, 0x87, 0x49, 0xc9, 0xd6, 0x77, 0x14, 0x68, 0x48, 0x2c, 0x26, 0x7c, + 0x41, 0x45, 0x89, 0x5e, 0x50, 0x41, 0xd7, 0xa0, 0x44, 0xa6, 0x11, 0xdf, 0x3a, 0xce, 0xe5, 0x66, + 0xd4, 0x04, 0xf1, 0x4d, 0xb2, 0x99, 0x69, 0x14, 0x0f, 0xba, 0x02, 0xc5, 0x8d, 0x85, 0xb5, 0x6c, + 0x2a, 0x07, 0x81, 0x6e, 0x63, 0xa1, 0x1f, 0x1b, 0xc1, 0xd2, 0xfa, 0x2d, 0x05, 0xa6, 0xd3, 0xea, + 0x4a, 0x5d, 0x6d, 0x47, 0xa1, 0x62, 0x3b, 0x6d, 0xb6, 0x49, 0xd0, 0x30, 0xa2, 0xb6, 0x43, 0x06, + 0x20, 0xf6, 0x5a, 0x6f, 0x31, 0xfe, 0x5a, 0x2f, 0xba, 0x22, 0xfc, 0x52, 0x4b, 0x59, 0x24, 0xce, + 0x94, 0xee, 0xaf, 0xe9, 0xc1, 0x0e, 0x77, 0x67, 0x6d, 0xfd, 0x13, 0x05, 0x8e, 0xa4, 0x74, 0xe5, + 0xd0, 0x1a, 0x7b, 0x2d, 0xda, 0x56, 0x4b, 0x59, 0xc2, 0x02, 0x24, 0x76, 0x99, 0xbe, 0x2d, 0x15, + 0x41, 0x69, 0x6e, 0x75, 0xed, 0x1a, 0xdf, 0x53, 0xe8, 0xef, 0xd6, 0x1e, 0x4c, 0x24, 0x7a, 0x97, + 0xea, 0x3b, 0x29, 0xed, 0xf0, 0x85, 0x43, 0xda, 0xe1, 0x5b, 0xdf, 0x50, 0x60, 0xfc, 0xc1, 0xe4, + 0x66, 0xad, 0xbf, 0xa8, 0x00, 0x44, 0x1c, 0x18, 0x2d, 0x41, 0x79, 0x53, 0xf7, 0xcd, 0x4e, 0x36, + 0xa7, 0x4b, 0xd1, 0xf7, 0x79, 0x52, 0x84, 0x60, 0xd1, 0x58, 0x69, 0xb2, 0xbe, 0x03, 0x4b, 0x18, + 0x70, 0x5f, 0xcc, 0xb8, 0x54, 0x56, 0xd7, 0x29, 0x0a, 0x52, 0xb2, 0x35, 0x0f, 0xf5, 0x10, 0x29, + 0xf5, 0xaf, 0xea, 0x73, 0xf4, 0x91, 0xd9, 0x09, 0xd9, 0x8d, 0xb0, 0x6e, 0x75, 0x85, 0x08, 0x4a, + 0x13, 0xad, 0x9f, 0x29, 0x40, 0x95, 0x23, 0x1d, 0x8c, 0xe2, 0x49, 0x18, 0xdb, 0xc5, 0x9e, 0xb9, + 0xb5, 0xd7, 0xe6, 0x61, 0x3d, 0x18, 0xaa, 0x51, 0x06, 0x5c, 0xa0, 0x30, 0xb4, 0x01, 0x55, 0xc6, + 0xbc, 0x33, 0xbe, 0xce, 0x95, 0xe8, 0xda, 0xcc, 0x32, 0x2b, 0xcc, 0xe4, 0x73, 0x81, 0x8a, 0x4c, + 0x05, 0xec, 0x79, 0x8e, 0xd7, 0x76, 0x25, 0xdd, 0x1f, 0x85, 0xac, 0xe9, 0xdb, 0xb8, 0x75, 0x0e, + 0x46, 0xe5, 0x72, 0xb9, 0x24, 0xf0, 0x8f, 0x61, 0x32, 0x79, 0xfd, 0x82, 0xe4, 0xd6, 0xb7, 0xa3, + 0x67, 0xa8, 0x58, 0x02, 0xad, 0x03, 0xb8, 0xa1, 0x66, 0x20, 0xdb, 0xeb, 0x14, 0x1c, 0x73, 0x42, + 0x43, 0x2b, 0xa1, 0x51, 0xff, 0x48, 0x81, 0xa3, 0xa9, 0xb9, 0x52, 0x19, 0xc7, 0xc1, 0xaf, 0xf9, + 0xbf, 0x0b, 0x15, 0xae, 0x5d, 0x2c, 0x66, 0x79, 0x4a, 0x24, 0xb5, 0xda, 0x19, 0x59, 0xa3, 0xc8, + 0xd1, 0x91, 0x6a, 0xc5, 0x01, 0xd2, 0x17, 0xd4, 0x0f, 0x01, 0xf4, 0xec, 0x34, 0x9c, 0xce, 0x4b, + 0xfd, 0xba, 0x02, 0x10, 0xc9, 0x70, 0x29, 0x45, 0x5b, 0x50, 0x73, 0x5c, 0xf2, 0x39, 0x7a, 0x49, + 0x4f, 0xa4, 0x23, 0xb4, 0x45, 0x09, 0x2d, 0x39, 0x14, 0xe3, 0xad, 0x2d, 0xdc, 0x11, 0x6f, 0xb7, + 0xf3, 0x14, 0x7a, 0x11, 0x50, 0x24, 0x21, 0x86, 0x61, 0x4e, 0x99, 0xed, 0x69, 0x2a, 0xfa, 0xc2, + 0x03, 0x9c, 0xaa, 0x7f, 0xb6, 0x00, 0xb5, 0xf0, 0x81, 0xfa, 0xeb, 0x5c, 0xbd, 0x19, 0x8a, 0xc2, + 0x99, 0x2e, 0x43, 0xd0, 0x07, 0x5a, 0x84, 0x38, 0x4c, 0xf5, 0x97, 0x21, 0xc2, 0x55, 0xf6, 0x08, + 0x60, 0x88, 0x2f, 0x93, 0x43, 0xf8, 0x9a, 0x63, 0x84, 0xe8, 0x1a, 0x6e, 0x94, 0x40, 0xb7, 0x60, + 0x8a, 0x62, 0xb3, 0x03, 0x33, 0x42, 0x99, 0x31, 0x0e, 0xa8, 0x31, 0x67, 0x07, 0x66, 0x88, 0x76, + 0xc2, 0x8d, 0x03, 0xd4, 0x7f, 0x53, 0x80, 0x51, 0xb9, 0x1f, 0xe8, 0xeb, 0x0a, 0x9c, 0xf6, 0xd8, + 0x61, 0xc1, 0x68, 0x1b, 0x3d, 0xcf, 0xb4, 0xb7, 0xc5, 0xf5, 0x4c, 0xf2, 0xd3, 0xdc, 0xb6, 0x1d, + 0xe9, 0x0b, 0xbe, 0x8b, 0x3b, 0xbd, 0xf0, 0x09, 0xcd, 0x4c, 0x14, 0x0b, 0xd5, 0x28, 0x33, 0xa2, + 0x9a, 0x45, 0x8a, 0x6b, 0x3d, 0xac, 0x64, 0x85, 0xd5, 0xc1, 0xc0, 0x4b, 0xa2, 0x06, 0xf4, 0x1b, + 0x0a, 0xbc, 0xe2, 0x7a, 0x44, 0x06, 0xca, 0xd9, 0xb4, 0x4c, 0xfa, 0xa6, 0x35, 0x81, 0x39, 0x6a, + 0xc7, 0x06, 0xf6, 0xba, 0xda, 0x6c, 0x58, 0x65, 0xb6, 0x66, 0xaa, 0x5f, 0x52, 0xe0, 0xf8, 0x3e, + 0xc8, 0xc8, 0xdc, 0xbd, 0x83, 0xcd, 0xed, 0x1d, 0xb1, 0xe8, 0x79, 0x0a, 0x5d, 0x23, 0x9c, 0x47, + 0x48, 0x77, 0xd9, 0x9c, 0xc2, 0x64, 0x52, 0xd2, 0x86, 0x4a, 0x18, 0x54, 0x9b, 0x0d, 0x6a, 0xa8, + 0xff, 0xf9, 0x02, 0x1c, 0x89, 0xa9, 0xef, 0xdb, 0x01, 0xf6, 0xba, 0x42, 0x81, 0x93, 0xb7, 0xa2, + 0x29, 0x3b, 0x01, 0xf1, 0xd5, 0x5d, 0x98, 0x4c, 0x66, 0x43, 0x9b, 0x30, 0xc5, 0x34, 0x4c, 0x91, + 0x2f, 0xad, 0xa8, 0xf1, 0xd5, 0x1c, 0xb3, 0x24, 0x3a, 0xb7, 0x6a, 0x93, 0x14, 0x5f, 0xe4, 0x84, + 0xeb, 0xab, 0x6d, 0x38, 0xbe, 0x4f, 0xe6, 0x9c, 0xac, 0xe6, 0x18, 0x54, 0x28, 0x77, 0x11, 0xcf, + 0x70, 0xf0, 0x94, 0xfa, 0xbd, 0x02, 0x34, 0xa4, 0x65, 0x89, 0xfe, 0xca, 0xd0, 0xab, 0xa3, 0x98, + 0x6d, 0xb1, 0xf2, 0x8a, 0x28, 0xa1, 0x1f, 0xac, 0x05, 0xf2, 0x2e, 0x9d, 0xaa, 0xd8, 0x48, 0xb6, + 0x32, 0xf7, 0x02, 0xf9, 0x4d, 0x05, 0x26, 0x12, 0x48, 0x90, 0x06, 0xe3, 0x74, 0x2b, 0x8a, 0x5b, + 0x17, 0x07, 0x5e, 0x84, 0xa0, 0xdb, 0x52, 0x38, 0xfa, 0x63, 0x96, 0x9c, 0x44, 0x8f, 0x01, 0x84, + 0x5b, 0x67, 0xa8, 0xe1, 0x8c, 0x20, 0x44, 0x32, 0x14, 0x41, 0x05, 0xdb, 0x64, 0xaa, 0xb0, 0x5d, + 0xa6, 0x21, 0x60, 0x57, 0xf0, 0x9e, 0xfa, 0x97, 0x0a, 0x30, 0x16, 0xab, 0x03, 0xb5, 0x61, 0x94, + 0xcd, 0x6a, 0xbe, 0x11, 0x67, 0x32, 0x50, 0xc4, 0x50, 0xcc, 0x5c, 0x25, 0xe5, 0xe5, 0x5d, 0x98, + 0x69, 0x62, 0xb9, 0x51, 0xaf, 0x93, 0xb6, 0x6c, 0xd8, 0x00, 0xbd, 0x96, 0x87, 0x18, 0x07, 0xad, + 0x9b, 0xd6, 0x9b, 0x30, 0x99, 0x6c, 0x45, 0xae, 0x6d, 0xfd, 0x03, 0x68, 0xee, 0x57, 0xdb, 0x21, + 0x2d, 0xbc, 0x3f, 0xa7, 0xc0, 0xf1, 0x7d, 0x66, 0xdc, 0xbe, 0x5c, 0x54, 0x6c, 0x93, 0x3c, 0x2f, + 0x65, 0x72, 0xd9, 0xe4, 0xef, 0xe4, 0x9c, 0x9e, 0x70, 0xe3, 0x00, 0xf5, 0x07, 0x05, 0x36, 0x67, + 0xa5, 0xad, 0xf3, 0x53, 0x5e, 0x70, 0x08, 0xbc, 0xe0, 0x24, 0x4c, 0xa7, 0x69, 0xe4, 0xd2, 0x5c, + 0x7b, 0xd4, 0x8f, 0xa1, 0xb2, 0x64, 0xef, 0xde, 0xd4, 0xbd, 0x54, 0xc7, 0x9f, 0xd4, 0xc9, 0x8a, + 0x56, 0x00, 0xe8, 0x8f, 0xf6, 0x96, 0xe7, 0x74, 0xb3, 0x05, 0x1c, 0x62, 0x75, 0x70, 0xb5, 0x6b, + 0x9d, 0x96, 0xbe, 0xe4, 0x39, 0x5d, 0xf5, 0xff, 0x14, 0x60, 0x54, 0xfe, 0x86, 0xae, 0x41, 0x7d, + 0xcb, 0xc4, 0x96, 0x41, 0x3d, 0xd4, 0x32, 0x45, 0x0e, 0x66, 0xbd, 0xbc, 0x44, 0x0a, 0x85, 0x2b, + 0xa7, 0x46, 0x71, 0x68, 0x78, 0x0b, 0xe9, 0x80, 0xc2, 0x47, 0x9c, 0x22, 0xc4, 0x99, 0x8e, 0x21, + 0x42, 0xcb, 0x1b, 0x47, 0x3d, 0xe9, 0xc9, 0x60, 0x52, 0x45, 0x9b, 0x46, 0xf5, 0xdf, 0x32, 0xb7, + 0xdb, 0x5d, 0xdd, 0x25, 0x4c, 0x4f, 0x7a, 0x02, 0x6b, 0x80, 0xe2, 0x94, 0xbd, 0xb8, 0x7e, 0x55, + 0x77, 0xaf, 0xe0, 0xbd, 0xb0, 0x86, 0x89, 0x8e, 0x04, 0x25, 0x15, 0xdc, 0x80, 0x71, 0x7e, 0xc6, + 0x14, 0xc8, 0x4b, 0x59, 0x0e, 0xd1, 0x4c, 0xed, 0x2a, 0x63, 0x1e, 0xf5, 0x05, 0x48, 0xc3, 0x5b, + 0xea, 0x0d, 0x38, 0x92, 0x42, 0x3b, 0xea, 0x25, 0xe8, 0x9a, 0xed, 0x78, 0x18, 0x01, 0xe9, 0x9e, + 0x2c, 0x39, 0x56, 0x32, 0x4a, 0xba, 0xd2, 0x4d, 0x08, 0x0a, 0x59, 0xd3, 0x83, 0x1d, 0x35, 0x80, + 0xa3, 0xa9, 0x94, 0xa3, 0xae, 0xa0, 0xe2, 0x5a, 0x80, 0x7c, 0x5a, 0x1e, 0x0b, 0xa1, 0xd7, 0xb8, + 0x13, 0x9f, 0x20, 0xb1, 0x60, 0x6c, 0x22, 0x4d, 0x5d, 0xe9, 0xcd, 0x5d, 0xd3, 0x0f, 0x6d, 0x93, + 0x22, 0xa9, 0x7e, 0x45, 0x81, 0xe9, 0x34, 0x6a, 0xa2, 0x0e, 0x1c, 0xa3, 0x17, 0x6b, 0xda, 0x0e, + 0xed, 0x6b, 0x3b, 0x92, 0x08, 0x87, 0xf2, 0xc8, 0x9e, 0xb6, 0xd2, 0x56, 0x16, 0x67, 0xcf, 0x85, + 0x90, 0x3d, 0xab, 0xbf, 0xac, 0xc0, 0x54, 0xdf, 0x00, 0xfc, 0x98, 0x1a, 0x73, 0xea, 0x97, 0x8f, + 0x41, 0x95, 0x69, 0x1a, 0x7c, 0xf4, 0x1d, 0x05, 0x4a, 0xab, 0xa6, 0x1f, 0xa0, 0x01, 0xcb, 0x8a, + 0xfb, 0x75, 0x86, 0x76, 0x0e, 0xec, 0x07, 0xad, 0x53, 0x79, 0x8a, 0x30, 0xff, 0x4a, 0xf5, 0xfa, + 0xcf, 0x7e, 0xbb, 0x59, 0xa8, 0x29, 0x3f, 0xfb, 0xfd, 0xdf, 0xff, 0x95, 0xc2, 0x02, 0x9a, 0x9b, + 0x6d, 0x0b, 0x14, 0xb3, 0xba, 0x6b, 0xce, 0x46, 0x68, 0x66, 0x05, 0x9a, 0x59, 0xee, 0xa4, 0xe8, + 0xcf, 0x7e, 0x91, 0xff, 0xfa, 0x78, 0xf6, 0x8b, 0xc1, 0x9e, 0x8b, 0x3f, 0x9e, 0xfd, 0xd0, 0x77, + 0x6c, 0xf4, 0x3d, 0x05, 0x6a, 0xc2, 0x8b, 0x13, 0x0d, 0x60, 0xa9, 0x92, 0xb7, 0x67, 0xac, 0x23, + 0xaf, 0xe5, 0x2d, 0xc6, 0x3b, 0x73, 0x53, 0xea, 0xcc, 0xdb, 0x68, 0xf9, 0x9e, 0x3a, 0xf3, 0x45, + 0xb2, 0x04, 0x78, 0x9f, 0xfe, 0xae, 0x02, 0x15, 0xe6, 0x48, 0x8a, 0x4e, 0x0f, 0x7a, 0xba, 0x84, + 0xb9, 0x9b, 0xc6, 0xfb, 0xf3, 0x68, 0x54, 0xc8, 0x20, 0xd8, 0xfd, 0x99, 0x9b, 0x8e, 0x69, 0x84, + 0xcd, 0xd6, 0xa4, 0x66, 0x5f, 0x52, 0xef, 0x7d, 0x0c, 0xce, 0x29, 0x27, 0xd1, 0xdf, 0x57, 0xa0, + 0xc2, 0xdc, 0x4d, 0x07, 0x35, 0x59, 0x38, 0xa5, 0xe6, 0x6a, 0x72, 0x8c, 0xd2, 0x27, 0x0f, 0x8f, + 0xd2, 0xff, 0x40, 0x81, 0x0a, 0xf3, 0xe6, 0x1e, 0xd4, 0x6c, 0x96, 0x2b, 0x67, 0xb3, 0x6f, 0x49, + 0xcd, 0xbe, 0xda, 0x3a, 0xb4, 0x66, 0x13, 0x82, 0xff, 0xaa, 0x02, 0xa5, 0x05, 0xc7, 0xdd, 0x1b, + 0xb4, 0x70, 0x49, 0x9e, 0x9c, 0xad, 0x5e, 0x92, 0x5a, 0x7d, 0xb6, 0xf5, 0x4a, 0x86, 0x56, 0xeb, + 0x1d, 0x6a, 0x32, 0x9c, 0xed, 0x38, 0xee, 0x5e, 0xd8, 0xc2, 0xff, 0xaa, 0xc0, 0xd8, 0x92, 0x61, + 0x06, 0x21, 0x1f, 0x46, 0x59, 0xb7, 0x3f, 0x52, 0x2a, 0x63, 0x5b, 0xbf, 0xa4, 0x48, 0x8d, 0xed, + 0xa9, 0xee, 0x70, 0x24, 0x8e, 0x4e, 0x2c, 0x8c, 0xcc, 0xf4, 0xf7, 0xc7, 0xb3, 0x6c, 0xe7, 0xed, + 0xea, 0xae, 0x2f, 0xa8, 0x2f, 0x3a, 0x8a, 0x0d, 0x33, 0x08, 0x3b, 0xfa, 0xef, 0x15, 0x00, 0xd2, + 0x64, 0x1e, 0xa5, 0x2a, 0xd3, 0x3e, 0x9c, 0xa3, 0x8b, 0x3f, 0x2d, 0xf5, 0xd0, 0x53, 0xbb, 0x87, + 0xda, 0x43, 0xee, 0xbf, 0x77, 0x60, 0xf7, 0x7e, 0xa8, 0x40, 0x53, 0x3c, 0xbe, 0x9e, 0x74, 0x54, + 0x46, 0x17, 0x72, 0xfa, 0x4e, 0xc7, 0x1f, 0x71, 0x1f, 0xd4, 0xf5, 0x9e, 0xd4, 0x75, 0x53, 0x35, + 0x86, 0xeb, 0x7a, 0xe4, 0x45, 0xcd, 0x1c, 0xb3, 0xfb, 0x7a, 0xeb, 0xf1, 0x46, 0x85, 0x3d, 0xfe, + 0x91, 0x02, 0xad, 0x1b, 0xb6, 0xb7, 0x5f, 0x9f, 0x2f, 0xe6, 0xeb, 0x73, 0xdf, 0xd3, 0xf5, 0x83, + 0x7a, 0x1d, 0x48, 0xbd, 0xde, 0x39, 0xb9, 0xf5, 0x09, 0xf5, 0xba, 0x67, 0xc7, 0xfa, 0x8d, 0xfe, + 0xaf, 0x02, 0x8f, 0xee, 0x37, 0xcc, 0xd4, 0xf1, 0x1c, 0xcd, 0x0f, 0xe3, 0xc4, 0x9e, 0xaf, 0xeb, + 0x1f, 0x49, 0x5d, 0xb7, 0x55, 0xf3, 0x70, 0xba, 0x4e, 0x1d, 0xf1, 0x07, 0x8f, 0xfa, 0x97, 0x0a, + 0xf0, 0xf8, 0xfe, 0xa3, 0xce, 0x48, 0xb0, 0x38, 0x04, 0x09, 0x72, 0x8f, 0xff, 0x9e, 0x44, 0x84, + 0xee, 0xc9, 0xdb, 0x9f, 0x24, 0x11, 0x92, 0x93, 0xe0, 0x87, 0x0a, 0x8c, 0x6a, 0x98, 0x08, 0xfb, + 0x78, 0xc5, 0x36, 0xf0, 0x5d, 0x34, 0x30, 0xf4, 0x69, 0x94, 0xf7, 0x30, 0xc4, 0x43, 0x57, 0xea, + 0xba, 0x81, 0x36, 0x0f, 0x63, 0xc3, 0xfc, 0x22, 0x73, 0x00, 0xdc, 0xa0, 0x30, 0x8f, 0xb5, 0xd7, + 0x24, 0xed, 0xa5, 0x3d, 0x3e, 0xf5, 0x4b, 0x65, 0x28, 0x2f, 0x9a, 0xfe, 0x6d, 0x1f, 0x7d, 0x53, + 0x88, 0xc2, 0x2f, 0x0e, 0xbe, 0xf5, 0x23, 0xdd, 0x89, 0x6a, 0xcd, 0x64, 0xcd, 0xce, 0xfb, 0xf8, + 0x9a, 0xd4, 0xc7, 0x93, 0xe8, 0xb9, 0x44, 0x1f, 0x3b, 0x96, 0xd3, 0x33, 0xa2, 0xee, 0xd1, 0xeb, + 0x50, 0xa1, 0x54, 0x18, 0x49, 0xba, 0x2f, 0x0f, 0xae, 0x34, 0x71, 0x79, 0x6a, 0xd0, 0x78, 0xa4, + 0x5d, 0x87, 0x52, 0x2f, 0x48, 0x6d, 0x7d, 0x19, 0xcd, 0x66, 0x69, 0xab, 0x2c, 0x5e, 0xfd, 0x4a, + 0x24, 0xc8, 0xce, 0x0e, 0xae, 0x3d, 0x76, 0x77, 0x6a, 0xd0, 0x22, 0x39, 0x2b, 0xb5, 0xec, 0x45, + 0x35, 0x33, 0x15, 0xc9, 0x42, 0xff, 0x5a, 0x24, 0xab, 0xce, 0x66, 0xa1, 0x89, 0x74, 0x89, 0x6a, + 0x50, 0xab, 0xde, 0x90, 0x5a, 0xf5, 0xd2, 0xc9, 0x99, 0x4c, 0xf4, 0xea, 0x99, 0x06, 0x23, 0xd7, + 0xfc, 0x45, 0x78, 0xaa, 0xe3, 0x74, 0xa3, 0x1a, 0x74, 0xd7, 0x4c, 0x6b, 0xd6, 0x7c, 0x83, 0x9d, + 0xde, 0xd6, 0x3c, 0x27, 0x70, 0xd6, 0x94, 0xcf, 0xd5, 0xc4, 0x87, 0xcd, 0x8a, 0x4b, 0x40, 0xa7, + 0xff, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x6d, 0xd1, 0xb2, 0x2d, 0xbc, 0xe8, 0x00, 0x00, } diff --git a/vendor/github.com/davecgh/go-spew/LICENSE b/vendor/github.com/davecgh/go-spew/LICENSE index c83641619..bb6733231 100644 --- a/vendor/github.com/davecgh/go-spew/LICENSE +++ b/vendor/github.com/davecgh/go-spew/LICENSE @@ -1,6 +1,6 @@ ISC License -Copyright (c) 2012-2016 Dave Collins +Copyright (c) 2012-2013 Dave Collins Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above diff --git a/vendor/github.com/davecgh/go-spew/spew/bypass.go b/vendor/github.com/davecgh/go-spew/spew/bypass.go index 8a4a6589a..d42a0bc4a 100644 --- a/vendor/github.com/davecgh/go-spew/spew/bypass.go +++ b/vendor/github.com/davecgh/go-spew/spew/bypass.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015-2016 Dave Collins +// Copyright (c) 2015 Dave Collins // // Permission to use, copy, modify, and distribute this software for any // purpose with or without fee is hereby granted, provided that the above diff --git a/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go b/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go index 1fe3cf3d5..e47a4e795 100644 --- a/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go +++ b/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015-2016 Dave Collins +// Copyright (c) 2015 Dave Collins // // Permission to use, copy, modify, and distribute this software for any // purpose with or without fee is hereby granted, provided that the above diff --git a/vendor/github.com/davecgh/go-spew/spew/common.go b/vendor/github.com/davecgh/go-spew/spew/common.go index 1be8ce945..14f02dc15 100644 --- a/vendor/github.com/davecgh/go-spew/spew/common.go +++ b/vendor/github.com/davecgh/go-spew/spew/common.go @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2016 Dave Collins + * Copyright (c) 2013 Dave Collins * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -180,7 +180,7 @@ func printComplex(w io.Writer, c complex128, floatPrecision int) { w.Write(closeParenBytes) } -// printHexPtr outputs a uintptr formatted as hexadecimal with a leading '0x' +// printHexPtr outputs a uintptr formatted as hexidecimal with a leading '0x' // prefix to Writer w. func printHexPtr(w io.Writer, p uintptr) { // Null pointer. diff --git a/vendor/github.com/davecgh/go-spew/spew/config.go b/vendor/github.com/davecgh/go-spew/spew/config.go index 2e3d22f31..555282723 100644 --- a/vendor/github.com/davecgh/go-spew/spew/config.go +++ b/vendor/github.com/davecgh/go-spew/spew/config.go @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2016 Dave Collins + * Copyright (c) 2013 Dave Collins * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -67,15 +67,6 @@ type ConfigState struct { // Google App Engine or with the "safe" build tag specified. DisablePointerMethods bool - // DisablePointerAddresses specifies whether to disable the printing of - // pointer addresses. This is useful when diffing data structures in tests. - DisablePointerAddresses bool - - // DisableCapacities specifies whether to disable the printing of capacities - // for arrays, slices, maps and channels. This is useful when diffing - // data structures in tests. - DisableCapacities bool - // ContinueOnMethod specifies whether or not recursion should continue once // a custom error or Stringer interface is invoked. The default, false, // means it will print the results of invoking the custom error or Stringer diff --git a/vendor/github.com/davecgh/go-spew/spew/doc.go b/vendor/github.com/davecgh/go-spew/spew/doc.go index aacaac6f1..5be0c4060 100644 --- a/vendor/github.com/davecgh/go-spew/spew/doc.go +++ b/vendor/github.com/davecgh/go-spew/spew/doc.go @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2016 Dave Collins + * Copyright (c) 2013 Dave Collins * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -91,15 +91,6 @@ The following configuration options are available: which only accept pointer receivers from non-pointer variables. Pointer method invocation is enabled by default. - * DisablePointerAddresses - DisablePointerAddresses specifies whether to disable the printing of - pointer addresses. This is useful when diffing data structures in tests. - - * DisableCapacities - DisableCapacities specifies whether to disable the printing of - capacities for arrays, slices, maps and channels. This is useful when - diffing data structures in tests. - * ContinueOnMethod Enables recursion into types after invoking error and Stringer interface methods. Recursion after method invocation is disabled by default. diff --git a/vendor/github.com/davecgh/go-spew/spew/dump.go b/vendor/github.com/davecgh/go-spew/spew/dump.go index df1d582a7..a0ff95e27 100644 --- a/vendor/github.com/davecgh/go-spew/spew/dump.go +++ b/vendor/github.com/davecgh/go-spew/spew/dump.go @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2016 Dave Collins + * Copyright (c) 2013 Dave Collins * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -129,7 +129,7 @@ func (d *dumpState) dumpPtr(v reflect.Value) { d.w.Write(closeParenBytes) // Display pointer information. - if !d.cs.DisablePointerAddresses && len(pointerChain) > 0 { + if len(pointerChain) > 0 { d.w.Write(openParenBytes) for i, addr := range pointerChain { if i > 0 { @@ -282,13 +282,13 @@ func (d *dumpState) dump(v reflect.Value) { case reflect.Map, reflect.String: valueLen = v.Len() } - if valueLen != 0 || !d.cs.DisableCapacities && valueCap != 0 { + if valueLen != 0 || valueCap != 0 { d.w.Write(openParenBytes) if valueLen != 0 { d.w.Write(lenEqualsBytes) printInt(d.w, int64(valueLen), 10) } - if !d.cs.DisableCapacities && valueCap != 0 { + if valueCap != 0 { if valueLen != 0 { d.w.Write(spaceBytes) } diff --git a/vendor/github.com/davecgh/go-spew/spew/format.go b/vendor/github.com/davecgh/go-spew/spew/format.go index c49875bac..ecf3b80e2 100644 --- a/vendor/github.com/davecgh/go-spew/spew/format.go +++ b/vendor/github.com/davecgh/go-spew/spew/format.go @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2016 Dave Collins + * Copyright (c) 2013 Dave Collins * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above diff --git a/vendor/github.com/davecgh/go-spew/spew/spew.go b/vendor/github.com/davecgh/go-spew/spew/spew.go index 32c0e3388..d8233f542 100644 --- a/vendor/github.com/davecgh/go-spew/spew/spew.go +++ b/vendor/github.com/davecgh/go-spew/spew/spew.go @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2016 Dave Collins + * Copyright (c) 2013 Dave Collins * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above diff --git a/vendor/github.com/stretchr/testify/LICENCE.txt b/vendor/github.com/stretchr/testify/LICENCE.txt new file mode 100644 index 000000000..473b670a7 --- /dev/null +++ b/vendor/github.com/stretchr/testify/LICENCE.txt @@ -0,0 +1,22 @@ +Copyright (c) 2012 - 2013 Mat Ryer and Tyler Bunnell + +Please consider promoting this project if you find it useful. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, +and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT +OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/stretchr/testify/assert/assertion_format.go b/vendor/github.com/stretchr/testify/assert/assertion_format.go deleted file mode 100644 index ae06a54e2..000000000 --- a/vendor/github.com/stretchr/testify/assert/assertion_format.go +++ /dev/null @@ -1,349 +0,0 @@ -/* -* CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen -* THIS FILE MUST NOT BE EDITED BY HAND - */ - -package assert - -import ( - http "net/http" - url "net/url" - time "time" -) - -// Conditionf uses a Comparison to assert a complex condition. -func Conditionf(t TestingT, comp Comparison, msg string, args ...interface{}) bool { - return Condition(t, comp, append([]interface{}{msg}, args...)...) -} - -// Containsf asserts that the specified string, list(array, slice...) or map contains the -// specified substring or element. -// -// assert.Containsf(t, "Hello World", "World", "error message %s", "formatted") -// assert.Containsf(t, ["Hello", "World"], "World", "error message %s", "formatted") -// assert.Containsf(t, {"Hello": "World"}, "Hello", "error message %s", "formatted") -func Containsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) bool { - return Contains(t, s, contains, append([]interface{}{msg}, args...)...) -} - -// DirExistsf checks whether a directory exists in the given path. It also fails if the path is a file rather a directory or there is an error checking whether it exists. -func DirExistsf(t TestingT, path string, msg string, args ...interface{}) bool { - return DirExists(t, path, append([]interface{}{msg}, args...)...) -} - -// ElementsMatchf asserts that the specified listA(array, slice...) is equal to specified -// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, -// the number of appearances of each of them in both lists should match. -// -// assert.ElementsMatchf(t, [1, 3, 2, 3], [1, 3, 3, 2], "error message %s", "formatted") -func ElementsMatchf(t TestingT, listA interface{}, listB interface{}, msg string, args ...interface{}) bool { - return ElementsMatch(t, listA, listB, append([]interface{}{msg}, args...)...) -} - -// Emptyf asserts that the specified object is empty. I.e. nil, "", false, 0 or either -// a slice or a channel with len == 0. -// -// assert.Emptyf(t, obj, "error message %s", "formatted") -func Emptyf(t TestingT, object interface{}, msg string, args ...interface{}) bool { - return Empty(t, object, append([]interface{}{msg}, args...)...) -} - -// Equalf asserts that two objects are equal. -// -// assert.Equalf(t, 123, 123, "error message %s", "formatted") -// -// Pointer variable equality is determined based on the equality of the -// referenced values (as opposed to the memory addresses). Function equality -// cannot be determined and will always fail. -func Equalf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { - return Equal(t, expected, actual, append([]interface{}{msg}, args...)...) -} - -// EqualErrorf asserts that a function returned an error (i.e. not `nil`) -// and that it is equal to the provided error. -// -// actualObj, err := SomeFunction() -// assert.EqualErrorf(t, err, expectedErrorString, "error message %s", "formatted") -func EqualErrorf(t TestingT, theError error, errString string, msg string, args ...interface{}) bool { - return EqualError(t, theError, errString, append([]interface{}{msg}, args...)...) -} - -// EqualValuesf asserts that two objects are equal or convertable to the same types -// and equal. -// -// assert.EqualValuesf(t, uint32(123, "error message %s", "formatted"), int32(123)) -func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { - return EqualValues(t, expected, actual, append([]interface{}{msg}, args...)...) -} - -// Errorf asserts that a function returned an error (i.e. not `nil`). -// -// actualObj, err := SomeFunction() -// if assert.Errorf(t, err, "error message %s", "formatted") { -// assert.Equal(t, expectedErrorf, err) -// } -func Errorf(t TestingT, err error, msg string, args ...interface{}) bool { - return Error(t, err, append([]interface{}{msg}, args...)...) -} - -// Exactlyf asserts that two objects are equal in value and type. -// -// assert.Exactlyf(t, int32(123, "error message %s", "formatted"), int64(123)) -func Exactlyf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { - return Exactly(t, expected, actual, append([]interface{}{msg}, args...)...) -} - -// Failf reports a failure through -func Failf(t TestingT, failureMessage string, msg string, args ...interface{}) bool { - return Fail(t, failureMessage, append([]interface{}{msg}, args...)...) -} - -// FailNowf fails test -func FailNowf(t TestingT, failureMessage string, msg string, args ...interface{}) bool { - return FailNow(t, failureMessage, append([]interface{}{msg}, args...)...) -} - -// Falsef asserts that the specified value is false. -// -// assert.Falsef(t, myBool, "error message %s", "formatted") -func Falsef(t TestingT, value bool, msg string, args ...interface{}) bool { - return False(t, value, append([]interface{}{msg}, args...)...) -} - -// FileExistsf checks whether a file exists in the given path. It also fails if the path points to a directory or there is an error when trying to check the file. -func FileExistsf(t TestingT, path string, msg string, args ...interface{}) bool { - return FileExists(t, path, append([]interface{}{msg}, args...)...) -} - -// HTTPBodyContainsf asserts that a specified handler returns a -// body that contains a string. -// -// assert.HTTPBodyContainsf(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") -// -// Returns whether the assertion was successful (true) or not (false). -func HTTPBodyContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool { - return HTTPBodyContains(t, handler, method, url, values, str, append([]interface{}{msg}, args...)...) -} - -// HTTPBodyNotContainsf asserts that a specified handler returns a -// body that does not contain a string. -// -// assert.HTTPBodyNotContainsf(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") -// -// Returns whether the assertion was successful (true) or not (false). -func HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool { - return HTTPBodyNotContains(t, handler, method, url, values, str, append([]interface{}{msg}, args...)...) -} - -// HTTPErrorf asserts that a specified handler returns an error status code. -// -// assert.HTTPErrorf(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} -// -// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). -func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { - return HTTPError(t, handler, method, url, values, append([]interface{}{msg}, args...)...) -} - -// HTTPRedirectf asserts that a specified handler returns a redirect status code. -// -// assert.HTTPRedirectf(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} -// -// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). -func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { - return HTTPRedirect(t, handler, method, url, values, append([]interface{}{msg}, args...)...) -} - -// HTTPSuccessf asserts that a specified handler returns a success status code. -// -// assert.HTTPSuccessf(t, myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") -// -// Returns whether the assertion was successful (true) or not (false). -func HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { - return HTTPSuccess(t, handler, method, url, values, append([]interface{}{msg}, args...)...) -} - -// Implementsf asserts that an object is implemented by the specified interface. -// -// assert.Implementsf(t, (*MyInterface, "error message %s", "formatted")(nil), new(MyObject)) -func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool { - return Implements(t, interfaceObject, object, append([]interface{}{msg}, args...)...) -} - -// InDeltaf asserts that the two numerals are within delta of each other. -// -// assert.InDeltaf(t, math.Pi, (22 / 7.0, "error message %s", "formatted"), 0.01) -func InDeltaf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { - return InDelta(t, expected, actual, delta, append([]interface{}{msg}, args...)...) -} - -// InDeltaMapValuesf is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys. -func InDeltaMapValuesf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { - return InDeltaMapValues(t, expected, actual, delta, append([]interface{}{msg}, args...)...) -} - -// InDeltaSlicef is the same as InDelta, except it compares two slices. -func InDeltaSlicef(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { - return InDeltaSlice(t, expected, actual, delta, append([]interface{}{msg}, args...)...) -} - -// InEpsilonf asserts that expected and actual have a relative error less than epsilon -func InEpsilonf(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool { - return InEpsilon(t, expected, actual, epsilon, append([]interface{}{msg}, args...)...) -} - -// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices. -func InEpsilonSlicef(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool { - return InEpsilonSlice(t, expected, actual, epsilon, append([]interface{}{msg}, args...)...) -} - -// IsTypef asserts that the specified objects are of the same type. -func IsTypef(t TestingT, expectedType interface{}, object interface{}, msg string, args ...interface{}) bool { - return IsType(t, expectedType, object, append([]interface{}{msg}, args...)...) -} - -// JSONEqf asserts that two JSON strings are equivalent. -// -// assert.JSONEqf(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted") -func JSONEqf(t TestingT, expected string, actual string, msg string, args ...interface{}) bool { - return JSONEq(t, expected, actual, append([]interface{}{msg}, args...)...) -} - -// Lenf asserts that the specified object has specific length. -// Lenf also fails if the object has a type that len() not accept. -// -// assert.Lenf(t, mySlice, 3, "error message %s", "formatted") -func Lenf(t TestingT, object interface{}, length int, msg string, args ...interface{}) bool { - return Len(t, object, length, append([]interface{}{msg}, args...)...) -} - -// Nilf asserts that the specified object is nil. -// -// assert.Nilf(t, err, "error message %s", "formatted") -func Nilf(t TestingT, object interface{}, msg string, args ...interface{}) bool { - return Nil(t, object, append([]interface{}{msg}, args...)...) -} - -// NoErrorf asserts that a function returned no error (i.e. `nil`). -// -// actualObj, err := SomeFunction() -// if assert.NoErrorf(t, err, "error message %s", "formatted") { -// assert.Equal(t, expectedObj, actualObj) -// } -func NoErrorf(t TestingT, err error, msg string, args ...interface{}) bool { - return NoError(t, err, append([]interface{}{msg}, args...)...) -} - -// NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the -// specified substring or element. -// -// assert.NotContainsf(t, "Hello World", "Earth", "error message %s", "formatted") -// assert.NotContainsf(t, ["Hello", "World"], "Earth", "error message %s", "formatted") -// assert.NotContainsf(t, {"Hello": "World"}, "Earth", "error message %s", "formatted") -func NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) bool { - return NotContains(t, s, contains, append([]interface{}{msg}, args...)...) -} - -// NotEmptyf asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either -// a slice or a channel with len == 0. -// -// if assert.NotEmptyf(t, obj, "error message %s", "formatted") { -// assert.Equal(t, "two", obj[1]) -// } -func NotEmptyf(t TestingT, object interface{}, msg string, args ...interface{}) bool { - return NotEmpty(t, object, append([]interface{}{msg}, args...)...) -} - -// NotEqualf asserts that the specified values are NOT equal. -// -// assert.NotEqualf(t, obj1, obj2, "error message %s", "formatted") -// -// Pointer variable equality is determined based on the equality of the -// referenced values (as opposed to the memory addresses). -func NotEqualf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { - return NotEqual(t, expected, actual, append([]interface{}{msg}, args...)...) -} - -// NotNilf asserts that the specified object is not nil. -// -// assert.NotNilf(t, err, "error message %s", "formatted") -func NotNilf(t TestingT, object interface{}, msg string, args ...interface{}) bool { - return NotNil(t, object, append([]interface{}{msg}, args...)...) -} - -// NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic. -// -// assert.NotPanicsf(t, func(){ RemainCalm() }, "error message %s", "formatted") -func NotPanicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bool { - return NotPanics(t, f, append([]interface{}{msg}, args...)...) -} - -// NotRegexpf asserts that a specified regexp does not match a string. -// -// assert.NotRegexpf(t, regexp.MustCompile("starts", "error message %s", "formatted"), "it's starting") -// assert.NotRegexpf(t, "^start", "it's not starting", "error message %s", "formatted") -func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) bool { - return NotRegexp(t, rx, str, append([]interface{}{msg}, args...)...) -} - -// NotSubsetf asserts that the specified list(array, slice...) contains not all -// elements given in the specified subset(array, slice...). -// -// assert.NotSubsetf(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted") -func NotSubsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) bool { - return NotSubset(t, list, subset, append([]interface{}{msg}, args...)...) -} - -// NotZerof asserts that i is not the zero value for its type. -func NotZerof(t TestingT, i interface{}, msg string, args ...interface{}) bool { - return NotZero(t, i, append([]interface{}{msg}, args...)...) -} - -// Panicsf asserts that the code inside the specified PanicTestFunc panics. -// -// assert.Panicsf(t, func(){ GoCrazy() }, "error message %s", "formatted") -func Panicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bool { - return Panics(t, f, append([]interface{}{msg}, args...)...) -} - -// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that -// the recovered panic value equals the expected panic value. -// -// assert.PanicsWithValuef(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted") -func PanicsWithValuef(t TestingT, expected interface{}, f PanicTestFunc, msg string, args ...interface{}) bool { - return PanicsWithValue(t, expected, f, append([]interface{}{msg}, args...)...) -} - -// Regexpf asserts that a specified regexp matches a string. -// -// assert.Regexpf(t, regexp.MustCompile("start", "error message %s", "formatted"), "it's starting") -// assert.Regexpf(t, "start...$", "it's not starting", "error message %s", "formatted") -func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) bool { - return Regexp(t, rx, str, append([]interface{}{msg}, args...)...) -} - -// Subsetf asserts that the specified list(array, slice...) contains all -// elements given in the specified subset(array, slice...). -// -// assert.Subsetf(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted") -func Subsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) bool { - return Subset(t, list, subset, append([]interface{}{msg}, args...)...) -} - -// Truef asserts that the specified value is true. -// -// assert.Truef(t, myBool, "error message %s", "formatted") -func Truef(t TestingT, value bool, msg string, args ...interface{}) bool { - return True(t, value, append([]interface{}{msg}, args...)...) -} - -// WithinDurationf asserts that the two times are within duration delta of each other. -// -// assert.WithinDurationf(t, time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted") -func WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) bool { - return WithinDuration(t, expected, actual, delta, append([]interface{}{msg}, args...)...) -} - -// Zerof asserts that i is the zero value for its type. -func Zerof(t TestingT, i interface{}, msg string, args ...interface{}) bool { - return Zero(t, i, append([]interface{}{msg}, args...)...) -} diff --git a/vendor/github.com/stretchr/testify/assert/assertion_forward.go b/vendor/github.com/stretchr/testify/assert/assertion_forward.go index ffa5428f3..e6a796046 100644 --- a/vendor/github.com/stretchr/testify/assert/assertion_forward.go +++ b/vendor/github.com/stretchr/testify/assert/assertion_forward.go @@ -1,686 +1,387 @@ /* * CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen * THIS FILE MUST NOT BE EDITED BY HAND - */ +*/ package assert import ( + http "net/http" url "net/url" time "time" ) + // Condition uses a Comparison to assert a complex condition. func (a *Assertions) Condition(comp Comparison, msgAndArgs ...interface{}) bool { return Condition(a.t, comp, msgAndArgs...) } -// Conditionf uses a Comparison to assert a complex condition. -func (a *Assertions) Conditionf(comp Comparison, msg string, args ...interface{}) bool { - return Conditionf(a.t, comp, msg, args...) -} // Contains asserts that the specified string, list(array, slice...) or map contains the // specified substring or element. -// -// a.Contains("Hello World", "World") -// a.Contains(["Hello", "World"], "World") -// a.Contains({"Hello": "World"}, "Hello") +// +// a.Contains("Hello World", "World", "But 'Hello World' does contain 'World'") +// a.Contains(["Hello", "World"], "World", "But ["Hello", "World"] does contain 'World'") +// a.Contains({"Hello": "World"}, "Hello", "But {'Hello': 'World'} does contain 'Hello'") +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) Contains(s interface{}, contains interface{}, msgAndArgs ...interface{}) bool { return Contains(a.t, s, contains, msgAndArgs...) } -// Containsf asserts that the specified string, list(array, slice...) or map contains the -// specified substring or element. -// -// a.Containsf("Hello World", "World", "error message %s", "formatted") -// a.Containsf(["Hello", "World"], "World", "error message %s", "formatted") -// a.Containsf({"Hello": "World"}, "Hello", "error message %s", "formatted") -func (a *Assertions) Containsf(s interface{}, contains interface{}, msg string, args ...interface{}) bool { - return Containsf(a.t, s, contains, msg, args...) -} - -// DirExists checks whether a directory exists in the given path. It also fails if the path is a file rather a directory or there is an error checking whether it exists. -func (a *Assertions) DirExists(path string, msgAndArgs ...interface{}) bool { - return DirExists(a.t, path, msgAndArgs...) -} - -// DirExistsf checks whether a directory exists in the given path. It also fails if the path is a file rather a directory or there is an error checking whether it exists. -func (a *Assertions) DirExistsf(path string, msg string, args ...interface{}) bool { - return DirExistsf(a.t, path, msg, args...) -} - -// ElementsMatch asserts that the specified listA(array, slice...) is equal to specified -// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, -// the number of appearances of each of them in both lists should match. -// -// a.ElementsMatch([1, 3, 2, 3], [1, 3, 3, 2]) -func (a *Assertions) ElementsMatch(listA interface{}, listB interface{}, msgAndArgs ...interface{}) bool { - return ElementsMatch(a.t, listA, listB, msgAndArgs...) -} - -// ElementsMatchf asserts that the specified listA(array, slice...) is equal to specified -// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, -// the number of appearances of each of them in both lists should match. -// -// a.ElementsMatchf([1, 3, 2, 3], [1, 3, 3, 2], "error message %s", "formatted") -func (a *Assertions) ElementsMatchf(listA interface{}, listB interface{}, msg string, args ...interface{}) bool { - return ElementsMatchf(a.t, listA, listB, msg, args...) -} // Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either // a slice or a channel with len == 0. -// +// // a.Empty(obj) +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) Empty(object interface{}, msgAndArgs ...interface{}) bool { return Empty(a.t, object, msgAndArgs...) } -// Emptyf asserts that the specified object is empty. I.e. nil, "", false, 0 or either -// a slice or a channel with len == 0. -// -// a.Emptyf(obj, "error message %s", "formatted") -func (a *Assertions) Emptyf(object interface{}, msg string, args ...interface{}) bool { - return Emptyf(a.t, object, msg, args...) -} // Equal asserts that two objects are equal. -// -// a.Equal(123, 123) -// -// Pointer variable equality is determined based on the equality of the -// referenced values (as opposed to the memory addresses). Function equality -// cannot be determined and will always fail. +// +// a.Equal(123, 123, "123 and 123 should be equal") +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) Equal(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { return Equal(a.t, expected, actual, msgAndArgs...) } + // EqualError asserts that a function returned an error (i.e. not `nil`) // and that it is equal to the provided error. -// +// // actualObj, err := SomeFunction() -// a.EqualError(err, expectedErrorString) +// if assert.Error(t, err, "An error was expected") { +// assert.Equal(t, err, expectedError) +// } +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) EqualError(theError error, errString string, msgAndArgs ...interface{}) bool { return EqualError(a.t, theError, errString, msgAndArgs...) } -// EqualErrorf asserts that a function returned an error (i.e. not `nil`) -// and that it is equal to the provided error. -// -// actualObj, err := SomeFunction() -// a.EqualErrorf(err, expectedErrorString, "error message %s", "formatted") -func (a *Assertions) EqualErrorf(theError error, errString string, msg string, args ...interface{}) bool { - return EqualErrorf(a.t, theError, errString, msg, args...) -} // EqualValues asserts that two objects are equal or convertable to the same types // and equal. -// -// a.EqualValues(uint32(123), int32(123)) +// +// a.EqualValues(uint32(123), int32(123), "123 and 123 should be equal") +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { return EqualValues(a.t, expected, actual, msgAndArgs...) } -// EqualValuesf asserts that two objects are equal or convertable to the same types -// and equal. -// -// a.EqualValuesf(uint32(123, "error message %s", "formatted"), int32(123)) -func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { - return EqualValuesf(a.t, expected, actual, msg, args...) -} - -// Equalf asserts that two objects are equal. -// -// a.Equalf(123, 123, "error message %s", "formatted") -// -// Pointer variable equality is determined based on the equality of the -// referenced values (as opposed to the memory addresses). Function equality -// cannot be determined and will always fail. -func (a *Assertions) Equalf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { - return Equalf(a.t, expected, actual, msg, args...) -} // Error asserts that a function returned an error (i.e. not `nil`). -// +// // actualObj, err := SomeFunction() -// if a.Error(err) { -// assert.Equal(t, expectedError, err) +// if a.Error(err, "An error was expected") { +// assert.Equal(t, err, expectedError) // } +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) Error(err error, msgAndArgs ...interface{}) bool { return Error(a.t, err, msgAndArgs...) } -// Errorf asserts that a function returned an error (i.e. not `nil`). -// -// actualObj, err := SomeFunction() -// if a.Errorf(err, "error message %s", "formatted") { -// assert.Equal(t, expectedErrorf, err) -// } -func (a *Assertions) Errorf(err error, msg string, args ...interface{}) bool { - return Errorf(a.t, err, msg, args...) -} -// Exactly asserts that two objects are equal in value and type. -// -// a.Exactly(int32(123), int64(123)) +// Exactly asserts that two objects are equal is value and type. +// +// a.Exactly(int32(123), int64(123), "123 and 123 should NOT be equal") +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) Exactly(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { return Exactly(a.t, expected, actual, msgAndArgs...) } -// Exactlyf asserts that two objects are equal in value and type. -// -// a.Exactlyf(int32(123, "error message %s", "formatted"), int64(123)) -func (a *Assertions) Exactlyf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { - return Exactlyf(a.t, expected, actual, msg, args...) -} // Fail reports a failure through func (a *Assertions) Fail(failureMessage string, msgAndArgs ...interface{}) bool { return Fail(a.t, failureMessage, msgAndArgs...) } + // FailNow fails test func (a *Assertions) FailNow(failureMessage string, msgAndArgs ...interface{}) bool { return FailNow(a.t, failureMessage, msgAndArgs...) } -// FailNowf fails test -func (a *Assertions) FailNowf(failureMessage string, msg string, args ...interface{}) bool { - return FailNowf(a.t, failureMessage, msg, args...) -} - -// Failf reports a failure through -func (a *Assertions) Failf(failureMessage string, msg string, args ...interface{}) bool { - return Failf(a.t, failureMessage, msg, args...) -} // False asserts that the specified value is false. -// -// a.False(myBool) +// +// a.False(myBool, "myBool should be false") +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) False(value bool, msgAndArgs ...interface{}) bool { return False(a.t, value, msgAndArgs...) } -// Falsef asserts that the specified value is false. -// -// a.Falsef(myBool, "error message %s", "formatted") -func (a *Assertions) Falsef(value bool, msg string, args ...interface{}) bool { - return Falsef(a.t, value, msg, args...) -} - -// FileExists checks whether a file exists in the given path. It also fails if the path points to a directory or there is an error when trying to check the file. -func (a *Assertions) FileExists(path string, msgAndArgs ...interface{}) bool { - return FileExists(a.t, path, msgAndArgs...) -} - -// FileExistsf checks whether a file exists in the given path. It also fails if the path points to a directory or there is an error when trying to check the file. -func (a *Assertions) FileExistsf(path string, msg string, args ...interface{}) bool { - return FileExistsf(a.t, path, msg, args...) -} // HTTPBodyContains asserts that a specified handler returns a // body that contains a string. -// +// // a.HTTPBodyContains(myHandler, "www.google.com", nil, "I'm Feeling Lucky") -// +// // Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool { - return HTTPBodyContains(a.t, handler, method, url, values, str, msgAndArgs...) +func (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) bool { + return HTTPBodyContains(a.t, handler, method, url, values, str) } -// HTTPBodyContainsf asserts that a specified handler returns a -// body that contains a string. -// -// a.HTTPBodyContainsf(myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPBodyContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool { - return HTTPBodyContainsf(a.t, handler, method, url, values, str, msg, args...) -} // HTTPBodyNotContains asserts that a specified handler returns a // body that does not contain a string. -// +// // a.HTTPBodyNotContains(myHandler, "www.google.com", nil, "I'm Feeling Lucky") -// +// // Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool { - return HTTPBodyNotContains(a.t, handler, method, url, values, str, msgAndArgs...) +func (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) bool { + return HTTPBodyNotContains(a.t, handler, method, url, values, str) } -// HTTPBodyNotContainsf asserts that a specified handler returns a -// body that does not contain a string. -// -// a.HTTPBodyNotContainsf(myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPBodyNotContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool { - return HTTPBodyNotContainsf(a.t, handler, method, url, values, str, msg, args...) -} // HTTPError asserts that a specified handler returns an error status code. -// +// // a.HTTPError(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} -// +// // Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) bool { - return HTTPError(a.t, handler, method, url, values, msgAndArgs...) +func (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url string, values url.Values) bool { + return HTTPError(a.t, handler, method, url, values) } -// HTTPErrorf asserts that a specified handler returns an error status code. -// -// a.HTTPErrorf(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} -// -// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). -func (a *Assertions) HTTPErrorf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { - return HTTPErrorf(a.t, handler, method, url, values, msg, args...) -} // HTTPRedirect asserts that a specified handler returns a redirect status code. -// +// // a.HTTPRedirect(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} -// +// // Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) bool { - return HTTPRedirect(a.t, handler, method, url, values, msgAndArgs...) +func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url string, values url.Values) bool { + return HTTPRedirect(a.t, handler, method, url, values) } -// HTTPRedirectf asserts that a specified handler returns a redirect status code. -// -// a.HTTPRedirectf(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} -// -// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). -func (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { - return HTTPRedirectf(a.t, handler, method, url, values, msg, args...) -} // HTTPSuccess asserts that a specified handler returns a success status code. -// +// // a.HTTPSuccess(myHandler, "POST", "http://www.google.com", nil) -// +// // Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPSuccess(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) bool { - return HTTPSuccess(a.t, handler, method, url, values, msgAndArgs...) +func (a *Assertions) HTTPSuccess(handler http.HandlerFunc, method string, url string, values url.Values) bool { + return HTTPSuccess(a.t, handler, method, url, values) } -// HTTPSuccessf asserts that a specified handler returns a success status code. -// -// a.HTTPSuccessf(myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPSuccessf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { - return HTTPSuccessf(a.t, handler, method, url, values, msg, args...) -} // Implements asserts that an object is implemented by the specified interface. -// -// a.Implements((*MyInterface)(nil), new(MyObject)) +// +// a.Implements((*MyInterface)(nil), new(MyObject), "MyObject") func (a *Assertions) Implements(interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool { return Implements(a.t, interfaceObject, object, msgAndArgs...) } -// Implementsf asserts that an object is implemented by the specified interface. -// -// a.Implementsf((*MyInterface, "error message %s", "formatted")(nil), new(MyObject)) -func (a *Assertions) Implementsf(interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool { - return Implementsf(a.t, interfaceObject, object, msg, args...) -} // InDelta asserts that the two numerals are within delta of each other. -// +// // a.InDelta(math.Pi, (22 / 7.0), 0.01) +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) InDelta(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { return InDelta(a.t, expected, actual, delta, msgAndArgs...) } -// InDeltaMapValues is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys. -func (a *Assertions) InDeltaMapValues(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { - return InDeltaMapValues(a.t, expected, actual, delta, msgAndArgs...) -} - -// InDeltaMapValuesf is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys. -func (a *Assertions) InDeltaMapValuesf(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { - return InDeltaMapValuesf(a.t, expected, actual, delta, msg, args...) -} // InDeltaSlice is the same as InDelta, except it compares two slices. func (a *Assertions) InDeltaSlice(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { return InDeltaSlice(a.t, expected, actual, delta, msgAndArgs...) } -// InDeltaSlicef is the same as InDelta, except it compares two slices. -func (a *Assertions) InDeltaSlicef(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { - return InDeltaSlicef(a.t, expected, actual, delta, msg, args...) -} - -// InDeltaf asserts that the two numerals are within delta of each other. -// -// a.InDeltaf(math.Pi, (22 / 7.0, "error message %s", "formatted"), 0.01) -func (a *Assertions) InDeltaf(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { - return InDeltaf(a.t, expected, actual, delta, msg, args...) -} // InEpsilon asserts that expected and actual have a relative error less than epsilon +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) InEpsilon(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool { return InEpsilon(a.t, expected, actual, epsilon, msgAndArgs...) } -// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices. -func (a *Assertions) InEpsilonSlice(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool { - return InEpsilonSlice(a.t, expected, actual, epsilon, msgAndArgs...) -} -// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices. -func (a *Assertions) InEpsilonSlicef(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool { - return InEpsilonSlicef(a.t, expected, actual, epsilon, msg, args...) +// InEpsilonSlice is the same as InEpsilon, except it compares two slices. +func (a *Assertions) InEpsilonSlice(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { + return InEpsilonSlice(a.t, expected, actual, delta, msgAndArgs...) } -// InEpsilonf asserts that expected and actual have a relative error less than epsilon -func (a *Assertions) InEpsilonf(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool { - return InEpsilonf(a.t, expected, actual, epsilon, msg, args...) -} // IsType asserts that the specified objects are of the same type. func (a *Assertions) IsType(expectedType interface{}, object interface{}, msgAndArgs ...interface{}) bool { return IsType(a.t, expectedType, object, msgAndArgs...) } -// IsTypef asserts that the specified objects are of the same type. -func (a *Assertions) IsTypef(expectedType interface{}, object interface{}, msg string, args ...interface{}) bool { - return IsTypef(a.t, expectedType, object, msg, args...) -} // JSONEq asserts that two JSON strings are equivalent. -// +// // a.JSONEq(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) JSONEq(expected string, actual string, msgAndArgs ...interface{}) bool { return JSONEq(a.t, expected, actual, msgAndArgs...) } -// JSONEqf asserts that two JSON strings are equivalent. -// -// a.JSONEqf(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted") -func (a *Assertions) JSONEqf(expected string, actual string, msg string, args ...interface{}) bool { - return JSONEqf(a.t, expected, actual, msg, args...) -} // Len asserts that the specified object has specific length. // Len also fails if the object has a type that len() not accept. -// -// a.Len(mySlice, 3) +// +// a.Len(mySlice, 3, "The size of slice is not 3") +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) Len(object interface{}, length int, msgAndArgs ...interface{}) bool { return Len(a.t, object, length, msgAndArgs...) } -// Lenf asserts that the specified object has specific length. -// Lenf also fails if the object has a type that len() not accept. -// -// a.Lenf(mySlice, 3, "error message %s", "formatted") -func (a *Assertions) Lenf(object interface{}, length int, msg string, args ...interface{}) bool { - return Lenf(a.t, object, length, msg, args...) -} // Nil asserts that the specified object is nil. -// -// a.Nil(err) +// +// a.Nil(err, "err should be nothing") +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) Nil(object interface{}, msgAndArgs ...interface{}) bool { return Nil(a.t, object, msgAndArgs...) } -// Nilf asserts that the specified object is nil. -// -// a.Nilf(err, "error message %s", "formatted") -func (a *Assertions) Nilf(object interface{}, msg string, args ...interface{}) bool { - return Nilf(a.t, object, msg, args...) -} // NoError asserts that a function returned no error (i.e. `nil`). -// +// // actualObj, err := SomeFunction() // if a.NoError(err) { -// assert.Equal(t, expectedObj, actualObj) +// assert.Equal(t, actualObj, expectedObj) // } +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) NoError(err error, msgAndArgs ...interface{}) bool { return NoError(a.t, err, msgAndArgs...) } -// NoErrorf asserts that a function returned no error (i.e. `nil`). -// -// actualObj, err := SomeFunction() -// if a.NoErrorf(err, "error message %s", "formatted") { -// assert.Equal(t, expectedObj, actualObj) -// } -func (a *Assertions) NoErrorf(err error, msg string, args ...interface{}) bool { - return NoErrorf(a.t, err, msg, args...) -} // NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the // specified substring or element. -// -// a.NotContains("Hello World", "Earth") -// a.NotContains(["Hello", "World"], "Earth") -// a.NotContains({"Hello": "World"}, "Earth") +// +// a.NotContains("Hello World", "Earth", "But 'Hello World' does NOT contain 'Earth'") +// a.NotContains(["Hello", "World"], "Earth", "But ['Hello', 'World'] does NOT contain 'Earth'") +// a.NotContains({"Hello": "World"}, "Earth", "But {'Hello': 'World'} does NOT contain 'Earth'") +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) NotContains(s interface{}, contains interface{}, msgAndArgs ...interface{}) bool { return NotContains(a.t, s, contains, msgAndArgs...) } -// NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the -// specified substring or element. -// -// a.NotContainsf("Hello World", "Earth", "error message %s", "formatted") -// a.NotContainsf(["Hello", "World"], "Earth", "error message %s", "formatted") -// a.NotContainsf({"Hello": "World"}, "Earth", "error message %s", "formatted") -func (a *Assertions) NotContainsf(s interface{}, contains interface{}, msg string, args ...interface{}) bool { - return NotContainsf(a.t, s, contains, msg, args...) -} // NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either // a slice or a channel with len == 0. -// +// // if a.NotEmpty(obj) { // assert.Equal(t, "two", obj[1]) // } +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) NotEmpty(object interface{}, msgAndArgs ...interface{}) bool { return NotEmpty(a.t, object, msgAndArgs...) } -// NotEmptyf asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either -// a slice or a channel with len == 0. -// -// if a.NotEmptyf(obj, "error message %s", "formatted") { -// assert.Equal(t, "two", obj[1]) -// } -func (a *Assertions) NotEmptyf(object interface{}, msg string, args ...interface{}) bool { - return NotEmptyf(a.t, object, msg, args...) -} // NotEqual asserts that the specified values are NOT equal. -// -// a.NotEqual(obj1, obj2) -// -// Pointer variable equality is determined based on the equality of the -// referenced values (as opposed to the memory addresses). +// +// a.NotEqual(obj1, obj2, "two objects shouldn't be equal") +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) NotEqual(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { return NotEqual(a.t, expected, actual, msgAndArgs...) } -// NotEqualf asserts that the specified values are NOT equal. -// -// a.NotEqualf(obj1, obj2, "error message %s", "formatted") -// -// Pointer variable equality is determined based on the equality of the -// referenced values (as opposed to the memory addresses). -func (a *Assertions) NotEqualf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { - return NotEqualf(a.t, expected, actual, msg, args...) -} // NotNil asserts that the specified object is not nil. -// -// a.NotNil(err) +// +// a.NotNil(err, "err should be something") +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) NotNil(object interface{}, msgAndArgs ...interface{}) bool { return NotNil(a.t, object, msgAndArgs...) } -// NotNilf asserts that the specified object is not nil. -// -// a.NotNilf(err, "error message %s", "formatted") -func (a *Assertions) NotNilf(object interface{}, msg string, args ...interface{}) bool { - return NotNilf(a.t, object, msg, args...) -} // NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic. -// -// a.NotPanics(func(){ RemainCalm() }) +// +// a.NotPanics(func(){ +// RemainCalm() +// }, "Calling RemainCalm() should NOT panic") +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) NotPanics(f PanicTestFunc, msgAndArgs ...interface{}) bool { return NotPanics(a.t, f, msgAndArgs...) } -// NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic. -// -// a.NotPanicsf(func(){ RemainCalm() }, "error message %s", "formatted") -func (a *Assertions) NotPanicsf(f PanicTestFunc, msg string, args ...interface{}) bool { - return NotPanicsf(a.t, f, msg, args...) -} // NotRegexp asserts that a specified regexp does not match a string. -// +// // a.NotRegexp(regexp.MustCompile("starts"), "it's starting") // a.NotRegexp("^start", "it's not starting") +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { return NotRegexp(a.t, rx, str, msgAndArgs...) } -// NotRegexpf asserts that a specified regexp does not match a string. -// -// a.NotRegexpf(regexp.MustCompile("starts", "error message %s", "formatted"), "it's starting") -// a.NotRegexpf("^start", "it's not starting", "error message %s", "formatted") -func (a *Assertions) NotRegexpf(rx interface{}, str interface{}, msg string, args ...interface{}) bool { - return NotRegexpf(a.t, rx, str, msg, args...) -} - -// NotSubset asserts that the specified list(array, slice...) contains not all -// elements given in the specified subset(array, slice...). -// -// a.NotSubset([1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]") -func (a *Assertions) NotSubset(list interface{}, subset interface{}, msgAndArgs ...interface{}) bool { - return NotSubset(a.t, list, subset, msgAndArgs...) -} -// NotSubsetf asserts that the specified list(array, slice...) contains not all -// elements given in the specified subset(array, slice...). -// -// a.NotSubsetf([1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted") -func (a *Assertions) NotSubsetf(list interface{}, subset interface{}, msg string, args ...interface{}) bool { - return NotSubsetf(a.t, list, subset, msg, args...) -} - -// NotZero asserts that i is not the zero value for its type. +// NotZero asserts that i is not the zero value for its type and returns the truth. func (a *Assertions) NotZero(i interface{}, msgAndArgs ...interface{}) bool { return NotZero(a.t, i, msgAndArgs...) } -// NotZerof asserts that i is not the zero value for its type. -func (a *Assertions) NotZerof(i interface{}, msg string, args ...interface{}) bool { - return NotZerof(a.t, i, msg, args...) -} // Panics asserts that the code inside the specified PanicTestFunc panics. -// -// a.Panics(func(){ GoCrazy() }) +// +// a.Panics(func(){ +// GoCrazy() +// }, "Calling GoCrazy() should panic") +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) Panics(f PanicTestFunc, msgAndArgs ...interface{}) bool { return Panics(a.t, f, msgAndArgs...) } -// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that -// the recovered panic value equals the expected panic value. -// -// a.PanicsWithValue("crazy error", func(){ GoCrazy() }) -func (a *Assertions) PanicsWithValue(expected interface{}, f PanicTestFunc, msgAndArgs ...interface{}) bool { - return PanicsWithValue(a.t, expected, f, msgAndArgs...) -} - -// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that -// the recovered panic value equals the expected panic value. -// -// a.PanicsWithValuef("crazy error", func(){ GoCrazy() }, "error message %s", "formatted") -func (a *Assertions) PanicsWithValuef(expected interface{}, f PanicTestFunc, msg string, args ...interface{}) bool { - return PanicsWithValuef(a.t, expected, f, msg, args...) -} - -// Panicsf asserts that the code inside the specified PanicTestFunc panics. -// -// a.Panicsf(func(){ GoCrazy() }, "error message %s", "formatted") -func (a *Assertions) Panicsf(f PanicTestFunc, msg string, args ...interface{}) bool { - return Panicsf(a.t, f, msg, args...) -} // Regexp asserts that a specified regexp matches a string. -// +// // a.Regexp(regexp.MustCompile("start"), "it's starting") // a.Regexp("start...$", "it's not starting") +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { return Regexp(a.t, rx, str, msgAndArgs...) } -// Regexpf asserts that a specified regexp matches a string. -// -// a.Regexpf(regexp.MustCompile("start", "error message %s", "formatted"), "it's starting") -// a.Regexpf("start...$", "it's not starting", "error message %s", "formatted") -func (a *Assertions) Regexpf(rx interface{}, str interface{}, msg string, args ...interface{}) bool { - return Regexpf(a.t, rx, str, msg, args...) -} - -// Subset asserts that the specified list(array, slice...) contains all -// elements given in the specified subset(array, slice...). -// -// a.Subset([1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]") -func (a *Assertions) Subset(list interface{}, subset interface{}, msgAndArgs ...interface{}) bool { - return Subset(a.t, list, subset, msgAndArgs...) -} - -// Subsetf asserts that the specified list(array, slice...) contains all -// elements given in the specified subset(array, slice...). -// -// a.Subsetf([1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted") -func (a *Assertions) Subsetf(list interface{}, subset interface{}, msg string, args ...interface{}) bool { - return Subsetf(a.t, list, subset, msg, args...) -} // True asserts that the specified value is true. -// -// a.True(myBool) +// +// a.True(myBool, "myBool should be true") +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) True(value bool, msgAndArgs ...interface{}) bool { return True(a.t, value, msgAndArgs...) } -// Truef asserts that the specified value is true. -// -// a.Truef(myBool, "error message %s", "formatted") -func (a *Assertions) Truef(value bool, msg string, args ...interface{}) bool { - return Truef(a.t, value, msg, args...) -} // WithinDuration asserts that the two times are within duration delta of each other. -// -// a.WithinDuration(time.Now(), time.Now(), 10*time.Second) +// +// a.WithinDuration(time.Now(), time.Now(), 10*time.Second, "The difference should not be more than 10s") +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) WithinDuration(expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) bool { return WithinDuration(a.t, expected, actual, delta, msgAndArgs...) } -// WithinDurationf asserts that the two times are within duration delta of each other. -// -// a.WithinDurationf(time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted") -func (a *Assertions) WithinDurationf(expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) bool { - return WithinDurationf(a.t, expected, actual, delta, msg, args...) -} -// Zero asserts that i is the zero value for its type. +// Zero asserts that i is the zero value for its type and returns the truth. func (a *Assertions) Zero(i interface{}, msgAndArgs ...interface{}) bool { return Zero(a.t, i, msgAndArgs...) } - -// Zerof asserts that i is the zero value for its type. -func (a *Assertions) Zerof(i interface{}, msg string, args ...interface{}) bool { - return Zerof(a.t, i, msg, args...) -} diff --git a/vendor/github.com/stretchr/testify/assert/assertions.go b/vendor/github.com/stretchr/testify/assert/assertions.go index 47bda7786..b3f4e170d 100644 --- a/vendor/github.com/stretchr/testify/assert/assertions.go +++ b/vendor/github.com/stretchr/testify/assert/assertions.go @@ -4,10 +4,8 @@ import ( "bufio" "bytes" "encoding/json" - "errors" "fmt" "math" - "os" "reflect" "regexp" "runtime" @@ -20,7 +18,9 @@ import ( "github.com/pmezard/go-difflib/difflib" ) -//go:generate go run ../_codegen/main.go -output-package=assert -template=assertion_format.go.tmpl +func init() { + spew.Config.SortKeys = true +} // TestingT is an interface wrapper around *testing.T type TestingT interface { @@ -42,15 +42,7 @@ func ObjectsAreEqual(expected, actual interface{}) bool { if expected == nil || actual == nil { return expected == actual } - if exp, ok := expected.([]byte); ok { - act, ok := actual.([]byte) - if !ok { - return false - } else if exp == nil || act == nil { - return exp == nil && act == nil - } - return bytes.Equal(exp, act) - } + return reflect.DeepEqual(expected, actual) } @@ -120,12 +112,10 @@ func CallerInfo() []string { } parts := strings.Split(file, "/") + dir := parts[len(parts)-2] file = parts[len(parts)-1] - if len(parts) > 1 { - dir := parts[len(parts)-2] - if (dir != "assert" && dir != "mock" && dir != "require") || file == "mock_test.go" { - callers = append(callers, fmt.Sprintf("%s:%d", file, line)) - } + if (dir != "assert" && dir != "mock" && dir != "require") || file == "mock_test.go" { + callers = append(callers, fmt.Sprintf("%s:%d", file, line)) } // Drop the package @@ -167,7 +157,7 @@ func getWhitespaceString() string { parts := strings.Split(file, "/") file = parts[len(parts)-1] - return strings.Repeat(" ", len(fmt.Sprintf("%s:%d: ", file, line))) + return strings.Repeat(" ", len(fmt.Sprintf("%s:%d: ", file, line))) } @@ -184,18 +174,22 @@ func messageFromMsgAndArgs(msgAndArgs ...interface{}) string { return "" } -// Aligns the provided message so that all lines after the first line start at the same location as the first line. -// Assumes that the first line starts at the correct location (after carriage return, tab, label, spacer and tab). -// The longestLabelLen parameter specifies the length of the longest label in the output (required becaues this is the -// basis on which the alignment occurs). -func indentMessageLines(message string, longestLabelLen int) string { +// Indents all lines of the message by appending a number of tabs to each line, in an output format compatible with Go's +// test printing (see inner comment for specifics) +func indentMessageLines(message string, tabs int) string { outBuf := new(bytes.Buffer) for i, scanner := 0, bufio.NewScanner(strings.NewReader(message)); scanner.Scan(); i++ { - // no need to align first line because it starts at the correct location (after the label) if i != 0 { - // append alignLen+1 spaces to align with "{{longestLabel}}:" before adding tab - outBuf.WriteString("\n\r\t" + strings.Repeat(" ", longestLabelLen+1) + "\t") + outBuf.WriteRune('\n') + } + for ii := 0; ii < tabs; ii++ { + outBuf.WriteRune('\t') + // Bizarrely, all lines except the first need one fewer tabs prepended, so deliberately advance the counter + // by 1 prematurely. + if ii == 0 && i > 0 { + ii++ + } } outBuf.WriteString(scanner.Text()) } @@ -227,70 +221,42 @@ func FailNow(t TestingT, failureMessage string, msgAndArgs ...interface{}) bool // Fail reports a failure through func Fail(t TestingT, failureMessage string, msgAndArgs ...interface{}) bool { - content := []labeledContent{ - {"Error Trace", strings.Join(CallerInfo(), "\n\r\t\t\t")}, - {"Error", failureMessage}, - } - - // Add test name if the Go version supports it - if n, ok := t.(interface { - Name() string - }); ok { - content = append(content, labeledContent{"Test", n.Name()}) - } message := messageFromMsgAndArgs(msgAndArgs...) + + errorTrace := strings.Join(CallerInfo(), "\n\r\t\t\t") if len(message) > 0 { - content = append(content, labeledContent{"Messages", message}) + t.Errorf("\r%s\r\tError Trace:\t%s\n"+ + "\r\tError:%s\n"+ + "\r\tMessages:\t%s\n\r", + getWhitespaceString(), + errorTrace, + indentMessageLines(failureMessage, 2), + message) + } else { + t.Errorf("\r%s\r\tError Trace:\t%s\n"+ + "\r\tError:%s\n\r", + getWhitespaceString(), + errorTrace, + indentMessageLines(failureMessage, 2)) } - t.Errorf("%s", "\r"+getWhitespaceString()+labeledOutput(content...)) - return false } -type labeledContent struct { - label string - content string -} - -// labeledOutput returns a string consisting of the provided labeledContent. Each labeled output is appended in the following manner: -// -// \r\t{{label}}:{{align_spaces}}\t{{content}}\n -// -// The initial carriage return is required to undo/erase any padding added by testing.T.Errorf. The "\t{{label}}:" is for the label. -// If a label is shorter than the longest label provided, padding spaces are added to make all the labels match in length. Once this -// alignment is achieved, "\t{{content}}\n" is added for the output. -// -// If the content of the labeledOutput contains line breaks, the subsequent lines are aligned so that they start at the same location as the first line. -func labeledOutput(content ...labeledContent) string { - longestLabel := 0 - for _, v := range content { - if len(v.label) > longestLabel { - longestLabel = len(v.label) - } - } - var output string - for _, v := range content { - output += "\r\t" + v.label + ":" + strings.Repeat(" ", longestLabel-len(v.label)) + "\t" + indentMessageLines(v.content, longestLabel) + "\n" - } - return output -} - // Implements asserts that an object is implemented by the specified interface. // -// assert.Implements(t, (*MyInterface)(nil), new(MyObject)) +// assert.Implements(t, (*MyInterface)(nil), new(MyObject), "MyObject") func Implements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool { + interfaceType := reflect.TypeOf(interfaceObject).Elem() - if object == nil { - return Fail(t, fmt.Sprintf("Cannot check if nil implements %v", interfaceType), msgAndArgs...) - } if !reflect.TypeOf(object).Implements(interfaceType) { return Fail(t, fmt.Sprintf("%T must implement %v", object, interfaceType), msgAndArgs...) } return true + } // IsType asserts that the specified objects are of the same type. @@ -305,23 +271,16 @@ func IsType(t TestingT, expectedType interface{}, object interface{}, msgAndArgs // Equal asserts that two objects are equal. // -// assert.Equal(t, 123, 123) +// assert.Equal(t, 123, 123, "123 and 123 should be equal") // -// Pointer variable equality is determined based on the equality of the -// referenced values (as opposed to the memory addresses). Function equality -// cannot be determined and will always fail. +// Returns whether the assertion was successful (true) or not (false). func Equal(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { - if err := validateEqualArgs(expected, actual); err != nil { - return Fail(t, fmt.Sprintf("Invalid operation: %#v == %#v (%s)", - expected, actual, err), msgAndArgs...) - } if !ObjectsAreEqual(expected, actual) { diff := diff(expected, actual) expected, actual = formatUnequalValues(expected, actual) - return Fail(t, fmt.Sprintf("Not equal: \n"+ - "expected: %s\n"+ - "actual : %s%s", expected, actual, diff), msgAndArgs...) + return Fail(t, fmt.Sprintf("Not equal: %s (expected)\n"+ + " != %s (actual)%s", expected, actual, diff), msgAndArgs...) } return true @@ -335,36 +294,53 @@ func Equal(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) // with the type name, and the value will be enclosed in parenthesis similar // to a type conversion in the Go grammar. func formatUnequalValues(expected, actual interface{}) (e string, a string) { - if reflect.TypeOf(expected) != reflect.TypeOf(actual) { - return fmt.Sprintf("%T(%#v)", expected, expected), - fmt.Sprintf("%T(%#v)", actual, actual) + aType := reflect.TypeOf(expected) + bType := reflect.TypeOf(actual) + + if aType != bType && isNumericType(aType) && isNumericType(bType) { + return fmt.Sprintf("%v(%#v)", aType, expected), + fmt.Sprintf("%v(%#v)", bType, actual) } return fmt.Sprintf("%#v", expected), fmt.Sprintf("%#v", actual) } +func isNumericType(t reflect.Type) bool { + switch t.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return true + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + return true + case reflect.Float32, reflect.Float64: + return true + } + + return false +} + // EqualValues asserts that two objects are equal or convertable to the same types // and equal. // -// assert.EqualValues(t, uint32(123), int32(123)) +// assert.EqualValues(t, uint32(123), int32(123), "123 and 123 should be equal") +// +// Returns whether the assertion was successful (true) or not (false). func EqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { if !ObjectsAreEqualValues(expected, actual) { - diff := diff(expected, actual) - expected, actual = formatUnequalValues(expected, actual) - return Fail(t, fmt.Sprintf("Not equal: \n"+ - "expected: %s\n"+ - "actual : %s%s", expected, actual, diff), msgAndArgs...) + return Fail(t, fmt.Sprintf("Not equal: %#v (expected)\n"+ + " != %#v (actual)", expected, actual), msgAndArgs...) } return true } -// Exactly asserts that two objects are equal in value and type. +// Exactly asserts that two objects are equal is value and type. +// +// assert.Exactly(t, int32(123), int64(123), "123 and 123 should NOT be equal") // -// assert.Exactly(t, int32(123), int64(123)) +// Returns whether the assertion was successful (true) or not (false). func Exactly(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { aType := reflect.TypeOf(expected) @@ -380,7 +356,9 @@ func Exactly(t TestingT, expected, actual interface{}, msgAndArgs ...interface{} // NotNil asserts that the specified object is not nil. // -// assert.NotNil(t, err) +// assert.NotNil(t, err, "err should be something") +// +// Returns whether the assertion was successful (true) or not (false). func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { if !isNil(object) { return true @@ -405,7 +383,9 @@ func isNil(object interface{}) bool { // Nil asserts that the specified object is nil. // -// assert.Nil(t, err) +// assert.Nil(t, err, "err should be nothing") +// +// Returns whether the assertion was successful (true) or not (false). func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { if isNil(object) { return true @@ -413,38 +393,74 @@ func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { return Fail(t, fmt.Sprintf("Expected nil, but got: %#v", object), msgAndArgs...) } +var numericZeros = []interface{}{ + int(0), + int8(0), + int16(0), + int32(0), + int64(0), + uint(0), + uint8(0), + uint16(0), + uint32(0), + uint64(0), + float32(0), + float64(0), +} + // isEmpty gets whether the specified object is considered empty or not. func isEmpty(object interface{}) bool { - // get nil case out of the way if object == nil { return true + } else if object == "" { + return true + } else if object == false { + return true + } + + for _, v := range numericZeros { + if object == v { + return true + } } objValue := reflect.ValueOf(object) switch objValue.Kind() { - // collection types are empty when they have no element - case reflect.Array, reflect.Chan, reflect.Map, reflect.Slice: - return objValue.Len() == 0 - // pointers are empty if nil or if the value they point to is empty + case reflect.Map: + fallthrough + case reflect.Slice, reflect.Chan: + { + return (objValue.Len() == 0) + } + case reflect.Struct: + switch object.(type) { + case time.Time: + return object.(time.Time).IsZero() + } case reflect.Ptr: - if objValue.IsNil() { - return true + { + if objValue.IsNil() { + return true + } + switch object.(type) { + case *time.Time: + return object.(*time.Time).IsZero() + default: + return false + } } - deref := objValue.Elem().Interface() - return isEmpty(deref) - // for all other types, compare against the zero value - default: - zero := reflect.Zero(objValue.Type()) - return reflect.DeepEqual(object, zero.Interface()) } + return false } // Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either // a slice or a channel with len == 0. // // assert.Empty(t, obj) +// +// Returns whether the assertion was successful (true) or not (false). func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { pass := isEmpty(object) @@ -462,6 +478,8 @@ func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { // if assert.NotEmpty(t, obj) { // assert.Equal(t, "two", obj[1]) // } +// +// Returns whether the assertion was successful (true) or not (false). func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { pass := !isEmpty(object) @@ -488,7 +506,9 @@ func getLen(x interface{}) (ok bool, length int) { // Len asserts that the specified object has specific length. // Len also fails if the object has a type that len() not accept. // -// assert.Len(t, mySlice, 3) +// assert.Len(t, mySlice, 3, "The size of slice is not 3") +// +// Returns whether the assertion was successful (true) or not (false). func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) bool { ok, l := getLen(object) if !ok { @@ -503,7 +523,9 @@ func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) // True asserts that the specified value is true. // -// assert.True(t, myBool) +// assert.True(t, myBool, "myBool should be true") +// +// Returns whether the assertion was successful (true) or not (false). func True(t TestingT, value bool, msgAndArgs ...interface{}) bool { if value != true { @@ -516,7 +538,9 @@ func True(t TestingT, value bool, msgAndArgs ...interface{}) bool { // False asserts that the specified value is false. // -// assert.False(t, myBool) +// assert.False(t, myBool, "myBool should be false") +// +// Returns whether the assertion was successful (true) or not (false). func False(t TestingT, value bool, msgAndArgs ...interface{}) bool { if value != false { @@ -529,15 +553,10 @@ func False(t TestingT, value bool, msgAndArgs ...interface{}) bool { // NotEqual asserts that the specified values are NOT equal. // -// assert.NotEqual(t, obj1, obj2) +// assert.NotEqual(t, obj1, obj2, "two objects shouldn't be equal") // -// Pointer variable equality is determined based on the equality of the -// referenced values (as opposed to the memory addresses). +// Returns whether the assertion was successful (true) or not (false). func NotEqual(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { - if err := validateEqualArgs(expected, actual); err != nil { - return Fail(t, fmt.Sprintf("Invalid operation: %#v != %#v (%s)", - expected, actual, err), msgAndArgs...) - } if ObjectsAreEqual(expected, actual) { return Fail(t, fmt.Sprintf("Should not be: %#v\n", actual), msgAndArgs...) @@ -588,9 +607,11 @@ func includeElement(list interface{}, element interface{}) (ok, found bool) { // Contains asserts that the specified string, list(array, slice...) or map contains the // specified substring or element. // -// assert.Contains(t, "Hello World", "World") -// assert.Contains(t, ["Hello", "World"], "World") -// assert.Contains(t, {"Hello": "World"}, "Hello") +// assert.Contains(t, "Hello World", "World", "But 'Hello World' does contain 'World'") +// assert.Contains(t, ["Hello", "World"], "World", "But ["Hello", "World"] does contain 'World'") +// assert.Contains(t, {"Hello": "World"}, "Hello", "But {'Hello': 'World'} does contain 'Hello'") +// +// Returns whether the assertion was successful (true) or not (false). func Contains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bool { ok, found := includeElement(s, contains) @@ -608,9 +629,11 @@ func Contains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bo // NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the // specified substring or element. // -// assert.NotContains(t, "Hello World", "Earth") -// assert.NotContains(t, ["Hello", "World"], "Earth") -// assert.NotContains(t, {"Hello": "World"}, "Earth") +// assert.NotContains(t, "Hello World", "Earth", "But 'Hello World' does NOT contain 'Earth'") +// assert.NotContains(t, ["Hello", "World"], "Earth", "But ['Hello', 'World'] does NOT contain 'Earth'") +// assert.NotContains(t, {"Hello": "World"}, "Earth", "But {'Hello': 'World'} does NOT contain 'Earth'") +// +// Returns whether the assertion was successful (true) or not (false). func NotContains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bool { ok, found := includeElement(s, contains) @@ -625,142 +648,6 @@ func NotContains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) } -// Subset asserts that the specified list(array, slice...) contains all -// elements given in the specified subset(array, slice...). -// -// assert.Subset(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]") -func Subset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok bool) { - if subset == nil { - return true // we consider nil to be equal to the nil set - } - - subsetValue := reflect.ValueOf(subset) - defer func() { - if e := recover(); e != nil { - ok = false - } - }() - - listKind := reflect.TypeOf(list).Kind() - subsetKind := reflect.TypeOf(subset).Kind() - - if listKind != reflect.Array && listKind != reflect.Slice { - return Fail(t, fmt.Sprintf("%q has an unsupported type %s", list, listKind), msgAndArgs...) - } - - if subsetKind != reflect.Array && subsetKind != reflect.Slice { - return Fail(t, fmt.Sprintf("%q has an unsupported type %s", subset, subsetKind), msgAndArgs...) - } - - for i := 0; i < subsetValue.Len(); i++ { - element := subsetValue.Index(i).Interface() - ok, found := includeElement(list, element) - if !ok { - return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", list), msgAndArgs...) - } - if !found { - return Fail(t, fmt.Sprintf("\"%s\" does not contain \"%s\"", list, element), msgAndArgs...) - } - } - - return true -} - -// NotSubset asserts that the specified list(array, slice...) contains not all -// elements given in the specified subset(array, slice...). -// -// assert.NotSubset(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]") -func NotSubset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok bool) { - if subset == nil { - return Fail(t, fmt.Sprintf("nil is the empty set which is a subset of every set"), msgAndArgs...) - } - - subsetValue := reflect.ValueOf(subset) - defer func() { - if e := recover(); e != nil { - ok = false - } - }() - - listKind := reflect.TypeOf(list).Kind() - subsetKind := reflect.TypeOf(subset).Kind() - - if listKind != reflect.Array && listKind != reflect.Slice { - return Fail(t, fmt.Sprintf("%q has an unsupported type %s", list, listKind), msgAndArgs...) - } - - if subsetKind != reflect.Array && subsetKind != reflect.Slice { - return Fail(t, fmt.Sprintf("%q has an unsupported type %s", subset, subsetKind), msgAndArgs...) - } - - for i := 0; i < subsetValue.Len(); i++ { - element := subsetValue.Index(i).Interface() - ok, found := includeElement(list, element) - if !ok { - return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", list), msgAndArgs...) - } - if !found { - return true - } - } - - return Fail(t, fmt.Sprintf("%q is a subset of %q", subset, list), msgAndArgs...) -} - -// ElementsMatch asserts that the specified listA(array, slice...) is equal to specified -// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, -// the number of appearances of each of them in both lists should match. -// -// assert.ElementsMatch(t, [1, 3, 2, 3], [1, 3, 3, 2]) -func ElementsMatch(t TestingT, listA, listB interface{}, msgAndArgs ...interface{}) (ok bool) { - if isEmpty(listA) && isEmpty(listB) { - return true - } - - aKind := reflect.TypeOf(listA).Kind() - bKind := reflect.TypeOf(listB).Kind() - - if aKind != reflect.Array && aKind != reflect.Slice { - return Fail(t, fmt.Sprintf("%q has an unsupported type %s", listA, aKind), msgAndArgs...) - } - - if bKind != reflect.Array && bKind != reflect.Slice { - return Fail(t, fmt.Sprintf("%q has an unsupported type %s", listB, bKind), msgAndArgs...) - } - - aValue := reflect.ValueOf(listA) - bValue := reflect.ValueOf(listB) - - aLen := aValue.Len() - bLen := bValue.Len() - - if aLen != bLen { - return Fail(t, fmt.Sprintf("lengths don't match: %d != %d", aLen, bLen), msgAndArgs...) - } - - // Mark indexes in bValue that we already used - visited := make([]bool, bLen) - for i := 0; i < aLen; i++ { - element := aValue.Index(i).Interface() - found := false - for j := 0; j < bLen; j++ { - if visited[j] { - continue - } - if ObjectsAreEqual(bValue.Index(j).Interface(), element) { - visited[j] = true - found = true - break - } - } - if !found { - return Fail(t, fmt.Sprintf("element %s appears more times in %s than in %s", element, aValue, bValue), msgAndArgs...) - } - } - - return true -} - // Condition uses a Comparison to assert a complex condition. func Condition(t TestingT, comp Comparison, msgAndArgs ...interface{}) bool { result := comp() @@ -798,7 +685,11 @@ func didPanic(f PanicTestFunc) (bool, interface{}) { // Panics asserts that the code inside the specified PanicTestFunc panics. // -// assert.Panics(t, func(){ GoCrazy() }) +// assert.Panics(t, func(){ +// GoCrazy() +// }, "Calling GoCrazy() should panic") +// +// Returns whether the assertion was successful (true) or not (false). func Panics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool { if funcDidPanic, panicValue := didPanic(f); !funcDidPanic { @@ -808,26 +699,13 @@ func Panics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool { return true } -// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that -// the recovered panic value equals the expected panic value. -// -// assert.PanicsWithValue(t, "crazy error", func(){ GoCrazy() }) -func PanicsWithValue(t TestingT, expected interface{}, f PanicTestFunc, msgAndArgs ...interface{}) bool { - - funcDidPanic, panicValue := didPanic(f) - if !funcDidPanic { - return Fail(t, fmt.Sprintf("func %#v should panic\n\r\tPanic value:\t%v", f, panicValue), msgAndArgs...) - } - if panicValue != expected { - return Fail(t, fmt.Sprintf("func %#v should panic with value:\t%v\n\r\tPanic value:\t%v", f, expected, panicValue), msgAndArgs...) - } - - return true -} - // NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic. // -// assert.NotPanics(t, func(){ RemainCalm() }) +// assert.NotPanics(t, func(){ +// RemainCalm() +// }, "Calling RemainCalm() should NOT panic") +// +// Returns whether the assertion was successful (true) or not (false). func NotPanics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool { if funcDidPanic, panicValue := didPanic(f); funcDidPanic { @@ -839,7 +717,9 @@ func NotPanics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool { // WithinDuration asserts that the two times are within duration delta of each other. // -// assert.WithinDuration(t, time.Now(), time.Now(), 10*time.Second) +// assert.WithinDuration(t, time.Now(), time.Now(), 10*time.Second, "The difference should not be more than 10s") +// +// Returns whether the assertion was successful (true) or not (false). func WithinDuration(t TestingT, expected, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) bool { dt := expected.Sub(actual) @@ -877,8 +757,6 @@ func toFloat(x interface{}) (float64, bool) { xf = float64(xn) case float64: xf = float64(xn) - case time.Duration: - xf = float64(xn) default: xok = false } @@ -889,6 +767,8 @@ func toFloat(x interface{}) (float64, bool) { // InDelta asserts that the two numerals are within delta of each other. // // assert.InDelta(t, math.Pi, (22 / 7.0), 0.01) +// +// Returns whether the assertion was successful (true) or not (false). func InDelta(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { af, aok := toFloat(expected) @@ -899,7 +779,7 @@ func InDelta(t TestingT, expected, actual interface{}, delta float64, msgAndArgs } if math.IsNaN(af) { - return Fail(t, fmt.Sprintf("Expected must not be NaN"), msgAndArgs...) + return Fail(t, fmt.Sprintf("Actual must not be NaN"), msgAndArgs...) } if math.IsNaN(bf) { @@ -926,7 +806,7 @@ func InDeltaSlice(t TestingT, expected, actual interface{}, delta float64, msgAn expectedSlice := reflect.ValueOf(expected) for i := 0; i < actualSlice.Len(); i++ { - result := InDelta(t, actualSlice.Index(i).Interface(), expectedSlice.Index(i).Interface(), delta, msgAndArgs...) + result := InDelta(t, actualSlice.Index(i).Interface(), expectedSlice.Index(i).Interface(), delta) if !result { return result } @@ -935,47 +815,6 @@ func InDeltaSlice(t TestingT, expected, actual interface{}, delta float64, msgAn return true } -// InDeltaMapValues is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys. -func InDeltaMapValues(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { - if expected == nil || actual == nil || - reflect.TypeOf(actual).Kind() != reflect.Map || - reflect.TypeOf(expected).Kind() != reflect.Map { - return Fail(t, "Arguments must be maps", msgAndArgs...) - } - - expectedMap := reflect.ValueOf(expected) - actualMap := reflect.ValueOf(actual) - - if expectedMap.Len() != actualMap.Len() { - return Fail(t, "Arguments must have the same number of keys", msgAndArgs...) - } - - for _, k := range expectedMap.MapKeys() { - ev := expectedMap.MapIndex(k) - av := actualMap.MapIndex(k) - - if !ev.IsValid() { - return Fail(t, fmt.Sprintf("missing key %q in expected map", k), msgAndArgs...) - } - - if !av.IsValid() { - return Fail(t, fmt.Sprintf("missing key %q in actual map", k), msgAndArgs...) - } - - if !InDelta( - t, - ev.Interface(), - av.Interface(), - delta, - msgAndArgs..., - ) { - return false - } - } - - return true -} - func calcRelativeError(expected, actual interface{}) (float64, error) { af, aok := toFloat(expected) if !aok { @@ -986,13 +825,15 @@ func calcRelativeError(expected, actual interface{}) (float64, error) { } bf, bok := toFloat(actual) if !bok { - return 0, fmt.Errorf("actual value %q cannot be converted to float", actual) + return 0, fmt.Errorf("expected value %q cannot be converted to float", actual) } return math.Abs(af-bf) / math.Abs(af), nil } // InEpsilon asserts that expected and actual have a relative error less than epsilon +// +// Returns whether the assertion was successful (true) or not (false). func InEpsilon(t TestingT, expected, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool { actualEpsilon, err := calcRelativeError(expected, actual) if err != nil { @@ -1000,7 +841,7 @@ func InEpsilon(t TestingT, expected, actual interface{}, epsilon float64, msgAnd } if actualEpsilon > epsilon { return Fail(t, fmt.Sprintf("Relative error is too high: %#v (expected)\n"+ - " < %#v (actual)", epsilon, actualEpsilon), msgAndArgs...) + " < %#v (actual)", actualEpsilon, epsilon), msgAndArgs...) } return true @@ -1035,11 +876,13 @@ func InEpsilonSlice(t TestingT, expected, actual interface{}, epsilon float64, m // // actualObj, err := SomeFunction() // if assert.NoError(t, err) { -// assert.Equal(t, expectedObj, actualObj) +// assert.Equal(t, actualObj, expectedObj) // } +// +// Returns whether the assertion was successful (true) or not (false). func NoError(t TestingT, err error, msgAndArgs ...interface{}) bool { if err != nil { - return Fail(t, fmt.Sprintf("Received unexpected error:\n%+v", err), msgAndArgs...) + return Fail(t, fmt.Sprintf("Received unexpected error %+v", err), msgAndArgs...) } return true @@ -1048,9 +891,11 @@ func NoError(t TestingT, err error, msgAndArgs ...interface{}) bool { // Error asserts that a function returned an error (i.e. not `nil`). // // actualObj, err := SomeFunction() -// if assert.Error(t, err) { -// assert.Equal(t, expectedError, err) +// if assert.Error(t, err, "An error was expected") { +// assert.Equal(t, err, expectedError) // } +// +// Returns whether the assertion was successful (true) or not (false). func Error(t TestingT, err error, msgAndArgs ...interface{}) bool { if err == nil { @@ -1064,20 +909,18 @@ func Error(t TestingT, err error, msgAndArgs ...interface{}) bool { // and that it is equal to the provided error. // // actualObj, err := SomeFunction() -// assert.EqualError(t, err, expectedErrorString) +// assert.EqualError(t, err, expectedErrorString, "An error was expected") +// +// Returns whether the assertion was successful (true) or not (false). func EqualError(t TestingT, theError error, errString string, msgAndArgs ...interface{}) bool { - if !Error(t, theError, msgAndArgs...) { + + message := messageFromMsgAndArgs(msgAndArgs...) + if !NotNil(t, theError, "An error is expected but got nil. %s", message) { return false } - expected := errString - actual := theError.Error() - // don't need to use deep equals here, we know they are both strings - if expected != actual { - return Fail(t, fmt.Sprintf("Error message not equal:\n"+ - "expected: %q\n"+ - "actual : %q", expected, actual), msgAndArgs...) - } - return true + s := "An error with value \"%s\" is expected but got \"%s\". %s" + return Equal(t, errString, theError.Error(), + s, errString, theError.Error(), message) } // matchRegexp return true if a specified regexp matches a string. @@ -1098,6 +941,8 @@ func matchRegexp(rx interface{}, str interface{}) bool { // // assert.Regexp(t, regexp.MustCompile("start"), "it's starting") // assert.Regexp(t, "start...$", "it's not starting") +// +// Returns whether the assertion was successful (true) or not (false). func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { match := matchRegexp(rx, str) @@ -1113,6 +958,8 @@ func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface // // assert.NotRegexp(t, regexp.MustCompile("starts"), "it's starting") // assert.NotRegexp(t, "^start", "it's not starting") +// +// Returns whether the assertion was successful (true) or not (false). func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { match := matchRegexp(rx, str) @@ -1124,7 +971,7 @@ func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interf } -// Zero asserts that i is the zero value for its type. +// Zero asserts that i is the zero value for its type and returns the truth. func Zero(t TestingT, i interface{}, msgAndArgs ...interface{}) bool { if i != nil && !reflect.DeepEqual(i, reflect.Zero(reflect.TypeOf(i)).Interface()) { return Fail(t, fmt.Sprintf("Should be zero, but was %v", i), msgAndArgs...) @@ -1132,7 +979,7 @@ func Zero(t TestingT, i interface{}, msgAndArgs ...interface{}) bool { return true } -// NotZero asserts that i is not the zero value for its type. +// NotZero asserts that i is not the zero value for its type and returns the truth. func NotZero(t TestingT, i interface{}, msgAndArgs ...interface{}) bool { if i == nil || reflect.DeepEqual(i, reflect.Zero(reflect.TypeOf(i)).Interface()) { return Fail(t, fmt.Sprintf("Should not be zero, but was %v", i), msgAndArgs...) @@ -1140,39 +987,11 @@ func NotZero(t TestingT, i interface{}, msgAndArgs ...interface{}) bool { return true } -// FileExists checks whether a file exists in the given path. It also fails if the path points to a directory or there is an error when trying to check the file. -func FileExists(t TestingT, path string, msgAndArgs ...interface{}) bool { - info, err := os.Lstat(path) - if err != nil { - if os.IsNotExist(err) { - return Fail(t, fmt.Sprintf("unable to find file %q", path), msgAndArgs...) - } - return Fail(t, fmt.Sprintf("error when running os.Lstat(%q): %s", path, err), msgAndArgs...) - } - if info.IsDir() { - return Fail(t, fmt.Sprintf("%q is a directory", path), msgAndArgs...) - } - return true -} - -// DirExists checks whether a directory exists in the given path. It also fails if the path is a file rather a directory or there is an error checking whether it exists. -func DirExists(t TestingT, path string, msgAndArgs ...interface{}) bool { - info, err := os.Lstat(path) - if err != nil { - if os.IsNotExist(err) { - return Fail(t, fmt.Sprintf("unable to find file %q", path), msgAndArgs...) - } - return Fail(t, fmt.Sprintf("error when running os.Lstat(%q): %s", path, err), msgAndArgs...) - } - if !info.IsDir() { - return Fail(t, fmt.Sprintf("%q is a file", path), msgAndArgs...) - } - return true -} - // JSONEq asserts that two JSON strings are equivalent. // // assert.JSONEq(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) +// +// Returns whether the assertion was successful (true) or not (false). func JSONEq(t TestingT, expected string, actual string, msgAndArgs ...interface{}) bool { var expectedJSONAsInterface, actualJSONAsInterface interface{} @@ -1216,8 +1035,8 @@ func diff(expected interface{}, actual interface{}) string { return "" } - e := spewConfig.Sdump(expected) - a := spewConfig.Sdump(actual) + e := spew.Sdump(expected) + a := spew.Sdump(actual) diff, _ := difflib.GetUnifiedDiffString(difflib.UnifiedDiff{ A: difflib.SplitLines(e), @@ -1231,26 +1050,3 @@ func diff(expected interface{}, actual interface{}) string { return "\n\nDiff:\n" + diff } - -// validateEqualArgs checks whether provided arguments can be safely used in the -// Equal/NotEqual functions. -func validateEqualArgs(expected, actual interface{}) error { - if isFunction(expected) || isFunction(actual) { - return errors.New("cannot take func type as argument") - } - return nil -} - -func isFunction(arg interface{}) bool { - if arg == nil { - return false - } - return reflect.TypeOf(arg).Kind() == reflect.Func -} - -var spewConfig = spew.ConfigState{ - Indent: " ", - DisablePointerAddresses: true, - DisableCapacities: true, - SortKeys: true, -} diff --git a/vendor/github.com/stretchr/testify/assert/forward_assertions.go b/vendor/github.com/stretchr/testify/assert/forward_assertions.go index 9ad56851d..b867e95ea 100644 --- a/vendor/github.com/stretchr/testify/assert/forward_assertions.go +++ b/vendor/github.com/stretchr/testify/assert/forward_assertions.go @@ -13,4 +13,4 @@ func New(t TestingT) *Assertions { } } -//go:generate go run ../_codegen/main.go -output-package=assert -template=assertion_forward.go.tmpl -include-format-funcs +//go:generate go run ../_codegen/main.go -output-package=assert -template=assertion_forward.go.tmpl diff --git a/vendor/github.com/stretchr/testify/assert/http_assertions.go b/vendor/github.com/stretchr/testify/assert/http_assertions.go index 3101e78dd..fa7ab89b1 100644 --- a/vendor/github.com/stretchr/testify/assert/http_assertions.go +++ b/vendor/github.com/stretchr/testify/assert/http_assertions.go @@ -8,16 +8,16 @@ import ( "strings" ) -// httpCode is a helper that returns HTTP code of the response. It returns -1 and -// an error if building a new request fails. -func httpCode(handler http.HandlerFunc, method, url string, values url.Values) (int, error) { +// httpCode is a helper that returns HTTP code of the response. It returns -1 +// if building a new request fails. +func httpCode(handler http.HandlerFunc, method, url string, values url.Values) int { w := httptest.NewRecorder() req, err := http.NewRequest(method, url+"?"+values.Encode(), nil) if err != nil { - return -1, err + return -1 } handler(w, req) - return w.Code, nil + return w.Code } // HTTPSuccess asserts that a specified handler returns a success status code. @@ -25,19 +25,12 @@ func httpCode(handler http.HandlerFunc, method, url string, values url.Values) ( // assert.HTTPSuccess(t, myHandler, "POST", "http://www.google.com", nil) // // Returns whether the assertion was successful (true) or not (false). -func HTTPSuccess(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, msgAndArgs ...interface{}) bool { - code, err := httpCode(handler, method, url, values) - if err != nil { - Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) +func HTTPSuccess(t TestingT, handler http.HandlerFunc, method, url string, values url.Values) bool { + code := httpCode(handler, method, url, values) + if code == -1 { return false } - - isSuccessCode := code >= http.StatusOK && code <= http.StatusPartialContent - if !isSuccessCode { - Fail(t, fmt.Sprintf("Expected HTTP success status code for %q but received %d", url+"?"+values.Encode(), code)) - } - - return isSuccessCode + return code >= http.StatusOK && code <= http.StatusPartialContent } // HTTPRedirect asserts that a specified handler returns a redirect status code. @@ -45,19 +38,12 @@ func HTTPSuccess(t TestingT, handler http.HandlerFunc, method, url string, value // assert.HTTPRedirect(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} // // Returns whether the assertion was successful (true) or not (false). -func HTTPRedirect(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, msgAndArgs ...interface{}) bool { - code, err := httpCode(handler, method, url, values) - if err != nil { - Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) +func HTTPRedirect(t TestingT, handler http.HandlerFunc, method, url string, values url.Values) bool { + code := httpCode(handler, method, url, values) + if code == -1 { return false } - - isRedirectCode := code >= http.StatusMultipleChoices && code <= http.StatusTemporaryRedirect - if !isRedirectCode { - Fail(t, fmt.Sprintf("Expected HTTP redirect status code for %q but received %d", url+"?"+values.Encode(), code)) - } - - return isRedirectCode + return code >= http.StatusMultipleChoices && code <= http.StatusTemporaryRedirect } // HTTPError asserts that a specified handler returns an error status code. @@ -65,19 +51,12 @@ func HTTPRedirect(t TestingT, handler http.HandlerFunc, method, url string, valu // assert.HTTPError(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} // // Returns whether the assertion was successful (true) or not (false). -func HTTPError(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, msgAndArgs ...interface{}) bool { - code, err := httpCode(handler, method, url, values) - if err != nil { - Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) +func HTTPError(t TestingT, handler http.HandlerFunc, method, url string, values url.Values) bool { + code := httpCode(handler, method, url, values) + if code == -1 { return false } - - isErrorCode := code >= http.StatusBadRequest - if !isErrorCode { - Fail(t, fmt.Sprintf("Expected HTTP error status code for %q but received %d", url+"?"+values.Encode(), code)) - } - - return isErrorCode + return code >= http.StatusBadRequest } // HTTPBody is a helper that returns HTTP body of the response. It returns @@ -98,7 +77,7 @@ func HTTPBody(handler http.HandlerFunc, method, url string, values url.Values) s // assert.HTTPBodyContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky") // // Returns whether the assertion was successful (true) or not (false). -func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool { +func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, str interface{}) bool { body := HTTPBody(handler, method, url, values) contains := strings.Contains(body, fmt.Sprint(str)) @@ -115,7 +94,7 @@ func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method, url string, // assert.HTTPBodyNotContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky") // // Returns whether the assertion was successful (true) or not (false). -func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool { +func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, str interface{}) bool { body := HTTPBody(handler, method, url, values) contains := strings.Contains(body, fmt.Sprint(str))