diff --git a/api/go.mod b/api/go.mod index 94d58cde289cf..733cc580d378f 100644 --- a/api/go.mod +++ b/api/go.mod @@ -7,7 +7,7 @@ require ( github.com/golang/protobuf v1.5.2 github.com/google/go-cmp v0.5.7 github.com/gravitational/trace v1.1.17 - github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect + github.com/russellhaering/gosaml2 v0.6.1-0.20210916051624-757d23f1bc28 github.com/sirupsen/logrus v1.8.1 github.com/stretchr/testify v1.7.1 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.31.0 @@ -15,6 +15,5 @@ require ( golang.org/x/crypto v0.0.0-20220126234351-aa10faf2a1f8 golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd google.golang.org/grpc v1.45.0 - gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect gopkg.in/yaml.v2 v2.4.0 ) diff --git a/api/go.sum b/api/go.sum index 788681d46e4df..da574cadfa641 100644 --- a/api/go.sum +++ b/api/go.sum @@ -3,6 +3,8 @@ cloud.google.com/go v0.34.0 h1:eOI3/cP2VTU6uZLDYAoic+eyzzB9YyGmJ7eIjl8rOPg= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/beevik/etree v1.1.0 h1:T0xke/WvNtMoCqgzPhkX2r4rjY3GDZFi+FjpRZY2Jbs= +github.com/beevik/etree v1.1.0/go.mod h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= @@ -12,6 +14,7 @@ github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XP github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -63,20 +66,34 @@ github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9q github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/mattermost/xml-roundtrip-validator v0.1.0 h1:RXbVD2UAl7A7nOTR4u7E3ILa4IbtvKBHw64LDsmu9hU= +github.com/mattermost/xml-roundtrip-validator v0.1.0/go.mod h1:qccnGMcpgwcNaBnxqpJpWWUiPNr5H3O8eDgGV9gT5To= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= +github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/russellhaering/gosaml2 v0.6.1-0.20210916051624-757d23f1bc28 h1:659ZmS9riGgajUnT9ym74yQSug2KZyvVHi3EmIqASnQ= +github.com/russellhaering/gosaml2 v0.6.1-0.20210916051624-757d23f1bc28/go.mod h1:PiLt5KX4EMjlMIq3WLRR/xb5yqhiwtQhGr8wmU0b08M= +github.com/russellhaering/goxmldsig v1.1.1 h1:vI0r2osGF1A9PLvsGdPUAGwEIrKa4Pj5sesSBsebIxM= +github.com/russellhaering/goxmldsig v1.1.1/go.mod h1:gM4MDENBQf7M+V824SGfyIUVFWydB7n0KkEubVJl+Tw= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -191,13 +208,16 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/api/types/assertion_info.go b/api/types/assertion_info.go new file mode 100644 index 0000000000000..d4ce560b3f713 --- /dev/null +++ b/api/types/assertion_info.go @@ -0,0 +1,56 @@ +/* +Copyright 2022 Gravitational, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package types + +import ( + "encoding/json" + + "github.com/gravitational/trace" + + saml2 "github.com/russellhaering/gosaml2" +) + +// AssertionInfo is an alias for saml2.AssertionInfo with additional methods, required for serialization to/from protobuf. +// With those we can reference it with an option like so: `(gogoproto.customtype) = "AssertionInfo"` +type AssertionInfo saml2.AssertionInfo + +func (a *AssertionInfo) Size() int { + bytes, err := json.Marshal(a) + if err != nil { + return 0 + } + return len(bytes) +} + +func (a *AssertionInfo) Unmarshal(bytes []byte) error { + return trace.Wrap(json.Unmarshal(bytes, a)) +} + +func (a *AssertionInfo) MarshalTo(bytes []byte) (int, error) { + out, err := json.Marshal(a) + if err != nil { + return 0, trace.Wrap(err) + } + + if len(out) > cap(bytes) { + return 0, trace.BadParameter("capacity too low: %v, need %v", cap(bytes), len(out)) + } + + copy(bytes, out) + + return len(out), nil +} diff --git a/api/types/assertion_info_test.go b/api/types/assertion_info_test.go new file mode 100644 index 0000000000000..19e8419ae5513 --- /dev/null +++ b/api/types/assertion_info_test.go @@ -0,0 +1,81 @@ +/* +Copyright 2022 Gravitational, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package types + +import ( + "encoding/xml" + "testing" + "time" + + saml2 "github.com/russellhaering/gosaml2" + samltypes "github.com/russellhaering/gosaml2/types" + "github.com/stretchr/testify/require" +) + +func TestAssertionInfo_RoundTrip(t *testing.T) { + tests := []struct { + name string + src AssertionInfo + }{ + {name: "empty", src: AssertionInfo{}}, + {name: "full", src: (AssertionInfo)(saml2.AssertionInfo{ + NameID: "zz", + Values: map[string]samltypes.Attribute{ + "foo": { + XMLName: xml.Name{ + Space: "ddd", + Local: "aaa", + }, + FriendlyName: "aaa", + Name: "aaa", + NameFormat: "", + Values: nil, + }, + }, + WarningInfo: &saml2.WarningInfo{ + OneTimeUse: true, + ProxyRestriction: &saml2.ProxyRestriction{ + Count: 1, + Audience: []string{"foo"}, + }, + NotInAudience: true, + InvalidTime: true, + }, + SessionIndex: "aaa", + AuthnInstant: new(time.Time), + SessionNotOnOrAfter: new(time.Time), + Assertions: []samltypes.Assertion{ + {XMLName: xml.Name{Space: "urn:oasis:names:tc:SAML:2.0:assertion", Local: "AttributeValue"}}, + }, + ResponseSignatureValidated: true, + })}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + buf := make([]byte, tt.src.Size()) + count, err := tt.src.MarshalTo(buf) + require.NoError(t, err) + require.Equal(t, tt.src.Size(), count) + + dst := &AssertionInfo{} + err = dst.Unmarshal(buf) + require.NoError(t, err) + require.Equal(t, &tt.src, dst) + }) + } +} diff --git a/api/types/traits.go b/api/types/traits.go index e6700728ebd4f..388d054dd38a9 100644 --- a/api/types/traits.go +++ b/api/types/traits.go @@ -16,16 +16,5 @@ limitations under the License. package types -// TraitMapping is a mapping that maps a trait to one or -// more teleport roles. -type TraitMapping struct { - // Trait is a teleport trait name - Trait string `json:"trait"` - // Value is trait value to match - Value string `json:"value"` - // Roles is a list of static teleport roles to map to - Roles []string `json:"roles,omitempty"` -} - // TraitMappingSet is a set of trait mappings type TraitMappingSet []TraitMapping diff --git a/api/types/types.pb.go b/api/types/types.pb.go index 67528eb62b338..97793f10f5d4d 100644 --- a/api/types/types.pb.go +++ b/api/types/types.pb.go @@ -4928,6 +4928,52 @@ func (m *ClaimMapping) XXX_DiscardUnknown() { var xxx_messageInfo_ClaimMapping proto.InternalMessageInfo +// TraitMapping maps a trait to teleport roles. +type TraitMapping struct { + // Trait is a trait name. + Trait string `protobuf:"bytes,1,opt,name=Trait,proto3" json:"trait"` + // Value is a trait value to match. + Value string `protobuf:"bytes,2,opt,name=Value,proto3" json:"value"` + // Roles is a list of static teleport roles to match. + Roles []string `protobuf:"bytes,3,rep,name=Roles,proto3" json:"roles,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *TraitMapping) Reset() { *m = TraitMapping{} } +func (m *TraitMapping) String() string { return proto.CompactTextString(m) } +func (*TraitMapping) ProtoMessage() {} +func (*TraitMapping) Descriptor() ([]byte, []int) { + return fileDescriptor_d938547f84707355, []int{89} +} +func (m *TraitMapping) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TraitMapping) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TraitMapping.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *TraitMapping) XXX_Merge(src proto.Message) { + xxx_messageInfo_TraitMapping.Merge(m, src) +} +func (m *TraitMapping) XXX_Size() int { + return m.Size() +} +func (m *TraitMapping) XXX_DiscardUnknown() { + xxx_messageInfo_TraitMapping.DiscardUnknown(m) +} + +var xxx_messageInfo_TraitMapping proto.InternalMessageInfo + // Rule represents allow or deny rule that is executed to check // if user or service have access to resource type Rule struct { @@ -4948,7 +4994,7 @@ func (m *Rule) Reset() { *m = Rule{} } func (m *Rule) String() string { return proto.CompactTextString(m) } func (*Rule) ProtoMessage() {} func (*Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{89} + return fileDescriptor_d938547f84707355, []int{90} } func (m *Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4996,7 +5042,7 @@ func (m *ImpersonateConditions) Reset() { *m = ImpersonateConditions{} } func (m *ImpersonateConditions) String() string { return proto.CompactTextString(m) } func (*ImpersonateConditions) ProtoMessage() {} func (*ImpersonateConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{90} + return fileDescriptor_d938547f84707355, []int{91} } func (m *ImpersonateConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5038,7 +5084,7 @@ func (m *BoolValue) Reset() { *m = BoolValue{} } func (m *BoolValue) String() string { return proto.CompactTextString(m) } func (*BoolValue) ProtoMessage() {} func (*BoolValue) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{91} + return fileDescriptor_d938547f84707355, []int{92} } func (m *BoolValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5087,7 +5133,7 @@ type UserV2 struct { func (m *UserV2) Reset() { *m = UserV2{} } func (*UserV2) ProtoMessage() {} func (*UserV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{92} + return fileDescriptor_d938547f84707355, []int{93} } func (m *UserV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5151,7 +5197,7 @@ func (m *UserSpecV2) Reset() { *m = UserSpecV2{} } func (m *UserSpecV2) String() string { return proto.CompactTextString(m) } func (*UserSpecV2) ProtoMessage() {} func (*UserSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{93} + return fileDescriptor_d938547f84707355, []int{94} } func (m *UserSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5196,7 +5242,7 @@ type ExternalIdentity struct { func (m *ExternalIdentity) Reset() { *m = ExternalIdentity{} } func (*ExternalIdentity) ProtoMessage() {} func (*ExternalIdentity) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{94} + return fileDescriptor_d938547f84707355, []int{95} } func (m *ExternalIdentity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5248,7 +5294,7 @@ func (m *LoginStatus) Reset() { *m = LoginStatus{} } func (m *LoginStatus) String() string { return proto.CompactTextString(m) } func (*LoginStatus) ProtoMessage() {} func (*LoginStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{95} + return fileDescriptor_d938547f84707355, []int{96} } func (m *LoginStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5293,7 +5339,7 @@ type CreatedBy struct { func (m *CreatedBy) Reset() { *m = CreatedBy{} } func (*CreatedBy) ProtoMessage() {} func (*CreatedBy) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{96} + return fileDescriptor_d938547f84707355, []int{97} } func (m *CreatedBy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5342,7 +5388,7 @@ func (m *LocalAuthSecrets) Reset() { *m = LocalAuthSecrets{} } func (m *LocalAuthSecrets) String() string { return proto.CompactTextString(m) } func (*LocalAuthSecrets) ProtoMessage() {} func (*LocalAuthSecrets) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{97} + return fileDescriptor_d938547f84707355, []int{98} } func (m *LocalAuthSecrets) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5397,7 +5443,7 @@ func (m *MFADevice) Reset() { *m = MFADevice{} } func (m *MFADevice) String() string { return proto.CompactTextString(m) } func (*MFADevice) ProtoMessage() {} func (*MFADevice) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{98} + return fileDescriptor_d938547f84707355, []int{99} } func (m *MFADevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5495,7 +5541,7 @@ func (m *TOTPDevice) Reset() { *m = TOTPDevice{} } func (m *TOTPDevice) String() string { return proto.CompactTextString(m) } func (*TOTPDevice) ProtoMessage() {} func (*TOTPDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{99} + return fileDescriptor_d938547f84707355, []int{100} } func (m *TOTPDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5541,7 +5587,7 @@ func (m *U2FDevice) Reset() { *m = U2FDevice{} } func (m *U2FDevice) String() string { return proto.CompactTextString(m) } func (*U2FDevice) ProtoMessage() {} func (*U2FDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{100} + return fileDescriptor_d938547f84707355, []int{101} } func (m *U2FDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5608,7 +5654,7 @@ func (m *WebauthnDevice) Reset() { *m = WebauthnDevice{} } func (m *WebauthnDevice) String() string { return proto.CompactTextString(m) } func (*WebauthnDevice) ProtoMessage() {} func (*WebauthnDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{101} + return fileDescriptor_d938547f84707355, []int{102} } func (m *WebauthnDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5651,7 +5697,7 @@ func (m *WebauthnLocalAuth) Reset() { *m = WebauthnLocalAuth{} } func (m *WebauthnLocalAuth) String() string { return proto.CompactTextString(m) } func (*WebauthnLocalAuth) ProtoMessage() {} func (*WebauthnLocalAuth) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{102} + return fileDescriptor_d938547f84707355, []int{103} } func (m *WebauthnLocalAuth) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5697,7 +5743,7 @@ func (m *ConnectorRef) Reset() { *m = ConnectorRef{} } func (m *ConnectorRef) String() string { return proto.CompactTextString(m) } func (*ConnectorRef) ProtoMessage() {} func (*ConnectorRef) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{103} + return fileDescriptor_d938547f84707355, []int{104} } func (m *ConnectorRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5739,7 +5785,7 @@ func (m *UserRef) Reset() { *m = UserRef{} } func (m *UserRef) String() string { return proto.CompactTextString(m) } func (*UserRef) ProtoMessage() {} func (*UserRef) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{104} + return fileDescriptor_d938547f84707355, []int{105} } func (m *UserRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5789,7 +5835,7 @@ func (m *ReverseTunnelV2) Reset() { *m = ReverseTunnelV2{} } func (m *ReverseTunnelV2) String() string { return proto.CompactTextString(m) } func (*ReverseTunnelV2) ProtoMessage() {} func (*ReverseTunnelV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{105} + return fileDescriptor_d938547f84707355, []int{106} } func (m *ReverseTunnelV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5836,7 +5882,7 @@ func (m *ReverseTunnelSpecV2) Reset() { *m = ReverseTunnelSpecV2{} } func (m *ReverseTunnelSpecV2) String() string { return proto.CompactTextString(m) } func (*ReverseTunnelSpecV2) ProtoMessage() {} func (*ReverseTunnelSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{106} + return fileDescriptor_d938547f84707355, []int{107} } func (m *ReverseTunnelSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5885,7 +5931,7 @@ type TunnelConnectionV2 struct { func (m *TunnelConnectionV2) Reset() { *m = TunnelConnectionV2{} } func (*TunnelConnectionV2) ProtoMessage() {} func (*TunnelConnectionV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{107} + return fileDescriptor_d938547f84707355, []int{108} } func (m *TunnelConnectionV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5933,7 +5979,7 @@ func (m *TunnelConnectionSpecV2) Reset() { *m = TunnelConnectionSpecV2{} func (m *TunnelConnectionSpecV2) String() string { return proto.CompactTextString(m) } func (*TunnelConnectionSpecV2) ProtoMessage() {} func (*TunnelConnectionSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{108} + return fileDescriptor_d938547f84707355, []int{109} } func (m *TunnelConnectionSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5981,7 +6027,7 @@ func (m *SemaphoreFilter) Reset() { *m = SemaphoreFilter{} } func (m *SemaphoreFilter) String() string { return proto.CompactTextString(m) } func (*SemaphoreFilter) ProtoMessage() {} func (*SemaphoreFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{109} + return fileDescriptor_d938547f84707355, []int{110} } func (m *SemaphoreFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6032,7 +6078,7 @@ func (m *AcquireSemaphoreRequest) Reset() { *m = AcquireSemaphoreRequest func (m *AcquireSemaphoreRequest) String() string { return proto.CompactTextString(m) } func (*AcquireSemaphoreRequest) ProtoMessage() {} func (*AcquireSemaphoreRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{110} + return fileDescriptor_d938547f84707355, []int{111} } func (m *AcquireSemaphoreRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6080,7 +6126,7 @@ func (m *SemaphoreLease) Reset() { *m = SemaphoreLease{} } func (m *SemaphoreLease) String() string { return proto.CompactTextString(m) } func (*SemaphoreLease) ProtoMessage() {} func (*SemaphoreLease) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{111} + return fileDescriptor_d938547f84707355, []int{112} } func (m *SemaphoreLease) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6126,7 +6172,7 @@ func (m *SemaphoreLeaseRef) Reset() { *m = SemaphoreLeaseRef{} } func (m *SemaphoreLeaseRef) String() string { return proto.CompactTextString(m) } func (*SemaphoreLeaseRef) ProtoMessage() {} func (*SemaphoreLeaseRef) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{112} + return fileDescriptor_d938547f84707355, []int{113} } func (m *SemaphoreLeaseRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6175,7 +6221,7 @@ type SemaphoreV3 struct { func (m *SemaphoreV3) Reset() { *m = SemaphoreV3{} } func (*SemaphoreV3) ProtoMessage() {} func (*SemaphoreV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{113} + return fileDescriptor_d938547f84707355, []int{114} } func (m *SemaphoreV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6217,7 +6263,7 @@ func (m *SemaphoreSpecV3) Reset() { *m = SemaphoreSpecV3{} } func (m *SemaphoreSpecV3) String() string { return proto.CompactTextString(m) } func (*SemaphoreSpecV3) ProtoMessage() {} func (*SemaphoreSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{114} + return fileDescriptor_d938547f84707355, []int{115} } func (m *SemaphoreSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6266,7 +6312,7 @@ type WebSessionV2 struct { func (m *WebSessionV2) Reset() { *m = WebSessionV2{} } func (*WebSessionV2) ProtoMessage() {} func (*WebSessionV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{115} + return fileDescriptor_d938547f84707355, []int{116} } func (m *WebSessionV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6327,7 +6373,7 @@ func (m *WebSessionSpecV2) Reset() { *m = WebSessionSpecV2{} } func (m *WebSessionSpecV2) String() string { return proto.CompactTextString(m) } func (*WebSessionSpecV2) ProtoMessage() {} func (*WebSessionSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{116} + return fileDescriptor_d938547f84707355, []int{117} } func (m *WebSessionSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6369,7 +6415,7 @@ func (m *WebSessionFilter) Reset() { *m = WebSessionFilter{} } func (m *WebSessionFilter) String() string { return proto.CompactTextString(m) } func (*WebSessionFilter) ProtoMessage() {} func (*WebSessionFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{117} + return fileDescriptor_d938547f84707355, []int{118} } func (m *WebSessionFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6418,7 +6464,7 @@ type RemoteClusterV3 struct { func (m *RemoteClusterV3) Reset() { *m = RemoteClusterV3{} } func (*RemoteClusterV3) ProtoMessage() {} func (*RemoteClusterV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{118} + return fileDescriptor_d938547f84707355, []int{119} } func (m *RemoteClusterV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6462,7 +6508,7 @@ func (m *RemoteClusterStatusV3) Reset() { *m = RemoteClusterStatusV3{} } func (m *RemoteClusterStatusV3) String() string { return proto.CompactTextString(m) } func (*RemoteClusterStatusV3) ProtoMessage() {} func (*RemoteClusterStatusV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{119} + return fileDescriptor_d938547f84707355, []int{120} } func (m *RemoteClusterStatusV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6512,7 +6558,7 @@ func (m *KubernetesCluster) Reset() { *m = KubernetesCluster{} } func (m *KubernetesCluster) String() string { return proto.CompactTextString(m) } func (*KubernetesCluster) ProtoMessage() {} func (*KubernetesCluster) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{120} + return fileDescriptor_d938547f84707355, []int{121} } func (m *KubernetesCluster) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6561,7 +6607,7 @@ type KubernetesClusterV3 struct { func (m *KubernetesClusterV3) Reset() { *m = KubernetesClusterV3{} } func (*KubernetesClusterV3) ProtoMessage() {} func (*KubernetesClusterV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{121} + return fileDescriptor_d938547f84707355, []int{122} } func (m *KubernetesClusterV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6603,7 +6649,7 @@ func (m *KubernetesClusterSpecV3) Reset() { *m = KubernetesClusterSpecV3 func (m *KubernetesClusterSpecV3) String() string { return proto.CompactTextString(m) } func (*KubernetesClusterSpecV3) ProtoMessage() {} func (*KubernetesClusterSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{122} + return fileDescriptor_d938547f84707355, []int{123} } func (m *KubernetesClusterSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6655,7 +6701,7 @@ type WebTokenV3 struct { func (m *WebTokenV3) Reset() { *m = WebTokenV3{} } func (*WebTokenV3) ProtoMessage() {} func (*WebTokenV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{123} + return fileDescriptor_d938547f84707355, []int{124} } func (m *WebTokenV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6699,7 +6745,7 @@ func (m *WebTokenSpecV3) Reset() { *m = WebTokenSpecV3{} } func (m *WebTokenSpecV3) String() string { return proto.CompactTextString(m) } func (*WebTokenSpecV3) ProtoMessage() {} func (*WebTokenSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{124} + return fileDescriptor_d938547f84707355, []int{125} } func (m *WebTokenSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6743,7 +6789,7 @@ func (m *GetWebSessionRequest) Reset() { *m = GetWebSessionRequest{} } func (m *GetWebSessionRequest) String() string { return proto.CompactTextString(m) } func (*GetWebSessionRequest) ProtoMessage() {} func (*GetWebSessionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{125} + return fileDescriptor_d938547f84707355, []int{126} } func (m *GetWebSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6787,7 +6833,7 @@ func (m *DeleteWebSessionRequest) Reset() { *m = DeleteWebSessionRequest func (m *DeleteWebSessionRequest) String() string { return proto.CompactTextString(m) } func (*DeleteWebSessionRequest) ProtoMessage() {} func (*DeleteWebSessionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{126} + return fileDescriptor_d938547f84707355, []int{127} } func (m *DeleteWebSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6831,7 +6877,7 @@ func (m *GetWebTokenRequest) Reset() { *m = GetWebTokenRequest{} } func (m *GetWebTokenRequest) String() string { return proto.CompactTextString(m) } func (*GetWebTokenRequest) ProtoMessage() {} func (*GetWebTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{127} + return fileDescriptor_d938547f84707355, []int{128} } func (m *GetWebTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6875,7 +6921,7 @@ func (m *DeleteWebTokenRequest) Reset() { *m = DeleteWebTokenRequest{} } func (m *DeleteWebTokenRequest) String() string { return proto.CompactTextString(m) } func (*DeleteWebTokenRequest) ProtoMessage() {} func (*DeleteWebTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{128} + return fileDescriptor_d938547f84707355, []int{129} } func (m *DeleteWebTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6917,7 +6963,7 @@ func (m *ResourceRequest) Reset() { *m = ResourceRequest{} } func (m *ResourceRequest) String() string { return proto.CompactTextString(m) } func (*ResourceRequest) ProtoMessage() {} func (*ResourceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{129} + return fileDescriptor_d938547f84707355, []int{130} } func (m *ResourceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6961,7 +7007,7 @@ func (m *ResourceWithSecretsRequest) Reset() { *m = ResourceWithSecretsR func (m *ResourceWithSecretsRequest) String() string { return proto.CompactTextString(m) } func (*ResourceWithSecretsRequest) ProtoMessage() {} func (*ResourceWithSecretsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{130} + return fileDescriptor_d938547f84707355, []int{131} } func (m *ResourceWithSecretsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7003,7 +7049,7 @@ func (m *ResourcesWithSecretsRequest) Reset() { *m = ResourcesWithSecret func (m *ResourcesWithSecretsRequest) String() string { return proto.CompactTextString(m) } func (*ResourcesWithSecretsRequest) ProtoMessage() {} func (*ResourcesWithSecretsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{131} + return fileDescriptor_d938547f84707355, []int{132} } func (m *ResourcesWithSecretsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7047,7 +7093,7 @@ func (m *ResourceInNamespaceRequest) Reset() { *m = ResourceInNamespaceR func (m *ResourceInNamespaceRequest) String() string { return proto.CompactTextString(m) } func (*ResourceInNamespaceRequest) ProtoMessage() {} func (*ResourceInNamespaceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{132} + return fileDescriptor_d938547f84707355, []int{133} } func (m *ResourceInNamespaceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7089,7 +7135,7 @@ func (m *ResourcesInNamespaceRequest) Reset() { *m = ResourcesInNamespac func (m *ResourcesInNamespaceRequest) String() string { return proto.CompactTextString(m) } func (*ResourcesInNamespaceRequest) ProtoMessage() {} func (*ResourcesInNamespaceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{133} + return fileDescriptor_d938547f84707355, []int{134} } func (m *ResourcesInNamespaceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7139,7 +7185,7 @@ func (m *OIDCConnectorV3) Reset() { *m = OIDCConnectorV3{} } func (m *OIDCConnectorV3) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorV3) ProtoMessage() {} func (*OIDCConnectorV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{134} + return fileDescriptor_d938547f84707355, []int{135} } func (m *OIDCConnectorV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7181,7 +7227,7 @@ func (m *OIDCConnectorV3List) Reset() { *m = OIDCConnectorV3List{} } func (m *OIDCConnectorV3List) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorV3List) ProtoMessage() {} func (*OIDCConnectorV3List) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{135} + return fileDescriptor_d938547f84707355, []int{136} } func (m *OIDCConnectorV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7254,7 +7300,7 @@ func (m *OIDCConnectorSpecV3) Reset() { *m = OIDCConnectorSpecV3{} } func (m *OIDCConnectorSpecV3) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorSpecV3) ProtoMessage() {} func (*OIDCConnectorSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{136} + return fileDescriptor_d938547f84707355, []int{137} } func (m *OIDCConnectorSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7304,7 +7350,7 @@ func (m *SAMLConnectorV2) Reset() { *m = SAMLConnectorV2{} } func (m *SAMLConnectorV2) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorV2) ProtoMessage() {} func (*SAMLConnectorV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{137} + return fileDescriptor_d938547f84707355, []int{138} } func (m *SAMLConnectorV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7346,7 +7392,7 @@ func (m *SAMLConnectorV2List) Reset() { *m = SAMLConnectorV2List{} } func (m *SAMLConnectorV2List) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorV2List) ProtoMessage() {} func (*SAMLConnectorV2List) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{138} + return fileDescriptor_d938547f84707355, []int{139} } func (m *SAMLConnectorV2List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7415,7 +7461,7 @@ func (m *SAMLConnectorSpecV2) Reset() { *m = SAMLConnectorSpecV2{} } func (m *SAMLConnectorSpecV2) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorSpecV2) ProtoMessage() {} func (*SAMLConnectorSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{139} + return fileDescriptor_d938547f84707355, []int{140} } func (m *SAMLConnectorSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7461,7 +7507,7 @@ func (m *AttributeMapping) Reset() { *m = AttributeMapping{} } func (m *AttributeMapping) String() string { return proto.CompactTextString(m) } func (*AttributeMapping) ProtoMessage() {} func (*AttributeMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{140} + return fileDescriptor_d938547f84707355, []int{141} } func (m *AttributeMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7506,7 +7552,7 @@ func (m *AsymmetricKeyPair) Reset() { *m = AsymmetricKeyPair{} } func (m *AsymmetricKeyPair) String() string { return proto.CompactTextString(m) } func (*AsymmetricKeyPair) ProtoMessage() {} func (*AsymmetricKeyPair) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{141} + return fileDescriptor_d938547f84707355, []int{142} } func (m *AsymmetricKeyPair) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7556,7 +7602,7 @@ func (m *GithubConnectorV3) Reset() { *m = GithubConnectorV3{} } func (m *GithubConnectorV3) String() string { return proto.CompactTextString(m) } func (*GithubConnectorV3) ProtoMessage() {} func (*GithubConnectorV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{142} + return fileDescriptor_d938547f84707355, []int{143} } func (m *GithubConnectorV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7598,7 +7644,7 @@ func (m *GithubConnectorV3List) Reset() { *m = GithubConnectorV3List{} } func (m *GithubConnectorV3List) String() string { return proto.CompactTextString(m) } func (*GithubConnectorV3List) ProtoMessage() {} func (*GithubConnectorV3List) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{143} + return fileDescriptor_d938547f84707355, []int{144} } func (m *GithubConnectorV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7648,7 +7694,7 @@ func (m *GithubConnectorSpecV3) Reset() { *m = GithubConnectorSpecV3{} } func (m *GithubConnectorSpecV3) String() string { return proto.CompactTextString(m) } func (*GithubConnectorSpecV3) ProtoMessage() {} func (*GithubConnectorSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{144} + return fileDescriptor_d938547f84707355, []int{145} } func (m *GithubConnectorSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7677,6 +7723,168 @@ func (m *GithubConnectorSpecV3) XXX_DiscardUnknown() { var xxx_messageInfo_GithubConnectorSpecV3 proto.InternalMessageInfo +// SSOWarnings conveys a user-facing main message along with auxiliary warnings. +type SSOWarnings struct { + // Message is main user-facing message to be shown. + Message string `protobuf:"bytes,1,opt,name=Message,proto3" json:"message,omitempty"` + // Warnings is a set of distinct warnings to be reported. + Warnings []string `protobuf:"bytes,2,rep,name=Warnings,proto3" json:"warnings,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SSOWarnings) Reset() { *m = SSOWarnings{} } +func (m *SSOWarnings) String() string { return proto.CompactTextString(m) } +func (*SSOWarnings) ProtoMessage() {} +func (*SSOWarnings) Descriptor() ([]byte, []int) { + return fileDescriptor_d938547f84707355, []int{146} +} +func (m *SSOWarnings) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SSOWarnings) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SSOWarnings.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SSOWarnings) XXX_Merge(src proto.Message) { + xxx_messageInfo_SSOWarnings.Merge(m, src) +} +func (m *SSOWarnings) XXX_Size() int { + return m.Size() +} +func (m *SSOWarnings) XXX_DiscardUnknown() { + xxx_messageInfo_SSOWarnings.DiscardUnknown(m) +} + +var xxx_messageInfo_SSOWarnings proto.InternalMessageInfo + +// CreateUserParams represents the user creation parameters as called during SSO login flow. +type CreateUserParams struct { + // ConnectorName is the name of the connector used for SSO login flow. + ConnectorName string `protobuf:"bytes,1,opt,name=ConnectorName,proto3" json:"connector_name,omitempty"` + // Username is the name of the user to be created. + Username string `protobuf:"bytes,2,opt,name=Username,proto3" json:"username,omitempty"` + // Logins is a list of available unix logins. + Logins []string `protobuf:"bytes,3,rep,name=Logins,proto3" json:"logins,omitempty"` + // KubeGroups is a list of assigned kube groups. + KubeGroups []string `protobuf:"bytes,4,rep,name=KubeGroups,proto3" json:"kube_groups,omitempty"` + // KubeUsers is a list of available kube users. + KubeUsers []string `protobuf:"bytes,5,rep,name=KubeUsers,proto3" json:"kube_users,omitempty"` + // Roles is a list of assigned roles. + Roles []string `protobuf:"bytes,6,rep,name=Roles,proto3" json:"roles,omitempty"` + // Traits is the set of traits the user is assigned. + Traits github_com_gravitational_teleport_api_types_wrappers.Traits `protobuf:"bytes,7,opt,name=Traits,proto3,customtype=github.com/gravitational/teleport/api/types/wrappers.Traits" json:"traits,omitempty"` + // SessionTTL determines the TTL. + SessionTTL Duration `protobuf:"varint,8,opt,name=SessionTTL,proto3,casttype=Duration" json:"session_ttl,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *CreateUserParams) Reset() { *m = CreateUserParams{} } +func (m *CreateUserParams) String() string { return proto.CompactTextString(m) } +func (*CreateUserParams) ProtoMessage() {} +func (*CreateUserParams) Descriptor() ([]byte, []int) { + return fileDescriptor_d938547f84707355, []int{147} +} +func (m *CreateUserParams) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CreateUserParams) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_CreateUserParams.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *CreateUserParams) XXX_Merge(src proto.Message) { + xxx_messageInfo_CreateUserParams.Merge(m, src) +} +func (m *CreateUserParams) XXX_Size() int { + return m.Size() +} +func (m *CreateUserParams) XXX_DiscardUnknown() { + xxx_messageInfo_CreateUserParams.DiscardUnknown(m) +} + +var xxx_messageInfo_CreateUserParams proto.InternalMessageInfo + +// SSODiagnosticInfo is a single SSO diagnostic info entry. +type SSODiagnosticInfo struct { + // TestFlow indicates the SSO flow was a test one. + TestFlow bool `protobuf:"varint,1,opt,name=TestFlow,proto3" json:"test_flow"` + // Error stores user-friendly error message. + Error string `protobuf:"bytes,2,opt,name=Error,proto3" json:"error"` + // Success if present, marks the flow as finished with success. + Success bool `protobuf:"varint,3,opt,name=Success,proto3" json:"success"` + // CreateUserParams represents the user creation parameters as called during SSO login flow. + CreateUserParams *CreateUserParams `protobuf:"bytes,4,opt,name=CreateUserParams,proto3" json:"create_user_params,omitempty"` + // SAMLAttributesToRoles represents mapping from attributes to roles, as used during SAML login + // flow. + SAMLAttributesToRoles []AttributeMapping `protobuf:"bytes,5,rep,name=SAMLAttributesToRoles,proto3" json:"attributes_to_roles,omitempty"` + // SAMLAttributesToRolesWarnings contains warnings produced during the process of mapping the + // SAML attributes to roles. + SAMLAttributesToRolesWarnings *SSOWarnings `protobuf:"bytes,6,opt,name=SAMLAttributesToRolesWarnings,proto3" json:"saml_attributes_to_roles_warnings,omitempty"` + // SAMLAttributeStatements represents SAML attribute statements. + SAMLAttributeStatements github_com_gravitational_teleport_api_types_wrappers.Traits `protobuf:"bytes,7,opt,name=SAMLAttributeStatements,proto3,customtype=github.com/gravitational/teleport/api/types/wrappers.Traits" json:"saml_attribute_statements,omitempty"` + // SAMLAssertionInfo represents raw SAML assertion info as returned by IdP during SAML flow. + SAMLAssertionInfo *AssertionInfo `protobuf:"bytes,8,opt,name=SAMLAssertionInfo,proto3,customtype=AssertionInfo" json:"saml_assertion_info,omitempty"` + // SAMLTraitsFromAssertions represents traits translated from SAML assertions. + SAMLTraitsFromAssertions github_com_gravitational_teleport_api_types_wrappers.Traits `protobuf:"bytes,9,opt,name=SAMLTraitsFromAssertions,proto3,customtype=github.com/gravitational/teleport/api/types/wrappers.Traits" json:"saml_traits_from_assertions,omitempty"` + // SAMLConnectorTraitMapping represents connector-specific trait mapping. + SAMLConnectorTraitMapping []TraitMapping `protobuf:"bytes,10,rep,name=SAMLConnectorTraitMapping,proto3" json:"saml_connector_trait_mapping,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SSODiagnosticInfo) Reset() { *m = SSODiagnosticInfo{} } +func (m *SSODiagnosticInfo) String() string { return proto.CompactTextString(m) } +func (*SSODiagnosticInfo) ProtoMessage() {} +func (*SSODiagnosticInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_d938547f84707355, []int{148} +} +func (m *SSODiagnosticInfo) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SSODiagnosticInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SSODiagnosticInfo.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SSODiagnosticInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_SSODiagnosticInfo.Merge(m, src) +} +func (m *SSODiagnosticInfo) XXX_Size() int { + return m.Size() +} +func (m *SSODiagnosticInfo) XXX_DiscardUnknown() { + xxx_messageInfo_SSODiagnosticInfo.DiscardUnknown(m) +} + +var xxx_messageInfo_SSODiagnosticInfo proto.InternalMessageInfo + // TeamMapping represents a single team membership mapping. type TeamMapping struct { // Organization is a Github organization a user belongs to. @@ -7698,7 +7906,7 @@ func (m *TeamMapping) Reset() { *m = TeamMapping{} } func (m *TeamMapping) String() string { return proto.CompactTextString(m) } func (*TeamMapping) ProtoMessage() {} func (*TeamMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{145} + return fileDescriptor_d938547f84707355, []int{149} } func (m *TeamMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7747,7 +7955,7 @@ type TrustedClusterV2 struct { func (m *TrustedClusterV2) Reset() { *m = TrustedClusterV2{} } func (*TrustedClusterV2) ProtoMessage() {} func (*TrustedClusterV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{146} + return fileDescriptor_d938547f84707355, []int{150} } func (m *TrustedClusterV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7789,7 +7997,7 @@ func (m *TrustedClusterV2List) Reset() { *m = TrustedClusterV2List{} } func (m *TrustedClusterV2List) String() string { return proto.CompactTextString(m) } func (*TrustedClusterV2List) ProtoMessage() {} func (*TrustedClusterV2List) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{147} + return fileDescriptor_d938547f84707355, []int{151} } func (m *TrustedClusterV2List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7845,7 +8053,7 @@ func (m *TrustedClusterSpecV2) Reset() { *m = TrustedClusterSpecV2{} } func (m *TrustedClusterSpecV2) String() string { return proto.CompactTextString(m) } func (*TrustedClusterSpecV2) ProtoMessage() {} func (*TrustedClusterSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{148} + return fileDescriptor_d938547f84707355, []int{152} } func (m *TrustedClusterSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7898,7 +8106,7 @@ func (m *LockV2) Reset() { *m = LockV2{} } func (m *LockV2) String() string { return proto.CompactTextString(m) } func (*LockV2) ProtoMessage() {} func (*LockV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{149} + return fileDescriptor_d938547f84707355, []int{153} } func (m *LockV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7944,7 +8152,7 @@ func (m *LockSpecV2) Reset() { *m = LockSpecV2{} } func (m *LockSpecV2) String() string { return proto.CompactTextString(m) } func (*LockSpecV2) ProtoMessage() {} func (*LockSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{150} + return fileDescriptor_d938547f84707355, []int{154} } func (m *LockSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7999,7 +8207,7 @@ type LockTarget struct { func (m *LockTarget) Reset() { *m = LockTarget{} } func (*LockTarget) ProtoMessage() {} func (*LockTarget) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{151} + return fileDescriptor_d938547f84707355, []int{155} } func (m *LockTarget) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8043,7 +8251,7 @@ func (m *AddressCondition) Reset() { *m = AddressCondition{} } func (m *AddressCondition) String() string { return proto.CompactTextString(m) } func (*AddressCondition) ProtoMessage() {} func (*AddressCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{152} + return fileDescriptor_d938547f84707355, []int{156} } func (m *AddressCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8086,7 +8294,7 @@ func (m *NetworkRestrictionsSpecV4) Reset() { *m = NetworkRestrictionsSp func (m *NetworkRestrictionsSpecV4) String() string { return proto.CompactTextString(m) } func (*NetworkRestrictionsSpecV4) ProtoMessage() {} func (*NetworkRestrictionsSpecV4) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{153} + return fileDescriptor_d938547f84707355, []int{157} } func (m *NetworkRestrictionsSpecV4) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8139,7 +8347,7 @@ func (m *NetworkRestrictionsV4) Reset() { *m = NetworkRestrictionsV4{} } func (m *NetworkRestrictionsV4) String() string { return proto.CompactTextString(m) } func (*NetworkRestrictionsV4) ProtoMessage() {} func (*NetworkRestrictionsV4) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{154} + return fileDescriptor_d938547f84707355, []int{158} } func (m *NetworkRestrictionsV4) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8183,7 +8391,7 @@ func (m *WindowsDesktopServiceV3) Reset() { *m = WindowsDesktopServiceV3 func (m *WindowsDesktopServiceV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopServiceV3) ProtoMessage() {} func (*WindowsDesktopServiceV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{155} + return fileDescriptor_d938547f84707355, []int{159} } func (m *WindowsDesktopServiceV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8229,7 +8437,7 @@ func (m *WindowsDesktopServiceSpecV3) Reset() { *m = WindowsDesktopServi func (m *WindowsDesktopServiceSpecV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopServiceSpecV3) ProtoMessage() {} func (*WindowsDesktopServiceSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{156} + return fileDescriptor_d938547f84707355, []int{160} } func (m *WindowsDesktopServiceSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8273,7 +8481,7 @@ func (m *WindowsDesktopFilter) Reset() { *m = WindowsDesktopFilter{} } func (m *WindowsDesktopFilter) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopFilter) ProtoMessage() {} func (*WindowsDesktopFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{157} + return fileDescriptor_d938547f84707355, []int{161} } func (m *WindowsDesktopFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8317,7 +8525,7 @@ func (m *WindowsDesktopV3) Reset() { *m = WindowsDesktopV3{} } func (m *WindowsDesktopV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopV3) ProtoMessage() {} func (*WindowsDesktopV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{158} + return fileDescriptor_d938547f84707355, []int{162} } func (m *WindowsDesktopV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8363,7 +8571,7 @@ func (m *WindowsDesktopSpecV3) Reset() { *m = WindowsDesktopSpecV3{} } func (m *WindowsDesktopSpecV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopSpecV3) ProtoMessage() {} func (*WindowsDesktopSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{159} + return fileDescriptor_d938547f84707355, []int{163} } func (m *WindowsDesktopSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8429,7 +8637,7 @@ func (m *RegisterUsingTokenRequest) Reset() { *m = RegisterUsingTokenReq func (m *RegisterUsingTokenRequest) String() string { return proto.CompactTextString(m) } func (*RegisterUsingTokenRequest) ProtoMessage() {} func (*RegisterUsingTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{160} + return fileDescriptor_d938547f84707355, []int{164} } func (m *RegisterUsingTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8483,7 +8691,7 @@ func (m *RecoveryCodesV1) Reset() { *m = RecoveryCodesV1{} } func (m *RecoveryCodesV1) String() string { return proto.CompactTextString(m) } func (*RecoveryCodesV1) ProtoMessage() {} func (*RecoveryCodesV1) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{161} + return fileDescriptor_d938547f84707355, []int{165} } func (m *RecoveryCodesV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8528,7 +8736,7 @@ func (m *RecoveryCodesSpecV1) Reset() { *m = RecoveryCodesSpecV1{} } func (m *RecoveryCodesSpecV1) String() string { return proto.CompactTextString(m) } func (*RecoveryCodesSpecV1) ProtoMessage() {} func (*RecoveryCodesSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{162} + return fileDescriptor_d938547f84707355, []int{166} } func (m *RecoveryCodesSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8572,7 +8780,7 @@ func (m *RecoveryCode) Reset() { *m = RecoveryCode{} } func (m *RecoveryCode) String() string { return proto.CompactTextString(m) } func (*RecoveryCode) ProtoMessage() {} func (*RecoveryCode) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{163} + return fileDescriptor_d938547f84707355, []int{167} } func (m *RecoveryCode) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8616,7 +8824,7 @@ func (m *SessionTrackerV1) Reset() { *m = SessionTrackerV1{} } func (m *SessionTrackerV1) String() string { return proto.CompactTextString(m) } func (*SessionTrackerV1) ProtoMessage() {} func (*SessionTrackerV1) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{164} + return fileDescriptor_d938547f84707355, []int{168} } func (m *SessionTrackerV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8698,7 +8906,7 @@ func (m *SessionTrackerSpecV1) Reset() { *m = SessionTrackerSpecV1{} } func (m *SessionTrackerSpecV1) String() string { return proto.CompactTextString(m) } func (*SessionTrackerSpecV1) ProtoMessage() {} func (*SessionTrackerSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{165} + return fileDescriptor_d938547f84707355, []int{169} } func (m *SessionTrackerSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8745,7 +8953,7 @@ func (m *SessionTrackerPolicySet) Reset() { *m = SessionTrackerPolicySet func (m *SessionTrackerPolicySet) String() string { return proto.CompactTextString(m) } func (*SessionTrackerPolicySet) ProtoMessage() {} func (*SessionTrackerPolicySet) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{166} + return fileDescriptor_d938547f84707355, []int{170} } func (m *SessionTrackerPolicySet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8793,7 +9001,7 @@ func (m *Participant) Reset() { *m = Participant{} } func (m *Participant) String() string { return proto.CompactTextString(m) } func (*Participant) ProtoMessage() {} func (*Participant) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{167} + return fileDescriptor_d938547f84707355, []int{171} } func (m *Participant) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8837,7 +9045,7 @@ func (m *SortBy) Reset() { *m = SortBy{} } func (m *SortBy) String() string { return proto.CompactTextString(m) } func (*SortBy) ProtoMessage() {} func (*SortBy) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{168} + return fileDescriptor_d938547f84707355, []int{172} } func (m *SortBy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8979,6 +9187,7 @@ func init() { proto.RegisterType((*AccessRequestConditions)(nil), "types.AccessRequestConditions") proto.RegisterType((*AccessReviewConditions)(nil), "types.AccessReviewConditions") proto.RegisterType((*ClaimMapping)(nil), "types.ClaimMapping") + proto.RegisterType((*TraitMapping)(nil), "types.TraitMapping") proto.RegisterType((*Rule)(nil), "types.Rule") proto.RegisterType((*ImpersonateConditions)(nil), "types.ImpersonateConditions") proto.RegisterType((*BoolValue)(nil), "types.BoolValue") @@ -9038,6 +9247,9 @@ func init() { proto.RegisterType((*GithubConnectorV3)(nil), "types.GithubConnectorV3") proto.RegisterType((*GithubConnectorV3List)(nil), "types.GithubConnectorV3List") proto.RegisterType((*GithubConnectorSpecV3)(nil), "types.GithubConnectorSpecV3") + proto.RegisterType((*SSOWarnings)(nil), "types.SSOWarnings") + proto.RegisterType((*CreateUserParams)(nil), "types.CreateUserParams") + proto.RegisterType((*SSODiagnosticInfo)(nil), "types.SSODiagnosticInfo") proto.RegisterType((*TeamMapping)(nil), "types.TeamMapping") proto.RegisterType((*TrustedClusterV2)(nil), "types.TrustedClusterV2") proto.RegisterType((*TrustedClusterV2List)(nil), "types.TrustedClusterV2List") @@ -9067,743 +9279,772 @@ func init() { func init() { proto.RegisterFile("types.proto", fileDescriptor_d938547f84707355) } var fileDescriptor_d938547f84707355 = []byte{ - // 11761 bytes of a gzipped FileDescriptorProto + // 12230 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0xbd, 0x6f, 0x6c, 0x1c, 0x49, - 0x76, 0x18, 0xae, 0x9e, 0x19, 0x92, 0x33, 0x8f, 0x43, 0x72, 0x58, 0xa2, 0x24, 0x4a, 0xab, 0xdd, - 0xd1, 0xf5, 0xee, 0x6a, 0x25, 0xdd, 0xae, 0x78, 0xa2, 0x6e, 0x75, 0xde, 0xdb, 0x7f, 0x37, 0x43, - 0x52, 0x12, 0x57, 0x14, 0xc9, 0xed, 0xe1, 0x9f, 0x3b, 0xdf, 0xad, 0xdb, 0xcd, 0xe9, 0x12, 0xd9, - 0xcb, 0x99, 0xe9, 0xb9, 0xee, 0x1e, 0x49, 0xb4, 0x7f, 0x86, 0xfd, 0x43, 0xe0, 0x18, 0x86, 0xe1, - 0x3b, 0x9f, 0x71, 0x8e, 0xed, 0xc0, 0x81, 0x1d, 0x23, 0x46, 0xe2, 0x04, 0x67, 0x04, 0x4e, 0x80, - 0x24, 0x40, 0x10, 0xc0, 0x40, 0x60, 0xdc, 0x87, 0x18, 0xf1, 0xb7, 0xc0, 0x4e, 0xc0, 0xc4, 0x77, - 0xf9, 0x12, 0x02, 0x01, 0x02, 0x18, 0x08, 0xe0, 0x4b, 0x0c, 0x04, 0xf5, 0xaa, 0xaa, 0xbb, 0xaa, - 0xa7, 0x87, 0x1c, 0xad, 0xb4, 0xc0, 0x69, 0x3f, 0x91, 0xf3, 0xea, 0xbd, 0xd7, 0xf5, 0xe7, 0xd5, - 0xab, 0x57, 0x55, 0xef, 0xbd, 0x82, 0xf1, 0xe8, 0xa0, 0x4b, 0xc3, 0xeb, 0xdd, 0xc0, 0x8f, 0x7c, - 0x32, 0x82, 0x3f, 0x2e, 0xcc, 0xec, 0xfa, 0xbb, 0x3e, 0x42, 0xe6, 0xd8, 0x7f, 0xbc, 0xf0, 0x42, - 0x75, 0xd7, 0xf7, 0x77, 0x5b, 0x74, 0x0e, 0x7f, 0xed, 0xf4, 0x1e, 0xcc, 0x45, 0x5e, 0x9b, 0x86, - 0x91, 0xd3, 0xee, 0x0a, 0x84, 0x85, 0x5d, 0x2f, 0xda, 0xeb, 0xed, 0x5c, 0x6f, 0xfa, 0xed, 0xb9, - 0xdd, 0xc0, 0x79, 0xe8, 0x45, 0x4e, 0xe4, 0xf9, 0x1d, 0xa7, 0x35, 0x17, 0xd1, 0x16, 0xed, 0xfa, - 0x41, 0x34, 0xe7, 0x74, 0xbd, 0x39, 0xfc, 0xc6, 0xdc, 0xa3, 0xc0, 0xe9, 0x76, 0x69, 0x90, 0xfc, - 0xc3, 0x99, 0x98, 0xff, 0x30, 0x0f, 0xa5, 0x7b, 0x94, 0x76, 0x6b, 0x2d, 0xef, 0x21, 0x25, 0x2f, - 0x43, 0x61, 0xd5, 0x69, 0xd3, 0x59, 0xe3, 0x92, 0x71, 0xa5, 0x54, 0x9f, 0x3a, 0x3a, 0xac, 0x8e, - 0x87, 0x34, 0x78, 0x48, 0x03, 0xbb, 0xe3, 0xb4, 0xa9, 0x85, 0x85, 0xe4, 0xf3, 0x50, 0x62, 0x7f, - 0xc3, 0xae, 0xd3, 0xa4, 0xb3, 0x39, 0xc4, 0x9c, 0x38, 0x3a, 0xac, 0x96, 0x3a, 0x12, 0x68, 0x25, - 0xe5, 0xe4, 0x32, 0x8c, 0xad, 0x50, 0x27, 0xa4, 0xcb, 0x8b, 0xb3, 0xf9, 0x4b, 0xc6, 0x95, 0x7c, - 0xbd, 0x7c, 0x74, 0x58, 0x2d, 0xb6, 0x18, 0xc8, 0xf6, 0x5c, 0x4b, 0x16, 0x92, 0x65, 0x18, 0x5b, - 0x7a, 0xdc, 0xf5, 0x02, 0x1a, 0xce, 0x16, 0x2e, 0x19, 0x57, 0xc6, 0xe7, 0x2f, 0x5c, 0xe7, 0xed, - 0xbf, 0x2e, 0xdb, 0x7f, 0x7d, 0x43, 0xb6, 0xbf, 0x7e, 0xfa, 0xfb, 0x87, 0xd5, 0x53, 0x47, 0x87, - 0xd5, 0x31, 0xca, 0x49, 0x7e, 0xed, 0xbf, 0x56, 0x0d, 0x4b, 0xd2, 0x93, 0x77, 0xa0, 0xb0, 0x71, - 0xd0, 0xa5, 0xb3, 0xa5, 0x4b, 0xc6, 0x95, 0xc9, 0xf9, 0x97, 0xae, 0xf3, 0x1e, 0x8f, 0x1b, 0x99, - 0xfc, 0xc7, 0xb0, 0xea, 0xc5, 0xa3, 0xc3, 0x6a, 0x81, 0xa1, 0x58, 0x48, 0x45, 0xde, 0x80, 0xd1, - 0xbb, 0x7e, 0x18, 0x2d, 0x2f, 0xce, 0x02, 0x36, 0xed, 0xcc, 0xd1, 0x61, 0x75, 0x7a, 0xcf, 0x0f, - 0x23, 0xdb, 0x73, 0x5f, 0xf7, 0xdb, 0x5e, 0x44, 0xdb, 0xdd, 0xe8, 0xc0, 0x12, 0x48, 0xe6, 0x0e, - 0x4c, 0x68, 0xfc, 0xc8, 0x38, 0x8c, 0x6d, 0xae, 0xde, 0x5b, 0x5d, 0xdb, 0x5e, 0xad, 0x9c, 0x22, - 0x45, 0x28, 0xac, 0xae, 0x2d, 0x2e, 0x55, 0x0c, 0x32, 0x06, 0xf9, 0xda, 0xfa, 0x7a, 0x25, 0x47, - 0xca, 0x50, 0x5c, 0xac, 0x6d, 0xd4, 0xea, 0xb5, 0xc6, 0x52, 0x25, 0x4f, 0x4e, 0xc3, 0xd4, 0xf6, - 0xf2, 0xea, 0xe2, 0xda, 0x76, 0xc3, 0x5e, 0x5c, 0x6a, 0xdc, 0xdb, 0x58, 0x5b, 0xaf, 0x14, 0xc8, - 0x24, 0xc0, 0xbd, 0xcd, 0xfa, 0x92, 0xb5, 0xba, 0xb4, 0xb1, 0xd4, 0xa8, 0x8c, 0x98, 0xbf, 0x94, - 0x87, 0xe2, 0x7d, 0x1a, 0x39, 0xae, 0x13, 0x39, 0xe4, 0xa2, 0x36, 0x44, 0x58, 0x7b, 0x65, 0x6c, - 0x5e, 0xee, 0x1f, 0x9b, 0x91, 0xa3, 0xc3, 0xaa, 0xf1, 0x86, 0x3a, 0x26, 0x6f, 0xc3, 0xf8, 0x22, - 0x0d, 0x9b, 0x81, 0xd7, 0x65, 0xf2, 0x82, 0xe3, 0x52, 0xaa, 0x9f, 0x3f, 0x3a, 0xac, 0x9e, 0x71, - 0x13, 0xb0, 0xd2, 0x56, 0x15, 0x9b, 0x2c, 0xc3, 0xe8, 0x8a, 0xb3, 0x43, 0x5b, 0xe1, 0xec, 0xc8, - 0xa5, 0xfc, 0x95, 0xf1, 0xf9, 0x17, 0x44, 0xff, 0xca, 0x0a, 0x5e, 0xe7, 0xa5, 0x4b, 0x9d, 0x28, - 0x38, 0xa8, 0xcf, 0x1c, 0x1d, 0x56, 0x2b, 0x2d, 0x04, 0xa8, 0x7d, 0xc7, 0x51, 0x48, 0x23, 0x19, - 0xf3, 0xd1, 0x13, 0xc7, 0xfc, 0xc5, 0xef, 0x1f, 0x56, 0x0d, 0x36, 0x16, 0x62, 0xcc, 0x13, 0x7e, - 0xfa, 0xe8, 0x5f, 0x82, 0xdc, 0xf2, 0xe2, 0xec, 0x18, 0xca, 0x5a, 0xe5, 0xe8, 0xb0, 0x5a, 0xd6, - 0x86, 0x2d, 0xb7, 0xbc, 0x78, 0xe1, 0x2d, 0x18, 0x57, 0xea, 0x48, 0x2a, 0x90, 0xdf, 0xa7, 0x07, - 0xbc, 0x3f, 0x2d, 0xf6, 0x2f, 0x99, 0x81, 0x91, 0x87, 0x4e, 0xab, 0x27, 0x3a, 0xd0, 0xe2, 0x3f, - 0xbe, 0x9c, 0xfb, 0x09, 0xc3, 0xfc, 0xf5, 0x02, 0x14, 0x2d, 0x9f, 0xcf, 0x33, 0x72, 0x15, 0x46, - 0x1a, 0x91, 0x13, 0xc9, 0xa1, 0x38, 0x7d, 0x74, 0x58, 0x9d, 0x0a, 0x19, 0x40, 0xf9, 0x1e, 0xc7, - 0x60, 0xa8, 0xeb, 0x7b, 0x4e, 0x28, 0x87, 0x04, 0x51, 0xbb, 0x0c, 0xa0, 0xa2, 0x22, 0x06, 0xb9, - 0x0c, 0x85, 0xfb, 0xbe, 0x4b, 0xc5, 0xa8, 0x90, 0xa3, 0xc3, 0xea, 0x64, 0xdb, 0x77, 0x55, 0x44, - 0x2c, 0x27, 0xaf, 0x43, 0x69, 0xa1, 0x17, 0x04, 0xb4, 0xc3, 0x44, 0xb5, 0x80, 0xc8, 0x93, 0x47, - 0x87, 0x55, 0x68, 0x72, 0x20, 0x9b, 0x5c, 0x09, 0x02, 0xeb, 0xea, 0x46, 0xe4, 0x04, 0x11, 0x75, - 0x67, 0x47, 0x86, 0xea, 0x6a, 0x36, 0xbd, 0xa6, 0x43, 0x4e, 0x92, 0xee, 0x6a, 0xc1, 0x89, 0xdc, - 0x85, 0xf1, 0x3b, 0x81, 0xd3, 0xa4, 0xeb, 0x34, 0xf0, 0x7c, 0x17, 0xc7, 0x30, 0x5f, 0xbf, 0x7c, - 0x74, 0x58, 0x3d, 0xbb, 0xcb, 0xc0, 0x76, 0x17, 0xe1, 0x09, 0xf5, 0x8f, 0x0e, 0xab, 0xc5, 0xc5, - 0x5e, 0x80, 0xbd, 0x67, 0xa9, 0xa4, 0xe4, 0xa7, 0xd9, 0x90, 0x84, 0x11, 0x76, 0x2d, 0x75, 0x71, - 0xf4, 0x8e, 0xaf, 0xa2, 0x29, 0xaa, 0x78, 0xb6, 0xe5, 0x84, 0x91, 0x1d, 0x70, 0xba, 0x54, 0x3d, - 0x55, 0x96, 0x64, 0x0d, 0x8a, 0x8d, 0xe6, 0x1e, 0x75, 0x7b, 0x2d, 0x3a, 0x5b, 0x44, 0xf6, 0xe7, - 0x84, 0xe0, 0xca, 0xf1, 0x94, 0xc5, 0xf5, 0x0b, 0x82, 0x37, 0x09, 0x05, 0x44, 0xe9, 0xfb, 0x98, - 0xc9, 0x97, 0x8b, 0xbf, 0xf5, 0x7b, 0xd5, 0x53, 0xbf, 0xf0, 0x5f, 0x2e, 0x9d, 0x32, 0xff, 0x55, - 0x0e, 0x2a, 0x69, 0x26, 0xe4, 0x01, 0x4c, 0x6c, 0x76, 0x5d, 0x27, 0xa2, 0x0b, 0x2d, 0x8f, 0x76, - 0xa2, 0x10, 0x85, 0xe4, 0xf8, 0x36, 0xbd, 0x22, 0xbe, 0x3b, 0xdb, 0x43, 0x42, 0xbb, 0xc9, 0x29, - 0x53, 0xad, 0xd2, 0xd9, 0x26, 0xdf, 0x69, 0xa0, 0x9e, 0x0e, 0x51, 0xc2, 0x9e, 0xec, 0x3b, 0x5c, - 0xc3, 0x0f, 0xf8, 0x8e, 0x60, 0x2b, 0x04, 0xa8, 0xe3, 0xee, 0x1c, 0xa0, 0x64, 0x0e, 0x2f, 0x40, - 0x8c, 0x24, 0x43, 0x80, 0x18, 0xd8, 0xfc, 0xef, 0x06, 0x4c, 0x5a, 0x34, 0xf4, 0x7b, 0x41, 0x93, - 0xde, 0xa5, 0x8e, 0x4b, 0x03, 0x26, 0xfe, 0xf7, 0xbc, 0x8e, 0x2b, 0xe6, 0x14, 0x8a, 0xff, 0xbe, - 0xd7, 0x51, 0xa7, 0x30, 0x96, 0x93, 0x2f, 0xc0, 0x58, 0xa3, 0xb7, 0x83, 0xa8, 0x7c, 0x4e, 0x9d, - 0xc5, 0x11, 0xeb, 0xed, 0xd8, 0x29, 0x74, 0x89, 0x46, 0xe6, 0x60, 0x6c, 0x8b, 0x06, 0x61, 0xa2, - 0xf1, 0x50, 0xb3, 0x3f, 0xe4, 0x20, 0x95, 0x40, 0x60, 0x91, 0x3b, 0x89, 0xd6, 0x15, 0x6b, 0xd2, - 0x54, 0x4a, 0xd7, 0x25, 0xa2, 0xd2, 0x16, 0x10, 0x55, 0x54, 0x24, 0x96, 0xf9, 0x9d, 0x1c, 0x54, - 0x16, 0x9d, 0xc8, 0xd9, 0x71, 0x42, 0xd1, 0x9f, 0x5b, 0x37, 0x99, 0x1e, 0x57, 0x1a, 0x8a, 0x7a, - 0x9c, 0xd5, 0xfc, 0x13, 0x37, 0xef, 0xd5, 0x74, 0xf3, 0xc6, 0xd9, 0x02, 0x29, 0x9a, 0x97, 0x34, - 0xea, 0xdd, 0x93, 0x1b, 0x55, 0x11, 0x8d, 0x2a, 0xca, 0x46, 0x25, 0x4d, 0x21, 0xef, 0x42, 0xa1, - 0xd1, 0xa5, 0x4d, 0xa1, 0x44, 0xa4, 0xee, 0xd7, 0x1b, 0xc7, 0x10, 0xb6, 0x6e, 0xd6, 0xcb, 0x82, - 0x4d, 0x21, 0xec, 0xd2, 0xa6, 0x85, 0x64, 0xca, 0xa4, 0xf9, 0xee, 0x28, 0xcc, 0x64, 0x91, 0x91, - 0x77, 0xf5, 0xc5, 0x89, 0x77, 0xcf, 0x0b, 0x03, 0x17, 0xa7, 0x59, 0x43, 0x5f, 0x9e, 0xae, 0x41, - 0x71, 0x9d, 0x09, 0x64, 0xd3, 0x6f, 0x89, 0x9e, 0x63, 0x5a, 0xb1, 0xd8, 0x95, 0x30, 0xc3, 0x8a, - 0xcb, 0xc9, 0x0b, 0x90, 0xdf, 0xb4, 0x96, 0x45, 0x77, 0x95, 0x8e, 0x0e, 0xab, 0xf9, 0x5e, 0xe0, - 0xcd, 0x1a, 0x16, 0x83, 0x92, 0x39, 0x18, 0x5d, 0xa8, 0x2d, 0xd0, 0x20, 0xc2, 0x6e, 0x2a, 0xd7, - 0xcf, 0x31, 0x69, 0x69, 0x3a, 0x76, 0x93, 0x06, 0x91, 0xf6, 0x79, 0x81, 0x46, 0x3e, 0x0f, 0xf9, - 0xda, 0x76, 0x43, 0xf4, 0x0c, 0x88, 0x9e, 0xa9, 0x6d, 0x37, 0xea, 0x13, 0xa2, 0x23, 0xf2, 0xce, - 0xa3, 0x90, 0x71, 0xaf, 0x6d, 0x37, 0xd4, 0xd1, 0x1a, 0x3d, 0x66, 0xb4, 0xae, 0x40, 0x91, 0xd9, - 0x19, 0x6c, 0x81, 0x47, 0xa5, 0x58, 0xe2, 0xe6, 0xd3, 0x9e, 0x80, 0x59, 0x71, 0x29, 0x79, 0x39, - 0x36, 0x5b, 0x8a, 0x09, 0x3f, 0x61, 0xb6, 0x48, 0x63, 0x85, 0x3c, 0x86, 0x89, 0xc5, 0x83, 0x8e, - 0xd3, 0xf6, 0x9a, 0x62, 0x09, 0x2f, 0xe1, 0x12, 0x7e, 0xfd, 0x98, 0x61, 0xbc, 0xae, 0x11, 0xf0, - 0x55, 0x5d, 0x2a, 0xdf, 0x59, 0x97, 0x97, 0xd9, 0xe9, 0x15, 0x7e, 0xd6, 0xb0, 0xf4, 0x0f, 0xb1, - 0xb9, 0x24, 0x55, 0x24, 0xda, 0x55, 0x89, 0xd8, 0x49, 0x70, 0x32, 0x97, 0x02, 0x01, 0x51, 0xe7, - 0x52, 0xbc, 0xe8, 0xbe, 0x0b, 0xf9, 0x3b, 0x0b, 0xeb, 0xb3, 0xe3, 0xc8, 0x83, 0x08, 0x1e, 0x77, - 0x16, 0xd6, 0x17, 0x5a, 0x7e, 0xcf, 0x6d, 0x7c, 0xb8, 0x52, 0x3f, 0x27, 0xd8, 0x4c, 0xec, 0x36, - 0xbb, 0x5a, 0x8d, 0x18, 0x1d, 0x59, 0x82, 0xa2, 0x6c, 0xe5, 0x6c, 0x19, 0x79, 0x4c, 0xa7, 0x1a, - 0xbf, 0x75, 0x93, 0xcf, 0x35, 0x57, 0xfc, 0x56, 0x6b, 0x21, 0x71, 0x2e, 0x6c, 0x03, 0xe9, 0xef, - 0x97, 0x0c, 0x4b, 0xe2, 0xf3, 0xaa, 0x25, 0x31, 0x3e, 0x7f, 0x46, 0x7c, 0x6b, 0xc1, 0x6f, 0xb7, - 0x9d, 0x8e, 0x8b, 0xb4, 0x5b, 0xf3, 0xaa, 0x81, 0x51, 0x83, 0xc9, 0xa4, 0x22, 0x2b, 0x5e, 0x18, - 0x91, 0x39, 0x28, 0x49, 0x08, 0x5b, 0x44, 0xf2, 0x99, 0x55, 0xb6, 0x12, 0x1c, 0xf3, 0x4f, 0x73, - 0x00, 0x49, 0xc9, 0x73, 0xaa, 0x67, 0xbe, 0xa4, 0xe9, 0x99, 0x33, 0x69, 0x01, 0x1d, 0xa8, 0x61, - 0xc8, 0xfb, 0x30, 0xca, 0x4c, 0xae, 0x9e, 0x34, 0x29, 0xcf, 0xa5, 0x49, 0xb1, 0x70, 0xeb, 0x66, - 0x7d, 0x52, 0x10, 0x8f, 0x86, 0x08, 0xb1, 0x04, 0x99, 0xa2, 0xa2, 0xfe, 0x78, 0x24, 0x19, 0x0c, - 0xa1, 0x9c, 0xae, 0x28, 0xda, 0xc5, 0x48, 0xe6, 0xa3, 0xd4, 0x2e, 0x8a, 0x6e, 0x39, 0xcf, 0x75, - 0x0b, 0xef, 0xd4, 0x31, 0xa1, 0x5b, 0xd2, 0x9a, 0x85, 0x77, 0xe0, 0x89, 0x9a, 0xa5, 0x9b, 0x9e, - 0xb6, 0x05, 0x14, 0x83, 0x2b, 0x99, 0xbd, 0x92, 0x35, 0x61, 0x2f, 0x9d, 0x34, 0x61, 0xd3, 0xd3, - 0xf5, 0xe6, 0x20, 0x5d, 0x76, 0x46, 0xce, 0x2e, 0xe7, 0x91, 0x4a, 0x8e, 0x3a, 0xed, 0x6d, 0x3e, - 0x35, 0x47, 0x07, 0x4e, 0xcd, 0x33, 0x99, 0x53, 0x93, 0x4f, 0xcc, 0xb7, 0x61, 0xa4, 0xf6, 0x33, - 0xbd, 0x80, 0x0a, 0xdb, 0xaf, 0x2c, 0xbf, 0xc9, 0x60, 0xf1, 0x9c, 0x9e, 0x72, 0xd8, 0x4f, 0xd5, - 0x66, 0xc6, 0x72, 0xf6, 0xe5, 0x8d, 0x95, 0x86, 0xb0, 0xeb, 0x48, 0xaa, 0x5b, 0x36, 0x56, 0x94, - 0x6a, 0x47, 0x5a, 0xab, 0x19, 0x15, 0x99, 0x83, 0x5c, 0x6d, 0x11, 0x37, 0x8b, 0xe3, 0xf3, 0x25, - 0xf9, 0xd9, 0xc5, 0xfa, 0x8c, 0x20, 0x29, 0x3b, 0xda, 0xfe, 0xa1, 0xb6, 0x48, 0xea, 0x30, 0x72, - 0xff, 0xa0, 0xf1, 0xe1, 0x8a, 0x50, 0x64, 0xa7, 0xa5, 0x5c, 0x33, 0xd8, 0x1a, 0xae, 0x42, 0x61, - 0x52, 0xe3, 0xf6, 0x41, 0xf8, 0xcd, 0x96, 0x5a, 0x63, 0x44, 0xfb, 0xf4, 0x14, 0xc8, 0x3f, 0x37, - 0x14, 0x5b, 0x43, 0xc8, 0x3a, 0xdb, 0xd3, 0x0a, 0x89, 0x33, 0x12, 0xcb, 0xa7, 0x4f, 0xe2, 0x62, - 0x79, 0xbb, 0xca, 0x47, 0x3f, 0xd7, 0x37, 0xfa, 0xe3, 0xca, 0x4a, 0xc6, 0xc7, 0x3c, 0xee, 0x8b, - 0xfc, 0x27, 0xee, 0x0b, 0xf3, 0x7f, 0x18, 0xf8, 0x3d, 0xf2, 0x3a, 0x8c, 0x5a, 0x74, 0x37, 0x59, - 0xf4, 0x71, 0xf3, 0x18, 0x20, 0x44, 0xad, 0x24, 0xc7, 0xc1, 0x15, 0x85, 0xba, 0xe1, 0x9e, 0xf7, - 0x20, 0x12, 0x35, 0x8d, 0x57, 0x14, 0x01, 0x56, 0x56, 0x14, 0x01, 0xd1, 0x56, 0x14, 0x01, 0x63, - 0xb2, 0x6e, 0x2d, 0x36, 0x44, 0x03, 0x64, 0x6b, 0xad, 0x45, 0x45, 0x68, 0x02, 0x57, 0x13, 0x1a, - 0x6b, 0xb1, 0x41, 0x6e, 0x41, 0xa9, 0xd6, 0x6c, 0xfa, 0x3d, 0x65, 0xf7, 0x35, 0x7b, 0x74, 0x58, - 0x9d, 0x71, 0x38, 0x50, 0x3f, 0x2b, 0x48, 0x50, 0xcd, 0x7a, 0x52, 0x6b, 0xc6, 0x63, 0xa1, 0xd5, - 0x0b, 0x23, 0x1a, 0x2c, 0x2f, 0x8a, 0x26, 0x23, 0x8f, 0x26, 0x07, 0xa6, 0x78, 0xc4, 0xa8, 0xe6, - 0x7f, 0x36, 0xb0, 0xc6, 0xe4, 0x2d, 0x80, 0xe5, 0x0e, 0xb3, 0xb0, 0x9b, 0x34, 0x66, 0x80, 0xbb, - 0x78, 0x4f, 0x40, 0x75, 0x0e, 0x0a, 0xb2, 0xfe, 0xe9, 0xdc, 0xd0, 0x9f, 0x66, 0x9f, 0x94, 0xf6, - 0xba, 0x38, 0xd0, 0x11, 0x9f, 0x0c, 0x04, 0x34, 0xf5, 0xc9, 0x04, 0x99, 0x5c, 0x86, 0xb1, 0xe5, - 0xda, 0xfd, 0x5a, 0x2f, 0xda, 0xc3, 0xfe, 0x2a, 0x72, 0xcd, 0xe9, 0x39, 0x6d, 0xdb, 0xe9, 0x45, - 0x7b, 0x96, 0x2c, 0x34, 0x7f, 0xc1, 0x80, 0x71, 0x45, 0x69, 0xb0, 0xaa, 0xae, 0x07, 0xfe, 0xc7, - 0xb4, 0x19, 0xe9, 0xbd, 0xd4, 0xe5, 0xc0, 0x54, 0x55, 0x63, 0xd4, 0x54, 0xef, 0xe4, 0x9e, 0xa0, - 0x77, 0xcc, 0x39, 0xa1, 0x8b, 0xd8, 0x66, 0x44, 0x39, 0x6b, 0xc1, 0xcd, 0x08, 0x33, 0xb6, 0xd4, - 0xcd, 0x08, 0x2b, 0x37, 0xff, 0xd0, 0x60, 0x3a, 0x84, 0xcc, 0x01, 0xdc, 0xa3, 0x07, 0x91, 0xb3, - 0x73, 0xdb, 0x6b, 0x69, 0x67, 0x68, 0xfb, 0x08, 0xb5, 0x1f, 0x78, 0x2d, 0x6a, 0x29, 0x28, 0xe4, - 0x26, 0x14, 0xef, 0x05, 0x3b, 0x6f, 0x22, 0x7a, 0x2e, 0x5e, 0x0b, 0x4e, 0xef, 0x07, 0x3b, 0x6f, - 0x22, 0xb2, 0x2a, 0xaf, 0x12, 0x91, 0x98, 0x30, 0xba, 0xe8, 0xb7, 0x1d, 0x4f, 0xae, 0xbf, 0xc0, - 0x16, 0x31, 0x17, 0x21, 0x96, 0x28, 0x61, 0xab, 0x4f, 0x63, 0x7d, 0x55, 0x08, 0x26, 0xae, 0x3e, - 0x61, 0xb7, 0x63, 0x31, 0x98, 0xf9, 0x3d, 0x03, 0xc6, 0x15, 0xd5, 0x48, 0xbe, 0x28, 0xce, 0x1b, - 0x0c, 0x3c, 0x2d, 0x3b, 0xdb, 0xaf, 0x3c, 0x59, 0x29, 0xb7, 0x1b, 0xda, 0xbe, 0x4b, 0xc5, 0xe9, + 0x76, 0x18, 0xae, 0x9e, 0x19, 0x92, 0x33, 0x8f, 0x43, 0x72, 0x58, 0xfa, 0x47, 0x69, 0xb5, 0x3b, + 0xba, 0xde, 0x5d, 0xad, 0x56, 0xb7, 0x2b, 0x9e, 0xa8, 0xdb, 0x3d, 0xef, 0xed, 0xbf, 0x9b, 0x21, + 0x29, 0x89, 0x2b, 0x8a, 0xe4, 0xf6, 0xf0, 0xcf, 0x9d, 0xef, 0xce, 0xed, 0xe6, 0x74, 0x91, 0xec, + 0xe5, 0xcc, 0xf4, 0x5c, 0x77, 0x8f, 0x24, 0xda, 0x3f, 0xc3, 0x36, 0x7e, 0x70, 0x0c, 0xc3, 0xf0, + 0x9d, 0xcf, 0x38, 0xc7, 0x76, 0xe0, 0xc0, 0x8e, 0x11, 0x27, 0x71, 0x82, 0x33, 0x02, 0x27, 0x40, + 0x12, 0x24, 0x48, 0x60, 0x20, 0x30, 0xee, 0x43, 0x8c, 0xf8, 0x4b, 0x10, 0xd8, 0x09, 0x98, 0xf8, + 0x2e, 0x5f, 0x42, 0x20, 0x40, 0x00, 0x03, 0x01, 0x7c, 0x89, 0x81, 0xa0, 0x5e, 0x55, 0x75, 0x57, + 0xf5, 0xf4, 0x90, 0xc3, 0x95, 0x16, 0xb1, 0xf6, 0x13, 0x39, 0xaf, 0xde, 0x7b, 0x5d, 0x7f, 0x5e, + 0xbd, 0x7a, 0xf5, 0xea, 0xd5, 0x2b, 0x18, 0x8f, 0x0e, 0xba, 0x34, 0xbc, 0xd9, 0x0d, 0xfc, 0xc8, + 0x27, 0x23, 0xf8, 0xe3, 0xf2, 0xb9, 0x5d, 0x7f, 0xd7, 0x47, 0xc8, 0x2c, 0xfb, 0x8f, 0x17, 0x5e, + 0xae, 0xee, 0xfa, 0xfe, 0x6e, 0x8b, 0xce, 0xe2, 0xaf, 0xed, 0xde, 0xce, 0x6c, 0xe4, 0xb5, 0x69, + 0x18, 0x39, 0xed, 0xae, 0x40, 0x98, 0xdf, 0xf5, 0xa2, 0xbd, 0xde, 0xf6, 0xcd, 0xa6, 0xdf, 0x9e, + 0xdd, 0x0d, 0x9c, 0x87, 0x5e, 0xe4, 0x44, 0x9e, 0xdf, 0x71, 0x5a, 0xb3, 0x11, 0x6d, 0xd1, 0xae, + 0x1f, 0x44, 0xb3, 0x4e, 0xd7, 0x9b, 0xc5, 0x6f, 0xcc, 0x3e, 0x0a, 0x9c, 0x6e, 0x97, 0x06, 0xc9, + 0x3f, 0x9c, 0x89, 0xf9, 0x77, 0xf2, 0x50, 0xba, 0x4f, 0x69, 0xb7, 0xd6, 0xf2, 0x1e, 0x52, 0xf2, + 0x22, 0x14, 0x56, 0x9c, 0x36, 0x9d, 0x31, 0xae, 0x1a, 0xd7, 0x4b, 0xf5, 0xa9, 0xa3, 0xc3, 0xea, + 0x78, 0x48, 0x83, 0x87, 0x34, 0xb0, 0x3b, 0x4e, 0x9b, 0x5a, 0x58, 0x48, 0x3e, 0x0b, 0x25, 0xf6, + 0x37, 0xec, 0x3a, 0x4d, 0x3a, 0x93, 0x43, 0xcc, 0x89, 0xa3, 0xc3, 0x6a, 0xa9, 0x23, 0x81, 0x56, + 0x52, 0x4e, 0xae, 0xc1, 0xd8, 0x32, 0x75, 0x42, 0xba, 0xb4, 0x30, 0x93, 0xbf, 0x6a, 0x5c, 0xcf, + 0xd7, 0xcb, 0x47, 0x87, 0xd5, 0x62, 0x8b, 0x81, 0x6c, 0xcf, 0xb5, 0x64, 0x21, 0x59, 0x82, 0xb1, + 0xc5, 0xc7, 0x5d, 0x2f, 0xa0, 0xe1, 0x4c, 0xe1, 0xaa, 0x71, 0x7d, 0x7c, 0xee, 0xf2, 0x4d, 0xde, + 0xfe, 0x9b, 0xb2, 0xfd, 0x37, 0xd7, 0x65, 0xfb, 0xeb, 0x67, 0xbf, 0x77, 0x58, 0x3d, 0x73, 0x74, + 0x58, 0x1d, 0xa3, 0x9c, 0xe4, 0x97, 0xff, 0x4b, 0xd5, 0xb0, 0x24, 0x3d, 0x79, 0x07, 0x0a, 0xeb, + 0x07, 0x5d, 0x3a, 0x53, 0xba, 0x6a, 0x5c, 0x9f, 0x9c, 0x7b, 0xe1, 0x26, 0xef, 0xf1, 0xb8, 0x91, + 0xc9, 0x7f, 0x0c, 0xab, 0x5e, 0x3c, 0x3a, 0xac, 0x16, 0x18, 0x8a, 0x85, 0x54, 0xe4, 0x75, 0x18, + 0xbd, 0xe7, 0x87, 0xd1, 0xd2, 0xc2, 0x0c, 0x60, 0xd3, 0xce, 0x1f, 0x1d, 0x56, 0xa7, 0xf7, 0xfc, + 0x30, 0xb2, 0x3d, 0xf7, 0x35, 0xbf, 0xed, 0x45, 0xb4, 0xdd, 0x8d, 0x0e, 0x2c, 0x81, 0x64, 0x6e, + 0xc3, 0x84, 0xc6, 0x8f, 0x8c, 0xc3, 0xd8, 0xc6, 0xca, 0xfd, 0x95, 0xd5, 0xad, 0x95, 0xca, 0x19, + 0x52, 0x84, 0xc2, 0xca, 0xea, 0xc2, 0x62, 0xc5, 0x20, 0x63, 0x90, 0xaf, 0xad, 0xad, 0x55, 0x72, + 0xa4, 0x0c, 0xc5, 0x85, 0xda, 0x7a, 0xad, 0x5e, 0x6b, 0x2c, 0x56, 0xf2, 0xe4, 0x2c, 0x4c, 0x6d, + 0x2d, 0xad, 0x2c, 0xac, 0x6e, 0x35, 0xec, 0x85, 0xc5, 0xc6, 0xfd, 0xf5, 0xd5, 0xb5, 0x4a, 0x81, + 0x4c, 0x02, 0xdc, 0xdf, 0xa8, 0x2f, 0x5a, 0x2b, 0x8b, 0xeb, 0x8b, 0x8d, 0xca, 0x88, 0xf9, 0xf3, + 0x79, 0x28, 0x3e, 0xa0, 0x91, 0xe3, 0x3a, 0x91, 0x43, 0xae, 0x68, 0x43, 0x84, 0xb5, 0x57, 0xc6, + 0xe6, 0xc5, 0xfe, 0xb1, 0x19, 0x39, 0x3a, 0xac, 0x1a, 0xaf, 0xab, 0x63, 0xf2, 0x36, 0x8c, 0x2f, + 0xd0, 0xb0, 0x19, 0x78, 0x5d, 0x26, 0x2f, 0x38, 0x2e, 0xa5, 0xfa, 0xa5, 0xa3, 0xc3, 0xea, 0x79, + 0x37, 0x01, 0x2b, 0x6d, 0x55, 0xb1, 0xc9, 0x12, 0x8c, 0x2e, 0x3b, 0xdb, 0xb4, 0x15, 0xce, 0x8c, + 0x5c, 0xcd, 0x5f, 0x1f, 0x9f, 0x7b, 0x4e, 0xf4, 0xaf, 0xac, 0xe0, 0x4d, 0x5e, 0xba, 0xd8, 0x89, + 0x82, 0x83, 0xfa, 0xb9, 0xa3, 0xc3, 0x6a, 0xa5, 0x85, 0x00, 0xb5, 0xef, 0x38, 0x0a, 0x69, 0x24, + 0x63, 0x3e, 0x7a, 0xe2, 0x98, 0x3f, 0xff, 0xbd, 0xc3, 0xaa, 0xc1, 0xc6, 0x42, 0x8c, 0x79, 0xc2, + 0x4f, 0x1f, 0xfd, 0xab, 0x90, 0x5b, 0x5a, 0x98, 0x19, 0x43, 0x59, 0xab, 0x1c, 0x1d, 0x56, 0xcb, + 0xda, 0xb0, 0xe5, 0x96, 0x16, 0x2e, 0xbf, 0x05, 0xe3, 0x4a, 0x1d, 0x49, 0x05, 0xf2, 0xfb, 0xf4, + 0x80, 0xf7, 0xa7, 0xc5, 0xfe, 0x25, 0xe7, 0x60, 0xe4, 0xa1, 0xd3, 0xea, 0x89, 0x0e, 0xb4, 0xf8, + 0x8f, 0x2f, 0xe6, 0x7e, 0xc4, 0x30, 0x7f, 0xa5, 0x00, 0x45, 0xcb, 0xe7, 0xf3, 0x8c, 0xbc, 0x0a, + 0x23, 0x8d, 0xc8, 0x89, 0xe4, 0x50, 0x9c, 0x3d, 0x3a, 0xac, 0x4e, 0x85, 0x0c, 0xa0, 0x7c, 0x8f, + 0x63, 0x30, 0xd4, 0xb5, 0x3d, 0x27, 0x94, 0x43, 0x82, 0xa8, 0x5d, 0x06, 0x50, 0x51, 0x11, 0x83, + 0x5c, 0x83, 0xc2, 0x03, 0xdf, 0xa5, 0x62, 0x54, 0xc8, 0xd1, 0x61, 0x75, 0xb2, 0xed, 0xbb, 0x2a, + 0x22, 0x96, 0x93, 0xd7, 0xa0, 0x34, 0xdf, 0x0b, 0x02, 0xda, 0x61, 0xa2, 0x5a, 0x40, 0xe4, 0xc9, + 0xa3, 0xc3, 0x2a, 0x34, 0x39, 0x90, 0x4d, 0xae, 0x04, 0x81, 0x75, 0x75, 0x23, 0x72, 0x82, 0x88, + 0xba, 0x33, 0x23, 0x43, 0x75, 0x35, 0x9b, 0x5e, 0xd3, 0x21, 0x27, 0x49, 0x77, 0xb5, 0xe0, 0x44, + 0xee, 0xc1, 0xf8, 0xdd, 0xc0, 0x69, 0xd2, 0x35, 0x1a, 0x78, 0xbe, 0x8b, 0x63, 0x98, 0xaf, 0x5f, + 0x3b, 0x3a, 0xac, 0x5e, 0xd8, 0x65, 0x60, 0xbb, 0x8b, 0xf0, 0x84, 0xfa, 0x87, 0x87, 0xd5, 0xe2, + 0x42, 0x2f, 0xc0, 0xde, 0xb3, 0x54, 0x52, 0xf2, 0xe3, 0x6c, 0x48, 0xc2, 0x08, 0xbb, 0x96, 0xba, + 0x38, 0x7a, 0xc7, 0x57, 0xd1, 0x14, 0x55, 0xbc, 0xd0, 0x72, 0xc2, 0xc8, 0x0e, 0x38, 0x5d, 0xaa, + 0x9e, 0x2a, 0x4b, 0xb2, 0x0a, 0xc5, 0x46, 0x73, 0x8f, 0xba, 0xbd, 0x16, 0x9d, 0x29, 0x22, 0xfb, + 0x8b, 0x42, 0x70, 0xe5, 0x78, 0xca, 0xe2, 0xfa, 0x65, 0xc1, 0x9b, 0x84, 0x02, 0xa2, 0xf4, 0x7d, + 0xcc, 0xe4, 0x8b, 0xc5, 0x5f, 0xff, 0xed, 0xea, 0x99, 0x9f, 0xf9, 0xcf, 0x57, 0xcf, 0x98, 0xff, + 0x2c, 0x07, 0x95, 0x34, 0x13, 0xb2, 0x03, 0x13, 0x1b, 0x5d, 0xd7, 0x89, 0xe8, 0x7c, 0xcb, 0xa3, + 0x9d, 0x28, 0x44, 0x21, 0x39, 0xbe, 0x4d, 0x2f, 0x89, 0xef, 0xce, 0xf4, 0x90, 0xd0, 0x6e, 0x72, + 0xca, 0x54, 0xab, 0x74, 0xb6, 0xc9, 0x77, 0x1a, 0xa8, 0xa7, 0x43, 0x94, 0xb0, 0xd3, 0x7d, 0x87, + 0x6b, 0xf8, 0x01, 0xdf, 0x11, 0x6c, 0x85, 0x00, 0x75, 0xdc, 0xed, 0x03, 0x94, 0xcc, 0xe1, 0x05, + 0x88, 0x91, 0x64, 0x08, 0x10, 0x03, 0x9b, 0xff, 0xcd, 0x80, 0x49, 0x8b, 0x86, 0x7e, 0x2f, 0x68, + 0xd2, 0x7b, 0xd4, 0x71, 0x69, 0xc0, 0xc4, 0xff, 0xbe, 0xd7, 0x71, 0xc5, 0x9c, 0x42, 0xf1, 0xdf, + 0xf7, 0x3a, 0xea, 0x14, 0xc6, 0x72, 0xf2, 0x39, 0x18, 0x6b, 0xf4, 0xb6, 0x11, 0x95, 0xcf, 0xa9, + 0x0b, 0x38, 0x62, 0xbd, 0x6d, 0x3b, 0x85, 0x2e, 0xd1, 0xc8, 0x2c, 0x8c, 0x6d, 0xd2, 0x20, 0x4c, + 0x34, 0x1e, 0x6a, 0xf6, 0x87, 0x1c, 0xa4, 0x12, 0x08, 0x2c, 0x72, 0x37, 0xd1, 0xba, 0x62, 0x4d, + 0x9a, 0x4a, 0xe9, 0xba, 0x44, 0x54, 0xda, 0x02, 0xa2, 0x8a, 0x8a, 0xc4, 0x32, 0xbf, 0x9d, 0x83, + 0xca, 0x82, 0x13, 0x39, 0xdb, 0x4e, 0x28, 0xfa, 0x73, 0xf3, 0x36, 0xd3, 0xe3, 0x4a, 0x43, 0x51, + 0x8f, 0xb3, 0x9a, 0x7f, 0xec, 0xe6, 0xbd, 0x9c, 0x6e, 0xde, 0x38, 0x5b, 0x20, 0x45, 0xf3, 0x92, + 0x46, 0xbd, 0x7b, 0x72, 0xa3, 0x2a, 0xa2, 0x51, 0x45, 0xd9, 0xa8, 0xa4, 0x29, 0xe4, 0x5d, 0x28, + 0x34, 0xba, 0xb4, 0x29, 0x94, 0x88, 0xd4, 0xfd, 0x7a, 0xe3, 0x18, 0xc2, 0xe6, 0xed, 0x7a, 0x59, + 0xb0, 0x29, 0x84, 0x5d, 0xda, 0xb4, 0x90, 0x4c, 0x99, 0x34, 0xdf, 0x19, 0x85, 0x73, 0x59, 0x64, + 0xe4, 0x5d, 0x7d, 0x71, 0xe2, 0xdd, 0xf3, 0xdc, 0xc0, 0xc5, 0x69, 0xc6, 0xd0, 0x97, 0xa7, 0x1b, + 0x50, 0x5c, 0x63, 0x02, 0xd9, 0xf4, 0x5b, 0xa2, 0xe7, 0x98, 0x56, 0x2c, 0x76, 0x25, 0xcc, 0xb0, + 0xe2, 0x72, 0xf2, 0x1c, 0xe4, 0x37, 0xac, 0x25, 0xd1, 0x5d, 0xa5, 0xa3, 0xc3, 0x6a, 0xbe, 0x17, + 0x78, 0x33, 0x86, 0xc5, 0xa0, 0x64, 0x16, 0x46, 0xe7, 0x6b, 0xf3, 0x34, 0x88, 0xb0, 0x9b, 0xca, + 0xf5, 0x8b, 0x4c, 0x5a, 0x9a, 0x8e, 0xdd, 0xa4, 0x41, 0xa4, 0x7d, 0x5e, 0xa0, 0x91, 0xcf, 0x42, + 0xbe, 0xb6, 0xd5, 0x10, 0x3d, 0x03, 0xa2, 0x67, 0x6a, 0x5b, 0x8d, 0xfa, 0x84, 0xe8, 0x88, 0xbc, + 0xf3, 0x28, 0x64, 0xdc, 0x6b, 0x5b, 0x0d, 0x75, 0xb4, 0x46, 0x8f, 0x19, 0xad, 0xeb, 0x50, 0x64, + 0x76, 0x06, 0x5b, 0xe0, 0x51, 0x29, 0x96, 0xb8, 0xf9, 0xb4, 0x27, 0x60, 0x56, 0x5c, 0x4a, 0x5e, + 0x8c, 0xcd, 0x96, 0x62, 0xc2, 0x4f, 0x98, 0x2d, 0xd2, 0x58, 0x21, 0x8f, 0x61, 0x62, 0xe1, 0xa0, + 0xe3, 0xb4, 0xbd, 0xa6, 0x58, 0xc2, 0x4b, 0xb8, 0x84, 0xdf, 0x3c, 0x66, 0x18, 0x6f, 0x6a, 0x04, + 0x7c, 0x55, 0x97, 0xca, 0x77, 0xc6, 0xe5, 0x65, 0x76, 0x7a, 0x85, 0x9f, 0x31, 0x2c, 0xfd, 0x43, + 0x6c, 0x2e, 0x49, 0x15, 0x89, 0x76, 0x55, 0x22, 0x76, 0x12, 0x9c, 0xcc, 0xa5, 0x40, 0x40, 0xd4, + 0xb9, 0x14, 0x2f, 0xba, 0xef, 0x42, 0xfe, 0xee, 0xfc, 0xda, 0xcc, 0x38, 0xf2, 0x20, 0x82, 0xc7, + 0xdd, 0xf9, 0xb5, 0xf9, 0x96, 0xdf, 0x73, 0x1b, 0x1f, 0x2e, 0xd7, 0x2f, 0x0a, 0x36, 0x13, 0xbb, + 0xcd, 0xae, 0x56, 0x23, 0x46, 0x47, 0x16, 0xa1, 0x28, 0x5b, 0x39, 0x53, 0x46, 0x1e, 0xd3, 0xa9, + 0xc6, 0x6f, 0xde, 0xe6, 0x73, 0xcd, 0x15, 0xbf, 0xd5, 0x5a, 0x48, 0x9c, 0xcb, 0x5b, 0x40, 0xfa, + 0xfb, 0x25, 0xc3, 0x92, 0xf8, 0xac, 0x6a, 0x49, 0x8c, 0xcf, 0x9d, 0x17, 0xdf, 0x9a, 0xf7, 0xdb, + 0x6d, 0xa7, 0xe3, 0x22, 0xed, 0xe6, 0x9c, 0x6a, 0x60, 0xd4, 0x60, 0x32, 0xa9, 0xc8, 0xb2, 0x17, + 0x46, 0x64, 0x16, 0x4a, 0x12, 0xc2, 0x16, 0x91, 0x7c, 0x66, 0x95, 0xad, 0x04, 0xc7, 0xfc, 0xa3, + 0x1c, 0x40, 0x52, 0xf2, 0x8c, 0xea, 0x99, 0x2f, 0x68, 0x7a, 0xe6, 0x7c, 0x5a, 0x40, 0x07, 0x6a, + 0x18, 0xf2, 0x3e, 0x8c, 0x32, 0x93, 0xab, 0x27, 0x4d, 0xca, 0x8b, 0x69, 0x52, 0x2c, 0xdc, 0xbc, + 0x5d, 0x9f, 0x14, 0xc4, 0xa3, 0x21, 0x42, 0x2c, 0x41, 0xa6, 0xa8, 0xa8, 0x3f, 0x18, 0x49, 0x06, + 0x43, 0x28, 0xa7, 0xeb, 0x8a, 0x76, 0x31, 0x92, 0xf9, 0x28, 0xb5, 0x8b, 0xa2, 0x5b, 0x2e, 0x71, + 0xdd, 0xc2, 0x3b, 0x75, 0x4c, 0xe8, 0x96, 0xb4, 0x66, 0xe1, 0x1d, 0x78, 0xa2, 0x66, 0xe9, 0xa6, + 0xa7, 0x6d, 0x01, 0xc5, 0xe0, 0x7a, 0x66, 0xaf, 0x64, 0x4d, 0xd8, 0xab, 0x27, 0x4d, 0xd8, 0xf4, + 0x74, 0xbd, 0x3d, 0x48, 0x97, 0x9d, 0x97, 0xb3, 0xcb, 0x79, 0xa4, 0x92, 0xa3, 0x4e, 0x7b, 0x9b, + 0x4f, 0xcd, 0xd1, 0x81, 0x53, 0xf3, 0x7c, 0xe6, 0xd4, 0xe4, 0x13, 0xf3, 0x6d, 0x18, 0xa9, 0xfd, + 0x44, 0x2f, 0xa0, 0xc2, 0xf6, 0x2b, 0xcb, 0x6f, 0x32, 0x58, 0x3c, 0xa7, 0xa7, 0x1c, 0xf6, 0x53, + 0xb5, 0x99, 0xb1, 0x9c, 0x7d, 0x79, 0x7d, 0xb9, 0x21, 0xec, 0x3a, 0x92, 0xea, 0x96, 0xf5, 0x65, + 0xa5, 0xda, 0x91, 0xd6, 0x6a, 0x46, 0x45, 0x66, 0x21, 0x57, 0x5b, 0xc0, 0xcd, 0xe2, 0xf8, 0x5c, + 0x49, 0x7e, 0x76, 0xa1, 0x7e, 0x4e, 0x90, 0x94, 0x1d, 0x6d, 0xff, 0x50, 0x5b, 0x20, 0x75, 0x18, + 0x79, 0x70, 0xd0, 0xf8, 0x70, 0x59, 0x28, 0xb2, 0xb3, 0x52, 0xae, 0x19, 0x6c, 0x15, 0x57, 0xa1, + 0x30, 0xa9, 0x71, 0xfb, 0x20, 0xfc, 0x46, 0x4b, 0xad, 0x31, 0xa2, 0x7d, 0x72, 0x0a, 0xe4, 0x1f, + 0x1b, 0x8a, 0xad, 0x21, 0x64, 0x9d, 0xed, 0x69, 0x85, 0xc4, 0x19, 0x89, 0xe5, 0xd3, 0x27, 0x71, + 0xb1, 0xbc, 0xbd, 0xca, 0x47, 0x3f, 0xd7, 0x37, 0xfa, 0xe3, 0xca, 0x4a, 0xc6, 0xc7, 0x3c, 0xee, + 0x8b, 0xfc, 0xc7, 0xee, 0x0b, 0xf3, 0xbf, 0x1b, 0xf8, 0x3d, 0xf2, 0x1a, 0x8c, 0x5a, 0x74, 0x37, + 0x59, 0xf4, 0x71, 0xf3, 0x18, 0x20, 0x44, 0xad, 0x24, 0xc7, 0xc1, 0x15, 0x85, 0xba, 0xe1, 0x9e, + 0xb7, 0x13, 0x89, 0x9a, 0xc6, 0x2b, 0x8a, 0x00, 0x2b, 0x2b, 0x8a, 0x80, 0x68, 0x2b, 0x8a, 0x80, + 0x31, 0x59, 0xb7, 0x16, 0x1a, 0xa2, 0x01, 0xb2, 0xb5, 0xd6, 0x82, 0x22, 0x34, 0x81, 0xab, 0x09, + 0x8d, 0xb5, 0xd0, 0x20, 0x6f, 0x42, 0xa9, 0xd6, 0x6c, 0xfa, 0x3d, 0x65, 0xf7, 0x35, 0x73, 0x74, + 0x58, 0x3d, 0xe7, 0x70, 0xa0, 0xee, 0x2b, 0x48, 0x50, 0xcd, 0x7a, 0x52, 0x6b, 0xc6, 0x63, 0xbe, + 0xd5, 0x0b, 0x23, 0x1a, 0x2c, 0x2d, 0x88, 0x26, 0x23, 0x8f, 0x26, 0x07, 0xa6, 0x78, 0xc4, 0xa8, + 0xe6, 0x7f, 0x32, 0xb0, 0xc6, 0xe4, 0x2d, 0x80, 0xa5, 0x0e, 0xb3, 0xb0, 0x9b, 0x34, 0x66, 0x80, + 0xbb, 0x78, 0x4f, 0x40, 0x75, 0x0e, 0x0a, 0xb2, 0xfe, 0xe9, 0xdc, 0xd0, 0x9f, 0x66, 0x9f, 0x94, + 0xf6, 0xba, 0x70, 0xe8, 0x88, 0x4f, 0x06, 0x02, 0x9a, 0xfa, 0x64, 0x82, 0x4c, 0xae, 0xc1, 0xd8, + 0x52, 0xed, 0x41, 0xad, 0x17, 0xed, 0x61, 0x7f, 0x15, 0xb9, 0xe6, 0xf4, 0x9c, 0xb6, 0xed, 0xf4, + 0xa2, 0x3d, 0x4b, 0x16, 0x9a, 0x3f, 0x63, 0xc0, 0xb8, 0xa2, 0x34, 0x58, 0x55, 0xd7, 0x02, 0xff, + 0x23, 0xda, 0x8c, 0xf4, 0x5e, 0xea, 0x72, 0x60, 0xaa, 0xaa, 0x31, 0x6a, 0xaa, 0x77, 0x72, 0xa7, + 0xe8, 0x1d, 0x73, 0x56, 0xe8, 0x22, 0xb6, 0x19, 0x51, 0x7c, 0x2d, 0xb8, 0x19, 0x61, 0xc6, 0x96, + 0xba, 0x19, 0x61, 0xe5, 0xe6, 0xef, 0x19, 0x4c, 0x87, 0x90, 0x59, 0x80, 0xfb, 0xf4, 0x20, 0x72, + 0xb6, 0xef, 0x78, 0x2d, 0xcd, 0x87, 0xb6, 0x8f, 0x50, 0x7b, 0xc7, 0x6b, 0x51, 0x4b, 0x41, 0x21, + 0xb7, 0xa1, 0x78, 0x3f, 0xd8, 0x7e, 0x03, 0xd1, 0x73, 0xf1, 0x5a, 0x70, 0x76, 0x3f, 0xd8, 0x7e, + 0x03, 0x91, 0x55, 0x79, 0x95, 0x88, 0xc4, 0x84, 0xd1, 0x05, 0xbf, 0xed, 0x78, 0x72, 0xfd, 0x05, + 0xb6, 0x88, 0xb9, 0x08, 0xb1, 0x44, 0x09, 0x5b, 0x7d, 0x1a, 0x6b, 0x2b, 0x42, 0x30, 0x71, 0xf5, + 0x09, 0xbb, 0x1d, 0x8b, 0xc1, 0xcc, 0xef, 0x1a, 0x30, 0xae, 0xa8, 0x46, 0xf2, 0x79, 0xe1, 0x6f, + 0x30, 0xd0, 0x5b, 0x76, 0xa1, 0x5f, 0x79, 0xb2, 0x52, 0x6e, 0x37, 0xb4, 0x7d, 0x97, 0x0a, 0xef, 0x43, 0xa2, 0x51, 0x72, 0xc3, 0x68, 0x94, 0xb7, 0x00, 0xb8, 0x51, 0x89, 0xdd, 0xa9, 0xc8, 0x8d, - 0x72, 0xba, 0xa8, 0x0e, 0x46, 0x82, 0x6c, 0x5a, 0x50, 0x56, 0xb5, 0x09, 0xa9, 0xc3, 0x84, 0xd8, - 0x43, 0x09, 0x2b, 0x84, 0xf7, 0xf3, 0x45, 0xb6, 0xbc, 0x09, 0x6e, 0xfd, 0x7b, 0x3a, 0x9d, 0xc4, - 0xfc, 0xff, 0x73, 0x50, 0x14, 0x90, 0xf9, 0xe7, 0xd4, 0x40, 0x7a, 0x53, 0x33, 0x90, 0xa4, 0xde, - 0x55, 0x2c, 0xf7, 0xf9, 0x13, 0x36, 0x60, 0x6f, 0x41, 0x59, 0x76, 0x01, 0xda, 0x99, 0x57, 0x61, - 0x4c, 0x1e, 0x21, 0x70, 0x2b, 0x73, 0x4a, 0xe3, 0xb9, 0x35, 0x6f, 0xc9, 0x72, 0xf3, 0x3b, 0x23, - 0x92, 0x96, 0x7f, 0x89, 0x75, 0x61, 0xcd, 0x75, 0x03, 0xb5, 0x0b, 0x1d, 0xd7, 0x0d, 0x2c, 0x84, - 0xb2, 0xc1, 0x5f, 0xef, 0xed, 0xb4, 0xbc, 0x26, 0xe2, 0x28, 0x33, 0xb1, 0x8b, 0x50, 0x9b, 0xa1, - 0xaa, 0x83, 0x9f, 0x20, 0x6b, 0xfb, 0x9f, 0xfc, 0xb1, 0xfb, 0x9f, 0x9f, 0x82, 0xd2, 0x42, 0xdb, - 0xd5, 0xec, 0x23, 0x33, 0xa3, 0x53, 0xae, 0xc7, 0x48, 0xdc, 0x32, 0xba, 0x28, 0xfa, 0x68, 0xa6, - 0xd9, 0x76, 0xfb, 0xad, 0xa2, 0x84, 0xa5, 0xb6, 0x81, 0x19, 0x79, 0x9a, 0x0d, 0xcc, 0x2d, 0x28, - 0x6d, 0x86, 0x74, 0xa3, 0xd7, 0xe9, 0xd0, 0x16, 0xda, 0x4a, 0x45, 0xae, 0xcf, 0x7a, 0x21, 0xb5, - 0x23, 0x84, 0xaa, 0x15, 0x88, 0x51, 0x55, 0xb1, 0x1a, 0x3b, 0x46, 0xac, 0xbe, 0x08, 0x85, 0x5a, - 0xb7, 0x2b, 0x77, 0x76, 0xf1, 0xe2, 0xdd, 0xed, 0xe2, 0x72, 0x3a, 0xe9, 0x74, 0xbb, 0xfa, 0x3e, - 0x0d, 0xb1, 0x09, 0x05, 0x72, 0xaf, 0xb7, 0x43, 0x83, 0x0e, 0x8d, 0x68, 0x28, 0xd4, 0x7d, 0x38, - 0x0b, 0xc8, 0x63, 0x56, 0x1e, 0xa0, 0xa7, 0x11, 0x70, 0x57, 0x7e, 0x6e, 0xbf, 0xb7, 0x43, 0x6d, - 0xb1, 0x6e, 0xa8, 0x7d, 0x97, 0xc1, 0xf0, 0x42, 0x03, 0x26, 0xf5, 0xfe, 0x7f, 0x06, 0x16, 0xcf, - 0x07, 0x85, 0x62, 0xb1, 0x52, 0x32, 0x7f, 0x29, 0x07, 0xe3, 0xb5, 0x6e, 0xf7, 0x39, 0x3f, 0x5e, - 0xf9, 0x09, 0x6d, 0x56, 0x9f, 0x4d, 0x46, 0xef, 0x09, 0x4e, 0x56, 0xfe, 0xc6, 0x80, 0xa9, 0x14, - 0x85, 0x5a, 0x7b, 0x63, 0xc8, 0xe3, 0x86, 0xdc, 0x90, 0xc7, 0x0d, 0xf9, 0xc1, 0xc7, 0x0d, 0xea, - 0x9c, 0x29, 0x3c, 0xcd, 0x9c, 0x79, 0x0d, 0xf2, 0xb5, 0x6e, 0x57, 0xf4, 0x4a, 0x39, 0xe9, 0x95, - 0xad, 0x9b, 0x7c, 0x71, 0x73, 0xba, 0x5d, 0x8b, 0x61, 0x98, 0x6f, 0x40, 0x09, 0xc1, 0xa8, 0xd1, - 0x2e, 0x89, 0xa9, 0xc0, 0xd5, 0x99, 0x46, 0xc6, 0xc5, 0xde, 0xfc, 0x3f, 0x06, 0x8c, 0xe0, 0xef, - 0xe7, 0x54, 0x5c, 0xe6, 0x35, 0x71, 0xa9, 0x28, 0xe2, 0x32, 0x8c, 0xa0, 0xfc, 0x71, 0x1e, 0x7b, - 0x4b, 0x88, 0x88, 0xd8, 0xb0, 0x1a, 0x19, 0x1b, 0xd6, 0xa7, 0x50, 0xe0, 0xfb, 0xe9, 0xad, 0x6b, - 0x1e, 0x07, 0xe3, 0xe5, 0x74, 0x55, 0x9f, 0xc9, 0xae, 0xf5, 0x2e, 0x90, 0xe5, 0x4e, 0x48, 0x9b, - 0xbd, 0x80, 0x36, 0xf6, 0xbd, 0xee, 0x16, 0x0d, 0xbc, 0x07, 0x07, 0xc2, 0xda, 0x44, 0x1d, 0xeb, - 0x89, 0x52, 0x3b, 0xdc, 0xf7, 0xba, 0xcc, 0x4c, 0xf0, 0x1e, 0x1c, 0x58, 0x19, 0x34, 0xe4, 0x7d, - 0x18, 0xb3, 0xe8, 0xa3, 0xc0, 0x8b, 0xa8, 0xe8, 0xdb, 0xc9, 0x78, 0x6f, 0x81, 0x50, 0x6e, 0xef, - 0x04, 0xfc, 0x87, 0x3a, 0xfe, 0xa2, 0xfc, 0xd3, 0xdb, 0xdf, 0x7d, 0x77, 0x04, 0xe7, 0xc2, 0x09, - 0xd7, 0x80, 0xc7, 0x9c, 0x3e, 0xe8, 0x83, 0x99, 0x7f, 0x92, 0xc1, 0xdc, 0x82, 0x32, 0xdb, 0x52, - 0xa6, 0x8e, 0x21, 0x2e, 0x26, 0x63, 0x79, 0x5d, 0x2d, 0x3e, 0xee, 0x06, 0x50, 0xe3, 0x43, 0xec, - 0xb4, 0x90, 0xf0, 0x9b, 0xc5, 0x17, 0x15, 0xc6, 0x19, 0xe2, 0x11, 0xab, 0x8e, 0x26, 0xef, 0xac, - 0x27, 0x16, 0x8c, 0xd1, 0xa7, 0x13, 0x8c, 0xb1, 0x4f, 0x22, 0x18, 0xe9, 0xbb, 0xd7, 0xe2, 0x93, - 0xdc, 0xbd, 0x5e, 0x78, 0x1f, 0xa6, 0xfb, 0x7a, 0xf8, 0x49, 0xee, 0x2f, 0x3f, 0x3d, 0xb1, 0xfc, - 0xb9, 0xb8, 0x5f, 0xc8, 0x3c, 0x6e, 0x71, 0xbd, 0x80, 0x36, 0x23, 0x54, 0xbd, 0x42, 0x5b, 0x06, - 0x02, 0x96, 0xda, 0x83, 0x23, 0x8c, 0xbc, 0x07, 0x63, 0xfc, 0xfe, 0x27, 0x9c, 0xcd, 0xe1, 0xd8, - 0x4f, 0x88, 0x2f, 0x72, 0xa8, 0xb8, 0x84, 0xe7, 0x18, 0x6a, 0xaf, 0x0a, 0x22, 0xf3, 0x0e, 0x8c, - 0x8a, 0xfb, 0xa3, 0xe3, 0xe7, 0x45, 0x15, 0x46, 0xb6, 0x92, 0x9e, 0xc1, 0x33, 0x7f, 0xde, 0x08, - 0x8b, 0xc3, 0xcd, 0x5f, 0x31, 0x60, 0x52, 0x6f, 0x25, 0xb9, 0x0e, 0xa3, 0xe2, 0x82, 0xd3, 0xc0, - 0x0b, 0x4e, 0xd6, 0x9a, 0x51, 0x7e, 0xb5, 0xa9, 0x5d, 0x68, 0x0a, 0x2c, 0xa6, 0xfa, 0x05, 0x07, - 0x6c, 0x8b, 0x50, 0xfd, 0x42, 0x48, 0x2d, 0x59, 0xc6, 0xb6, 0x71, 0x16, 0x0d, 0x7b, 0xad, 0x48, - 0xdd, 0xc6, 0x05, 0x08, 0xb1, 0x44, 0x89, 0x79, 0x68, 0x00, 0x34, 0x1a, 0x77, 0xef, 0xd1, 0x83, - 0x75, 0xc7, 0x0b, 0x70, 0x2b, 0x8c, 0xb3, 0xf1, 0x9e, 0x18, 0xad, 0xb2, 0xd8, 0x0a, 0xf3, 0x99, - 0xbb, 0x4f, 0x0f, 0xb4, 0xad, 0xb0, 0x44, 0xc5, 0x29, 0x1f, 0x78, 0x0f, 0x9d, 0x88, 0x32, 0xc2, - 0x1c, 0x12, 0xf2, 0x29, 0xcf, 0xa1, 0x29, 0x4a, 0x05, 0x99, 0x7c, 0x04, 0x93, 0xc9, 0x2f, 0xf4, - 0xaa, 0xc8, 0xe3, 0x3e, 0x51, 0x4a, 0x84, 0x5e, 0x58, 0x7f, 0xe9, 0xe8, 0xb0, 0x7a, 0x41, 0xe1, - 0x6a, 0x33, 0x2c, 0x85, 0x75, 0x8a, 0x99, 0xf9, 0xfb, 0x06, 0xc0, 0xc6, 0x4a, 0x43, 0x36, 0xf0, - 0x32, 0x14, 0xe2, 0x53, 0xaa, 0x32, 0xdf, 0x6f, 0xa7, 0x36, 0x94, 0x58, 0x4e, 0x5e, 0x86, 0x7c, - 0xd2, 0x92, 0xe9, 0xa3, 0xc3, 0xea, 0x84, 0xde, 0x02, 0x56, 0x4a, 0xee, 0xc0, 0xd8, 0x50, 0x75, - 0x46, 0xe9, 0xcc, 0xa8, 0xab, 0xa4, 0xc6, 0x51, 0xf8, 0x60, 0x7b, 0xe3, 0xb3, 0x3b, 0x0a, 0xdf, - 0xce, 0xc1, 0x14, 0xeb, 0xd7, 0x5a, 0x2f, 0xda, 0xf3, 0x03, 0x2f, 0x3a, 0x78, 0x6e, 0x77, 0xc5, - 0xef, 0x68, 0x06, 0xd1, 0x05, 0xa9, 0xb6, 0xd4, 0xb6, 0x0d, 0xb5, 0x39, 0xfe, 0xab, 0x31, 0x38, - 0x9d, 0x41, 0x45, 0x5e, 0x17, 0xae, 0x45, 0xc9, 0x39, 0x14, 0xba, 0x0e, 0xfd, 0xe8, 0xb0, 0x5a, - 0x96, 0xe8, 0x1b, 0x89, 0x2b, 0xd1, 0x3c, 0x8c, 0x8b, 0xad, 0xcf, 0x6a, 0x62, 0x51, 0xa3, 0x4f, - 0x8a, 0x3c, 0x67, 0x43, 0xd5, 0xa4, 0x22, 0x91, 0x1a, 0x94, 0x17, 0xf6, 0x68, 0x73, 0xdf, 0xeb, - 0xec, 0xde, 0xa3, 0x07, 0xdc, 0x5e, 0x2a, 0xd7, 0x5f, 0x64, 0x3b, 0xad, 0xa6, 0x80, 0xb3, 0x21, - 0xd5, 0x37, 0x71, 0x1a, 0x09, 0x79, 0x0f, 0xc6, 0x1b, 0xde, 0x6e, 0x47, 0x72, 0x28, 0x20, 0x87, - 0x8b, 0x47, 0x87, 0xd5, 0xb3, 0x21, 0x07, 0xf7, 0x33, 0x50, 0x09, 0xc8, 0x55, 0x18, 0xb1, 0xfc, - 0x16, 0xe5, 0xcb, 0xb0, 0x70, 0x56, 0x09, 0x18, 0x40, 0x3d, 0xba, 0x45, 0x0c, 0x72, 0x17, 0xc6, - 0xd8, 0x3f, 0xf7, 0x9d, 0xee, 0xec, 0x28, 0xea, 0x6d, 0x12, 0x1b, 0xf8, 0x08, 0xed, 0x7a, 0x9d, - 0x5d, 0xd5, 0xc6, 0x6f, 0x51, 0xbb, 0xed, 0x74, 0xb5, 0x75, 0x91, 0x23, 0x92, 0x2d, 0x18, 0x4f, - 0x14, 0x41, 0x38, 0x3b, 0xa6, 0x5d, 0x74, 0x25, 0x25, 0xf5, 0xcf, 0x09, 0x66, 0xe7, 0xa2, 0x56, - 0x88, 0xb2, 0xdd, 0x65, 0xf8, 0x7a, 0x63, 0x14, 0x46, 0xda, 0x1e, 0xa4, 0x38, 0x78, 0x0f, 0x62, - 0x9c, 0xb8, 0x07, 0x71, 0x01, 0x44, 0x27, 0xd5, 0x5a, 0xbb, 0xc2, 0xb7, 0xec, 0xea, 0x60, 0x01, - 0xbb, 0x9e, 0x20, 0xe3, 0x9c, 0xe4, 0xa7, 0x5d, 0xa2, 0xff, 0x9d, 0xd6, 0xae, 0x76, 0xda, 0x15, - 0xa3, 0xb2, 0x6e, 0x48, 0x54, 0x8d, 0xdc, 0x81, 0xcb, 0x6e, 0x48, 0x4a, 0x92, 0x6e, 0xf8, 0xf8, - 0x51, 0x34, 0xa8, 0x1b, 0x14, 0x46, 0x64, 0x15, 0xa0, 0xd6, 0x8c, 0xbc, 0x87, 0x14, 0x45, 0x62, - 0x5c, 0xeb, 0x88, 0x85, 0xda, 0x3d, 0x7a, 0xd0, 0xa0, 0x51, 0xec, 0xb6, 0x71, 0xc6, 0x41, 0xd4, - 0x94, 0x98, 0x58, 0x0a, 0x07, 0xd2, 0x85, 0x33, 0x35, 0xd7, 0xf5, 0xb8, 0xbf, 0xe1, 0x46, 0xc0, - 0xe4, 0xd7, 0x45, 0xd6, 0xe5, 0x6c, 0xd6, 0x57, 0x05, 0xeb, 0xcf, 0x39, 0x31, 0x95, 0x1d, 0x71, - 0xb2, 0xf4, 0x67, 0xb2, 0x19, 0x9b, 0x6b, 0x30, 0xa9, 0x77, 0xa9, 0xee, 0x69, 0x57, 0x86, 0xa2, - 0xd5, 0xa8, 0xd9, 0x8d, 0xbb, 0xb5, 0x1b, 0x15, 0x83, 0x54, 0xa0, 0x2c, 0x7e, 0xcd, 0xdb, 0xf3, - 0x6f, 0xde, 0xaa, 0xe4, 0x34, 0xc8, 0x9b, 0x37, 0xe6, 0x2b, 0x79, 0xf3, 0x8f, 0x0d, 0x28, 0xca, - 0xfa, 0x91, 0x5b, 0x90, 0x6f, 0x34, 0xee, 0xa6, 0xee, 0x57, 0x93, 0xa5, 0x97, 0x2f, 0x32, 0x61, - 0xb8, 0xa7, 0x2e, 0x32, 0x8d, 0xc6, 0x5d, 0x46, 0xb7, 0xb1, 0xd2, 0x10, 0x46, 0x4b, 0x86, 0xb8, - 0x4e, 0x0f, 0xb8, 0x74, 0xba, 0x05, 0xf9, 0x0f, 0xb6, 0x37, 0xc4, 0x6e, 0x28, 0x63, 0x7c, 0x91, - 0xee, 0xe3, 0x47, 0xea, 0xd2, 0xc7, 0x08, 0x4c, 0x0b, 0xc6, 0x95, 0xa9, 0xc5, 0x8d, 0x88, 0xb6, - 0x1f, 0xfb, 0xa0, 0x09, 0x23, 0x82, 0x41, 0x2c, 0x51, 0xc2, 0x6c, 0x9e, 0x15, 0xbf, 0xe9, 0xb4, - 0x84, 0x35, 0x82, 0x36, 0x4f, 0x8b, 0x01, 0x2c, 0x0e, 0x37, 0xff, 0xc4, 0x80, 0xca, 0x7a, 0xe0, - 0x3f, 0xf4, 0x98, 0x06, 0xde, 0xf0, 0xf7, 0x69, 0x67, 0xeb, 0x06, 0x79, 0x43, 0x2a, 0x01, 0x6e, - 0xc2, 0x9d, 0x63, 0x54, 0xa8, 0x04, 0x7e, 0x74, 0x58, 0x85, 0xc6, 0x41, 0x18, 0xd1, 0x36, 0x2b, - 0x97, 0x8a, 0x40, 0x71, 0xe5, 0xcb, 0x0d, 0xef, 0x1e, 0x74, 0x82, 0x2b, 0x5f, 0x15, 0x46, 0xb0, - 0x3a, 0x8a, 0x87, 0xc6, 0x48, 0xc4, 0x00, 0x16, 0x87, 0x2b, 0x0a, 0xfb, 0x3b, 0xb9, 0xbe, 0x36, - 0xcc, 0x7f, 0xa6, 0x5c, 0x6c, 0xf4, 0xc6, 0x0d, 0xb5, 0x88, 0x7d, 0x0d, 0x66, 0xd2, 0x5d, 0x82, - 0xe7, 0x22, 0x35, 0x98, 0xd2, 0xe1, 0xf2, 0x88, 0xe4, 0x5c, 0xe6, 0xb7, 0xb6, 0xe6, 0xad, 0x34, - 0xbe, 0xf9, 0x03, 0x03, 0x4a, 0xf8, 0xaf, 0xd5, 0x6b, 0x51, 0x66, 0xd9, 0xd4, 0xb6, 0x1b, 0xe2, - 0x92, 0x4b, 0xbd, 0x88, 0x72, 0x1e, 0x85, 0xb6, 0xb8, 0x11, 0xd3, 0xf4, 0x48, 0x8c, 0x2c, 0x48, - 0xf9, 0x95, 0x5e, 0x28, 0x24, 0x34, 0x26, 0xe5, 0x77, 0x7f, 0x61, 0x8a, 0x54, 0x20, 0xb3, 0xf1, - 0x63, 0xbf, 0xfc, 0x96, 0x3c, 0x1a, 0xc6, 0xf1, 0x43, 0x3a, 0x5f, 0xbb, 0x3a, 0x91, 0x68, 0xe4, - 0x0d, 0x18, 0x65, 0x9f, 0xb6, 0xe4, 0xc5, 0x08, 0xee, 0x2a, 0xb0, 0x8e, 0x81, 0x76, 0xc3, 0xc8, - 0x91, 0xcc, 0x7f, 0x9d, 0x4b, 0x77, 0xa0, 0xb0, 0x02, 0x9e, 0x70, 0x6e, 0xbc, 0x0d, 0x23, 0xb5, - 0x56, 0xcb, 0x7f, 0x24, 0xb4, 0x84, 0x3c, 0xa6, 0x89, 0xfb, 0x8f, 0xaf, 0xb0, 0x0e, 0x43, 0xd1, - 0xae, 0xb6, 0x19, 0x80, 0x2c, 0x40, 0xa9, 0xb6, 0xdd, 0x58, 0x5e, 0x5e, 0xdc, 0xd8, 0x58, 0x11, - 0x1e, 0xd4, 0xaf, 0xca, 0xfe, 0xf1, 0x3c, 0xd7, 0x8e, 0xa2, 0xd6, 0x00, 0x07, 0xcb, 0x84, 0x8e, - 0xbc, 0x0b, 0xf0, 0x81, 0xef, 0x75, 0xee, 0xd3, 0x68, 0xcf, 0x77, 0x45, 0xe3, 0x99, 0x49, 0x31, - 0xfe, 0xb1, 0xef, 0x75, 0xec, 0x36, 0x82, 0x59, 0xdd, 0x13, 0x24, 0x4b, 0xf9, 0x9f, 0xf5, 0x74, - 0xdd, 0x8f, 0xd0, 0x86, 0x19, 0x49, 0x7a, 0x7a, 0xc7, 0x8f, 0xd2, 0xf7, 0x36, 0x12, 0xcd, 0xfc, - 0xd5, 0x1c, 0x4c, 0xf2, 0x9d, 0x2a, 0x17, 0x98, 0xe7, 0x76, 0x32, 0xbe, 0xad, 0x4d, 0xc6, 0xf3, - 0x72, 0x61, 0x50, 0x9a, 0x36, 0xd4, 0x54, 0xdc, 0x03, 0xd2, 0x4f, 0x43, 0x2c, 0x79, 0x9e, 0x32, - 0xcc, 0x2c, 0xbc, 0x91, 0xdc, 0x47, 0x87, 0x48, 0x64, 0xa3, 0x2a, 0x0c, 0x2d, 0x8d, 0x87, 0xf9, - 0x2b, 0x39, 0x98, 0x50, 0xec, 0xc9, 0xe7, 0xb6, 0xe3, 0xbf, 0xac, 0x75, 0xbc, 0xbc, 0x83, 0x50, - 0x5a, 0x36, 0x54, 0xbf, 0xf7, 0x60, 0xba, 0x8f, 0x24, 0x6d, 0x96, 0x1b, 0xc3, 0x98, 0xe5, 0xaf, - 0xf7, 0x5f, 0x98, 0x73, 0x6f, 0xeb, 0xf8, 0xc2, 0x5c, 0xbd, 0xa1, 0xff, 0x76, 0x0e, 0x66, 0xc4, - 0xaf, 0x5a, 0xcf, 0xf5, 0xa2, 0x05, 0xbf, 0xf3, 0xc0, 0xdb, 0x7d, 0x6e, 0xc7, 0xa2, 0xa6, 0x8d, - 0x45, 0x55, 0x1f, 0x0b, 0xa5, 0x81, 0x83, 0x87, 0xc4, 0xfc, 0xb7, 0x45, 0x98, 0x1d, 0x44, 0xc0, - 0xb6, 0xfd, 0xca, 0xae, 0x0a, 0xb7, 0xfd, 0xa9, 0x1d, 0x2b, 0xdf, 0x4f, 0x25, 0x0e, 0x22, 0xb9, - 0x21, 0x1c, 0x44, 0x56, 0xa0, 0x82, 0x9f, 0x6a, 0xd0, 0x90, 0x75, 0x42, 0x98, 0xb8, 0x7a, 0x5e, - 0x3a, 0x3a, 0xac, 0x5e, 0x74, 0x58, 0x99, 0x1d, 0x8a, 0x42, 0xbb, 0x17, 0x78, 0x0a, 0x8f, 0x3e, - 0x4a, 0xf2, 0xfb, 0x06, 0x4c, 0x22, 0x70, 0xe9, 0x21, 0xed, 0x44, 0xc8, 0xac, 0x20, 0x2e, 0x69, - 0xe2, 0x88, 0x9a, 0x46, 0x14, 0x78, 0x9d, 0x5d, 0x3c, 0x48, 0x0a, 0xeb, 0x3b, 0xac, 0x17, 0xfe, - 0xf2, 0xb0, 0xfa, 0xce, 0x27, 0x89, 0xd2, 0x11, 0xac, 0x42, 0xb6, 0x91, 0xe7, 0x15, 0xa5, 0xf8, - 0xd9, 0x54, 0x35, 0x53, 0x35, 0x22, 0x3f, 0x09, 0xe7, 0x96, 0x3a, 0xce, 0x4e, 0x8b, 0x2e, 0xf8, - 0x9d, 0xc8, 0xeb, 0xf4, 0xfc, 0x5e, 0x58, 0x77, 0x9a, 0xfb, 0xbd, 0x6e, 0x28, 0x0e, 0x3b, 0xb1, - 0xe5, 0xcd, 0xb8, 0xd0, 0xde, 0xe1, 0xa5, 0x0a, 0xcb, 0x41, 0x0c, 0xc8, 0x5d, 0x98, 0xe6, 0x45, - 0xb5, 0x5e, 0xe4, 0x37, 0x9a, 0x4e, 0xcb, 0xeb, 0xec, 0xe2, 0x19, 0x68, 0xb1, 0x7e, 0x81, 0xed, - 0x2d, 0x9d, 0x5e, 0xe4, 0xdb, 0x21, 0x87, 0x2b, 0xfc, 0xfa, 0x89, 0xc8, 0x32, 0x4c, 0x59, 0xd4, - 0x71, 0xef, 0x3b, 0x8f, 0x17, 0x9c, 0xae, 0xd3, 0xf4, 0xa2, 0x03, 0xdc, 0x99, 0xe5, 0xeb, 0xd5, - 0xa3, 0xc3, 0xea, 0x0b, 0x01, 0x75, 0x5c, 0xbb, 0xed, 0x3c, 0xb6, 0x9b, 0xa2, 0x50, 0x61, 0x96, - 0xa6, 0x8b, 0x59, 0x79, 0x9d, 0x98, 0x55, 0x29, 0xcd, 0xca, 0xeb, 0x0c, 0x66, 0x95, 0xd0, 0x49, - 0x56, 0x1b, 0x4e, 0xb0, 0x4b, 0x23, 0x7e, 0x48, 0x08, 0x97, 0x8c, 0x2b, 0x86, 0xc2, 0x2a, 0xc2, - 0x32, 0x1b, 0x0f, 0x0c, 0xd3, 0xac, 0x14, 0x3a, 0x26, 0x79, 0xdb, 0x81, 0x17, 0x51, 0xb5, 0x85, - 0xe3, 0x58, 0x2d, 0xec, 0x7f, 0x3c, 0x26, 0x1d, 0xd4, 0xc4, 0x3e, 0xca, 0x84, 0x9b, 0xd2, 0xc8, - 0x72, 0x1f, 0xb7, 0xec, 0x56, 0xf6, 0x51, 0xc6, 0xdc, 0xd4, 0x76, 0x4e, 0x60, 0x3b, 0x15, 0x6e, - 0x03, 0x1a, 0xda, 0x47, 0x49, 0x56, 0x59, 0xa7, 0x45, 0xb4, 0xc3, 0x24, 0x5a, 0x1c, 0x92, 0x4e, - 0x62, 0xd5, 0x5e, 0x11, 0x7b, 0xea, 0x4a, 0x20, 0x8b, 0xed, 0x8c, 0x23, 0xd3, 0x34, 0xf1, 0x07, - 0x85, 0xe2, 0x48, 0x65, 0xd4, 0xaa, 0x70, 0x91, 0x8f, 0x98, 0xe0, 0xa0, 0x2e, 0x36, 0x7f, 0x3b, - 0x07, 0xe7, 0xa5, 0x3a, 0xa6, 0xd1, 0x23, 0x3f, 0xd8, 0xf7, 0x3a, 0xbb, 0xcf, 0xb9, 0x56, 0xbd, - 0xad, 0x69, 0xd5, 0x57, 0x52, 0x2b, 0x5c, 0xaa, 0x95, 0xc7, 0xa8, 0xd6, 0xbf, 0x18, 0x81, 0x17, - 0x8f, 0xa5, 0x22, 0x1f, 0xb2, 0x55, 0xd0, 0xa3, 0x9d, 0x68, 0xd9, 0x6d, 0x51, 0xb6, 0x0d, 0xf3, - 0x7b, 0x91, 0x38, 0xcc, 0x7e, 0xf9, 0xe8, 0xb0, 0x7a, 0x9a, 0x07, 0x9a, 0xd8, 0x9e, 0xdb, 0xa2, - 0x76, 0xc4, 0x8b, 0xb5, 0x61, 0xea, 0xa7, 0x66, 0x2c, 0xe3, 0xb0, 0xb7, 0xe5, 0x4e, 0x44, 0x83, - 0x87, 0x0e, 0xf7, 0xb7, 0x17, 0x2c, 0xf7, 0x29, 0xed, 0xda, 0x0e, 0x2b, 0xb5, 0x3d, 0x51, 0xac, - 0xb3, 0xec, 0xa3, 0x26, 0xb7, 0x15, 0x96, 0x0b, 0x6c, 0x73, 0x70, 0xdf, 0x79, 0x2c, 0x2c, 0x5e, - 0x3c, 0x5f, 0x55, 0x58, 0x72, 0x1f, 0xbb, 0xb6, 0xf3, 0xd8, 0xea, 0x27, 0x21, 0x1f, 0xc1, 0x19, - 0xa1, 0xb8, 0x99, 0x12, 0x0b, 0xfc, 0x96, 0x6c, 0x71, 0x01, 0x79, 0xbd, 0x76, 0x74, 0x58, 0x3d, - 0x27, 0xd4, 0xbe, 0xdd, 0xe4, 0x18, 0x99, 0xad, 0xce, 0xe6, 0x42, 0x36, 0xd8, 0x42, 0x96, 0xea, - 0x8e, 0xfb, 0x34, 0x0c, 0x9d, 0x5d, 0x69, 0x1d, 0xf3, 0x1b, 0x25, 0xa5, 0x33, 0xed, 0x36, 0x2f, - 0xb7, 0x06, 0x52, 0x92, 0xbb, 0x30, 0xb9, 0x4d, 0x77, 0xd4, 0xf1, 0x19, 0x8d, 0xa7, 0x78, 0xe5, - 0x11, 0xdd, 0x19, 0x3c, 0x38, 0x29, 0x3a, 0xe2, 0xc1, 0xf4, 0x7a, 0xe0, 0x3f, 0x3e, 0x60, 0x5b, - 0x3d, 0xda, 0xa1, 0x01, 0x3a, 0x77, 0x8d, 0xe1, 0x71, 0xd5, 0x6c, 0x62, 0x59, 0xea, 0xe5, 0xf5, - 0xcf, 0x1d, 0x1d, 0x56, 0x5f, 0xec, 0x32, 0xb0, 0xdd, 0x12, 0x70, 0x3b, 0x15, 0x75, 0xd6, 0xcf, - 0x95, 0xfc, 0x34, 0x4c, 0x59, 0x7e, 0x2f, 0xf2, 0x3a, 0xbb, 0x8d, 0x28, 0x70, 0x22, 0xba, 0xcb, - 0x15, 0x79, 0xe2, 0x45, 0x96, 0x2a, 0xe5, 0x07, 0xd3, 0x01, 0x07, 0xda, 0xa1, 0x80, 0x6a, 0x9a, - 0x54, 0x27, 0x30, 0x7f, 0x33, 0x07, 0xb3, 0x62, 0x18, 0x2c, 0xda, 0xf4, 0x03, 0xf7, 0xf9, 0x9f, - 0xf6, 0x4b, 0xda, 0xb4, 0x7f, 0x39, 0xf6, 0x51, 0xca, 0x6a, 0xe4, 0x31, 0xb3, 0xfe, 0x8f, 0x0c, - 0xb8, 0x78, 0x1c, 0x11, 0xeb, 0x9d, 0xd8, 0xaf, 0xaf, 0xd4, 0xe7, 0xbf, 0xd7, 0x85, 0xd3, 0x38, - 0x9e, 0x78, 0x70, 0x1c, 0xde, 0xf5, 0xc3, 0x08, 0x4f, 0xef, 0x72, 0x9a, 0x23, 0x41, 0xdd, 0xf7, - 0x5b, 0xa8, 0xe7, 0xeb, 0xaf, 0x33, 0x75, 0xfe, 0x97, 0x87, 0x55, 0x60, 0x20, 0xee, 0x89, 0xc7, - 0xd6, 0x7c, 0x2e, 0x31, 0x78, 0x2e, 0x1d, 0xda, 0xe8, 0xfd, 0xb1, 0x4f, 0x0f, 0x42, 0x2b, 0x8b, - 0x35, 0x9e, 0xd0, 0xd4, 0x7a, 0xd1, 0xde, 0x7a, 0x40, 0x1f, 0xd0, 0x80, 0x76, 0x9a, 0xf4, 0x33, - 0x76, 0x42, 0xa3, 0x37, 0x6e, 0xa8, 0xed, 0xc9, 0x5f, 0x8f, 0xc1, 0x4c, 0x16, 0x19, 0xeb, 0x17, - 0xc5, 0x22, 0x4e, 0x87, 0x28, 0xff, 0x1d, 0x03, 0xca, 0x0d, 0xda, 0xf4, 0x3b, 0xee, 0x6d, 0xa7, - 0x19, 0xf9, 0xd2, 0x25, 0xc3, 0xe6, 0x9a, 0x8d, 0xc1, 0xed, 0x07, 0x58, 0xa0, 0x9d, 0x0c, 0x7c, - 0x65, 0x38, 0x43, 0xb4, 0xe9, 0xa3, 0x23, 0x6c, 0xc4, 0x64, 0x32, 0xf9, 0x04, 0xde, 0x6a, 0x68, - 0x1f, 0x25, 0x75, 0x98, 0x58, 0xf0, 0x3b, 0x1d, 0xca, 0x7e, 0x28, 0x6e, 0x9d, 0xe8, 0x88, 0xd9, - 0x94, 0x05, 0xe9, 0x13, 0x02, 0x9d, 0x84, 0xdc, 0x84, 0xfc, 0xe6, 0xfc, 0x6d, 0x31, 0x06, 0xd2, - 0x59, 0x6d, 0x73, 0xfe, 0x36, 0xee, 0x75, 0x99, 0xfd, 0x30, 0xd1, 0x9b, 0x7f, 0xa0, 0x9e, 0x81, - 0x6e, 0xce, 0xdf, 0x26, 0x6b, 0x30, 0x6d, 0xd1, 0x6f, 0xf6, 0xbc, 0x80, 0x8a, 0x09, 0x70, 0xff, - 0x76, 0x0d, 0xc7, 0xa2, 0xc8, 0xf5, 0x58, 0xc0, 0x0b, 0xa5, 0x6d, 0x6f, 0xb7, 0x1f, 0xa8, 0x61, - 0x79, 0xfd, 0xb4, 0xe4, 0xe7, 0xe1, 0xcc, 0xa2, 0x17, 0x8a, 0x3a, 0xf3, 0xc3, 0x47, 0x17, 0xef, - 0x21, 0x47, 0x07, 0x4c, 0x87, 0x2f, 0x65, 0x4e, 0x87, 0xcf, 0xb9, 0x31, 0x13, 0x9b, 0x9f, 0x6c, - 0xba, 0x69, 0x7f, 0xd8, 0xec, 0xef, 0x90, 0x8f, 0x61, 0x12, 0x4f, 0x7b, 0xf0, 0x3c, 0x16, 0x5d, - 0xa4, 0xc7, 0x06, 0x7c, 0xf9, 0x0b, 0x99, 0x5f, 0xbe, 0x80, 0x87, 0x47, 0x36, 0x9e, 0xea, 0xa2, - 0x3b, 0xb5, 0xb6, 0x47, 0xd0, 0x38, 0x93, 0x0f, 0x60, 0x4a, 0x2c, 0x3a, 0x6b, 0x0f, 0x36, 0xf6, - 0xe8, 0xa2, 0x73, 0x20, 0x9c, 0x10, 0xd0, 0xfe, 0x13, 0x2b, 0x95, 0xed, 0x3f, 0xb0, 0xa3, 0x3d, - 0x6a, 0xbb, 0x8e, 0xa6, 0x9e, 0x53, 0x84, 0xe4, 0x67, 0x61, 0x7c, 0xc5, 0xc7, 0x8b, 0x27, 0x54, - 0x35, 0x25, 0xe4, 0xf3, 0x35, 0x0c, 0xcb, 0xe5, 0xe0, 0xd4, 0x22, 0xf2, 0xa3, 0xc3, 0xea, 0xdb, - 0x4f, 0x2a, 0x85, 0xca, 0x07, 0x2c, 0xf5, 0x6b, 0x64, 0x01, 0x8a, 0xdb, 0x74, 0x87, 0xb5, 0x36, - 0x1d, 0x52, 0x26, 0xc1, 0x5c, 0x5f, 0x3c, 0x12, 0xbf, 0xd4, 0x5b, 0x1d, 0x89, 0x41, 0x02, 0x98, - 0xc6, 0xfe, 0x59, 0x77, 0xc2, 0xf0, 0x91, 0x1f, 0xb8, 0x2d, 0x1a, 0xca, 0xeb, 0x91, 0xfe, 0xce, - 0x9f, 0xcf, 0xec, 0xfc, 0x8b, 0xbc, 0xf3, 0xbb, 0x0a, 0x07, 0x55, 0xdc, 0xfa, 0xd8, 0x9b, 0xff, - 0xc6, 0x40, 0xa9, 0x27, 0xd7, 0xd0, 0xf9, 0x2c, 0xf6, 0x6a, 0xc7, 0xdd, 0xac, 0xd3, 0xed, 0xea, - 0x7e, 0xe9, 0x1c, 0x85, 0x6d, 0x7d, 0x6f, 0x3b, 0x4d, 0x1a, 0xc9, 0x33, 0x52, 0x44, 0x7e, 0x80, - 0x10, 0x75, 0xeb, 0xcb, 0x71, 0xc8, 0x57, 0x61, 0x66, 0x91, 0x3e, 0xf4, 0x9a, 0xb4, 0x16, 0x45, - 0x34, 0xe4, 0x3d, 0xbc, 0x50, 0xe3, 0x97, 0x89, 0xa5, 0xfa, 0x2b, 0x47, 0x87, 0xd5, 0x4b, 0x2e, - 0x96, 0xdb, 0x4e, 0x82, 0x60, 0x37, 0x1d, 0x95, 0x57, 0x26, 0x07, 0xf3, 0x7f, 0x19, 0x49, 0xaf, - 0x93, 0xd7, 0xa0, 0x60, 0xad, 0xc7, 0xf5, 0xe7, 0xf7, 0x84, 0xa9, 0xea, 0x23, 0x02, 0xf9, 0x3a, - 0x9c, 0x51, 0xf8, 0x60, 0x8f, 0x50, 0x97, 0x55, 0x88, 0x37, 0xe6, 0x55, 0xbc, 0x18, 0x52, 0x6a, - 0xe2, 0x70, 0x8c, 0x54, 0x8d, 0xb2, 0x79, 0xb0, 0xc6, 0x2a, 0x05, 0x8b, 0xb4, 0xe3, 0x71, 0xde, - 0x4a, 0x63, 0x55, 0xde, 0x2e, 0x22, 0xa4, 0x1b, 0x9b, 0xc5, 0xe1, 0x83, 0x42, 0xb1, 0x50, 0x19, - 0x31, 0xff, 0xc6, 0x50, 0x72, 0x2a, 0x3c, 0xa7, 0x2b, 0xd6, 0x2d, 0x6d, 0xc5, 0x9a, 0x11, 0xa4, - 0x71, 0xab, 0x58, 0x59, 0xa6, 0x95, 0x31, 0x05, 0x13, 0x1a, 0x12, 0xba, 0xd9, 0x6e, 0x86, 0x34, - 0xe0, 0x67, 0x92, 0x9f, 0x2d, 0x37, 0xdb, 0xb8, 0x5d, 0x43, 0x79, 0x4f, 0xfe, 0x95, 0x01, 0x53, - 0x29, 0x0a, 0xd6, 0x1b, 0x0c, 0xa4, 0xf6, 0x46, 0x2f, 0xa4, 0x81, 0x85, 0x50, 0xee, 0x94, 0xb7, - 0xa2, 0x3b, 0xe5, 0xb5, 0x2c, 0x06, 0x23, 0x5f, 0x81, 0x91, 0x4d, 0xdc, 0x41, 0xe8, 0x7e, 0x1d, - 0x31, 0x7f, 0x2c, 0xe4, 0x33, 0xac, 0xc7, 0xfe, 0x55, 0x15, 0x04, 0x96, 0x91, 0x06, 0x8c, 0x2d, - 0x04, 0x14, 0xb3, 0x27, 0x14, 0x86, 0xbf, 0x80, 0x6b, 0x72, 0x92, 0xf4, 0x05, 0x9c, 0xe0, 0x64, - 0xfe, 0x46, 0x0e, 0x48, 0xd2, 0x46, 0xda, 0x0c, 0x68, 0x14, 0x3e, 0xb7, 0x83, 0xfe, 0xbe, 0x36, - 0xe8, 0x2f, 0xf6, 0x0d, 0x3a, 0x6f, 0xde, 0x50, 0x63, 0xff, 0x27, 0x06, 0x9c, 0xcd, 0x26, 0x24, - 0x2f, 0xc3, 0xe8, 0xda, 0xc6, 0xba, 0x74, 0x0d, 0x12, 0x4d, 0xf1, 0xbb, 0x68, 0x19, 0x5b, 0xa2, - 0x88, 0xbc, 0x01, 0xa3, 0x1f, 0x5a, 0x0b, 0x6c, 0xc9, 0x54, 0xa2, 0x67, 0xbe, 0x19, 0xd8, 0x4d, - 0x7d, 0xcb, 0x25, 0x90, 0xd4, 0xb1, 0xcd, 0x3f, 0xb3, 0xb1, 0xfd, 0x76, 0x0e, 0xa6, 0x6a, 0xcd, - 0x26, 0x0d, 0x43, 0x66, 0x10, 0xd1, 0x30, 0x7a, 0x6e, 0x07, 0x36, 0xdb, 0xe9, 0x47, 0x6b, 0xdb, - 0x50, 0xa3, 0xfa, 0xa7, 0x06, 0x9c, 0x91, 0x54, 0x0f, 0x3d, 0xfa, 0x68, 0x63, 0x2f, 0xa0, 0xe1, - 0x9e, 0xdf, 0x72, 0x87, 0x8d, 0x03, 0xc3, 0x55, 0xda, 0x6b, 0x45, 0x34, 0x50, 0x0f, 0xa8, 0x1f, - 0x20, 0x44, 0x5b, 0xa5, 0x11, 0x42, 0xe6, 0x60, 0xac, 0xd6, 0xed, 0x06, 0xfe, 0x43, 0x3e, 0xed, - 0x27, 0xc4, 0x7d, 0x24, 0x07, 0x69, 0xf7, 0x97, 0x1c, 0xc4, 0xaa, 0xb1, 0x48, 0x3b, 0xdc, 0xa3, - 0x79, 0x82, 0x57, 0xc3, 0xa5, 0x1d, 0xd5, 0x42, 0xc3, 0x72, 0xf3, 0x5b, 0x05, 0x28, 0xab, 0x0d, - 0x21, 0x26, 0x8c, 0x72, 0xf7, 0x14, 0xd5, 0x4d, 0xc0, 0x41, 0x88, 0x25, 0x4a, 0x12, 0xaf, 0x9f, - 0xdc, 0x89, 0x5e, 0x3f, 0xdb, 0x30, 0xb1, 0x1e, 0xf8, 0x5d, 0x3f, 0xa4, 0x2e, 0x4f, 0x80, 0xc3, - 0xb5, 0xd6, 0xe9, 0xd8, 0x15, 0x96, 0xf7, 0x39, 0x2b, 0xe2, 0xdb, 0x81, 0xae, 0xc0, 0xb6, 0xd3, - 0xe9, 0x71, 0x74, 0x3e, 0xfc, 0x80, 0xdf, 0x09, 0x45, 0xb8, 0x40, 0x7c, 0xc0, 0xcf, 0x20, 0xfa, - 0x01, 0x3f, 0x83, 0xa8, 0xd3, 0x62, 0xe4, 0x59, 0x4d, 0x0b, 0xf2, 0x1b, 0x06, 0x8c, 0xd7, 0x3a, - 0x1d, 0xe1, 0xf5, 0x23, 0xa3, 0xc8, 0xcf, 0x24, 0x87, 0xfc, 0xdc, 0x2d, 0x94, 0x9f, 0xf1, 0x7f, - 0x43, 0x9c, 0xf1, 0xbf, 0xfd, 0x89, 0xce, 0xf8, 0x37, 0x02, 0xc7, 0x8b, 0x42, 0xbc, 0xcc, 0x4d, - 0x3e, 0xa8, 0xba, 0xfe, 0x2a, 0xf5, 0x20, 0x6f, 0x43, 0x25, 0x96, 0xc7, 0xe5, 0x8e, 0x4b, 0x1f, - 0x53, 0xee, 0x24, 0x35, 0xc1, 0x23, 0x0c, 0xb5, 0xcb, 0x8b, 0x34, 0xa2, 0xf9, 0x6d, 0x03, 0xce, - 0xaa, 0x02, 0xd1, 0xe8, 0xed, 0xb4, 0x3d, 0xdc, 0xfe, 0x90, 0xeb, 0x50, 0x12, 0xe3, 0x15, 0x1b, - 0x72, 0xfd, 0x59, 0x93, 0x12, 0x14, 0xb2, 0xc4, 0x86, 0x88, 0xf1, 0x10, 0x67, 0x05, 0xa7, 0x53, - 0xd3, 0x8d, 0x15, 0xd5, 0x67, 0x45, 0x67, 0x57, 0x02, 0xfc, 0xad, 0x8f, 0x1d, 0x83, 0x98, 0xef, - 0xc1, 0xb4, 0x5e, 0xcb, 0x06, 0xc5, 0x10, 0x34, 0xd9, 0x34, 0x23, 0xbb, 0x69, 0xb2, 0xdc, 0xdc, - 0x06, 0xd2, 0x47, 0x1f, 0xe2, 0x45, 0x15, 0x8d, 0xe4, 0x45, 0xaa, 0x3c, 0xee, 0xea, 0x43, 0x8c, - 0xf3, 0x87, 0x8d, 0xab, 0xdd, 0x8d, 0xa4, 0xe6, 0x9f, 0x01, 0x9c, 0xce, 0x50, 0x1d, 0x27, 0x2c, - 0xed, 0x55, 0x7d, 0xf2, 0x94, 0x62, 0x8f, 0x00, 0x39, 0x65, 0xde, 0x93, 0xb9, 0xa2, 0x8e, 0x99, - 0x2a, 0xc7, 0x25, 0x90, 0xfa, 0x34, 0x96, 0x77, 0xd5, 0x69, 0x67, 0xe4, 0x99, 0x39, 0xed, 0xd4, - 0x61, 0x42, 0xb4, 0x4a, 0x4c, 0xe5, 0xd1, 0xe4, 0x58, 0x20, 0xe0, 0x05, 0x76, 0xdf, 0x94, 0xd6, - 0x49, 0x38, 0x8f, 0xd0, 0x6f, 0x3d, 0xa4, 0x82, 0xc7, 0x98, 0xca, 0x03, 0x0b, 0x32, 0x79, 0x28, - 0x24, 0xe4, 0x9f, 0x19, 0x40, 0x04, 0x44, 0x9d, 0xcf, 0xc5, 0xe3, 0xe6, 0xb3, 0xfb, 0x6c, 0xe6, - 0xf3, 0x8b, 0xb2, 0x8e, 0xd9, 0xf3, 0x3a, 0xa3, 0x5a, 0xe4, 0x9f, 0x18, 0x30, 0xcd, 0x3d, 0x47, - 0xd4, 0xca, 0x96, 0x8e, 0xab, 0x6c, 0xf3, 0xd9, 0x54, 0xf6, 0x62, 0x88, 0x9f, 0x1d, 0x50, 0xd7, - 0xfe, 0x4a, 0x91, 0x9f, 0x04, 0x88, 0x67, 0x94, 0xf4, 0x50, 0xbc, 0x98, 0xa1, 0x05, 0x62, 0xa4, - 0x24, 0xc8, 0x32, 0x8a, 0xe9, 0x54, 0x9f, 0x9e, 0x84, 0x1b, 0xf9, 0x79, 0x98, 0x61, 0xf3, 0x25, - 0x86, 0x08, 0x3f, 0xb7, 0xd9, 0x71, 0xfc, 0xca, 0x17, 0x07, 0x2f, 0xed, 0xd7, 0xb3, 0xc8, 0x78, - 0x9c, 0x48, 0x12, 0xc6, 0x1f, 0xb5, 0xd5, 0x2d, 0x5f, 0x16, 0x05, 0x3a, 0xb4, 0x62, 0xed, 0xc3, - 0xd9, 0x32, 0x7e, 0x33, 0x53, 0xbf, 0x9d, 0x97, 0x73, 0x81, 0xeb, 0xb7, 0x50, 0x0f, 0xf4, 0x40, - 0x10, 0xf9, 0x10, 0x48, 0xa3, 0xb7, 0xbb, 0x4b, 0xc3, 0x88, 0xba, 0x1c, 0x46, 0x83, 0x70, 0x76, - 0x02, 0xf5, 0x03, 0x1e, 0x53, 0x85, 0xb2, 0xd4, 0x0e, 0x64, 0xb1, 0x2a, 0x24, 0xfd, 0xc4, 0x64, - 0x15, 0x66, 0x44, 0xa3, 0x19, 0x54, 0x46, 0xd6, 0x87, 0xb3, 0x93, 0xc8, 0x14, 0x6f, 0x61, 0x95, - 0x38, 0x7c, 0x6d, 0x7f, 0x9b, 0x45, 0x77, 0x61, 0x07, 0xce, 0x0f, 0xec, 0xb6, 0x8c, 0xa0, 0x90, - 0x39, 0x3d, 0x28, 0xe4, 0xfc, 0x20, 0xf5, 0x1a, 0xaa, 0x81, 0x21, 0xbf, 0x6b, 0xa4, 0xf4, 0xa9, - 0x30, 0x7e, 0x78, 0x9a, 0xbe, 0x41, 0x0b, 0x4e, 0x0e, 0x13, 0x06, 0x70, 0x8d, 0x9b, 0x4b, 0x8c, - 0x2e, 0xa6, 0x71, 0x55, 0x8d, 0x8d, 0xba, 0xf7, 0x29, 0x55, 0xab, 0xf9, 0x2f, 0x0d, 0x20, 0xbc, - 0x86, 0x0b, 0x4e, 0xd7, 0xd9, 0xf1, 0x5a, 0x5e, 0xe4, 0xd1, 0x90, 0xdc, 0x83, 0x8a, 0x60, 0xe1, - 0xec, 0xb4, 0xa8, 0xea, 0xef, 0x25, 0x2e, 0x84, 0xe3, 0x32, 0x3b, 0x6d, 0x26, 0xf5, 0x11, 0x0e, - 0x10, 0x86, 0xdc, 0x53, 0x08, 0x83, 0xf9, 0x43, 0x03, 0xce, 0xf7, 0x57, 0x5b, 0x7c, 0x39, 0xee, - 0x3c, 0xe3, 0x84, 0xce, 0xcb, 0x6a, 0x65, 0x0e, 0x8f, 0x52, 0x9f, 0x59, 0x2b, 0xf3, 0xc9, 0xc9, - 0xec, 0x93, 0xb7, 0xf2, 0x97, 0x73, 0x50, 0x5e, 0x6f, 0xf5, 0x76, 0xbd, 0xce, 0xa2, 0x13, 0x39, - 0xcf, 0xed, 0x16, 0xe5, 0x2d, 0x6d, 0x8b, 0x12, 0x7b, 0x78, 0xc5, 0x0d, 0x1b, 0x2e, 0x65, 0x9a, - 0x01, 0x53, 0x09, 0x09, 0x9f, 0xa5, 0x77, 0xa1, 0xc0, 0x7e, 0x08, 0x8b, 0xe7, 0x52, 0x1f, 0x63, - 0xc4, 0xba, 0x1e, 0xff, 0x27, 0x36, 0x0d, 0x7a, 0xa2, 0x3a, 0xe4, 0x70, 0xe1, 0x4b, 0x3c, 0xcf, - 0xd4, 0x93, 0xe7, 0xc4, 0xfc, 0x17, 0x06, 0x54, 0xd2, 0x2d, 0x21, 0xf7, 0x60, 0x8c, 0x71, 0xf2, - 0xe2, 0x9c, 0x55, 0xaf, 0x0c, 0x68, 0xf3, 0x75, 0x81, 0xc6, 0xab, 0x87, 0x9d, 0x4f, 0x39, 0xc4, - 0x92, 0x1c, 0x2e, 0x58, 0x50, 0x56, 0xb1, 0x32, 0x6a, 0xf7, 0xba, 0xae, 0x9a, 0xce, 0x66, 0xf7, - 0x83, 0x5a, 0xeb, 0xdf, 0xd1, 0x6a, 0x2d, 0x94, 0xd2, 0xb0, 0xc9, 0x07, 0x31, 0xc4, 0x8d, 0xeb, - 0x51, 0x55, 0xce, 0xa4, 0xf2, 0xd5, 0x43, 0xdc, 0x38, 0x8c, 0xed, 0x6d, 0xf8, 0xf7, 0x84, 0x9c, - 0xe1, 0xde, 0xa6, 0x8b, 0x10, 0xd5, 0x3e, 0xe6, 0x38, 0xe6, 0x3f, 0xc8, 0xc3, 0xd9, 0xa4, 0x7a, - 0x3c, 0x15, 0xe3, 0xba, 0x13, 0x38, 0xed, 0xf0, 0x84, 0x19, 0x70, 0xa5, 0xaf, 0x6a, 0x18, 0xc2, - 0x2d, 0xab, 0xa6, 0x54, 0xc8, 0x4c, 0x55, 0x08, 0x37, 0x85, 0xbc, 0x42, 0xb2, 0x1a, 0xe4, 0x1e, - 0xe4, 0x1b, 0x34, 0x12, 0x81, 0x9e, 0x97, 0xfb, 0x7a, 0x55, 0xad, 0xd7, 0xf5, 0x06, 0x8d, 0xf8, - 0x20, 0x72, 0x5f, 0x79, 0xaa, 0xf9, 0xae, 0x33, 0xf3, 0x7e, 0x1b, 0x46, 0x97, 0x1e, 0x77, 0x69, - 0x33, 0x12, 0xf1, 0x9d, 0x57, 0x8f, 0xe7, 0xc7, 0x71, 0x95, 0x28, 0x52, 0x8a, 0x00, 0xb5, 0xb3, - 0x38, 0xca, 0x85, 0x5b, 0x50, 0x94, 0x1f, 0x7f, 0xa2, 0x68, 0xc8, 0xb7, 0x60, 0x5c, 0xf9, 0xc8, - 0x13, 0x09, 0xfd, 0xdf, 0x1a, 0x30, 0xca, 0x94, 0xde, 0xd6, 0x9b, 0xcf, 0xa9, 0x46, 0xba, 0xa9, - 0x69, 0xa4, 0x69, 0x25, 0x6c, 0x07, 0xe7, 0xe5, 0x9b, 0x27, 0xe8, 0xa2, 0x43, 0x03, 0x20, 0x41, - 0x26, 0x77, 0x60, 0x4c, 0xe4, 0x67, 0x11, 0x79, 0x4e, 0xd5, 0x38, 0x20, 0x99, 0x07, 0x2a, 0xb6, - 0x9a, 0xfc, 0x6e, 0xda, 0xcc, 0x94, 0xd4, 0x64, 0x31, 0xf1, 0x95, 0x56, 0x03, 0x4f, 0x19, 0x9b, - 0x05, 0xbf, 0xc3, 0xe3, 0x42, 0x94, 0x8c, 0x52, 0x03, 0x9c, 0xa6, 0x6b, 0xe2, 0xa0, 0x24, 0x7f, - 0x1c, 0x93, 0xb3, 0x82, 0x49, 0xf6, 0x19, 0xca, 0xff, 0x1e, 0xe7, 0x91, 0x16, 0xb2, 0x62, 0xef, - 0x42, 0xf9, 0xb6, 0x1f, 0x3c, 0x72, 0x02, 0xb7, 0xb6, 0x4b, 0x85, 0x97, 0x7b, 0x11, 0x5d, 0xd5, - 0x27, 0x1e, 0x70, 0xb8, 0xed, 0xb0, 0x82, 0x1f, 0x1d, 0x56, 0x0b, 0x75, 0xdf, 0x6f, 0x59, 0x1a, - 0x3a, 0x59, 0x83, 0x89, 0xfb, 0xce, 0x63, 0x71, 0xe7, 0xb8, 0xb1, 0xb1, 0x22, 0x7c, 0x65, 0xae, - 0x1e, 0x1d, 0x56, 0xcf, 0xb7, 0x9d, 0xc7, 0xf1, 0x5d, 0xe5, 0x60, 0x77, 0x6e, 0x9d, 0x9e, 0x78, - 0x30, 0xb9, 0xee, 0x07, 0x91, 0xf8, 0x08, 0xb3, 0x91, 0xf3, 0x03, 0x6e, 0xad, 0xe6, 0x32, 0x6f, - 0xad, 0xce, 0xb3, 0x8d, 0x81, 0xfd, 0x20, 0x26, 0xd7, 0xc2, 0x03, 0x35, 0xc6, 0xe4, 0x5d, 0x98, - 0x5e, 0xa0, 0x41, 0xe4, 0x3d, 0xf0, 0x9a, 0x4e, 0x44, 0x6f, 0xfb, 0x41, 0xdb, 0x89, 0xc4, 0x01, - 0x0d, 0x6e, 0xd0, 0x9b, 0x94, 0x73, 0x6a, 0x3b, 0x91, 0xd5, 0x8f, 0x49, 0xbe, 0x9e, 0xe5, 0x7d, - 0x34, 0x82, 0xcd, 0x7f, 0x83, 0x19, 0x05, 0x19, 0xde, 0x47, 0x03, 0xba, 0x20, 0xc3, 0x0f, 0x69, - 0xf7, 0xb8, 0xab, 0xdb, 0x62, 0xfd, 0x86, 0xb8, 0x46, 0x3e, 0xf9, 0x6a, 0x36, 0x1e, 0xb7, 0x01, - 0x57, 0xb4, 0xf3, 0x90, 0xaf, 0xaf, 0xdf, 0xc6, 0x23, 0x17, 0x71, 0x55, 0x4a, 0x3b, 0x7b, 0x4e, - 0xa7, 0x89, 0xb6, 0x8c, 0xf0, 0xbf, 0x50, 0x15, 0x5e, 0x7d, 0xfd, 0x36, 0x71, 0xe0, 0xf4, 0x3a, - 0x0d, 0xda, 0x5e, 0xf4, 0xd5, 0x1b, 0x37, 0x94, 0x81, 0x2a, 0x62, 0xd5, 0xe6, 0x44, 0xd5, 0xaa, - 0x5d, 0x44, 0xb1, 0x1f, 0xdf, 0xb8, 0x91, 0x39, 0x1c, 0x71, 0xc5, 0xb2, 0x78, 0x91, 0x25, 0x98, - 0xbc, 0xef, 0x3c, 0x16, 0x97, 0xea, 0xf1, 0x9e, 0x31, 0x8f, 0xde, 0xfd, 0x28, 0x58, 0xcd, 0xa4, - 0x48, 0x1d, 0x62, 0x9d, 0x88, 0xbc, 0x03, 0xe3, 0x89, 0x78, 0x85, 0x78, 0x9d, 0x9a, 0xe7, 0x1b, - 0x0a, 0x45, 0x38, 0xb5, 0xb3, 0x29, 0x05, 0x9d, 0x6c, 0xc6, 0x5b, 0x7e, 0x6e, 0x90, 0xe2, 0x05, - 0x6a, 0xa9, 0x3e, 0xa7, 0x6e, 0xf9, 0x1d, 0x2c, 0xd1, 0x9a, 0x35, 0x15, 0x9b, 0xe8, 0xdc, 0xdb, - 0xc7, 0xd2, 0xb9, 0x28, 0x27, 0x09, 0xeb, 0x81, 0xdf, 0xee, 0x46, 0xe8, 0xf5, 0x98, 0x3a, 0x49, - 0xe8, 0x62, 0x49, 0xc6, 0x49, 0x02, 0x27, 0xc9, 0xf6, 0x15, 0x98, 0x78, 0x0a, 0x5f, 0x01, 0x0a, - 0x85, 0x15, 0xbf, 0xb9, 0x8f, 0x6e, 0x8e, 0xa5, 0xfa, 0x87, 0x4c, 0x7f, 0xb4, 0xfc, 0xe6, 0xfe, - 0xb3, 0xbb, 0xe3, 0x46, 0xf6, 0x64, 0x95, 0xb5, 0x9d, 0x89, 0x95, 0xf8, 0xf4, 0xec, 0x94, 0x76, - 0x73, 0xa7, 0x95, 0x71, 0x43, 0x85, 0x4b, 0xa1, 0x6c, 0x88, 0xa5, 0x93, 0x13, 0x0a, 0x95, 0x45, - 0x1a, 0xee, 0x47, 0x7e, 0x77, 0xa1, 0xe5, 0x75, 0x77, 0x7c, 0x27, 0x70, 0x67, 0x2b, 0x03, 0x14, - 0xc6, 0x6b, 0x99, 0x0a, 0x63, 0xda, 0xe5, 0xf4, 0x76, 0x53, 0x32, 0xb0, 0xfa, 0x58, 0x92, 0xaf, - 0xc3, 0x24, 0x9b, 0x2d, 0x4b, 0x8f, 0x23, 0xda, 0xe1, 0xa2, 0x34, 0x8d, 0x4b, 0xfd, 0x8c, 0x12, - 0x28, 0x19, 0x17, 0x72, 0x21, 0x45, 0xed, 0x41, 0x63, 0x02, 0x55, 0x48, 0x75, 0x56, 0xc4, 0x85, - 0xd9, 0xfb, 0xce, 0x63, 0x25, 0xad, 0x90, 0x22, 0xf5, 0x04, 0x25, 0xf6, 0xca, 0xd1, 0x61, 0xf5, - 0x15, 0x26, 0xb1, 0xfb, 0x31, 0xd2, 0x80, 0x09, 0x30, 0x90, 0x93, 0xf9, 0x93, 0xa9, 0x9e, 0x27, - 0xcb, 0x30, 0x26, 0xda, 0x29, 0xd6, 0xb6, 0xfe, 0x1e, 0x7b, 0x31, 0xb3, 0xc7, 0xc6, 0x44, 0x8f, - 0x59, 0x92, 0xde, 0xfc, 0x77, 0x06, 0x4c, 0x68, 0x8d, 0x22, 0xb7, 0x14, 0x47, 0x9f, 0xc4, 0x41, - 0x4f, 0xc3, 0xc9, 0x7c, 0xa5, 0xe0, 0x96, 0xf0, 0xee, 0xca, 0x0d, 0xa6, 0xcb, 0xcc, 0xdb, 0x26, - 0xd3, 0x23, 0xe4, 0x8f, 0x4f, 0x8f, 0x50, 0x18, 0x90, 0x1e, 0xe1, 0xd7, 0x26, 0x60, 0x52, 0x5f, - 0x46, 0x99, 0x5d, 0xbb, 0xe2, 0xef, 0x7a, 0x1d, 0xb9, 0x3b, 0xe6, 0x09, 0x3f, 0x10, 0xa2, 0xa5, - 0xfc, 0x47, 0x08, 0x79, 0x15, 0x20, 0xbe, 0x50, 0x96, 0x1b, 0x60, 0xf1, 0x40, 0x81, 0x52, 0x40, - 0x7e, 0x0a, 0x60, 0xd5, 0x77, 0x69, 0x9c, 0x33, 0xe6, 0x98, 0x63, 0xb0, 0xd7, 0xc4, 0x31, 0x98, - 0x78, 0x54, 0xe0, 0xe8, 0xb0, 0x7a, 0xa6, 0xe3, 0xbb, 0xb4, 0x3f, 0x59, 0x8c, 0xc2, 0x91, 0x7c, - 0x19, 0x46, 0xac, 0x5e, 0x8b, 0xca, 0x14, 0x26, 0xe3, 0x72, 0x5a, 0xf5, 0x5a, 0x4a, 0xb2, 0xd1, - 0xa0, 0x97, 0xbe, 0xfd, 0x60, 0x00, 0xf2, 0x3e, 0x00, 0x93, 0x9c, 0x3b, 0x81, 0xdf, 0xeb, 0xca, - 0x18, 0x69, 0xdc, 0x2c, 0x2b, 0x42, 0xb7, 0x8b, 0x85, 0xea, 0xc7, 0x13, 0x12, 0xb2, 0x06, 0x63, - 0x42, 0x49, 0x89, 0xdb, 0x85, 0x97, 0xb2, 0xce, 0xb5, 0x14, 0x4b, 0x45, 0xe4, 0x14, 0x41, 0xb0, - 0x7e, 0xd4, 0xc4, 0x37, 0xfb, 0xef, 0x40, 0x89, 0xb1, 0x67, 0x1b, 0xfa, 0x50, 0xac, 0x50, 0xe8, - 0x69, 0xa9, 0x54, 0x88, 0x6d, 0xfe, 0xb5, 0xcc, 0x66, 0x31, 0x01, 0xf9, 0x3a, 0x66, 0x01, 0x12, - 0x5d, 0x7d, 0xec, 0xf1, 0xe8, 0xe5, 0xbe, 0xae, 0x9e, 0x71, 0xba, 0xdd, 0x8c, 0xb4, 0x69, 0x31, - 0x3f, 0xb2, 0x1b, 0x47, 0x23, 0xc5, 0x19, 0xa7, 0x8f, 0xf9, 0xc0, 0xb5, 0xbe, 0x0f, 0xcc, 0xca, - 0x00, 0x9b, 0xfe, 0xdc, 0x3f, 0x1a, 0x5f, 0xd2, 0x85, 0x4a, 0x32, 0x9f, 0xc5, 0xb7, 0xe0, 0xb8, - 0x6f, 0xbd, 0xd1, 0xf7, 0x2d, 0x75, 0x00, 0xfb, 0x3e, 0xd7, 0xc7, 0x9d, 0xb8, 0x49, 0x76, 0x60, - 0xf1, 0xbd, 0xf1, 0xe3, 0xbe, 0xf7, 0x6a, 0xdf, 0xf7, 0x4e, 0xbb, 0x3b, 0xfd, 0xdf, 0x49, 0xf1, - 0x24, 0xef, 0xc0, 0x84, 0x84, 0xe0, 0xfc, 0xc0, 0x63, 0x49, 0xb1, 0x8b, 0x70, 0x77, 0xd0, 0xbd, - 0x4e, 0x4f, 0x7c, 0xa3, 0x22, 0xab, 0xd4, 0x5c, 0x3a, 0x26, 0x34, 0xea, 0xb4, 0x54, 0xe8, 0xc8, - 0xe4, 0x6b, 0x30, 0xbe, 0xdc, 0x66, 0x0d, 0xf1, 0x3b, 0x4e, 0x44, 0x71, 0xc9, 0x4b, 0x8e, 0x7a, - 0x95, 0x12, 0x45, 0x54, 0x79, 0x86, 0xcd, 0xa4, 0x48, 0x35, 0x19, 0x14, 0x0a, 0xd6, 0x79, 0xfc, - 0x90, 0x47, 0xc8, 0x70, 0x28, 0x16, 0xb8, 0x17, 0x33, 0x8e, 0x5b, 0x15, 0xf6, 0xb8, 0x62, 0xf0, - 0xb3, 0x23, 0x5b, 0x4c, 0x08, 0xad, 0xf3, 0x74, 0x9e, 0xe4, 0x5d, 0x18, 0x17, 0xb1, 0x9f, 0x35, - 0x6b, 0x35, 0x9c, 0xad, 0x60, 0xe3, 0x31, 0x6b, 0x9d, 0x0c, 0x13, 0xb5, 0x9d, 0x20, 0x75, 0xe7, - 0x96, 0xe0, 0x93, 0xaf, 0xc2, 0xcc, 0xb6, 0xd7, 0x71, 0xfd, 0x47, 0xa1, 0x50, 0xe0, 0x42, 0xd1, - 0x4d, 0x27, 0x9e, 0x45, 0x8f, 0x78, 0xb9, 0x2d, 0x17, 0xc7, 0x3e, 0xc5, 0x97, 0xc9, 0x81, 0xfc, - 0x5c, 0x1f, 0x67, 0x2e, 0x41, 0xe4, 0x38, 0x09, 0x9a, 0xef, 0x93, 0xa0, 0xfe, 0xcf, 0xa7, 0xc5, - 0x29, 0xf3, 0x33, 0xc4, 0x07, 0xa2, 0x5b, 0x36, 0x1f, 0xf8, 0x5e, 0x67, 0xf6, 0xb4, 0xf6, 0x9e, - 0x4b, 0xec, 0x5c, 0x8c, 0x78, 0xeb, 0x7e, 0xcb, 0x6b, 0x1e, 0xd4, 0xcd, 0xa3, 0xc3, 0xea, 0x4b, - 0x69, 0x9b, 0xe9, 0x63, 0x5f, 0x3b, 0xc2, 0xc8, 0x60, 0x4d, 0xbe, 0x06, 0x65, 0xf6, 0x37, 0x36, - 0x30, 0x67, 0xb4, 0x0b, 0x3a, 0x05, 0x53, 0x7c, 0x07, 0xc7, 0x08, 0x83, 0x53, 0x33, 0x6c, 0x4f, - 0x8d, 0x95, 0xf9, 0x43, 0x03, 0x66, 0xb2, 0xea, 0x7a, 0x42, 0x26, 0x20, 0x33, 0x75, 0x55, 0x8f, - 0xa7, 0x1f, 0xfc, 0xaa, 0x3e, 0xbe, 0xa0, 0xaf, 0xc2, 0x08, 0xdb, 0x91, 0x4b, 0x57, 0x32, 0x5c, - 0x0e, 0xd9, 0xae, 0x3d, 0xb4, 0x38, 0x9c, 0x21, 0x60, 0xd8, 0x01, 0xae, 0x97, 0x23, 0x1c, 0x01, - 0x63, 0x13, 0x2c, 0x0e, 0x67, 0x08, 0x6c, 0xd9, 0x95, 0xcb, 0x04, 0x22, 0xb0, 0xd5, 0x38, 0xb4, - 0x38, 0x9c, 0x5c, 0x86, 0xb1, 0xb5, 0xce, 0x0a, 0x75, 0x1e, 0x52, 0x71, 0x4f, 0x86, 0xa7, 0x35, - 0x7e, 0xc7, 0x6e, 0x31, 0x98, 0x25, 0x0b, 0xcd, 0xef, 0x1a, 0x30, 0xdd, 0xd7, 0x4d, 0x27, 0x27, - 0x3b, 0x3a, 0xfe, 0x52, 0x72, 0x98, 0xf6, 0xf1, 0xea, 0x17, 0xb2, 0xab, 0x6f, 0xfe, 0x51, 0x01, - 0xce, 0x0d, 0x58, 0xb5, 0x12, 0x87, 0x02, 0xe3, 0x44, 0x87, 0x82, 0x6f, 0xb0, 0x55, 0xc2, 0xf1, - 0xda, 0xe1, 0x86, 0x9f, 0xd4, 0x38, 0xb9, 0x7b, 0xc1, 0x32, 0x99, 0x4d, 0x44, 0x66, 0xbe, 0x38, - 0xdf, 0x44, 0x0a, 0x3b, 0xf2, 0xfb, 0x4e, 0xa6, 0x75, 0x66, 0x7d, 0x57, 0xfa, 0xf9, 0x1f, 0x93, - 0x2b, 0x7d, 0xfd, 0x22, 0xad, 0xf0, 0x4c, 0x2f, 0xd2, 0xb2, 0x8f, 0xe2, 0x47, 0x9e, 0xe6, 0xf6, - 0x69, 0x01, 0x26, 0x1a, 0xd4, 0x09, 0x9a, 0x7b, 0xb5, 0x90, 0x0f, 0xd2, 0x28, 0x72, 0x43, 0x95, - 0x1c, 0x62, 0x81, 0xed, 0x84, 0xfd, 0x63, 0xa1, 0xd1, 0x98, 0xff, 0x21, 0xe5, 0x89, 0xf0, 0xe3, - 0x28, 0x2f, 0x57, 0x61, 0x64, 0x7b, 0x8f, 0x06, 0xd2, 0x48, 0xc6, 0x8a, 0x3c, 0x62, 0x00, 0xb5, - 0x22, 0x88, 0x61, 0xfe, 0x2c, 0x94, 0xd5, 0x8f, 0xa1, 0x42, 0x60, 0xbf, 0xc5, 0x8c, 0xe4, 0x0a, - 0x81, 0x01, 0x2c, 0x0e, 0x3f, 0x31, 0x01, 0x59, 0xd2, 0x0b, 0xf9, 0x93, 0x7a, 0xc1, 0xfc, 0xf7, - 0x06, 0x14, 0x30, 0xff, 0xc2, 0x9b, 0x50, 0x92, 0xa7, 0xba, 0x6a, 0x4e, 0x82, 0xd3, 0xf2, 0xd0, - 0x37, 0xd4, 0x5d, 0x39, 0x04, 0x90, 0x7d, 0x6a, 0x8b, 0x06, 0x3b, 0x9a, 0xc7, 0xcf, 0x43, 0x06, - 0x50, 0x3f, 0x85, 0x18, 0x4f, 0xd0, 0x25, 0xe8, 0xd5, 0x24, 0x36, 0x65, 0x5c, 0x6b, 0x70, 0xaf, - 0xa6, 0xbe, 0x1d, 0x98, 0xc4, 0x32, 0x7f, 0xcb, 0x80, 0x33, 0x99, 0xc6, 0x04, 0xfb, 0x2a, 0xb7, - 0x5a, 0x14, 0x89, 0x48, 0x9b, 0x2c, 0x1c, 0xe3, 0x49, 0xbc, 0x97, 0x9e, 0x60, 0x78, 0x3f, 0x07, - 0xa5, 0x78, 0x93, 0x47, 0x66, 0xe4, 0xd0, 0xe1, 0xd1, 0x9f, 0xdc, 0x11, 0xfd, 0xad, 0x01, 0xa3, - 0xac, 0x0a, 0xcf, 0x6d, 0x30, 0x4b, 0xf6, 0x41, 0x30, 0x6b, 0xd2, 0x50, 0x21, 0x2c, 0xbf, 0x3f, - 0x0a, 0x90, 0x20, 0x93, 0x1d, 0x98, 0x5c, 0x5b, 0x5e, 0x5c, 0x58, 0x76, 0x69, 0x27, 0xc2, 0x0b, - 0xc9, 0x54, 0x52, 0x03, 0xb6, 0x3b, 0x0d, 0x3a, 0x4e, 0x4b, 0x20, 0x1c, 0x24, 0xd3, 0xd3, 0xf7, - 0xdc, 0xa6, 0xed, 0xc5, 0x74, 0xaa, 0x55, 0xa7, 0x73, 0x64, 0xdf, 0x68, 0xd4, 0xee, 0xaf, 0x28, - 0xdf, 0xc8, 0x0d, 0xf9, 0x8d, 0xd0, 0x69, 0xb7, 0x06, 0x7c, 0x43, 0xe7, 0x48, 0xf6, 0xa0, 0x72, - 0x07, 0x17, 0x00, 0xe5, 0x2b, 0xf9, 0xe3, 0xbf, 0xf2, 0xb2, 0xf8, 0xca, 0x0b, 0x7c, 0xe5, 0xc8, - 0xfe, 0x4e, 0x1f, 0xd7, 0x44, 0x72, 0x0b, 0x27, 0x4a, 0xee, 0xdf, 0x35, 0x60, 0x94, 0xaf, 0x30, - 0xf1, 0xbb, 0x28, 0x99, 0x6b, 0xd8, 0xf6, 0xb3, 0x59, 0xc3, 0x2a, 0x11, 0xfe, 0xa7, 0xee, 0xe2, - 0x79, 0x19, 0x59, 0x4c, 0x3d, 0xb2, 0x22, 0x4f, 0xfb, 0xd1, 0xba, 0xe5, 0x25, 0x89, 0x0f, 0x18, - 0x7f, 0x5f, 0x45, 0xe5, 0xc2, 0x31, 0xd4, 0x27, 0x1f, 0xc7, 0x9e, 0xf2, 0xc9, 0xc7, 0x15, 0x28, - 0x09, 0xa7, 0xa6, 0xfa, 0x81, 0xd8, 0xc3, 0xca, 0x53, 0x9a, 0x18, 0xae, 0xe4, 0xfa, 0xe6, 0x20, - 0x7b, 0x47, 0xcb, 0xd4, 0x17, 0x23, 0x92, 0x35, 0x28, 0x25, 0x91, 0x38, 0x25, 0xed, 0xca, 0x36, - 0x86, 0x0b, 0xaf, 0x5f, 0x1e, 0xec, 0x99, 0x19, 0x78, 0x93, 0xf0, 0x30, 0xbf, 0x65, 0x40, 0x25, - 0x2d, 0x2f, 0xe4, 0x1d, 0x18, 0x8f, 0x83, 0xa1, 0x62, 0x57, 0x08, 0x3c, 0x73, 0x4d, 0xa2, 0xa7, - 0x34, 0xa7, 0x08, 0x15, 0x9d, 0xcc, 0x43, 0x91, 0x4d, 0x3b, 0x25, 0x55, 0x33, 0xea, 0x93, 0x9e, - 0x80, 0xa9, 0x57, 0x90, 0x12, 0x4f, 0x99, 0xb5, 0xff, 0x31, 0x0f, 0xe3, 0xca, 0x60, 0x91, 0xab, - 0x50, 0x5c, 0x0e, 0x57, 0xfc, 0xe6, 0x3e, 0x75, 0xc5, 0xcd, 0x06, 0xbe, 0xe8, 0xe9, 0x85, 0x76, - 0x0b, 0x81, 0x56, 0x5c, 0x4c, 0xea, 0x30, 0xc1, 0xff, 0x93, 0x41, 0xaf, 0xb9, 0xe4, 0x54, 0x96, - 0x23, 0xcb, 0x70, 0x57, 0x75, 0x85, 0xd5, 0x48, 0xc8, 0x47, 0x00, 0x1c, 0xc0, 0xc6, 0x77, 0x08, - 0x9f, 0x66, 0x39, 0x81, 0xcf, 0x88, 0x0f, 0x44, 0x9e, 0xda, 0x42, 0x14, 0x05, 0x85, 0x21, 0xbe, - 0x26, 0xe8, 0x37, 0xf7, 0x87, 0x7f, 0x4f, 0x34, 0x79, 0x4d, 0xd0, 0x6f, 0xee, 0xdb, 0xd9, 0x0e, - 0x6e, 0x2a, 0x4b, 0xf2, 0x6d, 0x03, 0x2e, 0x58, 0xb4, 0xe9, 0x3f, 0xa4, 0xc1, 0x41, 0x2d, 0x42, - 0x2c, 0xf5, 0x8b, 0x27, 0x7b, 0xd3, 0xdd, 0x14, 0x5f, 0x7c, 0x2d, 0x10, 0x5c, 0x30, 0x12, 0xa7, - 0xdd, 0x8d, 0xec, 0x63, 0xaa, 0x70, 0xcc, 0x27, 0xcd, 0xbf, 0x30, 0x94, 0x29, 0x40, 0x56, 0xa1, - 0x14, 0x0b, 0x8b, 0x38, 0xb5, 0x8c, 0x8d, 0x23, 0x09, 0xb7, 0xe8, 0x83, 0xfa, 0x0b, 0xe2, 0x12, - 0xe2, 0x74, 0x2c, 0x72, 0xda, 0x8c, 0x90, 0x40, 0xf2, 0x15, 0x28, 0xe0, 0x50, 0x9d, 0x9c, 0xdb, - 0x4b, 0x2e, 0x35, 0x05, 0x36, 0x46, 0x58, 0x6b, 0xa4, 0x24, 0x5f, 0x10, 0x0e, 0x29, 0x79, 0x2d, - 0x6b, 0x2e, 0x03, 0xb1, 0x7a, 0xc4, 0x6b, 0x4c, 0xe2, 0x53, 0xa9, 0x48, 0xeb, 0xdf, 0xcb, 0x41, - 0x25, 0x3d, 0xf1, 0xc8, 0xfb, 0x50, 0x96, 0x51, 0x55, 0x77, 0x9d, 0x70, 0x4f, 0x64, 0xe2, 0xc4, - 0x8d, 0xa3, 0x0c, 0xc5, 0xb2, 0xf7, 0x1c, 0x2d, 0x63, 0x9b, 0x46, 0xc0, 0x16, 0xe4, 0x0d, 0xe1, - 0xaa, 0xaf, 0x4c, 0xa0, 0xc8, 0x8f, 0xba, 0xa9, 0x4c, 0x9c, 0x12, 0x8d, 0xbc, 0x09, 0x79, 0x1e, - 0x6a, 0xa8, 0xa6, 0x71, 0xba, 0x7f, 0xbb, 0xc6, 0x23, 0xa5, 0xf8, 0xbd, 0xb7, 0x7e, 0x81, 0xc0, - 0xf0, 0xc9, 0x8a, 0x12, 0xa8, 0x36, 0xaa, 0xa5, 0xb3, 0x91, 0xe0, 0xb8, 0x71, 0x27, 0x47, 0xac, - 0x7d, 0x50, 0x28, 0xe6, 0x2b, 0x05, 0x11, 0x9a, 0xf4, 0x87, 0x79, 0x28, 0xc5, 0xdf, 0x27, 0x04, - 0xd0, 0xde, 0x10, 0x17, 0xd8, 0xf8, 0x3f, 0x39, 0x0f, 0x45, 0x69, 0x62, 0x88, 0x4b, 0xec, 0xb1, - 0x50, 0x98, 0x17, 0xb3, 0x20, 0x6d, 0x09, 0x6e, 0x5e, 0x58, 0xf2, 0x27, 0xb9, 0x01, 0xb1, 0xa1, - 0x30, 0xc8, 0xa2, 0x28, 0xb0, 0x01, 0xb3, 0x62, 0x34, 0x32, 0x09, 0x39, 0x8f, 0xbb, 0x61, 0x97, - 0xac, 0x9c, 0xe7, 0x92, 0xf7, 0xa1, 0xe8, 0xb8, 0x2e, 0x75, 0x6d, 0x27, 0x1a, 0xe2, 0x6d, 0xd7, - 0x22, 0xe3, 0xc6, 0x35, 0x3a, 0x52, 0xd5, 0x22, 0x52, 0x83, 0x12, 0x3e, 0xed, 0xd9, 0x0b, 0x87, - 0x7a, 0x0f, 0x34, 0xe1, 0x50, 0x64, 0x64, 0x9b, 0x21, 0x75, 0xc9, 0x6b, 0x50, 0x60, 0xa3, 0x29, - 0xd6, 0x83, 0x38, 0x39, 0xdf, 0xda, 0xc6, 0x3a, 0xef, 0xb0, 0xbb, 0xa7, 0x2c, 0x44, 0x20, 0xaf, - 0x40, 0xbe, 0x37, 0xff, 0x40, 0x68, 0xfa, 0x4a, 0x12, 0x85, 0x1a, 0xa3, 0xb1, 0x62, 0x72, 0x13, - 0x8a, 0x8f, 0xf4, 0x78, 0xc3, 0x33, 0xa9, 0x61, 0x8c, 0xf1, 0x63, 0xc4, 0x7a, 0x11, 0x46, 0x79, - 0xa4, 0x9d, 0xf9, 0x12, 0x40, 0xf2, 0xe9, 0x7e, 0x5f, 0x03, 0xf3, 0x23, 0x28, 0xc5, 0x9f, 0x24, - 0x2f, 0x02, 0xec, 0xd3, 0x03, 0x7b, 0xcf, 0xe9, 0xb8, 0xe2, 0x25, 0x99, 0xb2, 0x55, 0xda, 0xa7, - 0x07, 0x77, 0x11, 0x40, 0xce, 0xc1, 0x58, 0x97, 0x8d, 0xaa, 0xcc, 0x23, 0x6b, 0x8d, 0x76, 0x7b, - 0x3b, 0x4c, 0x42, 0x67, 0x61, 0x0c, 0xcf, 0x1f, 0xc4, 0x44, 0x9b, 0xb0, 0xe4, 0x4f, 0xf3, 0x77, - 0x73, 0x98, 0x61, 0x40, 0xa9, 0x27, 0x79, 0x19, 0x26, 0x9a, 0x01, 0xc5, 0xe5, 0xc8, 0x61, 0x66, - 0x91, 0xf8, 0x4e, 0x39, 0x01, 0x2e, 0xbb, 0xe4, 0x32, 0x4c, 0x25, 0x89, 0x6d, 0xed, 0xe6, 0x8e, - 0x88, 0x36, 0x2e, 0x5b, 0x13, 0x5d, 0x99, 0xd9, 0x76, 0x61, 0x07, 0xc3, 0x07, 0x2a, 0x6a, 0x94, - 0x5d, 0x24, 0x93, 0xd4, 0x96, 0xac, 0x29, 0x05, 0x8e, 0x77, 0x17, 0x67, 0x61, 0xd4, 0x71, 0x76, - 0x7b, 0x1e, 0x77, 0x65, 0x2e, 0x5b, 0xe2, 0x17, 0xf9, 0x3c, 0x4c, 0x87, 0xde, 0x6e, 0xc7, 0x89, - 0x7a, 0x81, 0x48, 0xf1, 0x40, 0x03, 0x14, 0xa9, 0x09, 0xab, 0x12, 0x17, 0x2c, 0x70, 0x38, 0x79, - 0x03, 0x88, 0xfa, 0x3d, 0x7f, 0xe7, 0x63, 0xda, 0xe4, 0xa2, 0x56, 0xb6, 0xa6, 0x95, 0x92, 0x35, - 0x2c, 0x20, 0x9f, 0x83, 0x72, 0x40, 0x43, 0x34, 0xc9, 0xb0, 0xdb, 0x30, 0x71, 0x8d, 0x35, 0x2e, - 0x61, 0xf7, 0xe8, 0x81, 0x59, 0x87, 0xe9, 0xbe, 0xf9, 0x48, 0xde, 0xe0, 0xd6, 0xbd, 0x58, 0x9f, - 0xcb, 0x7c, 0x33, 0xc3, 0x94, 0x54, 0xea, 0x35, 0x68, 0x8e, 0x64, 0x76, 0xa0, 0xac, 0xea, 0xd7, - 0x13, 0xe2, 0xb8, 0xcf, 0xa2, 0x0f, 0x24, 0x57, 0x3e, 0xa3, 0x47, 0x87, 0xd5, 0x9c, 0xe7, 0xa2, - 0xe7, 0xe3, 0x15, 0x28, 0x4a, 0x2b, 0x41, 0x7d, 0xf5, 0x44, 0x18, 0x94, 0x07, 0x56, 0x5c, 0x6a, - 0xbe, 0x06, 0x63, 0x42, 0x85, 0x1e, 0x7f, 0x16, 0x64, 0xfe, 0x62, 0x0e, 0xa6, 0x2c, 0xca, 0x26, - 0xb8, 0x78, 0x4f, 0xe4, 0x33, 0x96, 0xe2, 0x57, 0x6b, 0xdb, 0x31, 0x69, 0x13, 0xbe, 0x67, 0xc0, - 0xe9, 0x0c, 0xdc, 0x4f, 0x94, 0x13, 0xec, 0x16, 0x94, 0x16, 0x3d, 0xa7, 0x55, 0x73, 0xdd, 0xd8, - 0x97, 0x13, 0xad, 0x41, 0x97, 0x4d, 0x27, 0x87, 0x41, 0xd5, 0xc5, 0x34, 0x46, 0x25, 0xd7, 0x84, - 0x50, 0x24, 0x59, 0x0b, 0x65, 0x12, 0x61, 0xe0, 0x75, 0x4a, 0x52, 0x08, 0x63, 0x04, 0x1e, 0x07, - 0x26, 0x77, 0x94, 0xcf, 0xed, 0xd0, 0x65, 0x47, 0xe0, 0xa5, 0x9b, 0x37, 0xd4, 0xb6, 0xf3, 0x5b, - 0x39, 0x38, 0x9b, 0x4d, 0xf8, 0x49, 0xd3, 0xbb, 0x61, 0xce, 0x0a, 0x25, 0x4f, 0x33, 0xa6, 0x77, - 0xe3, 0x09, 0x2e, 0x10, 0x3f, 0x41, 0x20, 0x0f, 0x60, 0x62, 0xc5, 0x09, 0xa3, 0xbb, 0xd4, 0x09, - 0xa2, 0x1d, 0xea, 0x44, 0x43, 0x58, 0xb0, 0xf1, 0x9b, 0xcb, 0xb8, 0xa8, 0xed, 0x49, 0xca, 0xf4, - 0x9b, 0xcb, 0x1a, 0xdb, 0x58, 0x50, 0x0a, 0x43, 0x08, 0xca, 0x37, 0x61, 0xaa, 0x41, 0xdb, 0x4e, - 0x77, 0xcf, 0x0f, 0xa8, 0x38, 0xbe, 0xbe, 0x0e, 0x13, 0x31, 0x28, 0x53, 0x5a, 0xf4, 0x62, 0x0d, - 0x5f, 0xe9, 0x88, 0x44, 0x95, 0xe8, 0xc5, 0xe6, 0x6f, 0xe7, 0xe0, 0x5c, 0xad, 0x29, 0xce, 0xfa, - 0x45, 0x81, 0xbc, 0x92, 0xfc, 0x94, 0xbf, 0x4d, 0xe6, 0xa0, 0x74, 0xdf, 0x79, 0xbc, 0x42, 0xf1, - 0x55, 0x54, 0x9e, 0x24, 0x88, 0x9b, 0x5f, 0xce, 0x63, 0x3b, 0x3e, 0xf6, 0xb2, 0x12, 0x1c, 0x75, - 0xb3, 0x59, 0x78, 0xca, 0xcd, 0xa6, 0x09, 0xa3, 0x77, 0xfd, 0x96, 0x2b, 0x16, 0x27, 0x71, 0x75, - 0xb0, 0x87, 0x10, 0x4b, 0x94, 0x98, 0x3f, 0x34, 0x60, 0x32, 0xae, 0x31, 0x56, 0xe1, 0x53, 0xef, - 0x92, 0xcb, 0x30, 0x86, 0x1f, 0x8a, 0xdf, 0xe4, 0xc1, 0x45, 0xa3, 0xc5, 0x40, 0xb6, 0xe7, 0x5a, - 0xb2, 0x50, 0xed, 0x89, 0x91, 0xa7, 0xeb, 0x09, 0xf3, 0x9f, 0xe2, 0xad, 0x84, 0xda, 0x4a, 0xb6, - 0x12, 0x29, 0x15, 0x31, 0x86, 0xac, 0x48, 0xee, 0x99, 0x0d, 0x49, 0x7e, 0xe0, 0x90, 0xfc, 0x52, - 0x0e, 0xc6, 0xe3, 0xca, 0x7e, 0xc6, 0x42, 0xd7, 0xe3, 0x76, 0x0d, 0xe5, 0x48, 0xde, 0x50, 0x74, - 0x85, 0xf0, 0xd7, 0xfe, 0x0a, 0x8c, 0x8a, 0xc9, 0x64, 0xa4, 0xae, 0xe6, 0x52, 0xa3, 0x9b, 0xbc, - 0x9b, 0x8b, 0x03, 0x1a, 0x5a, 0x82, 0x0e, 0x3d, 0xf5, 0xb7, 0xe9, 0x8e, 0xb8, 0xa4, 0x7a, 0x6e, - 0xd7, 0xa8, 0x6c, 0x4f, 0xfd, 0xa4, 0x61, 0x43, 0xad, 0x4e, 0xff, 0xa8, 0x00, 0x95, 0x34, 0xc9, - 0xc9, 0xc9, 0x01, 0xd6, 0x7b, 0x3b, 0xe2, 0x59, 0x08, 0x4c, 0x0e, 0xd0, 0xed, 0xed, 0x58, 0x0c, - 0x46, 0x2e, 0x43, 0x61, 0x3d, 0xf0, 0x1e, 0x62, 0xab, 0xc5, 0xab, 0x18, 0xdd, 0xc0, 0x7b, 0xa8, - 0xba, 0xac, 0xb2, 0x72, 0xdc, 0xd0, 0xae, 0x34, 0x94, 0x27, 0xcb, 0xf9, 0x86, 0xb6, 0x15, 0xa6, - 0xb3, 0xd0, 0x48, 0x34, 0xb6, 0x54, 0xd6, 0xa9, 0x13, 0x88, 0x40, 0x76, 0xa1, 0xce, 0x70, 0xa9, - 0xdc, 0x41, 0x30, 0x4f, 0x31, 0x6b, 0xa9, 0x48, 0xa4, 0x05, 0x44, 0xf9, 0x29, 0x27, 0xf0, 0xc9, - 0x7b, 0x3c, 0xf9, 0x9a, 0xd3, 0x8c, 0xca, 0xda, 0x56, 0x67, 0x73, 0x06, 0xdf, 0x67, 0x79, 0x46, - 0xb8, 0x0e, 0x25, 0x3c, 0xf2, 0xc2, 0x83, 0x8c, 0xe2, 0x89, 0xcc, 0xa4, 0x7b, 0x30, 0xe0, 0x95, - 0xbe, 0x1d, 0x1f, 0x67, 0x24, 0x4c, 0xc8, 0x7b, 0x30, 0xae, 0xfa, 0xb4, 0x72, 0xcf, 0xcb, 0x8b, - 0x3c, 0x98, 0x69, 0x40, 0xb6, 0x36, 0x95, 0xc0, 0xfc, 0x82, 0x2a, 0x25, 0x62, 0xd1, 0x3e, 0x56, - 0x4a, 0xcc, 0xdf, 0x44, 0x33, 0xbe, 0xed, 0x47, 0x54, 0x58, 0x2f, 0xcf, 0xad, 0x1e, 0x4b, 0x8e, - 0x90, 0x47, 0x34, 0xb7, 0x12, 0xad, 0x75, 0x4f, 0xf0, 0x58, 0xf7, 0x1f, 0x18, 0x70, 0x26, 0x93, - 0x96, 0x5c, 0x07, 0x48, 0x6c, 0x44, 0xd1, 0x4b, 0x3c, 0x77, 0x6f, 0x0c, 0xb5, 0x14, 0x0c, 0xf2, - 0x8d, 0xb4, 0x75, 0x77, 0xf2, 0xe2, 0x24, 0x5f, 0xb8, 0x98, 0xd4, 0xad, 0xbb, 0x0c, 0x9b, 0xce, - 0xfc, 0x5e, 0x1e, 0xa6, 0xfb, 0x5e, 0x46, 0x3c, 0xe1, 0x22, 0x7f, 0x3f, 0xf5, 0xee, 0x16, 0xbf, - 0xee, 0xb8, 0x36, 0xe8, 0x5d, 0xc6, 0x8c, 0x57, 0xb8, 0xf0, 0x58, 0x4c, 0xa4, 0x8d, 0x3e, 0xe1, - 0x31, 0xae, 0x30, 0xfb, 0xc5, 0xb6, 0xcf, 0x0f, 0xfc, 0xda, 0x33, 0x78, 0xb9, 0xed, 0xc7, 0xf8, - 0x61, 0xab, 0xdf, 0xcc, 0xc1, 0xe9, 0xbe, 0x36, 0x3f, 0xb7, 0xb3, 0xee, 0x2b, 0xda, 0xea, 0xf6, - 0xd2, 0xa0, 0x31, 0x1d, 0xca, 0x8a, 0xf8, 0x9f, 0x06, 0x9c, 0x1b, 0x40, 0x49, 0x0e, 0xd2, 0x42, - 0xc4, 0xad, 0x8a, 0x1b, 0xc7, 0x7f, 0xf0, 0x99, 0x88, 0xd2, 0xa7, 0x26, 0x09, 0xbf, 0x98, 0x03, - 0xd8, 0xa6, 0x3b, 0xcf, 0x77, 0xe6, 0xa3, 0x2f, 0x69, 0x02, 0xa0, 0x1c, 0x60, 0x0e, 0x9f, 0xf8, - 0x68, 0x0d, 0x0f, 0x12, 0x87, 0x4f, 0x7b, 0x14, 0xbf, 0xe2, 0x91, 0xcb, 0x7e, 0xc5, 0xc3, 0xdc, - 0x81, 0x99, 0x3b, 0x34, 0x4a, 0x56, 0x42, 0xb9, 0x87, 0x3c, 0x9e, 0xed, 0xeb, 0x50, 0x12, 0xf8, - 0x7a, 0x46, 0x76, 0xe9, 0x95, 0xe6, 0xb9, 0x56, 0x82, 0x60, 0x52, 0x38, 0xb7, 0x48, 0x5b, 0x34, - 0xa2, 0x9f, 0xee, 0x67, 0x1a, 0x40, 0x78, 0x53, 0xf8, 0xe3, 0x0e, 0x43, 0x7d, 0xe1, 0xc4, 0xfe, - 0xd9, 0x82, 0x33, 0x71, 0xdd, 0x9f, 0x25, 0xdf, 0x39, 0x66, 0x4b, 0x88, 0xb0, 0xc0, 0x84, 0xe3, - 0x31, 0x87, 0x88, 0x8f, 0xe1, 0x82, 0x24, 0xd8, 0xf6, 0xe2, 0x9b, 0x98, 0xa1, 0x68, 0xc9, 0x3b, - 0x30, 0xae, 0xd0, 0x88, 0x18, 0x63, 0xbc, 0xed, 0x7c, 0xe4, 0x45, 0x7b, 0x76, 0xc8, 0xe1, 0xea, - 0x6d, 0xa7, 0x82, 0x6e, 0x7e, 0x1d, 0x5e, 0x88, 0xfd, 0x56, 0x32, 0x3e, 0x9d, 0x62, 0x6e, 0x3c, - 0x19, 0xf3, 0xd5, 0xa4, 0x59, 0xcb, 0x9d, 0xd8, 0x09, 0x5d, 0xf2, 0x26, 0x6a, 0xb3, 0x44, 0x63, - 0x2e, 0x2a, 0x19, 0xe1, 0xc4, 0x5a, 0x94, 0x00, 0xcc, 0xb7, 0x95, 0xca, 0x66, 0x30, 0xd4, 0x88, - 0x8d, 0x34, 0xf1, 0x2f, 0xe6, 0x60, 0x6a, 0x6d, 0x79, 0x71, 0x21, 0x3e, 0x46, 0xfe, 0x8c, 0xa5, - 0x65, 0xd2, 0xda, 0x36, 0x58, 0xdf, 0x98, 0x9b, 0x70, 0x3a, 0xd5, 0x0d, 0xf8, 0x76, 0xcd, 0x7b, - 0xdc, 0xbf, 0x24, 0x06, 0xcb, 0x95, 0xe5, 0x6c, 0x16, 0xfb, 0xad, 0x9b, 0x56, 0x0a, 0xdb, 0xfc, - 0xde, 0x68, 0x8a, 0xaf, 0x50, 0x61, 0xaf, 0x43, 0x69, 0x39, 0x0c, 0x7b, 0x34, 0xd8, 0xb4, 0x56, - 0x54, 0x1b, 0xd1, 0x43, 0xa0, 0xdd, 0x0b, 0x5a, 0x56, 0x82, 0x40, 0xae, 0x42, 0x51, 0x84, 0xa2, - 0x49, 0x9d, 0x80, 0xd7, 0xe5, 0x71, 0x24, 0x9b, 0x15, 0x17, 0x93, 0x37, 0xa1, 0xcc, 0xff, 0xe7, - 0xd2, 0x26, 0x3a, 0x1c, 0xcf, 0xaa, 0x04, 0x3a, 0x97, 0x4e, 0x4b, 0x43, 0x63, 0x3b, 0x33, 0xf9, - 0x38, 0x26, 0xab, 0x51, 0x21, 0xd9, 0x99, 0xc9, 0x77, 0x34, 0xb1, 0x4e, 0x2a, 0x12, 0xb9, 0x06, - 0xf9, 0xda, 0x82, 0xa5, 0x26, 0xa1, 0x76, 0x9a, 0x01, 0x4f, 0xe2, 0xae, 0xbd, 0x3f, 0x55, 0x5b, - 0xb0, 0xc8, 0x3c, 0x14, 0xf1, 0x7d, 0x11, 0x97, 0x06, 0xc2, 0xf1, 0x14, 0xa5, 0xa6, 0x2b, 0x60, - 0xea, 0xcd, 0xa3, 0xc4, 0x23, 0x73, 0x30, 0xb6, 0xe8, 0x85, 0xdd, 0x96, 0x73, 0x20, 0xf2, 0xb1, - 0xe0, 0x65, 0x88, 0xcb, 0x41, 0xaa, 0x9c, 0x09, 0x2c, 0x72, 0x15, 0x46, 0x1a, 0x4d, 0xbf, 0xcb, - 0x76, 0x5b, 0xb1, 0x6b, 0x4b, 0xc8, 0x00, 0x5a, 0x12, 0x06, 0x06, 0xc0, 0xe8, 0x68, 0x1e, 0xe4, - 0x55, 0x52, 0xa2, 0xa3, 0xd3, 0xc1, 0x5d, 0x02, 0xa7, 0xdf, 0xff, 0x0f, 0x9e, 0xa5, 0xff, 0xdf, - 0x0e, 0x9c, 0xbb, 0x83, 0xa6, 0x7e, 0x83, 0x06, 0x98, 0x02, 0x93, 0xbf, 0x55, 0xb4, 0x69, 0x2d, - 0x8b, 0xc0, 0x36, 0x0c, 0x33, 0xe2, 0xbb, 0x01, 0x3b, 0xe4, 0x38, 0xf2, 0x99, 0xa3, 0xd4, 0x03, - 0x0d, 0x83, 0x18, 0x91, 0xaf, 0xc2, 0x4c, 0x56, 0x91, 0x08, 0x71, 0x43, 0xd7, 0xf2, 0xec, 0x0f, - 0xa8, 0xbe, 0xdd, 0x59, 0x1c, 0xc8, 0x0a, 0x54, 0x38, 0xbc, 0xe6, 0xb6, 0xbd, 0xce, 0x52, 0xdb, - 0xf1, 0x5a, 0x18, 0xf0, 0x26, 0xa2, 0x16, 0x05, 0x57, 0x87, 0x15, 0xda, 0x94, 0x95, 0x6a, 0xde, - 0x49, 0x29, 0x4a, 0x54, 0x47, 0x8d, 0xda, 0xfd, 0x95, 0x64, 0x4e, 0x7d, 0xb6, 0xee, 0x8d, 0xb4, - 0xb6, 0x1d, 0x73, 0x6f, 0xb4, 0x09, 0xa7, 0x53, 0xdd, 0x20, 0xd5, 0x91, 0x06, 0x4e, 0xab, 0xa3, - 0x14, 0x8d, 0x95, 0xc2, 0x36, 0xff, 0xd3, 0x68, 0x8a, 0xaf, 0x38, 0x2b, 0x32, 0x61, 0x94, 0x6b, - 0x1b, 0x35, 0x61, 0x1b, 0xd7, 0x45, 0x96, 0x28, 0x21, 0xe7, 0x21, 0xdf, 0x68, 0xac, 0xa9, 0xe9, - 0x24, 0xc3, 0xd0, 0xb7, 0x18, 0x8c, 0x8d, 0x10, 0x1e, 0x03, 0x29, 0x51, 0x5e, 0x4d, 0x1a, 0x44, - 0xe2, 0xf5, 0xd4, 0x57, 0x93, 0x79, 0x5c, 0x48, 0xfa, 0x5b, 0xcc, 0xe3, 0x64, 0xf6, 0x2e, 0xc0, - 0x6c, 0x2d, 0x0c, 0x69, 0x10, 0xf1, 0x1c, 0xf8, 0x61, 0xaf, 0x4d, 0x03, 0x21, 0x6b, 0x42, 0xc7, - 0xf0, 0xb7, 0xd7, 0x9b, 0xa1, 0x35, 0x10, 0x91, 0x5c, 0x81, 0x62, 0xad, 0xe7, 0x7a, 0xb4, 0xd3, - 0xd4, 0x1c, 0xdc, 0x1d, 0x01, 0xb3, 0xe2, 0x52, 0xf2, 0x21, 0x9c, 0x11, 0x44, 0x52, 0xe1, 0x88, - 0x1e, 0xe0, 0xba, 0x86, 0xef, 0x60, 0xc5, 0x5c, 0x90, 0x6a, 0xca, 0x16, 0x5d, 0x92, 0x4d, 0x49, - 0x6a, 0x50, 0x59, 0xc2, 0x7b, 0x52, 0xf9, 0x86, 0xb2, 0x1f, 0x88, 0x5c, 0xc7, 0xa8, 0xb9, 0xf8, - 0x1d, 0xaa, 0xed, 0xc6, 0x85, 0x56, 0x1f, 0x3a, 0xb9, 0x07, 0xa7, 0xd3, 0x30, 0xa6, 0x8f, 0x4b, - 0xc9, 0x1b, 0x67, 0x7d, 0x5c, 0x50, 0x31, 0x67, 0x51, 0x91, 0x1d, 0x98, 0xae, 0x45, 0x51, 0xe0, - 0xed, 0xf4, 0x22, 0x9a, 0x52, 0x5d, 0xf2, 0xa0, 0x31, 0x2e, 0x97, 0xea, 0xeb, 0x05, 0x21, 0x8c, - 0xa7, 0x9d, 0x98, 0x32, 0x56, 0x61, 0x56, 0x3f, 0x3b, 0xe2, 0xc6, 0xcf, 0x24, 0x8a, 0xa7, 0x04, - 0x45, 0x54, 0x92, 0x3c, 0xd0, 0xad, 0x85, 0x07, 0xed, 0x36, 0x8d, 0x02, 0xbc, 0xb9, 0xc7, 0xa7, - 0x06, 0x4d, 0xe1, 0x03, 0x74, 0x41, 0x79, 0x1d, 0x14, 0x9f, 0x93, 0xd4, 0xdc, 0x23, 0x35, 0x9e, - 0xda, 0xf2, 0x51, 0x1e, 0x72, 0xf9, 0x68, 0xc1, 0xf4, 0x52, 0xa7, 0x19, 0x1c, 0x60, 0x78, 0xa4, - 0xac, 0xdc, 0xc4, 0x09, 0x95, 0x93, 0xef, 0x88, 0x5c, 0x74, 0xa4, 0x84, 0x65, 0x55, 0xaf, 0x9f, - 0xb1, 0xf9, 0xff, 0x41, 0x25, 0xdd, 0x97, 0x4f, 0xf9, 0x36, 0xf4, 0x93, 0xb8, 0x66, 0xb3, 0x91, - 0x4e, 0xb7, 0x85, 0xcc, 0x69, 0x0f, 0x00, 0x1b, 0x49, 0x00, 0xbd, 0xf2, 0x54, 0xaf, 0xf6, 0xec, - 0xaf, 0x9c, 0xc6, 0xb9, 0xac, 0x69, 0x6c, 0xfe, 0x72, 0x0e, 0xa6, 0xb9, 0x37, 0xe9, 0xf3, 0x6f, - 0x2b, 0xbe, 0xa7, 0x29, 0x67, 0x79, 0x16, 0x98, 0x6a, 0xdd, 0x31, 0xd6, 0xe2, 0x47, 0x70, 0xa6, - 0xaf, 0x2b, 0x50, 0x41, 0x2f, 0x4a, 0x3f, 0xde, 0x3e, 0x15, 0x3d, 0x9b, 0xfd, 0x91, 0xad, 0x9b, - 0x56, 0x1f, 0x85, 0xf9, 0x8f, 0x73, 0x7d, 0xfc, 0x85, 0xdd, 0xa8, 0x5a, 0x82, 0xc6, 0x93, 0x59, - 0x82, 0xb9, 0x4f, 0x64, 0x09, 0xe6, 0x87, 0xb1, 0x04, 0x3f, 0x84, 0x89, 0x0d, 0xea, 0x30, 0x8b, - 0x46, 0x44, 0xac, 0x15, 0xb4, 0xc7, 0x79, 0x59, 0x99, 0xd4, 0x2f, 0x71, 0xb4, 0x6b, 0xc4, 0x08, - 0x98, 0x6a, 0xe1, 0x21, 0x6c, 0x96, 0xce, 0x41, 0x5d, 0x34, 0x46, 0x06, 0x2f, 0x1a, 0xe6, 0xb7, - 0x72, 0x30, 0xae, 0xb0, 0x27, 0x5f, 0x84, 0xf2, 0x5a, 0xb0, 0xeb, 0x74, 0xbc, 0x9f, 0x71, 0x94, - 0xe3, 0x57, 0xac, 0xbe, 0xaf, 0xc0, 0x2d, 0x0d, 0x0b, 0xdd, 0x66, 0xa8, 0xd3, 0x56, 0x05, 0x9f, - 0x55, 0xcf, 0x42, 0xa8, 0x12, 0x71, 0x9c, 0x1f, 0x22, 0xe2, 0x58, 0x0f, 0xd7, 0x2d, 0x3c, 0x79, - 0xb8, 0xae, 0x16, 0x5d, 0x3b, 0xf2, 0x84, 0xd1, 0xb5, 0xe6, 0xaf, 0xe6, 0xa0, 0x22, 0x9e, 0xb1, - 0x95, 0x87, 0x87, 0x9f, 0xad, 0x67, 0x2f, 0xf4, 0xc6, 0x1d, 0x73, 0x3d, 0x56, 0xf8, 0xad, 0xdf, - 0xab, 0xe2, 0xa3, 0xa4, 0xe9, 0xee, 0x90, 0x8f, 0x92, 0xea, 0xf0, 0x74, 0xe4, 0x40, 0x9a, 0xca, - 0x4a, 0xe3, 0x9b, 0x7f, 0x9e, 0x4b, 0xf3, 0x16, 0xd6, 0xd4, 0xab, 0x30, 0xc6, 0x5f, 0x21, 0x93, - 0xce, 0xcd, 0x22, 0xcd, 0x14, 0x82, 0x2c, 0x59, 0xf6, 0x24, 0x31, 0x24, 0x27, 0xbd, 0x4c, 0x4b, - 0x6e, 0x41, 0x19, 0xfd, 0x45, 0x6a, 0xae, 0x1b, 0xd0, 0x30, 0x14, 0x86, 0x16, 0xde, 0xdd, 0x3d, - 0xa2, 0x3b, 0x36, 0xf7, 0x2b, 0x71, 0x5c, 0x37, 0xb0, 0x34, 0x3c, 0xb2, 0x00, 0x33, 0x9a, 0x7b, - 0x92, 0xa4, 0x1f, 0x49, 0x56, 0x8b, 0x08, 0x0b, 0x38, 0x71, 0x26, 0xf2, 0xb3, 0x7b, 0x95, 0xdb, - 0xfc, 0x6b, 0x83, 0xcd, 0xb5, 0xe6, 0xfe, 0x67, 0x2c, 0xba, 0x85, 0x35, 0xe9, 0x18, 0x63, 0xff, - 0xcf, 0x0c, 0xee, 0x9f, 0x2e, 0xc4, 0xe7, 0x2d, 0x18, 0xe5, 0x6f, 0x9e, 0x09, 0x4f, 0x6a, 0x95, - 0x0b, 0x2f, 0x48, 0xee, 0xa7, 0xf8, 0xcb, 0x69, 0x96, 0x20, 0x60, 0x5b, 0x66, 0xdd, 0x4d, 0x1e, - 0x0d, 0xcf, 0x7e, 0xff, 0x78, 0x89, 0xa5, 0xa6, 0x64, 0x1d, 0x2e, 0xd5, 0xb7, 0x71, 0x72, 0x4a, - 0x56, 0xf3, 0xff, 0xe6, 0x78, 0x7b, 0x44, 0xa5, 0x86, 0xcd, 0x0d, 0x78, 0x19, 0x0a, 0xf8, 0xba, - 0xae, 0x92, 0x80, 0x31, 0xf5, 0xb2, 0x2e, 0x96, 0xb3, 0x79, 0x83, 0xba, 0x56, 0x0d, 0xa8, 0x42, - 0x75, 0xac, 0xce, 0x1b, 0xc4, 0xc0, 0x44, 0xda, 0xbe, 0x4b, 0xd5, 0xe9, 0xd0, 0xd1, 0x73, 0x9e, - 0x63, 0x39, 0xb9, 0xa5, 0xf8, 0x35, 0xab, 0x07, 0x1a, 0xed, 0x07, 0x8e, 0xcd, 0xfd, 0x69, 0x55, - 0x6d, 0x9b, 0xb8, 0x40, 0x2f, 0xc1, 0xa4, 0x1e, 0xf0, 0x2c, 0x36, 0x1d, 0x18, 0xa4, 0x98, 0x0a, - 0x96, 0x56, 0xcd, 0x5b, 0x9d, 0x88, 0xd4, 0x61, 0x42, 0x8b, 0x6a, 0x55, 0xf3, 0xcf, 0xf2, 0x44, - 0x36, 0x76, 0x7f, 0x3a, 0x06, 0x9d, 0x44, 0x39, 0x30, 0xff, 0x02, 0x54, 0xc4, 0xcc, 0x8c, 0x63, - 0xdb, 0xd0, 0xb4, 0x5b, 0x5e, 0xb4, 0xd4, 0xd9, 0xd4, 0xf4, 0xdc, 0xc0, 0x42, 0xa8, 0xf9, 0x5d, - 0x03, 0xce, 0x8b, 0xb7, 0xdc, 0x2c, 0x1a, 0x32, 0x1b, 0x12, 0x03, 0xe2, 0x50, 0x1e, 0xbf, 0x48, - 0xde, 0x91, 0x39, 0xb2, 0x74, 0x05, 0x99, 0xfe, 0x46, 0x7d, 0x42, 0x08, 0xe5, 0x08, 0x66, 0xc9, - 0x92, 0xb9, 0xb1, 0xde, 0x12, 0xb9, 0xb1, 0x72, 0xc7, 0x13, 0xc7, 0xf3, 0xc2, 0xa5, 0x1d, 0x99, - 0x13, 0xeb, 0x3b, 0x39, 0x38, 0x93, 0x51, 0xad, 0xad, 0x2f, 0x3e, 0xa7, 0xca, 0xa1, 0xae, 0x29, - 0x07, 0x99, 0x3c, 0x71, 0x60, 0xc7, 0x67, 0xea, 0x8a, 0xdf, 0x31, 0xe0, 0x9c, 0x2e, 0x3d, 0x62, - 0x2f, 0xba, 0x75, 0x93, 0xbc, 0x0d, 0xa3, 0x77, 0xa9, 0xe3, 0x52, 0x19, 0x82, 0x11, 0x27, 0x22, - 0x13, 0xa7, 0xc3, 0xbc, 0x90, 0xb3, 0xfd, 0x73, 0x3e, 0x95, 0x4f, 0x59, 0x82, 0x84, 0x2c, 0x8a, - 0xca, 0xf1, 0xeb, 0x29, 0x53, 0xde, 0xd4, 0x64, 0x7d, 0xea, 0x18, 0xc3, 0xf8, 0x0f, 0x0c, 0x78, - 0xe1, 0x18, 0x1a, 0x36, 0x70, 0x6c, 0xe8, 0xd5, 0x81, 0xc3, 0x85, 0x05, 0xa1, 0xe4, 0x3d, 0x98, - 0xda, 0x10, 0x91, 0x62, 0x72, 0x38, 0x94, 0xc4, 0xf6, 0x32, 0x88, 0xcc, 0x96, 0xe3, 0x92, 0x46, - 0x66, 0xbb, 0xff, 0xbb, 0x7e, 0x18, 0x75, 0x92, 0x8c, 0x33, 0xb8, 0xfb, 0xdf, 0x13, 0x30, 0x2b, - 0x2e, 0x65, 0x66, 0x81, 0x5e, 0x4d, 0xe1, 0x0e, 0xf1, 0x32, 0x8c, 0x32, 0x9c, 0xd8, 0xba, 0x46, - 0x39, 0xc0, 0x97, 0xc6, 0x3c, 0xd7, 0x12, 0x45, 0xf1, 0xbe, 0x2e, 0x97, 0x79, 0x6b, 0xf1, 0x2d, - 0x03, 0x2a, 0x3a, 0xef, 0xa7, 0x1d, 0x9a, 0x77, 0xb5, 0xa1, 0x79, 0x21, 0x7b, 0x68, 0x06, 0x8f, - 0x49, 0x5f, 0xf2, 0x87, 0xa1, 0xc6, 0xc2, 0x84, 0xd1, 0x45, 0xbf, 0xed, 0x78, 0x1d, 0x35, 0x61, - 0x81, 0x8b, 0x10, 0x4b, 0x94, 0x28, 0xbd, 0x95, 0x1f, 0xd8, 0x5b, 0xe6, 0xaf, 0x15, 0xe0, 0xbc, - 0x45, 0x77, 0x3d, 0x66, 0x20, 0x6d, 0x86, 0x5e, 0x67, 0x57, 0xbb, 0x53, 0x32, 0x53, 0x1d, 0x2e, - 0x3c, 0xe9, 0x18, 0x24, 0xee, 0xef, 0xab, 0x50, 0x64, 0x5a, 0x5a, 0xe9, 0x73, 0xdc, 0xf4, 0x60, - 0xda, 0x1d, 0x3e, 0xae, 0xb2, 0x98, 0x5c, 0x13, 0x6b, 0x88, 0xe2, 0xeb, 0xcc, 0xd6, 0x90, 0xd4, - 0x43, 0xe9, 0x7c, 0x1d, 0x89, 0x8d, 0xaa, 0xc2, 0x00, 0xa3, 0xea, 0x3e, 0xcc, 0xd4, 0x5c, 0xae, - 0x9f, 0x9c, 0xd6, 0x7a, 0xe0, 0x75, 0x9a, 0x5e, 0xd7, 0x69, 0x49, 0xa3, 0x9c, 0x3f, 0x1b, 0x1f, - 0x97, 0xdb, 0xdd, 0x18, 0xc1, 0xca, 0x24, 0x63, 0xcd, 0x58, 0x5c, 0x6d, 0xf0, 0xac, 0x2a, 0x3c, - 0x96, 0x1d, 0x9b, 0xe1, 0x76, 0x42, 0x9e, 0x56, 0xc5, 0x8a, 0x8b, 0xd1, 0x9c, 0xc3, 0x70, 0x87, - 0x8d, 0x95, 0xc6, 0x3d, 0x11, 0x3e, 0x20, 0x5d, 0xb1, 0x78, 0x74, 0x44, 0xd4, 0x0a, 0x71, 0xff, - 0xae, 0xe1, 0x25, 0x74, 0x8d, 0xc6, 0x5d, 0x46, 0x57, 0xec, 0xa3, 0x0b, 0xc3, 0x3d, 0x95, 0x8e, - 0xe3, 0x91, 0x39, 0x00, 0xee, 0xcc, 0x82, 0x02, 0x51, 0x4a, 0x8c, 0xbf, 0x00, 0xa1, 0xdc, 0xf8, - 0x53, 0x50, 0xc8, 0x3b, 0x70, 0x7a, 0x69, 0x61, 0x5e, 0xc6, 0x05, 0x2c, 0xfa, 0xcd, 0x5e, 0x9b, - 0x76, 0x22, 0x8c, 0x53, 0x29, 0xf3, 0x31, 0xa4, 0xcd, 0x79, 0x26, 0x05, 0x59, 0x68, 0x22, 0x3a, - 0x80, 0xc7, 0x96, 0x2d, 0xf8, 0x2e, 0x0d, 0xb7, 0x6e, 0x7c, 0xc6, 0xa2, 0x03, 0x94, 0xb6, 0xe1, - 0x6c, 0xbb, 0x91, 0x39, 0x33, 0xff, 0x3e, 0x46, 0x07, 0xf4, 0xe1, 0x92, 0x9f, 0x80, 0x11, 0xfc, - 0x29, 0x56, 0xdc, 0xd3, 0x19, 0x6c, 0x93, 0xd5, 0xb6, 0xc9, 0x13, 0x64, 0x20, 0x01, 0x59, 0x4e, - 0xf2, 0xf6, 0x3f, 0x81, 0x8f, 0xab, 0x08, 0x50, 0xd5, 0x1f, 0x6c, 0x71, 0xa1, 0xac, 0x7e, 0x90, - 0xc9, 0xc8, 0x5d, 0x27, 0xdc, 0xa3, 0xee, 0x82, 0x7c, 0xe6, 0xb1, 0xcc, 0x65, 0x64, 0x0f, 0xa1, - 0xf8, 0x98, 0x8c, 0xa5, 0xa0, 0x30, 0xed, 0xb0, 0x1c, 0x6e, 0x86, 0xa2, 0x2a, 0x62, 0x17, 0xe4, - 0xe1, 0xee, 0xd5, 0xb5, 0x44, 0x11, 0x6a, 0x4b, 0x99, 0x66, 0x32, 0x70, 0x9a, 0xfb, 0x34, 0xd8, - 0xba, 0xf1, 0x69, 0x68, 0x4b, 0xfd, 0x1b, 0xc7, 0x8c, 0xc9, 0xaf, 0x17, 0xe3, 0xfc, 0x2e, 0x1a, - 0x32, 0xb3, 0x11, 0x93, 0x9b, 0x79, 0x23, 0xb1, 0x11, 0x93, 0x9b, 0x79, 0xd5, 0x46, 0x8c, 0x51, - 0xe3, 0x24, 0xbf, 0xb9, 0x13, 0x92, 0xfc, 0x0e, 0xc8, 0x2b, 0x2e, 0x9d, 0x3a, 0x3f, 0x43, 0x4f, - 0x36, 0x7c, 0x19, 0xca, 0xb5, 0x28, 0x72, 0x9a, 0x7b, 0xd4, 0xc5, 0x64, 0xd2, 0xca, 0x85, 0xa0, - 0x23, 0xe0, 0xaa, 0xbb, 0x98, 0x8a, 0xab, 0x3c, 0xd9, 0x32, 0x36, 0xc4, 0x93, 0x2d, 0x73, 0x30, - 0xb6, 0xdc, 0x79, 0xe8, 0xb1, 0x3e, 0x29, 0x26, 0xc9, 0x21, 0x3c, 0x0e, 0xd2, 0xdf, 0xf9, 0x40, - 0x10, 0x79, 0x4b, 0xb1, 0x20, 0x4a, 0x89, 0x29, 0x2f, 0x1e, 0xa8, 0x96, 0x86, 0x84, 0x7a, 0xde, - 0x2c, 0xd1, 0xc9, 0x2d, 0x18, 0x93, 0xbb, 0x67, 0x48, 0xcc, 0x77, 0x41, 0xe9, 0xf0, 0x12, 0x2d, - 0x1f, 0x85, 0xd8, 0x3d, 0xbf, 0xa3, 0xc7, 0x8f, 0x8c, 0x2b, 0x71, 0xd9, 0x4a, 0xfc, 0x88, 0x16, - 0x97, 0xad, 0x44, 0x92, 0xc4, 0x9b, 0xa1, 0xf2, 0x89, 0x9b, 0xa1, 0x2d, 0x28, 0xaf, 0x3b, 0x41, - 0xe4, 0xb1, 0xe5, 0xa8, 0x13, 0xf1, 0xdc, 0x5c, 0xc9, 0x5e, 0x5d, 0x29, 0xaa, 0xbf, 0x24, 0xe3, - 0x93, 0xbb, 0x0a, 0xbe, 0x1e, 0xd8, 0x9a, 0xc0, 0xc9, 0x6a, 0x86, 0x87, 0xa1, 0xc8, 0x57, 0x89, - 0x57, 0x80, 0x6a, 0x72, 0x44, 0x5e, 0xaa, 0x1e, 0xa5, 0xf7, 0x3b, 0x27, 0xde, 0xe4, 0x63, 0x80, - 0x7b, 0xc6, 0x29, 0x64, 0x83, 0xd9, 0x45, 0xd0, 0xae, 0x48, 0x6d, 0x1c, 0x63, 0x44, 0xf2, 0x0d, - 0x28, 0xb3, 0xff, 0x31, 0x51, 0x91, 0x47, 0x79, 0xee, 0xad, 0xc4, 0xe3, 0x4c, 0x9f, 0xd0, 0x3c, - 0x9b, 0x51, 0x83, 0x46, 0x7c, 0x02, 0x23, 0xe3, 0xf4, 0xc1, 0x8b, 0xc6, 0xcd, 0xfc, 0xa1, 0x01, - 0xe7, 0x06, 0xf0, 0x18, 0xfa, 0xb1, 0xa6, 0xb9, 0x64, 0x41, 0x52, 0xf6, 0xe6, 0x62, 0x41, 0x52, - 0x05, 0x43, 0x2e, 0x4d, 0xd9, 0x59, 0xb3, 0xf2, 0x9f, 0x5a, 0xd6, 0x2c, 0xf3, 0xd0, 0x80, 0x71, - 0x65, 0x64, 0x9f, 0xe1, 0x9b, 0x09, 0x97, 0x45, 0xfa, 0xc8, 0x7c, 0x82, 0x97, 0x7a, 0xee, 0x99, - 0xa7, 0x8b, 0xfc, 0x08, 0x60, 0xc5, 0x09, 0xa3, 0x5a, 0x33, 0xf2, 0x1e, 0xd2, 0x21, 0xd4, 0x58, - 0x12, 0xa8, 0xef, 0x60, 0xce, 0x57, 0x46, 0xd6, 0x17, 0xa8, 0x1f, 0x33, 0x34, 0x57, 0x61, 0xb4, - 0xe1, 0x07, 0x51, 0xfd, 0x80, 0xaf, 0x4d, 0x8b, 0x34, 0x6c, 0xaa, 0x27, 0x74, 0x1e, 0xee, 0xd5, - 0x9b, 0x96, 0x28, 0x62, 0x06, 0xe2, 0x6d, 0x8f, 0xb6, 0x5c, 0xf5, 0x86, 0xe6, 0x01, 0x03, 0x58, - 0x1c, 0x7e, 0xed, 0x7d, 0x98, 0x92, 0x19, 0xec, 0x36, 0x56, 0x1a, 0xd8, 0x82, 0x29, 0x18, 0xdf, - 0x5a, 0xb2, 0x96, 0x6f, 0x7f, 0xcd, 0xbe, 0xbd, 0xb9, 0xb2, 0x52, 0x39, 0x45, 0x26, 0xa0, 0x24, - 0x00, 0x0b, 0xb5, 0x8a, 0x41, 0xca, 0x50, 0x5c, 0x5e, 0x6d, 0x2c, 0x2d, 0x6c, 0x5a, 0x4b, 0x95, - 0xdc, 0xb5, 0x57, 0x61, 0x32, 0xb9, 0x7f, 0xc1, 0x18, 0xcd, 0x31, 0xc8, 0x5b, 0xb5, 0xed, 0xca, - 0x29, 0x02, 0x30, 0xba, 0x7e, 0x6f, 0xa1, 0x71, 0xe3, 0x46, 0xc5, 0xb8, 0xf6, 0x85, 0x8c, 0x37, - 0xb6, 0x19, 0xa7, 0x06, 0xed, 0x3a, 0x81, 0x13, 0x51, 0xfe, 0x99, 0xfb, 0xbd, 0x56, 0xe4, 0x75, - 0x5b, 0xf4, 0x71, 0xc5, 0xb8, 0xf6, 0x56, 0xdf, 0x53, 0xd9, 0xe4, 0x0c, 0x4c, 0x6f, 0xae, 0xd6, - 0xee, 0xd7, 0x97, 0xef, 0x6c, 0xae, 0x6d, 0x36, 0xec, 0xfb, 0xb5, 0x8d, 0x85, 0xbb, 0x95, 0x53, - 0xac, 0xc2, 0xf7, 0xd7, 0x1a, 0x1b, 0xb6, 0xb5, 0xb4, 0xb0, 0xb4, 0xba, 0x51, 0x31, 0xae, 0xfd, - 0x8a, 0x01, 0x93, 0xfa, 0x43, 0x80, 0xe4, 0x12, 0x5c, 0xdc, 0x6c, 0x2c, 0x59, 0xf6, 0xc6, 0xda, - 0xbd, 0xa5, 0x55, 0x7b, 0xb3, 0x51, 0xbb, 0xb3, 0x64, 0x6f, 0xae, 0x36, 0xd6, 0x97, 0x16, 0x96, - 0x6f, 0x2f, 0x2f, 0x2d, 0x56, 0x4e, 0x91, 0x2a, 0xbc, 0xa0, 0x60, 0x58, 0x4b, 0x0b, 0x6b, 0x5b, - 0x4b, 0x96, 0xbd, 0x5e, 0x6b, 0x34, 0xb6, 0xd7, 0xac, 0xc5, 0x8a, 0x41, 0x2e, 0xc0, 0xd9, 0x0c, - 0x84, 0xfb, 0xb7, 0x6b, 0x95, 0x5c, 0x5f, 0xd9, 0xea, 0xd2, 0x76, 0x6d, 0xc5, 0xae, 0xaf, 0x6d, - 0x54, 0xf2, 0xd7, 0xde, 0x67, 0x56, 0x48, 0xf2, 0xb2, 0x06, 0x29, 0x42, 0x61, 0x75, 0x6d, 0x75, - 0xa9, 0x72, 0x8a, 0x8c, 0xc3, 0xd8, 0xfa, 0xd2, 0xea, 0xe2, 0xf2, 0xea, 0x1d, 0xde, 0xad, 0xb5, - 0xf5, 0x75, 0x6b, 0x6d, 0x6b, 0x69, 0xb1, 0x92, 0x63, 0x7d, 0xb7, 0xb8, 0xb4, 0xca, 0x6a, 0x96, - 0xbf, 0x66, 0xf2, 0x6c, 0xd2, 0x5a, 0x9a, 0x52, 0xd6, 0x5b, 0x4b, 0x5f, 0xdd, 0x58, 0x5a, 0x6d, - 0x2c, 0xaf, 0xad, 0x56, 0x4e, 0x5d, 0xbb, 0x98, 0xc2, 0x91, 0x23, 0xd1, 0x68, 0xdc, 0xad, 0x9c, - 0xba, 0xf6, 0x0d, 0x28, 0xab, 0x8b, 0x30, 0x39, 0x07, 0xa7, 0xd5, 0xdf, 0xeb, 0xb4, 0xe3, 0x7a, - 0x9d, 0xdd, 0xca, 0xa9, 0x74, 0x81, 0xd5, 0xeb, 0x74, 0x58, 0x01, 0x36, 0x5e, 0x2d, 0xd8, 0xa0, - 0x41, 0xdb, 0xeb, 0xb0, 0xf5, 0xb5, 0x92, 0xab, 0x57, 0xbe, 0xff, 0x57, 0x2f, 0x9d, 0xfa, 0xfe, - 0x0f, 0x5e, 0x32, 0xfe, 0xfc, 0x07, 0x2f, 0x19, 0xff, 0xed, 0x07, 0x2f, 0x19, 0x3b, 0xa3, 0x28, - 0xe8, 0x37, 0xff, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x15, 0x6c, 0xb1, 0xb1, 0xbb, 0xb7, 0x00, - 0x00, + 0xe2, 0x5d, 0x54, 0x07, 0x23, 0x41, 0x36, 0x2d, 0x28, 0xab, 0xda, 0x84, 0xd4, 0x61, 0x42, 0xec, + 0xa1, 0x84, 0x15, 0xc2, 0xfb, 0xf9, 0x0a, 0x5b, 0xde, 0x04, 0xb7, 0xfe, 0x3d, 0x9d, 0x4e, 0x62, + 0xfe, 0x6c, 0x0e, 0x8a, 0x02, 0x32, 0xf7, 0x8c, 0x1a, 0x48, 0x6f, 0x68, 0x06, 0x92, 0xd4, 0xbb, + 0x8a, 0xe5, 0x3e, 0x77, 0xc2, 0x06, 0xec, 0x2d, 0x28, 0xcb, 0x2e, 0x40, 0x3b, 0xf3, 0x55, 0x18, + 0x93, 0x2e, 0x04, 0x6e, 0x65, 0x4e, 0x69, 0x3c, 0x37, 0xe7, 0x2c, 0x59, 0x6e, 0x7e, 0x7b, 0x44, + 0xd2, 0xf2, 0x2f, 0xb1, 0x2e, 0xac, 0xb9, 0x6e, 0xa0, 0x76, 0xa1, 0xe3, 0xba, 0x81, 0x85, 0x50, + 0x36, 0xf8, 0x6b, 0xbd, 0xed, 0x96, 0xd7, 0x44, 0x1c, 0x65, 0x26, 0x76, 0x11, 0x6a, 0x33, 0x54, + 0x75, 0xf0, 0x13, 0x64, 0x6d, 0xff, 0x93, 0x3f, 0x76, 0xff, 0xf3, 0x63, 0x50, 0x9a, 0x6f, 0xbb, + 0x9a, 0x7d, 0x64, 0x66, 0x74, 0xca, 0xcd, 0x18, 0x89, 0x5b, 0x46, 0x57, 0x44, 0x1f, 0x9d, 0x6b, + 0xb6, 0xdd, 0x7e, 0xab, 0x28, 0x61, 0xa9, 0x6d, 0x60, 0x46, 0x9e, 0x64, 0x03, 0xf3, 0x26, 0x94, + 0x36, 0x42, 0xba, 0xde, 0xeb, 0x74, 0x68, 0x0b, 0x6d, 0xa5, 0x22, 0xd7, 0x67, 0xbd, 0x90, 0xda, + 0x11, 0x42, 0xd5, 0x0a, 0xc4, 0xa8, 0xaa, 0x58, 0x8d, 0x1d, 0x23, 0x56, 0x9f, 0x87, 0x42, 0xad, + 0xdb, 0x95, 0x3b, 0xbb, 0x78, 0xf1, 0xee, 0x76, 0x71, 0x39, 0x9d, 0x74, 0xba, 0x5d, 0x7d, 0x9f, + 0x86, 0xd8, 0x84, 0x02, 0xb9, 0xdf, 0xdb, 0xa6, 0x41, 0x87, 0x46, 0x34, 0x14, 0xea, 0x3e, 0x9c, + 0x01, 0xe4, 0x31, 0x23, 0x1d, 0xe8, 0x69, 0x04, 0xdc, 0x95, 0x5f, 0xdc, 0xef, 0x6d, 0x53, 0x5b, + 0xac, 0x1b, 0x6a, 0xdf, 0x65, 0x30, 0xbc, 0xdc, 0x80, 0x49, 0xbd, 0xff, 0x9f, 0x82, 0xc5, 0xf3, + 0x41, 0xa1, 0x58, 0xac, 0x94, 0xcc, 0x9f, 0xcf, 0xc1, 0x78, 0xad, 0xdb, 0x7d, 0xc6, 0xdd, 0x2b, + 0x3f, 0xa2, 0xcd, 0xea, 0x0b, 0xc9, 0xe8, 0x9d, 0xc2, 0xb3, 0xf2, 0x97, 0x06, 0x4c, 0xa5, 0x28, + 0xd4, 0xda, 0x1b, 0x43, 0xba, 0x1b, 0x72, 0x43, 0xba, 0x1b, 0xf2, 0x83, 0xdd, 0x0d, 0xea, 0x9c, + 0x29, 0x3c, 0xc9, 0x9c, 0x79, 0x05, 0xf2, 0xb5, 0x6e, 0x57, 0xf4, 0x4a, 0x39, 0xe9, 0x95, 0xcd, + 0xdb, 0x7c, 0x71, 0x73, 0xba, 0x5d, 0x8b, 0x61, 0x98, 0xaf, 0x43, 0x09, 0xc1, 0xa8, 0xd1, 0xae, + 0x8a, 0xa9, 0xc0, 0xd5, 0x99, 0x46, 0xc6, 0xc5, 0xde, 0xfc, 0xdf, 0x06, 0x8c, 0xe0, 0xef, 0x67, + 0x54, 0x5c, 0xe6, 0x34, 0x71, 0xa9, 0x28, 0xe2, 0x32, 0x8c, 0xa0, 0xfc, 0x41, 0x1e, 0x7b, 0x4b, + 0x88, 0x88, 0xd8, 0xb0, 0x1a, 0x19, 0x1b, 0xd6, 0x27, 0x50, 0xe0, 0xfb, 0xe9, 0xad, 0x6b, 0x1e, + 0x07, 0xe3, 0xc5, 0x74, 0x55, 0x9f, 0xca, 0xae, 0xf5, 0x1e, 0x90, 0xa5, 0x4e, 0x48, 0x9b, 0xbd, + 0x80, 0x36, 0xf6, 0xbd, 0xee, 0x26, 0x0d, 0xbc, 0x9d, 0x03, 0x61, 0x6d, 0xa2, 0x8e, 0xf5, 0x44, + 0xa9, 0x1d, 0xee, 0x7b, 0x5d, 0x66, 0x26, 0x78, 0x3b, 0x07, 0x56, 0x06, 0x0d, 0x79, 0x1f, 0xc6, + 0x2c, 0xfa, 0x28, 0xf0, 0x22, 0x2a, 0xfa, 0x76, 0x32, 0xde, 0x5b, 0x20, 0x94, 0xdb, 0x3b, 0x01, + 0xff, 0xa1, 0x8e, 0xbf, 0x28, 0xff, 0xe4, 0xf6, 0x77, 0xdf, 0x19, 0xc1, 0xb9, 0x70, 0xc2, 0x31, + 0xe0, 0x31, 0xde, 0x07, 0x7d, 0x30, 0xf3, 0xa7, 0x19, 0xcc, 0x4d, 0x28, 0xb3, 0x2d, 0x65, 0xca, + 0x0d, 0x71, 0x25, 0x19, 0xcb, 0x9b, 0x6a, 0xf1, 0x71, 0x27, 0x80, 0x1a, 0x1f, 0x62, 0xa7, 0x85, + 0x84, 0x9f, 0x2c, 0x3e, 0xaf, 0x30, 0xce, 0x10, 0x8f, 0x58, 0x75, 0x34, 0x79, 0x67, 0x9d, 0x5a, + 0x30, 0x46, 0x9f, 0x4c, 0x30, 0xc6, 0x3e, 0x8e, 0x60, 0xa4, 0xcf, 0x5e, 0x8b, 0xa7, 0x39, 0x7b, + 0xbd, 0xfc, 0x3e, 0x4c, 0xf7, 0xf5, 0xf0, 0x69, 0xce, 0x2f, 0x3f, 0x39, 0xb1, 0xfc, 0xa9, 0xb8, + 0x5f, 0xc8, 0x1c, 0x6e, 0x71, 0xbd, 0x80, 0x36, 0x23, 0x54, 0xbd, 0x42, 0x5b, 0x06, 0x02, 0x96, + 0xda, 0x83, 0x23, 0x8c, 0xbc, 0x07, 0x63, 0xfc, 0xfc, 0x27, 0x9c, 0xc9, 0xe1, 0xd8, 0x4f, 0x88, + 0x2f, 0x72, 0xa8, 0x38, 0x84, 0xe7, 0x18, 0x6a, 0xaf, 0x0a, 0x22, 0xf3, 0x2e, 0x8c, 0x8a, 0xf3, + 0xa3, 0xe3, 0xe7, 0x45, 0x15, 0x46, 0x36, 0x93, 0x9e, 0x41, 0x9f, 0x3f, 0x6f, 0x84, 0xc5, 0xe1, + 0xe6, 0x2f, 0x1a, 0x30, 0xa9, 0xb7, 0x92, 0xdc, 0x84, 0x51, 0x71, 0xc0, 0x69, 0xe0, 0x01, 0x27, + 0x6b, 0xcd, 0x28, 0x3f, 0xda, 0xd4, 0x0e, 0x34, 0x05, 0x16, 0x53, 0xfd, 0x82, 0x03, 0xb6, 0x45, + 0xa8, 0x7e, 0x21, 0xa4, 0x96, 0x2c, 0x63, 0xdb, 0x38, 0x8b, 0x86, 0xbd, 0x56, 0xa4, 0x6e, 0xe3, + 0x02, 0x84, 0x58, 0xa2, 0xc4, 0x3c, 0x34, 0x00, 0x1a, 0x8d, 0x7b, 0xf7, 0xe9, 0xc1, 0x9a, 0xe3, + 0x05, 0xb8, 0x15, 0xc6, 0xd9, 0x78, 0x5f, 0x8c, 0x56, 0x59, 0x6c, 0x85, 0xf9, 0xcc, 0xdd, 0xa7, + 0x07, 0xda, 0x56, 0x58, 0xa2, 0xe2, 0x94, 0x0f, 0xbc, 0x87, 0x4e, 0x44, 0x19, 0x61, 0x0e, 0x09, + 0xf9, 0x94, 0xe7, 0xd0, 0x14, 0xa5, 0x82, 0x4c, 0xbe, 0x0e, 0x93, 0xc9, 0x2f, 0x8c, 0xaa, 0xc8, + 0xe3, 0x3e, 0x51, 0x4a, 0x84, 0x5e, 0x58, 0x7f, 0xe1, 0xe8, 0xb0, 0x7a, 0x59, 0xe1, 0x6a, 0x33, + 0x2c, 0x85, 0x75, 0x8a, 0x99, 0xf9, 0x3b, 0x06, 0xc0, 0xfa, 0x72, 0x43, 0x36, 0xf0, 0x1a, 0x14, + 0x62, 0x2f, 0x55, 0x99, 0xef, 0xb7, 0x53, 0x1b, 0x4a, 0x2c, 0x27, 0x2f, 0x42, 0x3e, 0x69, 0xc9, + 0xf4, 0xd1, 0x61, 0x75, 0x42, 0x6f, 0x01, 0x2b, 0x25, 0x77, 0x61, 0x6c, 0xa8, 0x3a, 0xa3, 0x74, + 0x66, 0xd4, 0x55, 0x52, 0xe3, 0x28, 0x7c, 0xb0, 0xb5, 0xfe, 0xe9, 0x1d, 0x85, 0x6f, 0xe5, 0x60, + 0x8a, 0xf5, 0x6b, 0xad, 0x17, 0xed, 0xf9, 0x81, 0x17, 0x1d, 0x3c, 0xb3, 0xbb, 0xe2, 0x77, 0x34, + 0x83, 0xe8, 0xb2, 0x54, 0x5b, 0x6a, 0xdb, 0x86, 0xda, 0x1c, 0xff, 0xf9, 0x18, 0x9c, 0xcd, 0xa0, + 0x22, 0xaf, 0x89, 0xd0, 0xa2, 0xc4, 0x0f, 0x85, 0xa1, 0x43, 0x3f, 0x3c, 0xac, 0x96, 0x25, 0xfa, + 0x7a, 0x12, 0x4a, 0x34, 0x07, 0xe3, 0x62, 0xeb, 0xb3, 0x92, 0x58, 0xd4, 0x18, 0x93, 0x22, 0xfd, + 0x6c, 0xa8, 0x9a, 0x54, 0x24, 0x52, 0x83, 0xf2, 0xfc, 0x1e, 0x6d, 0xee, 0x7b, 0x9d, 0xdd, 0xfb, + 0xf4, 0x80, 0xdb, 0x4b, 0xe5, 0xfa, 0xf3, 0x6c, 0xa7, 0xd5, 0x14, 0x70, 0x36, 0xa4, 0xfa, 0x26, + 0x4e, 0x23, 0x21, 0xef, 0xc1, 0x78, 0xc3, 0xdb, 0xed, 0x48, 0x0e, 0x05, 0xe4, 0x70, 0xe5, 0xe8, + 0xb0, 0x7a, 0x21, 0xe4, 0xe0, 0x7e, 0x06, 0x2a, 0x01, 0x79, 0x15, 0x46, 0x2c, 0xbf, 0x45, 0xf9, + 0x32, 0x2c, 0x82, 0x55, 0x02, 0x06, 0x50, 0x5d, 0xb7, 0x88, 0x41, 0xee, 0xc1, 0x18, 0xfb, 0xe7, + 0x81, 0xd3, 0x9d, 0x19, 0x45, 0xbd, 0x4d, 0x62, 0x03, 0x1f, 0xa1, 0x5d, 0xaf, 0xb3, 0xab, 0xda, + 0xf8, 0x2d, 0x6a, 0xb7, 0x9d, 0xae, 0xb6, 0x2e, 0x72, 0x44, 0xb2, 0x09, 0xe3, 0x89, 0x22, 0x08, + 0x67, 0xc6, 0xb4, 0x83, 0xae, 0xa4, 0xa4, 0xfe, 0x19, 0xc1, 0xec, 0x62, 0xd4, 0x0a, 0x51, 0xb6, + 0xbb, 0x0c, 0x5f, 0x6f, 0x8c, 0xc2, 0x48, 0xdb, 0x83, 0x14, 0x07, 0xef, 0x41, 0x8c, 0x13, 0xf7, + 0x20, 0x2e, 0x80, 0xe8, 0xa4, 0x5a, 0x6b, 0x57, 0xc4, 0x96, 0xbd, 0x3a, 0x58, 0xc0, 0x6e, 0x26, + 0xc8, 0x38, 0x27, 0xb9, 0xb7, 0x4b, 0xf4, 0xbf, 0xd3, 0xda, 0xd5, 0xbc, 0x5d, 0x31, 0x2a, 0xeb, + 0x86, 0x44, 0xd5, 0xc8, 0x1d, 0xb8, 0xec, 0x86, 0xa4, 0x24, 0xe9, 0x86, 0x8f, 0x1e, 0x45, 0x83, + 0xba, 0x41, 0x61, 0x44, 0x56, 0x00, 0x6a, 0xcd, 0xc8, 0x7b, 0x48, 0x51, 0x24, 0xc6, 0xb5, 0x8e, + 0x98, 0xaf, 0xdd, 0xa7, 0x07, 0x0d, 0x1a, 0xc5, 0x61, 0x1b, 0xe7, 0x1d, 0x44, 0x4d, 0x89, 0x89, + 0xa5, 0x70, 0x20, 0x5d, 0x38, 0x5f, 0x73, 0x5d, 0x8f, 0xc7, 0x1b, 0xae, 0x07, 0x4c, 0x7e, 0x5d, + 0x64, 0x5d, 0xce, 0x66, 0xfd, 0xaa, 0x60, 0xfd, 0x19, 0x27, 0xa6, 0xb2, 0x23, 0x4e, 0x96, 0xfe, + 0x4c, 0x36, 0x63, 0x73, 0x15, 0x26, 0xf5, 0x2e, 0xd5, 0x23, 0xed, 0xca, 0x50, 0xb4, 0x1a, 0x35, + 0xbb, 0x71, 0xaf, 0x76, 0xab, 0x62, 0x90, 0x0a, 0x94, 0xc5, 0xaf, 0x39, 0x7b, 0xee, 0x8d, 0x37, + 0x2b, 0x39, 0x0d, 0xf2, 0xc6, 0xad, 0xb9, 0x4a, 0xde, 0xfc, 0x03, 0x03, 0x8a, 0xb2, 0x7e, 0xe4, + 0x4d, 0xc8, 0x37, 0x1a, 0xf7, 0x52, 0xe7, 0xab, 0xc9, 0xd2, 0xcb, 0x17, 0x99, 0x30, 0xdc, 0x53, + 0x17, 0x99, 0x46, 0xe3, 0x1e, 0xa3, 0x5b, 0x5f, 0x6e, 0x08, 0xa3, 0x25, 0x43, 0x5c, 0xa7, 0x07, + 0x1c, 0x3a, 0xbd, 0x09, 0xf9, 0x0f, 0xb6, 0xd6, 0xc5, 0x6e, 0x28, 0x63, 0x7c, 0x91, 0xee, 0xa3, + 0x47, 0xea, 0xd2, 0xc7, 0x08, 0x4c, 0x0b, 0xc6, 0x95, 0xa9, 0xc5, 0x8d, 0x88, 0xb6, 0x1f, 0xc7, + 0xa0, 0x09, 0x23, 0x82, 0x41, 0x2c, 0x51, 0xc2, 0x6c, 0x9e, 0x65, 0xbf, 0xe9, 0xb4, 0x84, 0x35, + 0x82, 0x36, 0x4f, 0x8b, 0x01, 0x2c, 0x0e, 0x37, 0xff, 0xd0, 0x80, 0xca, 0x5a, 0xe0, 0x3f, 0xf4, + 0x98, 0x06, 0x5e, 0xf7, 0xf7, 0x69, 0x67, 0xf3, 0x16, 0x79, 0x5d, 0x2a, 0x01, 0x6e, 0xc2, 0x5d, + 0x64, 0x54, 0xa8, 0x04, 0x7e, 0x78, 0x58, 0x85, 0xc6, 0x41, 0x18, 0xd1, 0x36, 0x2b, 0x97, 0x8a, + 0x40, 0x09, 0xe5, 0xcb, 0x0d, 0x1f, 0x1e, 0x74, 0x42, 0x28, 0x5f, 0x15, 0x46, 0xb0, 0x3a, 0x4a, + 0x84, 0xc6, 0x48, 0xc4, 0x00, 0x16, 0x87, 0x2b, 0x0a, 0xfb, 0xdb, 0xb9, 0xbe, 0x36, 0xcc, 0x7d, + 0xaa, 0x42, 0x6c, 0xf4, 0xc6, 0x0d, 0xb5, 0x88, 0x7d, 0x05, 0xce, 0xa5, 0xbb, 0x04, 0xfd, 0x22, + 0x35, 0x98, 0xd2, 0xe1, 0xd2, 0x45, 0x72, 0x31, 0xf3, 0x5b, 0x9b, 0x73, 0x56, 0x1a, 0xdf, 0xfc, + 0xbe, 0x01, 0x25, 0xfc, 0xd7, 0xea, 0xb5, 0x28, 0xb3, 0x6c, 0x6a, 0x5b, 0x0d, 0x71, 0xc8, 0xa5, + 0x1e, 0x44, 0x39, 0x8f, 0x42, 0x5b, 0x9c, 0x88, 0x69, 0x7a, 0x24, 0x46, 0x16, 0xa4, 0xfc, 0x48, + 0x2f, 0x14, 0x12, 0x1a, 0x93, 0xf2, 0xb3, 0xbf, 0x30, 0x45, 0x2a, 0x90, 0xd9, 0xf8, 0xb1, 0x5f, + 0x7e, 0x4b, 0xba, 0x86, 0x71, 0xfc, 0x90, 0xce, 0xd7, 0x8e, 0x4e, 0x24, 0x1a, 0x79, 0x1d, 0x46, + 0xd9, 0xa7, 0x2d, 0x79, 0x30, 0x82, 0xbb, 0x0a, 0xac, 0x63, 0xa0, 0x9d, 0x30, 0x72, 0x24, 0xf3, + 0x9f, 0xe7, 0xd2, 0x1d, 0x28, 0xac, 0x80, 0x53, 0xce, 0x8d, 0xb7, 0x61, 0xa4, 0xd6, 0x6a, 0xf9, + 0x8f, 0x84, 0x96, 0x90, 0x6e, 0x9a, 0xb8, 0xff, 0xf8, 0x0a, 0xeb, 0x30, 0x14, 0xed, 0x68, 0x9b, + 0x01, 0xc8, 0x3c, 0x94, 0x6a, 0x5b, 0x8d, 0xa5, 0xa5, 0x85, 0xf5, 0xf5, 0x65, 0x11, 0x41, 0xfd, + 0xb2, 0xec, 0x1f, 0xcf, 0x73, 0xed, 0x28, 0x6a, 0x0d, 0x08, 0xb0, 0x4c, 0xe8, 0xc8, 0xbb, 0x00, + 0x1f, 0xf8, 0x5e, 0xe7, 0x01, 0x8d, 0xf6, 0x7c, 0x57, 0x34, 0x9e, 0x99, 0x14, 0xe3, 0x1f, 0xf9, + 0x5e, 0xc7, 0x6e, 0x23, 0x98, 0xd5, 0x3d, 0x41, 0xb2, 0x94, 0xff, 0x59, 0x4f, 0xd7, 0xfd, 0x08, + 0x6d, 0x98, 0x91, 0xa4, 0xa7, 0xb7, 0xfd, 0x28, 0x7d, 0x6e, 0x23, 0xd1, 0xcc, 0x5f, 0xca, 0xc1, + 0x24, 0xdf, 0xa9, 0x72, 0x81, 0x79, 0x66, 0x27, 0xe3, 0xdb, 0xda, 0x64, 0xbc, 0x24, 0x17, 0x06, + 0xa5, 0x69, 0x43, 0x4d, 0xc5, 0x3d, 0x20, 0xfd, 0x34, 0xc4, 0x92, 0xfe, 0x94, 0x61, 0x66, 0xe1, + 0xad, 0xe4, 0x3c, 0x3a, 0x44, 0x22, 0x1b, 0x55, 0x61, 0x68, 0x69, 0x3c, 0xcc, 0x5f, 0xcc, 0xc1, + 0x84, 0x62, 0x4f, 0x3e, 0xb3, 0x1d, 0xff, 0x45, 0xad, 0xe3, 0xe5, 0x19, 0x84, 0xd2, 0xb2, 0xa1, + 0xfa, 0xbd, 0x07, 0xd3, 0x7d, 0x24, 0x69, 0xb3, 0xdc, 0x18, 0xc6, 0x2c, 0x7f, 0xad, 0xff, 0xc0, + 0x9c, 0x47, 0x5b, 0xc7, 0x07, 0xe6, 0xea, 0x09, 0xfd, 0xb7, 0x72, 0x70, 0x4e, 0xfc, 0xaa, 0xf5, + 0x5c, 0x2f, 0x9a, 0xf7, 0x3b, 0x3b, 0xde, 0xee, 0x33, 0x3b, 0x16, 0x35, 0x6d, 0x2c, 0xaa, 0xfa, + 0x58, 0x28, 0x0d, 0x1c, 0x3c, 0x24, 0xe6, 0xbf, 0x2a, 0xc2, 0xcc, 0x20, 0x02, 0xb6, 0xed, 0x57, + 0x76, 0x55, 0xb8, 0xed, 0x4f, 0xed, 0x58, 0xf9, 0x7e, 0x2a, 0x09, 0x10, 0xc9, 0x0d, 0x11, 0x20, + 0xb2, 0x0c, 0x15, 0xfc, 0x54, 0x83, 0x86, 0xac, 0x13, 0xc2, 0x24, 0xd4, 0xf3, 0xea, 0xd1, 0x61, + 0xf5, 0x8a, 0xc3, 0xca, 0xec, 0x50, 0x14, 0xda, 0xbd, 0xc0, 0x53, 0x78, 0xf4, 0x51, 0x92, 0xdf, + 0x31, 0x60, 0x12, 0x81, 0x8b, 0x0f, 0x69, 0x27, 0x42, 0x66, 0x05, 0x71, 0x48, 0x13, 0xdf, 0xa8, + 0x69, 0x44, 0x81, 0xd7, 0xd9, 0x45, 0x47, 0x52, 0x58, 0xdf, 0x66, 0xbd, 0xf0, 0x67, 0x87, 0xd5, + 0x77, 0x3e, 0xce, 0x2d, 0x1d, 0xc1, 0x2a, 0x64, 0x1b, 0x79, 0x5e, 0x51, 0x8a, 0x9f, 0x4d, 0x55, + 0x33, 0x55, 0x23, 0xf2, 0xa3, 0x70, 0x71, 0xb1, 0xe3, 0x6c, 0xb7, 0xe8, 0xbc, 0xdf, 0x89, 0xbc, + 0x4e, 0xcf, 0xef, 0x85, 0x75, 0xa7, 0xb9, 0xdf, 0xeb, 0x86, 0xc2, 0xd9, 0x89, 0x2d, 0x6f, 0xc6, + 0x85, 0xf6, 0x36, 0x2f, 0x55, 0x58, 0x0e, 0x62, 0x40, 0xee, 0xc1, 0x34, 0x2f, 0xaa, 0xf5, 0x22, + 0xbf, 0xd1, 0x74, 0x5a, 0x5e, 0x67, 0x17, 0x7d, 0xa0, 0xc5, 0xfa, 0x65, 0xb6, 0xb7, 0x74, 0x7a, + 0x91, 0x6f, 0x87, 0x1c, 0xae, 0xf0, 0xeb, 0x27, 0x22, 0x4b, 0x30, 0x65, 0x51, 0xc7, 0x7d, 0xe0, + 0x3c, 0x9e, 0x77, 0xba, 0x4e, 0xd3, 0x8b, 0x0e, 0x70, 0x67, 0x96, 0xaf, 0x57, 0x8f, 0x0e, 0xab, + 0xcf, 0x05, 0xd4, 0x71, 0xed, 0xb6, 0xf3, 0xd8, 0x6e, 0x8a, 0x42, 0x85, 0x59, 0x9a, 0x2e, 0x66, + 0xe5, 0x75, 0x62, 0x56, 0xa5, 0x34, 0x2b, 0xaf, 0x33, 0x98, 0x55, 0x42, 0x27, 0x59, 0xad, 0x3b, + 0xc1, 0x2e, 0x8d, 0xb8, 0x93, 0x10, 0xae, 0x1a, 0xd7, 0x0d, 0x85, 0x55, 0x84, 0x65, 0x36, 0x3a, + 0x0c, 0xd3, 0xac, 0x14, 0x3a, 0x26, 0x79, 0x5b, 0x81, 0x17, 0x51, 0xb5, 0x85, 0xe3, 0x58, 0x2d, + 0xec, 0x7f, 0x74, 0x93, 0x0e, 0x6a, 0x62, 0x1f, 0x65, 0xc2, 0x4d, 0x69, 0x64, 0xb9, 0x8f, 0x5b, + 0x76, 0x2b, 0xfb, 0x28, 0x63, 0x6e, 0x6a, 0x3b, 0x27, 0xb0, 0x9d, 0x0a, 0xb7, 0x01, 0x0d, 0xed, + 0xa3, 0x24, 0x2b, 0xac, 0xd3, 0x22, 0xda, 0x61, 0x12, 0x2d, 0x9c, 0xa4, 0x93, 0x58, 0xb5, 0x97, + 0xc4, 0x9e, 0xba, 0x12, 0xc8, 0x62, 0x3b, 0xc3, 0x65, 0x9a, 0x26, 0xfe, 0xa0, 0x50, 0x1c, 0xa9, + 0x8c, 0x5a, 0x15, 0x2e, 0xf2, 0x11, 0x13, 0x1c, 0xd4, 0xc5, 0xe6, 0x6f, 0xe4, 0xe0, 0x92, 0x54, + 0xc7, 0x34, 0x7a, 0xe4, 0x07, 0xfb, 0x5e, 0x67, 0xf7, 0x19, 0xd7, 0xaa, 0x77, 0x34, 0xad, 0xfa, + 0x52, 0x6a, 0x85, 0x4b, 0xb5, 0xf2, 0x18, 0xd5, 0xfa, 0xa7, 0x23, 0xf0, 0xfc, 0xb1, 0x54, 0xe4, + 0x43, 0xb6, 0x0a, 0x7a, 0xb4, 0x13, 0x2d, 0xb9, 0x2d, 0xca, 0xb6, 0x61, 0x7e, 0x2f, 0x12, 0xce, + 0xec, 0x17, 0x8f, 0x0e, 0xab, 0x67, 0xf9, 0x45, 0x13, 0xdb, 0x73, 0x5b, 0xd4, 0x8e, 0x78, 0xb1, + 0x36, 0x4c, 0xfd, 0xd4, 0x8c, 0x65, 0x7c, 0xed, 0x6d, 0xa9, 0x13, 0xd1, 0xe0, 0xa1, 0xc3, 0xe3, + 0xed, 0x05, 0xcb, 0x7d, 0x4a, 0xbb, 0xb6, 0xc3, 0x4a, 0x6d, 0x4f, 0x14, 0xeb, 0x2c, 0xfb, 0xa8, + 0xc9, 0x1d, 0x85, 0xe5, 0x3c, 0xdb, 0x1c, 0x3c, 0x70, 0x1e, 0x0b, 0x8b, 0x17, 0xfd, 0xab, 0x0a, + 0x4b, 0x1e, 0x63, 0xd7, 0x76, 0x1e, 0x5b, 0xfd, 0x24, 0xe4, 0xeb, 0x70, 0x5e, 0x28, 0x6e, 0xa6, + 0xc4, 0x02, 0xbf, 0x25, 0x5b, 0x5c, 0x40, 0x5e, 0xaf, 0x1c, 0x1d, 0x56, 0x2f, 0x0a, 0xb5, 0x6f, + 0x37, 0x39, 0x46, 0x66, 0xab, 0xb3, 0xb9, 0x90, 0x75, 0xb6, 0x90, 0xa5, 0xba, 0xe3, 0x01, 0x0d, + 0x43, 0x67, 0x57, 0x5a, 0xc7, 0xfc, 0x44, 0x49, 0xe9, 0x4c, 0xbb, 0xcd, 0xcb, 0xad, 0x81, 0x94, + 0xe4, 0x1e, 0x4c, 0x6e, 0xd1, 0x6d, 0x75, 0x7c, 0x46, 0xe3, 0x29, 0x5e, 0x79, 0x44, 0xb7, 0x07, + 0x0f, 0x4e, 0x8a, 0x8e, 0x78, 0x30, 0xbd, 0x16, 0xf8, 0x8f, 0x0f, 0xd8, 0x56, 0x8f, 0x76, 0x68, + 0x80, 0xc1, 0x5d, 0x63, 0xe8, 0xae, 0x9a, 0x49, 0x2c, 0x4b, 0xbd, 0xbc, 0xfe, 0x99, 0xa3, 0xc3, + 0xea, 0xf3, 0x5d, 0x06, 0xb6, 0x5b, 0x02, 0x6e, 0xa7, 0x6e, 0x9d, 0xf5, 0x73, 0x25, 0x3f, 0x0e, + 0x53, 0x96, 0xdf, 0x8b, 0xbc, 0xce, 0x6e, 0x23, 0x0a, 0x9c, 0x88, 0xee, 0x72, 0x45, 0x9e, 0x44, + 0x91, 0xa5, 0x4a, 0xb9, 0x63, 0x3a, 0xe0, 0x40, 0x3b, 0x14, 0x50, 0x4d, 0x93, 0xea, 0x04, 0xe6, + 0xaf, 0xe5, 0x60, 0x46, 0x0c, 0x83, 0x45, 0x9b, 0x7e, 0xe0, 0x3e, 0xfb, 0xd3, 0x7e, 0x51, 0x9b, + 0xf6, 0x2f, 0xc6, 0x31, 0x4a, 0x59, 0x8d, 0x3c, 0x66, 0xd6, 0xff, 0xbe, 0x01, 0x57, 0x8e, 0x23, + 0x62, 0xbd, 0x13, 0xc7, 0xf5, 0x95, 0xfa, 0xe2, 0xf7, 0xba, 0x70, 0x16, 0xc7, 0x13, 0x1d, 0xc7, + 0xe1, 0x3d, 0x3f, 0x8c, 0xd0, 0x7b, 0x97, 0xd3, 0x02, 0x09, 0xea, 0xbe, 0xdf, 0x42, 0x3d, 0x5f, + 0x7f, 0x8d, 0xa9, 0xf3, 0x3f, 0x3b, 0xac, 0x02, 0x03, 0xf1, 0x48, 0x3c, 0xb6, 0xe6, 0x73, 0x89, + 0x41, 0xbf, 0x74, 0x68, 0x63, 0xf4, 0xc7, 0x3e, 0x3d, 0x08, 0xad, 0x2c, 0xd6, 0xe8, 0xa1, 0xa9, + 0xf5, 0xa2, 0xbd, 0xb5, 0x80, 0xee, 0xd0, 0x80, 0x76, 0x9a, 0xf4, 0x53, 0xe6, 0xa1, 0xd1, 0x1b, + 0x37, 0xd4, 0xf6, 0xe4, 0x2f, 0xc6, 0xe0, 0x5c, 0x16, 0x19, 0xeb, 0x17, 0xc5, 0x22, 0x4e, 0x5f, + 0x51, 0xfe, 0xff, 0x0d, 0x28, 0x37, 0x68, 0xd3, 0xef, 0xb8, 0x77, 0x9c, 0x66, 0xe4, 0xcb, 0x90, + 0x0c, 0x9b, 0x6b, 0x36, 0x06, 0xb7, 0x77, 0xb0, 0x40, 0xf3, 0x0c, 0x7c, 0x69, 0x38, 0x43, 0xb4, + 0xe9, 0x63, 0x20, 0x6c, 0xc4, 0x64, 0x32, 0xf9, 0x04, 0x9e, 0x6a, 0x68, 0x1f, 0x25, 0x75, 0x98, + 0x98, 0xf7, 0x3b, 0x1d, 0xca, 0x7e, 0x28, 0x61, 0x9d, 0x18, 0x88, 0xd9, 0x94, 0x05, 0x69, 0x0f, + 0x81, 0x4e, 0x42, 0x6e, 0x43, 0x7e, 0x63, 0xee, 0x8e, 0x18, 0x03, 0x19, 0xac, 0xb6, 0x31, 0x77, + 0x07, 0xf7, 0xba, 0xcc, 0x7e, 0x98, 0xe8, 0xcd, 0xed, 0xa8, 0x3e, 0xd0, 0x8d, 0xb9, 0x3b, 0x64, + 0x15, 0xa6, 0x2d, 0xfa, 0x8d, 0x9e, 0x17, 0x50, 0x31, 0x01, 0x1e, 0xdc, 0xa9, 0xe1, 0x58, 0x14, + 0xb9, 0x1e, 0x0b, 0x78, 0xa1, 0xb4, 0xed, 0xed, 0xf6, 0x8e, 0x7a, 0x2d, 0xaf, 0x9f, 0x96, 0xfc, + 0x34, 0x9c, 0x5f, 0xf0, 0x42, 0x51, 0x67, 0xee, 0x7c, 0x74, 0xf1, 0x1c, 0x72, 0x74, 0xc0, 0x74, + 0xf8, 0x42, 0xe6, 0x74, 0xf8, 0x8c, 0x1b, 0x33, 0xb1, 0xb9, 0x67, 0xd3, 0x4d, 0xc7, 0xc3, 0x66, + 0x7f, 0x87, 0x7c, 0x04, 0x93, 0xe8, 0xed, 0x41, 0x7f, 0x2c, 0x86, 0x48, 0x8f, 0x0d, 0xf8, 0xf2, + 0xe7, 0x32, 0xbf, 0x7c, 0x19, 0x9d, 0x47, 0x36, 0x7a, 0x75, 0x31, 0x9c, 0x5a, 0xdb, 0x23, 0x68, + 0x9c, 0xc9, 0x07, 0x30, 0x25, 0x16, 0x9d, 0xd5, 0x9d, 0xf5, 0x3d, 0xba, 0xe0, 0x1c, 0x88, 0x20, + 0x04, 0xb4, 0xff, 0xc4, 0x4a, 0x65, 0xfb, 0x3b, 0x76, 0xb4, 0x47, 0x6d, 0xd7, 0xd1, 0xd4, 0x73, + 0x8a, 0x90, 0xfc, 0x24, 0x8c, 0x2f, 0xfb, 0x78, 0xf0, 0x84, 0xaa, 0xa6, 0x84, 0x7c, 0xbe, 0x82, + 0xd7, 0x72, 0x39, 0x38, 0xb5, 0x88, 0xfc, 0xf0, 0xb0, 0xfa, 0xf6, 0x69, 0xa5, 0x50, 0xf9, 0x80, + 0xa5, 0x7e, 0x8d, 0xcc, 0x43, 0x71, 0x8b, 0x6e, 0xb3, 0xd6, 0xa6, 0xaf, 0x94, 0x49, 0x30, 0xd7, + 0x17, 0x8f, 0xc4, 0x2f, 0xf5, 0x54, 0x47, 0x62, 0x90, 0x00, 0xa6, 0xb1, 0x7f, 0xd6, 0x9c, 0x30, + 0x7c, 0xe4, 0x07, 0x6e, 0x8b, 0x86, 0xf2, 0x78, 0xa4, 0xbf, 0xf3, 0xe7, 0x32, 0x3b, 0xff, 0x0a, + 0xef, 0xfc, 0xae, 0xc2, 0x41, 0x15, 0xb7, 0x3e, 0xf6, 0xe6, 0xbf, 0x30, 0x50, 0xea, 0xc9, 0x0d, + 0x0c, 0x3e, 0x8b, 0xa3, 0xda, 0x71, 0x37, 0xeb, 0x74, 0xbb, 0x7a, 0x5c, 0x3a, 0x47, 0x61, 0x5b, + 0xdf, 0x3b, 0x4e, 0x93, 0x46, 0xd2, 0x47, 0x8a, 0xc8, 0x3b, 0x08, 0x51, 0xb7, 0xbe, 0x1c, 0x87, + 0x7c, 0x19, 0xce, 0x2d, 0xd0, 0x87, 0x5e, 0x93, 0xd6, 0xa2, 0x88, 0x86, 0xbc, 0x87, 0xe7, 0x6b, + 0xfc, 0x30, 0xb1, 0x54, 0x7f, 0xe9, 0xe8, 0xb0, 0x7a, 0xd5, 0xc5, 0x72, 0xdb, 0x49, 0x10, 0xec, + 0xa6, 0xa3, 0xf2, 0xca, 0xe4, 0x60, 0xfe, 0x4f, 0x23, 0xe9, 0x75, 0xf2, 0x0a, 0x14, 0xac, 0xb5, + 0xb8, 0xfe, 0xfc, 0x9c, 0x30, 0x55, 0x7d, 0x44, 0x20, 0x5f, 0x85, 0xf3, 0x0a, 0x1f, 0xec, 0x11, + 0xea, 0xb2, 0x0a, 0xf1, 0xc6, 0xbc, 0x8c, 0x07, 0x43, 0x4a, 0x4d, 0x1c, 0x8e, 0x91, 0xaa, 0x51, + 0x36, 0x0f, 0xd6, 0x58, 0xa5, 0x60, 0x81, 0x76, 0x3c, 0xce, 0x5b, 0x69, 0xac, 0xca, 0xdb, 0x45, + 0x84, 0x74, 0x63, 0xb3, 0x38, 0x7c, 0x50, 0x28, 0x16, 0x2a, 0x23, 0xe6, 0x5f, 0x1a, 0x4a, 0x4e, + 0x85, 0x67, 0x74, 0xc5, 0x7a, 0x53, 0x5b, 0xb1, 0xce, 0x09, 0xd2, 0xb8, 0x55, 0xac, 0x2c, 0xd3, + 0xca, 0x98, 0x82, 0x09, 0x0d, 0x09, 0xc3, 0x6c, 0x37, 0x42, 0x1a, 0x70, 0x9f, 0xe4, 0xa7, 0x2b, + 0xcc, 0x36, 0x6e, 0xd7, 0x50, 0xd1, 0x93, 0x7f, 0x6e, 0xc0, 0x54, 0x8a, 0x82, 0xf5, 0x06, 0x03, + 0xa9, 0xbd, 0xd1, 0x0b, 0x69, 0x60, 0x21, 0x94, 0x07, 0xe5, 0x2d, 0xeb, 0x41, 0x79, 0x2d, 0x8b, + 0xc1, 0xc8, 0x97, 0x60, 0x64, 0x03, 0x77, 0x10, 0x7a, 0x5c, 0x47, 0xcc, 0x1f, 0x0b, 0xf9, 0x0c, + 0xeb, 0xb1, 0x7f, 0x55, 0x05, 0x81, 0x65, 0xa4, 0x01, 0x63, 0xf3, 0x01, 0xc5, 0xec, 0x09, 0x85, + 0xe1, 0x0f, 0xe0, 0x9a, 0x9c, 0x24, 0x7d, 0x00, 0x27, 0x38, 0x99, 0xbf, 0x9a, 0x03, 0x92, 0xb4, + 0x91, 0x36, 0x03, 0x1a, 0x85, 0xcf, 0xec, 0xa0, 0xbf, 0xaf, 0x0d, 0xfa, 0xf3, 0x7d, 0x83, 0xce, + 0x9b, 0x37, 0xd4, 0xd8, 0xff, 0xa1, 0x01, 0x17, 0xb2, 0x09, 0xc9, 0x8b, 0x30, 0xba, 0xba, 0xbe, + 0x26, 0x43, 0x83, 0x44, 0x53, 0xfc, 0x2e, 0x5a, 0xc6, 0x96, 0x28, 0x22, 0xaf, 0xc3, 0xe8, 0x87, + 0xd6, 0x3c, 0x5b, 0x32, 0x95, 0xdb, 0x33, 0xdf, 0x08, 0xec, 0xa6, 0xbe, 0xe5, 0x12, 0x48, 0xea, + 0xd8, 0xe6, 0x9f, 0xda, 0xd8, 0x7e, 0x2b, 0x07, 0x53, 0xb5, 0x66, 0x93, 0x86, 0x21, 0x33, 0x88, + 0x68, 0x18, 0x3d, 0xb3, 0x03, 0x9b, 0x1d, 0xf4, 0xa3, 0xb5, 0x6d, 0xa8, 0x51, 0xfd, 0x23, 0x03, + 0xce, 0x4b, 0xaa, 0x87, 0x1e, 0x7d, 0xb4, 0xbe, 0x17, 0xd0, 0x70, 0xcf, 0x6f, 0xb9, 0xc3, 0xde, + 0x03, 0xc3, 0x55, 0xda, 0x6b, 0x45, 0x34, 0x50, 0x1d, 0xd4, 0x3b, 0x08, 0xd1, 0x56, 0x69, 0x84, + 0x90, 0x59, 0x18, 0xab, 0x75, 0xbb, 0x81, 0xff, 0x90, 0x4f, 0xfb, 0x09, 0x71, 0x1e, 0xc9, 0x41, + 0xda, 0xf9, 0x25, 0x07, 0xb1, 0x6a, 0x2c, 0xd0, 0x0e, 0x8f, 0x68, 0x9e, 0xe0, 0xd5, 0x70, 0x69, + 0x47, 0xb5, 0xd0, 0xb0, 0xdc, 0xfc, 0x66, 0x01, 0xca, 0x6a, 0x43, 0x88, 0x09, 0xa3, 0x3c, 0x3c, + 0x45, 0x0d, 0x13, 0x70, 0x10, 0x62, 0x89, 0x92, 0x24, 0xea, 0x27, 0x77, 0x62, 0xd4, 0xcf, 0x16, + 0x4c, 0xac, 0x05, 0x7e, 0xd7, 0x0f, 0xa9, 0xcb, 0x13, 0xe0, 0x70, 0xad, 0x75, 0x36, 0x0e, 0x85, + 0xe5, 0x7d, 0xce, 0x8a, 0xf8, 0x76, 0xa0, 0x2b, 0xb0, 0xed, 0x74, 0x7a, 0x1c, 0x9d, 0x0f, 0x77, + 0xf0, 0x3b, 0xa1, 0xb8, 0x2e, 0x10, 0x3b, 0xf8, 0x19, 0x44, 0x77, 0xf0, 0x33, 0x88, 0x3a, 0x2d, + 0x46, 0x9e, 0xd6, 0xb4, 0x20, 0xbf, 0x6a, 0xc0, 0x78, 0xad, 0xd3, 0x11, 0x51, 0x3f, 0xf2, 0x16, + 0xf9, 0xf9, 0xc4, 0xc9, 0xcf, 0xc3, 0x42, 0xb9, 0x8f, 0xff, 0x6b, 0xc2, 0xc7, 0xff, 0xf6, 0xc7, + 0xf2, 0xf1, 0xaf, 0x07, 0x8e, 0x17, 0x85, 0x78, 0x98, 0x9b, 0x7c, 0x50, 0x0d, 0xfd, 0x55, 0xea, + 0x41, 0xde, 0x86, 0x4a, 0x2c, 0x8f, 0x4b, 0x1d, 0x97, 0x3e, 0xa6, 0x3c, 0x48, 0x6a, 0x82, 0xdf, + 0x30, 0xd4, 0x0e, 0x2f, 0xd2, 0x88, 0xe6, 0xb7, 0x0c, 0xb8, 0xa0, 0x0a, 0x44, 0xa3, 0xb7, 0xdd, + 0xf6, 0x70, 0xfb, 0x43, 0x6e, 0x42, 0x49, 0x8c, 0x57, 0x6c, 0xc8, 0xf5, 0x67, 0x4d, 0x4a, 0x50, + 0xc8, 0x22, 0x1b, 0x22, 0xc6, 0x43, 0xf8, 0x0a, 0xce, 0xa6, 0xa6, 0x1b, 0x2b, 0xaa, 0xcf, 0x88, + 0xce, 0xae, 0x04, 0xf8, 0x5b, 0x1f, 0x3b, 0x06, 0x31, 0xdf, 0x83, 0x69, 0xbd, 0x96, 0x0d, 0x8a, + 0x57, 0xd0, 0x64, 0xd3, 0x8c, 0xec, 0xa6, 0xc9, 0x72, 0x73, 0x0b, 0x48, 0x1f, 0x7d, 0x88, 0x07, + 0x55, 0x34, 0x92, 0x07, 0xa9, 0xd2, 0xdd, 0xd5, 0x87, 0x18, 0xe7, 0x0f, 0x1b, 0x57, 0xbb, 0x1b, + 0x49, 0xcd, 0x3f, 0x06, 0x38, 0x9b, 0xa1, 0x3a, 0x4e, 0x58, 0xda, 0xab, 0xfa, 0xe4, 0x29, 0xc5, + 0x11, 0x01, 0x72, 0xca, 0xbc, 0x27, 0x73, 0x45, 0x1d, 0x33, 0x55, 0x8e, 0x4b, 0x20, 0xf5, 0x49, + 0x2c, 0xef, 0x6a, 0xd0, 0xce, 0xc8, 0x53, 0x0b, 0xda, 0xa9, 0xc3, 0x84, 0x68, 0x95, 0x98, 0xca, + 0xa3, 0x89, 0x5b, 0x20, 0xe0, 0x05, 0x76, 0xdf, 0x94, 0xd6, 0x49, 0x38, 0x8f, 0xd0, 0x6f, 0x3d, + 0xa4, 0x82, 0xc7, 0x98, 0xca, 0x03, 0x0b, 0x32, 0x79, 0x28, 0x24, 0xe4, 0x1f, 0x19, 0x40, 0x04, + 0x44, 0x9d, 0xcf, 0xc5, 0xe3, 0xe6, 0xb3, 0xfb, 0x74, 0xe6, 0xf3, 0xf3, 0xb2, 0x8e, 0xd9, 0xf3, + 0x3a, 0xa3, 0x5a, 0xe4, 0x1f, 0x18, 0x30, 0xcd, 0x23, 0x47, 0xd4, 0xca, 0x96, 0x8e, 0xab, 0x6c, + 0xf3, 0xe9, 0x54, 0xf6, 0x4a, 0x88, 0x9f, 0x1d, 0x50, 0xd7, 0xfe, 0x4a, 0x91, 0x1f, 0x05, 0x88, + 0x67, 0x94, 0x8c, 0x50, 0xbc, 0x92, 0xa1, 0x05, 0x62, 0xa4, 0xe4, 0x92, 0x65, 0x14, 0xd3, 0xa9, + 0x31, 0x3d, 0x09, 0x37, 0xf2, 0xd3, 0x70, 0x8e, 0xcd, 0x97, 0x18, 0x22, 0xe2, 0xdc, 0x66, 0xc6, + 0xf1, 0x2b, 0x9f, 0x1f, 0xbc, 0xb4, 0xdf, 0xcc, 0x22, 0xe3, 0xf7, 0x44, 0x92, 0x6b, 0xfc, 0x51, + 0x5b, 0xdd, 0xf2, 0x65, 0x51, 0x60, 0x40, 0x2b, 0xd6, 0x3e, 0x9c, 0x29, 0xe3, 0x37, 0x33, 0xf5, + 0xdb, 0x25, 0x39, 0x17, 0xb8, 0x7e, 0x0b, 0xf5, 0x8b, 0x1e, 0x08, 0x22, 0x1f, 0x02, 0x69, 0xf4, + 0x76, 0x77, 0x69, 0x18, 0x51, 0x97, 0xc3, 0x68, 0x10, 0xce, 0x4c, 0xa0, 0x7e, 0x40, 0x37, 0x55, + 0x28, 0x4b, 0xed, 0x40, 0x16, 0xab, 0x42, 0xd2, 0x4f, 0x4c, 0x56, 0xe0, 0x9c, 0x68, 0x34, 0x83, + 0xca, 0x9b, 0xf5, 0xe1, 0xcc, 0x24, 0x32, 0xc5, 0x53, 0x58, 0xe5, 0x1e, 0xbe, 0xb6, 0xbf, 0xcd, + 0xa2, 0xbb, 0xbc, 0x0d, 0x97, 0x06, 0x76, 0x5b, 0xc6, 0xa5, 0x90, 0x59, 0xfd, 0x52, 0xc8, 0xa5, + 0x41, 0xea, 0x35, 0x54, 0x2f, 0x86, 0xfc, 0x96, 0x91, 0xd2, 0xa7, 0xc2, 0xf8, 0xe1, 0x69, 0xfa, + 0x06, 0x2d, 0x38, 0x39, 0x4c, 0x18, 0xc0, 0x35, 0x6e, 0x2e, 0x31, 0xba, 0x98, 0xc6, 0x55, 0x35, + 0x36, 0xea, 0xde, 0x27, 0x54, 0xad, 0xe6, 0x3f, 0x35, 0x80, 0xf0, 0x1a, 0xce, 0x3b, 0x5d, 0x67, + 0xdb, 0x6b, 0x79, 0x91, 0x47, 0x43, 0x72, 0x1f, 0x2a, 0x82, 0x85, 0xb3, 0xdd, 0xa2, 0x6a, 0xbc, + 0x97, 0x38, 0x10, 0x8e, 0xcb, 0xec, 0xb4, 0x99, 0xd4, 0x47, 0x38, 0x40, 0x18, 0x72, 0x4f, 0x20, + 0x0c, 0xe6, 0x0f, 0x0c, 0xb8, 0xd4, 0x5f, 0x6d, 0xf1, 0xe5, 0xb8, 0xf3, 0x8c, 0x13, 0x3a, 0x2f, + 0xab, 0x95, 0x39, 0x74, 0xa5, 0x3e, 0xb5, 0x56, 0xe6, 0x13, 0xcf, 0xec, 0xe9, 0x5b, 0xf9, 0x0b, + 0x39, 0x28, 0xaf, 0xb5, 0x7a, 0xbb, 0x5e, 0x67, 0xc1, 0x89, 0x9c, 0x67, 0x76, 0x8b, 0xf2, 0x96, + 0xb6, 0x45, 0x89, 0x23, 0xbc, 0xe2, 0x86, 0x0d, 0x97, 0x32, 0xcd, 0x80, 0xa9, 0x84, 0x84, 0xcf, + 0xd2, 0x7b, 0x50, 0x60, 0x3f, 0x84, 0xc5, 0x73, 0xb5, 0x8f, 0x31, 0x62, 0xdd, 0x8c, 0xff, 0x13, + 0x9b, 0x06, 0x3d, 0x51, 0x1d, 0x72, 0xb8, 0xfc, 0x05, 0x9e, 0x67, 0xea, 0xf4, 0x39, 0x31, 0xff, + 0x89, 0x01, 0x95, 0x74, 0x4b, 0xc8, 0x7d, 0x18, 0x63, 0x9c, 0xbc, 0x38, 0x67, 0xd5, 0x4b, 0x03, + 0xda, 0x7c, 0x53, 0xa0, 0xf1, 0xea, 0x61, 0xe7, 0x53, 0x0e, 0xb1, 0x24, 0x87, 0xcb, 0x16, 0x94, + 0x55, 0xac, 0x8c, 0xda, 0xbd, 0xa6, 0xab, 0xa6, 0x0b, 0xd9, 0xfd, 0xa0, 0xd6, 0xfa, 0x37, 0xb5, + 0x5a, 0x0b, 0xa5, 0x34, 0x6c, 0xf2, 0x41, 0xbc, 0xe2, 0xc6, 0xf5, 0xa8, 0x2a, 0x67, 0x52, 0xf9, + 0xea, 0x57, 0xdc, 0x38, 0x8c, 0xed, 0x6d, 0xf8, 0xf7, 0x84, 0x9c, 0xe1, 0xde, 0xa6, 0x8b, 0x10, + 0xd5, 0x3e, 0xe6, 0x38, 0xe6, 0xdf, 0xce, 0xc3, 0x85, 0xa4, 0x7a, 0x3c, 0x15, 0xe3, 0x9a, 0x13, + 0x38, 0xed, 0xf0, 0x84, 0x19, 0x70, 0xbd, 0xaf, 0x6a, 0x78, 0x85, 0x5b, 0x56, 0x4d, 0xa9, 0x90, + 0x99, 0xaa, 0x10, 0x6e, 0x0a, 0x79, 0x85, 0x64, 0x35, 0xc8, 0x7d, 0xc8, 0x37, 0x68, 0x24, 0x2e, + 0x7a, 0x5e, 0xeb, 0xeb, 0x55, 0xb5, 0x5e, 0x37, 0x1b, 0x34, 0xe2, 0x83, 0xc8, 0x63, 0xe5, 0xa9, + 0x16, 0xbb, 0xce, 0xcc, 0xfb, 0x2d, 0x18, 0x5d, 0x7c, 0xdc, 0xa5, 0xcd, 0x48, 0xdc, 0xef, 0x7c, + 0xf5, 0x78, 0x7e, 0x1c, 0x57, 0xb9, 0x45, 0x4a, 0x11, 0xa0, 0x76, 0x16, 0x47, 0xb9, 0xfc, 0x26, + 0x14, 0xe5, 0xc7, 0x4f, 0x75, 0x1b, 0xf2, 0x2d, 0x18, 0x57, 0x3e, 0x72, 0x2a, 0xa1, 0xff, 0x2b, + 0x03, 0x46, 0x99, 0xd2, 0xdb, 0x7c, 0xe3, 0x19, 0xd5, 0x48, 0xb7, 0x35, 0x8d, 0x34, 0xad, 0x5c, + 0xdb, 0xc1, 0x79, 0xf9, 0xc6, 0x09, 0xba, 0xe8, 0xd0, 0x00, 0x48, 0x90, 0xc9, 0x5d, 0x18, 0x13, + 0xf9, 0x59, 0x44, 0x9e, 0x53, 0xf5, 0x1e, 0x90, 0xcc, 0x03, 0x15, 0x5b, 0x4d, 0x7e, 0x37, 0x6d, + 0x66, 0x4a, 0x6a, 0xb2, 0x90, 0xc4, 0x4a, 0xab, 0x17, 0x4f, 0x19, 0x9b, 0x79, 0xbf, 0xc3, 0xef, + 0x85, 0x28, 0x19, 0xa5, 0x06, 0x04, 0x4d, 0xd7, 0x84, 0xa3, 0x24, 0x7f, 0x1c, 0x93, 0x0b, 0x82, + 0x49, 0xb6, 0x0f, 0xe5, 0x7f, 0x8d, 0xf3, 0x9b, 0x16, 0xb2, 0x62, 0xef, 0x42, 0xf9, 0x8e, 0x1f, + 0x3c, 0x72, 0x02, 0xb7, 0xb6, 0x4b, 0x45, 0x94, 0x7b, 0x11, 0x43, 0xd5, 0x27, 0x76, 0x38, 0xdc, + 0x76, 0x58, 0xc1, 0x0f, 0x0f, 0xab, 0x85, 0xba, 0xef, 0xb7, 0x2c, 0x0d, 0x9d, 0xac, 0xc2, 0xc4, + 0x03, 0xe7, 0xb1, 0x38, 0x73, 0x5c, 0x5f, 0x5f, 0x16, 0xb1, 0x32, 0xaf, 0x1e, 0x1d, 0x56, 0x2f, + 0xb5, 0x9d, 0xc7, 0xf1, 0x59, 0xe5, 0xe0, 0x70, 0x6e, 0x9d, 0x9e, 0x78, 0x30, 0xb9, 0xe6, 0x07, + 0x91, 0xf8, 0x08, 0xb3, 0x91, 0xf3, 0x03, 0x4e, 0xad, 0x66, 0x33, 0x4f, 0xad, 0x2e, 0xb1, 0x8d, + 0x81, 0xbd, 0x13, 0x93, 0x6b, 0xd7, 0x03, 0x35, 0xc6, 0xe4, 0x5d, 0x98, 0x9e, 0xa7, 0x41, 0xe4, + 0xed, 0x78, 0x4d, 0x27, 0xa2, 0x77, 0xfc, 0xa0, 0xed, 0x44, 0xc2, 0x41, 0x83, 0x1b, 0xf4, 0x26, + 0xe5, 0x9c, 0xda, 0x4e, 0x64, 0xf5, 0x63, 0x92, 0xaf, 0x66, 0x45, 0x1f, 0x8d, 0x60, 0xf3, 0x5f, + 0x67, 0x46, 0x41, 0x46, 0xf4, 0xd1, 0x80, 0x2e, 0xc8, 0x88, 0x43, 0xda, 0x3d, 0xee, 0xe8, 0xb6, + 0x58, 0xbf, 0x25, 0x8e, 0x91, 0x4f, 0x3e, 0x9a, 0x8d, 0xc7, 0x6d, 0xc0, 0x11, 0xed, 0x1c, 0xe4, + 0xeb, 0x6b, 0x77, 0xd0, 0xe5, 0x22, 0x8e, 0x4a, 0x69, 0x67, 0xcf, 0xe9, 0x34, 0xd1, 0x96, 0x11, + 0xf1, 0x17, 0xaa, 0xc2, 0xab, 0xaf, 0xdd, 0x21, 0x0e, 0x9c, 0x5d, 0xa3, 0x41, 0xdb, 0x8b, 0xbe, + 0x7c, 0xeb, 0x96, 0x32, 0x50, 0x45, 0xac, 0xda, 0xac, 0xa8, 0x5a, 0xb5, 0x8b, 0x28, 0xf6, 0xe3, + 0x5b, 0xb7, 0x32, 0x87, 0x23, 0xae, 0x58, 0x16, 0x2f, 0xb2, 0x08, 0x93, 0x0f, 0x9c, 0xc7, 0xe2, + 0x50, 0x3d, 0xde, 0x33, 0xe6, 0x31, 0xba, 0x1f, 0x05, 0xab, 0x99, 0x14, 0xa9, 0x43, 0xac, 0x13, + 0x91, 0x77, 0x60, 0x3c, 0x11, 0xaf, 0x10, 0x8f, 0x53, 0xf3, 0x7c, 0x43, 0xa1, 0x08, 0xa7, 0xe6, + 0x9b, 0x52, 0xd0, 0xc9, 0x46, 0xbc, 0xe5, 0xe7, 0x06, 0x29, 0x1e, 0xa0, 0x96, 0xea, 0xb3, 0xea, + 0x96, 0xdf, 0xc1, 0x12, 0xad, 0x59, 0x53, 0xb1, 0x89, 0xce, 0xa3, 0x7d, 0x2c, 0x9d, 0x8b, 0xe2, + 0x49, 0x58, 0x0b, 0xfc, 0x76, 0x37, 0xc2, 0xa8, 0xc7, 0x94, 0x27, 0xa1, 0x8b, 0x25, 0x19, 0x9e, + 0x04, 0x4e, 0x92, 0x1d, 0x2b, 0x30, 0xf1, 0x04, 0xb1, 0x02, 0x14, 0x0a, 0xcb, 0x7e, 0x73, 0x1f, + 0xc3, 0x1c, 0x4b, 0xf5, 0x0f, 0x99, 0xfe, 0x68, 0xf9, 0xcd, 0xfd, 0xa7, 0x77, 0xc6, 0x8d, 0xec, + 0xc9, 0x0a, 0x6b, 0x3b, 0x13, 0x2b, 0xf1, 0xe9, 0x99, 0x29, 0xed, 0xe4, 0x4e, 0x2b, 0xe3, 0x86, + 0x0a, 0x97, 0x42, 0xd9, 0x10, 0x4b, 0x27, 0x27, 0x14, 0x2a, 0x0b, 0x34, 0xdc, 0x8f, 0xfc, 0xee, + 0x7c, 0xcb, 0xeb, 0x6e, 0xfb, 0x4e, 0xe0, 0xce, 0x54, 0x06, 0x28, 0x8c, 0x57, 0x32, 0x15, 0xc6, + 0xb4, 0xcb, 0xe9, 0xed, 0xa6, 0x64, 0x60, 0xf5, 0xb1, 0x24, 0x5f, 0x85, 0x49, 0x36, 0x5b, 0x16, + 0x1f, 0x47, 0xb4, 0xc3, 0x45, 0x69, 0x1a, 0x97, 0xfa, 0x73, 0xca, 0x45, 0xc9, 0xb8, 0x90, 0x0b, + 0x29, 0x6a, 0x0f, 0x1a, 0x13, 0xa8, 0x42, 0xaa, 0xb3, 0x22, 0x2e, 0xcc, 0x3c, 0x70, 0x1e, 0x2b, + 0x69, 0x85, 0x14, 0xa9, 0x27, 0x28, 0xb1, 0xd7, 0x8f, 0x0e, 0xab, 0x2f, 0x31, 0x89, 0xdd, 0x8f, + 0x91, 0x06, 0x4c, 0x80, 0x81, 0x9c, 0xcc, 0x1f, 0x4d, 0xf5, 0x3c, 0x59, 0x82, 0x31, 0xd1, 0x4e, + 0xb1, 0xb6, 0xf5, 0xf7, 0xd8, 0xf3, 0x99, 0x3d, 0x36, 0x26, 0x7a, 0xcc, 0x92, 0xf4, 0xe6, 0xbf, + 0x36, 0x60, 0x42, 0x6b, 0x14, 0x79, 0x53, 0x09, 0xf4, 0x49, 0x02, 0xf4, 0x34, 0x9c, 0xcc, 0x57, + 0x0a, 0xde, 0x14, 0xd1, 0x5d, 0xb9, 0xc1, 0x74, 0x99, 0x79, 0xdb, 0x64, 0x7a, 0x84, 0xfc, 0xf1, + 0xe9, 0x11, 0x0a, 0x03, 0xd2, 0x23, 0xfc, 0xf2, 0x04, 0x4c, 0xea, 0xcb, 0x28, 0xb3, 0x6b, 0x97, + 0xfd, 0x5d, 0xaf, 0x23, 0x77, 0xc7, 0x3c, 0xe1, 0x07, 0x42, 0xb4, 0x94, 0xff, 0x08, 0x21, 0x2f, + 0x03, 0xc4, 0x07, 0xca, 0x72, 0x03, 0x2c, 0x1e, 0x28, 0x50, 0x0a, 0xc8, 0x8f, 0x01, 0xac, 0xf8, + 0x2e, 0x8d, 0x73, 0xc6, 0x1c, 0xe3, 0x06, 0x7b, 0x45, 0xb8, 0xc1, 0xc4, 0xa3, 0x02, 0x47, 0x87, + 0xd5, 0xf3, 0x1d, 0xdf, 0xa5, 0xfd, 0xc9, 0x62, 0x14, 0x8e, 0xe4, 0x8b, 0x30, 0x62, 0xf5, 0x5a, + 0x54, 0xa6, 0x30, 0x19, 0x97, 0xd3, 0xaa, 0xd7, 0x52, 0x92, 0x8d, 0x06, 0xbd, 0xf4, 0xe9, 0x07, + 0x03, 0x90, 0xf7, 0x01, 0x98, 0xe4, 0xdc, 0x0d, 0xfc, 0x5e, 0x57, 0xde, 0x91, 0xc6, 0xcd, 0xb2, + 0x22, 0x74, 0xbb, 0x58, 0xa8, 0x7e, 0x3c, 0x21, 0x21, 0xab, 0x30, 0x26, 0x94, 0x94, 0x38, 0x5d, + 0x78, 0x21, 0xcb, 0xaf, 0xa5, 0x58, 0x2a, 0x22, 0xa7, 0x08, 0x82, 0x75, 0x57, 0x13, 0xdf, 0xec, + 0xbf, 0x03, 0x25, 0xc6, 0x9e, 0x6d, 0xe8, 0x43, 0xb1, 0x42, 0x61, 0xa4, 0xa5, 0x52, 0x21, 0xb6, + 0xf9, 0xd7, 0x32, 0x9b, 0xc5, 0x04, 0xe4, 0xab, 0x98, 0x05, 0x48, 0x74, 0xf5, 0xb1, 0xee, 0xd1, + 0x6b, 0x7d, 0x5d, 0x7d, 0xce, 0xe9, 0x76, 0x33, 0xd2, 0xa6, 0xc5, 0xfc, 0xc8, 0x6e, 0x7c, 0x1b, + 0x29, 0xce, 0x38, 0x7d, 0xcc, 0x07, 0x6e, 0xf4, 0x7d, 0x60, 0x46, 0x5e, 0xb0, 0xe9, 0xcf, 0xfd, + 0xa3, 0xf1, 0x25, 0x5d, 0xa8, 0x24, 0xf3, 0x59, 0x7c, 0x0b, 0x8e, 0xfb, 0xd6, 0xeb, 0x7d, 0xdf, + 0x52, 0x07, 0xb0, 0xef, 0x73, 0x7d, 0xdc, 0x89, 0x9b, 0x64, 0x07, 0x16, 0xdf, 0x1b, 0x3f, 0xee, + 0x7b, 0x2f, 0xf7, 0x7d, 0xef, 0xac, 0xbb, 0xdd, 0xff, 0x9d, 0x14, 0x4f, 0xf2, 0x0e, 0x4c, 0x48, + 0x08, 0xce, 0x0f, 0x74, 0x4b, 0x8a, 0x5d, 0x84, 0xbb, 0x8d, 0xe1, 0x75, 0x7a, 0xe2, 0x1b, 0x15, + 0x59, 0xa5, 0xe6, 0xd2, 0x31, 0xa1, 0x51, 0xa7, 0xa5, 0x42, 0x47, 0x26, 0x5f, 0x81, 0xf1, 0xa5, + 0x36, 0x6b, 0x88, 0xdf, 0x71, 0x22, 0x8a, 0x4b, 0x5e, 0xe2, 0xea, 0x55, 0x4a, 0x14, 0x51, 0xe5, + 0x19, 0x36, 0x93, 0x22, 0xd5, 0x64, 0x50, 0x28, 0x58, 0xe7, 0x71, 0x27, 0x8f, 0x90, 0xe1, 0x50, + 0x2c, 0x70, 0xcf, 0x67, 0xb8, 0x5b, 0x15, 0xf6, 0xb8, 0x62, 0x70, 0xdf, 0x91, 0x2d, 0x26, 0x84, + 0xd6, 0x79, 0x3a, 0x4f, 0xf2, 0x2e, 0x8c, 0x8b, 0xbb, 0x9f, 0x35, 0x6b, 0x25, 0x9c, 0xa9, 0x60, + 0xe3, 0x31, 0x6b, 0x9d, 0xbc, 0x26, 0x6a, 0x3b, 0x41, 0xea, 0xcc, 0x2d, 0xc1, 0x27, 0x5f, 0x86, + 0x73, 0x5b, 0x5e, 0xc7, 0xf5, 0x1f, 0x85, 0x42, 0x81, 0x0b, 0x45, 0x37, 0x9d, 0x44, 0x16, 0x3d, + 0xe2, 0xe5, 0xb6, 0x5c, 0x1c, 0xfb, 0x14, 0x5f, 0x26, 0x07, 0xf2, 0x53, 0x7d, 0x9c, 0xb9, 0x04, + 0x91, 0xe3, 0x24, 0x68, 0xae, 0x4f, 0x82, 0xfa, 0x3f, 0x9f, 0x16, 0xa7, 0xcc, 0xcf, 0x10, 0x1f, + 0x88, 0x6e, 0xd9, 0x7c, 0xe0, 0x7b, 0x9d, 0x99, 0xb3, 0xda, 0x7b, 0x2e, 0x71, 0x70, 0x31, 0xe2, + 0xad, 0xf9, 0x2d, 0xaf, 0x79, 0x50, 0x37, 0x8f, 0x0e, 0xab, 0x2f, 0xa4, 0x6d, 0xa6, 0x8f, 0x7c, + 0xcd, 0x85, 0x91, 0xc1, 0x9a, 0x7c, 0x05, 0xca, 0xec, 0x6f, 0x6c, 0x60, 0x9e, 0xd3, 0x0e, 0xe8, + 0x14, 0x4c, 0xf1, 0x1d, 0x1c, 0x23, 0xbc, 0x9c, 0x9a, 0x61, 0x7b, 0x6a, 0xac, 0xcc, 0x1f, 0x18, + 0x70, 0x2e, 0xab, 0xae, 0x27, 0x64, 0x02, 0x32, 0x53, 0x47, 0xf5, 0xe8, 0xfd, 0xe0, 0x47, 0xf5, + 0xf1, 0x01, 0x7d, 0x15, 0x46, 0xd8, 0x8e, 0x5c, 0x86, 0x92, 0xe1, 0x72, 0xc8, 0x76, 0xed, 0xa1, + 0xc5, 0xe1, 0x0c, 0x01, 0xaf, 0x1d, 0xe0, 0x7a, 0x39, 0xc2, 0x11, 0xf0, 0x6e, 0x82, 0xc5, 0xe1, + 0x0c, 0x81, 0x2d, 0xbb, 0x72, 0x99, 0x40, 0x04, 0xb6, 0x1a, 0x87, 0x16, 0x87, 0x93, 0x6b, 0x30, + 0xb6, 0xda, 0x59, 0xa6, 0xce, 0x43, 0x2a, 0xce, 0xc9, 0xd0, 0x5b, 0xe3, 0x77, 0xec, 0x16, 0x83, + 0x59, 0xb2, 0xd0, 0xfc, 0x8e, 0x01, 0xd3, 0x7d, 0xdd, 0x74, 0x72, 0xb2, 0xa3, 0xe3, 0x0f, 0x25, + 0x87, 0x69, 0x1f, 0xaf, 0x7e, 0x21, 0xbb, 0xfa, 0xe6, 0xef, 0x17, 0xe0, 0xe2, 0x80, 0x55, 0x2b, + 0x09, 0x28, 0x30, 0x4e, 0x0c, 0x28, 0xf8, 0x1a, 0x5b, 0x25, 0x1c, 0xaf, 0x1d, 0xae, 0xfb, 0x49, + 0x8d, 0x93, 0xb3, 0x17, 0x2c, 0x93, 0xd9, 0x44, 0x64, 0xe6, 0x8b, 0x4b, 0x4d, 0xa4, 0xb0, 0x23, + 0xbf, 0xcf, 0x33, 0xad, 0x33, 0xeb, 0x3b, 0xd2, 0xcf, 0xff, 0x35, 0x39, 0xd2, 0xd7, 0x0f, 0xd2, + 0x0a, 0x4f, 0xf5, 0x20, 0x2d, 0xdb, 0x15, 0x3f, 0xf2, 0x24, 0xa7, 0x4f, 0xf3, 0x30, 0xd1, 0xa0, + 0x4e, 0xd0, 0xdc, 0xab, 0x85, 0x7c, 0x90, 0x46, 0x91, 0x1b, 0xaa, 0xe4, 0x10, 0x0b, 0x6c, 0x27, + 0xec, 0x1f, 0x0b, 0x8d, 0xc6, 0xfc, 0x77, 0xa9, 0x48, 0x84, 0xbf, 0x8e, 0xf2, 0xf2, 0x2a, 0x8c, + 0x6c, 0xed, 0xd1, 0x40, 0x1a, 0xc9, 0x58, 0x91, 0x47, 0x0c, 0xa0, 0x56, 0x04, 0x31, 0xcc, 0x9f, + 0x84, 0xb2, 0xfa, 0x31, 0x54, 0x08, 0xec, 0xb7, 0x98, 0x91, 0x5c, 0x21, 0x30, 0x80, 0xc5, 0xe1, + 0x27, 0x26, 0x20, 0x4b, 0x7a, 0x21, 0x7f, 0x52, 0x2f, 0xb0, 0x8f, 0xa3, 0xbc, 0x29, 0x1f, 0xc7, + 0xdf, 0xea, 0xc7, 0x23, 0x06, 0xb0, 0x38, 0xfc, 0xa9, 0x7e, 0xfc, 0xdf, 0x1a, 0x50, 0xc0, 0xe4, + 0x0f, 0x6f, 0x40, 0x49, 0xba, 0x94, 0xd5, 0x84, 0x08, 0x67, 0xa5, 0xc7, 0x39, 0xd4, 0xe3, 0x48, + 0x04, 0x90, 0x7d, 0x6a, 0x93, 0x06, 0xdb, 0x5a, 0xb8, 0xd1, 0x43, 0x06, 0x50, 0x3f, 0x85, 0x18, + 0xa7, 0x18, 0x0f, 0x0c, 0xa9, 0x12, 0x3b, 0x42, 0xae, 0xb2, 0x78, 0x48, 0x55, 0xdf, 0xf6, 0x4f, + 0x62, 0x99, 0xbf, 0x6e, 0xc0, 0xf9, 0x4c, 0x4b, 0x86, 0x7d, 0x95, 0x9b, 0x4c, 0x8a, 0x38, 0xa6, + 0xed, 0x25, 0x8e, 0x71, 0x9a, 0xd0, 0xa9, 0x53, 0xc8, 0xd6, 0x67, 0xa0, 0x14, 0xef, 0x30, 0xc9, + 0x39, 0x39, 0x74, 0xe8, 0x77, 0x94, 0xdb, 0xb1, 0xbf, 0x32, 0x60, 0x94, 0x55, 0xe1, 0x99, 0xbd, + 0x49, 0x93, 0xed, 0x85, 0x66, 0x4d, 0x1a, 0xea, 0xfe, 0xcc, 0xef, 0x8c, 0x02, 0x24, 0xc8, 0x64, + 0x1b, 0x26, 0x57, 0x97, 0x16, 0xe6, 0x97, 0x5c, 0xda, 0x89, 0xf0, 0x34, 0x34, 0x95, 0x51, 0x81, + 0x6d, 0x8d, 0x83, 0x8e, 0xd3, 0x12, 0x08, 0x07, 0x89, 0x6e, 0xf0, 0x3d, 0xb7, 0x69, 0x7b, 0x31, + 0x9d, 0x6a, 0x52, 0xea, 0x1c, 0xd9, 0x37, 0x1a, 0xb5, 0x07, 0xcb, 0xca, 0x37, 0x72, 0x43, 0x7e, + 0x23, 0x74, 0xda, 0xad, 0x01, 0xdf, 0xd0, 0x39, 0x92, 0x3d, 0xa8, 0xdc, 0xc5, 0xd5, 0x47, 0xf9, + 0x4a, 0xfe, 0xf8, 0xaf, 0xbc, 0x28, 0xbe, 0xf2, 0x1c, 0x5f, 0xb6, 0xb2, 0xbf, 0xd3, 0xc7, 0x35, + 0x91, 0xdc, 0xc2, 0x89, 0x92, 0xfb, 0x37, 0x0c, 0x18, 0xe5, 0xcb, 0x5b, 0xfc, 0x28, 0x4b, 0xe6, + 0x02, 0xba, 0xf5, 0x74, 0x16, 0xd0, 0x0a, 0x6a, 0x2e, 0xcd, 0x85, 0xc0, 0xcb, 0xc8, 0x42, 0xea, + 0x85, 0x17, 0x79, 0xd4, 0x80, 0xa6, 0x35, 0x2f, 0x49, 0x02, 0xd0, 0xf8, 0xe3, 0x2e, 0x2a, 0x17, + 0x8e, 0xa1, 0xbe, 0x37, 0x39, 0xf6, 0x84, 0xef, 0x4d, 0x2e, 0x43, 0x49, 0x44, 0x54, 0xd5, 0x0f, + 0xc4, 0x06, 0x5a, 0xba, 0x88, 0x62, 0xb8, 0x92, 0x68, 0x9c, 0x83, 0xec, 0x6d, 0x2d, 0x4d, 0x60, + 0x8c, 0x48, 0x56, 0xa1, 0x94, 0x5c, 0x03, 0x2a, 0x69, 0xe7, 0xc5, 0x31, 0x5c, 0x84, 0x1c, 0xf3, + 0x9b, 0xa6, 0x99, 0xb7, 0x7e, 0x12, 0x1e, 0xe6, 0x37, 0x0d, 0xa8, 0xa4, 0xe5, 0x85, 0xbc, 0x03, + 0xe3, 0xf1, 0x4d, 0xac, 0x38, 0x0e, 0x03, 0x1d, 0xbe, 0xc9, 0xd5, 0x2d, 0x2d, 0x22, 0x43, 0x45, + 0x27, 0x73, 0x50, 0x64, 0xd3, 0x4e, 0xc9, 0x13, 0x8d, 0xfa, 0xa4, 0x27, 0x60, 0xea, 0xf9, 0xa7, + 0xc4, 0x53, 0x66, 0xed, 0xbf, 0xcf, 0xc3, 0xb8, 0x32, 0x58, 0xe4, 0x55, 0x28, 0x2e, 0x85, 0xcb, + 0x7e, 0x73, 0x9f, 0xba, 0xe2, 0x58, 0x05, 0x9f, 0x13, 0xf5, 0x42, 0xbb, 0x85, 0x40, 0x2b, 0x2e, + 0x26, 0x75, 0x98, 0xe0, 0xff, 0xc9, 0x1b, 0xb7, 0xb9, 0xc4, 0x25, 0xcc, 0x91, 0xe5, 0x5d, 0x5b, + 0x75, 0x79, 0xd7, 0x48, 0xc8, 0xd7, 0x01, 0x38, 0x80, 0x8d, 0xef, 0x10, 0x01, 0xd5, 0x72, 0x02, + 0x9f, 0x17, 0x1f, 0x88, 0x3c, 0xb5, 0x85, 0x28, 0x0a, 0x0a, 0x43, 0x7c, 0xca, 0xd0, 0x6f, 0xee, + 0x0f, 0xff, 0x98, 0x69, 0xf2, 0x94, 0xa1, 0xdf, 0xdc, 0xb7, 0xb3, 0xa3, 0xeb, 0x54, 0x96, 0xe4, + 0x5b, 0x06, 0x5c, 0xb6, 0x68, 0xd3, 0x7f, 0x48, 0x83, 0x83, 0x5a, 0x84, 0x58, 0xea, 0x17, 0x4f, + 0x0e, 0xe5, 0xbb, 0x2d, 0xbe, 0xf8, 0x4a, 0x20, 0xb8, 0xe0, 0x35, 0xa0, 0x76, 0x37, 0xb2, 0x8f, + 0xa9, 0xc2, 0x31, 0x9f, 0x34, 0xff, 0xd4, 0x50, 0xa6, 0x00, 0x59, 0x81, 0x52, 0x2c, 0x2c, 0xc2, + 0x65, 0x1a, 0x5b, 0x66, 0x12, 0x6e, 0xd1, 0x9d, 0xfa, 0x73, 0xe2, 0x04, 0xe4, 0x6c, 0x2c, 0x72, + 0xda, 0x8c, 0x90, 0x40, 0xf2, 0x25, 0x28, 0xe0, 0x50, 0x9d, 0x9c, 0x58, 0x4c, 0x2e, 0x35, 0x05, + 0x36, 0x46, 0x58, 0x6b, 0xa4, 0x24, 0x9f, 0x13, 0xd1, 0x30, 0x79, 0x2d, 0x65, 0x2f, 0x03, 0xb1, + 0x7a, 0xc4, 0x6b, 0x4c, 0x12, 0xd0, 0xa9, 0x48, 0xeb, 0xdf, 0xcc, 0x41, 0x25, 0x3d, 0xf1, 0xc8, + 0xfb, 0x50, 0x96, 0x57, 0xba, 0xee, 0x39, 0xe1, 0x9e, 0x48, 0x03, 0x8a, 0xbb, 0x56, 0x79, 0x0f, + 0xcc, 0xde, 0x73, 0xb4, 0x74, 0x71, 0x1a, 0x01, 0x5b, 0x90, 0xd7, 0xc5, 0x3d, 0x01, 0x65, 0x02, + 0x45, 0x7e, 0xd4, 0x4d, 0xa5, 0x01, 0x95, 0x68, 0xe4, 0x0d, 0xc8, 0xf3, 0x7b, 0x8e, 0x6a, 0x0e, + 0xa9, 0x07, 0x77, 0x6a, 0xfc, 0x9a, 0x16, 0x3f, 0x74, 0xd7, 0x4f, 0x2f, 0x18, 0x3e, 0x59, 0x56, + 0x6e, 0xc9, 0x8d, 0x6a, 0xb9, 0x74, 0x24, 0x38, 0x6e, 0xdc, 0xc9, 0xd7, 0xe5, 0x3e, 0x28, 0x14, + 0xf3, 0x95, 0x82, 0xb8, 0x17, 0xf5, 0x7b, 0x79, 0x28, 0xc5, 0xdf, 0x27, 0x04, 0xd0, 0xde, 0x10, + 0xa7, 0xe7, 0xf8, 0x3f, 0xb9, 0x04, 0x45, 0x69, 0x62, 0x88, 0x13, 0xf4, 0xb1, 0x50, 0x98, 0x17, + 0x33, 0x20, 0x6d, 0x09, 0x6e, 0x5e, 0x58, 0xf2, 0x27, 0xb9, 0x05, 0xb1, 0xa1, 0x30, 0xc8, 0xa2, + 0x28, 0xb0, 0x01, 0xb3, 0x62, 0x34, 0x32, 0x09, 0x39, 0x8f, 0xc7, 0x80, 0x97, 0xac, 0x9c, 0xe7, + 0x92, 0xf7, 0xa1, 0xe8, 0xb8, 0x2e, 0x75, 0x6d, 0x27, 0x1a, 0xe2, 0x61, 0xd9, 0x22, 0xe3, 0xc6, + 0x35, 0x3a, 0x52, 0xd5, 0x22, 0x52, 0x83, 0x12, 0xbe, 0x2b, 0xda, 0x0b, 0x87, 0x7a, 0x8c, 0x34, + 0xe1, 0x50, 0x64, 0x64, 0x1b, 0x21, 0x75, 0xc9, 0x2b, 0x50, 0x60, 0xa3, 0x29, 0xd6, 0x83, 0x38, + 0x33, 0xe0, 0xea, 0xfa, 0x1a, 0xef, 0xb0, 0x7b, 0x67, 0x2c, 0x44, 0x20, 0x2f, 0x41, 0xbe, 0x37, + 0xb7, 0x23, 0x34, 0x7d, 0x25, 0xb9, 0x02, 0x1b, 0xa3, 0xb1, 0x62, 0x72, 0x1b, 0x8a, 0x8f, 0xf4, + 0xcb, 0x8e, 0xe7, 0x53, 0xc3, 0x18, 0xe3, 0xc7, 0x88, 0xf5, 0x22, 0x8c, 0xf2, 0x6b, 0x7e, 0xe6, + 0x0b, 0x00, 0xc9, 0xa7, 0xfb, 0x03, 0x1d, 0xcc, 0xaf, 0x43, 0x29, 0xfe, 0x24, 0x79, 0x1e, 0x60, + 0x9f, 0x1e, 0xd8, 0x7b, 0x4e, 0xc7, 0x15, 0xcf, 0xd8, 0x94, 0xad, 0xd2, 0x3e, 0x3d, 0xb8, 0x87, + 0x00, 0x72, 0x11, 0xc6, 0xba, 0x6c, 0x54, 0x65, 0x12, 0x5b, 0x6b, 0xb4, 0xdb, 0xdb, 0x66, 0x12, + 0x3a, 0x03, 0x63, 0xe8, 0xfc, 0x10, 0x13, 0x6d, 0xc2, 0x92, 0x3f, 0xcd, 0xdf, 0xca, 0x61, 0x7a, + 0x03, 0xa5, 0x9e, 0xe4, 0x45, 0x98, 0x68, 0x06, 0x14, 0x97, 0x23, 0x87, 0x99, 0x45, 0xe2, 0x3b, + 0xe5, 0x04, 0xb8, 0xe4, 0x92, 0x6b, 0x30, 0x95, 0x64, 0xd5, 0xb5, 0x9b, 0xdb, 0xe2, 0xaa, 0x73, + 0xd9, 0x9a, 0xe8, 0xca, 0xb4, 0xba, 0xf3, 0xdb, 0x78, 0x77, 0xa1, 0xa2, 0x5e, 0xf1, 0x8b, 0x64, + 0x86, 0xdc, 0x92, 0x35, 0xa5, 0xc0, 0xf1, 0xe0, 0xe4, 0x02, 0x8c, 0x3a, 0xce, 0x6e, 0xcf, 0xe3, + 0x71, 0xd4, 0x65, 0x4b, 0xfc, 0x22, 0x9f, 0x85, 0xe9, 0xd0, 0xdb, 0xed, 0x38, 0x51, 0x2f, 0x10, + 0xf9, 0x25, 0x68, 0x80, 0x22, 0x35, 0x61, 0x55, 0xe2, 0x82, 0x79, 0x0e, 0x27, 0xaf, 0x03, 0x51, + 0xbf, 0xe7, 0x6f, 0x7f, 0x44, 0x9b, 0x5c, 0xd4, 0xca, 0xd6, 0xb4, 0x52, 0xb2, 0x8a, 0x05, 0xe4, + 0x33, 0x50, 0x0e, 0x68, 0x88, 0x26, 0x19, 0x76, 0x1b, 0x66, 0xcd, 0xb1, 0xc6, 0x25, 0xec, 0x3e, + 0x3d, 0x30, 0xeb, 0x30, 0xdd, 0x37, 0x1f, 0xc9, 0xeb, 0xdc, 0xba, 0x17, 0xeb, 0x73, 0x99, 0x6f, + 0x66, 0x98, 0x92, 0x4a, 0x3d, 0x45, 0xcd, 0x91, 0xcc, 0x0e, 0x94, 0x55, 0xfd, 0x7a, 0xc2, 0x25, + 0xf2, 0x0b, 0x18, 0x80, 0xc9, 0x95, 0xcf, 0xe8, 0xd1, 0x61, 0x35, 0xe7, 0xb9, 0x18, 0x76, 0x79, + 0x1d, 0x8a, 0xd2, 0x4a, 0x50, 0x9f, 0x5c, 0x11, 0x06, 0xe5, 0x81, 0x15, 0x97, 0x9a, 0xaf, 0xc0, + 0x98, 0x50, 0xa1, 0xc7, 0x3b, 0xa2, 0xcc, 0x9f, 0xcb, 0xc1, 0x94, 0x45, 0xd9, 0x04, 0x17, 0x8f, + 0x99, 0x7c, 0xca, 0xf2, 0x0b, 0x6b, 0x6d, 0x3b, 0x26, 0x67, 0xc3, 0x77, 0x0d, 0x38, 0x9b, 0x81, + 0xfb, 0xb1, 0x12, 0x92, 0xbd, 0x09, 0xa5, 0x05, 0xcf, 0x69, 0xd5, 0x5c, 0x37, 0x0e, 0x24, 0x45, + 0x6b, 0xd0, 0x65, 0xd3, 0xc9, 0x61, 0x50, 0x75, 0x31, 0x8d, 0x51, 0xc9, 0x0d, 0x21, 0x14, 0x49, + 0xca, 0x44, 0x99, 0xc1, 0x18, 0x78, 0x9d, 0x92, 0xfc, 0xc5, 0x78, 0xfd, 0x8f, 0x03, 0x93, 0x03, + 0xd2, 0x67, 0x76, 0xe8, 0xb2, 0xaf, 0xff, 0xa5, 0x9b, 0x37, 0xd4, 0xb6, 0xf3, 0x9b, 0x39, 0xb8, + 0x90, 0x4d, 0xf8, 0x71, 0x73, 0xcb, 0x61, 0xc2, 0x0c, 0x25, 0x49, 0x34, 0xe6, 0x96, 0xe3, 0xd9, + 0x35, 0x10, 0x3f, 0x41, 0x20, 0x3b, 0x30, 0xb1, 0xec, 0x84, 0xd1, 0x3d, 0xea, 0x04, 0xd1, 0x36, + 0x75, 0xa2, 0x21, 0x2c, 0xd8, 0xf8, 0xc1, 0x67, 0x5c, 0xd4, 0xf6, 0x24, 0x65, 0xfa, 0xc1, 0x67, + 0x8d, 0x6d, 0x2c, 0x28, 0x85, 0x21, 0x04, 0xe5, 0x1b, 0x30, 0xd5, 0xa0, 0x6d, 0xa7, 0xbb, 0xe7, + 0x07, 0x54, 0xf8, 0xce, 0x6f, 0xc2, 0x44, 0x0c, 0xca, 0x94, 0x16, 0xbd, 0x58, 0xc3, 0x57, 0x3a, + 0x22, 0x51, 0x25, 0x7a, 0xb1, 0xf9, 0x1b, 0x39, 0xb8, 0x58, 0x6b, 0x8a, 0x83, 0x06, 0x51, 0x20, + 0xcf, 0x43, 0x3f, 0xe1, 0x6f, 0x93, 0x59, 0x28, 0x3d, 0x70, 0x1e, 0x2f, 0x53, 0x7c, 0x92, 0x95, + 0x67, 0x28, 0xe2, 0xe6, 0x97, 0xf3, 0xd8, 0x8e, 0xdd, 0x5e, 0x56, 0x82, 0xa3, 0x6e, 0x36, 0x0b, + 0x4f, 0xb8, 0xd9, 0x34, 0x61, 0xf4, 0x9e, 0xdf, 0x72, 0xc5, 0xe2, 0x24, 0xce, 0x2d, 0xf6, 0x10, + 0x62, 0x89, 0x12, 0xf3, 0x07, 0x06, 0x4c, 0xc6, 0x35, 0xc6, 0x2a, 0x7c, 0xe2, 0x5d, 0x72, 0x0d, + 0xc6, 0xf0, 0x43, 0xf1, 0x83, 0x40, 0xb8, 0x68, 0xb4, 0x18, 0xc8, 0xf6, 0x5c, 0x4b, 0x16, 0xaa, + 0x3d, 0x31, 0xf2, 0x64, 0x3d, 0x61, 0xfe, 0x43, 0x3c, 0x12, 0x51, 0x5b, 0xc9, 0x56, 0x22, 0xa5, + 0x22, 0xc6, 0x90, 0x15, 0xc9, 0x3d, 0xb5, 0x21, 0xc9, 0x0f, 0x1c, 0x92, 0x9f, 0xcf, 0xc1, 0x78, + 0x5c, 0xd9, 0x4f, 0xd9, 0xbd, 0xf9, 0xb8, 0x5d, 0x43, 0x45, 0xb1, 0x37, 0x14, 0x5d, 0x21, 0x82, + 0xc5, 0xbf, 0x04, 0xa3, 0x62, 0x32, 0x19, 0xa9, 0x73, 0xc1, 0xd4, 0xe8, 0x26, 0x8f, 0xf6, 0xe2, + 0x80, 0x86, 0x96, 0xa0, 0xc3, 0x6b, 0x02, 0x5b, 0x74, 0x5b, 0x9c, 0x90, 0x3d, 0xb3, 0x6b, 0x54, + 0xf6, 0x35, 0x81, 0xa4, 0x61, 0x43, 0xad, 0x4e, 0x7f, 0xb7, 0x00, 0x95, 0x34, 0xc9, 0xc9, 0x99, + 0x09, 0xd6, 0x7a, 0xdb, 0xe2, 0x4d, 0x0a, 0xcc, 0x4c, 0xd0, 0xed, 0x6d, 0x5b, 0x0c, 0x46, 0xae, + 0x41, 0x61, 0x2d, 0xf0, 0x1e, 0x62, 0xab, 0xc5, 0x93, 0x1c, 0xdd, 0xc0, 0x7b, 0xa8, 0xc6, 0xcb, + 0xb2, 0x72, 0xdc, 0xd0, 0x2e, 0x37, 0x94, 0xf7, 0xd2, 0xf9, 0x86, 0xb6, 0x15, 0xa6, 0x53, 0xe0, + 0x48, 0x34, 0xb6, 0x54, 0xd6, 0xa9, 0x13, 0x88, 0x5b, 0xf4, 0x42, 0x9d, 0xe1, 0x52, 0xb9, 0x8d, + 0x60, 0x9e, 0xdf, 0xd6, 0x52, 0x91, 0x48, 0x0b, 0x88, 0xf2, 0x53, 0x4e, 0xe0, 0x93, 0xf7, 0x78, + 0xf2, 0x29, 0xa9, 0x73, 0x2a, 0x6b, 0x5b, 0x9d, 0xcd, 0x19, 0x7c, 0x9f, 0xa6, 0x8f, 0x70, 0x0d, + 0x4a, 0xe8, 0xf2, 0x42, 0x47, 0x46, 0xf1, 0x44, 0x66, 0x32, 0x36, 0x19, 0x30, 0x9e, 0xc0, 0x8e, + 0xdd, 0x19, 0x09, 0x13, 0xf2, 0x1e, 0x8c, 0xab, 0x01, 0xb5, 0x3c, 0xec, 0xf3, 0x0a, 0xbf, 0x49, + 0x35, 0x20, 0x55, 0x9c, 0x4a, 0x60, 0x7e, 0x4e, 0x95, 0x12, 0xb1, 0x68, 0x1f, 0x2b, 0x25, 0xe6, + 0xaf, 0xa1, 0x19, 0xdf, 0xf6, 0x23, 0x2a, 0xac, 0x97, 0x67, 0x56, 0x8f, 0x25, 0x2e, 0xe4, 0x11, + 0x2d, 0xa6, 0x45, 0x6b, 0xdd, 0x29, 0x5e, 0x0a, 0xff, 0x5d, 0x03, 0xce, 0x67, 0xd2, 0x92, 0x9b, + 0x00, 0x89, 0x8d, 0x28, 0x7a, 0x89, 0x27, 0x0e, 0x8e, 0xa1, 0x96, 0x82, 0x41, 0xbe, 0x96, 0xb6, + 0xee, 0x4e, 0x5e, 0x9c, 0xe4, 0xf3, 0x1a, 0x93, 0xba, 0x75, 0x97, 0x61, 0xd3, 0x99, 0xdf, 0xcd, + 0xc3, 0x74, 0xdf, 0xb3, 0x8c, 0x27, 0x44, 0x11, 0xec, 0xa7, 0x1e, 0xfd, 0xe2, 0xc7, 0x1d, 0x37, + 0x06, 0x3d, 0x0a, 0x99, 0xf1, 0x04, 0x18, 0xba, 0xc5, 0x44, 0xce, 0xea, 0x13, 0x5e, 0x02, 0x0b, + 0xb3, 0x9f, 0x8b, 0xfb, 0xec, 0xc0, 0xaf, 0x3d, 0x85, 0x67, 0xe3, 0xfe, 0x1a, 0xbf, 0xaa, 0xf5, + 0x6b, 0x39, 0x38, 0xdb, 0xd7, 0xe6, 0x67, 0x76, 0xd6, 0x7d, 0x49, 0x5b, 0xdd, 0x5e, 0x18, 0x34, + 0xa6, 0x43, 0x59, 0x11, 0xff, 0xc3, 0x80, 0x8b, 0x03, 0x28, 0xc9, 0x41, 0x5a, 0x88, 0xb8, 0x55, + 0x71, 0xeb, 0xf8, 0x0f, 0x3e, 0x15, 0x51, 0xfa, 0xc4, 0x24, 0xe1, 0xe7, 0x72, 0x00, 0x5b, 0x74, + 0xfb, 0xd9, 0x4e, 0xbb, 0xf4, 0x05, 0x4d, 0x00, 0x14, 0x07, 0xe6, 0xf0, 0x59, 0x97, 0x56, 0xd1, + 0x91, 0x38, 0x7c, 0xce, 0xa5, 0xf8, 0x09, 0x91, 0x5c, 0xf6, 0x13, 0x22, 0xe6, 0x36, 0x9c, 0xbb, + 0x4b, 0xa3, 0x64, 0x25, 0x94, 0x7b, 0xc8, 0xe3, 0xd9, 0xbe, 0x06, 0x25, 0x81, 0xaf, 0xa7, 0x83, + 0x97, 0x21, 0x71, 0x9e, 0x6b, 0x25, 0x08, 0x26, 0x85, 0x8b, 0x0b, 0xb4, 0x45, 0x23, 0xfa, 0xc9, + 0x7e, 0xa6, 0x01, 0x84, 0x37, 0x85, 0xbf, 0x2c, 0x31, 0xd4, 0x17, 0x4e, 0xec, 0x9f, 0x4d, 0x38, + 0x1f, 0xd7, 0xfd, 0x69, 0xf2, 0x9d, 0x65, 0xb6, 0x84, 0xb8, 0x93, 0x98, 0x70, 0x3c, 0xc6, 0x89, + 0xf8, 0x18, 0x2e, 0x4b, 0x82, 0x2d, 0x2f, 0x3e, 0x89, 0x19, 0x8a, 0x96, 0xbc, 0x03, 0xe3, 0x0a, + 0x8d, 0xb8, 0xe0, 0x8c, 0xa7, 0x9d, 0x8f, 0xbc, 0x68, 0xcf, 0x0e, 0x39, 0x5c, 0x3d, 0xed, 0x54, + 0xd0, 0xcd, 0xaf, 0xc2, 0x73, 0x71, 0xdc, 0x4a, 0xc6, 0xa7, 0x53, 0xcc, 0x8d, 0xd3, 0x31, 0x5f, + 0x49, 0x9a, 0xb5, 0xd4, 0x89, 0x23, 0xe0, 0x25, 0x6f, 0xa2, 0x36, 0x4b, 0x34, 0xe6, 0x8a, 0x92, + 0x8e, 0x4e, 0xac, 0x45, 0x09, 0xc0, 0x7c, 0x5b, 0xa9, 0x6c, 0x06, 0x43, 0x8d, 0xd8, 0x48, 0x13, + 0xff, 0x5c, 0x0e, 0xa6, 0x56, 0x97, 0x16, 0xe6, 0x63, 0x37, 0xf2, 0xa7, 0x2c, 0x27, 0x94, 0xd6, + 0xb6, 0xc1, 0xfa, 0xc6, 0xdc, 0x80, 0xb3, 0xa9, 0x6e, 0xc0, 0x87, 0x73, 0xde, 0xe3, 0xf1, 0x25, + 0x31, 0x58, 0xae, 0x2c, 0x17, 0xb2, 0xd8, 0x6f, 0xde, 0xb6, 0x52, 0xd8, 0xe6, 0x77, 0x47, 0x53, + 0x7c, 0x85, 0x0a, 0x7b, 0x0d, 0x4a, 0x4b, 0x61, 0xd8, 0xa3, 0xc1, 0x86, 0xb5, 0xac, 0xda, 0x88, + 0x1e, 0x02, 0xed, 0x5e, 0xd0, 0xb2, 0x12, 0x04, 0xf2, 0x2a, 0x14, 0xc5, 0x3d, 0x38, 0xa9, 0x13, + 0xf0, 0xb8, 0x3c, 0xbe, 0x46, 0x67, 0xc5, 0xc5, 0xe4, 0x0d, 0x28, 0xf3, 0xff, 0xb9, 0xb4, 0x89, + 0x0e, 0x47, 0x5f, 0x95, 0x40, 0xe7, 0xd2, 0x69, 0x69, 0x68, 0x6c, 0x67, 0x26, 0x5f, 0xe6, 0x64, + 0x35, 0x2a, 0x24, 0x3b, 0x33, 0xf9, 0x88, 0x27, 0xd6, 0x49, 0x45, 0x22, 0x37, 0x20, 0x5f, 0x9b, + 0xb7, 0xd4, 0x0c, 0xd8, 0x4e, 0x33, 0xe0, 0x19, 0xe4, 0xb5, 0xc7, 0xaf, 0x6a, 0xf3, 0x16, 0x99, + 0x83, 0x22, 0x3e, 0x6e, 0xe2, 0xd2, 0x40, 0x44, 0xbd, 0xa2, 0xd4, 0x74, 0x05, 0x4c, 0x3d, 0x79, + 0x94, 0x78, 0x64, 0x16, 0xc6, 0x16, 0xbc, 0xb0, 0xdb, 0x72, 0x0e, 0x44, 0x32, 0x18, 0x3c, 0x0c, + 0x71, 0x39, 0x48, 0x95, 0x33, 0x81, 0x45, 0x5e, 0x85, 0x91, 0x46, 0xd3, 0xef, 0xb2, 0xdd, 0x56, + 0x1c, 0xda, 0x12, 0x32, 0x80, 0x96, 0x01, 0x82, 0x01, 0xf0, 0x6a, 0x36, 0xbf, 0x61, 0x56, 0x52, + 0xae, 0x66, 0xa7, 0x6f, 0x96, 0x09, 0x9c, 0xfe, 0xe0, 0x43, 0x78, 0x9a, 0xc1, 0x87, 0xdb, 0x70, + 0xf1, 0x2e, 0x9a, 0xfa, 0x0d, 0x1a, 0x60, 0xfe, 0x4d, 0xfe, 0x50, 0xd2, 0x86, 0xb5, 0x24, 0x6e, + 0xd5, 0xe1, 0x1d, 0x27, 0xbe, 0x1b, 0xb0, 0x43, 0x8e, 0x23, 0xdf, 0x58, 0x4a, 0xbd, 0x0e, 0x31, + 0x88, 0x11, 0xf9, 0x32, 0x9c, 0xcb, 0x2a, 0x12, 0xf7, 0xeb, 0x30, 0xae, 0x3d, 0xfb, 0x03, 0x6a, + 0x60, 0x79, 0x16, 0x07, 0xb2, 0x0c, 0x15, 0x0e, 0xaf, 0xb9, 0x6d, 0xaf, 0xb3, 0xd8, 0x76, 0xbc, + 0x16, 0xde, 0xb6, 0x13, 0x57, 0x26, 0x05, 0x57, 0x87, 0x15, 0xda, 0x94, 0x95, 0x6a, 0xd1, 0x49, + 0x29, 0x4a, 0x54, 0x47, 0x8d, 0xda, 0x83, 0xe5, 0x64, 0x4e, 0x7d, 0xba, 0xce, 0x8d, 0xb4, 0xb6, + 0x1d, 0x73, 0x6e, 0xb4, 0x01, 0x67, 0x53, 0xdd, 0x20, 0xd5, 0x91, 0x06, 0x4e, 0xab, 0xa3, 0x14, + 0x8d, 0x95, 0xc2, 0x36, 0xff, 0xe3, 0x68, 0x8a, 0xaf, 0xf0, 0x15, 0x99, 0x30, 0xca, 0xb5, 0x8d, + 0x9a, 0x2d, 0x8e, 0xeb, 0x22, 0x4b, 0x94, 0x90, 0x4b, 0x90, 0x6f, 0x34, 0x56, 0xd5, 0x5c, 0x96, + 0x61, 0xe8, 0x5b, 0x0c, 0xc6, 0x46, 0x08, 0xdd, 0x40, 0xca, 0x15, 0xb3, 0x26, 0x0d, 0x22, 0xf1, + 0x74, 0xeb, 0xcb, 0xc9, 0x3c, 0x2e, 0x24, 0xfd, 0x2d, 0xe6, 0x71, 0x32, 0x7b, 0xe7, 0x61, 0xa6, + 0x16, 0x86, 0x34, 0x88, 0x78, 0x02, 0xfe, 0xb0, 0xd7, 0xa6, 0x81, 0x90, 0x35, 0xa1, 0x63, 0xf8, + 0xc3, 0xef, 0xcd, 0xd0, 0x1a, 0x88, 0x48, 0xae, 0x43, 0xb1, 0xd6, 0x73, 0x3d, 0xda, 0x69, 0x6a, + 0xd1, 0xf5, 0x8e, 0x80, 0x59, 0x71, 0x29, 0xf9, 0x10, 0xce, 0x0b, 0x22, 0xa9, 0x70, 0x44, 0x0f, + 0x70, 0x5d, 0xc3, 0x77, 0xb0, 0x62, 0x2e, 0x48, 0x35, 0x65, 0x8b, 0x2e, 0xc9, 0xa6, 0x24, 0x35, + 0xa8, 0x2c, 0xe2, 0x39, 0xa9, 0x7c, 0xc0, 0xd9, 0x0f, 0x44, 0xa2, 0x65, 0xd4, 0x5c, 0xfc, 0x0c, + 0xd5, 0x76, 0xe3, 0x42, 0xab, 0x0f, 0x9d, 0xdc, 0x87, 0xb3, 0x69, 0x18, 0xd3, 0xc7, 0xa5, 0xe4, + 0x81, 0xb5, 0x3e, 0x2e, 0xa8, 0x98, 0xb3, 0xa8, 0xc8, 0x36, 0x4c, 0xd7, 0xa2, 0x28, 0xf0, 0xb6, + 0x7b, 0x11, 0x4d, 0xa9, 0x2e, 0xe9, 0x68, 0x8c, 0xcb, 0xa5, 0xfa, 0x7a, 0x4e, 0x08, 0xe3, 0x59, + 0x27, 0xa6, 0x8c, 0x55, 0x98, 0xd5, 0xcf, 0x8e, 0xb8, 0xf1, 0x1b, 0x8d, 0xe2, 0x1d, 0x43, 0x71, + 0x25, 0x4a, 0x3a, 0x74, 0x6b, 0xe1, 0x41, 0xbb, 0x4d, 0xa3, 0x00, 0x4f, 0xee, 0xf1, 0x9d, 0x43, + 0x53, 0xc4, 0x00, 0x5d, 0x56, 0x9e, 0x26, 0xc5, 0xb7, 0x2c, 0xb5, 0xf0, 0x48, 0x8d, 0xa7, 0xb6, + 0x7c, 0x94, 0x87, 0x5c, 0x3e, 0x5a, 0x30, 0xbd, 0xd8, 0x69, 0x06, 0x07, 0x78, 0x37, 0x53, 0x56, + 0x6e, 0xe2, 0x84, 0xca, 0xc9, 0x47, 0x4c, 0xae, 0x38, 0x52, 0xc2, 0xb2, 0xaa, 0xd7, 0xcf, 0xd8, + 0xfc, 0xff, 0xa0, 0x92, 0xee, 0xcb, 0x27, 0x7c, 0x98, 0xfa, 0x34, 0xa1, 0xd9, 0x6c, 0xa4, 0xd3, + 0x6d, 0x21, 0xb3, 0xda, 0xeb, 0xc3, 0x46, 0x72, 0x7b, 0x5f, 0x79, 0x27, 0x58, 0x7b, 0x73, 0x58, + 0x4e, 0xe3, 0x5c, 0xd6, 0x34, 0x36, 0x7f, 0x21, 0x07, 0xd3, 0x3c, 0x9a, 0xf4, 0xd9, 0xb7, 0x15, + 0xdf, 0xd3, 0x94, 0xb3, 0xf4, 0x05, 0xa6, 0x5a, 0x77, 0x8c, 0xb5, 0xf8, 0x75, 0x38, 0xdf, 0xd7, + 0x15, 0xa8, 0xa0, 0x17, 0x64, 0x1c, 0x6f, 0x9f, 0x8a, 0x9e, 0xc9, 0xfe, 0xc8, 0xe6, 0x6d, 0xab, + 0x8f, 0xc2, 0xfc, 0xfb, 0xb9, 0x3e, 0xfe, 0xc2, 0x6e, 0x54, 0x2d, 0x41, 0xe3, 0x74, 0x96, 0x60, + 0xee, 0x63, 0x59, 0x82, 0xf9, 0x61, 0x2c, 0xc1, 0x0f, 0x61, 0x62, 0x9d, 0x3a, 0xcc, 0xa2, 0x11, + 0xd7, 0xe5, 0x0a, 0xda, 0xcb, 0xc0, 0xac, 0x4c, 0xea, 0x97, 0xf8, 0xaa, 0x6d, 0xc4, 0x08, 0x98, + 0x6a, 0xe1, 0xf7, 0xe7, 0x2c, 0x9d, 0x83, 0xba, 0x68, 0x8c, 0x0c, 0x5e, 0x34, 0xcc, 0x00, 0xc6, + 0x1b, 0x8d, 0xd5, 0x2d, 0x27, 0x60, 0xda, 0x22, 0x64, 0x26, 0xa3, 0x0c, 0x13, 0x35, 0x12, 0xc5, + 0xdb, 0x1f, 0x1f, 0x2a, 0xb1, 0x98, 0x62, 0x91, 0xc4, 0x22, 0xa4, 0x82, 0x47, 0xc4, 0x09, 0x98, + 0x16, 0x11, 0x27, 0x60, 0xe6, 0xdf, 0x2b, 0x40, 0x85, 0x87, 0x3e, 0xb2, 0x7d, 0xaf, 0x48, 0xd1, + 0xd3, 0xf7, 0x34, 0x82, 0x71, 0xfa, 0xa7, 0x11, 0x3e, 0x46, 0x8c, 0xad, 0x72, 0x17, 0x3b, 0x3f, + 0xc4, 0x5d, 0xec, 0xb7, 0xb4, 0x8b, 0xcc, 0x85, 0xe4, 0xed, 0xcd, 0xfd, 0xde, 0x36, 0x3d, 0xfe, + 0x0a, 0xf3, 0x9b, 0xea, 0x8d, 0xe3, 0x91, 0x24, 0xfa, 0x04, 0x29, 0x8f, 0xb9, 0x6b, 0x1c, 0x6b, + 0xb1, 0xd1, 0xd3, 0xc4, 0x9b, 0x8f, 0xfd, 0x3f, 0x8d, 0x37, 0x5f, 0x04, 0x50, 0xf2, 0xb6, 0x14, + 0x93, 0x27, 0x38, 0x4f, 0xce, 0xd9, 0xa2, 0x10, 0x9a, 0xff, 0xa1, 0x08, 0xd3, 0x8d, 0xc6, 0xea, + 0x82, 0xe7, 0xec, 0x76, 0xfc, 0x30, 0xf2, 0x9a, 0x4b, 0x9d, 0x1d, 0x9f, 0x4d, 0xe1, 0x75, 0x1a, + 0x46, 0x77, 0x5a, 0xfe, 0x23, 0x35, 0xf6, 0x39, 0xa2, 0x61, 0x64, 0xef, 0xb4, 0xfc, 0x47, 0x56, + 0x5c, 0xcc, 0x96, 0x88, 0xc5, 0x20, 0x88, 0x5f, 0xfb, 0xc0, 0x25, 0x82, 0x32, 0x80, 0xc5, 0xe1, + 0x6c, 0x96, 0x34, 0x7a, 0x3c, 0x01, 0x07, 0xcf, 0xb9, 0x86, 0xb3, 0x24, 0xe4, 0x20, 0x4b, 0x96, + 0x11, 0xda, 0x2f, 0xb0, 0x42, 0x6b, 0x5e, 0xd4, 0xa2, 0xd6, 0x93, 0x62, 0xf1, 0x6c, 0x1c, 0x42, + 0x71, 0x74, 0xed, 0x2e, 0xc2, 0x55, 0xe3, 0xbd, 0x6f, 0x0e, 0x44, 0x70, 0x9e, 0x19, 0x97, 0xfd, + 0x36, 0xc7, 0xc8, 0xf1, 0x36, 0xc7, 0xcb, 0x42, 0x27, 0x3c, 0x9f, 0x61, 0x73, 0xa8, 0x8f, 0x01, + 0x64, 0x32, 0x27, 0xbf, 0x60, 0xc0, 0xf3, 0x99, 0x25, 0xf1, 0xc4, 0xd6, 0x2f, 0x0d, 0x28, 0xfa, + 0x02, 0xf3, 0x95, 0x7c, 0x16, 0x6f, 0x69, 0x64, 0x7c, 0xda, 0xce, 0xd0, 0x02, 0xc7, 0x7f, 0x89, + 0xfc, 0x4b, 0x03, 0x2e, 0x6a, 0x18, 0x98, 0x6f, 0xb0, 0x4d, 0x3b, 0x27, 0x89, 0xf4, 0x47, 0x4f, + 0x47, 0xa4, 0x5f, 0xd4, 0xdb, 0xc2, 0x93, 0x2f, 0xe3, 0xe7, 0xd5, 0x4d, 0xe2, 0x80, 0x1a, 0x92, + 0x1f, 0x87, 0x69, 0x2c, 0x92, 0xa6, 0x0f, 0x13, 0x57, 0x94, 0xfe, 0x72, 0x7d, 0xee, 0xcf, 0x0e, + 0xab, 0x13, 0x5a, 0x01, 0xde, 0x28, 0xc4, 0xaf, 0xc5, 0x96, 0x92, 0xd7, 0xd9, 0xf1, 0xb5, 0x44, + 0xa2, 0x69, 0x66, 0xe4, 0xdf, 0x18, 0x30, 0xc3, 0xa0, 0xbc, 0xc2, 0x77, 0x02, 0xbf, 0x1d, 0x97, + 0x9f, 0x90, 0x27, 0xa0, 0xf5, 0x74, 0x3a, 0xe8, 0x65, 0xac, 0x32, 0x9f, 0xf8, 0xf6, 0x4e, 0xe0, + 0xb7, 0x93, 0xea, 0x6b, 0xb9, 0x42, 0x06, 0x55, 0x92, 0xfc, 0xac, 0x01, 0x97, 0xb4, 0x1d, 0x94, + 0x7a, 0x1f, 0x2f, 0xe5, 0x17, 0x50, 0x8b, 0xea, 0x37, 0x85, 0x90, 0x5f, 0xc3, 0x1a, 0x24, 0x4b, + 0x02, 0xd6, 0xc5, 0x6e, 0x73, 0x2c, 0xa5, 0x0a, 0x83, 0xbf, 0x62, 0x7e, 0x33, 0x07, 0xe3, 0xca, + 0x9a, 0x4a, 0x3e, 0x0f, 0xe5, 0xd5, 0x60, 0xd7, 0xe9, 0x78, 0x3f, 0xe1, 0x28, 0x67, 0x8e, 0xb8, + 0x66, 0xfb, 0x0a, 0xdc, 0xd2, 0xb0, 0x30, 0x56, 0x94, 0x3a, 0x6d, 0xd5, 0xda, 0x63, 0x6b, 0xb2, + 0x85, 0xd0, 0x53, 0xae, 0x2b, 0xef, 0x67, 0xac, 0x2b, 0xa7, 0x4a, 0x90, 0xf1, 0x4e, 0xff, 0xea, + 0x32, 0x7c, 0x3e, 0x0b, 0xf3, 0x97, 0x72, 0x50, 0x11, 0x0f, 0xc7, 0xcb, 0x13, 0xb3, 0x4f, 0xd7, + 0x43, 0x53, 0x7a, 0xe3, 0x8e, 0x89, 0x09, 0x29, 0xfc, 0xfa, 0x6f, 0x57, 0xf1, 0x19, 0xf0, 0x74, + 0x77, 0xc8, 0x67, 0xc0, 0x75, 0x78, 0xfa, 0xba, 0x5c, 0x9a, 0xca, 0x4a, 0xe3, 0x9b, 0x7f, 0x92, + 0x4b, 0xf3, 0x16, 0x2e, 0x84, 0x97, 0x61, 0x8c, 0xbf, 0xfb, 0x29, 0x6f, 0xf4, 0x88, 0xc4, 0x8e, + 0x08, 0xb2, 0x64, 0xd9, 0x69, 0x2e, 0x4e, 0x9e, 0xf4, 0x16, 0x3c, 0x79, 0x13, 0xca, 0x18, 0x24, + 0x59, 0x73, 0xdd, 0x80, 0x2d, 0x81, 0x85, 0x24, 0x87, 0xe3, 0x23, 0xba, 0x6d, 0xf3, 0x60, 0x4a, + 0xc7, 0x75, 0x03, 0x4b, 0xc3, 0x23, 0xf3, 0x70, 0x4e, 0x8b, 0xc9, 0x95, 0xf4, 0x23, 0xc9, 0x16, + 0x29, 0xc2, 0x02, 0x4e, 0x9c, 0x89, 0x8c, 0x69, 0x83, 0xf9, 0xb3, 0xfc, 0x68, 0xd9, 0xe8, 0xf9, + 0xef, 0xe4, 0xa4, 0x97, 0x07, 0xf5, 0x04, 0x13, 0x4f, 0xb4, 0x9d, 0xae, 0x96, 0xcb, 0x85, 0x23, + 0x9a, 0x7f, 0x61, 0xb0, 0xb9, 0xd6, 0xdc, 0xff, 0x94, 0x5d, 0xe9, 0x64, 0x4d, 0x3a, 0xc6, 0xc3, + 0xf5, 0xc7, 0x06, 0xbf, 0x94, 0x25, 0xc4, 0xe7, 0x2d, 0x18, 0xe5, 0xaf, 0x8c, 0x8a, 0xeb, 0x43, + 0x2a, 0x17, 0x5e, 0x90, 0x04, 0x65, 0xf0, 0xb7, 0x4a, 0x2d, 0x41, 0xa0, 0x1a, 0xfd, 0xb9, 0xa1, + 0x8c, 0x7e, 0x25, 0x09, 0xfa, 0x70, 0x8f, 0x6b, 0x18, 0x27, 0x27, 0x41, 0x37, 0xff, 0x4f, 0x8e, + 0xb7, 0x47, 0x54, 0x6a, 0xd8, 0x6c, 0xbc, 0xd7, 0xa0, 0x80, 0xef, 0xd9, 0x2b, 0x29, 0x8f, 0x53, + 0x6f, 0xd9, 0x63, 0x39, 0x9b, 0x37, 0xa8, 0x6b, 0xd5, 0x5b, 0xc4, 0xa8, 0x8e, 0xd5, 0x79, 0x83, + 0x18, 0xf8, 0x74, 0x85, 0xef, 0x52, 0x75, 0x3a, 0x74, 0xf4, 0x57, 0x46, 0xb0, 0x9c, 0x59, 0xf4, + 0xf1, 0x65, 0x1e, 0xd5, 0x8b, 0xdf, 0xde, 0x71, 0x6c, 0x7e, 0x89, 0x44, 0xd5, 0xb6, 0xc9, 0xbd, + 0x9f, 0x45, 0x98, 0xd4, 0x53, 0x8c, 0x08, 0x4f, 0x1b, 0xa6, 0x05, 0x48, 0xa5, 0x27, 0x51, 0x7d, + 0x3a, 0x3a, 0x11, 0xdb, 0x31, 0x69, 0x79, 0x24, 0xd4, 0x8c, 0xef, 0x3c, 0x75, 0x9c, 0xdd, 0x9f, + 0x00, 0x49, 0x27, 0x51, 0x4e, 0x89, 0x3f, 0x07, 0x15, 0x31, 0x33, 0xe3, 0x0b, 0xdd, 0xe8, 0xcf, + 0x58, 0x5a, 0xb0, 0xd4, 0xd9, 0xd4, 0xf4, 0xdc, 0xc0, 0x42, 0xa8, 0xf9, 0x1d, 0x03, 0x2e, 0x89, + 0xd7, 0x53, 0x2d, 0x1a, 0x46, 0x81, 0xc7, 0xef, 0x87, 0xa3, 0x3c, 0x7e, 0x9e, 0xbc, 0x23, 0xb3, + 0x52, 0xea, 0x0a, 0x32, 0xfd, 0x8d, 0xfa, 0x84, 0x10, 0xca, 0x11, 0xcc, 0x4b, 0x29, 0xb3, 0x51, + 0xbe, 0x25, 0xb2, 0x51, 0xe6, 0x8e, 0x27, 0x8e, 0xe7, 0x85, 0x4b, 0x3b, 0x32, 0x0b, 0xe5, 0xb7, + 0x73, 0x70, 0x3e, 0xa3, 0x5a, 0x9b, 0x9f, 0x7f, 0x46, 0x95, 0x43, 0x5d, 0x53, 0x0e, 0x32, 0x5d, + 0xf1, 0xc0, 0x8e, 0xcf, 0xd4, 0x15, 0xbf, 0x69, 0xc0, 0x45, 0x5d, 0x7a, 0x84, 0x03, 0x76, 0xf3, + 0x36, 0x79, 0x1b, 0x46, 0xef, 0x51, 0xc7, 0xa5, 0xf2, 0xde, 0x61, 0x9c, 0xfa, 0x53, 0x1c, 0x89, + 0xf2, 0x42, 0xce, 0xf6, 0x4f, 0xf8, 0x54, 0x3e, 0x63, 0x09, 0x12, 0xb2, 0x20, 0x2a, 0xc7, 0x63, + 0x32, 0x4c, 0x19, 0x9e, 0x90, 0xf5, 0xa9, 0x63, 0xbc, 0x41, 0xbf, 0x6b, 0xc0, 0x73, 0xc7, 0xd0, + 0xb0, 0x81, 0x63, 0x43, 0xaf, 0x0e, 0x1c, 0x2e, 0x2c, 0x08, 0x25, 0xef, 0xc1, 0xd4, 0xba, 0x30, + 0x5d, 0xe5, 0x70, 0x28, 0x4f, 0xc9, 0x48, 0xab, 0xd6, 0x96, 0xe3, 0x92, 0x46, 0x26, 0xd7, 0xa1, + 0x78, 0xcf, 0x0f, 0xa3, 0x4e, 0x92, 0xe3, 0x0d, 0x5d, 0xde, 0x7b, 0x02, 0x66, 0xc5, 0xa5, 0xcc, + 0x2c, 0xd0, 0xab, 0x29, 0x62, 0x00, 0x5f, 0x84, 0x51, 0x86, 0x13, 0xbb, 0x94, 0x50, 0x0e, 0xf0, + 0x6d, 0x4f, 0xcf, 0xb5, 0x44, 0x51, 0xec, 0xcc, 0xcc, 0x65, 0x1e, 0xd5, 0x7f, 0xd3, 0x80, 0x8a, + 0xce, 0xfb, 0x49, 0x87, 0xe6, 0x5d, 0x6d, 0x68, 0x9e, 0xcb, 0x1e, 0x9a, 0xc1, 0x63, 0xd2, 0x97, + 0x6e, 0x69, 0xa8, 0xb1, 0x30, 0x61, 0x74, 0xc1, 0x6f, 0x3b, 0x5e, 0x47, 0x4d, 0x11, 0xe4, 0x22, + 0xc4, 0x12, 0x25, 0x4a, 0x6f, 0xe5, 0x07, 0xf6, 0x96, 0xf9, 0xcb, 0x05, 0xb8, 0x64, 0xd1, 0x5d, + 0x8f, 0x19, 0x48, 0x1b, 0xa1, 0xd7, 0xd9, 0xd5, 0x02, 0x29, 0xcc, 0x54, 0x87, 0x8b, 0xf0, 0x71, + 0x06, 0x89, 0xfb, 0xfb, 0x55, 0x28, 0x32, 0x2d, 0xad, 0xf4, 0x39, 0xba, 0x09, 0x30, 0xd1, 0x1d, + 0x1f, 0x57, 0x59, 0x4c, 0x6e, 0x88, 0x35, 0x44, 0xb9, 0xe0, 0xc3, 0xd6, 0x90, 0x1f, 0x1e, 0x56, + 0x81, 0xbf, 0xe5, 0xc0, 0x4a, 0xc5, 0x3a, 0x12, 0x1b, 0x55, 0x85, 0x01, 0x46, 0xd5, 0x03, 0x38, + 0x57, 0x73, 0xb9, 0x7e, 0x72, 0x5a, 0x6b, 0x81, 0xd7, 0x69, 0x7a, 0x5d, 0xa7, 0x25, 0x8d, 0x72, + 0x74, 0x16, 0x39, 0x71, 0xb9, 0xdd, 0x8d, 0x11, 0xac, 0x4c, 0x32, 0xd6, 0x8c, 0x85, 0x95, 0x06, + 0xcf, 0x63, 0xc6, 0x3d, 0x40, 0xd8, 0x0c, 0xb7, 0x13, 0xf2, 0x44, 0x66, 0x56, 0x5c, 0x8c, 0xe6, + 0x1c, 0xde, 0xf1, 0x5b, 0x5f, 0x6e, 0xdc, 0x17, 0x77, 0xe6, 0x64, 0xfc, 0x31, 0xbf, 0x12, 0x18, + 0xb5, 0x42, 0x74, 0x5a, 0x6b, 0x78, 0x09, 0x5d, 0xa3, 0x71, 0x8f, 0xd1, 0x15, 0xfb, 0xe8, 0xc2, + 0x70, 0x4f, 0xa5, 0xe3, 0x78, 0x64, 0x16, 0x80, 0x47, 0x70, 0xa2, 0x40, 0x94, 0x12, 0xe3, 0x2f, + 0x40, 0x28, 0x37, 0xfe, 0x14, 0x14, 0xf2, 0x0e, 0x9c, 0x5d, 0x9c, 0x9f, 0x93, 0x97, 0xe1, 0x16, + 0xfc, 0x66, 0x8f, 0xed, 0x9b, 0xf1, 0x72, 0x66, 0x99, 0x8f, 0x21, 0x6d, 0xce, 0x31, 0x29, 0xc8, + 0x42, 0x13, 0x57, 0xe2, 0xf8, 0x85, 0xea, 0x79, 0xdf, 0xa5, 0xe1, 0xe6, 0xad, 0x4f, 0xd9, 0x95, + 0x38, 0xa5, 0x6d, 0x38, 0xdb, 0x6e, 0x65, 0xce, 0xcc, 0xbf, 0x85, 0x57, 0xe2, 0xfa, 0x70, 0xc9, + 0x8f, 0xc0, 0x08, 0xfe, 0x14, 0x2b, 0xee, 0xd9, 0x0c, 0xb6, 0xc9, 0x6a, 0xdb, 0xe4, 0x29, 0xa9, + 0x90, 0x80, 0x2c, 0x25, 0x2f, 0xe5, 0x9c, 0xe2, 0x62, 0x87, 0xc8, 0xca, 0xa0, 0x3f, 0x91, 0xe6, + 0x42, 0x59, 0xfd, 0x20, 0x93, 0x91, 0x7b, 0x4e, 0xb8, 0x47, 0xdd, 0x79, 0xf9, 0xb0, 0x72, 0x99, + 0xcb, 0xc8, 0x1e, 0x42, 0xf1, 0xf9, 0x36, 0x4b, 0x41, 0x61, 0xda, 0x61, 0x29, 0xdc, 0x08, 0x45, + 0x55, 0xc4, 0x2e, 0xc8, 0xc3, 0xdd, 0xab, 0x6b, 0x89, 0x22, 0xd4, 0x96, 0xd2, 0x4f, 0x18, 0x38, + 0xcd, 0x7d, 0x1a, 0x6c, 0xde, 0xfa, 0x24, 0xb4, 0xa5, 0xfe, 0x8d, 0x63, 0xc6, 0xe4, 0x57, 0x8a, + 0x71, 0x46, 0x35, 0x0d, 0x99, 0xd9, 0x88, 0x49, 0x38, 0x9a, 0x91, 0xd8, 0x88, 0x49, 0x38, 0x9a, + 0x6a, 0x23, 0xc6, 0xa8, 0x71, 0x5a, 0xfd, 0xdc, 0x09, 0x69, 0xf5, 0x07, 0xbc, 0xe4, 0x21, 0x6f, + 0x32, 0x7c, 0x8a, 0x1e, 0x49, 0xfa, 0x22, 0x94, 0x6b, 0x51, 0xe4, 0x34, 0xf7, 0xa8, 0x8b, 0xcf, + 0x37, 0x28, 0x51, 0x30, 0x8e, 0x80, 0xab, 0x31, 0xd2, 0x2a, 0xae, 0xf2, 0x48, 0xda, 0xd8, 0x10, + 0x8f, 0xa4, 0xcd, 0xc2, 0xd8, 0x52, 0xe7, 0xa1, 0xc7, 0xfa, 0xa4, 0x98, 0x64, 0x44, 0xf2, 0x38, + 0x48, 0x7f, 0x59, 0x0b, 0x41, 0xe4, 0x2d, 0xc5, 0x82, 0x28, 0x25, 0xa6, 0x3c, 0xdf, 0x66, 0xd9, + 0xd2, 0x90, 0x50, 0x8f, 0x1f, 0x24, 0x3a, 0x79, 0x13, 0xc6, 0xe4, 0xee, 0x19, 0x12, 0xf3, 0x5d, + 0x50, 0x3a, 0xbc, 0x44, 0x4b, 0xc2, 0x24, 0x76, 0xcf, 0xef, 0xe8, 0x97, 0x26, 0xc7, 0x95, 0x64, + 0x24, 0xca, 0xa5, 0x49, 0x2d, 0x19, 0x89, 0x72, 0x7d, 0x32, 0xde, 0x0c, 0x95, 0x4f, 0xdc, 0x0c, + 0x6d, 0x42, 0x79, 0xcd, 0x09, 0x22, 0x8f, 0x2d, 0x47, 0x9d, 0x88, 0x67, 0xc3, 0x4c, 0xf6, 0xea, + 0x4a, 0x51, 0xfd, 0x05, 0x99, 0x94, 0xa3, 0xab, 0xe0, 0xeb, 0xd9, 0x1c, 0x12, 0x38, 0x59, 0xc9, + 0x08, 0xab, 0x17, 0x19, 0xa2, 0xd1, 0x75, 0xae, 0xa6, 0x23, 0xe6, 0xa5, 0xaa, 0x67, 0xb4, 0x3f, + 0x22, 0xff, 0x36, 0x1f, 0x03, 0xdc, 0x33, 0x4e, 0x21, 0x1b, 0x4c, 0xa9, 0x85, 0x76, 0x45, 0x6a, + 0xe3, 0x18, 0x23, 0x92, 0xaf, 0x41, 0x99, 0xfd, 0x8f, 0xa9, 0x01, 0x3d, 0xca, 0xb3, 0x5d, 0x26, + 0x61, 0xd6, 0xfa, 0x84, 0xe6, 0xf9, 0x03, 0x1b, 0x34, 0xe2, 0x13, 0x18, 0x19, 0xa7, 0x1d, 0x2f, + 0x1a, 0x37, 0xf3, 0x07, 0x06, 0x5c, 0x1c, 0xc0, 0x63, 0xe8, 0xe7, 0x11, 0x67, 0x93, 0x05, 0x49, + 0xd9, 0x9b, 0x8b, 0x05, 0x49, 0x15, 0x0c, 0xb9, 0x34, 0x65, 0xe7, 0xa9, 0xcc, 0x7f, 0x62, 0x79, + 0x2a, 0xcd, 0x43, 0x03, 0xc6, 0x95, 0x91, 0x7d, 0x8a, 0xaf, 0x14, 0x5d, 0x13, 0x09, 0x9b, 0xf3, + 0x09, 0x5e, 0x3b, 0xb5, 0x0f, 0xc7, 0x04, 0xcd, 0x5f, 0x07, 0x58, 0x76, 0xc2, 0xa8, 0xd6, 0x8c, + 0xbc, 0x87, 0x74, 0x08, 0x35, 0x96, 0x64, 0xa7, 0x71, 0x30, 0xcb, 0x3a, 0x23, 0xeb, 0xcb, 0x4e, + 0x13, 0x33, 0x34, 0x57, 0x60, 0xb4, 0xe1, 0x07, 0x51, 0xfd, 0x80, 0xaf, 0x4d, 0x0b, 0x34, 0x6c, + 0xaa, 0x1e, 0x3a, 0x0f, 0xf7, 0xea, 0x4d, 0x4b, 0x14, 0x31, 0x03, 0xf1, 0x8e, 0x47, 0x5b, 0xae, + 0x7a, 0xe6, 0xb4, 0xc3, 0x00, 0x16, 0x87, 0xdf, 0x78, 0x1f, 0xa6, 0x64, 0xce, 0xd8, 0xf5, 0xe5, + 0x06, 0xb6, 0x60, 0x0a, 0xc6, 0x37, 0x17, 0xad, 0xa5, 0x3b, 0x5f, 0xb1, 0xef, 0x6c, 0x2c, 0x2f, + 0x57, 0xce, 0x90, 0x09, 0x28, 0x09, 0xc0, 0x7c, 0xad, 0x62, 0x90, 0x32, 0x14, 0x97, 0x56, 0x1a, + 0x8b, 0xf3, 0x1b, 0xd6, 0x62, 0x25, 0x77, 0xe3, 0x65, 0x98, 0x4c, 0x82, 0x0e, 0x30, 0x31, 0xc1, + 0x18, 0xe4, 0xad, 0xda, 0x56, 0xe5, 0x0c, 0x01, 0x18, 0x5d, 0xbb, 0x3f, 0xdf, 0xb8, 0x75, 0xab, + 0x62, 0xdc, 0xf8, 0x1c, 0x4c, 0xa3, 0xd7, 0x6e, 0x99, 0x19, 0xd1, 0x1d, 0x1a, 0xe0, 0x97, 0xca, + 0x50, 0x6c, 0xd0, 0xae, 0x13, 0x38, 0x11, 0xe5, 0x9f, 0x79, 0xd0, 0x6b, 0x45, 0x5e, 0xb7, 0x45, + 0x1f, 0x57, 0x8c, 0x1b, 0x6f, 0xc1, 0x94, 0xe5, 0xf7, 0x22, 0xaf, 0xb3, 0x2b, 0xf3, 0xcb, 0x93, + 0xf3, 0x30, 0xbd, 0xb1, 0x52, 0x7b, 0x50, 0x5f, 0xba, 0xbb, 0xb1, 0xba, 0xd1, 0xb0, 0x1f, 0xd4, + 0xd6, 0xe7, 0xef, 0x55, 0xce, 0xb0, 0x0a, 0x3f, 0x58, 0x6d, 0xac, 0xdb, 0xd6, 0xe2, 0xfc, 0xe2, + 0xca, 0x7a, 0xc5, 0xb8, 0xf1, 0x8b, 0x06, 0x4c, 0xea, 0x4f, 0xef, 0x92, 0xab, 0x70, 0x65, 0xa3, + 0xb1, 0x68, 0xd9, 0xeb, 0xab, 0xf7, 0x17, 0x57, 0xec, 0x8d, 0x46, 0xed, 0xee, 0xa2, 0xbd, 0xb1, + 0xd2, 0x58, 0x5b, 0x9c, 0x5f, 0xba, 0xb3, 0xb4, 0xb8, 0x50, 0x39, 0x43, 0xaa, 0xf0, 0x9c, 0x82, + 0x61, 0x2d, 0xce, 0xaf, 0x6e, 0x2e, 0x5a, 0xf6, 0x5a, 0xad, 0xd1, 0xd8, 0x5a, 0xb5, 0x16, 0x2a, + 0x06, 0xb9, 0x0c, 0x17, 0x32, 0x10, 0x1e, 0xdc, 0xa9, 0x55, 0x72, 0x7d, 0x65, 0x2b, 0x8b, 0x5b, + 0xb5, 0x65, 0xbb, 0xbe, 0xba, 0x5e, 0xc9, 0xdf, 0x78, 0x9f, 0x59, 0x21, 0xc9, 0x5b, 0x56, 0xa4, + 0x08, 0x85, 0x95, 0xd5, 0x95, 0xc5, 0xca, 0x19, 0x32, 0x0e, 0x63, 0x6b, 0x8b, 0x2b, 0x0b, 0x4b, + 0x2b, 0x77, 0x79, 0xb7, 0xd6, 0xd6, 0xd6, 0xac, 0xd5, 0xcd, 0xc5, 0x85, 0x4a, 0x8e, 0xf5, 0xdd, + 0xc2, 0xe2, 0x0a, 0xab, 0x59, 0xfe, 0x86, 0xc9, 0xdf, 0x6f, 0xd0, 0x12, 0x83, 0xb3, 0xde, 0x5a, + 0xfc, 0xf2, 0xfa, 0xe2, 0x4a, 0x63, 0x69, 0x75, 0xa5, 0x72, 0xe6, 0xc6, 0x95, 0x14, 0x8e, 0x1c, + 0x89, 0x46, 0xe3, 0x5e, 0xe5, 0xcc, 0x8d, 0xaf, 0x41, 0x59, 0x5d, 0x84, 0xc9, 0x45, 0x38, 0xab, + 0xfe, 0x5e, 0xa3, 0x1d, 0xd7, 0xeb, 0xec, 0x56, 0xce, 0xa4, 0x0b, 0xac, 0x5e, 0xa7, 0xc3, 0x0a, + 0xb0, 0xf1, 0x6a, 0xc1, 0x3a, 0x0d, 0xda, 0x5e, 0x87, 0xad, 0xaf, 0x95, 0x5c, 0xbd, 0xf2, 0xbd, + 0x3f, 0x7f, 0xe1, 0xcc, 0xf7, 0xbe, 0xff, 0x82, 0xf1, 0x27, 0xdf, 0x7f, 0xc1, 0xf8, 0xaf, 0xdf, + 0x7f, 0xc1, 0xd8, 0x1e, 0x45, 0x41, 0xbf, 0xfd, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xdc, 0xe4, + 0xaa, 0x4b, 0x2d, 0xbf, 0x00, 0x00, } func (m *KeepAlive) Marshal() (dAtA []byte, err error) { @@ -15829,6 +16070,56 @@ func (m *ClaimMapping) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *TraitMapping) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TraitMapping) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TraitMapping) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Roles) > 0 { + for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Roles[iNdEx]) + copy(dAtA[i:], m.Roles[iNdEx]) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Roles[iNdEx]))) + i-- + dAtA[i] = 0x1a + } + } + if len(m.Value) > 0 { + i -= len(m.Value) + copy(dAtA[i:], m.Value) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Value))) + i-- + dAtA[i] = 0x12 + } + if len(m.Trait) > 0 { + i -= len(m.Trait) + copy(dAtA[i:], m.Trait) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Trait))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *Rule) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -19103,6 +19394,279 @@ func (m *GithubConnectorSpecV3) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *SSOWarnings) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SSOWarnings) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SSOWarnings) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Warnings) > 0 { + for iNdEx := len(m.Warnings) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Warnings[iNdEx]) + copy(dAtA[i:], m.Warnings[iNdEx]) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Warnings[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Message) > 0 { + i -= len(m.Message) + copy(dAtA[i:], m.Message) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Message))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *CreateUserParams) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CreateUserParams) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CreateUserParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.SessionTTL != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.SessionTTL)) + i-- + dAtA[i] = 0x40 + } + { + size := m.Traits.Size() + i -= size + if _, err := m.Traits.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a + if len(m.Roles) > 0 { + for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Roles[iNdEx]) + copy(dAtA[i:], m.Roles[iNdEx]) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Roles[iNdEx]))) + i-- + dAtA[i] = 0x32 + } + } + if len(m.KubeUsers) > 0 { + for iNdEx := len(m.KubeUsers) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.KubeUsers[iNdEx]) + copy(dAtA[i:], m.KubeUsers[iNdEx]) + i = encodeVarintTypes(dAtA, i, uint64(len(m.KubeUsers[iNdEx]))) + i-- + dAtA[i] = 0x2a + } + } + if len(m.KubeGroups) > 0 { + for iNdEx := len(m.KubeGroups) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.KubeGroups[iNdEx]) + copy(dAtA[i:], m.KubeGroups[iNdEx]) + i = encodeVarintTypes(dAtA, i, uint64(len(m.KubeGroups[iNdEx]))) + i-- + dAtA[i] = 0x22 + } + } + if len(m.Logins) > 0 { + for iNdEx := len(m.Logins) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Logins[iNdEx]) + copy(dAtA[i:], m.Logins[iNdEx]) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Logins[iNdEx]))) + i-- + dAtA[i] = 0x1a + } + } + if len(m.Username) > 0 { + i -= len(m.Username) + copy(dAtA[i:], m.Username) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Username))) + i-- + dAtA[i] = 0x12 + } + if len(m.ConnectorName) > 0 { + i -= len(m.ConnectorName) + copy(dAtA[i:], m.ConnectorName) + i = encodeVarintTypes(dAtA, i, uint64(len(m.ConnectorName))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *SSODiagnosticInfo) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SSODiagnosticInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SSODiagnosticInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.SAMLConnectorTraitMapping) > 0 { + for iNdEx := len(m.SAMLConnectorTraitMapping) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.SAMLConnectorTraitMapping[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x52 + } + } + { + size := m.SAMLTraitsFromAssertions.Size() + i -= size + if _, err := m.SAMLTraitsFromAssertions.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x4a + if m.SAMLAssertionInfo != nil { + { + size := m.SAMLAssertionInfo.Size() + i -= size + if _, err := m.SAMLAssertionInfo.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x42 + } + { + size := m.SAMLAttributeStatements.Size() + i -= size + if _, err := m.SAMLAttributeStatements.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a + if m.SAMLAttributesToRolesWarnings != nil { + { + size, err := m.SAMLAttributesToRolesWarnings.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + if len(m.SAMLAttributesToRoles) > 0 { + for iNdEx := len(m.SAMLAttributesToRoles) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.SAMLAttributesToRoles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } + } + if m.CreateUserParams != nil { + { + size, err := m.CreateUserParams.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + if m.Success { + i-- + if m.Success { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + } + if len(m.Error) > 0 { + i -= len(m.Error) + copy(dAtA[i:], m.Error) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Error))) + i-- + dAtA[i] = 0x12 + } + if m.TestFlow { + i-- + if m.TestFlow { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func (m *TeamMapping) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -19454,12 +20018,12 @@ func (m *LockSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.XXX_unrecognized) } if m.Expires != nil { - n172, err172 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) - if err172 != nil { - return 0, err172 + n177, err177 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) + if err177 != nil { + return 0, err177 } - i -= n172 - i = encodeVarintTypes(dAtA, i, uint64(n172)) + i -= n177 + i = encodeVarintTypes(dAtA, i, uint64(n177)) i-- dAtA[i] = 0x1a } @@ -20140,12 +20704,12 @@ func (m *RecoveryCodesSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n182, err182 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err182 != nil { - return 0, err182 + n187, err187 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err187 != nil { + return 0, err187 } - i -= n182 - i = encodeVarintTypes(dAtA, i, uint64(n182)) + i -= n187 + i = encodeVarintTypes(dAtA, i, uint64(n187)) i-- dAtA[i] = 0x12 if len(m.Codes) > 0 { @@ -20375,20 +20939,20 @@ func (m *SessionTrackerSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x32 } - n185, err185 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err185 != nil { - return 0, err185 + n190, err190 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err190 != nil { + return 0, err190 } - i -= n185 - i = encodeVarintTypes(dAtA, i, uint64(n185)) + i -= n190 + i = encodeVarintTypes(dAtA, i, uint64(n190)) i-- dAtA[i] = 0x2a - n186, err186 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err186 != nil { - return 0, err186 + n191, err191 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err191 != nil { + return 0, err191 } - i -= n186 - i = encodeVarintTypes(dAtA, i, uint64(n186)) + i -= n191 + i = encodeVarintTypes(dAtA, i, uint64(n191)) i-- dAtA[i] = 0x22 if m.State != 0 { @@ -20492,12 +21056,12 @@ func (m *Participant) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n187, err187 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastActive, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastActive):]) - if err187 != nil { - return 0, err187 + n192, err192 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastActive, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastActive):]) + if err192 != nil { + return 0, err192 } - i -= n187 - i = encodeVarintTypes(dAtA, i, uint64(n187)) + i -= n192 + i = encodeVarintTypes(dAtA, i, uint64(n192)) i-- dAtA[i] = 0x22 if len(m.Mode) > 0 { @@ -23252,6 +23816,32 @@ func (m *ClaimMapping) Size() (n int) { return n } +func (m *TraitMapping) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Trait) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.Value) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if len(m.Roles) > 0 { + for _, s := range m.Roles { + l = len(s) + n += 1 + l + sovTypes(uint64(l)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *Rule) Size() (n int) { if m == nil { return 0 @@ -24736,6 +25326,127 @@ func (m *GithubConnectorSpecV3) Size() (n int) { return n } +func (m *SSOWarnings) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Message) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if len(m.Warnings) > 0 { + for _, s := range m.Warnings { + l = len(s) + n += 1 + l + sovTypes(uint64(l)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *CreateUserParams) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ConnectorName) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.Username) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if len(m.Logins) > 0 { + for _, s := range m.Logins { + l = len(s) + n += 1 + l + sovTypes(uint64(l)) + } + } + if len(m.KubeGroups) > 0 { + for _, s := range m.KubeGroups { + l = len(s) + n += 1 + l + sovTypes(uint64(l)) + } + } + if len(m.KubeUsers) > 0 { + for _, s := range m.KubeUsers { + l = len(s) + n += 1 + l + sovTypes(uint64(l)) + } + } + if len(m.Roles) > 0 { + for _, s := range m.Roles { + l = len(s) + n += 1 + l + sovTypes(uint64(l)) + } + } + l = m.Traits.Size() + n += 1 + l + sovTypes(uint64(l)) + if m.SessionTTL != 0 { + n += 1 + sovTypes(uint64(m.SessionTTL)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *SSODiagnosticInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.TestFlow { + n += 2 + } + l = len(m.Error) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if m.Success { + n += 2 + } + if m.CreateUserParams != nil { + l = m.CreateUserParams.Size() + n += 1 + l + sovTypes(uint64(l)) + } + if len(m.SAMLAttributesToRoles) > 0 { + for _, e := range m.SAMLAttributesToRoles { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + if m.SAMLAttributesToRolesWarnings != nil { + l = m.SAMLAttributesToRolesWarnings.Size() + n += 1 + l + sovTypes(uint64(l)) + } + l = m.SAMLAttributeStatements.Size() + n += 1 + l + sovTypes(uint64(l)) + if m.SAMLAssertionInfo != nil { + l = m.SAMLAssertionInfo.Size() + n += 1 + l + sovTypes(uint64(l)) + } + l = m.SAMLTraitsFromAssertions.Size() + n += 1 + l + sovTypes(uint64(l)) + if len(m.SAMLConnectorTraitMapping) > 0 { + for _, e := range m.SAMLConnectorTraitMapping { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *TeamMapping) Size() (n int) { if m == nil { return 0 @@ -43825,7 +44536,7 @@ func (m *ClaimMapping) Unmarshal(dAtA []byte) error { } return nil } -func (m *Rule) Unmarshal(dAtA []byte) error { +func (m *TraitMapping) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -43848,15 +44559,15 @@ func (m *Rule) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Rule: wiretype end group for non-group") + return fmt.Errorf("proto: TraitMapping: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Rule: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: TraitMapping: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Resources", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Trait", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -43884,11 +44595,11 @@ func (m *Rule) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Resources = append(m.Resources, string(dAtA[iNdEx:postIndex])) + m.Trait = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Verbs", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -43916,43 +44627,11 @@ func (m *Rule) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Verbs = append(m.Verbs, string(dAtA[iNdEx:postIndex])) + m.Value = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Where", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Where = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Actions", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -43980,7 +44659,7 @@ func (m *Rule) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Actions = append(m.Actions, string(dAtA[iNdEx:postIndex])) + m.Roles = append(m.Roles, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex default: iNdEx = preIndex @@ -44004,7 +44683,7 @@ func (m *Rule) Unmarshal(dAtA []byte) error { } return nil } -func (m *ImpersonateConditions) Unmarshal(dAtA []byte) error { +func (m *Rule) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -44027,15 +44706,15 @@ func (m *ImpersonateConditions) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ImpersonateConditions: wiretype end group for non-group") + return fmt.Errorf("proto: Rule: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ImpersonateConditions: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Rule: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Users", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Resources", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -44063,11 +44742,11 @@ func (m *ImpersonateConditions) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Users = append(m.Users, string(dAtA[iNdEx:postIndex])) + m.Resources = append(m.Resources, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Verbs", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -44095,7 +44774,7 @@ func (m *ImpersonateConditions) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Roles = append(m.Roles, string(dAtA[iNdEx:postIndex])) + m.Verbs = append(m.Verbs, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex case 3: if wireType != 2 { @@ -44129,6 +44808,38 @@ func (m *ImpersonateConditions) Unmarshal(dAtA []byte) error { } m.Where = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Actions", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Actions = append(m.Actions, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -44151,7 +44862,7 @@ func (m *ImpersonateConditions) Unmarshal(dAtA []byte) error { } return nil } -func (m *BoolValue) Unmarshal(dAtA []byte) error { +func (m *ImpersonateConditions) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -44174,17 +44885,17 @@ func (m *BoolValue) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: BoolValue: wiretype end group for non-group") + return fmt.Errorf("proto: ImpersonateConditions: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: BoolValue: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ImpersonateConditions: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Users", wireType) } - var v int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -44194,66 +44905,213 @@ func (m *BoolValue) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - m.Value = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthTypes } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *UserV2) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes } - if iNdEx >= l { + if postIndex > l { return io.ErrUnexpectedEOF } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: UserV2: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: UserV2: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + m.Users = append(m.Users, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Roles = append(m.Roles, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Where", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Where = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *BoolValue) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: BoolValue: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: BoolValue: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Value = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *UserV2) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: UserV2: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: UserV2: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -52883,11 +53741,752 @@ func (m *AttributeMapping) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Value = string(dAtA[iNdEx:postIndex]) + m.Value = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Roles = append(m.Roles, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AsymmetricKeyPair) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AsymmetricKeyPair: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AsymmetricKeyPair: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PrivateKey", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PrivateKey = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Cert", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Cert = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GithubConnectorV3) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GithubConnectorV3: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GithubConnectorV3: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Kind = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SubKind", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SubKind = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Version = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GithubConnectorV3List) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GithubConnectorV3List: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GithubConnectorV3List: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GithubConnectors", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.GithubConnectors = append(m.GithubConnectors, &GithubConnectorV3{}) + if err := m.GithubConnectors[len(m.GithubConnectors)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GithubConnectorSpecV3) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GithubConnectorSpecV3: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GithubConnectorSpecV3: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClientID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClientID = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClientSecret", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClientSecret = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RedirectURL", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RedirectURL = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TeamsToLogins", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TeamsToLogins = append(m.TeamsToLogins, TeamMapping{}) + if err := m.TeamsToLogins[len(m.TeamsToLogins)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Display", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Display = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SSOWarnings) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SSOWarnings: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SSOWarnings: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Message = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Warnings", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -52915,7 +54514,7 @@ func (m *AttributeMapping) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Roles = append(m.Roles, string(dAtA[iNdEx:postIndex])) + m.Warnings = append(m.Warnings, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex default: iNdEx = preIndex @@ -52939,7 +54538,7 @@ func (m *AttributeMapping) Unmarshal(dAtA []byte) error { } return nil } -func (m *AsymmetricKeyPair) Unmarshal(dAtA []byte) error { +func (m *CreateUserParams) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -52962,15 +54561,15 @@ func (m *AsymmetricKeyPair) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AsymmetricKeyPair: wiretype end group for non-group") + return fmt.Errorf("proto: CreateUserParams: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AsymmetricKeyPair: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: CreateUserParams: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PrivateKey", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectorName", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -52998,11 +54597,11 @@ func (m *AsymmetricKeyPair) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.PrivateKey = string(dAtA[iNdEx:postIndex]) + m.ConnectorName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Cert", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Username", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -53030,62 +54629,11 @@ func (m *AsymmetricKeyPair) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Cert = string(dAtA[iNdEx:postIndex]) + m.Username = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GithubConnectorV3) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: GithubConnectorV3: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GithubConnectorV3: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Logins", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -53113,11 +54661,11 @@ func (m *GithubConnectorV3) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Kind = string(dAtA[iNdEx:postIndex]) + m.Logins = append(m.Logins, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 2: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SubKind", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field KubeGroups", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -53145,11 +54693,11 @@ func (m *GithubConnectorV3) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.SubKind = string(dAtA[iNdEx:postIndex]) + m.KubeGroups = append(m.KubeGroups, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 3: + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field KubeUsers", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -53177,13 +54725,13 @@ func (m *GithubConnectorV3) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Version = string(dAtA[iNdEx:postIndex]) + m.KubeUsers = append(m.KubeUsers, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 4: + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -53193,28 +54741,27 @@ func (m *GithubConnectorV3) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Roles = append(m.Roles, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 5: + case 7: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Traits", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -53241,10 +54788,29 @@ func (m *GithubConnectorV3) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Traits.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SessionTTL", wireType) + } + m.SessionTTL = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.SessionTTL |= Duration(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -53267,7 +54833,7 @@ func (m *GithubConnectorV3) Unmarshal(dAtA []byte) error { } return nil } -func (m *GithubConnectorV3List) Unmarshal(dAtA []byte) error { +func (m *SSODiagnosticInfo) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -53290,15 +54856,87 @@ func (m *GithubConnectorV3List) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GithubConnectorV3List: wiretype end group for non-group") + return fmt.Errorf("proto: SSODiagnosticInfo: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GithubConnectorV3List: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SSODiagnosticInfo: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TestFlow", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.TestFlow = bool(v != 0) + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field GithubConnectors", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Error = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Success", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Success = bool(v != 0) + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CreateUserParams", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -53325,67 +54963,52 @@ func (m *GithubConnectorV3List) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.GithubConnectors = append(m.GithubConnectors, &GithubConnectorV3{}) - if err := m.GithubConnectors[len(m.GithubConnectors)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.CreateUserParams == nil { + m.CreateUserParams = &CreateUserParams{} + } + if err := m.CreateUserParams.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SAMLAttributesToRoles", wireType) } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF + if msglen < 0 { + return ErrInvalidLengthTypes } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GithubConnectorSpecV3) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes } - if iNdEx >= l { + if postIndex > l { return io.ErrUnexpectedEOF } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break + m.SAMLAttributesToRoles = append(m.SAMLAttributesToRoles, AttributeMapping{}) + if err := m.SAMLAttributesToRoles[len(m.SAMLAttributesToRoles)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: GithubConnectorSpecV3: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GithubConnectorSpecV3: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + iNdEx = postIndex + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClientID", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SAMLAttributesToRolesWarnings", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -53395,29 +55018,33 @@ func (m *GithubConnectorSpecV3) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.ClientID = string(dAtA[iNdEx:postIndex]) + if m.SAMLAttributesToRolesWarnings == nil { + m.SAMLAttributesToRolesWarnings = &SSOWarnings{} + } + if err := m.SAMLAttributesToRolesWarnings.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 2: + case 7: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClientSecret", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SAMLAttributeStatements", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -53427,29 +55054,30 @@ func (m *GithubConnectorSpecV3) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.ClientSecret = string(dAtA[iNdEx:postIndex]) + if err := m.SAMLAttributeStatements.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 3: + case 8: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RedirectURL", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SAMLAssertionInfo", wireType) } - var stringLen uint64 + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -53459,27 +55087,30 @@ func (m *GithubConnectorSpecV3) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if byteLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.RedirectURL = string(dAtA[iNdEx:postIndex]) + var v AssertionInfo + m.SAMLAssertionInfo = &v + if err := m.SAMLAssertionInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 4: + case 9: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TeamsToLogins", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SAMLTraitsFromAssertions", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -53506,16 +55137,15 @@ func (m *GithubConnectorSpecV3) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.TeamsToLogins = append(m.TeamsToLogins, TeamMapping{}) - if err := m.TeamsToLogins[len(m.TeamsToLogins)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.SAMLTraitsFromAssertions.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 5: + case 10: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Display", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SAMLConnectorTraitMapping", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -53525,23 +55155,25 @@ func (m *GithubConnectorSpecV3) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Display = string(dAtA[iNdEx:postIndex]) + m.SAMLConnectorTraitMapping = append(m.SAMLConnectorTraitMapping, TraitMapping{}) + if err := m.SAMLConnectorTraitMapping[len(m.SAMLConnectorTraitMapping)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex diff --git a/api/types/types.proto b/api/types/types.proto index 23ee8cdba26ec..397f979844e28 100644 --- a/api/types/types.proto +++ b/api/types/types.proto @@ -1846,6 +1846,16 @@ message ClaimMapping { repeated string Roles = 3 [ (gogoproto.jsontag) = "roles,omitempty" ]; } +// TraitMapping maps a trait to teleport roles. +message TraitMapping { + // Trait is a trait name. + string Trait = 1 [ (gogoproto.jsontag) = "trait" ]; + // Value is a trait value to match. + string Value = 2 [ (gogoproto.jsontag) = "value" ]; + // Roles is a list of static teleport roles to match. + repeated string Roles = 3 [ (gogoproto.jsontag) = "roles,omitempty" ]; +} + // Rule represents allow or deny rule that is executed to check // if user or service have access to resource message Rule { @@ -2645,6 +2655,92 @@ message GithubConnectorSpecV3 { string Display = 5 [ (gogoproto.jsontag) = "display" ]; } +// SSOWarnings conveys a user-facing main message along with auxiliary warnings. +message SSOWarnings { + // Message is main user-facing message to be shown. + string Message = 1 [ (gogoproto.jsontag) = "message,omitempty" ]; + // Warnings is a set of distinct warnings to be reported. + repeated string Warnings = 2 [ (gogoproto.jsontag) = "warnings,omitempty" ]; +} + +// CreateUserParams represents the user creation parameters as called during SSO login flow. +message CreateUserParams { + // ConnectorName is the name of the connector used for SSO login flow. + string ConnectorName = 1 [ (gogoproto.jsontag) = "connector_name,omitempty" ]; + // Username is the name of the user to be created. + string Username = 2 [ (gogoproto.jsontag) = "username,omitempty" ]; + // Logins is a list of available unix logins. + repeated string Logins = 3 [ (gogoproto.jsontag) = "logins,omitempty" ]; + // KubeGroups is a list of assigned kube groups. + repeated string KubeGroups = 4 [ (gogoproto.jsontag) = "kube_groups,omitempty" ]; + // KubeUsers is a list of available kube users. + repeated string KubeUsers = 5 [ (gogoproto.jsontag) = "kube_users,omitempty" ]; + // Roles is a list of assigned roles. + repeated string Roles = 6 [ (gogoproto.jsontag) = "roles,omitempty" ]; + + // Traits is the set of traits the user is assigned. + wrappers.LabelValues Traits = 7 [ + (gogoproto.nullable) = false, + (gogoproto.jsontag) = "traits,omitempty", + (gogoproto.customtype) = "github.com/gravitational/teleport/api/types/wrappers.Traits" + ]; + + // SessionTTL determines the TTL. + int64 SessionTTL = 8 + [ (gogoproto.jsontag) = "session_ttl,omitempty", (gogoproto.casttype) = "Duration" ]; +} + +// SSODiagnosticInfo is a single SSO diagnostic info entry. +message SSODiagnosticInfo { + // TestFlow indicates the SSO flow was a test one. + bool TestFlow = 1 [ (gogoproto.jsontag) = "test_flow" ]; + + // Error stores user-friendly error message. + string Error = 2 [ (gogoproto.jsontag) = "error" ]; + + // Success if present, marks the flow as finished with success. + bool Success = 3 [ (gogoproto.jsontag) = "success" ]; + + // CreateUserParams represents the user creation parameters as called during SSO login flow. + CreateUserParams CreateUserParams = 4 [ (gogoproto.jsontag) = "create_user_params,omitempty" ]; + + // SAMLAttributesToRoles represents mapping from attributes to roles, as used during SAML login + // flow. + repeated AttributeMapping SAMLAttributesToRoles = 5 + [ (gogoproto.nullable) = false, (gogoproto.jsontag) = "attributes_to_roles,omitempty" ]; + + // SAMLAttributesToRolesWarnings contains warnings produced during the process of mapping the + // SAML attributes to roles. + SSOWarnings SAMLAttributesToRolesWarnings = 6 + [ (gogoproto.jsontag) = "saml_attributes_to_roles_warnings,omitempty" ]; + + // SAMLAttributeStatements represents SAML attribute statements. + wrappers.LabelValues SAMLAttributeStatements = 7 [ + (gogoproto.nullable) = false, + (gogoproto.jsontag) = "saml_attribute_statements,omitempty", + (gogoproto.customtype) = "github.com/gravitational/teleport/api/types/wrappers.Traits" + ]; + + // SAMLAssertionInfo represents raw SAML assertion info as returned by IdP during SAML flow. + bytes SAMLAssertionInfo = 8 [ + (gogoproto.jsontag) = "saml_assertion_info,omitempty", + (gogoproto.customtype) = "AssertionInfo" + ]; + + // SAMLTraitsFromAssertions represents traits translated from SAML assertions. + wrappers.LabelValues SAMLTraitsFromAssertions = 9 [ + (gogoproto.nullable) = false, + (gogoproto.jsontag) = "saml_traits_from_assertions,omitempty", + (gogoproto.customtype) = "github.com/gravitational/teleport/api/types/wrappers.Traits" + ]; + + // SAMLConnectorTraitMapping represents connector-specific trait mapping. + repeated TraitMapping SAMLConnectorTraitMapping = 10 [ + (gogoproto.nullable) = false, + (gogoproto.jsontag) = "saml_connector_trait_mapping,omitempty" + ]; +} + // TeamMapping represents a single team membership mapping. message TeamMapping { // Organization is a Github organization a user belongs to. diff --git a/go.mod b/go.mod index 399b16af5501a..861028b82be46 100644 --- a/go.mod +++ b/go.mod @@ -23,7 +23,6 @@ require ( github.com/aws/aws-sdk-go-v2/service/ec2 v1.16.0 github.com/aws/aws-sdk-go-v2/service/sts v1.7.0 github.com/beevik/etree v1.1.0 - github.com/cloudflare/cfssl v0.0.0-20190726000631-633726f6bcb7 github.com/coreos/go-oidc v0.0.0 github.com/coreos/go-semver v0.3.0 github.com/denisenkom/go-mssqldb v0.11.0 @@ -147,6 +146,7 @@ require ( github.com/boombuler/barcode v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5 // indirect + github.com/cloudflare/cfssl v0.0.0-20190726000631-633726f6bcb7 // indirect github.com/coreos/go-systemd/v22 v22.3.2 // indirect github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f // indirect github.com/creack/pty v1.1.11 // indirect diff --git a/lib/auth/apiserver.go b/lib/auth/apiserver.go index 63188c83fe88d..eee929c7320a9 100644 --- a/lib/auth/apiserver.go +++ b/lib/auth/apiserver.go @@ -204,6 +204,7 @@ func NewAPIServer(config *APIConfig) (http.Handler, error) { srv.DELETE("/:version/saml/connectors/:id", srv.withAuth(srv.deleteSAMLConnector)) srv.POST("/:version/saml/requests/create", srv.withAuth(srv.createSAMLAuthRequest)) srv.POST("/:version/saml/requests/validate", srv.withAuth(srv.validateSAMLResponse)) + srv.GET("/:version/saml/requests/get/:id", srv.withAuth(srv.getSAMLAuthRequest)) // Github connector srv.POST("/:version/github/connectors", srv.withAuth(srv.createGithubConnector)) @@ -214,6 +215,9 @@ func NewAPIServer(config *APIConfig) (http.Handler, error) { srv.POST("/:version/github/requests/create", srv.withAuth(srv.createGithubAuthRequest)) srv.POST("/:version/github/requests/validate", srv.withAuth(srv.validateGithubAuthCallback)) + // SSO diag info + srv.GET("/:version/sso/diag/:auth/:id", srv.withAuth(srv.getSSODiagnosticInfo)) + // Provisioning tokens- Moved to grpc // DELETE IN 8.0 srv.GET("/:version/tokens", srv.withAuth(srv.getTokens)) @@ -1399,6 +1403,23 @@ func (s *APIServer) createSAMLAuthRequest(auth ClientI, w http.ResponseWriter, r return response, nil } +func (s *APIServer) getSAMLAuthRequest(auth ClientI, w http.ResponseWriter, r *http.Request, p httprouter.Params, version string) (interface{}, error) { + request, err := auth.GetSAMLAuthRequest(r.Context(), p.ByName("id")) + if err != nil { + return nil, trace.Wrap(err) + } + return request, nil +} + +func (s *APIServer) getSSODiagnosticInfo(auth ClientI, w http.ResponseWriter, r *http.Request, p httprouter.Params, version string) (interface{}, error) { + info, err := auth.GetSSODiagnosticInfo(r.Context(), p.ByName("auth"), p.ByName("id")) + if err != nil { + return nil, trace.Wrap(err) + } + + return info, nil +} + type validateSAMLResponseReq struct { Response string `json:"response"` } @@ -1428,7 +1449,7 @@ func (s *APIServer) validateSAMLResponse(auth ClientI, w http.ResponseWriter, r if err := httplib.ReadJSON(r, &req); err != nil { return nil, trace.Wrap(err) } - response, err := auth.ValidateSAMLResponse(req.Response) + response, err := auth.ValidateSAMLResponse(r.Context(), req.Response) if err != nil { return nil, trace.Wrap(err) } diff --git a/lib/auth/auth_test.go b/lib/auth/auth_test.go index 1d355b7e99b81..81bc0a389e0ed 100644 --- a/lib/auth/auth_test.go +++ b/lib/auth/auth_test.go @@ -990,7 +990,14 @@ func TestSAMLConnectorCRUDEventsEmitted(t *testing.T) { AssertionConsumerService: "a", Issuer: "b", SSO: "c", - Cert: string(certBytes), + AttributesToRoles: []types.AttributeMapping{ + { + Name: "dummy", + Value: "dummy", + Roles: []string{"dummy"}, + }, + }, + Cert: string(certBytes), }) require.NoError(t, err) @@ -1014,7 +1021,7 @@ func TestSAMLConnectorCRUDEventsEmitted(t *testing.T) { func TestEmitSSOLoginFailureEvent(t *testing.T) { mockE := &eventstest.MockEmitter{} - emitSSOLoginFailureEvent(context.Background(), mockE, "test", trace.BadParameter("some error")) + emitSSOLoginFailureEvent(context.Background(), mockE, "test", trace.BadParameter("some error"), false) require.Equal(t, mockE.LastEvent(), &apievents.UserLogin{ Metadata: apievents.Metadata{ @@ -1028,6 +1035,21 @@ func TestEmitSSOLoginFailureEvent(t *testing.T) { UserMessage: "some error", }, }) + + emitSSOLoginFailureEvent(context.Background(), mockE, "test", trace.BadParameter("some error"), true) + + require.Equal(t, mockE.LastEvent(), &apievents.UserLogin{ + Metadata: apievents.Metadata{ + Type: events.UserLoginEvent, + Code: events.UserSSOTestFlowLoginFailureCode, + }, + Method: "test", + Status: apievents.Status{ + Success: false, + Error: "some error", + UserMessage: "some error", + }, + }) } func TestGenerateUserCertWithCertExtension(t *testing.T) { diff --git a/lib/auth/auth_with_roles.go b/lib/auth/auth_with_roles.go index 2fcad7380338e..fe53cb3e3d17b 100644 --- a/lib/auth/auth_with_roles.go +++ b/lib/auth/auth_with_roles.go @@ -2248,7 +2248,8 @@ func (a *ServerWithRoles) CreateOIDCAuthRequest(req services.OIDCAuthRequest) (* oidcReq, err := a.authServer.CreateOIDCAuthRequest(req) if err != nil { - emitSSOLoginFailureEvent(a.authServer.closeCtx, a.authServer.emitter, events.LoginMethodOIDC, err) + // TODO(Tener): Update `testFlow` flag once OIDC SSO starts supporting test flows. + emitSSOLoginFailureEvent(a.authServer.closeCtx, a.authServer.emitter, events.LoginMethodOIDC, err, false) return nil, trace.Wrap(err) } @@ -2323,18 +2324,57 @@ func (a *ServerWithRoles) CreateSAMLAuthRequest(req services.SAMLAuthRequest) (* return nil, trace.Wrap(err) } + // require additional permissions for executing SSO test flow. + if req.SSOTestFlow { + if err := a.authConnectorAction(apidefaults.Namespace, types.KindSAML, types.VerbCreate); err != nil { + return nil, trace.Wrap(err) + } + } + samlReq, err := a.authServer.CreateSAMLAuthRequest(req) if err != nil { - emitSSOLoginFailureEvent(a.authServer.closeCtx, a.authServer.emitter, events.LoginMethodSAML, err) + emitSSOLoginFailureEvent(a.authServer.closeCtx, a.authServer.emitter, events.LoginMethodSAML, err, req.SSOTestFlow) return nil, trace.Wrap(err) } return samlReq, nil } -func (a *ServerWithRoles) ValidateSAMLResponse(re string) (*SAMLAuthResponse, error) { +// ValidateSAMLResponse validates SAML auth response. +func (a *ServerWithRoles) ValidateSAMLResponse(ctx context.Context, re string) (*SAMLAuthResponse, error) { // auth callback is it's own authz, no need to check extra permissions - return a.authServer.ValidateSAMLResponse(re) + return a.authServer.ValidateSAMLResponse(ctx, re) +} + +// GetSAMLAuthRequest returns SAML auth request if found. +func (a *ServerWithRoles) GetSAMLAuthRequest(ctx context.Context, id string) (*services.SAMLAuthRequest, error) { + if err := a.action(apidefaults.Namespace, types.KindSAMLRequest, types.VerbRead); err != nil { + return nil, trace.Wrap(err) + } + + return a.authServer.GetSAMLAuthRequest(ctx, id) +} + +// GetSSODiagnosticInfo returns SSO diagnostic info records. +func (a *ServerWithRoles) GetSSODiagnosticInfo(ctx context.Context, authKind string, authRequestID string) (*types.SSODiagnosticInfo, error) { + var resource string + + switch authKind { + case types.KindSAML: + resource = types.KindSAMLRequest + case types.KindGithub: + resource = types.KindGithubRequest + case types.KindOIDC: + resource = types.KindOIDCRequest + default: + return nil, trace.BadParameter("unsupported authKind %q", authKind) + } + + if err := a.action(apidefaults.Namespace, resource, types.VerbRead); err != nil { + return nil, trace.Wrap(err) + } + + return a.authServer.GetSSODiagnosticInfo(ctx, authKind, authRequestID) } // DeleteSAMLConnector deletes a SAML connector by name. @@ -2430,7 +2470,8 @@ func (a *ServerWithRoles) CreateGithubAuthRequest(req services.GithubAuthRequest githubReq, err := a.authServer.CreateGithubAuthRequest(req) if err != nil { - emitSSOLoginFailureEvent(a.authServer.closeCtx, a.authServer.emitter, events.LoginMethodGithub, err) + // TODO(Tener): Update `testFlow` flag once GitHub SSO starts supporting test flows. + emitSSOLoginFailureEvent(a.authServer.closeCtx, a.authServer.emitter, events.LoginMethodGithub, err, false) return nil, trace.Wrap(err) } @@ -4314,11 +4355,16 @@ func NewAdminAuthServer(authServer *Server, sessions session.Service, alog event }, nil } -func emitSSOLoginFailureEvent(ctx context.Context, emitter apievents.Emitter, method string, err error) { +func emitSSOLoginFailureEvent(ctx context.Context, emitter apievents.Emitter, method string, err error, testFlow bool) { + code := events.UserSSOLoginFailureCode + if testFlow { + code = events.UserSSOTestFlowLoginFailureCode + } + emitErr := emitter.EmitAuditEvent(ctx, &apievents.UserLogin{ Metadata: apievents.Metadata{ Type: events.UserLoginEvent, - Code: events.UserSSOLoginFailureCode, + Code: code, }, Method: method, Status: apievents.Status{ diff --git a/lib/auth/auth_with_roles_test.go b/lib/auth/auth_with_roles_test.go index 0c341575908d7..c4d4a1da01460 100644 --- a/lib/auth/auth_with_roles_test.go +++ b/lib/auth/auth_with_roles_test.go @@ -33,6 +33,7 @@ import ( "github.com/gravitational/teleport/api/utils/sshutils" "github.com/gravitational/teleport/lib/auth/native" libdefaults "github.com/gravitational/teleport/lib/defaults" + "github.com/gravitational/teleport/lib/fixtures" "github.com/gravitational/teleport/lib/services" "github.com/gravitational/teleport/lib/tlsca" "github.com/gravitational/teleport/lib/utils" @@ -285,6 +286,247 @@ func TestSSOUserCanReissueCert(t *testing.T) { require.NoError(t, err) } +func TestSAMLAuthRequest(t *testing.T) { + ctx := context.Background() + srv := newTestTLSServer(t) + + emptyRole, err := CreateRole(ctx, srv.Auth(), "test-empty", types.RoleSpecV5{}) + require.NoError(t, err) + + access1Role, err := CreateRole(ctx, srv.Auth(), "test-access-1", types.RoleSpecV5{ + Allow: types.RoleConditions{ + Rules: []types.Rule{ + { + Resources: []string{types.KindSAMLRequest}, + Verbs: []string{types.VerbCreate}, + }, + }, + }, + }) + require.NoError(t, err) + + access2Role, err := CreateRole(ctx, srv.Auth(), "test-access-2", types.RoleSpecV5{ + Allow: types.RoleConditions{ + Rules: []types.Rule{ + { + Resources: []string{types.KindSAML}, + Verbs: []string{types.VerbCreate}, + }, + }, + }, + }) + require.NoError(t, err) + + access3Role, err := CreateRole(ctx, srv.Auth(), "test-access-3", types.RoleSpecV5{ + Allow: types.RoleConditions{ + Rules: []types.Rule{ + { + Resources: []string{types.KindSAML, types.KindSAMLRequest}, + Verbs: []string{types.VerbCreate}, + }, + }, + }, + }) + require.NoError(t, err) + + readerRole, err := CreateRole(ctx, srv.Auth(), "test-access-4", types.RoleSpecV5{ + Allow: types.RoleConditions{ + Rules: []types.Rule{ + { + Resources: []string{types.KindSAMLRequest}, + Verbs: []string{types.VerbRead}, + }, + }, + }, + }) + require.NoError(t, err) + + conn, err := types.NewSAMLConnector("foo", types.SAMLConnectorSpecV2{ + Issuer: "test", + SSO: "test", + Cert: fixtures.TLSCACertPEM, + AssertionConsumerService: "test", + AttributesToRoles: []types.AttributeMapping{{ + Name: "foo", + Value: "bar", + Roles: []string{"baz"}, + }}, + }) + require.NoError(t, err) + + err = srv.Auth().CreateSAMLConnector(conn) + require.NoError(t, err) + + reqNormal := services.SAMLAuthRequest{ConnectorID: conn.GetName(), Type: constants.SAML} + reqTest := services.SAMLAuthRequest{ConnectorID: conn.GetName(), Type: constants.SAML, SSOTestFlow: true, ConnectorSpec: &types.SAMLConnectorSpecV2{ + Issuer: "test", + Audience: "test", + ServiceProviderIssuer: "test", + SSO: "test", + Cert: fixtures.TLSCACertPEM, + AssertionConsumerService: "test", + AttributesToRoles: []types.AttributeMapping{{ + Name: "foo", + Value: "bar", + Roles: []string{"baz"}, + }}, + }} + + tests := []struct { + desc string + roles []string + request services.SAMLAuthRequest + expectAccessDenied bool + }{ + { + desc: "empty role - no access", + roles: []string{emptyRole.GetName()}, + request: reqNormal, + expectAccessDenied: true, + }, + { + desc: "can create regular request with normal access", + roles: []string{access1Role.GetName()}, + request: reqNormal, + expectAccessDenied: false, + }, + { + desc: "cannot create sso test request with normal access", + roles: []string{access1Role.GetName()}, + request: reqTest, + expectAccessDenied: true, + }, + { + desc: "cannot create normal request with connector access", + roles: []string{access2Role.GetName()}, + request: reqNormal, + expectAccessDenied: true, + }, + { + desc: "cannot create sso test request with connector access", + roles: []string{access2Role.GetName()}, + request: reqTest, + expectAccessDenied: true, + }, + { + desc: "can create regular request with combined access", + roles: []string{access3Role.GetName()}, + request: reqNormal, + expectAccessDenied: false, + }, + { + desc: "can create sso test request with combined access", + roles: []string{access3Role.GetName()}, + request: reqTest, + expectAccessDenied: false, + }, + } + + user, err := CreateUser(srv.Auth(), "dummy") + require.NoError(t, err) + + userReader, err := CreateUser(srv.Auth(), "dummy-reader", readerRole) + require.NoError(t, err) + + clientReader, err := srv.NewClient(TestUser(userReader.GetName())) + require.NoError(t, err) + + for _, tt := range tests { + t.Run(tt.desc, func(t *testing.T) { + user.SetRoles(tt.roles) + err = srv.Auth().UpsertUser(user) + require.NoError(t, err) + + client, err := srv.NewClient(TestUser(user.GetName())) + require.NoError(t, err) + + request, err := client.CreateSAMLAuthRequest(tt.request) + if tt.expectAccessDenied { + require.Error(t, err) + require.True(t, trace.IsAccessDenied(err), "expected access denied, got: %v", err) + } else { + if err != nil { + if reporter, ok := err.(trace.DebugReporter); ok { + fmt.Println(reporter.DebugReport()) + } + } + require.NoError(t, err) + require.NotEmpty(t, request.ID) + require.Equal(t, tt.request.ConnectorID, request.ConnectorID) + + requestCopy, err := clientReader.GetSAMLAuthRequest(ctx, request.ID) + require.NoError(t, err) + require.Equal(t, request, requestCopy) + } + }) + } +} + +func TestSSODiagnosticInfo(t *testing.T) { + ctx := context.Background() + srv := newTestTLSServer(t) + + // empty role + emptyRole, err := CreateRole(ctx, srv.Auth(), "test-empty", types.RoleSpecV5{}) + require.NoError(t, err) + + // privileged role + privRole, err := CreateRole(ctx, srv.Auth(), "priv-access", types.RoleSpecV5{ + Allow: types.RoleConditions{ + Rules: []types.Rule{ + { + Resources: []string{types.KindSAMLRequest}, + Verbs: []string{types.VerbRead}, + }, + }, + }, + }) + require.NoError(t, err) + + user, err := CreateUser(srv.Auth(), "dummy", emptyRole) + require.NoError(t, err) + + userPriv, err := CreateUser(srv.Auth(), "superDummy", privRole) + require.NoError(t, err) + + client, err := srv.NewClient(TestUser(user.GetName())) + require.NoError(t, err) + + clientPriv, err := srv.NewClient(TestUser(userPriv.GetName())) + require.NoError(t, err) + + // fresh server, no SSO diag info, request fails + info, err := client.GetSSODiagnosticInfo(ctx, types.KindSAML, "XXX-INVALID-ID") + require.Error(t, err) + require.Nil(t, info) + + infoCreate := types.SSODiagnosticInfo{ + TestFlow: true, + Error: "aaa bbb ccc", + } + + // invalid auth kind returns error, no information stored. + err = srv.Auth().CreateSSODiagnosticInfo(ctx, "XXX-BAD-KIND", "ABC123", infoCreate) + require.Error(t, err) + info, err = client.GetSSODiagnosticInfo(ctx, "XXX-BAD-KIND", "XXX-INVALID-ID") + require.Error(t, err) + require.Nil(t, info) + + // proper record can be stored, retrieved, if user has access. + err = srv.Auth().CreateSSODiagnosticInfo(ctx, types.KindSAML, "ABC123", infoCreate) + require.NoError(t, err) + + info, err = client.GetSSODiagnosticInfo(ctx, types.KindSAML, "ABC123") + require.Error(t, err) + require.True(t, trace.IsAccessDenied(err)) + require.Nil(t, info) + + info, err = clientPriv.GetSSODiagnosticInfo(ctx, types.KindSAML, "ABC123") + require.NoError(t, err) + require.Equal(t, &infoCreate, info) + +} + func TestGenerateUserCertsWithRoleRequest(t *testing.T) { ctx := context.Background() srv := newTestTLSServer(t) diff --git a/lib/auth/clt.go b/lib/auth/clt.go index 128616512f614..f5cbf595721a7 100644 --- a/lib/auth/clt.go +++ b/lib/auth/clt.go @@ -1144,9 +1144,35 @@ func (c *Client) CreateSAMLAuthRequest(req services.SAMLAuthRequest) (*services. return response, nil } +// GetSAMLAuthRequest gets SAML AuthnRequest +func (c *Client) GetSAMLAuthRequest(ctx context.Context, id string) (*services.SAMLAuthRequest, error) { + out, err := c.Get(ctx, c.Endpoint("saml", "requests", "get", id), url.Values{}) + if err != nil { + return nil, trace.Wrap(err) + } + var response *services.SAMLAuthRequest + if err := json.Unmarshal(out.Bytes(), &response); err != nil { + return nil, trace.Wrap(err) + } + return response, nil +} + +// GetSSODiagnosticInfo returns SSO diagnostic info records. +func (c *Client) GetSSODiagnosticInfo(ctx context.Context, authKind string, authRequestID string) (*types.SSODiagnosticInfo, error) { + out, err := c.Get(ctx, c.Endpoint("sso", "diag", authKind, authRequestID), url.Values{}) + if err != nil { + return nil, trace.Wrap(err) + } + var response types.SSODiagnosticInfo + if err := json.Unmarshal(out.Bytes(), &response); err != nil { + return nil, trace.Wrap(err) + } + return &response, nil +} + // ValidateSAMLResponse validates response returned by SAML identity provider -func (c *Client) ValidateSAMLResponse(re string) (*SAMLAuthResponse, error) { - out, err := c.PostJSON(context.TODO(), c.Endpoint("saml", "requests", "validate"), validateSAMLResponseReq{ +func (c *Client) ValidateSAMLResponse(ctx context.Context, re string) (*SAMLAuthResponse, error) { + out, err := c.PostJSON(ctx, c.Endpoint("saml", "requests", "validate"), validateSAMLResponseReq{ Response: re, }) if err != nil { @@ -1664,7 +1690,7 @@ type IdentityService interface { // GetSAMLConnector returns SAML connector information by id GetSAMLConnector(ctx context.Context, id string, withSecrets bool) (types.SAMLConnector, error) - // GetSAMLConnector gets SAML connectors list + // GetSAMLConnectors gets SAML connectors list GetSAMLConnectors(ctx context.Context, withSecrets bool) ([]types.SAMLConnector, error) // DeleteSAMLConnector deletes SAML connector by ID @@ -1674,7 +1700,13 @@ type IdentityService interface { CreateSAMLAuthRequest(req services.SAMLAuthRequest) (*services.SAMLAuthRequest, error) // ValidateSAMLResponse validates SAML auth response - ValidateSAMLResponse(re string) (*SAMLAuthResponse, error) + ValidateSAMLResponse(ctx context.Context, re string) (*SAMLAuthResponse, error) + + // GetSAMLAuthRequest returns SAML auth request if found + GetSAMLAuthRequest(ctx context.Context, authRequestID string) (*services.SAMLAuthRequest, error) + + // GetSSODiagnosticInfo returns SSO diagnostic info records. + GetSSODiagnosticInfo(ctx context.Context, authKind string, authRequestID string) (*types.SSODiagnosticInfo, error) // CreateGithubConnector creates a new Github connector CreateGithubConnector(connector types.GithubConnector) error diff --git a/lib/auth/saml.go b/lib/auth/saml.go index 8a97bee746508..aa0f13153deaf 100644 --- a/lib/auth/saml.go +++ b/lib/auth/saml.go @@ -24,8 +24,6 @@ import ( "fmt" "io" - "github.com/google/go-cmp/cmp" - "github.com/gravitational/teleport" "github.com/gravitational/teleport/api/constants" apidefaults "github.com/gravitational/teleport/api/defaults" @@ -37,6 +35,7 @@ import ( "github.com/gravitational/teleport/lib/utils" "github.com/beevik/etree" + "github.com/google/go-cmp/cmp" "github.com/gravitational/trace" saml2 "github.com/russellhaering/gosaml2" ) @@ -85,11 +84,7 @@ func (a *Server) DeleteSAMLConnector(ctx context.Context, connectorName string) func (a *Server) CreateSAMLAuthRequest(req services.SAMLAuthRequest) (*services.SAMLAuthRequest, error) { ctx := context.TODO() - connector, err := a.Identity.GetSAMLConnector(ctx, req.ConnectorID, true) - if err != nil { - return nil, trace.Wrap(err) - } - provider, err := a.getSAMLProvider(connector) + connector, provider, err := a.getConnectorAndProvider(ctx, req) if err != nil { return nil, trace.Wrap(err) } @@ -128,6 +123,50 @@ func (a *Server) CreateSAMLAuthRequest(req services.SAMLAuthRequest) (*services. return &req, nil } +func (a *Server) getConnectorAndProvider(ctx context.Context, req services.SAMLAuthRequest) (types.SAMLConnector, *saml2.SAMLServiceProvider, error) { + if req.SSOTestFlow { + if req.ConnectorSpec == nil { + return nil, nil, trace.BadParameter("ConnectorSpec cannot be nil when SSOTestFlow is true") + } + + if req.ConnectorID == "" { + return nil, nil, trace.BadParameter("ConnectorID cannot be empty") + } + + // stateless test flow + connector, err := types.NewSAMLConnector(req.ConnectorID, *req.ConnectorSpec) + if err != nil { + return nil, nil, trace.Wrap(err) + } + + // validate, set defaults for connector + err = services.ValidateSAMLConnector(connector) + if err != nil { + return nil, nil, trace.Wrap(err) + } + + // we don't want to cache the provider. construct it directly instead of using a.getSAMLProvider() + provider, err := services.GetSAMLServiceProvider(connector, a.clock) + if err != nil { + return nil, nil, trace.Wrap(err) + } + + return connector, provider, nil + } + + // regular execution flow + connector, err := a.Identity.GetSAMLConnector(ctx, req.ConnectorID, true) + if err != nil { + return nil, nil, trace.Wrap(err) + } + provider, err := a.getSAMLProvider(connector) + if err != nil { + return nil, nil, trace.Wrap(err) + } + + return connector, provider, nil +} + func (a *Server) getSAMLProvider(conn types.SAMLConnector) (*saml2.SAMLServiceProvider, error) { a.lock.Lock() defer a.lock.Unlock() @@ -148,9 +187,7 @@ func (a *Server) getSAMLProvider(conn types.SAMLConnector) (*saml2.SAMLServicePr return serviceProvider, nil } -func (a *Server) calculateSAMLUser(connector types.SAMLConnector, assertionInfo saml2.AssertionInfo, request *services.SAMLAuthRequest) (*createUserParams, error) { - var err error - +func (a *Server) calculateSAMLUser(diagCtx *ssoDiagContext, connector types.SAMLConnector, assertionInfo saml2.AssertionInfo, request *services.SAMLAuthRequest) (*createUserParams, error) { p := createUserParams{ connectorName: connector.GetName(), username: assertionInfo.NameID, @@ -158,11 +195,22 @@ func (a *Server) calculateSAMLUser(connector types.SAMLConnector, assertionInfo p.traits = services.SAMLAssertionsToTraits(assertionInfo) + diagCtx.info.SAMLTraitsFromAssertions = p.traits + diagCtx.info.SAMLConnectorTraitMapping = connector.GetTraitMappings() + var warnings []string warnings, p.roles = services.TraitsToRoles(connector.GetTraitMappings(), p.traits) if len(p.roles) == 0 { if len(warnings) != 0 { log.WithField("connector", connector).Warnf("Unable to map attibutes to roles: %q", warnings) + diagCtx.info.SAMLAttributesToRolesWarnings = &types.SSOWarnings{ + Message: "No roles mapped for the user", + Warnings: warnings, + } + } else { + diagCtx.info.SAMLAttributesToRolesWarnings = &types.SSOWarnings{ + Message: "No roles mapped for the user. The mappings may contain typos.", + } } return nil, trace.AccessDenied("unable to map attributes to role for connector: %v", connector.GetName()) } @@ -178,7 +226,7 @@ func (a *Server) calculateSAMLUser(connector types.SAMLConnector, assertionInfo return &p, nil } -func (a *Server) createSAMLUser(p *createUserParams) (types.User, error) { +func (a *Server) createSAMLUser(p *createUserParams, dryRun bool) (types.User, error) { expires := a.GetClock().Now().UTC().Add(p.sessionTTL) log.Debugf("Generating dynamic SAML identity %v/%v with roles: %v.", p.connectorName, p.username, p.roles) @@ -214,6 +262,10 @@ func (a *Server) createSAMLUser(p *createUserParams) (types.User, error) { }, } + if dryRun { + return user, nil + } + // Get the user to check if it already exists or not. existingUser, err := a.Identity.GetUser(p.username, false) if err != nil && !trace.IsNotFound(err) { @@ -247,7 +299,7 @@ func (a *Server) createSAMLUser(p *createUserParams) (types.User, error) { return user, nil } -func parseSAMLInResponseTo(response string) (string, error) { +func ParseSAMLInResponseTo(response string) (string, error) { raw, _ := base64.StdEncoding.DecodeString(response) doc := etree.NewDocument() @@ -308,16 +360,26 @@ type SAMLAuthResponse struct { } // ValidateSAMLResponse consumes attribute statements from SAML identity provider -func (a *Server) ValidateSAMLResponse(samlResponse string) (*SAMLAuthResponse, error) { +func (a *Server) ValidateSAMLResponse(ctx context.Context, samlResponse string) (*SAMLAuthResponse, error) { event := &apievents.UserLogin{ Metadata: apievents.Metadata{ Type: events.UserLoginEvent, }, Method: events.LoginMethodSAML, } - re, err := a.validateSAMLResponse(samlResponse) - if re != nil && re.attributeStatements != nil { - attributes, err := apievents.EncodeMapStrings(re.attributeStatements) + + diagCtx := a.newSSODiagContext(types.KindSAML) + + auth, err := a.validateSAMLResponse(ctx, diagCtx, samlResponse) + if err != nil { + diagCtx.info.Error = trace.UserMessage(err) + } + + diagCtx.writeToBackend(ctx) + + attributeStatements := diagCtx.info.SAMLAttributeStatements + if attributeStatements != nil { + attributes, err := apievents.EncodeMapStrings(attributeStatements) if err != nil { event.Status.UserMessage = fmt.Sprintf("Failed to encode identity attributes: %v", err.Error()) log.WithError(err).Debug("Failed to encode identity attributes.") @@ -328,6 +390,9 @@ func (a *Server) ValidateSAMLResponse(samlResponse string) (*SAMLAuthResponse, e if err != nil { event.Code = events.UserSSOLoginFailureCode + if diagCtx.info.TestFlow { + event.Code = events.UserSSOTestFlowLoginFailureCode + } event.Status.Success = false event.Status.Error = trace.Unwrap(err).Error() event.Status.UserMessage = err.Error() @@ -336,87 +401,107 @@ func (a *Server) ValidateSAMLResponse(samlResponse string) (*SAMLAuthResponse, e } return nil, trace.Wrap(err) } + event.Status.Success = true - event.User = re.auth.Username + event.User = auth.Username event.Code = events.UserSSOLoginCode + if diagCtx.info.TestFlow { + event.Code = events.UserSSOTestFlowLoginCode + } if err := a.emitter.EmitAuditEvent(a.closeCtx, event); err != nil { log.WithError(err).Warn("Failed to emit SAML login event.") } - return &re.auth, nil -} - -type samlAuthResponse struct { - auth SAMLAuthResponse - attributeStatements map[string][]string -} - -func (a *Server) validateSAMLResponse(samlResponse string) (*samlAuthResponse, error) { - ctx := context.TODO() - requestID, err := parseSAMLInResponseTo(samlResponse) if err != nil { return nil, trace.Wrap(err) } - request, err := a.Identity.GetSAMLAuthRequest(requestID) + return auth, nil +} + +func (a *Server) validateSAMLResponse(ctx context.Context, diagCtx *ssoDiagContext, samlResponse string) (*SAMLAuthResponse, error) { + requestID, err := ParseSAMLInResponseTo(samlResponse) if err != nil { return nil, trace.Wrap(err) } - connector, err := a.Identity.GetSAMLConnector(ctx, request.ConnectorID, true) + diagCtx.requestID = requestID + + request, err := a.Identity.GetSAMLAuthRequest(ctx, requestID) if err != nil { - return nil, trace.Wrap(err) + return nil, trace.Wrap(err, "Failed to get SAML Auth Request") } - provider, err := a.getSAMLProvider(connector) + diagCtx.info.TestFlow = request.SSOTestFlow + + connector, provider, err := a.getConnectorAndProvider(ctx, *request) if err != nil { - return nil, trace.Wrap(err) + return nil, trace.Wrap(err, "Failed to get SAML connector and provider") } + assertionInfo, err := provider.RetrieveAssertionInfo(samlResponse) if err != nil { - return nil, trace.AccessDenied( - "received response with incorrect or missing attribute statements, please check the identity provider configuration to make sure that mappings for claims/attribute statements are set up correctly. , failed to retrieve SAML assertion info from response: %v.", err) + return nil, trace.AccessDenied("received response with incorrect or missing attribute statements, please check the identity provider configuration to make sure that mappings for claims/attribute statements are set up correctly. , failed to retrieve SAML assertion info from response: %v.", err).AddUserMessage("Failed to retrieve assertion info. This may indicate IdP configuration error.") + } + + if assertionInfo != nil { + diagCtx.info.SAMLAssertionInfo = (*types.AssertionInfo)(assertionInfo) } if assertionInfo.WarningInfo.InvalidTime { - return nil, trace.AccessDenied("invalid time in SAML assertion info") + return nil, trace.AccessDenied("invalid time in SAML assertion info").AddUserMessage("SAML assertion info contained warning: invalid time.") } if assertionInfo.WarningInfo.NotInAudience { - return nil, trace.AccessDenied("no audience in SAML assertion info") + return nil, trace.AccessDenied("no audience in SAML assertion info").AddUserMessage("SAML: not in expected audience. Check auth connector audience field and IdP configuration for typos and other errors.") } log.Debugf("Obtained SAML assertions for %q.", assertionInfo.NameID) - re := &samlAuthResponse{ - attributeStatements: make(map[string][]string), - } + log.Debugf("SAML assertion warnings: %+v.", assertionInfo.WarningInfo) + + attributeStatements := map[string][]string{} + for key, val := range assertionInfo.Values { var vals []string for _, vv := range val.Values { vals = append(vals, vv.Value) } log.Debugf("SAML assertion: %q: %q.", key, vals) - re.attributeStatements[key] = vals + attributeStatements[key] = vals } - log.Debugf("SAML assertion warnings: %+v.", assertionInfo.WarningInfo) + diagCtx.info.SAMLAttributeStatements = attributeStatements + diagCtx.info.SAMLAttributesToRoles = connector.GetAttributesToRoles() if len(connector.GetAttributesToRoles()) == 0 { - return re, trace.BadParameter("no attributes to roles mapping, check connector documentation") + return nil, trace.BadParameter("no attributes to roles mapping, check connector documentation").AddUserMessage("Attributes-to-roles mapping is empty, SSO user will never have any roles.") } + log.Debugf("Applying %v SAML attribute to roles mappings.", len(connector.GetAttributesToRoles())) // Calculate (figure out name, roles, traits, session TTL) of user and // create the user in the backend. - params, err := a.calculateSAMLUser(connector, *assertionInfo, request) + params, err := a.calculateSAMLUser(diagCtx, connector, *assertionInfo, request) if err != nil { - return re, trace.Wrap(err) + return nil, trace.Wrap(err, "Failed to calculate user attributes.") } - user, err := a.createSAMLUser(params) + + diagCtx.info.CreateUserParams = &types.CreateUserParams{ + ConnectorName: params.connectorName, + Username: params.username, + Logins: params.logins, + KubeGroups: params.kubeGroups, + KubeUsers: params.kubeUsers, + Roles: params.roles, + Traits: params.traits, + SessionTTL: types.Duration(params.sessionTTL), + } + + user, err := a.createSAMLUser(params, request.SSOTestFlow) if err != nil { - return re, trace.Wrap(err) + return nil, trace.Wrap(err, "Failed to create user from provided parameters.") } // Auth was successful, return session, certificate, etc. to caller. - re.auth = SAMLAuthResponse{ + auth := &SAMLAuthResponse{ Req: *request, Identity: types.ExternalIdentity{ ConnectorID: params.connectorName, @@ -425,6 +510,12 @@ func (a *Server) validateSAMLResponse(samlResponse string) (*samlAuthResponse, e Username: user.GetName(), } + // In test flow skip signing and creating web sessions. + if request.SSOTestFlow { + diagCtx.info.Success = true + return auth, nil + } + // If the request is coming from a browser, create a web session. if request.CreateWebSession { session, err := a.createWebSession(ctx, types.NewWebSessionRequest{ @@ -434,25 +525,26 @@ func (a *Server) validateSAMLResponse(samlResponse string) (*samlAuthResponse, e SessionTTL: params.sessionTTL, LoginTime: a.clock.Now().UTC(), }) + if err != nil { - return re, trace.Wrap(err) + return nil, trace.Wrap(err, "Failed to create web session.") } - re.auth.Session = session + auth.Session = session } // If a public key was provided, sign it and return a certificate. if len(request.PublicKey) != 0 { sshCert, tlsCert, err := a.createSessionCert(user, params.sessionTTL, request.PublicKey, request.Compatibility, request.RouteToCluster, request.KubernetesCluster) if err != nil { - return nil, trace.Wrap(err) + return nil, trace.Wrap(err, "Failed to create session certificate.") } clusterName, err := a.GetClusterName() if err != nil { - return nil, trace.Wrap(err) + return nil, trace.Wrap(err, "Failed to obtain cluster name.") } - re.auth.Cert = sshCert - re.auth.TLSCert = tlsCert + auth.Cert = sshCert + auth.TLSCert = tlsCert // Return the host CA for this cluster only. authority, err := a.GetCertAuthority(ctx, types.CertAuthID{ @@ -460,10 +552,11 @@ func (a *Server) validateSAMLResponse(samlResponse string) (*samlAuthResponse, e DomainName: clusterName.GetClusterName(), }, false) if err != nil { - return nil, trace.Wrap(err) + return nil, trace.Wrap(err, "Failed to obtain cluster's host CA.") } - re.auth.HostSigners = append(re.auth.HostSigners, authority) + auth.HostSigners = append(auth.HostSigners, authority) } - return re, nil + diagCtx.info.Success = true + return auth, nil } diff --git a/lib/auth/saml_test.go b/lib/auth/saml_test.go index 0700b6b3bb63f..60bd679e958ce 100644 --- a/lib/auth/saml_test.go +++ b/lib/auth/saml_test.go @@ -18,17 +18,28 @@ package auth import ( "context" + "crypto/rand" + "crypto/rsa" + "crypto/x509/pkix" + "encoding/base64" + "encoding/xml" "net/url" "testing" "time" + apidefaults "github.com/gravitational/teleport/api/defaults" "github.com/gravitational/teleport/api/types" authority "github.com/gravitational/teleport/lib/auth/testauthority" "github.com/gravitational/teleport/lib/backend/lite" + "github.com/gravitational/teleport/lib/defaults" "github.com/gravitational/teleport/lib/fixtures" "github.com/gravitational/teleport/lib/services" + "github.com/gravitational/teleport/lib/tlsca" + "github.com/gravitational/teleport/lib/utils" "github.com/jonboulle/clockwork" + saml2 "github.com/russellhaering/gosaml2" + samltypes "github.com/russellhaering/gosaml2/types" "github.com/stretchr/testify/require" ) @@ -56,6 +67,21 @@ func TestCreateSAMLUser(t *testing.T) { a, err := NewServer(authConfig) require.NoError(t, err) + // Dry-run creation of SAML user. + user, err := a.createSAMLUser(&createUserParams{ + connectorName: "samlService", + username: "foo@example.com", + logins: []string{"foo"}, + roles: []string{"admin"}, + sessionTTL: 1 * time.Minute, + }, true) + require.NoError(t, err) + require.Equal(t, "foo@example.com", user.GetName()) + + // Dry-run must not create a user. + _, err = a.GetUser("foo@example.com", false) + require.Error(t, err) + // Create SAML user with 1 minute expiry. _, err = a.createSAMLUser(&createUserParams{ connectorName: "samlService", @@ -63,7 +89,7 @@ func TestCreateSAMLUser(t *testing.T) { logins: []string{"foo"}, roles: []string{"admin"}, sessionTTL: 1 * time.Minute, - }) + }, false) require.NoError(t, err) // Within that 1 minute period the user should still exist. @@ -221,3 +247,377 @@ func TestPingSAMLWorkaround(t *testing.T) { require.NotEmpty(t, parsed.Query().Get("SigAlg"), "SigAlg is required for provider: ping") require.NotEmpty(t, parsed.Query().Get("Signature"), "Signature is required for provider: ping") } + +func TestServer_getConnectorAndProvider(t *testing.T) { + // Create a Server instance for testing. + c := clockwork.NewFakeClockAt(time.Now()) + b, err := lite.NewWithConfig(context.Background(), lite.Config{ + Path: t.TempDir(), + PollStreamPeriod: 200 * time.Millisecond, + Clock: c, + }) + require.NoError(t, err) + + clusterName, err := services.NewClusterNameWithRandomID(types.ClusterNameSpecV2{ + ClusterName: "me.localhost", + }) + require.NoError(t, err) + + authConfig := &InitConfig{ + ClusterName: clusterName, + Backend: b, + Authority: authority.New(), + SkipPeriodicOperations: true, + } + + a, err := NewServer(authConfig) + require.NoError(t, err) + + caKey, err := rsa.GenerateKey(rand.Reader, 2048) + require.NoError(t, err) + + tlsCert, err := tlsca.GenerateSelfSignedCAWithSigner( + caKey, + pkix.Name{ + CommonName: "server1", + Organization: []string{"server1"}, + }, nil, defaults.CATTL) + require.NoError(t, err) + require.NotNil(t, tlsCert) + + keyPEM, certPEM, err := utils.GenerateSelfSignedSigningCert(pkix.Name{ + Organization: []string{"Teleport OSS"}, + CommonName: "teleport.localhost.localdomain", + }, nil, 10*365*24*time.Hour) + require.NoError(t, err) + + request := services.SAMLAuthRequest{ + ID: "ABC", + ConnectorID: "zzz", + CheckUser: false, + PublicKey: nil, + CertTTL: 0, + CreateWebSession: false, + SSOTestFlow: true, + ConnectorSpec: &types.SAMLConnectorSpecV2{ + Issuer: "test", + Audience: "test", + ServiceProviderIssuer: "test", + SSO: "test", + Cert: string(tlsCert), + AssertionConsumerService: "test", + AttributesToRoles: []types.AttributeMapping{{ + Name: "foo", + Value: "bar", + Roles: []string{"baz"}, + }}, + SigningKeyPair: &types.AsymmetricKeyPair{ + PrivateKey: string(keyPEM), + Cert: string(certPEM), + }, + }, + } + + connector, provider, err := a.getConnectorAndProvider(context.Background(), request) + require.NoError(t, err) + require.NotNil(t, connector) + require.NotNil(t, provider) + + expectedConnector := &types.SAMLConnectorV2{Kind: "saml", Version: "v2", Metadata: types.Metadata{Name: "zzz", Namespace: apidefaults.Namespace}, Spec: *request.ConnectorSpec} + require.Equal(t, expectedConnector, connector) + + require.Equal(t, "test", provider.IdentityProviderSSOURL) + require.Equal(t, "test", provider.IdentityProviderIssuer) + require.Equal(t, "test", provider.AssertionConsumerServiceURL) + require.Equal(t, "test", provider.ServiceProviderIssuer) + + conn, err := types.NewSAMLConnector("foo", types.SAMLConnectorSpecV2{ + Issuer: "test", + SSO: "test", + Cert: string(tlsCert), + AssertionConsumerService: "test", + AttributesToRoles: []types.AttributeMapping{{ + Name: "foo", + Value: "bar", + Roles: []string{"baz"}, + }}, + }) + require.NoError(t, err) + + err = a.CreateSAMLConnector(conn) + require.NoError(t, err) + + request2 := services.SAMLAuthRequest{ + ID: "ABC", + ConnectorID: "foo", + SSOTestFlow: false, + } + + connector, provider, err = a.getConnectorAndProvider(context.Background(), request2) + require.NoError(t, err) + require.NotNil(t, connector) + require.NotNil(t, provider) + +} + +func TestServer_ValidateSAMLResponse(t *testing.T) { + // Create a Server instance for testing. + c := clockwork.NewFakeClockAt(time.Date(2022, 04, 25, 9, 0, 0, 0, time.UTC)) + b, err := lite.NewWithConfig(context.Background(), lite.Config{ + Path: t.TempDir(), + PollStreamPeriod: 200 * time.Millisecond, + Clock: c, + }) + require.NoError(t, err) + + clusterName, err := services.NewClusterNameWithRandomID(types.ClusterNameSpecV2{ + ClusterName: "me.localhost", + }) + require.NoError(t, err) + + authConfig := &InitConfig{ + ClusterName: clusterName, + Backend: b, + Authority: authority.New(), + SkipPeriodicOperations: true, + } + + a, err := NewServer(authConfig) + require.NoError(t, err) + + a.SetClock(c) + + // empty response gives error. + response, err := a.ValidateSAMLResponse(context.Background(), "") + require.Nil(t, response) + require.Error(t, err) + + // create role referenced in request. + role, err := types.NewRole("access", types.RoleSpecV5{ + Allow: types.RoleConditions{ + Logins: []string{"dummy"}, + }, + }) + require.NoError(t, err) + err = a.CreateRole(role) + require.NoError(t, err) + + // real response from Okta + respOkta := `http://www.okta.com/exk14fxcpjuKMcor30h8uBRfvYvl5C/LPCh36uAmRLHW76+aDP3ngChtIwP3/Fc=M1VfkOOBH6r7niHhfGvf4OJ1HH5QJl83aD/b+mTDUUnXzHXgXlkb0BGQkSFn6ixojwCoXchpxCNzVLPN/tvfyY1dxP4MO8b+/07bGuVD2yTNlhN43/FFcDpmZ1ZDW8w2nPF1E5gy1lR8Wx2NgT3kQ2Ui1vRNX/KeX/P9NnABj4AjcshyHK2e49WLM/D4U84XOl7ODtzS7PTvtB0SGIwRE25G//8AsAv81eBfHL54Nz1HAqinMhxQtz32ZDXpKaAV6GypyBTvk6vo7Pkk4OiL6G9VIGC8Bd/gnavsc+Ickfuo7KTq8NDKTLB5WG34XKJqq6dGopSMrxr67oYjCEDZfw==MIIDpDCCAoygAwIBAgIGAX4zyofpMA0GCSqGSIb3DQEBCwUAMIGSMQswCQYDVQQGEwJVUzETMBEG +A1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzENMAsGA1UECgwET2t0YTEU +MBIGA1UECwwLU1NPUHJvdmlkZXIxEzARBgNVBAMMCmRldi04MTMzNTQxHDAaBgkqhkiG9w0BCQEW +DWluZm9Ab2t0YS5jb20wHhcNMjIwMTA3MDkwNTU4WhcNMzIwMTA3MDkwNjU4WjCBkjELMAkGA1UE +BhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xDTALBgNV +BAoMBE9rdGExFDASBgNVBAsMC1NTT1Byb3ZpZGVyMRMwEQYDVQQDDApkZXYtODEzMzU0MRwwGgYJ +KoZIhvcNAQkBFg1pbmZvQG9rdGEuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA +xQz+tLD5cNlOBfdohHvqNWIfC13OCSnUAe20qA0K8y+jtZrpwjtjjLX8iRuCx8dYc/nd6zYOhhSq +2sLmrRa09wUXXTgnLGcj50gePTaroYLyF4FNgQWLvPHJk0FGcx6JvD6L+V5RzYwH87Fhg8niP4LZ +EBw3iZnsIJN9KOuLuQeXTW0PIlMFzpCwT9aUCHCoLepe5Ou8oi8XcOCmsOESHPchV2RC/xQDIqRP +Lp1Sf7NNJ6mTmP2gOoLwsz95beOLrEI+PI/GgZBqM3OutWA0L9mAbJK9T5dPAvhnwCV+SK2HvicJ +T8c6uJxuKmoWv1t3SyaN0cIbmw6vj9CIf4DTwQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQCWGgLL +f3tgUZRGjmR5iiKeOeaEWG/eaF1nfenVfSaWT9ckimcXyLCY/P7CXEBiioVrxjky07iceJpi4rVE +RcVZ8SGXCa0NroESmIFlIHez6vRTrqUsfDmidxsSCwY02eaBq+9gK5iXV5WeXMKbn0yeGwF+3PkU +RAH1HuypwMH0FJRLIdW36pw7FCrGrXpk3UC6mEumXC9FptjSK1FlW+ZckgDprePOoUpypEygr2UC +XXOsqT0dwBUUttdOQMZHqIiXS5VPJ8zhYPHBGYI8WGk5FWVuXIXhgRm7LN/EyXIvCOFmDH0tVnQL +V115UGOwvjOOxmOFbYBn865SHgMndFtrhttp://www.okta.com/exk14fxcpjuKMcor30h8XwJSotSzU2qLdzu/WDk8dpQ/Cy1Id88932S/95+N+Ds=qyIvGi1+w93AdGUj0+T5RYAq+CAjLSScMTMc7dLTEze6qr3mP51W/bCoZz8E47lpsbLeh0EiATa6h2Uaj6/34rILfCt3aQRNjNicu0gBKhePyNraapdnoyeqJEV8UrAOOKFiH30e5AvQ1nRZqfgY7KMt6cZH5/eXjUS63lPJJn4yr9vLw9loCdHCoHlaseh2IHi7CickyyxSMTX+Y58zpBy2g/KwN3K4oZM4a10ZYWkZpzkZJXDRSUkEc/wTTO7IPPY7Zv7R7UC+zjf5Px1sYeKTkkIxlZViZmtqjYuhibnTmhroJx7wX/LtOPxCkwLHlQRDACBNbP/UtrudU1ZMxA==MIIDpDCCAoygAwIBAgIGAX4zyofpMA0GCSqGSIb3DQEBCwUAMIGSMQswCQYDVQQGEwJVUzETMBEG +A1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzENMAsGA1UECgwET2t0YTEU +MBIGA1UECwwLU1NPUHJvdmlkZXIxEzARBgNVBAMMCmRldi04MTMzNTQxHDAaBgkqhkiG9w0BCQEW +DWluZm9Ab2t0YS5jb20wHhcNMjIwMTA3MDkwNTU4WhcNMzIwMTA3MDkwNjU4WjCBkjELMAkGA1UE +BhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xDTALBgNV +BAoMBE9rdGExFDASBgNVBAsMC1NTT1Byb3ZpZGVyMRMwEQYDVQQDDApkZXYtODEzMzU0MRwwGgYJ +KoZIhvcNAQkBFg1pbmZvQG9rdGEuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA +xQz+tLD5cNlOBfdohHvqNWIfC13OCSnUAe20qA0K8y+jtZrpwjtjjLX8iRuCx8dYc/nd6zYOhhSq +2sLmrRa09wUXXTgnLGcj50gePTaroYLyF4FNgQWLvPHJk0FGcx6JvD6L+V5RzYwH87Fhg8niP4LZ +EBw3iZnsIJN9KOuLuQeXTW0PIlMFzpCwT9aUCHCoLepe5Ou8oi8XcOCmsOESHPchV2RC/xQDIqRP +Lp1Sf7NNJ6mTmP2gOoLwsz95beOLrEI+PI/GgZBqM3OutWA0L9mAbJK9T5dPAvhnwCV+SK2HvicJ +T8c6uJxuKmoWv1t3SyaN0cIbmw6vj9CIf4DTwQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQCWGgLL +f3tgUZRGjmR5iiKeOeaEWG/eaF1nfenVfSaWT9ckimcXyLCY/P7CXEBiioVrxjky07iceJpi4rVE +RcVZ8SGXCa0NroESmIFlIHez6vRTrqUsfDmidxsSCwY02eaBq+9gK5iXV5WeXMKbn0yeGwF+3PkU +RAH1HuypwMH0FJRLIdW36pw7FCrGrXpk3UC6mEumXC9FptjSK1FlW+ZckgDprePOoUpypEygr2UC +XXOsqT0dwBUUttdOQMZHqIiXS5VPJ8zhYPHBGYI8WGk5FWVuXIXhgRm7LN/EyXIvCOFmDH0tVnQL +V115UGOwvjOOxmOFbYBn865SHgMndFtrops@gravitational.iohttps://boson.tener.io:3080/v1/webapi/saml/acsurn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransportops@gravitational.ioEveryoneokta-adminokta-dev` + + caKey, err := rsa.GenerateKey(rand.Reader, 2048) + require.NoError(t, err) + + tlsCert, err := tlsca.GenerateSelfSignedCAWithSigner( + caKey, + pkix.Name{ + CommonName: "server1", + Organization: []string{"server1"}, + }, nil, defaults.CATTL) + require.NoError(t, err) + require.NotNil(t, tlsCert) + + keyPEM, certPEM, err := utils.GenerateSelfSignedSigningCert(pkix.Name{ + Organization: []string{"Teleport OSS"}, + CommonName: "teleport.localhost.localdomain", + }, nil, 10*365*24*time.Hour) + require.NoError(t, err) + + conn, err := types.NewSAMLConnector("saml-test-conn", types.SAMLConnectorSpecV2{ + Issuer: "test", + SSO: "test", + Cert: string(tlsCert), + AssertionConsumerService: "test", + AttributesToRoles: []types.AttributeMapping{{ + Name: "foo", + Value: "bar", + Roles: []string{"baz"}, + }}, + SigningKeyPair: &types.AsymmetricKeyPair{ + PrivateKey: string(keyPEM), + Cert: string(certPEM), + }, + }) + require.NoError(t, err) + + err = a.CreateSAMLConnector(conn) + require.NoError(t, err) + + err = a.Identity.CreateSAMLAuthRequest(services.SAMLAuthRequest{ + ID: "_4f256462-6c2d-466d-afc0-6ee36602b6f2", + ConnectorID: "saml-test-conn", + SSOTestFlow: true, + RedirectURL: "https://dev-813354.oktapreview.com/app/dev-813354_krzysztofssodev_1/exk14fxcpjuKMcor30h8/sso/saml?SAMLRequest=lFZZk6JKE%2F0rHc6jYbOIiMbtiSgWEREEQVBfbrAUUMiiFFLgr%2F9i7Jm%2BPXf75j5mUifz5MmMJH%2FDQVlcl%2BDeZtUe3u4Qty99WVR4%2BfzwNro31bIOMMLLKighXrbR0gHGdsm%2B0strU7d1VBejT5B%2FRwQYw6ZFdTV60eS30e9cws54jmcnfMTGE47n40mQRPSEh3DK8zQb8gk7evFgg1FdvY3YV3r0Yn3PKqIqRlX67wnD90d4uXZda2LtHHf0An6QkOoK30vYOLDpUAQP%2B%2B3bKGvbK15SVFjjunptYQWbV1Qvp7RAUx1DERgGV0R9q5QKIjx60TC%2BQ63CbVC1byOWZtkJzU3YmUsLy9lsyQjn0YsMcYuqoH3W8CNBDLuJwEynM%2B61vrTBtYEdguQ1qksquF4%2Fff790jwG%2FGjrBOM6ht3vDAX7C8MlfXTN77oR1c2UzgQK4%2FrJa%2FT12dTlk1nz9b8V9Bv1GftbjJcOSqugvTfwe5Nj%2FF7DkqIIIa9k%2Blo3KcXSNE3RC6ovixij9MvoAwtjrUrqpykFVV2hKCjQ4ymGAdusjl9AkdYNarPyHwLzFMN%2BCzyJGK5imBH1M69fjMJQNPeD3qSsG%2FilwcEEZwE747%2BH3MMENrCK4Mthr72NvvzaeD6hbhNUOKmbEv9s%2Fl9aP6kGqw4W9RXGE%2Fyjuu%2FUfj3g36hF%2FZWgjFKI2%2F8oHayiLz8J9h7FC4o7%2FGogv2z54Iyj8bXj7FAoDc5Dwf3O0atwvsq3Ju%2FKBm0Bcnh7MvoMfjo%2B5H83%2FzQ8H%2F1%2BR2wJqAs5PUmLBA%2B5pPtrwRn4rhbER6QzrNHr9h1nztqm1S0kJT1Oo0NfxHRdnvx%2B27Lurbdl8FgdEZvM3FBqnV1DeHisSX7ezTHT24DMvdJBpb%2FlrVj0UmQk%2BVHhB1MyU65CSl2t1cHyBANokpgwPbrm86ne%2BBssK0UEVoAqlKFREkvel%2BWM7Qkv7MVOsUg0X%2FM3Yc1x2prVjXw4CUVxccn6UO53BsObdG4MpcBNGcYaWyp9NBQXcRTKtqSdVpyo7zM7PA6OQ53nJ0%2BMTGtqHpFmVLfxdnaKUpMa32Wt2N%2Bsy0NYr8aC7gxb5KPAnR%2Flta%2B0VaWa8I5XdyHSZ3XZiMM4Ho9tKaHA29uH9J%2B0%2Fia%2FDoePVhxn9EIO2uDDkL7t0wRFQQu%2FGpom6w9JAtkuBUQTQartwVbT871EMqWEfmR2ZGASUToQ2T5t9PqsZV1kAlvZijYgtqx4hmiogDkoUmYYnurh81HsospOXcZ0DSciG%2Fske7YtK%2F2MPvt9EamLIZZmOGTNLFSzLpra91Bd5Ce%2Fv4QskwU%2BR9ZZZBq5RkxZYww5ZYyHwvnffI%2Bnb%2Fjw5SIw9geikGcOXSH94Y8conVgjH7zAIWYmp4IDHdd7YtQ9Ug43dDbsu9O7AoH6uLxB599F%2Fqra5hLEnC0P9csijaQ01SxgCxJwK6lNFVEYAZRd7v7M%2BFkb1nIzriDojbZoOe3vb2z8xUppklq%2BWaQ9tNq84j53vOPQqEG7KbjFFo93MIT2GoBVXgNOCVuy9oqdDirWoiHq6pTV9NKdySK52MZjvO5hjMLye6miZrHoqR7nN96vqwyTKsb%2FZTz7W63urT12CWsdlmV05vNRw6rcpcdjw26i3w%2FgNhShGyfn%2BVNfM%2Bgf7xk1IWiu16cx7QVxoXZFJej1yyctR%2FHM51Hjqe4xgy4sraoSXSSbuJj8O%2F0GMw4xO38u5s6F3Z6m7GPqddGEb3SRKII6%2FMBGHGHUkd30Km51Xi%2FSFhm3%2FN%2BRBToqKs5ZeJzCQKj7u1wk%2FYL9mblYsBeBAkQBYDASA2RI3J6kr09bQF7TYnAlkEKgQHIt7mLFaKIFLElA4C%2Fm1H52SP56MXrtT1di%2FxxbqOHV9mUlKYPZacgQ2KkAveXIzxXIrPm3etKKRd5787nrSeqIt0vYjAopNyRE0iT8WrmbrSCL2%2FJoIVHfXxc9bcgquX1tWmt9lbe1ky7Z2l1EVlC2SdhOQ5v3LzZ%2BSbTpqDUir4P9vyZVV2Ffehk1g15fMYOiqX%2BEixOsS%2BAVImuldfCW583mHN2UYjijYbHC7PqW3DdWIa%2B2l3CS5dv%2BtkCXxIJm1VzEeSpBJGM3Dm1NuStwUXCVHFVmpMo52E6nVpcE54uXS2%2FDI8hBnqnIR2hBWZLRkfuDqu6d5GVZmyFRl1zA3%2Fci3Tr1WUs2f1DOm9lzCPSIVU9wGZOtPcF9Oel8uF8XzvU54X008L6%2Bv2gNYMSarJVFygaXkBR1ERqYNDCt1Hb3OHoZVU3ZdD%2B8%2B3IvDJPD4onyfPp8l7hK4xQgmD8%2FKf%2B9XD%2B%2Br8AAAD%2F%2Fw%3D%3D", + ClientRedirectURL: "http://127.0.0.1:57293/callback?secret_key=70e98f8871530e66e6a136ae71fe002454dc1c76d754f090f895508a2226c36b", + ConnectorSpec: &types.SAMLConnectorSpecV2{ + Issuer: "http://www.okta.com/exk14fxcpjuKMcor30h8", + SSO: "https://dev-813354.oktapreview.com/app/dev-813354_krzysztofssodev_1/exk14fxcpjuKMcor30h8/sso/saml", + Cert: "", + Display: "Okta", + AssertionConsumerService: "https://boson.tener.io:3080/v1/webapi/saml/acs", + Audience: "https://boson.tener.io:3080/v1/webapi/saml/acs", + ServiceProviderIssuer: "https://boson.tener.io:3080/v1/webapi/saml/acs", + EntityDescriptor: "\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\u003cmd:EntityDescriptor entityID=\"http://www.okta.com/exk14fxcpjuKMcor30h8\" xmlns:md=\"urn:oasis:names:tc:SAML:2.0:metadata\"\u003e\u003cmd:IDPSSODescriptor WantAuthnRequestsSigned=\"false\" protocolSupportEnumeration=\"urn:oasis:names:tc:SAML:2.0:protocol\"\u003e\u003cmd:KeyDescriptor use=\"signing\"\u003e\u003cds:KeyInfo xmlns:ds=\"http://www.w3.org/2000/09/xmldsig#\"\u003e\u003cds:X509Data\u003e\u003cds:X509Certificate\u003eMIIDpDCCAoygAwIBAgIGAX4zyofpMA0GCSqGSIb3DQEBCwUAMIGSMQswCQYDVQQGEwJVUzETMBEG\nA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzENMAsGA1UECgwET2t0YTEU\nMBIGA1UECwwLU1NPUHJvdmlkZXIxEzARBgNVBAMMCmRldi04MTMzNTQxHDAaBgkqhkiG9w0BCQEW\nDWluZm9Ab2t0YS5jb20wHhcNMjIwMTA3MDkwNTU4WhcNMzIwMTA3MDkwNjU4WjCBkjELMAkGA1UE\nBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xDTALBgNV\nBAoMBE9rdGExFDASBgNVBAsMC1NTT1Byb3ZpZGVyMRMwEQYDVQQDDApkZXYtODEzMzU0MRwwGgYJ\nKoZIhvcNAQkBFg1pbmZvQG9rdGEuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\nxQz+tLD5cNlOBfdohHvqNWIfC13OCSnUAe20qA0K8y+jtZrpwjtjjLX8iRuCx8dYc/nd6zYOhhSq\n2sLmrRa09wUXXTgnLGcj50gePTaroYLyF4FNgQWLvPHJk0FGcx6JvD6L+V5RzYwH87Fhg8niP4LZ\nEBw3iZnsIJN9KOuLuQeXTW0PIlMFzpCwT9aUCHCoLepe5Ou8oi8XcOCmsOESHPchV2RC/xQDIqRP\nLp1Sf7NNJ6mTmP2gOoLwsz95beOLrEI+PI/GgZBqM3OutWA0L9mAbJK9T5dPAvhnwCV+SK2HvicJ\nT8c6uJxuKmoWv1t3SyaN0cIbmw6vj9CIf4DTwQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQCWGgLL\nf3tgUZRGjmR5iiKeOeaEWG/eaF1nfenVfSaWT9ckimcXyLCY/P7CXEBiioVrxjky07iceJpi4rVE\nRcVZ8SGXCa0NroESmIFlIHez6vRTrqUsfDmidxsSCwY02eaBq+9gK5iXV5WeXMKbn0yeGwF+3PkU\nRAH1HuypwMH0FJRLIdW36pw7FCrGrXpk3UC6mEumXC9FptjSK1FlW+ZckgDprePOoUpypEygr2UC\nXXOsqT0dwBUUttdOQMZHqIiXS5VPJ8zhYPHBGYI8WGk5FWVuXIXhgRm7LN/EyXIvCOFmDH0tVnQL\nV115UGOwvjOOxmOFbYBn865SHgMndFtr\u003c/ds:X509Certificate\u003e\u003c/ds:X509Data\u003e\u003c/ds:KeyInfo\u003e\u003c/md:KeyDescriptor\u003e\u003cmd:NameIDFormat\u003eurn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress\u003c/md:NameIDFormat\u003e\u003cmd:SingleSignOnService Binding=\"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST\" Location=\"https://dev-813354.oktapreview.com/app/dev-813354_krzysztofssodev_1/exk14fxcpjuKMcor30h8/sso/saml\"/\u003e\u003cmd:SingleSignOnService Binding=\"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect\" Location=\"https://dev-813354.oktapreview.com/app/dev-813354_krzysztofssodev_1/exk14fxcpjuKMcor30h8/sso/saml\"/\u003e\u003c/md:IDPSSODescriptor\u003e\u003c/md:EntityDescriptor\u003e", + EntityDescriptorURL: "", + AttributesToRoles: []types.AttributeMapping{ + { + Name: "groups", + Value: "okta-admin", + Roles: []string{"access"}, + }, + }, + SigningKeyPair: &types.AsymmetricKeyPair{ + PrivateKey: "-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEA1py+q5bnxhAvZ7bnhQQauHIqOpFA5CMXCXd+A9Y1qDHecnN3\nrFVZfyUZrYm/gTQZSptgAshr+VWsBh9O3ZAZ5Lg+f0FSkYr+k0+A7Bx3v4N76Psi\nyE+INMmtyvP2bTGyOrHqaeGzQYkpiPq044WS2j5PDYiQWbepDpxLYbiQ7qwzS9xZ\nZp6w8TyFGNkMl26F5ZeSH+T/S/EHt3Q9t2U2uWRdWv1IdZ13krqJJURMzkBMMj2j\nBxgKoHPJa7T4DniLg5a5OBKTbernbPdW1xzQUgHATwdlQAx2+KBIpKJiuqixH1/b\nVHHpZzAR5IYXv82xmYBoyjFBsmDH3ao+MFraTwIDAQABAoIBAQCEXZbINEHtiiwC\n1u/Cvb5RRrC/ALm6O95Ii3egnCzp+SAPDSKhmt6hKdvFifEgmmaC+oPkE4Ns/Ccm\ne4bj5q3hwLVjPYHUnJrZdq64cfJ1n338O3C/hTYoAL/9Li0uOfmIdBV1iqxJ3nRM\ntPx+W/MwQj/1w+XsP/e4ODPSKMjTOyZkLVhArLA2qBM3l1NBWQw4EV96m1Dvjq2o\nxFYhSODZOYDYXq82NZya3cBzj30kEB/6fNk6qPAsMa3Ck7F/9mx3MA2XM/S0aB/U\nq+5I1g+mTAMPKa2c2Tv2hwWuRU9ddKGiXuw/gHPoBwEU7AVNk+nNSVDhj5/pqcFB\nM/lPNg6xAoGBAPu/oICyXwlXYfsvkTx+HHpY7Imq8RtBUjVpD3z+LC6+QydlF2Z/\nNqLDxBPZAAdA7VGzw5QdNR8DKY9EgeRQAcci8FIqjueTPQDVKl9kwJzOxqg8DM8t\nR8YpIOtP22JvjHAkFafBq9cWYZNLQwVabIkCdc0jUruN53WKRkj+b0npAoGBANo8\nkX7ypsS+riLu6Ez89tXHV78CW8eMb/Wxsa2hgrzd7KmgjYdj2wlfRaEY6pSvBA1Y\nMvy/Emvm2KhwuGzWWPJvoaQq/Hr6Puns9DVP8U3TTJDC3R5dDZUQ0DiVUGyez9Qu\nXV5aNMnXFjGPdRQYjGM1zG6677dM0CVYu/6MVSd3AoGBAN5X3tALufgsHzOUTXfa\nAhjk1PS573yc8piNk8pXSnp2PCVdGY/DJ2QV9uV4sJe3dmLEnCYCrdoYFuqcHQSi\nzQ8uAobvY4uP9T75BhV+jMdxsO8BKmcInO2dgZ+SxjZoQucAV8f0O2saL0/CFw1x\nUY6oh5aIbheMOzMKzwzE+1GRAoGAYm5FFWPuUfjK49irj+XckulZKz6uFJ/D86YU\nxIJ/TB4wWwWeL/2a0mxVJGbvjuYtRrOMM7EeZup0t+w3UmePMLGmzzvQKstpyupj\n7xPCe16dPwGU59gCg0RVFeBKqOMsS8Apvp+jBZJsYSgaH1k/IJQoQ50u95a+nsmZ\n6SJ0WdsCgYBfTcIJ456LNPQ7sjDtcqIQcbBgXYIt/u4dIhz0zuLSfvTrXAtcy7nU\nEDU+N2Ay715GmS+/iwc592Itam93t3sl1ql/Y+SrrxGQ7zRd6MALKIxM0+4qptB5\nDFXT1B5qhKHdZFr71AIGPrUjfsRQV8tPKFjRkuQ0zqEPvi4g06RMRw==\n-----END RSA PRIVATE KEY-----\n", + Cert: "-----BEGIN CERTIFICATE-----\nMIIDKzCCAhOgAwIBAgIRALIKjRCwhEmeWcNvwy1fBCUwDQYJKoZIhvcNAQELBQAw\nQDEVMBMGA1UEChMMVGVsZXBvcnQgT1NTMScwJQYDVQQDEx50ZWxlcG9ydC5sb2Nh\nbGhvc3QubG9jYWxkb21haW4wHhcNMjIwNDI1MDg1MzE4WhcNMzIwNDIyMDg1MzE4\nWjBAMRUwEwYDVQQKEwxUZWxlcG9ydCBPU1MxJzAlBgNVBAMTHnRlbGVwb3J0Lmxv\nY2FsaG9zdC5sb2NhbGRvbWFpbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\nggEBANacvquW58YQL2e254UEGrhyKjqRQOQjFwl3fgPWNagx3nJzd6xVWX8lGa2J\nv4E0GUqbYALIa/lVrAYfTt2QGeS4Pn9BUpGK/pNPgOwcd7+De+j7IshPiDTJrcrz\n9m0xsjqx6mnhs0GJKYj6tOOFkto+Tw2IkFm3qQ6cS2G4kO6sM0vcWWaesPE8hRjZ\nDJduheWXkh/k/0vxB7d0PbdlNrlkXVr9SHWdd5K6iSVETM5ATDI9owcYCqBzyWu0\n+A54i4OWuTgSk23q52z3Vtcc0FIBwE8HZUAMdvigSKSiYrqosR9f21Rx6WcwEeSG\nF7/NsZmAaMoxQbJgx92qPjBa2k8CAwEAAaMgMB4wDgYDVR0PAQH/BAQDAgeAMAwG\nA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggEBADXVdHHQ3HB6X7QizVnQ/Cgg\nzEOEiMC1ClsxkXeZnB1H6TpFEm9jxT77tVBGB0x9dAyEwmOwYAgf+F5TJIl6mqfy\nIbXK+XFxqacoDHprtPtqmqH1tR20G9cP8mxfbm+bq47rOWN1tgAmIlxxaR6Z2GTE\n2zKw5vyjdZsSidCxka9YdW8AgEcpnVteqxjrs4SOcbidJIs+9NnxtApJPMKFOkbk\nvjJx59skfCsNnrk8D3CeiDiT7/HMDLM4c83ETG04C/SzNSvGlpf60mTIjkyzydAK\nvIiKii9s2m1KiTOsGKVkDEr+PbMoo4y6XRB0tVomdCQxzCZLDs6iwviGGUer7wI=\n-----END CERTIFICATE-----\n", + }, + Provider: "", + EncryptionKeyPair: nil, + }, + }, defaults.SAMLAuthRequestTTL) + require.NoError(t, err) + + // check ValidateSAMLResponse + response, err = a.ValidateSAMLResponse(context.Background(), base64.StdEncoding.EncodeToString([]byte(respOkta))) + require.NoError(t, err) + require.NotNil(t, response) + + // check internal method, validate diagnostic outputs. + diagCtx := a.newSSODiagContext(types.KindSAML) + auth, err := a.validateSAMLResponse(context.Background(), diagCtx, base64.StdEncoding.EncodeToString([]byte(respOkta))) + require.NoError(t, err) + + // ensure diag info got stored and is identical. + infoFromBackend, err := a.GetSSODiagnosticInfo(context.Background(), types.KindSAML, auth.Req.ID) + require.NoError(t, err) + require.Equal(t, &diagCtx.info, infoFromBackend) + + // verify values + require.Equal(t, "ops@gravitational.io", auth.Username) + require.Equal(t, "ops@gravitational.io", auth.Identity.Username) + require.Equal(t, "saml-test-conn", auth.Identity.ConnectorID) + require.Equal(t, "_4f256462-6c2d-466d-afc0-6ee36602b6f2", auth.Req.ID) + require.Equal(t, 0, len(auth.HostSigners)) + + authnInstant := time.Date(2022, 04, 25, 8, 3, 11, 779000000, time.UTC) + + // ignore, this is boring and very complex. + require.NotNil(t, diagCtx.info.SAMLAssertionInfo.Assertions) + diagCtx.info.SAMLAssertionInfo.Assertions = nil + + require.Equal(t, types.SSODiagnosticInfo{ + TestFlow: true, + Error: "", + Success: true, + CreateUserParams: &types.CreateUserParams{ + ConnectorName: "saml-test-conn", + Username: "ops@gravitational.io", + Roles: []string{"access"}, + Traits: map[string][]string{ + "groups": {"Everyone", "okta-admin", "okta-dev"}, + "username": {"ops@gravitational.io"}, + }, + SessionTTL: 108000000000000, + }, + SAMLAttributesToRoles: []types.AttributeMapping{ + { + Name: "groups", + Value: "okta-admin", + Roles: []string{"access"}, + }, + }, + SAMLAttributesToRolesWarnings: nil, + SAMLAttributeStatements: map[string][]string{ + "groups": {"Everyone", "okta-admin", "okta-dev"}, + "username": {"ops@gravitational.io"}, + }, + SAMLAssertionInfo: &types.AssertionInfo{ + NameID: "ops@gravitational.io", + Values: map[string]samltypes.Attribute{ + "groups": { + XMLName: xml.Name{Space: "urn:oasis:names:tc:SAML:2.0:assertion", Local: "Attribute"}, + Name: "groups", + NameFormat: "urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified", + Values: []samltypes.AttributeValue{ + { + XMLName: xml.Name{Space: "urn:oasis:names:tc:SAML:2.0:assertion", Local: "AttributeValue"}, + Value: "Everyone", + }, + { + XMLName: xml.Name{Space: "urn:oasis:names:tc:SAML:2.0:assertion", Local: "AttributeValue"}, + Value: "okta-admin", + }, + { + XMLName: xml.Name{Space: "urn:oasis:names:tc:SAML:2.0:assertion", Local: "AttributeValue"}, + Value: "okta-dev", + }, + }, + }, + "username": { + XMLName: xml.Name{Space: "urn:oasis:names:tc:SAML:2.0:assertion", Local: "Attribute"}, + Name: "username", + NameFormat: "urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified", + Values: []samltypes.AttributeValue{ + { + XMLName: xml.Name{Space: "urn:oasis:names:tc:SAML:2.0:assertion", Local: "AttributeValue"}, + Value: "ops@gravitational.io", + }, + }, + }, + }, + WarningInfo: &saml2.WarningInfo{}, + SessionIndex: "_4f256462-6c2d-466d-afc0-6ee36602b6f2", + AuthnInstant: &authnInstant, + SessionNotOnOrAfter: nil, + Assertions: nil, + ResponseSignatureValidated: true, + }, + SAMLTraitsFromAssertions: map[string][]string{ + "groups": {"Everyone", "okta-admin", "okta-dev"}, + "username": {"ops@gravitational.io"}, + }, + SAMLConnectorTraitMapping: []types.TraitMapping{ + { + Trait: "groups", + Value: "okta-admin", + Roles: []string{"access"}, + }, + }, + }, diagCtx.info) + + // make sure no users have been created. + users, err := a.GetUsers(false) + require.NoError(t, err) + require.Equal(t, 0, len(users)) +} diff --git a/lib/auth/sso_diag_context.go b/lib/auth/sso_diag_context.go new file mode 100644 index 0000000000000..415de9d0c3aff --- /dev/null +++ b/lib/auth/sso_diag_context.go @@ -0,0 +1,54 @@ +/* +Copyright 2022 Gravitational, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package auth + +import ( + "context" + + "github.com/gravitational/teleport/api/types" +) + +// ssoDiagContext is a helper type for accumulating the SSO diagnostic info prior to writing it to the backend. +type ssoDiagContext struct { + // authKind is auth kind such as types.KindSAML + authKind string + // createSSODiagnosticInfo is a callback to create the types.SSODiagnosticInfo record in the backend. + createSSODiagnosticInfo func(ctx context.Context, authKind string, authRequestID string, info types.SSODiagnosticInfo) error + // requestID is the ID of the auth request being processed. + requestID string + // info accumulates SSO diagnostic info + info types.SSODiagnosticInfo +} + +// writeToBackend saves the accumulated SSO diagnostic information to the backend. +func (c *ssoDiagContext) writeToBackend(ctx context.Context) { + if c.info.TestFlow { + err := c.createSSODiagnosticInfo(ctx, c.authKind, c.requestID, c.info) + if err != nil { + log.WithError(err).WithField("requestID", c.requestID).Warn("failed to write SSO diag info data") + } + } +} + +// newSSODiagContext returns new ssoDiagContext referencing particular Server. +// authKind must be one of supported auth kinds (e.g. types.KindSAML). +func (a *Server) newSSODiagContext(authKind string) *ssoDiagContext { + return &ssoDiagContext{ + authKind: authKind, + createSSODiagnosticInfo: a.Identity.CreateSSODiagnosticInfo, + } +} diff --git a/lib/auth/sso_diag_context_test.go b/lib/auth/sso_diag_context_test.go new file mode 100644 index 0000000000000..ca9fc6a5d65ae --- /dev/null +++ b/lib/auth/sso_diag_context_test.go @@ -0,0 +1,54 @@ +/* +Copyright 2022 Gravitational, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package auth + +import ( + "context" + "testing" + + "github.com/gravitational/teleport/api/types" + "github.com/stretchr/testify/require" +) + +func Test_ssoDiagContext_writeToBackend(t *testing.T) { + diag := &ssoDiagContext{ + authKind: types.KindSAML, + requestID: "123", + info: types.SSODiagnosticInfo{}, + } + + callCount := 0 + + diag.createSSODiagnosticInfo = func(ctx context.Context, authKind string, authRequestID string, info types.SSODiagnosticInfo) error { + callCount++ + require.Truef(t, info.TestFlow, "createSSODiagnosticInfo must not be called if info.TestFlow is false.") + require.Equal(t, diag.authKind, authKind) + require.Equal(t, diag.requestID, authRequestID) + require.Equal(t, diag.info, info) + return nil + } + + // with TestFlow: false, no call is made. + diag.info.TestFlow = false + diag.writeToBackend(context.Background()) + require.Equal(t, 0, callCount) + + // with TestFlow: true, a call is made. + diag.info.TestFlow = true + diag.writeToBackend(context.Background()) + require.Equal(t, 1, callCount) +} diff --git a/lib/client/api.go b/lib/client/api.go index 01be263a0db90..9f232eca2fbf4 100644 --- a/lib/client/api.go +++ b/lib/client/api.go @@ -2791,7 +2791,7 @@ func (tc *TeleportClient) ssoLogin(ctx context.Context, connectorID string, pub Protocol: protocol, BindAddr: tc.BindAddr, Browser: tc.Browser, - }) + }, nil) return response, trace.Wrap(err) } diff --git a/lib/client/redirect.go b/lib/client/redirect.go index 78324c9f2c0cb..bb68150ac16ac 100644 --- a/lib/client/redirect.go +++ b/lib/client/redirect.go @@ -75,10 +75,18 @@ type Redirector struct { context context.Context // cancel broadcasts cancel cancel context.CancelFunc + // RedirectorConfig allows customization of Redirector + RedirectorConfig +} + +// RedirectorConfig allows customization of Redirector +type RedirectorConfig struct { + // SSOLoginConsoleRequestFn allows customizing issuance of SSOLoginConsoleReq. Optional. + SSOLoginConsoleRequestFn func(req SSOLoginConsoleReq) (*SSOLoginConsoleResponse, error) } // NewRedirector returns new local web server redirector -func NewRedirector(ctx context.Context, login SSHLoginSSO) (*Redirector, error) { +func NewRedirector(ctx context.Context, login SSHLoginSSO, config *RedirectorConfig) (*Redirector, error) { clt, proxyURL, err := initClient(login.ProxyAddr, login.Insecure, login.Pool) if err != nil { return nil, trace.Wrap(err) @@ -91,9 +99,9 @@ func NewRedirector(ctx context.Context, login SSHLoginSSO) (*Redirector, error) return nil, trace.Wrap(err) } - context, cancel := context.WithCancel(ctx) + ctxCancel, cancel := context.WithCancel(ctx) rd := &Redirector{ - context: context, + context: ctxCancel, cancel: cancel, proxyClient: clt, proxyURL: proxyURL, @@ -105,6 +113,14 @@ func NewRedirector(ctx context.Context, login SSHLoginSSO) (*Redirector, error) errorC: make(chan error, 1), } + if config != nil { + rd.RedirectorConfig = *config + } + + if rd.SSOLoginConsoleRequestFn == nil { + rd.SSOLoginConsoleRequestFn = rd.issueSSOLoginConsoleRequest + } + // callback is a callback URL communicated to the Teleport proxy, // after SAML/OIDC login, the teleport will redirect user's browser // to this laptop-local URL @@ -145,7 +161,7 @@ func (rd *Redirector) Start() error { query.Set("secret_key", rd.key.String()) u.RawQuery = query.Encode() - out, err := rd.proxyClient.PostJSON(rd.context, rd.proxyClient.Endpoint("webapi", rd.Protocol, "login", "console"), SSOLoginConsoleReq{ + req := SSOLoginConsoleReq{ RedirectURL: u.String(), PublicKey: rd.PubKey, CertTTL: rd.TTL, @@ -153,24 +169,37 @@ func (rd *Redirector) Start() error { Compatibility: rd.Compatibility, RouteToCluster: rd.RouteToCluster, KubernetesCluster: rd.KubernetesCluster, - }) - if err != nil { - return trace.Wrap(err) } - var re *SSOLoginConsoleResponse - err = json.Unmarshal(out.Bytes(), &re) + response, err := rd.SSOLoginConsoleRequestFn(req) if err != nil { return trace.Wrap(err) } + // notice late binding of the redirect URL here, it is referenced // in the callback handler, but is known only after the request // is sent to the Teleport Proxy, that's why // redirectURL is a SyncString - rd.redirectURL.Set(re.RedirectURL) + rd.redirectURL.Set(response.RedirectURL) return nil } +// issueSSOLoginConsoleRequest is default implementation, but may be overridden via RedirectorConfig.IssueSSOLoginConsoleRequest. +func (rd *Redirector) issueSSOLoginConsoleRequest(req SSOLoginConsoleReq) (*SSOLoginConsoleResponse, error) { + out, err := rd.proxyClient.PostJSON(rd.context, rd.proxyClient.Endpoint("webapi", rd.Protocol, "login", "console"), req) + if err != nil { + return nil, trace.Wrap(err) + } + + var re *SSOLoginConsoleResponse + err = json.Unmarshal(out.Bytes(), &re) + if err != nil { + return nil, trace.Wrap(err) + } + + return re, nil +} + // Done is called when redirector is closed // or parent context is closed func (rd *Redirector) Done() <-chan struct{} { @@ -202,6 +231,11 @@ func (rd *Redirector) callback(w http.ResponseWriter, r *http.Request) (*auth.SS return nil, trace.NotFound("path not found") } + if r.URL.Query().Has("err") { + err := r.URL.Query().Get("err") + return nil, trace.Errorf("identity provider callback failed with error: %v", err) + } + // Decrypt ciphertext to get login response. plaintext, err := rd.key.Open([]byte(r.URL.Query().Get("response"))) if err != nil { diff --git a/lib/client/weblogin.go b/lib/client/weblogin.go index 0ac9963d97511..91fa16650982a 100644 --- a/lib/client/weblogin.go +++ b/lib/client/weblogin.go @@ -262,8 +262,8 @@ func initClient(proxyAddr string, insecure bool, pool *x509.CertPool) (*WebClien } // SSHAgentSSOLogin is used by tsh to fetch user credentials using OpenID Connect (OIDC) or SAML. -func SSHAgentSSOLogin(ctx context.Context, login SSHLoginSSO) (*auth.SSHLoginResponse, error) { - rd, err := NewRedirector(ctx, login) +func SSHAgentSSOLogin(ctx context.Context, login SSHLoginSSO, config *RedirectorConfig) (*auth.SSHLoginResponse, error) { + rd, err := NewRedirector(ctx, login, config) if err != nil { return nil, trace.Wrap(err) } diff --git a/lib/events/codes.go b/lib/events/codes.go index bdc2814dcd25c..c36f3e1a56a2a 100644 --- a/lib/events/codes.go +++ b/lib/events/codes.go @@ -64,6 +64,10 @@ const ( // RecoveryCodeUseFailureCode is an event code for when a // recovery code was not used successfully. RecoveryCodeUseFailureCode = "T1009W" + // UserSSOTestFlowLoginCode is the successful SSO test flow user login event code. + UserSSOTestFlowLoginCode = "T1010I" + // UserSSOTestFlowLoginFailureCode is the unsuccessful SSO test flow user login event code. + UserSSOTestFlowLoginFailureCode = "T1011W" // BillingCardCreateCode is an event code for when a user creates a new credit card. BillingCardCreateCode = "TBL00I" diff --git a/lib/services/identity.go b/lib/services/identity.go index 8f2426fe4280d..29d1e096ad089 100644 --- a/lib/services/identity.go +++ b/lib/services/identity.go @@ -203,8 +203,14 @@ type Identity interface { // CreateSAMLAuthRequest creates new auth request CreateSAMLAuthRequest(req SAMLAuthRequest, ttl time.Duration) error - // GetSAMLAuthRequest returns OSAML auth request if found - GetSAMLAuthRequest(id string) (*SAMLAuthRequest, error) + // GetSAMLAuthRequest returns SAML auth request if found + GetSAMLAuthRequest(ctx context.Context, id string) (*SAMLAuthRequest, error) + + // CreateSSODiagnosticInfo creates new SSO diagnostic info record. + CreateSSODiagnosticInfo(ctx context.Context, authKind string, authRequestID string, entry types.SSODiagnosticInfo) error + + // GetSSODiagnosticInfo returns SSO diagnostic info records. + GetSSODiagnosticInfo(ctx context.Context, authKind string, authRequestID string) (*types.SSODiagnosticInfo, error) // CreateGithubConnector creates a new Github connector CreateGithubConnector(connector types.GithubConnector) error @@ -476,6 +482,12 @@ type SAMLAuthRequest struct { // KubernetesCluster is the name of Kubernetes cluster to issue credentials for. KubernetesCluster string `json:"kubernetes_cluster,omitempty"` + + // SSOTestFlow indicates if the request is part of the test flow. + SSOTestFlow bool `json:"sso_test_flow"` + + // ConnectorSpec is embedded connector spec for use in test flow. + ConnectorSpec *types.SAMLConnectorSpecV2 `json:"connector_spec,omitempty"` } // Check returns nil if all parameters are great, err otherwise @@ -493,6 +505,15 @@ func (i *SAMLAuthRequest) Check() error { } } + // we could collapse these two checks into one, but the error message would become ambiguous. + if i.SSOTestFlow && i.ConnectorSpec == nil { + return trace.BadParameter("ConnectorSpec cannot be nil when SSOTestFlow is true") + } + + if !i.SSOTestFlow && i.ConnectorSpec != nil { + return trace.BadParameter("ConnectorSpec must be nil when SSOTestFlow is false") + } + return nil } diff --git a/lib/services/identity_test.go b/lib/services/identity_test.go new file mode 100644 index 0000000000000..43b81ca52bfc6 --- /dev/null +++ b/lib/services/identity_test.go @@ -0,0 +1,115 @@ +/* +Copyright 2022 Gravitational, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package services + +import ( + "testing" + "time" + + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/trace" + "github.com/stretchr/testify/require" +) + +func TestSAMLAuthRequest_Check(t *testing.T) { + const exampleSSHCert = `ssh-rsa-cert-v01@openssh.com AAAAHHNzaC1yc2EtY2VydC12MDFAb3BlbnNzaC5jb20AAAAgb1srW/W3ZDjYAO45xLYAwzHBDLsJ4Ux6ICFIkTjb1LEAAAADAQABAAAAYQCkoR51poH0wE8w72cqSB8Sszx+vAhzcMdCO0wqHTj7UNENHWEXGrU0E0UQekD7U+yhkhtoyjbPOVIP7hNa6aRk/ezdh/iUnCIt4Jt1v3Z1h1P+hA4QuYFMHNB+rmjPwAcAAAAAAAAAAAAAAAEAAAAEdGVzdAAAAAAAAAAAAAAAAP//////////AAAAAAAAAIIAAAAVcGVybWl0LVgxMS1mb3J3YXJkaW5nAAAAAAAAABdwZXJtaXQtYWdlbnQtZm9yd2FyZGluZwAAAAAAAAAWcGVybWl0LXBvcnQtZm9yd2FyZGluZwAAAAAAAAAKcGVybWl0LXB0eQAAAAAAAAAOcGVybWl0LXVzZXItcmMAAAAAAAAAAAAAAHcAAAAHc3NoLXJzYQAAAAMBAAEAAABhANFS2kaktpSGc+CcmEKPyw9mJC4nZKxHKTgLVZeaGbFZOvJTNzBspQHdy7Q1uKSfktxpgjZnksiu/tFF9ngyY2KFoc+U88ya95IZUycBGCUbBQ8+bhDtw/icdDGQD5WnUwAAAG8AAAAHc3NoLXJzYQAAAGC8Y9Z2LQKhIhxf52773XaWrXdxP0t3GBVo4A10vUWiYoAGepr6rQIoGGXFxT4B9Gp+nEBJjOwKDXPrAevow0T9ca8gZN+0ykbhSrXLE5Ao48rqr3zP4O1/9P7e6gp0gw8=` + + tests := []struct { + name string + req SAMLAuthRequest + wantErr bool + }{ + { + name: "normal request", + req: SAMLAuthRequest{ + ConnectorID: "foo", + PublicKey: []byte(exampleSSHCert), + CertTTL: 60 * time.Minute, + }, + wantErr: false, + }, + { + name: "below min CertTTL", + req: SAMLAuthRequest{ + ConnectorID: "foo", + PublicKey: []byte(exampleSSHCert), + CertTTL: 1 * time.Second, + }, + wantErr: true, + }, + { + name: "above max CertTTL", + req: SAMLAuthRequest{ + ConnectorID: "foo", + PublicKey: []byte(exampleSSHCert), + CertTTL: 1000 * time.Hour, + }, + wantErr: true, + }, + { + name: "TTL ignored without cert", + req: SAMLAuthRequest{ + ConnectorID: "foo", + CertTTL: 60 * time.Minute, + }, + wantErr: false, + }, + { + name: "SSOTestFlow requires ConnectorSpec", + req: SAMLAuthRequest{ + ConnectorID: "foo", + PublicKey: []byte(exampleSSHCert), + CertTTL: 60 * time.Minute, + SSOTestFlow: true, + }, + wantErr: true, + }, + { + name: "ConnectorSpec requires SSOTestFlow", + req: SAMLAuthRequest{ + ConnectorID: "foo", + PublicKey: []byte(exampleSSHCert), + CertTTL: 60 * time.Minute, + ConnectorSpec: &types.SAMLConnectorSpecV2{Display: "dummy"}, + }, + wantErr: true, + }, + { + name: "ConnectorSpec with SSOTestFlow works", + req: SAMLAuthRequest{ + ConnectorID: "foo", + PublicKey: []byte(exampleSSHCert), + CertTTL: 60 * time.Minute, + SSOTestFlow: true, + ConnectorSpec: &types.SAMLConnectorSpecV2{Display: "dummy"}, + }, + wantErr: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.req.Check() + if tt.wantErr { + require.Error(t, err) + require.True(t, trace.IsBadParameter(err)) + } else { + require.NoError(t, err) + } + }) + } +} diff --git a/lib/services/local/users.go b/lib/services/local/users.go index 2f64cd2c8ce70..1d8df2e342d1c 100644 --- a/lib/services/local/users.go +++ b/lib/services/local/users.go @@ -1200,11 +1200,11 @@ func (s *IdentityService) CreateSAMLAuthRequest(req services.SAMLAuthRequest, tt } // GetSAMLAuthRequest returns SAML auth request if found -func (s *IdentityService) GetSAMLAuthRequest(id string) (*services.SAMLAuthRequest, error) { +func (s *IdentityService) GetSAMLAuthRequest(ctx context.Context, id string) (*services.SAMLAuthRequest, error) { if id == "" { return nil, trace.BadParameter("missing parameter id") } - item, err := s.Get(context.TODO(), backend.Key(webPrefix, connectorsPrefix, samlPrefix, requestsPrefix, id)) + item, err := s.Get(ctx, backend.Key(webPrefix, connectorsPrefix, samlPrefix, requestsPrefix, id)) if err != nil { return nil, trace.Wrap(err) } @@ -1215,6 +1215,62 @@ func (s *IdentityService) GetSAMLAuthRequest(id string) (*services.SAMLAuthReque return &req, nil } +// CreateSSODiagnosticInfo creates new SAML diagnostic info record. +func (s *IdentityService) CreateSSODiagnosticInfo(ctx context.Context, authKind string, authRequestID string, entry types.SSODiagnosticInfo) error { + if authRequestID == "" { + return trace.BadParameter("missing parameter authRequestID") + } + + switch authKind { + case types.KindSAML, types.KindGithub, types.KindOIDC: + // nothing to do + default: + return trace.BadParameter("unsupported authKind %q", authKind) + } + + jsonValue, err := json.Marshal(entry) + if err != nil { + return trace.Wrap(err) + } + + item := backend.Item{ + Key: backend.Key(webPrefix, connectorsPrefix, authKind, requestsTracePrefix, authRequestID), + Value: jsonValue, + Expires: backend.Expiry(s.Clock(), time.Minute*15), + } + _, err = s.Create(ctx, item) + if err != nil { + return trace.Wrap(err) + } + return nil +} + +// GetSSODiagnosticInfo returns SSO diagnostic info records. +func (s *IdentityService) GetSSODiagnosticInfo(ctx context.Context, authKind string, authRequestID string) (*types.SSODiagnosticInfo, error) { + if authRequestID == "" { + return nil, trace.BadParameter("missing parameter authRequestID") + } + + switch authKind { + case types.KindSAML, types.KindGithub, types.KindOIDC: + // nothing to do + default: + return nil, trace.BadParameter("unsupported authKind %q", authKind) + } + + item, err := s.Get(ctx, backend.Key(webPrefix, connectorsPrefix, authKind, requestsTracePrefix, authRequestID)) + if err != nil { + return nil, trace.Wrap(err) + } + + var req types.SSODiagnosticInfo + if err := json.Unmarshal(item.Value, &req); err != nil { + return nil, trace.Wrap(err) + } + + return &req, nil +} + // CreateGithubConnector creates a new Github connector func (s *IdentityService) CreateGithubConnector(connector types.GithubConnector) error { if err := connector.CheckAndSetDefaults(); err != nil { @@ -1485,6 +1541,7 @@ const ( samlPrefix = "saml" githubPrefix = "github" requestsPrefix = "requests" + requestsTracePrefix = "requestsTrace" usedTOTPPrefix = "used_totp" usedTOTPTTL = 30 * time.Second mfaDevicePrefix = "mfa" diff --git a/lib/services/local/users_test.go b/lib/services/local/users_test.go index 424d78d8e09d9..21cc1485023f1 100644 --- a/lib/services/local/users_test.go +++ b/lib/services/local/users_test.go @@ -762,3 +762,41 @@ func TestIdentityService_UpsertGlobalWebauthnSessionData_maxLimit(t *testing.T) require.NoError(t, identity.UpsertGlobalWebauthnSessionData(ctx, scopeLogin, id3, sd)) require.NoError(t, identity.UpsertGlobalWebauthnSessionData(ctx, scopeOther, id3, sd)) } + +func TestIdentityService_SSODiagnosticInfoCrud(t *testing.T) { + identity := newIdentityService(t, clockwork.NewFakeClock()) + ctx := context.Background() + + nilInfo, err := identity.GetSSODiagnosticInfo(ctx, types.KindSAML, "BAD_ID") + require.Nil(t, nilInfo) + require.Error(t, err) + + info := types.SSODiagnosticInfo{ + TestFlow: true, + Error: "foo bar baz", + Success: false, + CreateUserParams: &types.CreateUserParams{ + ConnectorName: "bar", + Username: "baz", + }, + SAMLAttributesToRoles: []types.AttributeMapping{ + { + Name: "foo", + Value: "bar", + Roles: []string{"baz"}, + }, + }, + SAMLAttributesToRolesWarnings: nil, + SAMLAttributeStatements: nil, + SAMLAssertionInfo: nil, + SAMLTraitsFromAssertions: nil, + SAMLConnectorTraitMapping: nil, + } + + err = identity.CreateSSODiagnosticInfo(ctx, types.KindSAML, "MY_ID", info) + require.NoError(t, err) + + infoGet, err := identity.GetSSODiagnosticInfo(ctx, types.KindSAML, "MY_ID") + require.NoError(t, err) + require.Equal(t, &info, infoGet) +} diff --git a/lib/services/saml.go b/lib/services/saml.go index 09f2963a2c893..563babcc901a6 100644 --- a/lib/services/saml.go +++ b/lib/services/saml.go @@ -69,7 +69,7 @@ func ValidateSAMLConnector(sc types.SAMLConnector) error { } sc.SetIssuer(metadata.EntityID) - if len(metadata.IDPSSODescriptor.SingleSignOnServices) > 0 { + if metadata.IDPSSODescriptor != nil && len(metadata.IDPSSODescriptor.SingleSignOnServices) > 0 { sc.SetSSO(metadata.IDPSSODescriptor.SingleSignOnServices[0].Location) } } @@ -95,6 +95,10 @@ func ValidateSAMLConnector(sc types.SAMLConnector) error { }) } + if len(sc.GetAttributesToRoles()) == 0 { + return trace.BadParameter("attributes_to_roles is empty, authorization with connector would never assign any roles") + } + log.Debugf("[SAML] SSO: %v", sc.GetSSO()) log.Debugf("[SAML] Issuer: %v", sc.GetIssuer()) log.Debugf("[SAML] ACS: %v", sc.GetAssertionConsumerService()) @@ -124,33 +128,45 @@ func SAMLAssertionsToTraits(assertions saml2.AssertionInfo) map[string][]string return traits } -// GetSAMLServiceProvider gets the SAMLConnector's service provider -func GetSAMLServiceProvider(sc types.SAMLConnector, clock clockwork.Clock) (*saml2.SAMLServiceProvider, error) { - certStore := dsig.MemoryX509CertificateStore{ - Roots: []*x509.Certificate{}, +// CheckSAMLEntityDescriptor checks if the entity descriptor XML is valid and has at least one valid certificate. +func CheckSAMLEntityDescriptor(entityDescriptor string) ([]*x509.Certificate, error) { + if entityDescriptor == "" { + return nil, nil } - if sc.GetEntityDescriptor() != "" { - metadata := &samltypes.EntityDescriptor{} - if err := xml.Unmarshal([]byte(sc.GetEntityDescriptor()), metadata); err != nil { - return nil, trace.Wrap(err, "failed to parse entity_descriptor") - } + metadata := &samltypes.EntityDescriptor{} + if err := xml.Unmarshal([]byte(entityDescriptor), metadata); err != nil { + return nil, trace.Wrap(err, "failed to parse entity_descriptor") + } - for _, kd := range metadata.IDPSSODescriptor.KeyDescriptors { - for _, samlCert := range kd.KeyInfo.X509Data.X509Certificates { - certData, err := base64.StdEncoding.DecodeString(strings.TrimSpace(samlCert.Data)) - if err != nil { - return nil, trace.Wrap(err, "failed to decode certificate defined in entity_descriptor") - } - cert, err := x509.ParseCertificate(certData) - if err != nil { - return nil, trace.Wrap(err, "failed to parse certificate defined in entity_descriptor") - } - certStore.Roots = append(certStore.Roots, cert) + var roots []*x509.Certificate + + for _, kd := range metadata.IDPSSODescriptor.KeyDescriptors { + for _, samlCert := range kd.KeyInfo.X509Data.X509Certificates { + certData, err := base64.StdEncoding.DecodeString(strings.TrimSpace(samlCert.Data)) + if err != nil { + return nil, trace.Wrap(err, "failed to decode certificate defined in entity_descriptor") + } + cert, err := x509.ParseCertificate(certData) + if err != nil { + return nil, trace.Wrap(err, "failed to parse certificate defined in entity_descriptor") } + roots = append(roots, cert) } } + return roots, nil +} + +// GetSAMLServiceProvider gets the SAMLConnector's service provider +func GetSAMLServiceProvider(sc types.SAMLConnector, clock clockwork.Clock) (*saml2.SAMLServiceProvider, error) { + roots, errEd := CheckSAMLEntityDescriptor(sc.GetEntityDescriptor()) + if errEd != nil { + return nil, trace.Wrap(errEd) + } + + certStore := dsig.MemoryX509CertificateStore{Roots: roots} + if sc.GetCert() != "" { cert, err := tlsca.ParseCertificatePEM([]byte(sc.GetCert())) if err != nil { diff --git a/lib/services/saml_test.go b/lib/services/saml_test.go index d1d77509cef6e..551a97299f7a5 100644 --- a/lib/services/saml_test.go +++ b/lib/services/saml_test.go @@ -18,10 +18,12 @@ package services import ( "strings" + "testing" "github.com/gravitational/teleport/lib/defaults" "github.com/gravitational/teleport/lib/fixtures" + "github.com/stretchr/testify/require" "gopkg.in/check.v1" kyaml "k8s.io/apimachinery/pkg/util/yaml" ) @@ -49,3 +51,20 @@ func (s *SAMLSuite) TestParseFromMetadata(c *check.C) { c.Assert(oc.GetSigningKeyPair(), check.NotNil) c.Assert(oc.GetAttributes(), check.DeepEquals, []string{"groups"}) } + +func TestCheckSAMLEntityDescriptor(t *testing.T) { + input := fixtures.SAMLOktaConnectorV2 + + decoder := kyaml.NewYAMLOrJSONDecoder(strings.NewReader(input), defaults.LookaheadBufSize) + var raw UnknownResource + err := decoder.Decode(&raw) + require.NoError(t, err) + + oc, err := UnmarshalSAMLConnector(raw.Raw) + require.NoError(t, err) + + ed := oc.GetEntityDescriptor() + certs, err := CheckSAMLEntityDescriptor(ed) + require.NoError(t, err) + require.Len(t, certs, 1) +} diff --git a/lib/teleterm/clusters/cluster_auth.go b/lib/teleterm/clusters/cluster_auth.go index 0fd7282fc9f58..0e57c74d1edeb 100644 --- a/lib/teleterm/clusters/cluster_auth.go +++ b/lib/teleterm/clusters/cluster_auth.go @@ -157,7 +157,7 @@ func (c *Cluster) SSOLogin(ctx context.Context, providerType, providerName strin Protocol: providerType, BindAddr: c.clusterClient.BindAddr, Browser: c.clusterClient.Browser, - }) + }, nil) if err != nil { return trace.Wrap(err) } diff --git a/lib/web/apiserver.go b/lib/web/apiserver.go index b2fa5440524bb..6d8d7e56717ee 100644 --- a/lib/web/apiserver.go +++ b/lib/web/apiserver.go @@ -1378,6 +1378,19 @@ func ConstructSSHResponse(response AuthParams) (*url.URL, error) { return u, nil } +func redirectURLWithError(clientRedirectURL string, errReply error) (*url.URL, error) { + u, err := url.Parse(clientRedirectURL) + if err != nil { + return nil, trace.Wrap(err) + } + + values := u.Query() + values.Set("err", errReply.Error()) + + u.RawQuery = values.Encode() + return u, nil +} + // CreateSessionReq is a request to create session from username, password and // second factor token. type CreateSessionReq struct { diff --git a/lib/web/apiserver_test.go b/lib/web/apiserver_test.go index 191d7912ffd70..302510831d18c 100644 --- a/lib/web/apiserver_test.go +++ b/lib/web/apiserver_test.go @@ -581,7 +581,7 @@ func TestSAMLSuccess(t *testing.T) { id := doc.Root().SelectAttr("ID") require.NotNil(t, id) - authRequest, err := s.server.Auth().GetSAMLAuthRequest(id.Value) + authRequest, err := s.server.Auth().GetSAMLAuthRequest(context.Background(), id.Value) require.NoError(t, err) // now swap the request id to the hardcoded one in fixtures diff --git a/lib/web/saml.go b/lib/web/saml.go index f618404161802..74a857c642913 100644 --- a/lib/web/saml.go +++ b/lib/web/saml.go @@ -19,6 +19,8 @@ package web import ( "net/http" + "github.com/gravitational/teleport/lib/auth" + "github.com/gravitational/teleport/lib/client" "github.com/gravitational/teleport/lib/httplib" "github.com/gravitational/teleport/lib/services" @@ -96,9 +98,23 @@ func (h *Handler) samlACS(w http.ResponseWriter, r *http.Request, p httprouter.P return client.LoginFailedRedirectURL } - response, err := h.cfg.ProxyClient.ValidateSAMLResponse(samlResponse) + response, err := h.cfg.ProxyClient.ValidateSAMLResponse(r.Context(), samlResponse) + if err != nil { logger.WithError(err).Error("Error while processing callback.") + + // try to find the auth request, which bears the original client redirect URL. + // if found, use it to terminate the flow. + // + // this improves the UX by terminating the failed SSO flow immediately, rather than hoping for a timeout. + if requestID, errParse := auth.ParseSAMLInResponseTo(samlResponse); errParse == nil { + if request, errGet := h.cfg.ProxyClient.GetSAMLAuthRequest(r.Context(), requestID); errGet == nil && !request.CreateWebSession { + if url, errEnc := redirectURLWithError(request.ClientRedirectURL, err); errEnc == nil { + return url.String() + } + } + } + return client.LoginFailedBadCallbackRedirectURL }