]> 127.0.0.1 Git - bili_danmu/.git/commitdiff
Fix CVE-2023-45288
authorqydysky <qydysky@foxmail.com>
Mon, 22 Apr 2024 18:55:14 +0000 (18:55 +0000)
committerqydysky <qydysky@foxmail.com>
Mon, 22 Apr 2024 18:55:14 +0000 (18:55 +0000)
F/api.go
F/biliApiInterface.go [new file with mode: 0644]
go.mod
go.sum

index 17b750a8e23572428077fc941c1e96b1034cae1e..63d09a3850ea5b9a6fa435834c7da750d6a8bbd4 100644 (file)
--- a/F/api.go
+++ b/F/api.go
@@ -27,7 +27,6 @@ import (
        g "github.com/qydysky/part/get"
        pio "github.com/qydysky/part/io"
        limit "github.com/qydysky/part/limit"
-       pool "github.com/qydysky/part/pool"
        reqf "github.com/qydysky/part/reqf"
 
        "github.com/mdp/qrterminal/v3"
@@ -37,17 +36,7 @@ import (
 var apilog = c.C.Log.Base(`api`)
 var api_limit = limit.New(2, "1s", "30s") //频率限制2次/s,最大等待时间30s
 
-type BiliApi interface {
-       SetProxy(proxy string)
-       SetReqPool(pool *pool.Buf[reqf.Req])
-       SetCookies(cookies []*http.Cookie)
-       LoginQrCode() (err error, imgUrl string, QrcodeKey string)
-       LoginQrPoll(QrcodeKey string) (err error, cookies []*http.Cookie)
-       GetRoomBaseInfo(Roomid int) (err error, upUid int, uname string, parentAreaID int, areaID int, title string, liveStartTime time.Time, liveing bool, roomID int)
-       GetInfoByRoom(Roomid int) (err error, upUid int, uname string, parentAreaID int, areaID int, title string, liveStartTime time.Time, liveing bool, roomID int, GuardNum int, Note string, Locked bool)
-}
-
-var biliApi = cmp.Get(cmp.PkgId(), func(ba BiliApi) BiliApi {
+var biliApi = cmp.Get(cmp.PkgId("biliApi"), func(ba biliApiInter) biliApiInter {
        ba.SetProxy(c.C.Proxy)
        ba.SetReqPool(c.C.ReqPool)
        return ba
@@ -504,18 +493,18 @@ func (c *GetFunc) getRoomBaseInfo() (missKey []string) {
        }
 
        //使用其他api
-       if err, upUid, uname, parentAreaID, areaID, title, liveStartTime, liveing, roomID := biliApi.GetRoomBaseInfo(c.Roomid); err != nil {
+       if err, res := biliApi.GetRoomBaseInfo(c.Roomid); err != nil {
                apilog.L(`E: `, err)
                return
        } else {
-               c.UpUid = upUid
-               c.Uname = uname
-               c.ParentAreaID = parentAreaID
-               c.AreaID = areaID
-               c.Title = title
-               c.Live_Start_Time = liveStartTime
-               c.Liveing = liveing
-               c.Roomid = roomID
+               c.UpUid = res.UpUid
+               c.Uname = res.Uname
+               c.ParentAreaID = res.ParentAreaID
+               c.AreaID = res.AreaID
+               c.Title = res.Title
+               c.Live_Start_Time = res.LiveStartTime
+               c.Liveing = res.Liveing
+               c.Roomid = res.RoomID
        }
 
        c.Cache.Store(fkey, cacheItem{
@@ -541,21 +530,21 @@ func (c *GetFunc) getInfoByRoom() (missKey []string) {
        }
 
        //使用其他api
-       if err, upUid, uname, parentAreaID, areaID, title, liveStartTime, liveing, roomID, GuardNum, Note, Locked := biliApi.GetInfoByRoom(c.Roomid); err != nil {
+       if err, res := biliApi.GetInfoByRoom(c.Roomid); err != nil {
                apilog.L(`E: `, err)
                return
        } else {
-               c.UpUid = upUid
-               c.Uname = uname
-               c.ParentAreaID = parentAreaID
-               c.AreaID = areaID
-               c.Title = title
-               c.Live_Start_Time = liveStartTime
-               c.Liveing = liveing
-               c.Roomid = roomID
-               c.GuardNum = GuardNum
-               c.Note = Note
-               c.Locked = Locked
+               c.UpUid = res.UpUid
+               c.Uname = res.Uname
+               c.ParentAreaID = res.ParentAreaID
+               c.AreaID = res.AreaID
+               c.Title = res.Title
+               c.Live_Start_Time = res.LiveStartTime
+               c.Liveing = res.Liveing
+               c.Roomid = res.RoomID
+               c.GuardNum = res.GuardNum
+               c.Note = res.Note
+               c.Locked = res.Locked
        }
 
        c.Cache.Store(fkey, cacheItem{
@@ -578,65 +567,36 @@ func (t *GetFunc) getRoomPlayInfo() (missKey []string) {
                return
        }
 
-       Roomid := strconv.Itoa(t.Roomid)
-
        //Roominitres
        {
-               Cookie := make(map[string]string)
-               t.Cookie.Range(func(k, v interface{}) bool {
-                       Cookie[k.(string)] = v.(string)
-                       return true
-               })
-
-               req := t.Common.ReqPool.Get()
-               defer t.Common.ReqPool.Put(req)
-               if err := req.Reqf(reqf.Rval{
-                       Url: "https://api.live.bilibili.com/xlive/web-room/v2/index/getRoomPlayInfo?protocol=0,1&format=0,1,2&codec=0,1,2&qn=0&platform=web&ptype=8&dolby=5&panorama=1&room_id=" + Roomid,
-                       Header: map[string]string{
-                               `Referer`: "https://live.bilibili.com/" + Roomid,
-                               `Cookie`:  reqf.Map_2_Cookies_String(Cookie),
-                       },
-                       Proxy:   t.Proxy,
-                       Timeout: 10 * 1000,
-                       Retry:   2,
-               }); err != nil {
+               if err, res := biliApi.GetRoomPlayInfo(t.Roomid); err != nil {
                        apilog.L(`E: `, err)
                        return
-               }
-
-               var j J.GetRoomPlayInfo
-
-               if e := json.Unmarshal([]byte(req.Respon), &j); e != nil {
-                       apilog.L(`E: `, e)
-                       return
-               } else if j.Code != 0 {
-                       apilog.L(`E: `, j.Message)
-                       return
-               }
-
-               //主播uid
-               t.UpUid = j.Data.UID
-               //房间号(完整)
-               if j.Data.RoomID != 0 {
-                       t.Roomid = j.Data.RoomID
-               }
-               //直播开始时间
-               if j.Data.LiveTime != 0 {
-                       t.Live_Start_Time = time.Unix(int64(j.Data.LiveTime), 0)
-               }
-               //是否在直播
-               t.Liveing = j.Data.LiveStatus == 1
+               } else {
+                       //主播uid
+                       t.UpUid = res.UpUid
+                       //房间号(完整)
+                       t.Roomid = res.RoomID
+                       //直播开始时间
+                       t.Live_Start_Time = res.LiveStartTime
+                       //是否在直播
+                       t.Liveing = res.Liveing
+
+                       //未在直播,不获取直播流
+                       if !t.Liveing {
+                               t.Live_qn = 0
+                               t.AcceptQn = t.Qn
+                               t.Live = t.Live[:0]
+                               return
+                       }
 
-               //未在直播,不获取直播流
-               if !t.Liveing {
-                       t.Live_qn = 0
-                       t.AcceptQn = t.Qn
-                       t.Live = t.Live[:0]
-                       return
+                       //当前直播流
+                       var s = make([]J.StreamType, len(res.Streams))
+                       for i := 0; i < len(res.Streams); i++ {
+                               s[i] = J.StreamType(res.Streams[i])
+                       }
+                       t.configStreamType(s)
                }
-
-               //当前直播流
-               t.configStreamType(j.Data.PlayurlInfo.Playurl.Stream)
        }
        return
 }
diff --git a/F/biliApiInterface.go b/F/biliApiInterface.go
new file mode 100644 (file)
index 0000000..6398583
--- /dev/null
@@ -0,0 +1,88 @@
+package F
+
+import (
+       "net/http"
+       "time"
+
+       pool "github.com/qydysky/part/pool"
+       reqf "github.com/qydysky/part/reqf"
+)
+
+type biliApiInter interface {
+       SetReqPool(pool *pool.Buf[reqf.Req])
+       SetProxy(proxy string)
+       SetCookies(cookies []*http.Cookie)
+
+       LoginQrCode() (err error, imgUrl string, QrcodeKey string)
+       LoginQrPoll(QrcodeKey string) (err error, cookies []*http.Cookie)
+       GetRoomBaseInfo(Roomid int) (err error, res struct {
+               UpUid         int
+               Uname         string
+               ParentAreaID  int
+               AreaID        int
+               Title         string
+               LiveStartTime time.Time
+               Liveing       bool
+               RoomID        int
+       })
+       GetInfoByRoom(Roomid int) (err error, res struct {
+               UpUid         int
+               Uname         string
+               ParentAreaID  int
+               AreaID        int
+               Title         string
+               LiveStartTime time.Time
+               Liveing       bool
+               RoomID        int
+               GuardNum      int
+               Note          string
+               Locked        bool
+       })
+       GetRoomPlayInfo(Roomid int) (err error, res struct {
+               UpUid         int
+               RoomID        int
+               LiveStartTime time.Time
+               Liveing       bool
+               Streams       []struct {
+                       ProtocolName string
+                       Format       []struct {
+                               FormatName string
+                               Codec      []struct {
+                                       CodecName string
+                                       CurrentQn int
+                                       AcceptQn  []int
+                                       BaseURL   string
+                                       URLInfo   []struct {
+                                               Host      string
+                                               Extra     string
+                                               StreamTTL int
+                                       }
+                                       HdrQn     any
+                                       DolbyType int
+                                       AttrName  string
+                               }
+                       }
+               }
+       })
+}
+
+type Streams []struct {
+       ProtocolName string
+       Format       []struct {
+               FormatName string
+               Codec      []struct {
+                       CodecName string
+                       CurrentQn int
+                       AcceptQn  []int
+                       BaseURL   string
+                       URLInfo   []struct {
+                               Host      string
+                               Extra     string
+                               StreamTTL int
+                       }
+                       HdrQn     any
+                       DolbyType int
+                       AttrName  string
+               }
+       }
+}
diff --git a/go.mod b/go.mod
index 55d85756baf6b881a767fb79e72076d72bcac981..3cd249e8f80b212d8d52ee41a09a733a1955d631 100644 (file)
--- a/go.mod
+++ b/go.mod
@@ -13,26 +13,26 @@ require (
 
 require (
        github.com/google/uuid v1.6.0
-       github.com/qydysky/biliApi v0.0.0-20240418173820-af01f8c9ae11
-       golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8
+       github.com/qydysky/biliApi v0.0.0-20240418180924-1e3a421ae4a8
+       golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f
 )
 
 require (
        filippo.io/edwards25519 v1.1.0 // indirect
        github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
        github.com/jackc/pgpassfile v1.0.0 // indirect
-       github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect
+       github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 // indirect
        github.com/jackc/puddle/v2 v2.2.1 // indirect
        github.com/mattn/go-isatty v0.0.20 // indirect
        github.com/ncruces/go-strftime v0.1.9 // indirect
        github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
-       golang.org/x/crypto v0.21.0 // indirect
-       golang.org/x/sync v0.6.0 // indirect
-       golang.org/x/term v0.18.0 // indirect
+       golang.org/x/crypto v0.22.0 // indirect
+       golang.org/x/sync v0.7.0 // indirect
+       golang.org/x/term v0.19.0 // indirect
        modernc.org/gc/v3 v3.0.0-20240304020402-f0dba7c97c2b // indirect
-       modernc.org/libc v1.49.0 // indirect
+       modernc.org/libc v1.50.2 // indirect
        modernc.org/mathutil v1.6.0 // indirect
-       modernc.org/memory v1.7.2 // indirect
+       modernc.org/memory v1.8.0 // indirect
        modernc.org/strutil v1.2.0 // indirect
        modernc.org/token v1.1.0 // indirect
 )
@@ -44,22 +44,22 @@ require (
        github.com/go-sql-driver/mysql v1.8.1
        github.com/gorilla/websocket v1.5.1 // indirect
        github.com/jackc/pgx/v5 v5.5.5
-       github.com/klauspost/compress v1.17.7 // indirect
+       github.com/klauspost/compress v1.17.8 // indirect
        github.com/lib/pq v1.10.9
-       github.com/miekg/dns v1.1.58 // indirect
+       github.com/miekg/dns v1.1.59 // indirect
        github.com/shirou/gopsutil v3.21.11+incompatible // indirect
        github.com/thedevsaddam/gojsonq/v2 v2.5.2 // indirect
        github.com/tklauser/go-sysconf v0.3.13 // indirect
        github.com/tklauser/numcpus v0.7.0 // indirect
        github.com/yusufpapurcu/wmi v1.2.4 // indirect
-       golang.org/x/mod v0.16.0 // indirect
-       golang.org/x/net v0.22.0 // indirect
-       golang.org/x/sys v0.18.0 // indirect
-       golang.org/x/tools v0.19.0 // indirect
-       modernc.org/sqlite v1.29.5
+       golang.org/x/mod v0.17.0 // indirect
+       golang.org/x/net v0.24.0 // indirect
+       golang.org/x/sys v0.19.0 // indirect
+       golang.org/x/tools v0.20.0 // indirect
+       modernc.org/sqlite v1.29.8
        rsc.io/qr v0.2.0 // indirect
 )
 
-replace github.com/qydysky/part => ../part
+// replace github.com/qydysky/part => ../part
 
-replace github.com/qydysky/biliApi => ../biliapi
+// replace github.com/qydysky/biliApi => ../biliapi
diff --git a/go.sum b/go.sum
index eba18941a3bd7dad0adc69ba10eb6995679c1506..b8ced2bec5a6b275619c62df8ab6629202c14082 100644 (file)
--- a/go.sum
+++ b/go.sum
@@ -12,8 +12,8 @@ github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
 github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
 github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
 github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
-github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ=
-github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo=
+github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd h1:gbpYu9NMq8jhDVbvlGkMFWCjLFlqqEZjEmObmhUy6Vo=
+github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw=
 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/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY=
@@ -24,14 +24,14 @@ github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs
 github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
 github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
 github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
-github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk=
-github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
+github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 h1:L0QtFUgDarD7Fpv9jeVMgy/+Ec0mtnmYuImjTz6dtDA=
+github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
 github.com/jackc/pgx/v5 v5.5.5 h1:amBjrZVmksIdNjxGW/IiIMzxMKZFelXbUoPNb+8sjQw=
 github.com/jackc/pgx/v5 v5.5.5/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A=
 github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk=
 github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
-github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg=
-github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
+github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU=
+github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
 github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
 github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
 github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
@@ -40,12 +40,16 @@ github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o
 github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
 github.com/mdp/qrterminal/v3 v3.2.0 h1:qteQMXO3oyTK4IHwj2mWsKYYRBOp1Pj2WRYFYYNTCdk=
 github.com/mdp/qrterminal/v3 v3.2.0/go.mod h1:XGGuua4Lefrl7TLEsSONiD+UEjQXJZ4mPzF+gWYIJkk=
-github.com/miekg/dns v1.1.58 h1:ca2Hdkz+cDg/7eNF6V56jjzuZ4aCAE+DbVkILdQWG/4=
-github.com/miekg/dns v1.1.58/go.mod h1:Ypv+3b/KadlvW9vJfXOTf300O4UqaHFzFCuHz+rPkBY=
+github.com/miekg/dns v1.1.59 h1:C9EXc/UToRwKLhK5wKU/I4QVsBUc8kE6MkHBkeypWZs=
+github.com/miekg/dns v1.1.59/go.mod h1:nZpewl5p6IvctfgrckopVx2OlSEHPRO/U4SYkRklrEk=
 github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4=
 github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/qydysky/biliApi v0.0.0-20240418180924-1e3a421ae4a8 h1:t4sclQifEHZITAIeE9dDSobyAGhIo0QHiIVOsB+tJMA=
+github.com/qydysky/biliApi v0.0.0-20240418180924-1e3a421ae4a8/go.mod h1:81lx2cYjv590O3ZK1AVtnLJ8JMXMluMtyB1NGAlTuPM=
+github.com/qydysky/part v0.28.20240422183953 h1:r8kZFzSIqNbFOOuFBJw5aobwLZ/fQ6GaEez5082aJEY=
+github.com/qydysky/part v0.28.20240422183953/go.mod h1:VMq3GnrK1/7zUufW3foG5oLAk9dw567JmuMyKPTGswc=
 github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
 github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
 github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI=
@@ -67,53 +71,53 @@ github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr
 github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY=
 github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
 github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
-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-20240325151524-a685a6edb6d8 h1:aAcj0Da7eBAtrTp03QXWvm88pSyOt+UgdZw2BFZ+lEw=
-golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ=
-golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic=
-golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
-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/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
-golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30=
+golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=
+golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f h1:99ci1mjWVBWwJiEKYY6jWa4d2nTQVIEhZIptnrVb1XY=
+golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f/go.mod h1:/lliqkxwWAhPjf5oSOIJup2XcqJaw8RGS6k3TGEc7GI=
+golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA=
+golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
+golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w=
+golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=
+golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
+golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
 golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-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.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8=
-golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
+golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o=
+golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q=
+golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=
 golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
 golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw=
-golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc=
+golang.org/x/tools v0.20.0 h1:hz/CVckiOxybQvFw6h7b/q80NTr9IUQb4s1IIzW7KNY=
+golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-modernc.org/cc/v4 v4.19.5 h1:QlsZyQ1zf78DGeqnQ9ILi9hXyMdoC5e1qoGNUyBjHQw=
-modernc.org/cc/v4 v4.19.5/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ=
-modernc.org/ccgo/v4 v4.13.1 h1:qBttaSxEHNze36VBivw1/vkHuyjMDN3RY5wQX+p1Oxg=
-modernc.org/ccgo/v4 v4.13.1/go.mod h1:Td6RI9W9G2ZpKHaJ7UeGEiB2aIpoDqLBnm4wtkbJTbQ=
+modernc.org/cc/v4 v4.21.0 h1:D/gLKtcztomvWbsbvBKo3leKQv+86f+DdqEZBBXhnag=
+modernc.org/cc/v4 v4.21.0/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ=
+modernc.org/ccgo/v4 v4.17.0 h1:cX97L5Bv/7PEmyk1oEAD890fQu5/yUQRYeYBsCSnzww=
+modernc.org/ccgo/v4 v4.17.0/go.mod h1:keES1eiOIBJhbA5qKrV7ADG3w8DsX8G7jfHAT76riOg=
 modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE=
 modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ=
 modernc.org/gc/v2 v2.4.1 h1:9cNzOqPyMJBvrUipmynX0ZohMhcxPtMccYgGOJdOiBw=
 modernc.org/gc/v2 v2.4.1/go.mod h1:wzN5dK1AzVGoH6XOzc3YZ+ey/jPgYHLuVckd62P0GYU=
 modernc.org/gc/v3 v3.0.0-20240304020402-f0dba7c97c2b h1:BnN1t+pb1cy61zbvSUV7SeI0PwosMhlAEi/vBY4qxp8=
 modernc.org/gc/v3 v3.0.0-20240304020402-f0dba7c97c2b/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4=
-modernc.org/libc v1.49.0 h1:/kkNBuCXvlTbOGwrQdgR67eK1Y9+kR+fhdBd89C64VM=
-modernc.org/libc v1.49.0/go.mod h1:DNz0lgQgT6FPIPm8rHtjFj0FL5/YOr/NYFXWYBcSxMw=
+modernc.org/libc v1.50.2 h1:I0+3wlRvXmAEjAJvD7BhP1kmKHwkzV0rOcqFcD85u+0=
+modernc.org/libc v1.50.2/go.mod h1:Fd8TZdfRorOd1vB0QCtYSHYAuzobS4xS3mhMGUkeVcA=
 modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4=
 modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo=
-modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E=
-modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E=
+modernc.org/memory v1.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E=
+modernc.org/memory v1.8.0/go.mod h1:XPZ936zp5OMKGWPqbD3JShgd/ZoQ7899TUuQqxY+peU=
 modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4=
 modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0=
 modernc.org/sortutil v1.2.0 h1:jQiD3PfS2REGJNzNCMMaLSp/wdMNieTbKX920Cqdgqc=
 modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss=
-modernc.org/sqlite v1.29.5 h1:8l/SQKAjDtZFo9lkJLdk8g9JEOeYRG4/ghStDCCTiTE=
-modernc.org/sqlite v1.29.5/go.mod h1:S02dvcmm7TnTRvGhv8IGYyLnIt7AS2KPaB1F/71p75U=
+modernc.org/sqlite v1.29.8 h1:nGKglNx9K5v0As+zF0/Gcl1kMkmaU1XynYyq92PbsC8=
+modernc.org/sqlite v1.29.8/go.mod h1:lQPm27iqa4UNZpmr4Aor0MH0HkCLbt1huYDfWylLZFk=
 modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA=
 modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0=
 modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=