diff --git a/chunker/json_parser.go b/chunker/json_parser.go index 2aac6c36d5f..7535f24310f 100644 --- a/chunker/json_parser.go +++ b/chunker/json_parser.go @@ -230,6 +230,11 @@ func handleBasicType(k string, v interface{}, op int, nq *api.NQuad) error { return nil } + if vf, err := types.ParseVFloat(v); err == nil { + nq.ObjectValue = &api.Value{Val: &api.Value_Vfloat32Val{Vfloat32Val: types.FloatArrayAsBytes(vf)}} + return nil + } + // Handle the uid function in upsert block s := stripSpaces(v) if strings.HasPrefix(s, "uid(") || strings.HasPrefix(s, "val(") { diff --git a/dql/mutation.go b/dql/mutation.go index c585ce42b51..da3e862b322 100644 --- a/dql/mutation.go +++ b/dql/mutation.go @@ -78,6 +78,11 @@ func TypeValFrom(val *api.Value) types.Val { return types.Val{Tid: types.DateTimeID, Value: val.GetDatetimeVal()} case *api.Value_PasswordVal: return types.Val{Tid: types.PasswordID, Value: val.GetPasswordVal()} + case *api.Value_Vfloat32Val: + return types.Val{ + Tid: types.VFloatID, + Value: types.BytesAsFloatArray(val.GetVfloat32Val()), + } case *api.Value_DefaultVal: return types.Val{Tid: types.DefaultID, Value: val.GetDefaultVal()} } diff --git a/go.mod b/go.mod index 85ffd6cf703..b94c209835e 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/Masterminds/semver/v3 v3.1.0 github.com/blevesearch/bleve/v2 v2.3.10 github.com/dgraph-io/badger/v4 v4.2.0 - github.com/dgraph-io/dgo/v230 v230.0.1 + github.com/dgraph-io/dgo/v230 v230.0.2-0.20240314155021-7b8d289e37f3 github.com/dgraph-io/gqlgen v0.13.2 github.com/dgraph-io/gqlparser/v2 v2.2.1 github.com/dgraph-io/graphql-transport-ws v0.0.0-20210511143556-2cef522f1f15 @@ -31,12 +31,12 @@ require ( github.com/gogo/protobuf v1.3.2 github.com/golang-jwt/jwt/v5 v5.0.0 github.com/golang/geo v0.0.0-20210211234256-740aa86cb551 - github.com/golang/glog v1.1.0 - github.com/golang/protobuf v1.5.3 + github.com/golang/glog v1.2.0 + github.com/golang/protobuf v1.5.4 github.com/golang/snappy v0.0.4 github.com/google/codesearch v1.0.0 - github.com/google/go-cmp v0.5.9 - github.com/google/uuid v1.3.0 + github.com/google/go-cmp v0.6.0 + github.com/google/uuid v1.6.0 github.com/gorilla/websocket v1.4.2 github.com/graph-gophers/graphql-go v1.3.0 github.com/hashicorp/vault/api v1.0.4 @@ -51,21 +51,20 @@ require ( github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.7.1 - github.com/stretchr/testify v1.8.4 + github.com/stretchr/testify v1.9.0 github.com/twpayne/go-geom v1.0.5 github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c go.etcd.io/etcd/raft/v3 v3.5.9 go.opencensus.io v0.24.0 go.uber.org/zap v1.16.0 - golang.org/x/crypto v0.19.0 - golang.org/x/net v0.21.0 + golang.org/x/crypto v0.21.0 + golang.org/x/net v0.22.0 golang.org/x/sync v0.6.0 - golang.org/x/sys v0.17.0 - golang.org/x/term v0.17.0 + golang.org/x/sys v0.18.0 + golang.org/x/term v0.18.0 golang.org/x/text v0.14.0 golang.org/x/tools v0.18.0 - google.golang.org/grpc v1.56.3 - google.golang.org/protobuf v1.33.0 + google.golang.org/grpc v1.62.1 gopkg.in/square/go-jose.v2 v2.3.1 gopkg.in/yaml.v2 v2.4.0 ) @@ -141,13 +140,13 @@ require ( github.com/xdg/stringprep v1.0.3 // indirect go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.10.0 // indirect - golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 // indirect golang.org/x/mod v0.15.0 // indirect golang.org/x/time v0.3.0 // indirect google.golang.org/api v0.122.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 // indirect + google.golang.org/appengine v1.6.8 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240311173647-c811ad7063a7 // indirect google.golang.org/grpc/examples v0.0.0-20230821201920-d51b3f41716d // indirect + google.golang.org/protobuf v1.33.0 // indirect gopkg.in/DataDog/dd-trace-go.v1 v1.22.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 4d7d8ee3155..b830cb4d6f0 100644 --- a/go.sum +++ b/go.sum @@ -147,8 +147,8 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= github.com/dgraph-io/badger/v4 v4.2.0 h1:kJrlajbXXL9DFTNuhhu9yCx7JJa4qpYWxtE8BzuWsEs= github.com/dgraph-io/badger/v4 v4.2.0/go.mod h1:qfCqhPoWDFJRx1gp5QwwyGo8xk1lbHUxvK9nK0OGAak= -github.com/dgraph-io/dgo/v230 v230.0.1 h1:kR7gI7/ZZv0jtG6dnedNgNOCxe1cbSG8ekF+pNfReks= -github.com/dgraph-io/dgo/v230 v230.0.1/go.mod h1:5FerO2h4LPOxR2XTkOAtqUUPaFdQ+5aBOHXPBJ3nT10= +github.com/dgraph-io/dgo/v230 v230.0.2-0.20240314155021-7b8d289e37f3 h1:SmlpAiFh38JkDUzMe2W/AIqel9HysM+4FIBNfxrsAO4= +github.com/dgraph-io/dgo/v230 v230.0.2-0.20240314155021-7b8d289e37f3/go.mod h1:N63npbH9PPVitTNUW4xlT66LNsMhqjuz57ZvgUmgATI= github.com/dgraph-io/gqlgen v0.13.2 h1:TNhndk+eHKj5qE7BenKKSYdSIdOGhLqxR1rCiMso9KM= github.com/dgraph-io/gqlgen v0.13.2/go.mod h1:iCOrOv9lngN7KAo+jMgvUPVDlYHdf7qDwsTkQby2Sis= github.com/dgraph-io/gqlparser/v2 v2.1.1/go.mod h1:MYS4jppjyx8b9tuUtjV7jU1UFZK6P9fvO8TsIsQtRKU= @@ -245,8 +245,8 @@ github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGw github.com/golang/geo v0.0.0-20210211234256-740aa86cb551 h1:gtexQ/VGyN+VVFRXSFiguSNcXmS6rkKT+X7FdIrTtfo= github.com/golang/geo v0.0.0-20210211234256-740aa86cb551/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= -github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= +github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= +github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -275,8 +275,9 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= @@ -299,8 +300,8 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= @@ -318,8 +319,8 @@ github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= @@ -642,8 +643,8 @@ github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5q github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -653,8 +654,8 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= @@ -734,8 +735,8 @@ golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo= -golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -748,9 +749,8 @@ golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6 h1:QE6XYQK6naiK1EPAe1g/ILLxN5RBoH5xkJk3CqlMI/Y= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 h1:LfspQV/FYTatPTr/3HzIcmiUFH7PGP+OQ6mgDYo3yuQ= -golang.org/x/exp v0.0.0-20240222234643-814bf88cf225/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -825,8 +825,8 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -907,13 +907,13 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U= -golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -923,6 +923,7 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= @@ -1035,8 +1036,9 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1074,8 +1076,8 @@ google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 h1:bVf09lpb+OJbByTj913DRJioFFAjf/ZGxEz7MajTp2U= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240311173647-c811ad7063a7 h1:8EeVk1VKMD+GD/neyEHGmz7pFblqPjHoi+PGQIlLx2s= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240311173647-c811ad7063a7/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -1095,8 +1097,8 @@ google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.56.3 h1:8I4C0Yq1EjstUzUJzpcRVbuYA2mODtEmpWiQoN/b2nc= -google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk= +google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= google.golang.org/grpc/examples v0.0.0-20230821201920-d51b3f41716d h1:E5qrHVmwghJoWs1NhlVvlzx/TL4WgUnnxm1IpOAfhvo= google.golang.org/grpc/examples v0.0.0-20230821201920-d51b3f41716d/go.mod h1:Tv7vK6WISirChRuVsnMR6m9Quxyd9k2vPozP/nyYv/0= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= diff --git a/graphql/e2e/common/error_test.yaml b/graphql/e2e/common/error_test.yaml index b17cb0d4f91..14903f4734f 100644 --- a/graphql/e2e/common/error_test.yaml +++ b/graphql/e2e/common/error_test.yaml @@ -56,12 +56,13 @@ gqlvariables: | { "filter": "type was wrong" } errors: - [ { "message": "Variable type provided AuthorFiltarzzz! is incompatible with expected - type AuthorFilter", - "locations": [{ "line": 2, "column": 23}]}, + [ { "message": "Variable \"$filter\" of type \"AuthorFiltarzzz!\" used in position expecting type \"AuthorFilter\".", "locations": [ { "line": 2, "column": 23 } ] }, + { "message": "Variable type provided AuthorFiltarzzz! is incompatible with expected + type AuthorFilter", + "locations": [{ "line": 2, "column": 23}]}, { "message": "Unknown type \"AuthorFiltarzzz\".", "locations": [ { "line": 1, "column": 1 } ] } ] diff --git a/graphql/resolve/validate_mutation_test.yaml b/graphql/resolve/validate_mutation_test.yaml index ee5a88b2ca4..545299d462e 100644 --- a/graphql/resolve/validate_mutation_test.yaml +++ b/graphql/resolve/validate_mutation_test.yaml @@ -18,9 +18,9 @@ explanation: "Add mutation expects an array instead of an object" validationerror: { "message": - "input:2: Variable type provided AddAuthorInput! is incompatible with expected type - [AddAuthorInput!]!\ninput:2: Variable \"$auth\" of type \"AddAuthorInput!\" used in - position expecting type \"[AddAuthorInput!]!\".\n" } + "input:2: Variable \"$auth\" of type \"AddAuthorInput!\" used in + position expecting type \"[AddAuthorInput!]!\".\ninput:2: Variable type provided AddAuthorInput! is incompatible with expected type + [AddAuthorInput!]!\n" } - diff --git a/protos/pb.proto b/protos/pb.proto index 1a19186dab8..2822f0124d6 100644 --- a/protos/pb.proto +++ b/protos/pb.proto @@ -93,6 +93,7 @@ message Result { repeated FacetsList facet_matrix = 5; repeated LangList lang_matrix = 6; bool list = 7; + map vector_metrics = 8; } message Order { @@ -377,6 +378,10 @@ message Posting { PASSWORD = 8; STRING = 9; OBJECT = 10; + // RESERVE 11 for BIGFLOAT, should we desire to pull + // that in at a later date. (There is a pending PR + // that uses this). + VFLOAT = 12; // Float64 Vector } ValType val_type = 3; enum PostingType { @@ -514,6 +519,20 @@ message SchemaUpdate { // Deleted field: reserved 7; reserved "explicit"; + + repeated VectorIndexSpec index_specs = 15; +} + +message VectorIndexSpec { + // This names the kind of Vector Index, e.g., + // hnsw, lsh, hypertree, ... + string name = 1; + repeated OptionPair options = 2; +} + +message OptionPair { + string key = 1; + string value = 2; } message TypeUpdate { diff --git a/protos/pb/pb.pb.go b/protos/pb/pb.pb.go index 8b00604f7cb..ff00e68c9df 100644 --- a/protos/pb/pb.pb.go +++ b/protos/pb/pb.pb.go @@ -136,6 +136,10 @@ const ( Posting_PASSWORD Posting_ValType = 8 Posting_STRING Posting_ValType = 9 Posting_OBJECT Posting_ValType = 10 + // RESERVE 11 for BIGFLOAT, should we desire to pull + // that in at a later date. (There is a pending PR + // that uses this). + Posting_VFLOAT Posting_ValType = 12 ) var Posting_ValType_name = map[int32]string{ @@ -150,6 +154,7 @@ var Posting_ValType_name = map[int32]string{ 8: "PASSWORD", 9: "STRING", 10: "OBJECT", + 12: "VFLOAT", } var Posting_ValType_value = map[string]int32{ @@ -164,6 +169,7 @@ var Posting_ValType_value = map[string]int32{ "PASSWORD": 8, "STRING": 9, "OBJECT": 10, + "VFLOAT": 12, } func (x Posting_ValType) String() string { @@ -258,7 +264,7 @@ func (x NumLeaseType) String() string { } func (NumLeaseType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{54, 0} + return fileDescriptor_f80abaa17e25ccc8, []int{56, 0} } type DropOperation_DropOp int32 @@ -289,7 +295,7 @@ func (x DropOperation_DropOp) String() string { } func (DropOperation_DropOp) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{63, 0} + return fileDescriptor_f80abaa17e25ccc8, []int{65, 0} } type BackupKey_KeyType int32 @@ -332,7 +338,7 @@ func (x BackupKey_KeyType) String() string { } func (BackupKey_KeyType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{66, 0} + return fileDescriptor_f80abaa17e25ccc8, []int{68, 0} } type List struct { @@ -731,13 +737,14 @@ func (m *LangList) GetLang() []string { } type Result struct { - UidMatrix []*List `protobuf:"bytes,1,rep,name=uid_matrix,json=uidMatrix,proto3" json:"uid_matrix,omitempty"` - ValueMatrix []*ValueList `protobuf:"bytes,2,rep,name=value_matrix,json=valueMatrix,proto3" json:"value_matrix,omitempty"` - Counts []uint32 `protobuf:"varint,3,rep,packed,name=counts,proto3" json:"counts,omitempty"` - IntersectDest bool `protobuf:"varint,4,opt,name=intersect_dest,json=intersectDest,proto3" json:"intersect_dest,omitempty"` - FacetMatrix []*FacetsList `protobuf:"bytes,5,rep,name=facet_matrix,json=facetMatrix,proto3" json:"facet_matrix,omitempty"` - LangMatrix []*LangList `protobuf:"bytes,6,rep,name=lang_matrix,json=langMatrix,proto3" json:"lang_matrix,omitempty"` - List bool `protobuf:"varint,7,opt,name=list,proto3" json:"list,omitempty"` + UidMatrix []*List `protobuf:"bytes,1,rep,name=uid_matrix,json=uidMatrix,proto3" json:"uid_matrix,omitempty"` + ValueMatrix []*ValueList `protobuf:"bytes,2,rep,name=value_matrix,json=valueMatrix,proto3" json:"value_matrix,omitempty"` + Counts []uint32 `protobuf:"varint,3,rep,packed,name=counts,proto3" json:"counts,omitempty"` + IntersectDest bool `protobuf:"varint,4,opt,name=intersect_dest,json=intersectDest,proto3" json:"intersect_dest,omitempty"` + FacetMatrix []*FacetsList `protobuf:"bytes,5,rep,name=facet_matrix,json=facetMatrix,proto3" json:"facet_matrix,omitempty"` + LangMatrix []*LangList `protobuf:"bytes,6,rep,name=lang_matrix,json=langMatrix,proto3" json:"lang_matrix,omitempty"` + List bool `protobuf:"varint,7,opt,name=list,proto3" json:"list,omitempty"` + VectorMetrics map[string]uint64 `protobuf:"bytes,8,rep,name=vector_metrics,json=vectorMetrics,proto3" json:"vector_metrics,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` } func (m *Result) Reset() { *m = Result{} } @@ -822,6 +829,13 @@ func (m *Result) GetList() bool { return false } +func (m *Result) GetVectorMetrics() map[string]uint64 { + if m != nil { + return m.VectorMetrics + } + return nil +} + type Order struct { Attr string `protobuf:"bytes,1,opt,name=attr,proto3" json:"attr,omitempty"` Desc bool `protobuf:"varint,2,opt,name=desc,proto3" json:"desc,omitempty"` @@ -3586,8 +3600,9 @@ type SchemaUpdate struct { NonNullableList bool `protobuf:"varint,11,opt,name=non_nullable_list,json=nonNullableList,proto3" json:"non_nullable_list,omitempty"` // If value_type is OBJECT, then this represents an object type with a // custom name. This field stores said name. - ObjectTypeName string `protobuf:"bytes,12,opt,name=object_type_name,json=objectTypeName,proto3" json:"object_type_name,omitempty"` - NoConflict bool `protobuf:"varint,13,opt,name=no_conflict,json=noConflict,proto3" json:"no_conflict,omitempty"` + ObjectTypeName string `protobuf:"bytes,12,opt,name=object_type_name,json=objectTypeName,proto3" json:"object_type_name,omitempty"` + NoConflict bool `protobuf:"varint,13,opt,name=no_conflict,json=noConflict,proto3" json:"no_conflict,omitempty"` + IndexSpecs []*VectorIndexSpec `protobuf:"bytes,15,rep,name=index_specs,json=indexSpecs,proto3" json:"index_specs,omitempty"` } func (m *SchemaUpdate) Reset() { *m = SchemaUpdate{} } @@ -3714,6 +3729,120 @@ func (m *SchemaUpdate) GetNoConflict() bool { return false } +func (m *SchemaUpdate) GetIndexSpecs() []*VectorIndexSpec { + if m != nil { + return m.IndexSpecs + } + return nil +} + +type VectorIndexSpec struct { + // This names the kind of Vector Index, e.g., + // + // hnsw, lsh, hypertree, ... + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Options []*OptionPair `protobuf:"bytes,2,rep,name=options,proto3" json:"options,omitempty"` +} + +func (m *VectorIndexSpec) Reset() { *m = VectorIndexSpec{} } +func (m *VectorIndexSpec) String() string { return proto.CompactTextString(m) } +func (*VectorIndexSpec) ProtoMessage() {} +func (*VectorIndexSpec) Descriptor() ([]byte, []int) { + return fileDescriptor_f80abaa17e25ccc8, []int{42} +} +func (m *VectorIndexSpec) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *VectorIndexSpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_VectorIndexSpec.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 *VectorIndexSpec) XXX_Merge(src proto.Message) { + xxx_messageInfo_VectorIndexSpec.Merge(m, src) +} +func (m *VectorIndexSpec) XXX_Size() int { + return m.Size() +} +func (m *VectorIndexSpec) XXX_DiscardUnknown() { + xxx_messageInfo_VectorIndexSpec.DiscardUnknown(m) +} + +var xxx_messageInfo_VectorIndexSpec proto.InternalMessageInfo + +func (m *VectorIndexSpec) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *VectorIndexSpec) GetOptions() []*OptionPair { + if m != nil { + return m.Options + } + return nil +} + +type OptionPair struct { + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *OptionPair) Reset() { *m = OptionPair{} } +func (m *OptionPair) String() string { return proto.CompactTextString(m) } +func (*OptionPair) ProtoMessage() {} +func (*OptionPair) Descriptor() ([]byte, []int) { + return fileDescriptor_f80abaa17e25ccc8, []int{43} +} +func (m *OptionPair) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *OptionPair) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_OptionPair.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 *OptionPair) XXX_Merge(src proto.Message) { + xxx_messageInfo_OptionPair.Merge(m, src) +} +func (m *OptionPair) XXX_Size() int { + return m.Size() +} +func (m *OptionPair) XXX_DiscardUnknown() { + xxx_messageInfo_OptionPair.DiscardUnknown(m) +} + +var xxx_messageInfo_OptionPair proto.InternalMessageInfo + +func (m *OptionPair) GetKey() string { + if m != nil { + return m.Key + } + return "" +} + +func (m *OptionPair) GetValue() string { + if m != nil { + return m.Value + } + return "" +} + type TypeUpdate struct { TypeName string `protobuf:"bytes,1,opt,name=type_name,json=typeName,proto3" json:"type_name,omitempty"` Fields []*SchemaUpdate `protobuf:"bytes,2,rep,name=fields,proto3" json:"fields,omitempty"` @@ -3723,7 +3852,7 @@ func (m *TypeUpdate) Reset() { *m = TypeUpdate{} } func (m *TypeUpdate) String() string { return proto.CompactTextString(m) } func (*TypeUpdate) ProtoMessage() {} func (*TypeUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{42} + return fileDescriptor_f80abaa17e25ccc8, []int{44} } func (m *TypeUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3774,7 +3903,7 @@ func (m *MapHeader) Reset() { *m = MapHeader{} } func (m *MapHeader) String() string { return proto.CompactTextString(m) } func (*MapHeader) ProtoMessage() {} func (*MapHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{43} + return fileDescriptor_f80abaa17e25ccc8, []int{45} } func (m *MapHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3822,7 +3951,7 @@ func (m *MovePredicatePayload) Reset() { *m = MovePredicatePayload{} } func (m *MovePredicatePayload) String() string { return proto.CompactTextString(m) } func (*MovePredicatePayload) ProtoMessage() {} func (*MovePredicatePayload) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{44} + return fileDescriptor_f80abaa17e25ccc8, []int{46} } func (m *MovePredicatePayload) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3895,7 +4024,7 @@ func (m *TxnStatus) Reset() { *m = TxnStatus{} } func (m *TxnStatus) String() string { return proto.CompactTextString(m) } func (*TxnStatus) ProtoMessage() {} func (*TxnStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{45} + return fileDescriptor_f80abaa17e25ccc8, []int{47} } func (m *TxnStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3948,7 +4077,7 @@ func (m *OracleDelta) Reset() { *m = OracleDelta{} } func (m *OracleDelta) String() string { return proto.CompactTextString(m) } func (*OracleDelta) ProtoMessage() {} func (*OracleDelta) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{46} + return fileDescriptor_f80abaa17e25ccc8, []int{48} } func (m *OracleDelta) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4006,7 +4135,7 @@ func (m *TxnTimestamps) Reset() { *m = TxnTimestamps{} } func (m *TxnTimestamps) String() string { return proto.CompactTextString(m) } func (*TxnTimestamps) ProtoMessage() {} func (*TxnTimestamps) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{47} + return fileDescriptor_f80abaa17e25ccc8, []int{49} } func (m *TxnTimestamps) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4050,7 +4179,7 @@ func (m *PeerResponse) Reset() { *m = PeerResponse{} } func (m *PeerResponse) String() string { return proto.CompactTextString(m) } func (*PeerResponse) ProtoMessage() {} func (*PeerResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{48} + return fileDescriptor_f80abaa17e25ccc8, []int{50} } func (m *PeerResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4095,7 +4224,7 @@ func (m *RaftBatch) Reset() { *m = RaftBatch{} } func (m *RaftBatch) String() string { return proto.CompactTextString(m) } func (*RaftBatch) ProtoMessage() {} func (*RaftBatch) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{49} + return fileDescriptor_f80abaa17e25ccc8, []int{51} } func (m *RaftBatch) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4146,7 +4275,7 @@ func (m *TabletResponse) Reset() { *m = TabletResponse{} } func (m *TabletResponse) String() string { return proto.CompactTextString(m) } func (*TabletResponse) ProtoMessage() {} func (*TabletResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{50} + return fileDescriptor_f80abaa17e25ccc8, []int{52} } func (m *TabletResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4191,7 +4320,7 @@ func (m *TabletRequest) Reset() { *m = TabletRequest{} } func (m *TabletRequest) String() string { return proto.CompactTextString(m) } func (*TabletRequest) ProtoMessage() {} func (*TabletRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{51} + return fileDescriptor_f80abaa17e25ccc8, []int{53} } func (m *TabletRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4243,7 +4372,7 @@ func (m *SubscriptionRequest) Reset() { *m = SubscriptionRequest{} } func (m *SubscriptionRequest) String() string { return proto.CompactTextString(m) } func (*SubscriptionRequest) ProtoMessage() {} func (*SubscriptionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{52} + return fileDescriptor_f80abaa17e25ccc8, []int{54} } func (m *SubscriptionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4294,7 +4423,7 @@ func (m *SubscriptionResponse) Reset() { *m = SubscriptionResponse{} } func (m *SubscriptionResponse) String() string { return proto.CompactTextString(m) } func (*SubscriptionResponse) ProtoMessage() {} func (*SubscriptionResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{53} + return fileDescriptor_f80abaa17e25ccc8, []int{55} } func (m *SubscriptionResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4344,7 +4473,7 @@ func (m *Num) Reset() { *m = Num{} } func (m *Num) String() string { return proto.CompactTextString(m) } func (*Num) ProtoMessage() {} func (*Num) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{54} + return fileDescriptor_f80abaa17e25ccc8, []int{56} } func (m *Num) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4419,7 +4548,7 @@ func (m *AssignedIds) Reset() { *m = AssignedIds{} } func (m *AssignedIds) String() string { return proto.CompactTextString(m) } func (*AssignedIds) ProtoMessage() {} func (*AssignedIds) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{55} + return fileDescriptor_f80abaa17e25ccc8, []int{57} } func (m *AssignedIds) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4478,7 +4607,7 @@ func (m *RemoveNodeRequest) Reset() { *m = RemoveNodeRequest{} } func (m *RemoveNodeRequest) String() string { return proto.CompactTextString(m) } func (*RemoveNodeRequest) ProtoMessage() {} func (*RemoveNodeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{56} + return fileDescriptor_f80abaa17e25ccc8, []int{58} } func (m *RemoveNodeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4531,7 +4660,7 @@ func (m *MoveTabletRequest) Reset() { *m = MoveTabletRequest{} } func (m *MoveTabletRequest) String() string { return proto.CompactTextString(m) } func (*MoveTabletRequest) ProtoMessage() {} func (*MoveTabletRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{57} + return fileDescriptor_f80abaa17e25ccc8, []int{59} } func (m *MoveTabletRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4589,7 +4718,7 @@ func (m *ApplyLicenseRequest) Reset() { *m = ApplyLicenseRequest{} } func (m *ApplyLicenseRequest) String() string { return proto.CompactTextString(m) } func (*ApplyLicenseRequest) ProtoMessage() {} func (*ApplyLicenseRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{58} + return fileDescriptor_f80abaa17e25ccc8, []int{60} } func (m *ApplyLicenseRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4634,7 +4763,7 @@ func (m *SnapshotMeta) Reset() { *m = SnapshotMeta{} } func (m *SnapshotMeta) String() string { return proto.CompactTextString(m) } func (*SnapshotMeta) ProtoMessage() {} func (*SnapshotMeta) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{59} + return fileDescriptor_f80abaa17e25ccc8, []int{61} } func (m *SnapshotMeta) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4688,7 +4817,7 @@ func (m *Status) Reset() { *m = Status{} } func (m *Status) String() string { return proto.CompactTextString(m) } func (*Status) ProtoMessage() {} func (*Status) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{60} + return fileDescriptor_f80abaa17e25ccc8, []int{62} } func (m *Status) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4757,7 +4886,7 @@ func (m *BackupRequest) Reset() { *m = BackupRequest{} } func (m *BackupRequest) String() string { return proto.CompactTextString(m) } func (*BackupRequest) ProtoMessage() {} func (*BackupRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{61} + return fileDescriptor_f80abaa17e25ccc8, []int{63} } func (m *BackupRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4857,7 +4986,7 @@ func (m *BackupResponse) Reset() { *m = BackupResponse{} } func (m *BackupResponse) String() string { return proto.CompactTextString(m) } func (*BackupResponse) ProtoMessage() {} func (*BackupResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{62} + return fileDescriptor_f80abaa17e25ccc8, []int{64} } func (m *BackupResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4904,7 +5033,7 @@ func (m *DropOperation) Reset() { *m = DropOperation{} } func (m *DropOperation) String() string { return proto.CompactTextString(m) } func (*DropOperation) ProtoMessage() {} func (*DropOperation) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{63} + return fileDescriptor_f80abaa17e25ccc8, []int{65} } func (m *DropOperation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4965,7 +5094,7 @@ func (m *ExportRequest) Reset() { *m = ExportRequest{} } func (m *ExportRequest) String() string { return proto.CompactTextString(m) } func (*ExportRequest) ProtoMessage() {} func (*ExportRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{64} + return fileDescriptor_f80abaa17e25ccc8, []int{66} } func (m *ExportRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5061,7 +5190,7 @@ func (m *ExportResponse) Reset() { *m = ExportResponse{} } func (m *ExportResponse) String() string { return proto.CompactTextString(m) } func (*ExportResponse) ProtoMessage() {} func (*ExportResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{65} + return fileDescriptor_f80abaa17e25ccc8, []int{67} } func (m *ExportResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5126,7 +5255,7 @@ func (m *BackupKey) Reset() { *m = BackupKey{} } func (m *BackupKey) String() string { return proto.CompactTextString(m) } func (*BackupKey) ProtoMessage() {} func (*BackupKey) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{66} + return fileDescriptor_f80abaa17e25ccc8, []int{68} } func (m *BackupKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5217,7 +5346,7 @@ func (m *BackupPostingList) Reset() { *m = BackupPostingList{} } func (m *BackupPostingList) String() string { return proto.CompactTextString(m) } func (*BackupPostingList) ProtoMessage() {} func (*BackupPostingList) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{67} + return fileDescriptor_f80abaa17e25ccc8, []int{69} } func (m *BackupPostingList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5292,7 +5421,7 @@ func (m *UpdateGraphQLSchemaRequest) Reset() { *m = UpdateGraphQLSchemaR func (m *UpdateGraphQLSchemaRequest) String() string { return proto.CompactTextString(m) } func (*UpdateGraphQLSchemaRequest) ProtoMessage() {} func (*UpdateGraphQLSchemaRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{68} + return fileDescriptor_f80abaa17e25ccc8, []int{70} } func (m *UpdateGraphQLSchemaRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5357,7 +5486,7 @@ func (m *UpdateGraphQLSchemaResponse) Reset() { *m = UpdateGraphQLSchema func (m *UpdateGraphQLSchemaResponse) String() string { return proto.CompactTextString(m) } func (*UpdateGraphQLSchemaResponse) ProtoMessage() {} func (*UpdateGraphQLSchemaResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{69} + return fileDescriptor_f80abaa17e25ccc8, []int{71} } func (m *UpdateGraphQLSchemaResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5404,7 +5533,7 @@ func (m *BulkMeta) Reset() { *m = BulkMeta{} } func (m *BulkMeta) String() string { return proto.CompactTextString(m) } func (*BulkMeta) ProtoMessage() {} func (*BulkMeta) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{70} + return fileDescriptor_f80abaa17e25ccc8, []int{72} } func (m *BulkMeta) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5463,7 +5592,7 @@ func (m *DeleteNsRequest) Reset() { *m = DeleteNsRequest{} } func (m *DeleteNsRequest) String() string { return proto.CompactTextString(m) } func (*DeleteNsRequest) ProtoMessage() {} func (*DeleteNsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{71} + return fileDescriptor_f80abaa17e25ccc8, []int{73} } func (m *DeleteNsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5514,7 +5643,7 @@ func (m *TaskStatusRequest) Reset() { *m = TaskStatusRequest{} } func (m *TaskStatusRequest) String() string { return proto.CompactTextString(m) } func (*TaskStatusRequest) ProtoMessage() {} func (*TaskStatusRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{72} + return fileDescriptor_f80abaa17e25ccc8, []int{74} } func (m *TaskStatusRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5558,7 +5687,7 @@ func (m *TaskStatusResponse) Reset() { *m = TaskStatusResponse{} } func (m *TaskStatusResponse) String() string { return proto.CompactTextString(m) } func (*TaskStatusResponse) ProtoMessage() {} func (*TaskStatusResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{73} + return fileDescriptor_f80abaa17e25ccc8, []int{75} } func (m *TaskStatusResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5611,6 +5740,7 @@ func init() { proto.RegisterType((*ValueList)(nil), "pb.ValueList") proto.RegisterType((*LangList)(nil), "pb.LangList") proto.RegisterType((*Result)(nil), "pb.Result") + proto.RegisterMapType((map[string]uint64)(nil), "pb.Result.VectorMetricsEntry") proto.RegisterType((*Order)(nil), "pb.Order") proto.RegisterType((*SortMessage)(nil), "pb.SortMessage") proto.RegisterType((*SortResult)(nil), "pb.SortResult") @@ -5652,6 +5782,8 @@ func init() { proto.RegisterType((*SchemaNode)(nil), "pb.SchemaNode") proto.RegisterType((*SchemaResult)(nil), "pb.SchemaResult") proto.RegisterType((*SchemaUpdate)(nil), "pb.SchemaUpdate") + proto.RegisterType((*VectorIndexSpec)(nil), "pb.VectorIndexSpec") + proto.RegisterType((*OptionPair)(nil), "pb.OptionPair") proto.RegisterType((*TypeUpdate)(nil), "pb.TypeUpdate") proto.RegisterType((*MapHeader)(nil), "pb.MapHeader") proto.RegisterType((*MovePredicatePayload)(nil), "pb.MovePredicatePayload") @@ -5691,354 +5823,361 @@ func init() { func init() { proto.RegisterFile("pb.proto", fileDescriptor_f80abaa17e25ccc8) } var fileDescriptor_f80abaa17e25ccc8 = []byte{ - // 5544 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x7b, 0xcd, 0x6f, 0x1c, 0x57, - 0x72, 0x38, 0xe7, 0x7b, 0xba, 0x86, 0x33, 0x1a, 0x3e, 0xc9, 0xf2, 0xec, 0xc8, 0x12, 0xb5, 0x6d, - 0xcb, 0xa6, 0x25, 0x8b, 0x92, 0x68, 0xef, 0xfe, 0xd6, 0x5e, 0x2c, 0xf0, 0x23, 0xc5, 0xa1, 0x4c, - 0x8b, 0x22, 0xb5, 0x3d, 0x23, 0xed, 0x07, 0x90, 0x0c, 0x9a, 0xdd, 0x8f, 0x64, 0x2f, 0x7b, 0xba, - 0x7b, 0xbb, 0x7b, 0xb8, 0xa4, 0x6f, 0x7b, 0xc9, 0x1e, 0x92, 0xc3, 0x02, 0xb9, 0x04, 0x08, 0x90, - 0x43, 0xae, 0xc9, 0x29, 0x08, 0x90, 0x20, 0x40, 0x6e, 0x41, 0xb0, 0xc8, 0x69, 0x8f, 0x41, 0x36, - 0x11, 0x02, 0x6f, 0x90, 0x83, 0x0e, 0x01, 0xf2, 0x17, 0x24, 0xa8, 0xaa, 0xd7, 0x5f, 0xc3, 0xa1, - 0x2c, 0x3b, 0xc8, 0x25, 0xa7, 0x79, 0x55, 0xef, 0xbb, 0xaa, 0x5e, 0x7d, 0xf6, 0x40, 0x33, 0xd8, - 0x5f, 0x0d, 0x42, 0x3f, 0xf6, 0x45, 0x39, 0xd8, 0xef, 0x6b, 0x66, 0xe0, 0x30, 0xd8, 0xbf, 0x7d, - 0xe8, 0xc4, 0x47, 0xd3, 0xfd, 0x55, 0xcb, 0x9f, 0xdc, 0xb3, 0x0f, 0x43, 0x33, 0x38, 0xba, 0xeb, - 0xf8, 0xf7, 0xf6, 0x4d, 0xfb, 0x50, 0x86, 0xf7, 0x4e, 0x3e, 0xba, 0x17, 0xec, 0xdf, 0x4b, 0xa6, - 0xf6, 0xef, 0xe6, 0xc6, 0x1e, 0xfa, 0x87, 0xfe, 0x3d, 0x42, 0xef, 0x4f, 0x0f, 0x08, 0x22, 0x80, - 0x5a, 0x3c, 0x5c, 0xef, 0x43, 0x75, 0xc7, 0x89, 0x62, 0x21, 0xa0, 0x3a, 0x75, 0xec, 0xa8, 0x57, - 0xba, 0x59, 0x59, 0xa9, 0x1b, 0xd4, 0xd6, 0x9f, 0x80, 0x36, 0x32, 0xa3, 0xe3, 0xe7, 0xa6, 0x3b, - 0x95, 0xa2, 0x0b, 0x95, 0x13, 0xd3, 0xed, 0x95, 0x6e, 0x96, 0x56, 0x16, 0x0d, 0x6c, 0x8a, 0x55, - 0x68, 0x9e, 0x98, 0xee, 0x38, 0x3e, 0x0b, 0x64, 0xaf, 0x7c, 0xb3, 0xb4, 0xd2, 0x59, 0xbb, 0xbc, - 0x1a, 0xec, 0xaf, 0x3e, 0xf5, 0xa3, 0xd8, 0xf1, 0x0e, 0x57, 0x9f, 0x9b, 0xee, 0xe8, 0x2c, 0x90, - 0x46, 0xe3, 0x84, 0x1b, 0xfa, 0x1e, 0xb4, 0x86, 0xa1, 0xb5, 0x35, 0xf5, 0xac, 0xd8, 0xf1, 0x3d, - 0xdc, 0xd1, 0x33, 0x27, 0x92, 0x56, 0xd4, 0x0c, 0x6a, 0x23, 0xce, 0x0c, 0x0f, 0xa3, 0x5e, 0xe5, - 0x66, 0x05, 0x71, 0xd8, 0x16, 0x3d, 0x68, 0x38, 0xd1, 0x43, 0x7f, 0xea, 0xc5, 0xbd, 0xea, 0xcd, - 0xd2, 0x4a, 0xd3, 0x48, 0x40, 0xfd, 0xaf, 0x2a, 0x50, 0xfb, 0xfe, 0x54, 0x86, 0x67, 0x34, 0x2f, - 0x8e, 0xc3, 0x64, 0x2d, 0x6c, 0x8b, 0x2b, 0x50, 0x73, 0x4d, 0xef, 0x30, 0xea, 0x95, 0x69, 0x31, - 0x06, 0xc4, 0x35, 0xd0, 0xcc, 0x83, 0x58, 0x86, 0xe3, 0xa9, 0x63, 0xf7, 0x2a, 0x37, 0x4b, 0x2b, - 0x75, 0xa3, 0x49, 0x88, 0x67, 0x8e, 0x2d, 0xbe, 0x01, 0x4d, 0xdb, 0x1f, 0x5b, 0xf9, 0xbd, 0x6c, - 0x9f, 0xf6, 0x12, 0x6f, 0x43, 0x73, 0xea, 0xd8, 0x63, 0xd7, 0x89, 0xe2, 0x5e, 0xed, 0x66, 0x69, - 0xa5, 0xb5, 0xd6, 0xc4, 0xcb, 0x22, 0xed, 0x8c, 0xc6, 0xd4, 0xb1, 0x89, 0x88, 0xb7, 0xa1, 0x19, - 0x85, 0xd6, 0xf8, 0x60, 0xea, 0x59, 0xbd, 0x3a, 0x0d, 0xba, 0x84, 0x83, 0x72, 0xb7, 0x36, 0x1a, - 0x11, 0x03, 0x78, 0xad, 0x50, 0x9e, 0xc8, 0x30, 0x92, 0xbd, 0x06, 0x6f, 0xa5, 0x40, 0x71, 0x1f, - 0x5a, 0x07, 0xa6, 0x25, 0xe3, 0x71, 0x60, 0x86, 0xe6, 0xa4, 0xd7, 0xcc, 0x16, 0xda, 0x42, 0xf4, - 0x53, 0xc4, 0x46, 0x06, 0x1c, 0xa4, 0x80, 0xf8, 0x10, 0xda, 0x04, 0x45, 0xe3, 0x03, 0xc7, 0x8d, - 0x65, 0xd8, 0xd3, 0x68, 0x4e, 0x87, 0xe6, 0x10, 0x66, 0x14, 0x4a, 0x69, 0x2c, 0xf2, 0x20, 0xc6, - 0x88, 0xeb, 0x00, 0xf2, 0x34, 0x30, 0x3d, 0x7b, 0x6c, 0xba, 0x6e, 0x0f, 0xe8, 0x0c, 0x1a, 0x63, - 0xd6, 0x5d, 0x57, 0xbc, 0x89, 0xe7, 0x33, 0xed, 0x71, 0x1c, 0xf5, 0xda, 0x37, 0x4b, 0x2b, 0x55, - 0xa3, 0x8e, 0xe0, 0x28, 0x42, 0xba, 0x5a, 0xa6, 0x75, 0x24, 0x7b, 0x9d, 0x9b, 0xa5, 0x95, 0x9a, - 0xc1, 0x00, 0x62, 0x0f, 0x9c, 0x30, 0x8a, 0x7b, 0x97, 0x18, 0x4b, 0x80, 0xb8, 0x0a, 0x75, 0xff, - 0xe0, 0x20, 0x92, 0x71, 0xaf, 0x4b, 0x68, 0x05, 0xe9, 0x6b, 0xa0, 0x91, 0x54, 0x11, 0xd5, 0x6e, - 0x41, 0xfd, 0x04, 0x01, 0x16, 0xbe, 0xd6, 0x5a, 0x1b, 0x8f, 0x9d, 0x0a, 0x9e, 0xa1, 0x3a, 0xf5, - 0x1b, 0xd0, 0xdc, 0x31, 0xbd, 0xc3, 0x44, 0x5a, 0x91, 0x9d, 0x34, 0x41, 0x33, 0xa8, 0xad, 0xff, - 0x51, 0x19, 0xea, 0x86, 0x8c, 0xa6, 0x6e, 0x2c, 0xde, 0x03, 0x40, 0x66, 0x4d, 0xcc, 0x38, 0x74, - 0x4e, 0xd5, 0xaa, 0x19, 0xbb, 0xb4, 0xa9, 0x63, 0x3f, 0xa1, 0x2e, 0x71, 0x1f, 0x16, 0x69, 0xf5, - 0x64, 0x68, 0x39, 0x3b, 0x40, 0x7a, 0x3e, 0xa3, 0x45, 0x43, 0xd4, 0x8c, 0xab, 0x50, 0x27, 0xf9, - 0x60, 0x19, 0x6d, 0x1b, 0x0a, 0x12, 0xb7, 0xa0, 0xe3, 0x78, 0x31, 0xf2, 0xcf, 0x8a, 0xc7, 0xb6, - 0x8c, 0x12, 0x01, 0x6a, 0xa7, 0xd8, 0x4d, 0x19, 0xc5, 0xe2, 0x01, 0x30, 0x13, 0x92, 0x0d, 0x6b, - 0xb4, 0x61, 0x27, 0x65, 0x6e, 0xc4, 0x3b, 0xd2, 0x18, 0xb5, 0xe3, 0x5d, 0x68, 0xe1, 0xfd, 0x92, - 0x19, 0x75, 0x9a, 0xb1, 0x48, 0xb7, 0x51, 0xe4, 0x30, 0x00, 0x07, 0xa8, 0xe1, 0x48, 0x1a, 0x14, - 0x52, 0x16, 0x2a, 0x6a, 0xeb, 0x03, 0xa8, 0xed, 0x85, 0xb6, 0x0c, 0xe7, 0xbe, 0x13, 0x01, 0x55, - 0x5b, 0x46, 0x16, 0x3d, 0xe1, 0xa6, 0x41, 0xed, 0xec, 0xed, 0x54, 0x72, 0x6f, 0x47, 0xff, 0x93, - 0x12, 0xb4, 0x86, 0x7e, 0x18, 0x3f, 0x91, 0x51, 0x64, 0x1e, 0x4a, 0xb1, 0x0c, 0x35, 0x1f, 0x97, - 0x55, 0x14, 0xd6, 0xf0, 0x4c, 0xb4, 0x8f, 0xc1, 0xf8, 0x19, 0x3e, 0x94, 0x2f, 0xe6, 0x03, 0xca, - 0x14, 0xbd, 0xba, 0x8a, 0x92, 0x29, 0x7a, 0x73, 0x99, 0xf4, 0x54, 0xf3, 0xd2, 0x73, 0xa1, 0x68, - 0xea, 0xdf, 0x02, 0xc0, 0xf3, 0x7d, 0x45, 0x29, 0xd0, 0x7f, 0x51, 0x82, 0x96, 0x61, 0x1e, 0xc4, - 0x0f, 0x7d, 0x2f, 0x96, 0xa7, 0xb1, 0xe8, 0x40, 0xd9, 0xb1, 0x89, 0x46, 0x75, 0xa3, 0xec, 0xd8, - 0x78, 0xba, 0xc3, 0xd0, 0x9f, 0x06, 0x44, 0xa2, 0xb6, 0xc1, 0x00, 0xd1, 0xd2, 0xb6, 0x43, 0x3a, - 0x32, 0xd2, 0xd2, 0xb6, 0x43, 0xb1, 0x0c, 0xad, 0xc8, 0x33, 0x83, 0xe8, 0xc8, 0x8f, 0xf1, 0x74, - 0x55, 0x3a, 0x1d, 0x24, 0xa8, 0x51, 0x84, 0x8f, 0xce, 0x89, 0xc6, 0xae, 0x34, 0x43, 0x4f, 0x86, - 0xa4, 0x48, 0x9a, 0x86, 0xe6, 0x44, 0x3b, 0x8c, 0xd0, 0x7f, 0x51, 0x81, 0xfa, 0x13, 0x39, 0xd9, - 0x97, 0xe1, 0xb9, 0x43, 0xdc, 0x87, 0x26, 0xed, 0x3b, 0x76, 0x6c, 0x3e, 0xc7, 0xc6, 0x1b, 0x2f, - 0x5f, 0x2c, 0x2f, 0x11, 0x6e, 0xdb, 0xfe, 0xc0, 0x9f, 0x38, 0xb1, 0x9c, 0x04, 0xf1, 0x99, 0xd1, - 0x50, 0xa8, 0xb9, 0x07, 0xbc, 0x0a, 0x75, 0x57, 0x9a, 0xc8, 0x33, 0x16, 0x4f, 0x05, 0x89, 0xbb, - 0xd0, 0x30, 0x27, 0x63, 0x5b, 0x9a, 0x36, 0x1f, 0x6a, 0xe3, 0xca, 0xcb, 0x17, 0xcb, 0x5d, 0x73, - 0xb2, 0x29, 0xcd, 0xfc, 0xda, 0x75, 0xc6, 0x88, 0x8f, 0x51, 0x26, 0xa3, 0x78, 0x3c, 0x0d, 0x6c, - 0x33, 0x96, 0xa4, 0xeb, 0xaa, 0x1b, 0xbd, 0x97, 0x2f, 0x96, 0xaf, 0x20, 0xfa, 0x19, 0x61, 0x73, - 0xd3, 0x20, 0xc3, 0xa2, 0xde, 0x4b, 0xae, 0xaf, 0xf4, 0x9e, 0x02, 0xc5, 0x36, 0x2c, 0x59, 0xee, - 0x34, 0x42, 0xe5, 0xec, 0x78, 0x07, 0xfe, 0xd8, 0xf7, 0xdc, 0x33, 0x62, 0x70, 0x73, 0xe3, 0xfa, - 0xcb, 0x17, 0xcb, 0xdf, 0x50, 0x9d, 0xdb, 0xde, 0x81, 0xbf, 0xe7, 0xb9, 0x67, 0xb9, 0xf5, 0x2f, - 0xcd, 0x74, 0x89, 0xff, 0x0f, 0x9d, 0x03, 0x3f, 0xb4, 0xe4, 0x38, 0x25, 0x59, 0x87, 0xd6, 0xe9, - 0xbf, 0x7c, 0xb1, 0x7c, 0x95, 0x7a, 0x1e, 0x9d, 0xa3, 0xdb, 0x62, 0x1e, 0xaf, 0xff, 0x4b, 0x19, - 0x6a, 0xd4, 0x16, 0xf7, 0xa1, 0x31, 0x21, 0x96, 0x24, 0xfa, 0xe9, 0x2a, 0xca, 0x10, 0xf5, 0xad, - 0x32, 0xaf, 0xa2, 0x81, 0x17, 0x87, 0x67, 0x46, 0x32, 0x0c, 0x67, 0xc4, 0xe6, 0xbe, 0x2b, 0xe3, - 0x48, 0xc9, 0x7c, 0x6e, 0xc6, 0x88, 0x3b, 0xd4, 0x0c, 0x35, 0x6c, 0x56, 0x6e, 0x2a, 0xe7, 0xe4, - 0xa6, 0x0f, 0x4d, 0xeb, 0x48, 0x5a, 0xc7, 0xd1, 0x74, 0xa2, 0xa4, 0x2a, 0x85, 0xc5, 0xdb, 0xd0, - 0xa6, 0x76, 0xe0, 0x3b, 0x1e, 0x4d, 0xaf, 0xd1, 0x80, 0xc5, 0x0c, 0x39, 0x8a, 0xfa, 0x5b, 0xb0, - 0x98, 0x3f, 0x2c, 0x9a, 0xf3, 0x63, 0x79, 0x46, 0xf2, 0x55, 0x35, 0xb0, 0x29, 0x6e, 0x42, 0x8d, - 0x14, 0x1d, 0x49, 0x57, 0x6b, 0x0d, 0xf0, 0xcc, 0x3c, 0xc5, 0xe0, 0x8e, 0x4f, 0xca, 0xdf, 0x29, - 0xe1, 0x3a, 0xf9, 0x2b, 0xe4, 0xd7, 0xd1, 0x2e, 0x5e, 0x87, 0xa7, 0xe4, 0xd6, 0xd1, 0x7d, 0x68, - 0xec, 0x38, 0x96, 0xf4, 0x22, 0x32, 0xfa, 0xd3, 0x48, 0xa6, 0x4a, 0x09, 0xdb, 0x78, 0xdf, 0x89, - 0x79, 0xba, 0xeb, 0xdb, 0x32, 0xa2, 0x75, 0xaa, 0x46, 0x0a, 0x63, 0x9f, 0x3c, 0x0d, 0x9c, 0xf0, - 0x6c, 0xc4, 0x94, 0xaa, 0x18, 0x29, 0x8c, 0xd2, 0x25, 0x3d, 0xdc, 0xcc, 0x4e, 0x0c, 0xb8, 0x02, - 0xf5, 0x3f, 0xaf, 0xc2, 0xe2, 0x8f, 0x65, 0xe8, 0x3f, 0x0d, 0xfd, 0xc0, 0x8f, 0x4c, 0x57, 0xac, - 0x17, 0x69, 0xce, 0xbc, 0xbd, 0x89, 0xa7, 0xcd, 0x0f, 0x5b, 0x1d, 0xa6, 0x4c, 0x60, 0x9e, 0xe5, - 0xb9, 0xa2, 0x43, 0x9d, 0x79, 0x3e, 0x87, 0x66, 0xaa, 0x07, 0xc7, 0x30, 0x97, 0xe9, 0xac, 0x45, - 0x7a, 0xa8, 0x1e, 0x7c, 0x95, 0x13, 0xf3, 0xf4, 0xd9, 0xf6, 0xa6, 0xe2, 0xad, 0x82, 0x14, 0x15, - 0x46, 0xa7, 0xde, 0x28, 0x61, 0x6a, 0x0a, 0xe3, 0x4d, 0x91, 0x22, 0xd1, 0xf6, 0x66, 0x6f, 0x91, - 0xba, 0x12, 0x50, 0xbc, 0x05, 0xda, 0xc4, 0x3c, 0x45, 0x85, 0xb6, 0x6d, 0xf3, 0xd3, 0x34, 0x32, - 0x84, 0xf8, 0x26, 0x54, 0xe2, 0x53, 0x8f, 0xde, 0x1e, 0x7a, 0x15, 0xe8, 0x64, 0x8e, 0x4e, 0x3d, - 0xa5, 0xfa, 0x0c, 0xec, 0x43, 0x9e, 0x5a, 0x8e, 0x4d, 0x4e, 0x84, 0x66, 0x60, 0x53, 0xdc, 0x82, - 0x86, 0xcb, 0xdc, 0x22, 0x47, 0xa1, 0xb5, 0xd6, 0x62, 0x3d, 0x4a, 0x28, 0x23, 0xe9, 0x13, 0x1f, - 0x40, 0x33, 0xa1, 0x4e, 0xaf, 0x45, 0xe3, 0xba, 0x09, 0x3d, 0x13, 0x32, 0x1a, 0xe9, 0x08, 0x71, - 0x1f, 0x34, 0x5b, 0xba, 0x32, 0x96, 0x63, 0x8f, 0x15, 0x79, 0x8b, 0x1d, 0xc8, 0x4d, 0x42, 0xee, - 0x46, 0x86, 0xfc, 0xe9, 0x54, 0x46, 0xb1, 0xd1, 0xb4, 0x15, 0x42, 0xbc, 0x93, 0x3d, 0xac, 0x0e, - 0xb1, 0x2b, 0x4f, 0xcc, 0xa4, 0xab, 0xff, 0x3d, 0xb8, 0x34, 0xc3, 0xb4, 0xbc, 0x94, 0xb6, 0x59, - 0x4a, 0xaf, 0xe4, 0xa5, 0xb4, 0x9a, 0x93, 0xcc, 0xcf, 0xaa, 0xcd, 0x66, 0x57, 0xd3, 0xff, 0xb3, - 0x02, 0x97, 0xd4, 0x83, 0x39, 0x72, 0x82, 0x61, 0xac, 0x54, 0x17, 0x19, 0x26, 0x25, 0xab, 0x55, - 0x23, 0x01, 0xc5, 0xff, 0x83, 0x3a, 0x69, 0x9a, 0xe4, 0xc1, 0x2f, 0x67, 0x82, 0x90, 0x4e, 0x67, - 0x05, 0xa0, 0xa4, 0x48, 0x0d, 0x17, 0x1f, 0x41, 0xed, 0x73, 0x19, 0xfa, 0x6c, 0x68, 0x5b, 0x6b, - 0x37, 0xe6, 0xcd, 0x43, 0xf2, 0xa9, 0x69, 0x3c, 0xf8, 0x7f, 0x2a, 0x2f, 0xf0, 0x55, 0xe4, 0xe5, - 0x1d, 0x34, 0xb6, 0x13, 0xff, 0x44, 0xda, 0xbd, 0x46, 0x46, 0x73, 0x25, 0xe4, 0x49, 0x57, 0x22, - 0x32, 0xcd, 0xb9, 0x22, 0xa3, 0x5d, 0x2c, 0x32, 0xfd, 0x4d, 0x68, 0xe5, 0xe8, 0x32, 0x87, 0x51, - 0xcb, 0x45, 0x75, 0xa2, 0xa5, 0xaa, 0x34, 0xaf, 0x95, 0x36, 0x01, 0x32, 0x2a, 0x7d, 0x5d, 0xdd, - 0xa6, 0xff, 0xbc, 0x04, 0x97, 0x1e, 0xfa, 0x9e, 0x27, 0xc9, 0x55, 0x67, 0x9e, 0x67, 0x4f, 0xbc, - 0x74, 0xe1, 0x13, 0x7f, 0x1f, 0x6a, 0x11, 0x0e, 0x56, 0xab, 0x5f, 0x9e, 0xc3, 0x44, 0x83, 0x47, - 0xa0, 0xa2, 0x9f, 0x98, 0xa7, 0xe3, 0x40, 0x7a, 0xb6, 0xe3, 0x1d, 0x26, 0x8a, 0x7e, 0x62, 0x9e, - 0x3e, 0x65, 0x8c, 0xfe, 0xd7, 0x65, 0x80, 0x4f, 0xa5, 0xe9, 0xc6, 0x47, 0x68, 0xcc, 0x90, 0xa3, - 0x8e, 0x17, 0xc5, 0xa6, 0x67, 0x25, 0x81, 0x52, 0x0a, 0x23, 0x47, 0xd1, 0xa6, 0xcb, 0x88, 0x55, - 0xa4, 0x66, 0x24, 0x20, 0xca, 0x07, 0x6e, 0x37, 0x8d, 0x94, 0xed, 0x57, 0x50, 0xe6, 0xc8, 0x54, - 0x09, 0xad, 0x1c, 0x99, 0x1e, 0x34, 0x30, 0xf0, 0x70, 0x7c, 0x8f, 0x84, 0x46, 0x33, 0x12, 0x10, - 0xd7, 0x99, 0x06, 0xb1, 0x33, 0x61, 0x0b, 0x5f, 0x31, 0x14, 0x84, 0xa7, 0x42, 0x8b, 0x3e, 0xb0, - 0x8e, 0x7c, 0x52, 0x24, 0x15, 0x23, 0x85, 0x71, 0x35, 0xdf, 0x3b, 0xf4, 0xf1, 0x76, 0x4d, 0x72, - 0x1e, 0x13, 0x90, 0xef, 0x62, 0xcb, 0x53, 0xec, 0xd2, 0xa8, 0x2b, 0x85, 0x91, 0x2e, 0x52, 0x8e, - 0x0f, 0xa4, 0x19, 0x4f, 0x43, 0x19, 0xf5, 0x80, 0xba, 0x41, 0xca, 0x2d, 0x85, 0x11, 0xdf, 0x84, - 0x45, 0x24, 0x9c, 0x19, 0x45, 0xce, 0xa1, 0x27, 0x6d, 0x52, 0x2f, 0x55, 0x03, 0x89, 0xb9, 0xae, - 0x50, 0xfa, 0xdf, 0x96, 0xa1, 0xce, 0xba, 0xa0, 0xe0, 0x2c, 0x95, 0x5e, 0xcb, 0x59, 0x7a, 0x0b, - 0xb4, 0x20, 0x94, 0xb6, 0x63, 0x25, 0x7c, 0xd4, 0x8c, 0x0c, 0x41, 0xd1, 0x0d, 0x7a, 0x07, 0x44, - 0xcf, 0xa6, 0xc1, 0x80, 0xd0, 0xa1, 0xed, 0x7b, 0x63, 0xdb, 0x89, 0x8e, 0xc7, 0xfb, 0x67, 0xb1, - 0x8c, 0x14, 0x2d, 0x5a, 0xbe, 0xb7, 0xe9, 0x44, 0xc7, 0x1b, 0x88, 0x42, 0x12, 0xf2, 0x1b, 0xa1, - 0xb7, 0xd1, 0x34, 0x14, 0x24, 0x3e, 0x04, 0x8d, 0x7c, 0x58, 0x72, 0x72, 0x34, 0x72, 0x4e, 0xae, - 0xbe, 0x7c, 0xb1, 0x2c, 0x10, 0x39, 0xe3, 0xdd, 0x34, 0x13, 0x1c, 0x7a, 0x69, 0x38, 0x19, 0xcd, - 0x15, 0xbd, 0x61, 0xf6, 0xd2, 0x10, 0x35, 0x8a, 0xf2, 0x5e, 0x1a, 0x63, 0xc4, 0x5d, 0x10, 0x53, - 0xcf, 0xf2, 0x27, 0x01, 0x0a, 0x85, 0xb4, 0xd5, 0x21, 0x5b, 0x74, 0xc8, 0xa5, 0x7c, 0x0f, 0x1d, - 0x55, 0xff, 0xe7, 0x32, 0x2c, 0x6e, 0x3a, 0xa1, 0xb4, 0x62, 0x69, 0x0f, 0xec, 0x43, 0x89, 0x67, - 0x97, 0x5e, 0xec, 0xc4, 0x67, 0xca, 0x0d, 0x55, 0x50, 0x1a, 0x45, 0x94, 0x8b, 0xd1, 0x36, 0xbf, - 0xb0, 0x0a, 0x25, 0x08, 0x18, 0x10, 0x6b, 0x00, 0x1c, 0x5f, 0x51, 0x92, 0xa0, 0x7a, 0x71, 0x92, - 0x40, 0xa3, 0x61, 0xd8, 0xc4, 0x20, 0x9c, 0xe7, 0x38, 0xec, 0x8b, 0xd6, 0x29, 0x83, 0x30, 0x95, - 0xec, 0xd1, 0x52, 0xd8, 0xd7, 0xe0, 0x8d, 0xb1, 0x2d, 0xde, 0x86, 0xb2, 0x1f, 0x10, 0x71, 0xd5, - 0xd2, 0xf9, 0x2b, 0xac, 0xee, 0x05, 0x46, 0xd9, 0x0f, 0xf0, 0x15, 0x73, 0xec, 0x4b, 0x82, 0x87, - 0xaf, 0x18, 0xed, 0x1e, 0x45, 0x5c, 0x86, 0xea, 0x11, 0x3a, 0x2c, 0x9a, 0xae, 0xeb, 0xff, 0x4c, - 0xda, 0x4f, 0x43, 0x69, 0x27, 0x32, 0x58, 0xc0, 0xa1, 0x94, 0x78, 0xe6, 0x44, 0x46, 0x81, 0x69, - 0x49, 0x25, 0x82, 0x19, 0x42, 0xbf, 0x0a, 0xe5, 0xbd, 0x40, 0x34, 0xa0, 0x32, 0x1c, 0x8c, 0xba, - 0x0b, 0xd8, 0xd8, 0x1c, 0xec, 0x74, 0xd1, 0xa2, 0xd4, 0xbb, 0x0d, 0xfd, 0x8b, 0x32, 0x68, 0x4f, - 0xa6, 0xb1, 0x89, 0xba, 0x25, 0xc2, 0x5b, 0x16, 0x25, 0x34, 0x13, 0xc5, 0x6f, 0x40, 0x33, 0x8a, - 0xcd, 0x90, 0xbc, 0x12, 0xb6, 0x4e, 0x0d, 0x82, 0x47, 0x91, 0x78, 0x17, 0x6a, 0xd2, 0x3e, 0x94, - 0x89, 0xb9, 0xe8, 0xce, 0xde, 0xd7, 0xe0, 0x6e, 0xb1, 0x02, 0xf5, 0xc8, 0x3a, 0x92, 0x13, 0xb3, - 0x57, 0xcd, 0x06, 0x0e, 0x09, 0xc3, 0x6e, 0xb8, 0xa1, 0xfa, 0xc5, 0x3b, 0x50, 0x43, 0xde, 0x44, - 0x2a, 0xae, 0xa4, 0x48, 0x14, 0xd9, 0xa0, 0x86, 0x71, 0x27, 0x0a, 0x9e, 0x1d, 0xfa, 0xc1, 0xd8, - 0x0f, 0x88, 0xf6, 0x9d, 0xb5, 0x2b, 0xa4, 0xe3, 0x92, 0xdb, 0xac, 0x6e, 0x86, 0x7e, 0xb0, 0x17, - 0x18, 0x75, 0x9b, 0x7e, 0x31, 0xca, 0xa1, 0xe1, 0x2c, 0x11, 0x6c, 0x14, 0x34, 0xc4, 0x70, 0x2a, - 0x69, 0x05, 0x9a, 0x13, 0x19, 0x9b, 0xb6, 0x19, 0x9b, 0xca, 0x36, 0x2c, 0xb2, 0xca, 0x64, 0x9c, - 0x91, 0xf6, 0xea, 0xf7, 0xa0, 0xce, 0x4b, 0x8b, 0x26, 0x54, 0x77, 0xf7, 0x76, 0x07, 0x4c, 0xd6, - 0xf5, 0x9d, 0x9d, 0x6e, 0x09, 0x51, 0x9b, 0xeb, 0xa3, 0xf5, 0x6e, 0x19, 0x5b, 0xa3, 0x1f, 0x3d, - 0x1d, 0x74, 0x2b, 0xfa, 0x3f, 0x94, 0xa0, 0x99, 0xac, 0x23, 0x3e, 0x01, 0xc0, 0x27, 0x3c, 0x3e, - 0x72, 0xbc, 0xd4, 0xc1, 0xbb, 0x96, 0xdf, 0x69, 0x15, 0xb9, 0xfa, 0x29, 0xf6, 0xb2, 0x79, 0xa5, - 0x17, 0x4f, 0x70, 0x7f, 0x08, 0x9d, 0x62, 0xe7, 0x1c, 0x4f, 0xf7, 0x4e, 0xde, 0xaa, 0x74, 0xd6, - 0xde, 0x28, 0x2c, 0x8d, 0x33, 0x49, 0xb4, 0x73, 0x06, 0xe6, 0x2e, 0x34, 0x13, 0xb4, 0x68, 0x41, - 0x63, 0x73, 0xb0, 0xb5, 0xfe, 0x6c, 0x07, 0x45, 0x05, 0xa0, 0x3e, 0xdc, 0xde, 0x7d, 0xb4, 0x33, - 0xe0, 0x6b, 0xed, 0x6c, 0x0f, 0x47, 0xdd, 0xb2, 0xfe, 0x87, 0x25, 0x68, 0x26, 0x9e, 0x8c, 0x78, - 0x1f, 0x9d, 0x0f, 0x72, 0xd2, 0x94, 0x25, 0xa2, 0x8c, 0x50, 0x2e, 0x6c, 0x35, 0x92, 0x7e, 0x7c, - 0x8b, 0xa4, 0x58, 0x13, 0xdf, 0x86, 0x80, 0x7c, 0xd4, 0x5c, 0x29, 0x24, 0x74, 0x04, 0x54, 0x6d, - 0xdf, 0x93, 0xca, 0x61, 0xa6, 0x36, 0xc9, 0xa0, 0xe3, 0x59, 0x32, 0x0b, 0x27, 0x1a, 0x04, 0x8f, - 0x22, 0x3d, 0x66, 0x3f, 0x3a, 0x3d, 0x58, 0xba, 0x5b, 0x29, 0xbf, 0xdb, 0xb9, 0xa0, 0xa4, 0x7c, - 0x3e, 0x28, 0xc9, 0x0c, 0x67, 0xed, 0xcb, 0x0c, 0xa7, 0xfe, 0xf3, 0x3a, 0x74, 0x0c, 0x19, 0xc5, - 0x7e, 0x28, 0x95, 0x5f, 0xf8, 0xaa, 0x27, 0x74, 0x1d, 0x20, 0xe4, 0xc1, 0xd9, 0xd6, 0x9a, 0xc2, - 0x70, 0x34, 0xe5, 0xfa, 0x16, 0xc9, 0xae, 0xb2, 0x90, 0x29, 0x2c, 0xae, 0x81, 0xb6, 0x6f, 0x5a, - 0xc7, 0xbc, 0x2c, 0xdb, 0xc9, 0x26, 0x23, 0x78, 0x5d, 0xd3, 0xb2, 0x64, 0x14, 0x8d, 0x51, 0x14, - 0xd8, 0x5a, 0x6a, 0x8c, 0x79, 0x2c, 0xcf, 0xc4, 0x7d, 0x80, 0x48, 0x5a, 0xa1, 0x8c, 0xa9, 0x1b, - 0x6d, 0xa6, 0xb6, 0xb1, 0xf4, 0xab, 0x17, 0xcb, 0x0b, 0xff, 0xf4, 0x62, 0x59, 0x1b, 0x4a, 0x2f, - 0x72, 0x62, 0xe7, 0x44, 0x1a, 0x1a, 0x0f, 0xc2, 0x19, 0xdf, 0x86, 0x76, 0x24, 0x23, 0x34, 0xb6, - 0xe3, 0xd8, 0x3f, 0x96, 0xec, 0x97, 0xcf, 0x9d, 0xb4, 0xa8, 0xc6, 0x8d, 0x70, 0x18, 0x2a, 0x22, - 0xd3, 0xf3, 0xbd, 0xb3, 0x89, 0x3f, 0x8d, 0x94, 0x65, 0xc9, 0x10, 0x62, 0x15, 0x2e, 0x4b, 0xcf, - 0x0a, 0xcf, 0x02, 0xbc, 0x11, 0x9e, 0x65, 0x7c, 0xe0, 0xb8, 0x52, 0x39, 0xf4, 0x4b, 0x59, 0xd7, - 0x63, 0x79, 0xb6, 0xe5, 0xb8, 0x12, 0xaf, 0x75, 0x62, 0x4e, 0xdd, 0x78, 0x4c, 0xf9, 0x02, 0xe0, - 0x6b, 0x11, 0x66, 0xdd, 0xb6, 0x43, 0x71, 0x1b, 0x96, 0xb8, 0x3b, 0xf4, 0x5d, 0xe9, 0xd8, 0xbc, - 0x58, 0x8b, 0x46, 0x5d, 0xa2, 0x0e, 0x83, 0xf0, 0xb4, 0xd4, 0x2a, 0x5c, 0xe6, 0xb1, 0x7c, 0xc7, - 0x64, 0xf4, 0x22, 0x6f, 0x4d, 0x5d, 0x43, 0xd5, 0x53, 0xdc, 0x3a, 0x30, 0xe3, 0x23, 0x8a, 0x02, - 0x92, 0xad, 0x9f, 0x9a, 0xf1, 0x11, 0xfa, 0x05, 0xdc, 0x7d, 0xe0, 0x48, 0x97, 0xa3, 0x78, 0xcd, - 0xe0, 0x19, 0x5b, 0x88, 0x41, 0xbf, 0x40, 0x0d, 0xf0, 0xc3, 0x89, 0xc9, 0xe9, 0x47, 0xcd, 0xe0, - 0x49, 0x5b, 0x84, 0xc2, 0x2d, 0x14, 0x47, 0xbd, 0xe9, 0x84, 0x12, 0x91, 0x55, 0x43, 0xf1, 0x78, - 0x77, 0x3a, 0x11, 0xef, 0x43, 0xd7, 0xf1, 0xac, 0x50, 0x4e, 0xa4, 0x17, 0x9b, 0xee, 0xf8, 0x20, - 0xf4, 0x27, 0xbd, 0x25, 0x1a, 0x74, 0x29, 0x87, 0xdf, 0x0a, 0xfd, 0x89, 0xca, 0xde, 0x04, 0x66, - 0x18, 0x3b, 0xa6, 0xdb, 0x13, 0x49, 0xf6, 0xe6, 0x29, 0x23, 0xc4, 0x3b, 0xd0, 0xc6, 0xd9, 0xbb, - 0xa9, 0x85, 0xb8, 0x4c, 0xcb, 0x14, 0x91, 0xe2, 0x3b, 0xf0, 0xa6, 0x13, 0xa5, 0xe0, 0xfa, 0xcf, - 0x4c, 0x94, 0x68, 0x92, 0xcc, 0xde, 0x15, 0x5a, 0xf1, 0xa2, 0x6e, 0xfd, 0x65, 0x05, 0x9a, 0x69, - 0xf8, 0x7a, 0x07, 0xb4, 0x49, 0xa2, 0x7f, 0x95, 0xe3, 0xd9, 0x2e, 0x28, 0x65, 0x23, 0xeb, 0x17, - 0xd7, 0xa1, 0x7c, 0x7c, 0xa2, 0x6c, 0x41, 0x7b, 0x95, 0x0b, 0x07, 0xc1, 0xfe, 0x47, 0xab, 0x8f, - 0x9f, 0x1b, 0xe5, 0xe3, 0x93, 0xaf, 0xf0, 0x0e, 0xc5, 0x7b, 0x70, 0xc9, 0x72, 0xa5, 0xe9, 0x8d, - 0x33, 0x6f, 0x89, 0xe4, 0xdc, 0xe8, 0x10, 0xfa, 0x69, 0xea, 0x32, 0xdd, 0x82, 0x9a, 0x2d, 0xdd, - 0xd8, 0xcc, 0xe7, 0xaf, 0xf7, 0x42, 0xd3, 0x72, 0xe5, 0x26, 0xa2, 0x0d, 0xee, 0x45, 0x5b, 0x90, - 0x86, 0x8c, 0x39, 0x5b, 0x30, 0x27, 0x5c, 0x4c, 0xf5, 0x0c, 0xe4, 0xf5, 0xcc, 0x1d, 0x58, 0x92, - 0xa7, 0x01, 0x19, 0xc0, 0x71, 0x9a, 0x21, 0x61, 0xcb, 0xdc, 0x4d, 0x3a, 0x1e, 0x26, 0x99, 0x92, - 0x0f, 0x50, 0x05, 0x32, 0xa9, 0x17, 0x69, 0x2f, 0x41, 0x3a, 0xb4, 0xa0, 0x56, 0x8c, 0x64, 0x88, - 0x78, 0x1f, 0x34, 0xcb, 0xb6, 0xc6, 0x4c, 0x99, 0x76, 0x76, 0xb6, 0x87, 0x9b, 0x0f, 0x99, 0x24, - 0x4d, 0xcb, 0xb6, 0x38, 0x4a, 0x28, 0x84, 0xb2, 0x9d, 0xd7, 0x09, 0x65, 0xf3, 0x46, 0xbe, 0x5b, - 0x30, 0xf2, 0x9f, 0x55, 0x9b, 0x8d, 0x6e, 0x53, 0x7f, 0x1b, 0x9a, 0xc9, 0x46, 0xa8, 0xba, 0x23, - 0xe9, 0xa9, 0x34, 0x05, 0xa9, 0x6e, 0x04, 0x47, 0x91, 0x6e, 0x41, 0xe5, 0xf1, 0xf3, 0x21, 0x69, - 0x70, 0x34, 0xa6, 0x35, 0xf2, 0xbd, 0xa8, 0x9d, 0x6a, 0xf5, 0x72, 0x4e, 0xab, 0xdf, 0x60, 0x83, - 0x48, 0x0c, 0x4a, 0x72, 0xbb, 0x39, 0x0c, 0x92, 0x98, 0x9d, 0x81, 0x2a, 0xa7, 0x7d, 0x09, 0xd0, - 0xff, 0xbd, 0x02, 0x0d, 0xe5, 0xaf, 0xa1, 0x11, 0x9c, 0xa6, 0x69, 0x49, 0x6c, 0x16, 0x03, 0xe9, - 0xd4, 0xf1, 0xcb, 0xd7, 0x86, 0x2a, 0x5f, 0x5e, 0x1b, 0x12, 0x9f, 0xc0, 0x62, 0xc0, 0x7d, 0x79, - 0x57, 0xf1, 0xcd, 0xfc, 0x1c, 0xf5, 0x4b, 0xf3, 0x5a, 0x41, 0x06, 0x20, 0x29, 0x29, 0x41, 0x1e, - 0x9b, 0x87, 0x8a, 0x02, 0x0d, 0x84, 0x47, 0xe6, 0xe1, 0x6b, 0xf9, 0x7d, 0x1d, 0x72, 0x20, 0x17, - 0xc9, 0x80, 0xa0, 0xaf, 0x98, 0xe7, 0x4c, 0xbb, 0xe8, 0x7e, 0x5d, 0x03, 0xcd, 0xf2, 0x27, 0x13, - 0x87, 0xfa, 0x3a, 0x2a, 0x0d, 0x47, 0x88, 0x51, 0xa4, 0xff, 0x5e, 0x09, 0x1a, 0xea, 0x5e, 0xe7, - 0x8c, 0xfb, 0xc6, 0xf6, 0xee, 0xba, 0xf1, 0xa3, 0x6e, 0x09, 0x9d, 0x97, 0xed, 0xdd, 0x51, 0xb7, - 0x2c, 0x34, 0xa8, 0x6d, 0xed, 0xec, 0xad, 0x8f, 0xba, 0x15, 0x34, 0xf8, 0x1b, 0x7b, 0x7b, 0x3b, - 0xdd, 0xaa, 0x58, 0x84, 0xe6, 0xe6, 0xfa, 0x68, 0x30, 0xda, 0x7e, 0x32, 0xe8, 0xd6, 0x70, 0xec, - 0xa3, 0xc1, 0x5e, 0xb7, 0x8e, 0x8d, 0x67, 0xdb, 0x9b, 0xdd, 0x06, 0xf6, 0x3f, 0x5d, 0x1f, 0x0e, - 0x7f, 0xb0, 0x67, 0x6c, 0x76, 0x9b, 0xe4, 0x34, 0x8c, 0x8c, 0xed, 0xdd, 0x47, 0x5d, 0x0d, 0xdb, - 0x7b, 0x1b, 0x9f, 0x0d, 0x1e, 0x8e, 0xba, 0xa0, 0x3f, 0x80, 0x56, 0x8e, 0x56, 0x38, 0xdb, 0x18, - 0x6c, 0x75, 0x17, 0x70, 0xcb, 0xe7, 0xeb, 0x3b, 0xcf, 0xd0, 0xc7, 0xe8, 0x00, 0x50, 0x73, 0xbc, - 0xb3, 0xbe, 0xfb, 0xa8, 0x5b, 0x56, 0x1e, 0xea, 0xf7, 0xa1, 0xf9, 0xcc, 0xb1, 0x37, 0x5c, 0xdf, - 0x3a, 0x46, 0xf1, 0xd9, 0x37, 0x23, 0xa9, 0xe4, 0x8d, 0xda, 0x18, 0x0f, 0xd0, 0xa3, 0x8d, 0x14, - 0xaf, 0x15, 0x84, 0x14, 0xf3, 0xa6, 0x93, 0x31, 0xd5, 0x0f, 0x2b, 0x6c, 0x88, 0xbd, 0xe9, 0xe4, - 0x99, 0x63, 0x47, 0xfa, 0x31, 0x34, 0x9e, 0x39, 0xf6, 0x53, 0xd3, 0x3a, 0x26, 0x35, 0x8c, 0x4b, - 0x8f, 0x23, 0xe7, 0x73, 0xa9, 0x0c, 0xb6, 0x46, 0x98, 0xa1, 0xf3, 0xb9, 0x14, 0xef, 0x40, 0x9d, - 0x80, 0x24, 0x85, 0x42, 0x4f, 0x2d, 0x39, 0x8e, 0xa1, 0xfa, 0xa8, 0x7c, 0xe7, 0xba, 0xbe, 0x35, - 0x0e, 0xe5, 0x41, 0xef, 0x4d, 0xe6, 0x00, 0x21, 0x0c, 0x79, 0xa0, 0xff, 0x41, 0x29, 0xbd, 0x39, - 0x55, 0x89, 0x96, 0xa1, 0x1a, 0x98, 0xd6, 0xb1, 0xf2, 0x97, 0x5a, 0x6a, 0x41, 0x3c, 0x8c, 0x41, - 0x1d, 0xe2, 0x3d, 0x68, 0x2a, 0x41, 0x4a, 0x76, 0x6d, 0xe5, 0x24, 0xce, 0x48, 0x3b, 0x8b, 0x8c, - 0xaf, 0x14, 0x19, 0x4f, 0xd1, 0x76, 0xe0, 0x3a, 0x31, 0x3f, 0x1b, 0x7c, 0x9c, 0x04, 0xe9, 0x1f, - 0x01, 0x64, 0x05, 0xbb, 0x39, 0xee, 0xe3, 0x15, 0xa8, 0x99, 0xae, 0x63, 0x26, 0xd1, 0x3b, 0x03, - 0xfa, 0x2e, 0xb4, 0x72, 0x65, 0x3e, 0xa4, 0xad, 0xe9, 0xba, 0x68, 0xc3, 0xf9, 0xed, 0x37, 0x8d, - 0x86, 0xe9, 0xba, 0x8f, 0xe5, 0x59, 0x84, 0xae, 0x3b, 0x57, 0x08, 0xcb, 0x33, 0x45, 0x24, 0x9a, - 0x6a, 0x70, 0xa7, 0xfe, 0x01, 0xd4, 0xb7, 0x92, 0x00, 0x27, 0x79, 0x0c, 0xa5, 0x8b, 0x1e, 0x83, - 0xfe, 0xb1, 0x3a, 0x33, 0xd5, 0xa1, 0xc4, 0x1d, 0x55, 0x89, 0x8c, 0xb8, 0xee, 0x59, 0xca, 0xf2, - 0x3f, 0x3c, 0x48, 0x15, 0x21, 0x69, 0xb0, 0xbe, 0x09, 0xcd, 0x57, 0xd6, 0x76, 0x15, 0x01, 0xca, - 0x19, 0x01, 0xe6, 0x54, 0x7b, 0xf5, 0x9f, 0x00, 0x64, 0x15, 0x4b, 0xf5, 0x36, 0x79, 0x15, 0x7c, - 0x9b, 0xb7, 0xa1, 0x69, 0x1d, 0x39, 0xae, 0x1d, 0x4a, 0xaf, 0x70, 0xeb, 0xac, 0xc6, 0x99, 0xf6, - 0x8b, 0x9b, 0x50, 0xa5, 0x42, 0x6c, 0x25, 0xd3, 0xdc, 0x69, 0x15, 0x96, 0x7a, 0xf4, 0x53, 0x68, - 0x73, 0x4c, 0xf4, 0x1a, 0x1e, 0x65, 0x51, 0x75, 0x96, 0xcf, 0xa9, 0xce, 0xab, 0x50, 0x27, 0x17, - 0x25, 0xb9, 0x8d, 0x82, 0x2e, 0x50, 0xa9, 0x7f, 0x5c, 0x06, 0xe0, 0xad, 0x77, 0x7d, 0x5b, 0x16, - 0x93, 0x0f, 0xa5, 0xd9, 0xe4, 0x83, 0x80, 0x6a, 0x5a, 0x63, 0xd7, 0x0c, 0x6a, 0x67, 0xc6, 0x50, - 0x25, 0x24, 0xd8, 0x18, 0xbe, 0x05, 0x1a, 0x79, 0x91, 0xce, 0xe7, 0x54, 0xe0, 0xc1, 0x0d, 0x33, - 0x44, 0xbe, 0xe2, 0x5c, 0x2b, 0x56, 0x9c, 0xd3, 0xf2, 0x5b, 0x9d, 0x57, 0xe3, 0xf2, 0xdb, 0x9c, - 0x4a, 0x22, 0x67, 0x84, 0x22, 0x19, 0xc6, 0x49, 0x3a, 0x83, 0xa1, 0x34, 0x32, 0xd7, 0xd4, 0x58, - 0x93, 0x73, 0x3a, 0x9e, 0x3f, 0xb6, 0x7c, 0xef, 0xc0, 0x75, 0xac, 0x58, 0x55, 0x98, 0xc1, 0xf3, - 0x1f, 0x2a, 0x0c, 0x2d, 0xe6, 0x39, 0x3f, 0x9d, 0xb2, 0x33, 0x89, 0x8b, 0x11, 0xa4, 0x7f, 0x02, - 0x8b, 0x09, 0x5f, 0xa8, 0x90, 0x77, 0x3b, 0x8d, 0x66, 0x4b, 0x19, 0xcf, 0x33, 0xf2, 0x6d, 0x94, - 0x7b, 0xa5, 0x24, 0x9e, 0xd5, 0x7f, 0xbf, 0x9a, 0x4c, 0x56, 0xf5, 0xa6, 0x57, 0xd3, 0xb6, 0x98, - 0xa0, 0x28, 0xbf, 0x56, 0x82, 0xe2, 0x3b, 0xa0, 0xd9, 0x14, 0x73, 0x3b, 0x27, 0x89, 0x71, 0xeb, - 0xcf, 0xc6, 0xd7, 0x2a, 0x2a, 0x27, 0x6f, 0x3f, 0x1d, 0xfc, 0x25, 0xfc, 0x49, 0xb9, 0x50, 0x9b, - 0xc7, 0x85, 0xfa, 0xd7, 0xe4, 0x42, 0x46, 0xe4, 0x4e, 0x9e, 0xc8, 0xe8, 0x38, 0x7b, 0xbe, 0x37, - 0xf6, 0xa6, 0xae, 0x6b, 0xee, 0xbb, 0x52, 0xb1, 0xa7, 0xe5, 0xf9, 0xde, 0xae, 0x42, 0xa1, 0xdf, - 0x9f, 0x1f, 0xc2, 0x4a, 0x80, 0x59, 0x75, 0x29, 0x37, 0x8e, 0x54, 0xc5, 0x0a, 0x74, 0xfd, 0xfd, - 0x9f, 0x48, 0x2b, 0x26, 0x4a, 0x8e, 0xe9, 0xf5, 0xb3, 0xd3, 0xdf, 0x61, 0x3c, 0x92, 0x0e, 0xdd, - 0xda, 0x59, 0xb1, 0x68, 0xcf, 0x8a, 0x85, 0xfe, 0x31, 0x68, 0x29, 0xf5, 0x72, 0x71, 0xbf, 0x06, - 0xb5, 0xed, 0xdd, 0xcd, 0xc1, 0x0f, 0xbb, 0x25, 0x34, 0xaf, 0xc6, 0xe0, 0xf9, 0xc0, 0x18, 0x0e, - 0xba, 0x65, 0x34, 0x7d, 0x9b, 0x83, 0x9d, 0xc1, 0x68, 0xd0, 0xad, 0xb0, 0xeb, 0x44, 0xe5, 0x20, - 0xd7, 0xb1, 0x9c, 0x58, 0x1f, 0x02, 0x64, 0xc9, 0x0c, 0xd4, 0xe2, 0xd9, 0xe1, 0x54, 0x36, 0x35, - 0x4e, 0x8e, 0xb5, 0x92, 0x3e, 0xe0, 0xf2, 0x45, 0x29, 0x13, 0xee, 0xd7, 0xd7, 0x40, 0x7b, 0x62, - 0x06, 0x9f, 0x72, 0xe1, 0xf4, 0x16, 0x74, 0x28, 0x1e, 0x48, 0x22, 0x2d, 0x56, 0xae, 0x8b, 0x46, - 0x3b, 0xc5, 0xa2, 0xae, 0xd6, 0xff, 0xa2, 0x04, 0x57, 0x9e, 0xf8, 0x27, 0x32, 0xf5, 0x8f, 0x9f, - 0x9a, 0x67, 0xae, 0x6f, 0xda, 0x5f, 0x22, 0x9e, 0xd7, 0x01, 0x22, 0x7f, 0x4a, 0x85, 0xcc, 0xa4, - 0xec, 0x6b, 0x68, 0x8c, 0x79, 0xa4, 0xbe, 0x57, 0x91, 0x51, 0x4c, 0x9d, 0xca, 0xf0, 0x22, 0x8c, - 0x5d, 0x6f, 0x40, 0x3d, 0x3e, 0xf5, 0xb2, 0x22, 0x74, 0x2d, 0xa6, 0x2a, 0xc0, 0x5c, 0x77, 0xb9, - 0x36, 0xdf, 0x5d, 0xd6, 0x1f, 0x82, 0x36, 0x3a, 0xa5, 0x3c, 0xf8, 0xb4, 0xe8, 0xb0, 0x96, 0x5e, - 0xe1, 0x16, 0x95, 0x67, 0xdc, 0xa2, 0x7f, 0x2b, 0x41, 0x2b, 0xe7, 0xf7, 0x8b, 0x6f, 0x42, 0x35, - 0x3e, 0xf5, 0x8a, 0xdf, 0x7a, 0x24, 0x9b, 0x18, 0xd4, 0x75, 0x2e, 0xd7, 0x5b, 0x3e, 0x97, 0xeb, - 0x15, 0x3b, 0x70, 0x89, 0x35, 0x75, 0x72, 0x89, 0x24, 0x25, 0xf6, 0xf6, 0x4c, 0x9c, 0xc1, 0xb5, - 0x82, 0xe4, 0x4a, 0x2a, 0xcf, 0xd3, 0x39, 0x2c, 0x20, 0xfb, 0xeb, 0x70, 0x79, 0xce, 0xb0, 0xaf, - 0x52, 0x35, 0xd2, 0x97, 0xa1, 0x3d, 0x3a, 0xf5, 0x46, 0xce, 0x44, 0x46, 0xb1, 0x39, 0x09, 0xc8, - 0xad, 0x54, 0x96, 0xb6, 0x6a, 0x94, 0xe3, 0x48, 0x7f, 0x17, 0x16, 0x9f, 0x4a, 0x19, 0x1a, 0x32, - 0x0a, 0x7c, 0x8f, 0x9d, 0x29, 0x95, 0xa3, 0x67, 0xb3, 0xae, 0x20, 0xfd, 0x77, 0x41, 0x33, 0xcc, - 0x83, 0x78, 0xc3, 0x8c, 0xad, 0xa3, 0xaf, 0x92, 0xf4, 0x79, 0x17, 0x1a, 0x01, 0xcb, 0x94, 0x8a, - 0x06, 0x17, 0xc9, 0xbc, 0x2b, 0x39, 0x33, 0x92, 0x4e, 0xfd, 0xdb, 0xd0, 0x51, 0x05, 0xb3, 0xe4, - 0x24, 0xb9, 0xaa, 0x5a, 0xe9, 0xc2, 0xaa, 0x9a, 0x7e, 0x08, 0xed, 0x64, 0x1e, 0x1b, 0xcb, 0xd7, - 0x9a, 0xf6, 0xd5, 0x3f, 0x5b, 0xd0, 0x7f, 0x07, 0x2e, 0x0f, 0xa7, 0xfb, 0x91, 0x15, 0x3a, 0x94, - 0xa3, 0x48, 0xb6, 0xeb, 0x43, 0x33, 0x08, 0xe5, 0x81, 0x73, 0x2a, 0x93, 0x27, 0x96, 0xc2, 0xe2, - 0x36, 0x34, 0x26, 0x48, 0x2f, 0x99, 0x3d, 0xde, 0x2c, 0xc6, 0x7d, 0x82, 0x3d, 0x46, 0x32, 0x40, - 0xff, 0x2e, 0x5c, 0x29, 0x2e, 0xaf, 0xa8, 0xf0, 0x36, 0x54, 0x8e, 0x4f, 0x22, 0x45, 0xe6, 0xa5, - 0x42, 0x8c, 0x4c, 0xdf, 0x8b, 0x60, 0xaf, 0xfe, 0x37, 0x25, 0xa8, 0xec, 0x4e, 0x27, 0xf9, 0x8f, - 0xe1, 0xaa, 0xfc, 0x31, 0xdc, 0xb5, 0x7c, 0x3e, 0x9f, 0x63, 0xae, 0x2c, 0x6f, 0xff, 0x16, 0x68, - 0x07, 0x7e, 0xf8, 0x33, 0x33, 0xb4, 0xa5, 0xad, 0x2c, 0x76, 0x86, 0x20, 0x57, 0x7b, 0x3a, 0x09, - 0x94, 0xda, 0xa7, 0xb6, 0xb8, 0xa5, 0x6c, 0x3e, 0xc7, 0x41, 0x4b, 0x48, 0xd9, 0xdd, 0xe9, 0x64, - 0xd5, 0x95, 0x66, 0x44, 0x46, 0x88, 0xdd, 0x00, 0xfd, 0x0e, 0x68, 0x29, 0x0a, 0x15, 0xe4, 0xee, - 0x70, 0xbc, 0xbd, 0xc9, 0x39, 0x52, 0x8c, 0x18, 0x4a, 0xa8, 0x1c, 0x47, 0x3f, 0xdc, 0x1d, 0x8f, - 0x86, 0xdd, 0xb2, 0xfe, 0x63, 0x68, 0x25, 0xef, 0x67, 0xdb, 0xa6, 0x82, 0x20, 0x3d, 0xe0, 0x6d, - 0xbb, 0xf0, 0x9e, 0xb7, 0x29, 0xa4, 0x93, 0x9e, 0xbd, 0x9d, 0x3c, 0x3c, 0x06, 0x8a, 0x37, 0x54, - 0xd5, 0xc5, 0xe4, 0x86, 0xfa, 0x00, 0x96, 0x0c, 0x2a, 0x6c, 0xa0, 0x41, 0x4e, 0x58, 0x76, 0x15, - 0xea, 0x9e, 0x6f, 0xcb, 0x74, 0x03, 0x05, 0xe1, 0xce, 0x8a, 0xd9, 0x4a, 0xa5, 0xa5, 0xbc, 0x97, - 0xb0, 0x84, 0x5a, 0xb2, 0x28, 0x68, 0x85, 0xa4, 0x7b, 0x69, 0x26, 0xe9, 0x8e, 0x9b, 0xa8, 0xfa, - 0x3a, 0xfb, 0x47, 0x49, 0x4d, 0xbd, 0x0f, 0x4d, 0x3b, 0x8a, 0xe9, 0x59, 0x2b, 0xdd, 0x98, 0xc2, - 0xfa, 0x3d, 0xb8, 0xbc, 0x1e, 0x04, 0xee, 0x59, 0x52, 0x8d, 0x54, 0x1b, 0xf5, 0xb2, 0x92, 0x65, - 0x49, 0xc5, 0x91, 0x0c, 0xea, 0x5b, 0xb0, 0x98, 0x64, 0x24, 0x9e, 0xc8, 0xd8, 0x24, 0x8d, 0xe7, - 0x3a, 0x85, 0x90, 0xbc, 0xc9, 0x88, 0x51, 0x31, 0xb5, 0x3f, 0x73, 0xbf, 0x55, 0xa8, 0x2b, 0x75, - 0x2a, 0xa0, 0x6a, 0xf9, 0x36, 0x6f, 0x54, 0x33, 0xa8, 0x8d, 0x52, 0x35, 0x89, 0x0e, 0x13, 0x0f, - 0x79, 0x12, 0x1d, 0xea, 0xff, 0x55, 0x86, 0xf6, 0x06, 0x65, 0xaa, 0x92, 0x33, 0xe6, 0xb2, 0xb8, - 0xa5, 0x42, 0x16, 0x37, 0x9f, 0xb1, 0x2d, 0x17, 0x32, 0xb6, 0x85, 0x03, 0x55, 0x8a, 0x6e, 0xed, - 0x9b, 0xd0, 0x98, 0x7a, 0xce, 0x69, 0x62, 0x27, 0x34, 0x72, 0x0f, 0x4e, 0x47, 0x91, 0xb8, 0x09, - 0x2d, 0x34, 0x25, 0x8e, 0xc7, 0x59, 0x52, 0x4e, 0x75, 0xe6, 0x51, 0x33, 0xb9, 0xd0, 0xfa, 0xab, - 0x73, 0xa1, 0x8d, 0xaf, 0x93, 0x0b, 0x6d, 0x7e, 0x8d, 0x5c, 0xa8, 0x36, 0x9b, 0x0b, 0x2d, 0x3a, - 0xee, 0x70, 0xce, 0x71, 0xbf, 0x0e, 0xc0, 0x9f, 0x0a, 0x1d, 0x4c, 0x5d, 0x57, 0x79, 0x37, 0x1a, - 0x61, 0xb6, 0xa6, 0xae, 0xab, 0xef, 0x40, 0x27, 0x61, 0x80, 0x52, 0x14, 0x9f, 0xc0, 0x25, 0x55, - 0x0b, 0x91, 0xa1, 0x4a, 0xbf, 0xb1, 0xfe, 0xa3, 0x57, 0xca, 0xe5, 0x0a, 0xd5, 0x63, 0x74, 0xec, - 0x3c, 0x18, 0xe9, 0xbf, 0x2c, 0x41, 0xbb, 0x30, 0x42, 0x3c, 0xc8, 0x2a, 0x2b, 0x25, 0x7a, 0xeb, - 0xbd, 0x73, 0xab, 0xbc, 0xba, 0xba, 0x52, 0x9e, 0xa9, 0xae, 0xe8, 0x77, 0xd3, 0x9a, 0x89, 0xaa, - 0x94, 0x2c, 0xa4, 0x95, 0x12, 0x2a, 0x2e, 0xac, 0x8f, 0x46, 0x46, 0xb7, 0x2c, 0xea, 0x50, 0xde, - 0x1d, 0x76, 0x2b, 0xfa, 0x6f, 0xca, 0xd0, 0x1e, 0x9c, 0x06, 0xf4, 0xd9, 0xdc, 0x97, 0x46, 0x41, - 0x39, 0xe9, 0x2b, 0x17, 0xa4, 0x2f, 0x27, 0x47, 0x15, 0x55, 0x2a, 0x66, 0x39, 0xc2, 0xb8, 0x88, - 0x33, 0xb3, 0x4a, 0xbe, 0x18, 0xfa, 0xbf, 0x23, 0x5f, 0x05, 0xed, 0x04, 0xb3, 0x25, 0xc1, 0x1d, - 0xe8, 0x24, 0xc4, 0x55, 0xe2, 0xf3, 0x5a, 0x0f, 0x9f, 0x3f, 0xa7, 0x75, 0xd3, 0x24, 0x1d, 0x03, - 0xfa, 0x9f, 0x95, 0x41, 0x63, 0x69, 0xc4, 0xfb, 0xbc, 0xaf, 0x6c, 0x44, 0x29, 0xab, 0x3e, 0xa5, - 0x9d, 0xab, 0x8f, 0xe5, 0x59, 0x66, 0x27, 0xe6, 0x56, 0x6c, 0x55, 0x2a, 0x8f, 0xb3, 0x19, 0x94, - 0xca, 0xbb, 0x06, 0x1a, 0xbb, 0x78, 0x53, 0x55, 0xfa, 0xa8, 0x1a, 0xec, 0xf3, 0x3d, 0x73, 0xc8, - 0x4a, 0xc5, 0x32, 0x9c, 0x28, 0x4e, 0x51, 0xbb, 0x18, 0x37, 0xb6, 0x93, 0x88, 0xa5, 0x40, 0x91, - 0xc6, 0x2c, 0x45, 0x8e, 0xa0, 0xa1, 0xce, 0x86, 0x6e, 0xfc, 0xb3, 0xdd, 0xc7, 0xbb, 0x7b, 0x3f, - 0xd8, 0x2d, 0xc8, 0x68, 0xea, 0xe8, 0x97, 0xf3, 0x8e, 0x7e, 0x05, 0xf1, 0x0f, 0xf7, 0x9e, 0xed, - 0x8e, 0xba, 0x55, 0xd1, 0x06, 0x8d, 0x9a, 0x63, 0x63, 0xf0, 0xbc, 0x5b, 0xa3, 0x4c, 0xd8, 0xc3, - 0x4f, 0x07, 0x4f, 0xd6, 0xbb, 0xf5, 0xb4, 0x16, 0xd8, 0xd0, 0xff, 0xb4, 0x04, 0x4b, 0x4c, 0x90, - 0x7c, 0x52, 0x28, 0xff, 0xa1, 0x7b, 0x95, 0x3f, 0x74, 0xff, 0xdf, 0xcd, 0x03, 0xe1, 0xa4, 0xa9, - 0x93, 0x54, 0xdf, 0x39, 0x41, 0xd9, 0x9c, 0x3a, 0xaa, 0xe8, 0xfe, 0xf7, 0x25, 0xe8, 0x73, 0x7c, - 0xf1, 0x28, 0x34, 0x83, 0xa3, 0xef, 0xef, 0x9c, 0xcb, 0x48, 0x5c, 0xe4, 0x75, 0xdf, 0x82, 0x0e, - 0xfd, 0x15, 0xe0, 0xa7, 0xee, 0x58, 0x45, 0xc7, 0xcc, 0xdd, 0xb6, 0xc2, 0xf2, 0x42, 0xe2, 0x43, - 0x58, 0xe4, 0xbf, 0x0c, 0x50, 0xc6, 0xbe, 0x50, 0x39, 0x2e, 0x44, 0x37, 0x2d, 0x1e, 0xc5, 0x75, - 0xee, 0x07, 0xe9, 0xa4, 0x2c, 0x79, 0x71, 0xbe, 0x38, 0xac, 0xa6, 0x8c, 0x28, 0xa5, 0x71, 0x0f, - 0xae, 0xcd, 0xbd, 0x87, 0x12, 0xfb, 0x5c, 0xe2, 0x98, 0xa5, 0x4d, 0xff, 0x4d, 0x09, 0x9a, 0x1b, - 0x53, 0xf7, 0x98, 0x0c, 0xea, 0x75, 0x00, 0x69, 0x1f, 0x4a, 0xf5, 0xed, 0x7d, 0x89, 0x54, 0x88, - 0x86, 0x18, 0xfe, 0xfa, 0xfe, 0x13, 0x00, 0xbe, 0xe3, 0x78, 0x62, 0x06, 0x8a, 0x45, 0x54, 0xc9, - 0x4d, 0x16, 0x50, 0x77, 0x79, 0x62, 0x06, 0xaa, 0x92, 0x1b, 0x25, 0x70, 0x56, 0xe1, 0xae, 0xbc, - 0xa2, 0xc2, 0xdd, 0xdf, 0x85, 0x4e, 0x71, 0x89, 0x39, 0x09, 0xbb, 0x77, 0x8b, 0x5f, 0x11, 0x9d, - 0xa7, 0x61, 0x2e, 0x1e, 0xf8, 0x0c, 0x2e, 0xcd, 0x24, 0xff, 0x5f, 0xa5, 0x57, 0x0b, 0x4f, 0xa6, - 0x3c, 0xfb, 0x64, 0x3e, 0x80, 0xa5, 0x91, 0x19, 0x1d, 0xab, 0x18, 0x29, 0x73, 0x04, 0x62, 0x33, - 0x3a, 0x1e, 0xa7, 0x44, 0xad, 0x23, 0xb8, 0x6d, 0xeb, 0x0f, 0x40, 0xe4, 0x47, 0x2b, 0xfa, 0x63, - 0xec, 0x8b, 0xc3, 0x27, 0x32, 0x36, 0x13, 0x8f, 0x05, 0x11, 0x48, 0xbc, 0xb5, 0xbf, 0x2b, 0x41, - 0x15, 0x83, 0x0a, 0x71, 0x17, 0xb4, 0x4f, 0xa5, 0x19, 0xc6, 0xfb, 0xd2, 0x8c, 0x45, 0x21, 0x80, - 0xe8, 0x13, 0xdd, 0xb2, 0x2f, 0x93, 0xf4, 0x85, 0xfb, 0x25, 0xb1, 0xca, 0xdf, 0x4d, 0x27, 0xdf, - 0x83, 0xb7, 0x93, 0xe0, 0x84, 0x82, 0x97, 0x7e, 0x61, 0xbe, 0xbe, 0xb0, 0x42, 0xe3, 0x3f, 0xf3, - 0x1d, 0xef, 0x21, 0x7f, 0xad, 0x2b, 0x66, 0x83, 0x99, 0xd9, 0x19, 0xe2, 0x2e, 0xd4, 0xb7, 0x23, - 0x8c, 0x9a, 0xce, 0x0f, 0x25, 0xe2, 0xe7, 0x03, 0x2a, 0x7d, 0x61, 0xed, 0x2f, 0x6b, 0x50, 0xfd, - 0xb1, 0x0c, 0x7d, 0xf1, 0x01, 0x34, 0xd4, 0x77, 0x5c, 0x22, 0xf7, 0xbd, 0x56, 0x9f, 0x12, 0x3b, - 0x33, 0x1f, 0x78, 0xd1, 0x2e, 0x5d, 0xe6, 0x5f, 0x56, 0xf2, 0x12, 0xd9, 0x67, 0x66, 0xe7, 0x0e, - 0xf5, 0x31, 0x74, 0x87, 0x71, 0x28, 0xcd, 0x49, 0x6e, 0x78, 0x91, 0x54, 0xf3, 0xea, 0x67, 0x44, - 0xaf, 0x3b, 0x50, 0xe7, 0xd0, 0x74, 0x66, 0xc2, 0x6c, 0x71, 0x8c, 0x06, 0xbf, 0x07, 0xad, 0xe1, - 0x91, 0x3f, 0x75, 0xed, 0xa1, 0x0c, 0x4f, 0xa4, 0xc8, 0x45, 0x57, 0xfd, 0x5c, 0x5b, 0x5f, 0x10, - 0x0f, 0xa0, 0x8e, 0x1c, 0x09, 0x27, 0x62, 0x29, 0x17, 0x81, 0xb1, 0x98, 0xf4, 0x45, 0x1e, 0x95, - 0x50, 0x4a, 0xbc, 0x07, 0x1a, 0x87, 0x02, 0x18, 0x08, 0x34, 0x54, 0x74, 0xc1, 0xc7, 0xc8, 0x85, - 0x08, 0xfa, 0x82, 0x58, 0x01, 0xc8, 0xc5, 0xb4, 0xaf, 0x1a, 0xf9, 0x21, 0xb4, 0x1f, 0x92, 0x26, - 0xdc, 0x0b, 0xd7, 0xf7, 0xfd, 0x30, 0x16, 0xb3, 0xdf, 0x96, 0xf6, 0x67, 0x11, 0xfa, 0x02, 0x46, - 0x87, 0xa3, 0xf0, 0x8c, 0xc7, 0x2f, 0xa9, 0x54, 0x40, 0xb6, 0xdf, 0x1c, 0xba, 0x88, 0x8f, 0xd2, - 0x77, 0x95, 0x46, 0x00, 0xf3, 0x2a, 0x6d, 0x4c, 0x22, 0x7e, 0x03, 0x44, 0x22, 0xc8, 0xc2, 0x13, - 0xf1, 0x06, 0x57, 0xfd, 0x66, 0xc2, 0x95, 0xf3, 0x53, 0xb2, 0x50, 0x84, 0xa7, 0x9c, 0x0b, 0x4d, - 0x66, 0xa6, 0x7c, 0x0b, 0x16, 0xf3, 0x61, 0x85, 0xa0, 0xf2, 0xd5, 0x9c, 0x40, 0xa3, 0x38, 0x6d, - 0xed, 0x3f, 0x6a, 0x50, 0xff, 0x81, 0x1f, 0x1e, 0xcb, 0x50, 0xdc, 0x86, 0x3a, 0xd5, 0x6f, 0xd5, - 0x5b, 0x4a, 0x6b, 0xb9, 0xf3, 0x68, 0xf7, 0x0e, 0x68, 0x24, 0x19, 0xf8, 0xd8, 0x59, 0x5e, 0xe9, - 0xbf, 0x50, 0xbc, 0x38, 0x67, 0x4e, 0x49, 0xb8, 0x3b, 0x2c, 0xad, 0xe9, 0xf7, 0x1a, 0x85, 0xfa, - 0x6a, 0x9f, 0x58, 0xfa, 0xf8, 0xf9, 0x10, 0xdf, 0xe7, 0xfd, 0x12, 0xfa, 0x14, 0x43, 0x66, 0x1e, - 0x0e, 0xca, 0xfe, 0xeb, 0xc1, 0xcf, 0x3f, 0xfb, 0x73, 0x85, 0xbe, 0x20, 0xee, 0x41, 0x5d, 0x99, - 0x98, 0xa5, 0x4c, 0x11, 0x26, 0x37, 0xec, 0xe6, 0x51, 0x6a, 0xc2, 0x03, 0xa8, 0xb3, 0x39, 0xe6, - 0x09, 0x85, 0xb8, 0x86, 0xe5, 0xb4, 0xe8, 0x69, 0xeb, 0x0b, 0xe2, 0x0e, 0x34, 0x54, 0x75, 0x56, - 0xcc, 0x29, 0xd5, 0x9e, 0xe3, 0x58, 0x9d, 0x7d, 0x2d, 0x5e, 0xbf, 0xe0, 0xd4, 0xf2, 0xfa, 0x45, - 0x57, 0x8c, 0x9f, 0xbe, 0x21, 0x2d, 0xe9, 0xe4, 0x12, 0x73, 0x22, 0xa1, 0xc8, 0x1c, 0xfd, 0xf5, - 0x31, 0xb4, 0x0b, 0x49, 0x3c, 0xd1, 0x4b, 0xc4, 0x62, 0x36, 0xaf, 0x77, 0x4e, 0x6b, 0x7c, 0x17, - 0x34, 0x95, 0x76, 0xd8, 0x57, 0x82, 0x31, 0x27, 0xc9, 0xd1, 0x3f, 0x9f, 0x77, 0x20, 0x55, 0xf0, - 0x43, 0xb8, 0x3c, 0xc7, 0xb6, 0x0a, 0xfa, 0x5a, 0xf8, 0x62, 0xe7, 0xa1, 0xbf, 0x7c, 0x61, 0x7f, - 0x4a, 0x80, 0xaf, 0xf7, 0x9c, 0xbe, 0x07, 0x90, 0x99, 0x18, 0x7e, 0x1b, 0xe7, 0x0c, 0x54, 0xff, - 0xea, 0x2c, 0x3a, 0xd9, 0x74, 0xa3, 0xf7, 0xab, 0x2f, 0x6e, 0x94, 0x7e, 0xfd, 0xc5, 0x8d, 0xd2, - 0xbf, 0x7e, 0x71, 0xa3, 0xf4, 0xcb, 0xdf, 0xde, 0x58, 0xf8, 0xf5, 0x6f, 0x6f, 0x2c, 0xfc, 0xe3, - 0x6f, 0x6f, 0x2c, 0xec, 0xd7, 0xe9, 0x4f, 0x89, 0x1f, 0xfe, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xa1, 0x01, 0x6c, 0x5e, 0x0a, 0x39, 0x00, 0x00, + // 5650 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3b, 0x4b, 0x6f, 0x1c, 0x67, + 0x72, 0x9c, 0xf7, 0x74, 0x0d, 0x67, 0x38, 0xfc, 0x24, 0xcb, 0xe3, 0x91, 0x25, 0x6a, 0xdb, 0x96, + 0x4d, 0x4b, 0x16, 0x25, 0xd1, 0xde, 0xcd, 0xda, 0x8b, 0x05, 0x96, 0x14, 0x49, 0x99, 0x16, 0x45, + 0x72, 0x7b, 0x46, 0xda, 0x07, 0x90, 0x0c, 0x9a, 0xdd, 0x1f, 0xc9, 0x5e, 0xf6, 0x74, 0xf7, 0x76, + 0xf7, 0x70, 0x49, 0xdf, 0xf6, 0xb4, 0x97, 0x1c, 0x16, 0xc9, 0x31, 0x40, 0x10, 0xe4, 0x9a, 0x9c, + 0x82, 0x00, 0x09, 0x02, 0xe4, 0x10, 0x20, 0x08, 0x16, 0x39, 0xed, 0x31, 0xc8, 0x26, 0x42, 0xe0, + 0xcd, 0x49, 0x87, 0x00, 0xc9, 0x1f, 0x48, 0x50, 0x55, 0x5f, 0xbf, 0x86, 0xa3, 0x87, 0x1d, 0xe4, + 0x92, 0xd3, 0x7c, 0x55, 0xdf, 0xbb, 0xbe, 0x7a, 0x57, 0x0f, 0x34, 0x83, 0x83, 0x95, 0x20, 0xf4, + 0x63, 0x5f, 0x94, 0x83, 0x83, 0xbe, 0x66, 0x06, 0x0e, 0x83, 0xfd, 0x5b, 0x47, 0x4e, 0x7c, 0x3c, + 0x39, 0x58, 0xb1, 0xfc, 0xf1, 0x5d, 0xfb, 0x28, 0x34, 0x83, 0xe3, 0x3b, 0x8e, 0x7f, 0xf7, 0xc0, + 0xb4, 0x8f, 0x64, 0x78, 0xf7, 0xf4, 0xe3, 0xbb, 0xc1, 0xc1, 0xdd, 0x64, 0x6a, 0xff, 0x4e, 0x6e, + 0xec, 0x91, 0x7f, 0xe4, 0xdf, 0x25, 0xf4, 0xc1, 0xe4, 0x90, 0x20, 0x02, 0xa8, 0xc5, 0xc3, 0xf5, + 0x3e, 0x54, 0x77, 0x9c, 0x28, 0x16, 0x02, 0xaa, 0x13, 0xc7, 0x8e, 0x7a, 0xa5, 0x1b, 0x95, 0xe5, + 0xba, 0x41, 0x6d, 0xfd, 0x31, 0x68, 0x43, 0x33, 0x3a, 0x79, 0x6a, 0xba, 0x13, 0x29, 0xba, 0x50, + 0x39, 0x35, 0xdd, 0x5e, 0xe9, 0x46, 0x69, 0x79, 0xde, 0xc0, 0xa6, 0x58, 0x81, 0xe6, 0xa9, 0xe9, + 0x8e, 0xe2, 0xf3, 0x40, 0xf6, 0xca, 0x37, 0x4a, 0xcb, 0x9d, 0xd5, 0x4b, 0x2b, 0xc1, 0xc1, 0xca, + 0xbe, 0x1f, 0xc5, 0x8e, 0x77, 0xb4, 0xf2, 0xd4, 0x74, 0x87, 0xe7, 0x81, 0x34, 0x1a, 0xa7, 0xdc, + 0xd0, 0xf7, 0xa0, 0x35, 0x08, 0xad, 0xad, 0x89, 0x67, 0xc5, 0x8e, 0xef, 0xe1, 0x8e, 0x9e, 0x39, + 0x96, 0xb4, 0xa2, 0x66, 0x50, 0x1b, 0x71, 0x66, 0x78, 0x14, 0xf5, 0x2a, 0x37, 0x2a, 0x88, 0xc3, + 0xb6, 0xe8, 0x41, 0xc3, 0x89, 0x1e, 0xf8, 0x13, 0x2f, 0xee, 0x55, 0x6f, 0x94, 0x96, 0x9b, 0x46, + 0x02, 0xea, 0x7f, 0x55, 0x81, 0xda, 0xf7, 0x27, 0x32, 0x3c, 0xa7, 0x79, 0x71, 0x1c, 0x26, 0x6b, + 0x61, 0x5b, 0x5c, 0x86, 0x9a, 0x6b, 0x7a, 0x47, 0x51, 0xaf, 0x4c, 0x8b, 0x31, 0x20, 0xae, 0x82, + 0x66, 0x1e, 0xc6, 0x32, 0x1c, 0x4d, 0x1c, 0xbb, 0x57, 0xb9, 0x51, 0x5a, 0xae, 0x1b, 0x4d, 0x42, + 0x3c, 0x71, 0x6c, 0xf1, 0x16, 0x34, 0x6d, 0x7f, 0x64, 0xe5, 0xf7, 0xb2, 0x7d, 0xda, 0x4b, 0xbc, + 0x03, 0xcd, 0x89, 0x63, 0x8f, 0x5c, 0x27, 0x8a, 0x7b, 0xb5, 0x1b, 0xa5, 0xe5, 0xd6, 0x6a, 0x13, + 0x2f, 0x8b, 0xb4, 0x33, 0x1a, 0x13, 0xc7, 0x26, 0x22, 0xde, 0x82, 0x66, 0x14, 0x5a, 0xa3, 0xc3, + 0x89, 0x67, 0xf5, 0xea, 0x34, 0x68, 0x01, 0x07, 0xe5, 0x6e, 0x6d, 0x34, 0x22, 0x06, 0xf0, 0x5a, + 0xa1, 0x3c, 0x95, 0x61, 0x24, 0x7b, 0x0d, 0xde, 0x4a, 0x81, 0xe2, 0x1e, 0xb4, 0x0e, 0x4d, 0x4b, + 0xc6, 0xa3, 0xc0, 0x0c, 0xcd, 0x71, 0xaf, 0x99, 0x2d, 0xb4, 0x85, 0xe8, 0x7d, 0xc4, 0x46, 0x06, + 0x1c, 0xa6, 0x80, 0xf8, 0x08, 0xda, 0x04, 0x45, 0xa3, 0x43, 0xc7, 0x8d, 0x65, 0xd8, 0xd3, 0x68, + 0x4e, 0x87, 0xe6, 0x10, 0x66, 0x18, 0x4a, 0x69, 0xcc, 0xf3, 0x20, 0xc6, 0x88, 0x6b, 0x00, 0xf2, + 0x2c, 0x30, 0x3d, 0x7b, 0x64, 0xba, 0x6e, 0x0f, 0xe8, 0x0c, 0x1a, 0x63, 0xd6, 0x5c, 0x57, 0xbc, + 0x89, 0xe7, 0x33, 0xed, 0x51, 0x1c, 0xf5, 0xda, 0x37, 0x4a, 0xcb, 0x55, 0xa3, 0x8e, 0xe0, 0x30, + 0x42, 0xba, 0x5a, 0xa6, 0x75, 0x2c, 0x7b, 0x9d, 0x1b, 0xa5, 0xe5, 0x9a, 0xc1, 0x00, 0x62, 0x0f, + 0x9d, 0x30, 0x8a, 0x7b, 0x0b, 0x8c, 0x25, 0x40, 0x5c, 0x81, 0xba, 0x7f, 0x78, 0x18, 0xc9, 0xb8, + 0xd7, 0x25, 0xb4, 0x82, 0xf4, 0x55, 0xd0, 0x88, 0xab, 0x88, 0x6a, 0x37, 0xa1, 0x7e, 0x8a, 0x00, + 0x33, 0x5f, 0x6b, 0xb5, 0x8d, 0xc7, 0x4e, 0x19, 0xcf, 0x50, 0x9d, 0xfa, 0x75, 0x68, 0xee, 0x98, + 0xde, 0x51, 0xc2, 0xad, 0xf8, 0x9c, 0x34, 0x41, 0x33, 0xa8, 0xad, 0xff, 0x49, 0x05, 0xea, 0x86, + 0x8c, 0x26, 0x6e, 0x2c, 0xde, 0x07, 0xc0, 0xc7, 0x1a, 0x9b, 0x71, 0xe8, 0x9c, 0xa9, 0x55, 0xb3, + 0xe7, 0xd2, 0x26, 0x8e, 0xfd, 0x98, 0xba, 0xc4, 0x3d, 0x98, 0xa7, 0xd5, 0x93, 0xa1, 0xe5, 0xec, + 0x00, 0xe9, 0xf9, 0x8c, 0x16, 0x0d, 0x51, 0x33, 0xae, 0x40, 0x9d, 0xf8, 0x83, 0x79, 0xb4, 0x6d, + 0x28, 0x48, 0xdc, 0x84, 0x8e, 0xe3, 0xc5, 0xf8, 0x7e, 0x56, 0x3c, 0xb2, 0x65, 0x94, 0x30, 0x50, + 0x3b, 0xc5, 0x6e, 0xc8, 0x28, 0x16, 0xf7, 0x81, 0x1f, 0x21, 0xd9, 0xb0, 0x46, 0x1b, 0x76, 0xd2, + 0xc7, 0x8d, 0x78, 0x47, 0x1a, 0xa3, 0x76, 0xbc, 0x03, 0x2d, 0xbc, 0x5f, 0x32, 0xa3, 0x4e, 0x33, + 0xe6, 0xe9, 0x36, 0x8a, 0x1c, 0x06, 0xe0, 0x00, 0x35, 0x1c, 0x49, 0x83, 0x4c, 0xca, 0x4c, 0x45, + 0x6d, 0xb1, 0x01, 0x9d, 0x53, 0x69, 0xc5, 0x7e, 0x38, 0x1a, 0xcb, 0x38, 0x74, 0xac, 0xa8, 0xd7, + 0xa4, 0x55, 0xae, 0xe1, 0x2a, 0x4c, 0xb3, 0x95, 0xa7, 0x34, 0xe0, 0x31, 0xf7, 0x6f, 0x7a, 0x71, + 0x78, 0x6e, 0xb4, 0x4f, 0xf3, 0xb8, 0xfe, 0xf7, 0x40, 0x5c, 0x1c, 0x84, 0x7a, 0xe1, 0x44, 0x9e, + 0x2b, 0xc9, 0xc3, 0x26, 0xb2, 0x02, 0x51, 0x8c, 0x94, 0x42, 0xd5, 0x60, 0xe0, 0xd3, 0xf2, 0xb7, + 0x4b, 0xfa, 0x26, 0xd4, 0xf6, 0x42, 0x5b, 0x86, 0x33, 0xe5, 0x55, 0x40, 0xd5, 0x96, 0x91, 0x45, + 0xb3, 0x9a, 0x06, 0xb5, 0x33, 0x19, 0xae, 0xe4, 0x64, 0x58, 0xff, 0xe3, 0x12, 0xb4, 0x06, 0x7e, + 0x18, 0x3f, 0x96, 0x51, 0x64, 0x1e, 0x49, 0xb1, 0x04, 0x35, 0x1f, 0x97, 0x55, 0x2f, 0xad, 0xe1, + 0xad, 0x68, 0x1f, 0x83, 0xf1, 0x53, 0xfc, 0x50, 0x7e, 0x31, 0x3f, 0x20, 0x6f, 0x93, 0xf4, 0x57, + 0x14, 0x6f, 0x93, 0xec, 0x67, 0x5c, 0x5c, 0xcd, 0x73, 0xf1, 0x0b, 0x45, 0x44, 0xff, 0x26, 0x00, + 0x9e, 0xef, 0x2b, 0x72, 0xa3, 0xfe, 0x8b, 0x12, 0xb4, 0x0c, 0xf3, 0x30, 0x7e, 0xe0, 0x7b, 0xb1, + 0x3c, 0x8b, 0x45, 0x07, 0xca, 0x8e, 0x4d, 0x34, 0xaa, 0x1b, 0x65, 0xc7, 0xc6, 0xd3, 0x1d, 0x85, + 0xfe, 0x24, 0x20, 0x12, 0xb5, 0x0d, 0x06, 0x88, 0x96, 0xb6, 0x1d, 0xd2, 0x91, 0x91, 0x96, 0xb6, + 0x1d, 0x8a, 0x25, 0x68, 0x45, 0x9e, 0x19, 0x44, 0xc7, 0x7e, 0x8c, 0xa7, 0xab, 0xd2, 0xe9, 0x20, + 0x41, 0x0d, 0x23, 0x14, 0x7e, 0x27, 0x1a, 0xb9, 0xd2, 0x0c, 0x3d, 0x19, 0x92, 0x42, 0x6b, 0x1a, + 0x9a, 0x13, 0xed, 0x30, 0x42, 0xff, 0x45, 0x05, 0xea, 0x8f, 0xe5, 0xf8, 0x40, 0x86, 0x17, 0x0e, + 0x71, 0x0f, 0x9a, 0xb4, 0xef, 0xc8, 0xb1, 0xf9, 0x1c, 0xeb, 0x6f, 0x3c, 0x7f, 0xb6, 0xb4, 0x48, + 0xb8, 0x6d, 0xfb, 0x43, 0x7f, 0xec, 0xc4, 0x72, 0x1c, 0xc4, 0xe7, 0x46, 0x43, 0xa1, 0x66, 0x1e, + 0xf0, 0x0a, 0xd4, 0x5d, 0x69, 0xe2, 0x9b, 0xb1, 0x98, 0x28, 0x48, 0xdc, 0x81, 0x86, 0x39, 0x1e, + 0xd9, 0xd2, 0xb4, 0xf9, 0x50, 0xeb, 0x97, 0x9f, 0x3f, 0x5b, 0xea, 0x9a, 0xe3, 0x0d, 0x69, 0xe6, + 0xd7, 0xae, 0x33, 0x46, 0x7c, 0x82, 0xb2, 0x11, 0xc5, 0xa3, 0x49, 0x60, 0x9b, 0xb1, 0x24, 0x9d, + 0x5b, 0x5d, 0xef, 0x3d, 0x7f, 0xb6, 0x74, 0x19, 0xd1, 0x4f, 0x08, 0x9b, 0x9b, 0x06, 0x19, 0x16, + 0xf5, 0x6f, 0x72, 0x7d, 0xa5, 0x7f, 0x15, 0x28, 0xb6, 0x61, 0xd1, 0x72, 0x27, 0x11, 0x1a, 0x09, + 0xc7, 0x3b, 0xf4, 0x47, 0xbe, 0xe7, 0x9e, 0xd3, 0x03, 0x37, 0xd7, 0xaf, 0x3d, 0x7f, 0xb6, 0xf4, + 0x96, 0xea, 0xdc, 0xf6, 0x0e, 0xfd, 0x3d, 0xcf, 0x3d, 0xcf, 0xad, 0xbf, 0x30, 0xd5, 0x25, 0xbe, + 0x07, 0x9d, 0x43, 0x3f, 0xb4, 0xe4, 0x28, 0x25, 0x59, 0x87, 0xd6, 0xe9, 0x3f, 0x7f, 0xb6, 0x74, + 0x85, 0x7a, 0x1e, 0x5e, 0xa0, 0xdb, 0x7c, 0x1e, 0xaf, 0xff, 0x6b, 0x19, 0x6a, 0xd4, 0x16, 0xf7, + 0xa0, 0x31, 0xa6, 0x27, 0x49, 0xf4, 0xe4, 0x15, 0xe4, 0x21, 0xea, 0x5b, 0xe1, 0xb7, 0x52, 0x62, + 0x9b, 0x0c, 0xc3, 0x19, 0xb1, 0x79, 0xe0, 0xca, 0x38, 0x52, 0x3c, 0x9f, 0x9b, 0x31, 0xe4, 0x0e, + 0x35, 0x43, 0x0d, 0x9b, 0xe6, 0x9b, 0xca, 0x05, 0xbe, 0xe9, 0x43, 0xd3, 0x3a, 0x96, 0xd6, 0x49, + 0x34, 0x19, 0x2b, 0xae, 0x4a, 0x61, 0xf1, 0x0e, 0xb4, 0xa9, 0x1d, 0xf8, 0x8e, 0x47, 0xd3, 0x6b, + 0x34, 0x60, 0x3e, 0x43, 0x0e, 0xa3, 0xfe, 0x16, 0xcc, 0xe7, 0x0f, 0x9b, 0x57, 0x1f, 0x55, 0x56, + 0x1f, 0x37, 0xf2, 0xea, 0xa3, 0xb5, 0x0a, 0x78, 0x66, 0x9e, 0x92, 0x53, 0x25, 0xb8, 0x4e, 0xfe, + 0x0a, 0x33, 0xd4, 0xd0, 0xac, 0x75, 0x78, 0x4a, 0x5e, 0x25, 0xf9, 0xd0, 0xd8, 0x71, 0x2c, 0xe9, + 0x45, 0xe4, 0x7c, 0x4c, 0x22, 0x99, 0x2a, 0x25, 0x6c, 0xe3, 0x7d, 0xc7, 0xe6, 0xd9, 0xae, 0x6f, + 0xcb, 0x48, 0xa9, 0xb3, 0x14, 0xc6, 0x3e, 0x79, 0x16, 0x38, 0xe1, 0xf9, 0x90, 0x29, 0x55, 0x31, + 0x52, 0x18, 0xb9, 0x4b, 0x7a, 0xb8, 0x99, 0x9d, 0x38, 0x12, 0x0a, 0xd4, 0xff, 0xbc, 0x0a, 0xf3, + 0x3f, 0x96, 0xa1, 0xbf, 0x1f, 0xfa, 0x81, 0x1f, 0x99, 0xae, 0x58, 0x2b, 0xd2, 0x9c, 0xdf, 0xf6, + 0x06, 0x9e, 0x36, 0x3f, 0x6c, 0x65, 0x90, 0x3e, 0x02, 0xbf, 0x59, 0xfe, 0x55, 0x74, 0xa8, 0xf3, + 0x9b, 0xcf, 0xa0, 0x99, 0xea, 0xc1, 0x31, 0xfc, 0xca, 0x74, 0xd6, 0x22, 0x3d, 0x54, 0x0f, 0x4a, + 0xe5, 0xd8, 0x3c, 0x7b, 0xb2, 0xbd, 0xa1, 0xde, 0x56, 0x41, 0x8a, 0x0a, 0xc3, 0x33, 0x6f, 0x98, + 0x3c, 0x6a, 0x0a, 0xe3, 0x4d, 0x91, 0x22, 0xd1, 0xf6, 0x46, 0x6f, 0x9e, 0xba, 0x12, 0x50, 0xbc, + 0x0d, 0xda, 0xd8, 0x3c, 0x43, 0x85, 0xb6, 0x6d, 0xb3, 0x68, 0x1a, 0x19, 0x42, 0x7c, 0x03, 0x2a, + 0xf1, 0x99, 0x47, 0xb2, 0x87, 0xde, 0x0d, 0x3a, 0xbb, 0xc3, 0x33, 0x4f, 0xa9, 0x3e, 0x03, 0xfb, + 0xf0, 0x4d, 0x2d, 0xc7, 0x26, 0x67, 0x46, 0x33, 0xb0, 0x29, 0x6e, 0x42, 0xc3, 0xe5, 0xd7, 0x22, + 0x87, 0xa5, 0xb5, 0xda, 0x62, 0x3d, 0x4a, 0x28, 0x23, 0xe9, 0x13, 0x1f, 0x42, 0x33, 0xa1, 0x4e, + 0xaf, 0x45, 0xe3, 0xba, 0x09, 0x3d, 0x13, 0x32, 0x1a, 0xe9, 0x08, 0x71, 0x0f, 0x34, 0x5b, 0xba, + 0x32, 0x96, 0x23, 0x8f, 0x15, 0x79, 0x8b, 0x1d, 0xd9, 0x0d, 0x42, 0xee, 0x46, 0x86, 0xfc, 0xe9, + 0x44, 0x46, 0xb1, 0xd1, 0xb4, 0x15, 0x42, 0xbc, 0x9b, 0x09, 0x56, 0x87, 0x9e, 0x2b, 0x4f, 0xcc, + 0xa4, 0xab, 0xff, 0x5d, 0x58, 0x98, 0x7a, 0xb4, 0x3c, 0x97, 0xb6, 0x5f, 0x61, 0x2c, 0x3f, 0xaf, + 0x36, 0x9b, 0x5d, 0x4d, 0xff, 0xcf, 0x0a, 0x2c, 0x28, 0x81, 0x39, 0x76, 0x82, 0x41, 0xac, 0x54, + 0x17, 0x19, 0x26, 0xc5, 0xab, 0x55, 0x23, 0x01, 0xc5, 0xef, 0x40, 0x9d, 0x34, 0x4d, 0x22, 0xf0, + 0x4b, 0x19, 0x23, 0xa4, 0xd3, 0x59, 0x01, 0x28, 0x2e, 0x52, 0xc3, 0xc5, 0xc7, 0x50, 0xfb, 0x42, + 0x86, 0x3e, 0x1b, 0xda, 0xd6, 0xea, 0xf5, 0x59, 0xf3, 0x90, 0x7c, 0x6a, 0x1a, 0x0f, 0xfe, 0xdf, + 0xf2, 0x0b, 0x7c, 0x15, 0x7e, 0x79, 0x17, 0x8d, 0xed, 0xd8, 0x3f, 0x95, 0x76, 0xaf, 0x91, 0xd1, + 0x5c, 0x31, 0x79, 0xd2, 0x95, 0xb0, 0x4c, 0x73, 0x26, 0xcb, 0x68, 0x2f, 0x66, 0x99, 0xfe, 0x06, + 0xb4, 0x72, 0x74, 0x99, 0xf1, 0x50, 0x4b, 0x45, 0x75, 0xa2, 0xa5, 0xaa, 0x34, 0xaf, 0x95, 0x36, + 0x00, 0x32, 0x2a, 0x7d, 0x5d, 0xdd, 0xa6, 0xff, 0xbc, 0x04, 0x0b, 0x0f, 0x7c, 0xcf, 0x93, 0x14, + 0x32, 0xf0, 0x9b, 0x67, 0x22, 0x5e, 0x7a, 0xa1, 0x88, 0x7f, 0x00, 0xb5, 0x08, 0x07, 0xab, 0xd5, + 0x2f, 0xcd, 0x78, 0x44, 0x83, 0x47, 0xa0, 0xa2, 0x1f, 0x9b, 0x67, 0xa3, 0x40, 0x7a, 0xb6, 0xe3, + 0x1d, 0x25, 0x8a, 0x7e, 0x6c, 0x9e, 0xed, 0x33, 0x46, 0xff, 0xeb, 0x32, 0xc0, 0x67, 0xd2, 0x74, + 0xe3, 0x63, 0x34, 0x66, 0xf8, 0xa2, 0x8e, 0x17, 0xc5, 0xa6, 0x67, 0x25, 0x01, 0x5b, 0x0a, 0xe3, + 0x8b, 0xa2, 0x4d, 0x97, 0x11, 0xab, 0x48, 0xcd, 0x48, 0x40, 0xe4, 0x0f, 0xdc, 0x6e, 0x12, 0x29, + 0xdb, 0xaf, 0xa0, 0xcc, 0x91, 0xa9, 0x12, 0x5a, 0x39, 0x32, 0x3d, 0x68, 0x60, 0x00, 0xe4, 0xf8, + 0x1e, 0x31, 0x8d, 0x66, 0x24, 0x20, 0xae, 0x33, 0x09, 0x62, 0x67, 0xcc, 0x16, 0xbe, 0x62, 0x28, + 0x08, 0x4f, 0x85, 0x16, 0x7d, 0xd3, 0x3a, 0xf6, 0x49, 0x91, 0x54, 0x8c, 0x14, 0xc6, 0xd5, 0x7c, + 0xef, 0xc8, 0xc7, 0xdb, 0x35, 0xc9, 0x79, 0x4c, 0x40, 0xbe, 0x8b, 0x2d, 0xcf, 0xb0, 0x4b, 0xa3, + 0xae, 0x14, 0x46, 0xba, 0x48, 0x39, 0x3a, 0x94, 0x66, 0x3c, 0x09, 0x65, 0xd4, 0x03, 0xea, 0x06, + 0x29, 0xb7, 0x14, 0x46, 0x7c, 0x03, 0xe6, 0x91, 0x70, 0x66, 0x14, 0x39, 0x47, 0x9e, 0xb4, 0x49, + 0xbd, 0x54, 0x0d, 0x24, 0xe6, 0x9a, 0x42, 0xe9, 0x7f, 0x5b, 0x86, 0x3a, 0xeb, 0x82, 0x82, 0xb3, + 0x54, 0x7a, 0x2d, 0x67, 0xe9, 0x6d, 0xd0, 0x82, 0x50, 0xda, 0x8e, 0x95, 0xbc, 0xa3, 0x66, 0x64, + 0x08, 0x8a, 0xb2, 0xd0, 0x3b, 0x20, 0x7a, 0x36, 0x0d, 0x06, 0x84, 0x0e, 0x6d, 0xdf, 0x1b, 0xd9, + 0x4e, 0x74, 0x32, 0x3a, 0x38, 0x8f, 0x65, 0xa4, 0x68, 0xd1, 0xf2, 0xbd, 0x0d, 0x27, 0x3a, 0x59, + 0x47, 0x14, 0x92, 0x90, 0x65, 0x84, 0x64, 0xa3, 0x69, 0x28, 0x48, 0x7c, 0x04, 0x1a, 0xf9, 0xb0, + 0xe4, 0xe4, 0x68, 0xe4, 0x9c, 0x5c, 0x79, 0xfe, 0x6c, 0x49, 0x20, 0x72, 0xca, 0xbb, 0x69, 0x26, + 0x38, 0xf4, 0xd2, 0x70, 0x32, 0x9a, 0x2b, 0x92, 0x61, 0xf6, 0xd2, 0x10, 0x35, 0x8c, 0xf2, 0x5e, + 0x1a, 0x63, 0xc4, 0x1d, 0x10, 0x13, 0xcf, 0xf2, 0xc7, 0x01, 0x32, 0x85, 0xb4, 0xd5, 0x21, 0x5b, + 0x74, 0xc8, 0xc5, 0x7c, 0x0f, 0x1d, 0x55, 0xff, 0x97, 0x32, 0xcc, 0x6f, 0x38, 0xa1, 0xb4, 0x62, + 0x69, 0x6f, 0xda, 0x47, 0x12, 0xcf, 0x2e, 0xbd, 0xd8, 0x89, 0xcf, 0x95, 0x1b, 0xaa, 0xa0, 0x34, + 0x8a, 0x28, 0x17, 0xa3, 0x7e, 0x96, 0xb0, 0x0a, 0x25, 0x2a, 0x18, 0x10, 0xab, 0x00, 0x1c, 0xe7, + 0x51, 0xb2, 0xa2, 0xfa, 0xe2, 0x64, 0x85, 0x46, 0xc3, 0xb0, 0x29, 0xde, 0xa2, 0xf4, 0xc6, 0x44, + 0xe2, 0xdb, 0xd5, 0x68, 0xdf, 0x06, 0xc1, 0xec, 0xd1, 0x52, 0xf8, 0xd9, 0xe0, 0x8d, 0xb1, 0x2d, + 0xde, 0x81, 0xb2, 0x1f, 0x10, 0x71, 0xd5, 0xd2, 0xf9, 0x2b, 0xac, 0xec, 0x05, 0x46, 0xd9, 0x0f, + 0x50, 0x8a, 0x39, 0x06, 0x27, 0xc6, 0x43, 0x29, 0x46, 0xbb, 0x47, 0x91, 0x9f, 0xa1, 0x7a, 0x84, + 0x0e, 0xf3, 0xa6, 0xeb, 0xfa, 0x3f, 0x93, 0xf6, 0x7e, 0x28, 0xed, 0x84, 0x07, 0x0b, 0x38, 0xe4, + 0x12, 0xcf, 0x1c, 0xcb, 0x28, 0x30, 0x2d, 0xa9, 0x58, 0x30, 0x43, 0xe8, 0x57, 0xa0, 0xbc, 0x17, + 0x88, 0x06, 0x54, 0x06, 0x9b, 0xc3, 0xee, 0x1c, 0x36, 0x36, 0x36, 0x77, 0xba, 0x68, 0x51, 0xea, + 0xdd, 0x86, 0xfe, 0x65, 0x19, 0xb4, 0xc7, 0x93, 0xd8, 0x44, 0xdd, 0x12, 0xe1, 0x2d, 0x8b, 0x1c, + 0x9a, 0xb1, 0xe2, 0x5b, 0xd0, 0x8c, 0x62, 0x33, 0x24, 0xaf, 0x84, 0xad, 0x53, 0x83, 0xe0, 0x61, + 0x24, 0xde, 0x83, 0x9a, 0xb4, 0x8f, 0x64, 0x62, 0x2e, 0xba, 0xd3, 0xf7, 0x35, 0xb8, 0x5b, 0x2c, + 0x43, 0x3d, 0xb2, 0x8e, 0xe5, 0xd8, 0xec, 0x55, 0xb3, 0x81, 0x03, 0xc2, 0xb0, 0x1b, 0x6e, 0xa8, + 0x7e, 0xf1, 0x2e, 0xd4, 0xf0, 0x6d, 0x22, 0x15, 0xdf, 0x52, 0x44, 0x8c, 0xcf, 0xa0, 0x86, 0x71, + 0x27, 0x32, 0x9e, 0x1d, 0xfa, 0xc1, 0xc8, 0x0f, 0x88, 0xf6, 0x9d, 0xd5, 0xcb, 0xa4, 0xe3, 0x92, + 0xdb, 0xac, 0x6c, 0x84, 0x7e, 0xb0, 0x17, 0x18, 0x75, 0x9b, 0x7e, 0x31, 0xca, 0xa1, 0xe1, 0xcc, + 0x11, 0x6c, 0x14, 0x34, 0xc4, 0x70, 0x4a, 0x6b, 0x19, 0x9a, 0x63, 0x19, 0x9b, 0xb6, 0x19, 0x9b, + 0xca, 0x36, 0xcc, 0xb3, 0xca, 0x64, 0x9c, 0x91, 0xf6, 0xea, 0x77, 0xa1, 0xce, 0x4b, 0x8b, 0x26, + 0x54, 0x77, 0xf7, 0x76, 0x37, 0x99, 0xac, 0x6b, 0x3b, 0x3b, 0xdd, 0x12, 0xa2, 0x36, 0xd6, 0x86, + 0x6b, 0xdd, 0x32, 0xb6, 0x86, 0x3f, 0xda, 0xdf, 0xec, 0x56, 0xf4, 0x7f, 0x2c, 0x41, 0x33, 0x59, + 0x47, 0x7c, 0x0a, 0x80, 0x22, 0x3c, 0x3a, 0x76, 0xbc, 0xd4, 0xc1, 0xbb, 0x9a, 0xdf, 0x69, 0x05, + 0x5f, 0xf5, 0x33, 0xec, 0x65, 0xf3, 0x4a, 0x12, 0x4f, 0x70, 0x7f, 0x00, 0x9d, 0x62, 0xe7, 0x0c, + 0x4f, 0xf7, 0x76, 0xde, 0xaa, 0x74, 0x56, 0xdf, 0x28, 0x2c, 0x8d, 0x33, 0x89, 0xb5, 0x73, 0x06, + 0xe6, 0x0e, 0x34, 0x13, 0xb4, 0x68, 0x41, 0x63, 0x63, 0x73, 0x6b, 0xed, 0xc9, 0x0e, 0xb2, 0x0a, + 0x40, 0x7d, 0xb0, 0xbd, 0xfb, 0x70, 0x67, 0x93, 0xaf, 0xb5, 0xb3, 0x3d, 0x18, 0x76, 0xcb, 0xfa, + 0x1f, 0x96, 0xa0, 0x99, 0x78, 0x32, 0xe2, 0x03, 0x74, 0x3e, 0xc8, 0x49, 0x53, 0x96, 0x88, 0x32, + 0x53, 0xb9, 0xb0, 0xd5, 0x48, 0xfa, 0x51, 0x16, 0x49, 0xb1, 0x26, 0xbe, 0x0d, 0x01, 0xf9, 0xa8, + 0xb9, 0x52, 0x48, 0x2c, 0x09, 0xa8, 0xda, 0xbe, 0x27, 0x95, 0xc3, 0x4c, 0x6d, 0xe2, 0x41, 0xc7, + 0xb3, 0x64, 0x16, 0x4e, 0x34, 0x08, 0x1e, 0x46, 0x7a, 0xcc, 0x7e, 0x74, 0x7a, 0xb0, 0x74, 0xb7, + 0x52, 0x7e, 0xb7, 0x0b, 0x41, 0x49, 0xf9, 0x62, 0x50, 0x92, 0x19, 0xce, 0xda, 0xab, 0x0c, 0xa7, + 0xfe, 0xf3, 0x3a, 0x74, 0x0c, 0x19, 0xc5, 0x7e, 0x28, 0x95, 0x5f, 0xf8, 0x32, 0x11, 0xba, 0x06, + 0x10, 0xf2, 0xe0, 0x6c, 0x6b, 0x4d, 0x61, 0x38, 0x9a, 0x72, 0x7d, 0x8b, 0x78, 0x57, 0x59, 0xc8, + 0x14, 0x16, 0x57, 0x41, 0x3b, 0x30, 0xad, 0x13, 0x5e, 0x96, 0xed, 0x64, 0x93, 0x11, 0xbc, 0xae, + 0x69, 0x59, 0x32, 0x8a, 0x46, 0xc8, 0x0a, 0x6c, 0x2d, 0x35, 0xc6, 0x3c, 0x92, 0xe7, 0xe2, 0x1e, + 0x40, 0x24, 0xad, 0x50, 0xc6, 0xd4, 0x8d, 0x36, 0x53, 0x5b, 0x5f, 0xfc, 0xd5, 0xb3, 0xa5, 0xb9, + 0x7f, 0x7e, 0xb6, 0xa4, 0x0d, 0xa4, 0x17, 0x39, 0xb1, 0x73, 0x2a, 0x0d, 0x8d, 0x07, 0xe1, 0x8c, + 0x6f, 0x41, 0x3b, 0x92, 0x11, 0x1a, 0xdb, 0x51, 0xec, 0x9f, 0x48, 0xf6, 0xcb, 0x67, 0x4e, 0x9a, + 0x57, 0xe3, 0x86, 0x38, 0x0c, 0x15, 0x91, 0xe9, 0xf9, 0xde, 0xf9, 0xd8, 0x9f, 0x44, 0xca, 0xb2, + 0x64, 0x08, 0xb1, 0x02, 0x97, 0xa4, 0x67, 0x85, 0xe7, 0x01, 0xde, 0x08, 0xcf, 0x32, 0x3a, 0x74, + 0x5c, 0xa9, 0x1c, 0xfa, 0xc5, 0xac, 0xeb, 0x91, 0x3c, 0xdf, 0x72, 0x5c, 0x89, 0xd7, 0x3a, 0x35, + 0x27, 0x6e, 0x3c, 0xa2, 0x7c, 0x01, 0xf0, 0xb5, 0x08, 0xb3, 0x66, 0xdb, 0xa1, 0xb8, 0x05, 0x8b, + 0xdc, 0x1d, 0xfa, 0xae, 0x74, 0x6c, 0x5e, 0xac, 0x45, 0xa3, 0x16, 0xa8, 0xc3, 0x20, 0x3c, 0x2d, + 0xb5, 0x02, 0x97, 0x78, 0x2c, 0xdf, 0x31, 0x19, 0x3d, 0xcf, 0x5b, 0x53, 0xd7, 0x40, 0xf5, 0x14, + 0xb7, 0x0e, 0xcc, 0xf8, 0x98, 0xa2, 0x80, 0x64, 0xeb, 0x7d, 0x33, 0x3e, 0x46, 0xbf, 0x80, 0xbb, + 0x0f, 0x1d, 0xe9, 0x72, 0x14, 0xaf, 0x19, 0x3c, 0x63, 0x0b, 0x31, 0xe8, 0x17, 0xa8, 0x01, 0x7e, + 0x38, 0x36, 0x39, 0x0d, 0xaa, 0x19, 0x3c, 0x69, 0x8b, 0x50, 0xb8, 0x85, 0x7a, 0x51, 0x6f, 0x32, + 0xa6, 0x84, 0x68, 0xd5, 0x50, 0x6f, 0xbc, 0x3b, 0x19, 0x8b, 0x0f, 0xa0, 0xeb, 0x78, 0x56, 0x28, + 0xc7, 0xd2, 0x8b, 0x4d, 0x77, 0x74, 0x18, 0xfa, 0xe3, 0xde, 0x22, 0x0d, 0x5a, 0xc8, 0xe1, 0xb7, + 0x42, 0x7f, 0xac, 0xb2, 0x37, 0x81, 0x19, 0xc6, 0x8e, 0xe9, 0xf6, 0x44, 0x92, 0xbd, 0xd9, 0x67, + 0x84, 0x78, 0x17, 0xda, 0x38, 0x7b, 0x37, 0xb5, 0x10, 0x97, 0x68, 0x99, 0x22, 0x52, 0x7c, 0x1b, + 0xde, 0x74, 0xa2, 0x14, 0x5c, 0xfb, 0x99, 0x89, 0x1c, 0x4d, 0x9c, 0xd9, 0xbb, 0x4c, 0x2b, 0xbe, + 0xa8, 0x5b, 0x7f, 0x5e, 0x81, 0x66, 0x1a, 0xbe, 0xde, 0x06, 0x6d, 0x9c, 0xe8, 0x5f, 0xe5, 0x78, + 0xb6, 0x0b, 0x4a, 0xd9, 0xc8, 0xfa, 0xc5, 0x35, 0x28, 0x9f, 0x9c, 0x2a, 0x5b, 0xd0, 0x5e, 0xe1, + 0x02, 0x46, 0x70, 0xf0, 0xf1, 0xca, 0xa3, 0xa7, 0x46, 0xf9, 0xe4, 0xf4, 0x2b, 0xc8, 0xa1, 0x78, + 0x1f, 0x16, 0x2c, 0x57, 0x9a, 0xde, 0x28, 0xf3, 0x96, 0x88, 0xcf, 0x8d, 0x0e, 0xa1, 0xf7, 0x53, + 0x97, 0xe9, 0x26, 0xd4, 0x6c, 0xe9, 0xc6, 0x66, 0x3e, 0x8f, 0xbe, 0x17, 0x9a, 0x96, 0x2b, 0x37, + 0x10, 0x6d, 0x70, 0x2f, 0xda, 0x82, 0x34, 0x64, 0xcc, 0xd9, 0x82, 0x19, 0xe1, 0x62, 0xaa, 0x67, + 0x20, 0xaf, 0x67, 0x6e, 0xc3, 0xa2, 0x3c, 0x0b, 0xc8, 0x00, 0x8e, 0xd2, 0x0c, 0x09, 0x5b, 0xe6, + 0x6e, 0xd2, 0xf1, 0x20, 0xc9, 0x94, 0x7c, 0x88, 0x2a, 0x90, 0x49, 0x3d, 0x4f, 0x7b, 0x09, 0x95, + 0x88, 0xcd, 0xa9, 0x15, 0x23, 0x19, 0x22, 0x3e, 0x00, 0xcd, 0xb2, 0xad, 0x11, 0x53, 0xa6, 0x9d, + 0x9d, 0xed, 0xc1, 0xc6, 0x03, 0x26, 0x49, 0xd3, 0xb2, 0x2d, 0x8e, 0x12, 0x0a, 0xa1, 0x6c, 0xe7, + 0x75, 0x42, 0xd9, 0xbc, 0x91, 0xef, 0x16, 0x8c, 0xfc, 0xe7, 0xd5, 0x66, 0xa3, 0xdb, 0xd4, 0xdf, + 0x81, 0x66, 0xb2, 0x11, 0xaa, 0xee, 0x48, 0x7a, 0x2a, 0x4d, 0x41, 0xaa, 0x1b, 0xc1, 0x61, 0xa4, + 0x5b, 0x50, 0x79, 0xf4, 0x74, 0x40, 0x1a, 0x1c, 0x8d, 0x69, 0x8d, 0x7c, 0x2f, 0x6a, 0xa7, 0x5a, + 0xbd, 0x9c, 0xd3, 0xea, 0xd7, 0xd9, 0x20, 0xd2, 0x03, 0x25, 0xb9, 0xdd, 0x1c, 0x06, 0x49, 0xcc, + 0xce, 0x40, 0x95, 0xd3, 0xbe, 0x04, 0xe8, 0xff, 0x55, 0x81, 0x86, 0xf2, 0xd7, 0xd0, 0x08, 0x4e, + 0xd2, 0xb4, 0x24, 0x36, 0x8b, 0x81, 0x74, 0xea, 0xf8, 0xe5, 0x6b, 0x54, 0x95, 0x57, 0xd7, 0xa8, + 0xc4, 0xa7, 0x30, 0x1f, 0x70, 0x5f, 0xde, 0x55, 0x7c, 0x33, 0x3f, 0x47, 0xfd, 0xd2, 0xbc, 0x56, + 0x90, 0x01, 0x48, 0x4a, 0x4a, 0xd4, 0xc7, 0xe6, 0x91, 0xa2, 0x40, 0x03, 0xe1, 0xa1, 0x79, 0xf4, + 0x5a, 0x7e, 0x5f, 0x87, 0x1c, 0xc8, 0x79, 0x32, 0x20, 0xe8, 0x2b, 0xe6, 0x5f, 0xa6, 0x5d, 0x74, + 0xbf, 0xae, 0x82, 0x66, 0xf9, 0xe3, 0xb1, 0x43, 0x7d, 0x1d, 0x95, 0x86, 0x23, 0xc4, 0x30, 0xd2, + 0xff, 0xa0, 0x04, 0x0d, 0x75, 0xaf, 0x0b, 0xc6, 0x7d, 0x7d, 0x7b, 0x77, 0xcd, 0xf8, 0x51, 0xb7, + 0x84, 0xce, 0xcb, 0xf6, 0xee, 0xb0, 0x5b, 0x16, 0x1a, 0xd4, 0xb6, 0x76, 0xf6, 0xd6, 0x86, 0xdd, + 0x0a, 0x1a, 0xfc, 0xf5, 0xbd, 0xbd, 0x9d, 0x6e, 0x55, 0xcc, 0x43, 0x73, 0x63, 0x6d, 0xb8, 0x39, + 0xdc, 0x7e, 0xbc, 0xd9, 0xad, 0xe1, 0xd8, 0x87, 0x9b, 0x7b, 0xdd, 0x3a, 0x36, 0x9e, 0x6c, 0x6f, + 0x74, 0x1b, 0xd8, 0xbf, 0xbf, 0x36, 0x18, 0xfc, 0x60, 0xcf, 0xd8, 0xe8, 0x36, 0xc9, 0x69, 0x18, + 0x1a, 0xdb, 0xbb, 0x0f, 0xbb, 0x1a, 0xb6, 0xf7, 0xd6, 0x3f, 0xdf, 0x7c, 0x30, 0xec, 0x02, 0xb6, + 0x9f, 0xf2, 0xda, 0xf3, 0xfa, 0x7d, 0x68, 0xe5, 0xe8, 0x86, 0x2b, 0x19, 0x9b, 0x5b, 0xdd, 0x39, + 0xdc, 0xfe, 0xe9, 0xda, 0xce, 0x13, 0xf4, 0x37, 0x3a, 0x00, 0xd4, 0x1c, 0xed, 0xac, 0xed, 0x3e, + 0xec, 0x96, 0x95, 0xb7, 0xfa, 0x7d, 0x68, 0x3e, 0x71, 0xec, 0x75, 0xd7, 0xb7, 0x4e, 0x90, 0x95, + 0x0e, 0xcc, 0x48, 0x2a, 0xde, 0xa3, 0x36, 0xc6, 0x06, 0x24, 0xc0, 0x91, 0x7a, 0x77, 0x05, 0x21, + 0xf5, 0xbc, 0xc9, 0x78, 0x44, 0x35, 0xcd, 0x0a, 0x1b, 0x65, 0x6f, 0x32, 0x7e, 0xe2, 0xd8, 0x91, + 0x7e, 0x02, 0x8d, 0x27, 0x8e, 0xbd, 0x6f, 0x5a, 0x27, 0xa4, 0x92, 0x71, 0xe9, 0x51, 0xe4, 0x7c, + 0x21, 0x95, 0xf1, 0xd6, 0x08, 0x33, 0x70, 0xbe, 0x90, 0xe2, 0x5d, 0xa8, 0x13, 0x90, 0xa4, 0x53, + 0x48, 0xec, 0x92, 0xe3, 0x18, 0xaa, 0x8f, 0x4a, 0x8a, 0xae, 0xeb, 0x5b, 0xa3, 0x50, 0x1e, 0xf6, + 0xde, 0xe4, 0xd7, 0x20, 0x84, 0x21, 0x0f, 0xf5, 0xdf, 0x2f, 0xa5, 0x37, 0xa7, 0xca, 0xd5, 0x12, + 0x54, 0x03, 0xd3, 0x3a, 0x51, 0xbe, 0x53, 0x4b, 0x2d, 0x88, 0x87, 0x31, 0xa8, 0x43, 0xbc, 0x0f, + 0x4d, 0xc5, 0x54, 0xc9, 0xae, 0xad, 0x1c, 0xf7, 0x19, 0x69, 0x67, 0x91, 0x09, 0x2a, 0x45, 0x26, + 0xa0, 0xc8, 0x3b, 0x70, 0x9d, 0x98, 0x45, 0x08, 0x05, 0x95, 0x20, 0xfd, 0x63, 0x80, 0xac, 0x88, + 0x38, 0xbb, 0x76, 0x63, 0xba, 0x8e, 0x99, 0x44, 0xf2, 0x0c, 0xe8, 0xbb, 0xd0, 0xca, 0x95, 0x1e, + 0x91, 0xb6, 0xa6, 0xeb, 0xa2, 0x3d, 0x67, 0x3d, 0xd0, 0x34, 0x1a, 0xa6, 0xeb, 0x3e, 0x92, 0xe7, + 0x11, 0xba, 0xf1, 0x5c, 0xb5, 0x2c, 0x4f, 0x15, 0xb6, 0x68, 0xaa, 0xc1, 0x9d, 0xfa, 0x87, 0x50, + 0xdf, 0x4a, 0x82, 0x9d, 0x44, 0x30, 0x4a, 0x2f, 0x12, 0x0c, 0xfd, 0x13, 0x75, 0x66, 0xaa, 0x8d, + 0x89, 0xdb, 0xaa, 0x3a, 0x1a, 0x71, 0x2d, 0xb6, 0x94, 0xe5, 0x82, 0x78, 0x90, 0x2a, 0x8c, 0xd2, + 0x60, 0x7d, 0x03, 0x9a, 0x2f, 0xad, 0x37, 0x2b, 0x02, 0x94, 0x33, 0x02, 0xcc, 0xa8, 0x40, 0xeb, + 0x3f, 0x01, 0xc8, 0xaa, 0xa8, 0x4a, 0x4e, 0x79, 0x15, 0x94, 0xd3, 0x5b, 0xd0, 0xb4, 0x8e, 0x1d, + 0xd7, 0x0e, 0xa5, 0x57, 0xb8, 0x75, 0x56, 0x77, 0x4d, 0xfb, 0xc5, 0x0d, 0xa8, 0x52, 0x71, 0xb8, + 0x92, 0x69, 0xf1, 0xb4, 0x32, 0x4c, 0x3d, 0xfa, 0x19, 0xb4, 0x39, 0x3e, 0x7a, 0x0d, 0xef, 0xb2, + 0xa8, 0x46, 0xcb, 0x17, 0xd4, 0xe8, 0x15, 0xa8, 0x93, 0xbb, 0x92, 0xdc, 0x46, 0x41, 0x2f, 0x50, + 0xaf, 0x7f, 0x54, 0x06, 0xe0, 0xad, 0x77, 0x7d, 0x5b, 0x16, 0x13, 0x11, 0xa5, 0xe9, 0x44, 0x84, + 0x80, 0x6a, 0x5a, 0xf7, 0xd7, 0x0c, 0x6a, 0x67, 0x86, 0x51, 0x25, 0x27, 0xd8, 0x30, 0xbe, 0x0d, + 0x1a, 0x79, 0x94, 0xce, 0x17, 0x54, 0xec, 0xc1, 0x0d, 0x33, 0x44, 0xbe, 0x0a, 0x5e, 0x2b, 0x56, + 0xc1, 0xd3, 0x52, 0x5c, 0x9d, 0x57, 0xe3, 0x52, 0xdc, 0xac, 0xea, 0x26, 0x65, 0x87, 0x22, 0x19, + 0xc6, 0x49, 0x6a, 0x83, 0xa1, 0x34, 0x4a, 0xd7, 0xd4, 0x58, 0x93, 0xf3, 0x3b, 0x9e, 0x3f, 0xb2, + 0x7c, 0xef, 0xd0, 0x75, 0xac, 0x58, 0x55, 0xbd, 0xc1, 0xf3, 0x1f, 0x28, 0x0c, 0x2d, 0xe6, 0x39, + 0x3f, 0x9d, 0xb0, 0x63, 0x89, 0x8b, 0x11, 0xa4, 0x7f, 0x0a, 0xf3, 0xc9, 0xbb, 0x50, 0x51, 0xef, + 0x56, 0x1a, 0xd9, 0x96, 0xb2, 0x37, 0xcf, 0xc8, 0xb7, 0x5e, 0xee, 0x95, 0x92, 0xd8, 0x56, 0xff, + 0xbb, 0x6a, 0x32, 0x59, 0xd5, 0x9e, 0x5e, 0x4e, 0xdb, 0x62, 0xb2, 0xa2, 0xfc, 0x5a, 0xc9, 0x8a, + 0x6f, 0x83, 0x66, 0x53, 0xfc, 0xed, 0x9c, 0x26, 0x86, 0xae, 0x3f, 0x1d, 0x6b, 0xab, 0x08, 0x9d, + 0x3c, 0xff, 0x74, 0xf0, 0x2b, 0xde, 0x27, 0x7d, 0x85, 0xda, 0xac, 0x57, 0xa8, 0x7f, 0xcd, 0x57, + 0xc8, 0x88, 0xdc, 0xc9, 0x13, 0x19, 0x9d, 0x68, 0xcf, 0xf7, 0x46, 0xde, 0xc4, 0x75, 0xcd, 0x03, + 0x57, 0xaa, 0xe7, 0x69, 0x79, 0xbe, 0xb7, 0xab, 0x50, 0x18, 0x03, 0xe4, 0x87, 0xb0, 0x12, 0xe0, + 0xa7, 0x5a, 0xc8, 0x8d, 0x23, 0x55, 0xb1, 0x0c, 0x5d, 0xff, 0xe0, 0x27, 0xd2, 0x8a, 0x89, 0x92, + 0x23, 0x92, 0x7e, 0x0e, 0x00, 0x3a, 0x8c, 0x47, 0xd2, 0xa1, 0x8b, 0x3b, 0xcd, 0x16, 0xed, 0x0b, + 0x6c, 0xf1, 0x31, 0xb4, 0x88, 0x9d, 0x47, 0x51, 0x20, 0xad, 0xa8, 0xb7, 0x40, 0x6f, 0x4e, 0x8f, + 0xc2, 0x25, 0xf1, 0x6d, 0xec, 0x1c, 0x04, 0xd2, 0x32, 0xc0, 0x49, 0x9a, 0xa8, 0xb9, 0xb4, 0x94, + 0xe6, 0xb9, 0xcc, 0x81, 0x06, 0xb5, 0xed, 0xdd, 0x8d, 0xcd, 0x1f, 0x76, 0x4b, 0x68, 0xa0, 0x8d, + 0xcd, 0xa7, 0x9b, 0xc6, 0x60, 0xb3, 0x5b, 0x46, 0x83, 0xb9, 0xb1, 0xb9, 0xb3, 0x39, 0xdc, 0xec, + 0x56, 0xd8, 0xf9, 0xa2, 0x82, 0x92, 0xeb, 0x58, 0x4e, 0xac, 0xef, 0xc1, 0xc2, 0xd4, 0x4e, 0x33, + 0x15, 0xda, 0x32, 0x34, 0xfc, 0x20, 0xf1, 0xc5, 0x53, 0xbe, 0xdc, 0x23, 0xd4, 0xbe, 0xe9, 0x84, + 0x46, 0xd2, 0x8d, 0x96, 0x20, 0x43, 0xbf, 0xaa, 0x8a, 0xaf, 0x29, 0x7f, 0x4a, 0x1f, 0x00, 0x64, + 0x59, 0x19, 0x34, 0x41, 0x19, 0x65, 0x55, 0x5a, 0x38, 0x4e, 0x68, 0xba, 0x9c, 0x6a, 0x9f, 0xf2, + 0x8b, 0x72, 0x3f, 0xdc, 0xaf, 0xaf, 0x82, 0xf6, 0xd8, 0x0c, 0x3e, 0xe3, 0x0a, 0xf0, 0x4d, 0xe8, + 0x50, 0x60, 0x93, 0x84, 0x8c, 0x6c, 0x19, 0xe6, 0x8d, 0x76, 0x8a, 0x45, 0x43, 0xa3, 0xff, 0x45, + 0x09, 0x2e, 0x3f, 0xf6, 0x4f, 0x65, 0xea, 0xe8, 0xef, 0x9b, 0xe7, 0xae, 0x6f, 0xda, 0xaf, 0x90, + 0xad, 0x6b, 0x00, 0x91, 0x3f, 0xa1, 0x8a, 0x6c, 0x52, 0xbf, 0x36, 0x34, 0xc6, 0x3c, 0x54, 0x1f, + 0x00, 0xc9, 0x28, 0xa6, 0x4e, 0xe5, 0x35, 0x20, 0x8c, 0x5d, 0x6f, 0x40, 0x3d, 0x3e, 0xf3, 0xb2, + 0x6a, 0x7a, 0x2d, 0xa6, 0x72, 0xc6, 0x4c, 0xbf, 0xbf, 0x36, 0xdb, 0xef, 0xd7, 0x1f, 0x80, 0x36, + 0x3c, 0xa3, 0x84, 0xfe, 0xa4, 0xe8, 0x79, 0x97, 0x5e, 0xe2, 0xdf, 0x95, 0xa7, 0xfc, 0xbb, 0x7f, + 0x2f, 0x41, 0x2b, 0x17, 0xc0, 0x88, 0x6f, 0x40, 0x35, 0x3e, 0xf3, 0x8a, 0x1f, 0xcf, 0x24, 0x9b, + 0x18, 0xd4, 0x75, 0x21, 0x69, 0x5d, 0xbe, 0x90, 0xb4, 0x16, 0x3b, 0xb0, 0xc0, 0x66, 0x26, 0xb9, + 0x44, 0x92, 0xdb, 0x7b, 0x67, 0x2a, 0x60, 0xe2, 0xa2, 0x47, 0x72, 0x25, 0x95, 0xb0, 0xea, 0x1c, + 0x15, 0x90, 0xfd, 0x35, 0xb8, 0x34, 0x63, 0xd8, 0x57, 0x29, 0x7f, 0xe9, 0x4b, 0xd0, 0x1e, 0x9e, + 0x79, 0x43, 0x67, 0x2c, 0xa3, 0xd8, 0x1c, 0x07, 0xe4, 0x1f, 0x2b, 0x37, 0xa1, 0x6a, 0x94, 0xe3, + 0x48, 0x7f, 0x0f, 0xe6, 0xf7, 0xa5, 0x0c, 0x0d, 0x19, 0x05, 0xbe, 0xc7, 0x9e, 0xa0, 0x2a, 0x36, + 0xb0, 0x4f, 0xa2, 0x20, 0xfd, 0xf7, 0x40, 0x33, 0xcc, 0xc3, 0x78, 0xdd, 0x8c, 0xad, 0xe3, 0xaf, + 0x92, 0xbd, 0x7a, 0x0f, 0x1a, 0x01, 0xf3, 0x94, 0x0a, 0x6b, 0xe7, 0xc9, 0x37, 0x51, 0x7c, 0x66, + 0x24, 0x9d, 0xfa, 0xb7, 0xa0, 0xa3, 0x2a, 0x7f, 0xc9, 0x49, 0x72, 0xe5, 0xc1, 0xd2, 0x0b, 0xcb, + 0x83, 0xfa, 0x11, 0xb4, 0x93, 0x79, 0x6c, 0xe9, 0x5f, 0x6b, 0xda, 0x57, 0xff, 0xfe, 0x42, 0xff, + 0x5d, 0xb8, 0x34, 0x98, 0x1c, 0x44, 0x56, 0xe8, 0x90, 0xbc, 0x27, 0xdb, 0xf5, 0xa1, 0x19, 0x84, + 0xf2, 0xd0, 0x39, 0x93, 0x89, 0x88, 0xa5, 0xb0, 0xb8, 0x05, 0x8d, 0x31, 0xd2, 0x4b, 0x66, 0xc2, + 0x9b, 0x05, 0xeb, 0x8f, 0xb1, 0xc7, 0x48, 0x06, 0xe8, 0xdf, 0x81, 0xcb, 0xc5, 0xe5, 0x15, 0x15, + 0xde, 0x81, 0xca, 0xc9, 0x69, 0xa4, 0xc8, 0xbc, 0x58, 0x08, 0xf6, 0xe9, 0xc3, 0x17, 0xec, 0xd5, + 0xff, 0xa6, 0x04, 0x95, 0xdd, 0xc9, 0x38, 0xff, 0x75, 0x61, 0x95, 0xbf, 0x2e, 0xbc, 0x9a, 0x2f, + 0x4c, 0x70, 0xf0, 0x98, 0x15, 0x20, 0xde, 0x06, 0xed, 0xd0, 0x0f, 0x7f, 0x66, 0x86, 0xb6, 0xb4, + 0x95, 0xbb, 0x91, 0x21, 0x28, 0x4e, 0x98, 0x8c, 0x03, 0x65, 0xb3, 0xa8, 0x2d, 0x6e, 0x2a, 0x87, + 0x85, 0x03, 0xba, 0x45, 0xa4, 0xec, 0xee, 0x64, 0xbc, 0xe2, 0x4a, 0x33, 0x22, 0x0b, 0xca, 0x3e, + 0x8c, 0x7e, 0x1b, 0xb4, 0x14, 0x85, 0x7a, 0x7a, 0x77, 0x30, 0xda, 0xde, 0xe0, 0x64, 0x2f, 0x86, + 0x3e, 0x25, 0xd4, 0xd1, 0xc3, 0x1f, 0xee, 0x8e, 0x86, 0x83, 0x6e, 0x59, 0xff, 0x31, 0xb4, 0x12, + 0xf9, 0xd9, 0xb6, 0xa9, 0xb2, 0x49, 0x02, 0xbc, 0x6d, 0x17, 0xe4, 0x79, 0x9b, 0x62, 0x53, 0xe9, + 0xd9, 0xdb, 0x89, 0xe0, 0x31, 0x50, 0xbc, 0xa1, 0x2a, 0x93, 0x26, 0x37, 0xd4, 0x37, 0x61, 0xd1, + 0xa0, 0x0a, 0x0d, 0x7a, 0x13, 0xc9, 0x93, 0x5d, 0x81, 0xba, 0xe7, 0xdb, 0x32, 0xdd, 0x40, 0x41, + 0xb8, 0xb3, 0x7a, 0x6c, 0xa5, 0xd2, 0xd2, 0xb7, 0x97, 0xb0, 0x88, 0x5a, 0xb2, 0xc8, 0x68, 0x85, + 0xea, 0x41, 0x69, 0xaa, 0x7a, 0x80, 0x9b, 0xa8, 0x0f, 0x05, 0x58, 0xf3, 0x27, 0x1f, 0x07, 0xf4, + 0xa1, 0x69, 0x47, 0x31, 0x89, 0xb5, 0xd2, 0x8d, 0x29, 0xac, 0xdf, 0x85, 0x4b, 0x6b, 0x41, 0xe0, + 0x9e, 0x27, 0x65, 0x55, 0xb5, 0x51, 0x2f, 0xab, 0xbd, 0x96, 0x54, 0x40, 0xcc, 0xa0, 0xbe, 0x05, + 0xf3, 0x49, 0x6a, 0xe5, 0xb1, 0x8c, 0x4d, 0xd2, 0x78, 0xae, 0x53, 0xc8, 0x2d, 0x34, 0x19, 0x31, + 0x2c, 0xd6, 0x28, 0xa6, 0xee, 0xb7, 0x02, 0x75, 0xa5, 0x4e, 0x05, 0x54, 0x2d, 0xdf, 0xe6, 0x8d, + 0x6a, 0x06, 0xb5, 0x91, 0xab, 0xc6, 0xd1, 0x51, 0xe2, 0xde, 0x8f, 0xa3, 0x23, 0xfd, 0xbf, 0xcb, + 0xd0, 0x5e, 0xa7, 0x94, 0x5b, 0x72, 0xc6, 0x5c, 0x3a, 0xba, 0x54, 0x48, 0x47, 0xe7, 0x53, 0xcf, + 0xe5, 0x42, 0xea, 0xb9, 0x70, 0xa0, 0x4a, 0xd1, 0x27, 0x7f, 0x13, 0x1a, 0x13, 0xcf, 0x39, 0x4b, + 0xec, 0x84, 0x46, 0xbe, 0xcd, 0xd9, 0x30, 0x12, 0x37, 0xa0, 0x85, 0xa6, 0xc4, 0xf1, 0x38, 0xdd, + 0xcb, 0x39, 0xdb, 0x3c, 0x6a, 0x2a, 0xa9, 0x5b, 0x7f, 0x79, 0x52, 0xb7, 0xf1, 0x75, 0x92, 0xba, + 0xcd, 0xaf, 0x91, 0xd4, 0xd5, 0xa6, 0x93, 0xba, 0xc5, 0xa8, 0x03, 0x2e, 0x44, 0x1d, 0xd7, 0x00, + 0xf8, 0x9b, 0xa7, 0xc3, 0x89, 0xeb, 0x2a, 0xd7, 0x4c, 0x23, 0xcc, 0xd6, 0xc4, 0x75, 0xf5, 0x1d, + 0xe8, 0x24, 0x0f, 0xa0, 0x14, 0xc5, 0xa7, 0xb0, 0xa0, 0x8a, 0x3a, 0x32, 0x54, 0x79, 0x44, 0xd6, + 0x7f, 0x24, 0xa5, 0x5c, 0x77, 0x51, 0x3d, 0x46, 0xc7, 0xce, 0x83, 0x91, 0xfe, 0xcb, 0x12, 0xb4, + 0x0b, 0x23, 0xc4, 0xfd, 0xac, 0x44, 0x54, 0x22, 0x59, 0xef, 0x5d, 0x58, 0xe5, 0xe5, 0x65, 0xa2, + 0xf2, 0x54, 0x99, 0x48, 0xbf, 0x93, 0x16, 0x7f, 0x54, 0xc9, 0x67, 0x2e, 0x2d, 0xf9, 0x50, 0x95, + 0x64, 0x6d, 0x38, 0x34, 0xba, 0x65, 0x51, 0x87, 0xf2, 0xee, 0xa0, 0x5b, 0xd1, 0x7f, 0x53, 0x86, + 0xf6, 0xe6, 0x59, 0x40, 0xdf, 0xff, 0xbd, 0x32, 0x84, 0xcb, 0x71, 0x5f, 0xb9, 0xc0, 0x7d, 0x39, + 0x3e, 0xaa, 0xa8, 0x9a, 0x37, 0xf3, 0x11, 0x06, 0x75, 0x9c, 0x62, 0x56, 0xfc, 0xc5, 0xd0, 0xff, + 0x1f, 0xfe, 0x2a, 0x68, 0x27, 0x98, 0xae, 0x6d, 0xee, 0x40, 0x27, 0x21, 0xae, 0x62, 0x9f, 0xd7, + 0x12, 0x7c, 0xfe, 0x3e, 0xd9, 0x4d, 0xb3, 0x8d, 0x0c, 0xe8, 0x7f, 0x56, 0x06, 0x8d, 0xb9, 0x11, + 0xef, 0xf3, 0x81, 0xb2, 0x11, 0xa5, 0xac, 0x8c, 0x96, 0x76, 0xae, 0x3c, 0x92, 0xe7, 0x99, 0x9d, + 0x98, 0x59, 0x7a, 0x56, 0x39, 0x49, 0x4e, 0xc5, 0x50, 0x4e, 0xf2, 0x2a, 0x68, 0xec, 0xe2, 0x4d, + 0x54, 0x0d, 0xa7, 0x6a, 0xb0, 0xcf, 0xf7, 0xc4, 0x21, 0x2b, 0x15, 0xcb, 0x70, 0xac, 0x5e, 0x8a, + 0xda, 0xc5, 0xa0, 0xb7, 0x9d, 0x84, 0x5b, 0x05, 0x8a, 0x34, 0xa6, 0x29, 0x72, 0x0c, 0x0d, 0x75, + 0x36, 0x8c, 0x26, 0x9e, 0xec, 0x3e, 0xda, 0xdd, 0xfb, 0xc1, 0x6e, 0x81, 0x47, 0xd3, 0x78, 0xa3, + 0x9c, 0x8f, 0x37, 0x2a, 0x88, 0x7f, 0xb0, 0xf7, 0x64, 0x77, 0xd8, 0xad, 0x8a, 0x36, 0x68, 0xd4, + 0x1c, 0x19, 0x9b, 0x4f, 0xbb, 0x35, 0x4a, 0xe9, 0x3d, 0xf8, 0x6c, 0xf3, 0xf1, 0x5a, 0xb7, 0x9e, + 0x16, 0x35, 0x1b, 0xfa, 0x9f, 0x96, 0x60, 0x91, 0x09, 0x92, 0xcf, 0x68, 0xe5, 0xff, 0x39, 0x50, + 0xe5, 0x7f, 0x0e, 0xfc, 0xdf, 0x26, 0xb1, 0x70, 0xd2, 0xc4, 0x49, 0x3e, 0x23, 0xe0, 0x4c, 0x6b, + 0x73, 0xe2, 0xa8, 0xaf, 0x07, 0xfe, 0xa1, 0x04, 0x7d, 0x8e, 0x2f, 0x1e, 0x86, 0x66, 0x70, 0xfc, + 0xfd, 0x9d, 0x0b, 0xe9, 0x94, 0x17, 0x79, 0xdd, 0x37, 0xa1, 0x43, 0xff, 0xad, 0xf8, 0xa9, 0x3b, + 0x52, 0xa1, 0x3d, 0xbf, 0x6e, 0x5b, 0x61, 0x79, 0x21, 0xf1, 0x11, 0xcc, 0xf3, 0x7f, 0x30, 0xa8, + 0xf4, 0x50, 0x28, 0x81, 0x17, 0xa2, 0x9b, 0x16, 0x8f, 0xe2, 0x82, 0xfd, 0xfd, 0x74, 0x52, 0x96, + 0x79, 0xb9, 0x58, 0xe5, 0x56, 0x53, 0x86, 0x94, 0x8f, 0xb9, 0x0b, 0x57, 0x67, 0xde, 0x43, 0xb1, + 0x7d, 0x2e, 0x03, 0xce, 0xdc, 0xa6, 0xff, 0xa6, 0x04, 0xcd, 0xf5, 0x89, 0x7b, 0x42, 0x06, 0xf5, + 0x1a, 0x80, 0xb4, 0x8f, 0xa4, 0xfa, 0x33, 0x43, 0x89, 0x54, 0x88, 0x86, 0x18, 0xfe, 0x3b, 0xc3, + 0xa7, 0x00, 0x7c, 0xc7, 0xd1, 0xd8, 0x0c, 0xd4, 0x13, 0x51, 0x49, 0x3a, 0x59, 0x40, 0xdd, 0xe5, + 0xb1, 0x19, 0xa8, 0x92, 0x74, 0x94, 0xc0, 0x59, 0xa9, 0xbe, 0xf2, 0x92, 0x52, 0x7d, 0x7f, 0x17, + 0x3a, 0xc5, 0x25, 0x66, 0xc4, 0x98, 0xef, 0x15, 0x3f, 0x87, 0xba, 0x48, 0xc3, 0x5c, 0x3c, 0xf0, + 0x39, 0x2c, 0x4c, 0x55, 0x31, 0x5e, 0xa6, 0x57, 0x0b, 0x22, 0x53, 0x9e, 0x16, 0x99, 0x0f, 0x61, + 0x71, 0x68, 0x46, 0x27, 0x2a, 0x46, 0xca, 0x1c, 0x81, 0xd8, 0x8c, 0x4e, 0x46, 0x29, 0x51, 0xeb, + 0x08, 0x6e, 0xdb, 0xfa, 0x7d, 0x10, 0xf9, 0xd1, 0x8a, 0xfe, 0x18, 0xfb, 0xe2, 0xf0, 0xb1, 0x8c, + 0xcd, 0xc4, 0x63, 0x41, 0x04, 0x12, 0x6f, 0xf5, 0xef, 0x4b, 0x50, 0xc5, 0xa0, 0x42, 0xdc, 0x01, + 0xed, 0x33, 0x69, 0x86, 0xf1, 0x81, 0x34, 0x63, 0x51, 0x08, 0x20, 0xfa, 0x44, 0xb7, 0xec, 0x13, + 0x2b, 0x7d, 0xee, 0x5e, 0x49, 0xac, 0xf0, 0x07, 0xe0, 0xc9, 0x87, 0xed, 0xed, 0x24, 0x38, 0xa1, + 0xe0, 0xa5, 0x5f, 0x98, 0xaf, 0xcf, 0x2d, 0xd3, 0xf8, 0xcf, 0x7d, 0xc7, 0x7b, 0xc0, 0x9f, 0x1d, + 0x8b, 0xe9, 0x60, 0x66, 0x7a, 0x86, 0xb8, 0x03, 0xf5, 0xed, 0x08, 0xa3, 0xa6, 0x8b, 0x43, 0x89, + 0xf8, 0xf9, 0x80, 0x4a, 0x9f, 0x5b, 0xfd, 0xcb, 0x1a, 0x54, 0x7f, 0x2c, 0x43, 0x5f, 0x7c, 0x08, + 0x0d, 0xf5, 0x41, 0x9a, 0xc8, 0x7d, 0x78, 0xd6, 0xa7, 0x04, 0xc8, 0xd4, 0x97, 0x6a, 0xb4, 0x4b, + 0x97, 0xdf, 0x2f, 0xab, 0xdd, 0x89, 0xec, 0x7b, 0xb9, 0x0b, 0x87, 0xfa, 0x04, 0xba, 0x83, 0x38, + 0x94, 0xe6, 0x38, 0x37, 0xbc, 0x48, 0xaa, 0x59, 0x85, 0x40, 0xa2, 0xd7, 0x6d, 0xa8, 0x73, 0x68, + 0x3a, 0x35, 0x61, 0xba, 0xca, 0x47, 0x83, 0xdf, 0x87, 0xd6, 0xe0, 0xd8, 0x9f, 0xb8, 0xf6, 0x40, + 0x86, 0xa7, 0x52, 0xe4, 0xa2, 0xab, 0x7e, 0xae, 0xad, 0xcf, 0x89, 0xfb, 0x50, 0xc7, 0x17, 0x09, + 0xc7, 0x62, 0x31, 0x17, 0x81, 0x31, 0x9b, 0xf4, 0x45, 0x1e, 0x95, 0x50, 0x4a, 0xbc, 0x0f, 0x1a, + 0x87, 0x02, 0x18, 0x08, 0x34, 0x54, 0x74, 0xc1, 0xc7, 0xc8, 0x85, 0x08, 0xfa, 0x9c, 0x58, 0x06, + 0xc8, 0xc5, 0xb4, 0x2f, 0x1b, 0xf9, 0x11, 0xb4, 0x1f, 0x90, 0x26, 0xdc, 0x0b, 0xd7, 0x0e, 0xfc, + 0x30, 0x16, 0xd3, 0x1f, 0xc9, 0xf6, 0xa7, 0x11, 0xfa, 0x1c, 0x46, 0x87, 0xc3, 0xf0, 0x9c, 0xc7, + 0x2f, 0xaa, 0x54, 0x40, 0xb6, 0xdf, 0x0c, 0xba, 0x88, 0x8f, 0x53, 0xb9, 0x4a, 0x23, 0x80, 0x59, + 0x25, 0x43, 0x26, 0x11, 0xcb, 0x00, 0x91, 0x08, 0xb2, 0xf0, 0x44, 0xbc, 0xc1, 0xe5, 0xcb, 0xa9, + 0x70, 0xe5, 0xe2, 0x94, 0x2c, 0x14, 0xe1, 0x29, 0x17, 0x42, 0x93, 0xa9, 0x29, 0xdf, 0x84, 0xf9, + 0x7c, 0x58, 0x21, 0xa8, 0x0e, 0x37, 0x23, 0xd0, 0x28, 0x4e, 0x5b, 0xfd, 0x8f, 0x1a, 0xd4, 0x7f, + 0xe0, 0x87, 0x27, 0x32, 0x14, 0xb7, 0xa0, 0x4e, 0x85, 0x68, 0x25, 0x4b, 0x69, 0x51, 0x7a, 0x16, + 0xed, 0xde, 0x05, 0x8d, 0x38, 0x03, 0x85, 0x9d, 0xf9, 0x95, 0xfe, 0x5c, 0xc6, 0x8b, 0x73, 0xda, + 0x97, 0x98, 0xbb, 0xc3, 0xdc, 0x9a, 0x7e, 0x78, 0x52, 0x28, 0x14, 0xf7, 0xe9, 0x49, 0x1f, 0x3d, + 0x1d, 0xa0, 0x7c, 0xde, 0x2b, 0xa1, 0x4f, 0x31, 0xe0, 0xc7, 0xc3, 0x41, 0xd9, 0x9f, 0x56, 0x58, + 0xfc, 0xb3, 0x7f, 0x89, 0xe8, 0x73, 0xe2, 0x2e, 0xd4, 0x95, 0x89, 0x59, 0xcc, 0x14, 0x61, 0x72, + 0xc3, 0x6e, 0x1e, 0xa5, 0x26, 0xdc, 0x87, 0x3a, 0x9b, 0x63, 0x9e, 0x50, 0x88, 0x6b, 0x98, 0x4f, + 0x8b, 0x9e, 0xb6, 0x3e, 0x27, 0x6e, 0x43, 0x43, 0x95, 0x99, 0xc5, 0x8c, 0x9a, 0xf3, 0x85, 0x17, + 0xab, 0xb3, 0xaf, 0xc5, 0xeb, 0x17, 0x9c, 0x5a, 0x5e, 0xbf, 0xe8, 0x8a, 0xb1, 0xe8, 0x1b, 0xd2, + 0x92, 0x4e, 0x2e, 0x31, 0x27, 0x12, 0x8a, 0xcc, 0xd0, 0x5f, 0x9f, 0x40, 0xbb, 0x90, 0xc4, 0x13, + 0xbd, 0x84, 0x2d, 0xa6, 0xf3, 0x7a, 0x17, 0xb4, 0xc6, 0x77, 0x40, 0x53, 0x69, 0x87, 0x03, 0xc5, + 0x18, 0x33, 0x92, 0x1c, 0xfd, 0x8b, 0x79, 0x07, 0x52, 0x05, 0x3f, 0x84, 0x4b, 0x33, 0x6c, 0xab, + 0xa0, 0xcf, 0x9e, 0x5f, 0xec, 0x3c, 0xf4, 0x97, 0x5e, 0xd8, 0x9f, 0x12, 0xe0, 0xeb, 0x89, 0xd3, + 0x77, 0x01, 0x32, 0x13, 0xc3, 0xb2, 0x71, 0xc1, 0x40, 0xf5, 0xaf, 0x4c, 0xa3, 0x93, 0x4d, 0xd7, + 0x7b, 0xbf, 0xfa, 0xf2, 0x7a, 0xe9, 0xd7, 0x5f, 0x5e, 0x2f, 0xfd, 0xdb, 0x97, 0xd7, 0x4b, 0xbf, + 0xfc, 0xed, 0xf5, 0xb9, 0x5f, 0xff, 0xf6, 0xfa, 0xdc, 0x3f, 0xfd, 0xf6, 0xfa, 0xdc, 0x41, 0x9d, + 0xfe, 0xe5, 0xf9, 0xd1, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0xb9, 0x62, 0x5c, 0xb3, 0x5b, 0x3a, + 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -7874,6 +8013,23 @@ func (m *Result) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.VectorMetrics) > 0 { + for k := range m.VectorMetrics { + v := m.VectorMetrics[k] + baseI := i + i = encodeVarintPb(dAtA, i, uint64(v)) + i-- + dAtA[i] = 0x10 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintPb(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintPb(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x42 + } + } if m.List { i-- if m.List { @@ -10407,6 +10563,20 @@ func (m *SchemaUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.IndexSpecs) > 0 { + for iNdEx := len(m.IndexSpecs) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.IndexSpecs[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintPb(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x7a + } + } if m.Unique { i-- if m.Unique { @@ -10523,6 +10693,87 @@ func (m *SchemaUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *VectorIndexSpec) 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 *VectorIndexSpec) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *VectorIndexSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Options) > 0 { + for iNdEx := len(m.Options) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Options[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintPb(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintPb(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *OptionPair) 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 *OptionPair) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *OptionPair) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Value) > 0 { + i -= len(m.Value) + copy(dAtA[i:], m.Value) + i = encodeVarintPb(dAtA, i, uint64(len(m.Value))) + i-- + dAtA[i] = 0x12 + } + if len(m.Key) > 0 { + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintPb(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *TypeUpdate) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -12186,6 +12437,14 @@ func (m *Result) Size() (n int) { if m.List { n += 2 } + if len(m.VectorMetrics) > 0 { + for k, v := range m.VectorMetrics { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovPb(uint64(len(k))) + 1 + sovPb(uint64(v)) + n += mapEntrySize + 1 + sovPb(uint64(mapEntrySize)) + } + } return n } @@ -13314,21 +13573,27 @@ func (m *SchemaUpdate) Size() (n int) { if m.Unique { n += 2 } + if len(m.IndexSpecs) > 0 { + for _, e := range m.IndexSpecs { + l = e.Size() + n += 1 + l + sovPb(uint64(l)) + } + } return n } -func (m *TypeUpdate) Size() (n int) { +func (m *VectorIndexSpec) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.TypeName) + l = len(m.Name) if l > 0 { n += 1 + l + sovPb(uint64(l)) } - if len(m.Fields) > 0 { - for _, e := range m.Fields { + if len(m.Options) > 0 { + for _, e := range m.Options { l = e.Size() n += 1 + l + sovPb(uint64(l)) } @@ -13336,16 +13601,52 @@ func (m *TypeUpdate) Size() (n int) { return n } -func (m *MapHeader) Size() (n int) { +func (m *OptionPair) Size() (n int) { if m == nil { return 0 } var l int _ = l - if len(m.PartitionKeys) > 0 { - for _, b := range m.PartitionKeys { - l = len(b) - n += 1 + l + sovPb(uint64(l)) + l = len(m.Key) + if l > 0 { + n += 1 + l + sovPb(uint64(l)) + } + l = len(m.Value) + if l > 0 { + n += 1 + l + sovPb(uint64(l)) + } + return n +} + +func (m *TypeUpdate) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.TypeName) + if l > 0 { + n += 1 + l + sovPb(uint64(l)) + } + if len(m.Fields) > 0 { + for _, e := range m.Fields { + l = e.Size() + n += 1 + l + sovPb(uint64(l)) + } + } + return n +} + +func (m *MapHeader) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.PartitionKeys) > 0 { + for _, b := range m.PartitionKeys { + l = len(b) + n += 1 + l + sovPb(uint64(l)) } } return n @@ -15170,6 +15471,119 @@ func (m *Result) Unmarshal(dAtA []byte) error { } } m.List = bool(v != 0) + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field VectorMetrics", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPb + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthPb + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.VectorMetrics == nil { + m.VectorMetrics = make(map[string]uint64) + } + var mapkey string + var mapvalue uint64 + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthPb + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthPb + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapvalue |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + } else { + iNdEx = entryPreIndex + skippy, err := skipPb(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthPb + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.VectorMetrics[mapkey] = mapvalue + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipPb(dAtA[iNdEx:]) @@ -22708,6 +23122,270 @@ func (m *SchemaUpdate) Unmarshal(dAtA []byte) error { } } m.Unique = bool(v != 0) + case 15: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IndexSpecs", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPb + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthPb + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.IndexSpecs = append(m.IndexSpecs, &VectorIndexSpec{}) + if err := m.IndexSpecs[len(m.IndexSpecs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipPb(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthPb + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *VectorIndexSpec) 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 ErrIntOverflowPb + } + 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: VectorIndexSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: VectorIndexSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + 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 ErrInvalidLengthPb + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthPb + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Options", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPb + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthPb + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Options = append(m.Options, &OptionPair{}) + if err := m.Options[len(m.Options)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipPb(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthPb + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *OptionPair) 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 ErrIntOverflowPb + } + 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: OptionPair: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: OptionPair: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + 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 ErrInvalidLengthPb + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthPb + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + 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 ErrInvalidLengthPb + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthPb + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipPb(dAtA[iNdEx:]) diff --git a/query/aggregator.go b/query/aggregator.go index 5c7bd72f190..6c2065f591a 100644 --- a/query/aggregator.go +++ b/query/aggregator.go @@ -50,7 +50,8 @@ func isTernary(f string) bool { func isBinary(f string) bool { return f == "+" || f == "*" || f == "-" || f == "/" || f == "%" || - f == "max" || f == "min" || f == "logbase" || f == "pow" + f == "max" || f == "min" || f == "logbase" || f == "pow" || + f == "dot" } func convertTo(from *pb.TaskValue) (types.Val, error) { @@ -128,6 +129,24 @@ func applyAdd(a, b, c *types.Val) error { case FLOAT: c.Value = a.Value.(float64) + b.Value.(float64) + case VFLOAT: + // When adding vectors of floats, we add then item-wise + // so that c.Value[i] = a.Value[i] + b.Value[i] for all i + // in range. If lengths of a and b are different, we treat + // this as an error. + aVal := a.Value.([]float32) + bVal, ok := b.Value.([]float32) + if !ok { + return ErrorArgsDisagree + } + if len(aVal) != len(bVal) { + return ErrorVectorsNotMatch + } + cVal := make([]float32, len(aVal)) + for i := 0; i < len(aVal); i++ { + cVal[i] = aVal[i] + bVal[i] + } + c.Value = cVal case DEFAULT: return errors.Errorf("Wrong type %v encountered for func +", a.Tid) @@ -150,6 +169,24 @@ func applySub(a, b, c *types.Val) error { case FLOAT: c.Value = a.Value.(float64) - b.Value.(float64) + case VFLOAT: + // When subtracting vectors of floats, we add then item-wise + // so that c.Value[i] = a.Value[i] - b.Value[i] for all i + // in range. If lengths of a and b are different, we treat + // this as an error. + aVal := a.Value.([]float32) + bVal, ok := b.Value.([]float32) + if !ok { + return ErrorArgsDisagree + } + if len(aVal) != len(bVal) { + return ErrorVectorsNotMatch + } + cVal := make([]float32, len(aVal)) + for i := 0; i < len(aVal); i++ { + cVal[i] = aVal[i] - bVal[i] + } + c.Value = cVal case DEFAULT: return errors.Errorf("Wrong type %v encountered for func -", a.Tid) @@ -158,10 +195,21 @@ func applySub(a, b, c *types.Val) error { } func applyMul(a, b, c *types.Val) error { - vBase := getValType(a) - switch vBase { + // Possible input combinations: + // INT * INT + // FLOAT * FLOAT + // FLOAT * VFLOAT + // VFLOAT * FLOAT + // Other combinations should have been eliminated via matchType. + // Some operations, such as INT * FLOAT might be allowed conceptually, + // but we would have already cast the INT value to a FLOAT in the + // matchType invocation. + lValType := getValType(a) + rValType := getValType(b) + switch lValType { case INT: aVal, bVal := a.Value.(int64), b.Value.(int64) + c.Tid = types.IntID c.Value = aVal * bVal if aVal == 0 || bVal == 0 { @@ -171,31 +219,87 @@ func applyMul(a, b, c *types.Val) error { } case FLOAT: - c.Value = a.Value.(float64) * b.Value.(float64) + aVal := a.Value.(float64) + switch rValType { + case FLOAT: + c.Tid = types.FloatID + c.Value = aVal * b.Value.(float64) + case VFLOAT: + bVal := b.Value.([]float32) + cVal := make([]float32, len(bVal)) + for i := 0; i < len(bVal); i++ { + cVal[i] = float32(aVal) * bVal[i] + } + c.Value = cVal + c.Tid = types.VFloatID + default: + return invalidTypeError(lValType, rValType, "*") + } + + case VFLOAT: + aVal := a.Value.([]float32) + if rValType != FLOAT { + return invalidTypeError(lValType, rValType, "*") + } + bVal := b.Value.(float64) + + cVal := make([]float32, len(aVal)) + c.Value = cVal + // If you convert from float64 to float32, sometimes we can get inf. + if math.IsInf(float64(float32(bVal)), 0) { + return ErrorFloat32Overflow + } + for i := 0; i < len(aVal); i++ { + cVal[i] = aVal[i] * float32(bVal) + } + c.Tid = types.VFloatID case DEFAULT: - return errors.Errorf("Wrong type %v encountered for func *", a.Tid) + return invalidTypeError(lValType, rValType, "*") } return nil } func applyDiv(a, b, c *types.Val) error { - vBase := getValType(a) - switch vBase { + // Possible types (after having been filtered by matchType): + // INT / INT + // FLOAT / FLOAT + // VFLOAT / FLOAT + // We assume that this filtering has already occurred. + numeratorType := getValType(a) + switch numeratorType { case INT: - if b.Value.(int64) == 0 { + denom := b.Value.(int64) + if denom == 0 { return ErrorDivisionByZero } - c.Value = a.Value.(int64) / b.Value.(int64) - + c.Value = a.Value.(int64) / denom + c.Tid = types.IntID case FLOAT: - if b.Value.(float64) == 0 { + denom := b.Value.(float64) + if denom == 0 { return ErrorDivisionByZero } - c.Value = a.Value.(float64) / b.Value.(float64) - + c.Value = a.Value.(float64) / denom + c.Tid = types.FloatID + case VFLOAT: + denom := b.Value.(float64) + if denom == 0 { + return ErrorDivisionByZero + } + // If you convert from float64 to float32, sometimes we can get inf. + if math.IsInf(float64(float32(denom)), 0) { + return ErrorFloat32Overflow + } + aVal := a.Value.([]float32) + cVal := make([]float32, len(aVal)) + for i := 0; i < len(aVal); i++ { + cVal[i] = aVal[i] / float32(denom) + } + c.Value = cVal + c.Tid = types.VFloatID case DEFAULT: - return errors.Errorf("Wrong type %v encountered for func /", a.Tid) + return invalidTypeError(numeratorType, getValType(b), "/") } return nil } @@ -294,6 +398,24 @@ func applyMax(a, b, c *types.Val) error { return nil } +func applyDot(a, b, c *types.Val) error { + if getValType(a) != VFLOAT || getValType(b) != VFLOAT { + return invalidTypeError(getValType(a), getValType(b), "dot") + } + aVal := a.Value.([]float32) + bVal := b.Value.([]float32) + if len(aVal) != len(bVal) { + return ErrorVectorsNotMatch + } + c.Tid = types.FloatID + var cVal float64 + for i := 0; i < len(aVal); i++ { + cVal += (float64)(aVal[i]) * (float64)(bVal[i]) + } + c.Value = cVal + return nil +} + func applyLn(a, res *types.Val) error { vBase := getValType(a) switch vBase { @@ -341,9 +463,19 @@ func applyNeg(a, res *types.Val) error { return ErrorIntOverflow } res.Value = -a.Value.(int64) + res.Tid = types.IntID case FLOAT: res.Value = -a.Value.(float64) + res.Tid = types.FloatID + case VFLOAT: + aVal := a.Value.([]float32) + resVal := make([]float32, len(aVal)) + for i, v := range aVal { + resVal[i] = -v + } + res.Value = resVal + res.Tid = types.VFloatID case DEFAULT: return errors.Errorf("Wrong type %v encountered for func u-", a.Tid) @@ -436,6 +568,24 @@ var binaryFunctions = map[string]binaryFunc{ "logbase": applyLog, "min": applyMin, "max": applyMax, + "dot": applyDot, +} + +// mixedScalarVectOps enumerates the binary functions that allow for +// one argument to be a vector and the other a scalar. +// In fact, if one of the arguments is a vector then the other *must* be +// a scalar! +var mixedScalarVectOps = map[string]struct{}{ + "*": {}, + "/": {}, +} + +var opsAllowingVectorsOnRight = map[string]struct{}{ + "u-": {}, + "+": {}, + "-": {}, + "*": {}, + "dot": {}, } type valType int @@ -443,6 +593,7 @@ type valType int const ( INT valType = iota FLOAT + VFLOAT DEFAULT ) @@ -453,38 +604,101 @@ func getValType(v *types.Val) valType { vBase = INT case types.FloatID: vBase = FLOAT + case types.VFloatID: + vBase = VFLOAT default: vBase = DEFAULT } return vBase } -func (ag *aggregator) matchType(v, va *types.Val) error { - vBase := getValType(v) - vaBase := getValType(va) - if vBase == vaBase { - return nil +func invalidTypeError(left, right valType, funcName string) error { + return errors.Errorf("invalid types %v, %v for func %s", left, right, funcName) +} + +// matchType(left, right) will make sure that the left and right type +// arguments agree, and otherwise convert left/right to an appropriate +// type in some cases where it can. +// matchType is invoked right before evaluating either a unary or binary +// function indicated by ag.name. If evaluating a unary function, then +// right is actually the single argument type, and left is actually the +// resulting type. For invoking a binary function then left and right +// of course play the role of being the left/right types (as expected). +func (ag *aggregator) matchType(left, right *types.Val) error { + leftType := getValType(left) + rightType := getValType(right) + + if rightType == VFLOAT { + if _, ok := opsAllowingVectorsOnRight[ag.name]; !ok { + return invalidTypeError(leftType, rightType, ag.name) + } } - if vBase == DEFAULT || vaBase == DEFAULT { - return errors.Errorf("Wrong types %v, %v encontered for func %s", v.Tid, - va.Tid, ag.name) + if leftType == rightType { + if leftType == VFLOAT { + if _, found := mixedScalarVectOps[ag.name]; found { + return invalidTypeError(leftType, rightType, ag.name) + } + } + return nil } - // One of them is int and one is float - if vBase == INT { - v.Tid = types.FloatID - v.Value = float64(v.Value.(int64)) + if leftType == DEFAULT || rightType == DEFAULT { + return invalidTypeError(leftType, rightType, ag.name) } - if vaBase == INT { - va.Tid = types.FloatID - va.Value = float64(va.Value.(int64)) + // We can assume at this point that left and right do not match and + // are either INT, FLOAT, or VFLOAT. + switch leftType { + case INT: + if rightType == VFLOAT { + if _, found := mixedScalarVectOps[ag.name]; !found { + return invalidTypeError(leftType, rightType, ag.name) + } + } + // rightType must be either FLOAT or VFLOAT. In either case, we + // must cast the left type to a FLOAT. + left.Tid = types.FloatID + left.Value = float64(left.Value.(int64)) + case FLOAT: + if rightType == VFLOAT { + if _, found := mixedScalarVectOps[ag.name]; !found { + return invalidTypeError(leftType, rightType, ag.name) + } + } else { + // We can assume here: rightType == INT + right.Tid = types.FloatID + right.Value = float64(right.Value.(int64)) + } + case VFLOAT: + if rightType == INT { + right.Tid = types.FloatID + right.Value = float64(right.Value.(int64)) + } + // We can assume that if rightType is not INT then it must + // be FLOAT, in which case, there is no further step needed. + default: + // This should be unreachable. + return invalidTypeError(leftType, rightType, ag.name) } return nil } +// ag.ApplyVal(v) evaluates the function indicated by +// ag.name and places result of evaluation into ag.result. +// If ag.name indicates a single argument function then +// this evaluation is tantamount to: +// +// ag.result = unaryFunc(v) +// +// If however, ag.name indicates a binary function, then this +// evaluates to: +// +// ag.result = binaryFunc(ag.result, v) +// +// In other words, for the binary result will replace the prior +// value of ag.result. func (ag *aggregator) ApplyVal(v types.Val) error { if v.Value == nil { // If the value is missing, treat it as 0. @@ -508,14 +722,14 @@ func (ag *aggregator) ApplyVal(v types.Val) error { return nil } - va := ag.result - if err := ag.matchType(&v, &va); err != nil { + left := ag.result + if err := ag.matchType(&left, &v); err != nil { return err } if function, ok := binaryFunctions[ag.name]; ok { - res.Tid = va.Tid - err := function(&va, &v, &res) + res.Tid = left.Tid + err := function(&left, &v, &res) if err != nil { return err } @@ -527,11 +741,19 @@ func (ag *aggregator) ApplyVal(v types.Val) error { return nil } -func (ag *aggregator) Apply(val types.Val) { +func (ag *aggregator) Apply(val types.Val) error { if ag.result.Value == nil { - ag.result = val + if val.Tid == types.VFloatID { + // Copy array if it's VFloat, otherwise we overwrite value. + va := val.Value.([]float32) + res := make([]float32, len(va)) + copy(res, va) + ag.result = types.Val{Tid: types.VFloatID, Value: res} + } else { + ag.result = val + } ag.count++ - return + return nil } va := ag.result @@ -558,6 +780,15 @@ func (ag *aggregator) Apply(val types.Val) { va.Value = va.Value.(int64) + vb.Value.(int64) case va.Tid == types.FloatID && vb.Tid == types.FloatID: va.Value = va.Value.(float64) + vb.Value.(float64) + case va.Tid == types.VFloatID && vb.Tid == types.VFloatID: + accumVal := va.Value.([]float32) + bVal := vb.Value.([]float32) + if len(bVal) != len(accumVal) { + return ErrorVectorsNotMatch + } + for i := 0; i < len(bVal); i++ { + accumVal[i] += bVal[i] + } } // Skipping the else case since that means the pair cannot be summed. res = va @@ -566,6 +797,7 @@ func (ag *aggregator) Apply(val types.Val) { } ag.count++ ag.result = res + return nil } func (ag *aggregator) ValueMarshalled() (*pb.TaskValue, error) { @@ -594,6 +826,14 @@ func (ag *aggregator) divideByCount() { v = float64(ag.result.Value.(int64)) case types.FloatID: v = ag.result.Value.(float64) + case types.VFloatID: + arr := ag.result.Value.([]float32) + res := make([]float32, len(arr)) + for i := 0; i < len(arr); i++ { + res[i] = arr[i] / float32(ag.count) + } + ag.result.Value = res + return } ag.result.Tid = types.FloatID diff --git a/query/common_test.go b/query/common_test.go index 78c6ce64ea5..a20ea9bcf8f 100644 --- a/query/common_test.go +++ b/query/common_test.go @@ -344,6 +344,7 @@ tweet-c : string @index(fulltext) . tweet-d : string @index(trigram) . name2 : string @index(term) . age2 : int @index(int) . +vectorNonIndex : float32vector . ` func populateCluster() { @@ -356,6 +357,8 @@ func populateCluster() { setSchema(testSchema) err := addTriplesToCluster(` + <1> "[1.0, 1.0, 2.0, 2.0]" . + <2> "[2.0, 1.0, 2.0, 2.0]" . <1> "Michonne" . <2> "King Lear" . <3> "Margaret" . diff --git a/query/math.go b/query/math.go index a8f8fd344b7..ae4f06c0902 100644 --- a/query/math.go +++ b/query/math.go @@ -33,14 +33,19 @@ type mathTree struct { var ( ErrorIntOverflow = errors.New("Integer overflow") + ErrorFloat32Overflow = errors.New("Float32 overflow") ErrorDivisionByZero = errors.New("Division by zero") ErrorFractionalPower = errors.New("Fractional power of negative number") ErrorNegativeLog = errors.New("Log of negative number") ErrorNegativeRoot = errors.New("Root of negative number") + ErrorVectorsNotMatch = errors.New("The length of vectors must match") + ErrorArgsDisagree = errors.New("Left and right arguments must match") + ErrorShouldBeVector = errors.New("Type should be []float, but is not. Cannot determine type.") + ErrorBadVectorMult = errors.New("Cannot multiply vector by vector") ) // processBinary handles the binary operands like -// +, -, *, /, %, max, min, logbase +// +, -, *, /, %, max, min, logbase, dot func processBinary(mNode *mathTree) error { destMap := make(map[uint64]types.Val) aggName := mNode.Fn @@ -98,7 +103,7 @@ func processBinary(mNode *mathTree) error { } if cl.Value != nil && cr.Value != nil { - // Both maps are nil, so 2 constatns. + // Both maps are nil, so 2 constants. ag := aggregator{ name: aggName, } diff --git a/query/math_test.go b/query/math_test.go index 469b8b4e958..ae57c9792ef 100644 --- a/query/math_test.go +++ b/query/math_test.go @@ -20,6 +20,7 @@ import ( "math" "testing" + "github.com/pkg/errors" "github.com/stretchr/testify/require" "github.com/dgraph-io/dgraph/types" @@ -222,6 +223,118 @@ func TestProcessBinary(t *testing.T) { }}, out: types.Val{Tid: types.FloatID, Value: 8.0}, }, + {in: &mathTree{ + Fn: "+", + Child: []*mathTree{ + {Const: types.Val{ + Tid: types.VFloatID, + Value: []float32{0.0005, 0.25001, 0.7500001}}}, + {Const: types.Val{ + Tid: types.VFloatID, + Value: []float32{0.0005, 0.25001, 0.7500001}}}, + }}, + out: types.Val{ + Tid: types.VFloatID, + Value: []float32{0.001, 0.50002, 1.5000002}}, + }, + {in: &mathTree{ + Fn: "+", + Child: []*mathTree{ + {Const: types.Val{ + Tid: types.VFloatID, + Value: []float32{0.5, 0.25, 0.75}}}, + {Const: types.Val{ + Tid: types.VFloatID, + Value: []float32{0.5, 0.75, 0.25}}}, + }}, + out: types.Val{ + Tid: types.VFloatID, + Value: []float32{1.0, 1.0, 1.0}}, + }, + {in: &mathTree{ + Fn: "-", + Child: []*mathTree{ + {Const: types.Val{ + Tid: types.VFloatID, + Value: []float32{1.0, 1.0, 1.0}}}, + {Const: types.Val{ + Tid: types.VFloatID, + Value: []float32{0.5, 0.25, 0.75}}}, + }}, + out: types.Val{ + Tid: types.VFloatID, + Value: []float32{0.5, 0.75, 0.25}}, + }, + {in: &mathTree{ + Fn: "*", + Child: []*mathTree{ + {Const: types.Val{ + Tid: types.FloatID, + Value: float64(2)}}, + {Const: types.Val{ + Tid: types.VFloatID, + Value: []float32{0.25, 0.5, 0.75}}}, + }}, + out: types.Val{ + Tid: types.VFloatID, + Value: []float32{0.5, 1.0, 1.5}}, + }, + {in: &mathTree{ + Fn: "*", + Child: []*mathTree{ + {Const: types.Val{ + Tid: types.IntID, + Value: int64(2)}}, + {Const: types.Val{ + Tid: types.VFloatID, + Value: []float32{0.25, 0.5, 0.75}}}, + }}, + out: types.Val{ + Tid: types.VFloatID, + Value: []float32{0.5, 1.0, 1.5}}, + }, + {in: &mathTree{ + Fn: "*", + Child: []*mathTree{ + {Const: types.Val{ + Tid: types.VFloatID, + Value: []float32{0.25, 0.5, 0.75}}}, + {Const: types.Val{ + Tid: types.IntID, + Value: int64(2)}}, + }}, + out: types.Val{ + Tid: types.VFloatID, + Value: []float32{0.5, 1.0, 1.5}}, + }, + {in: &mathTree{ + Fn: "/", + Child: []*mathTree{ + {Const: types.Val{ + Tid: types.VFloatID, + Value: []float32{0.5, 1.0, 1.5}}}, + {Const: types.Val{ + Tid: types.FloatID, + Value: float64(2)}}, + }}, + out: types.Val{ + Tid: types.VFloatID, + Value: []float32{0.25, 0.5, 0.75}}, + }, + {in: &mathTree{ + Fn: "dot", + Child: []*mathTree{ + {Const: types.Val{ + Tid: types.VFloatID, + Value: []float32{1.0, 2.0, 3.0}}}, + {Const: types.Val{ + Tid: types.VFloatID, + Value: []float32{1.0, 2.0, 3.0}}}, + }}, + out: types.Val{ + Tid: types.FloatID, + Value: float64(14.0)}, + }, } for _, tc := range tests { t.Logf("Test: %s", tc.in.Fn) @@ -270,6 +383,84 @@ func TestProcessBinary(t *testing.T) { err: ErrorIntOverflow, name: "Subtraction integer underflow", }, + {in: &mathTree{ + Fn: "*", + Child: []*mathTree{ + {Const: types.Val{ + Tid: types.VFloatID, + Value: []float32{0.5, 0.25, 0.75}}}, + {Const: types.Val{ + Tid: types.FloatID, + Value: float64(1.243e40)}}, + }}, + err: ErrorFloat32Overflow, + name: "Float overflow Mul", + }, + {in: &mathTree{ + Fn: "/", + Child: []*mathTree{ + {Const: types.Val{ + Tid: types.VFloatID, + Value: []float32{0.5, 0.25, 0.75}}}, + {Const: types.Val{ + Tid: types.FloatID, + Value: float64(1.243e40)}}, + }}, + err: ErrorFloat32Overflow, + name: "Float overflow", + }, + {in: &mathTree{ + Fn: "/", + Child: []*mathTree{ + {Const: types.Val{ + Tid: types.VFloatID, + Value: []float32{0.5, 0.25, 0.75}}}, + {Const: types.Val{ + Tid: types.VFloatID, + Value: []float32{0.5, 0.25, 0.75}}}, + }}, + err: errors.New("invalid types 2, 2 for func /"), + name: "Invalid type in matchType", + }, + {in: &mathTree{ + Fn: "dot", + Child: []*mathTree{ + {Const: types.Val{ + Tid: types.VFloatID, + Value: []float32{0.5, 0.25, 0.75}}}, + {Const: types.Val{ + Tid: types.VFloatID, + Value: []float32{0.5, 0.25, 0.75, 0.1}}}, + }}, + err: ErrorVectorsNotMatch, + name: "Vectors length not match", + }, + {in: &mathTree{ + Fn: "/", + Child: []*mathTree{ + {Const: types.Val{ + Tid: types.VFloatID, + Value: []float32{0.5, 0.25, 0.75}}}, + {Const: types.Val{ + Tid: types.IntID, + Value: int64(0)}}, + }}, + err: ErrorDivisionByZero, + name: "Vector division by 0", + }, + {in: &mathTree{ + Fn: "+", + Child: []*mathTree{ + {Const: types.Val{ + Tid: types.VFloatID, + Value: []float32{0.5, 0.25, 0.75}}}, + {Const: types.Val{ + Tid: types.IntID, + Value: int64(3)}}, + }}, + err: ErrorArgsDisagree, + name: "Left and right arguments must match", + }, {in: &mathTree{ Fn: "*", Child: []*mathTree{ @@ -425,6 +616,17 @@ func TestProcessUnary(t *testing.T) { }}, out: types.Val{Tid: types.FloatID, Value: 3.0}, }, + {in: &mathTree{ + Fn: "u-", + Child: []*mathTree{ + {Const: types.Val{ + Tid: types.VFloatID, + Value: []float32{1.25, 2.5, 3.25}}}, + }}, + out: types.Val{ + Tid: types.VFloatID, + Value: []float32{-1.25, -2.5, -3.25}}, + }, } for _, tc := range tests { t.Logf("Test %s", tc.in.Fn) diff --git a/query/outputnode.go b/query/outputnode.go index 9b06bf36061..d97aafc2674 100644 --- a/query/outputnode.go +++ b/query/outputnode.go @@ -481,6 +481,18 @@ func (enc *encoder) AddValue(fj fastJsonNode, attr uint16, v types.Val) error { } func (enc *encoder) AddListValue(fj fastJsonNode, attr uint16, v types.Val, list bool) error { + if v.Tid == types.VFloatID { + for _, f := range v.Value.([]float32) { + bs := []byte(strconv.FormatFloat(float64(f), 'E', -1, 32)) + sn, err := enc.makeScalarNode(attr, bs, true) + if err != nil { + return err + } + + enc.addChildren(fj, sn) + } + return nil + } bs, err := valToBytes(v) if err != nil { return nil // Ignore this. @@ -683,6 +695,8 @@ func valToBytes(v types.Val) ([]byte, error) { return []byte(fmt.Sprintf("\"%#x\"", v.Value)), nil case types.PasswordID: return []byte(fmt.Sprintf("%q", v.Value.(string))), nil + case types.VFloatID: + return json.Marshal(v.Value.([]float32)) default: return nil, errors.New("Unsupported types.Val.Tid") } diff --git a/query/query.go b/query/query.go index 9ea5c015efa..b0efa7f0eed 100644 --- a/query/query.go +++ b/query/query.go @@ -1034,7 +1034,10 @@ func evalLevelAgg( name: sg.SrcFunc.Name, } for _, val := range vals { - ag.Apply(val) + err := ag.Apply(val) + if err != nil { + return nil, err + } } v, err := ag.Value() if err != nil && err != ErrEmptyVal { diff --git a/query/query0_test.go b/query/query0_test.go index d5b4b610684..80739311d7f 100644 --- a/query/query0_test.go +++ b/query/query0_test.go @@ -31,6 +31,42 @@ import ( "github.com/dgraph-io/dgraph/dql" ) +func TestGetVector(t *testing.T) { + query := ` + { + me(func: has(vectorNonIndex)) { + a as vectorNonIndex + } + aggregation() { + avg(val(a)) + sum(val(a)) + } + } + ` + js := processQueryNoErr(t, query) + k := `{ + "data": { + "me": [ + { + "vectorNonIndex": [1,1,2,2] + }, + { + "vectorNonIndex": [2,1,2,2] + } + ], + "aggregation": [ + { + "avg(val(a))": [1.5,1,2,2] + }, + { + "sum(val(a))": [3,2,4,4] + } + ] + } +}` + require.JSONEq(t, k, js) +} + func TestGetUID(t *testing.T) { query := ` { diff --git a/schema/parse_test.go b/schema/parse_test.go index a6a6e5cf46f..4aaab7edede 100644 --- a/schema/parse_test.go +++ b/schema/parse_test.go @@ -35,11 +35,14 @@ type nameType struct { } func checkSchema(t *testing.T, h map[string]*pb.SchemaUpdate, expected []nameType) { + if len(h) != len(expected) { + t.Errorf("In checkSchema, expected len(h) == len(expected)") + } require.Len(t, h, len(expected)) for _, nt := range expected { typ, found := h[nt.name] require.True(t, found, nt) - require.EqualValues(t, *nt.typ, *typ) + require.EqualValuesf(t, *nt.typ, *typ, "found in map: %+v\n expected: %+v", *typ, *nt.typ) } } @@ -49,6 +52,7 @@ age:int . name: string . address: string . : string . +coordinates: float32vector . ` func TestSchema(t *testing.T) { @@ -70,12 +74,20 @@ func TestSchema(t *testing.T) { Predicate: x.GalaxyAttr("age"), ValueType: pb.Posting_INT, }}, + {x.GalaxyAttr("coordinates"), &pb.SchemaUpdate{ + Predicate: x.GalaxyAttr("coordinates"), + ValueType: pb.Posting_VFLOAT, + }}, }) typ, err := State().TypeOf(x.GalaxyAttr("age")) require.NoError(t, err) require.Equal(t, types.IntID, typ) + typ, err = State().TypeOf(x.GalaxyAttr("coordinates")) + require.NoError(t, err) + require.Equal(t, types.VFloatID, typ) + _, err = State().TypeOf(x.GalaxyAttr("agea")) require.Error(t, err) } diff --git a/tlstest/certrequireandverify/certrequireandverify_test.go b/tlstest/certrequireandverify/certrequireandverify_test.go index e1d7ff8f24b..3ed75ea2356 100644 --- a/tlstest/certrequireandverify/certrequireandverify_test.go +++ b/tlstest/certrequireandverify/certrequireandverify_test.go @@ -58,7 +58,7 @@ func TestCurlAccessWithoutClientCert(t *testing.T) { } testutil.VerifyCurlCmd(t, curlArgs, &testutil.CurlFailureConfig{ ShouldFail: true, - CurlErrMsg: "alert bad certificate", + CurlErrMsg: "alert", }) } @@ -137,5 +137,5 @@ func TestGQLAdminHealthWithoutClientCert(t *testing.T) { req.Header.Set("Content-Type", "application/json") _, err = client.Do(req) - require.Contains(t, err.Error(), "remote error: tls: bad certificate") + require.Contains(t, err.Error(), "remote error: tls") } diff --git a/types/conversion.go b/types/conversion.go index 7fa038280b3..f4b2826e14a 100644 --- a/types/conversion.go +++ b/types/conversion.go @@ -22,6 +22,7 @@ import ( "encoding/json" "math" "strconv" + "strings" "time" "unsafe" @@ -33,6 +34,74 @@ import ( "github.com/dgraph-io/dgo/v230/protos/api" ) +// parseVFloat(s) will generate a slice of float64 values, +// as long as s is either an empty string, or if it is formatted +// according to the following ebnf: +// +// floatArray ::= "[" [floatList] [whitespace] "]" +// floatList := float32Val | +// float32Val floatSpaceList | +// float32Val floatCommaList +// floatSpaceList := (whitespace float32Val)+ +// floatCommaList := ([whitespace] "," [whitespace] float32Val)+ +// float32Val := < a string rep of a float32 value > +func ParseVFloat(s string) ([]float32, error) { + // TODO Check if this can be done using lexer + s = strings.ReplaceAll(s, "\n", " ") + s = strings.ReplaceAll(s, "\t", " ") + s = strings.TrimSpace(s) + if len(s) == 0 { + return []float32{}, nil + } + trimmedPre := strings.TrimPrefix(s, "[") + if len(trimmedPre) == len(s) { + return nil, cannotConvertToVFloat(s) + } + trimmed := strings.TrimRight(trimmedPre, "]") + if len(trimmed) == len(trimmedPre) { + return nil, cannotConvertToVFloat(s) + } + if len(trimmed) == 0 { + return []float32{}, nil + } + if strings.Contains(trimmed, ",") { + // Splitting based on comma-separation. + values := strings.Split(trimmed, ",") + result := make([]float32, len(values)) + for i := 0; i < len(values); i++ { + trimmedVal := strings.TrimSpace(values[i]) + val, err := strconv.ParseFloat(trimmedVal, 32) + if err != nil { + return nil, cannotConvertToVFloat(s) + } + result[i] = float32(val) + } + return result, nil + } + values := strings.Split(trimmed, " ") + result := make([]float32, 0, len(values)) + for i := 0; i < len(values); i++ { + if len(values[i]) == 0 { + // skip if we have an empty string. This can naturally + // occur if input s was "[1.0 2.0]" + // notice the extra whitespace in separation! + continue + } + if len(values[i]) > 0 { + val, err := strconv.ParseFloat(values[i], 32) + if err != nil { + return nil, cannotConvertToVFloat(s) + } + result = append(result, float32(val)) + } + } + return result, nil +} + +func cannotConvertToVFloat(s string) error { + return errors.Errorf("cannot convert %s to vfloat", s) +} + // Convert converts the value to given scalar type. func Convert(from Val, toID TypeID) (Val, error) { to := Val{Tid: toID} @@ -40,7 +109,7 @@ func Convert(from Val, toID TypeID) (Val, error) { // sanity: we expect a value data, ok := from.Value.([]byte) if !ok { - return to, errors.Errorf("Invalid data to convert to %s", toID.Name()) + return to, errors.Errorf("invalid data to convert to %s", toID.Name()) } fromID := from.Tid @@ -59,12 +128,12 @@ func Convert(from Val, toID TypeID) (Val, error) { *res = *(*string)(unsafe.Pointer(&data)) case IntID: if len(data) < 8 { - return to, errors.Errorf("Invalid data for int64 %v", data) + return to, errors.Errorf("invalid data for int64 %v", data) } *res = int64(binary.LittleEndian.Uint64(data)) case FloatID: if len(data) < 8 { - return to, errors.Errorf("Invalid data for float %v", data) + return to, errors.Errorf("invalid data for float %v", data) } i := binary.LittleEndian.Uint64(data) *res = math.Float64frombits(i) @@ -76,7 +145,7 @@ func Convert(from Val, toID TypeID) (Val, error) { *res = true return to, nil } - return to, errors.Errorf("Invalid value for bool %v", data[0]) + return to, errors.Errorf("invalid value for bool %v", data[0]) case DateTimeID: var t time.Time if err := t.UnmarshalBinary(data); err != nil { @@ -91,6 +160,11 @@ func Convert(from Val, toID TypeID) (Val, error) { *res = w case PasswordID: *res = string(data) + case VFloatID: + if len(data)%4 != 0 { + return to, errors.Errorf("invalid data for vector of floats: %v", data) + } + *res = BytesAsFloatArray(data) default: return to, cantConvert(fromID, toID) } @@ -144,6 +218,12 @@ func Convert(from Val, toID TypeID) (Val, error) { return to, err } *res = p + case VFloatID: + vf, err := ParseVFloat(vc) + if err != nil { + return to, err + } + *res = vf default: return to, cantConvert(fromID, toID) } @@ -151,7 +231,7 @@ func Convert(from Val, toID TypeID) (Val, error) { case IntID: { if len(data) < 8 { - return to, errors.Errorf("Invalid data for int64 %v", data) + return to, errors.Errorf("invalid data for int64 %v", data) } vc := int64(binary.LittleEndian.Uint64(data)) switch toID { @@ -169,6 +249,8 @@ func Convert(from Val, toID TypeID) (Val, error) { *res = strconv.FormatInt(vc, 10) case DateTimeID: *res = time.Unix(vc, 0).UTC() + case VFloatID: + *res = []float32{float32(vc)} default: return to, cantConvert(fromID, toID) } @@ -176,7 +258,7 @@ func Convert(from Val, toID TypeID) (Val, error) { case FloatID: { if len(data) < 8 { - return to, errors.Errorf("Invalid data for float %v", data) + return to, errors.Errorf("invalid data for float %v", data) } i := binary.LittleEndian.Uint64(data) vc := math.Float64frombits(i) @@ -202,6 +284,8 @@ func Convert(from Val, toID TypeID) (Val, error) { fracSecs := vc - float64(secs) nsecs := int64(fracSecs * nanoSecondsInSec) *res = time.Unix(secs, nsecs).UTC() + case VFloatID: + *res = []float32{float32(vc)} default: return to, cantConvert(fromID, toID) } @@ -210,7 +294,7 @@ func Convert(from Val, toID TypeID) (Val, error) { { var vc bool if len(data) == 0 || data[0] > 1 { - return to, errors.Errorf("Invalid value for bool %v", data) + return to, errors.Errorf("invalid value for bool %v", data) } vc = data[0] == 1 @@ -232,6 +316,12 @@ func Convert(from Val, toID TypeID) (Val, error) { if vc { *res = float64(1) } + case VFloatID: + asFloat := float32(0) + if vc { + asFloat = float32(1) + } + *res = []float32{asFloat} case StringID, DefaultID: *res = strconv.FormatBool(vc) default: @@ -304,6 +394,27 @@ func Convert(from Val, toID TypeID) (Val, error) { return to, cantConvert(fromID, toID) } } + case VFloatID: + { + // Note that we avoid invoking BytesAsFloatArray up front + // because we don't want to pay the performance cost for it + // if we are ultimately converting to BinaryID. + // This kind of breaks the pattern that we established in other + // branches, but we avoid wasting time. + switch toID { + case BinaryID: + *res = data + case VFloatID: + vc := BytesAsFloatArray(data) + *res = vc + case StringID: + vc := BytesAsFloatArray(data) + sa := FloatArrayAsString(vc) + *res = sa + default: + return to, cantConvert(fromID, toID) + } + } default: return to, cantConvert(fromID, toID) } @@ -312,7 +423,7 @@ func Convert(from Val, toID TypeID) (Val, error) { func Marshal(from Val, to *Val) error { if to == nil { - return errors.Errorf("Invalid conversion %s to nil", from.Tid.Name()) + return errors.Errorf("invalid conversion %s to nil", from.Tid.Name()) } fromID := from.Tid @@ -435,6 +546,16 @@ func Marshal(from Val, to *Val) error { default: return cantConvert(fromID, toID) } + case VFloatID: + vc := val.([]float32) + switch toID { + case BinaryID: + *res = FloatArrayAsBytes(vc) + case StringID: + *res = FloatArrayAsString(vc) + default: + return cantConvert(fromID, toID) + } default: return cantConvert(fromID, toID) } @@ -503,6 +624,12 @@ func ObjectValue(id TypeID, value interface{}) (*api.Value, error) { return def, errors.Errorf("Expected value of type password. Got : %v", value) } return &api.Value{Val: &api.Value_PasswordVal{PasswordVal: v}}, nil + case VFloatID: + vf, err := toBinary(id, value) + if err != nil { + return def, err + } + return &api.Value{Val: &api.Value_Vfloat32Val{Vfloat32Val: vf}}, nil default: return def, errors.Errorf("ObjectValue not available for: %v", id) } @@ -538,5 +665,5 @@ func (v Val) MarshalJSON() ([]byte, error) { case PasswordID: return json.Marshal(v.Value.(string)) } - return nil, errors.Errorf("Invalid type for MarshalJSON: %v", v.Tid) + return nil, errors.Errorf("invalid type for MarshalJSON: %v", v.Tid) } diff --git a/types/conversion_test.go b/types/conversion_test.go index 277f7fd9057..5cc8d5f1d75 100644 --- a/types/conversion_test.go +++ b/types/conversion_test.go @@ -40,6 +40,8 @@ func bs(v interface{}) []byte { var bs [8]byte binary.LittleEndian.PutUint64(bs[:], math.Float64bits(x)) return bs[:] + case []float32: + return FloatArrayAsBytes(x) case time.Time: bs, err := x.MarshalBinary() if err == nil { @@ -86,20 +88,20 @@ func TestConversionEdgeCases(t *testing.T) { }{ {in: Val{Tid: BinaryID}, out: Val{Tid: BinaryID}, - failure: "Invalid data to convert to binary"}, + failure: "invalid data to convert to binary"}, // From BinaryID to X {in: Val{Tid: BinaryID, Value: []byte{}}, out: Val{Tid: IntID, Value: int64(0)}, - failure: "Invalid data for int64"}, + failure: "invalid data for int64"}, {in: Val{Tid: BinaryID, Value: []byte{}}, out: Val{Tid: FloatID, Value: int64(0)}, - failure: "Invalid data for float"}, + failure: "invalid data for float"}, {in: Val{Tid: BinaryID, Value: []byte{}}, out: Val{Tid: BoolID, Value: false}}, {in: Val{Tid: BinaryID, Value: []byte{2}}, out: Val{Tid: BoolID, Value: false}, - failure: "Invalid value for bool"}, + failure: "invalid value for bool"}, {in: Val{Tid: BinaryID, Value: []byte{8}}, out: Val{Tid: DateTimeID, Value: time.Time{}}, failure: "Time.UnmarshalBinary:"}, @@ -123,21 +125,21 @@ func TestConversionEdgeCases(t *testing.T) { // From IntID to X {in: Val{Tid: IntID, Value: []byte{}}, - failure: "Invalid data for int64"}, + failure: "invalid data for int64"}, {in: Val{Tid: IntID, Value: bs(int64(0))}, out: Val{Tid: DateTimeID, Value: time.Unix(0, 0).UTC()}}, // From FloatID to X {in: Val{Tid: FloatID, Value: []byte{}}, - failure: "Invalid data for float"}, + failure: "invalid data for float"}, {in: Val{Tid: FloatID, Value: bs(float64(0))}, out: Val{Tid: DateTimeID, Value: time.Unix(0, 0).UTC()}}, // From BoolID to X {in: Val{Tid: BoolID, Value: []byte{}}, - failure: "Invalid value for bool"}, + failure: "invalid value for bool"}, {in: Val{Tid: BoolID, Value: []byte{8}}, - failure: "Invalid value for bool"}, + failure: "invalid value for bool"}, // From DateTimeID to X {in: Val{Tid: DateTimeID, Value: []byte{}}, @@ -269,6 +271,7 @@ func TestConvertFromBinary(t *testing.T) { {in: bs(time.Date(2016, 1, 1, 0, 0, 0, 0, time.UTC)), out: Val{DateTimeID, time.Date(2016, 1, 1, 0, 0, 0, 0, time.UTC)}}, {in: bs(time.Time{}), out: Val{DateTimeID, time.Time{}}}, + {in: bs([]float32{1.0, 2.0}), out: Val{VFloatID, []float32{1.0, 2.0}}}, } for _, tc := range tests { diff --git a/types/scalar_types.go b/types/scalar_types.go index bcf14f75f68..4f9d56ddaa8 100644 --- a/types/scalar_types.go +++ b/types/scalar_types.go @@ -57,21 +57,28 @@ const ( PasswordID = TypeID(pb.Posting_PASSWORD) // StringID represents the string type. StringID = TypeID(pb.Posting_STRING) + // TODO: Add constant for pb.Posting_OBJECT ?? + // Not clear if it belongs here, but if it does, + // we should add it, if not, we should document here + // why it does not belong here. + // VFloatID represents a vector of IEEE754 64-bit floats. + VFloatID = TypeID(pb.Posting_VFLOAT) // UndefinedID represents the undefined type. UndefinedID = TypeID(100) ) var typeNameMap = map[string]TypeID{ - "default": DefaultID, - "binary": BinaryID, - "int": IntID, - "float": FloatID, - "bool": BoolID, - "datetime": DateTimeID, - "geo": GeoID, - "uid": UidID, - "string": StringID, - "password": PasswordID, + "default": DefaultID, + "binary": BinaryID, + "int": IntID, + "float": FloatID, + "bool": BoolID, + "datetime": DateTimeID, + "geo": GeoID, + "uid": UidID, + "string": StringID, + "password": PasswordID, + "float32vector": VFloatID, } // TypeID represents the type of the data. @@ -105,6 +112,8 @@ func (t TypeID) Name() string { return "string" case PasswordID: return "password" + case VFloatID: + return "vfloat" } return "" } @@ -188,7 +197,9 @@ func ValueForType(id TypeID) Val { case PasswordID: var p string return Val{PasswordID, p} - + case VFloatID: + var v []float32 + return Val{VFloatID, &v} default: return Val{} } diff --git a/types/value.go b/types/value.go index 2e988d2407d..7a7fec1085b 100644 --- a/types/value.go +++ b/types/value.go @@ -17,10 +17,60 @@ package types import ( + "encoding/binary" + "math" "strconv" "strings" + "unsafe" ) +// BytesAsFloatArray(encoded) converts encoded into a []float32. +// If len(encoded) % 4 is not 0, it will ignore any trailing +// bytes, and simply convert 4 bytes at a time to generate the +// float64 entries. +// Current implementation assuming littleEndian encoding +func BytesAsFloatArray(encoded []byte) []float32 { + resultLen := len(encoded) / 4 + if resultLen == 0 { + return []float32{} + } + retVal := make([]float32, resultLen) + for i := 0; i < resultLen; i++ { + retVal[i] = *(*float32)(unsafe.Pointer(&encoded[0])) + encoded = encoded[4:] + } + return retVal +} + +// FloatArrayAsBytes(v) will create a byte array encoding +// v using LittleEndian format. This is sort of the inverse +// of BytesAsFloatArray, but note that we can always be successful +// converting to bytes, but the inverse is not feasible. +func FloatArrayAsBytes(v []float32) []byte { + retVal := make([]byte, 4*len(v)) + offset := retVal + for i := 0; i < len(v); i++ { + bits := math.Float32bits(v[i]) + binary.LittleEndian.PutUint32(offset, bits) + offset = offset[4:] + } + return retVal +} + +func FloatArrayAsString(v []float32) string { + var sb strings.Builder + + sb.WriteRune('[') + for i := range v { + sb.WriteString(strconv.FormatFloat(float64(v[i]), 'f', -1, 32)) + if i != len(v)-1 { + sb.WriteRune(',') + } + } + sb.WriteRune(']') + return sb.String() +} + // TypeForValue tries to determine the most likely type based on a value. We only want to use this // function when there's no schema type and no suggested storage type. // Returns the guessed type or DefaultID if it couldn't be determined. @@ -61,6 +111,10 @@ func TypeForValue(v []byte) (TypeID, interface{}) { return FloatID, f } } + + // TODO: Consider looking for vector type (vfloat). Not clear + // about this, because the natural encoding as + // "[ num, num, ... num ]" my look like a standard list type. return DefaultID, nil } diff --git a/types/value_test.go b/types/value_test.go index be0484a68b1..04d7f514695 100644 --- a/types/value_test.go +++ b/types/value_test.go @@ -64,3 +64,20 @@ func TestTypeForValue(t *testing.T) { require.Equal(t, tc.out, out, "%s != %s", tc.in, tc.out.Enum()) } } + +func TestFloatArrayTranslation(t *testing.T) { + testCases := [][]float32{ + {}, + {0.1}, + {0}, + {0.65433, 1.855, 3.1415926539}, + } + for _, tc := range testCases { + asBytes := FloatArrayAsBytes(tc) + asFloat32 := BytesAsFloatArray(asBytes) + require.Equal(t, len(tc), len(asFloat32)) + for i := 0; i < len(tc); i++ { + require.Equal(t, tc[i], asFloat32[i]) + } + } +} diff --git a/worker/aggregator.go b/worker/aggregator.go index d3fef83c24f..a0e5b9ee16c 100644 --- a/worker/aggregator.go +++ b/worker/aggregator.go @@ -33,7 +33,8 @@ func couldApplyAggregatorOn(agrtr string, typ types.TypeID) bool { typ == types.DefaultID case "sum", "avg": return typ == types.IntID || - typ == types.FloatID + typ == types.FloatID || + typ == types.VFloatID default: return false }