]> 127.0.0.1 Git - bili_danmu/.git/commitdiff
Improve cookie保护使用新的加密方法
authorqydysky <qydysky@foxmail.com>
Wed, 21 Aug 2024 21:51:19 +0000 (05:51 +0800)
committerqydysky <qydysky@foxmail.com>
Wed, 21 Aug 2024 21:51:19 +0000 (05:51 +0800)
CV/Var.go
F/CookieCrypo.go
README.md
bili_danmu.go
demo/private.pem
demo/public.pem
go.mod
go.sum

index 813013128d0e61c74d22631cc04027a6622add1a..5fc160d4482ee56722c0674152026c51e0d5d6bc 100644 (file)
--- a/CV/Var.go
+++ b/CV/Var.go
@@ -21,6 +21,7 @@ import (
        "github.com/dustin/go-humanize"
        _ "github.com/go-sql-driver/mysql"
        _ "github.com/jackc/pgx/v5/stdlib"
+       crypto "github.com/qydysky/part/crypto"
        pctx "github.com/qydysky/part/ctx"
        file "github.com/qydysky/part/file"
        log "github.com/qydysky/part/log"
@@ -373,9 +374,24 @@ func (t *Common) Init() *Common {
        var (
                ckv     = flag.String("ckv", "", "自定义配置KV文件,将会覆盖config_K_v配置")
                roomIdP = flag.Int("r", 0, "roomid")
+               genKey  = flag.Bool("genKey", false, "生成cookie加密公私钥")
        )
        testing.Init()
        flag.Parse()
+
+       if *genKey {
+               if pri, pub, e := crypto.NewKey(); e != nil {
+                       panic(e)
+               } else {
+                       fmt.Println("公钥:")
+                       fmt.Println(string(pub))
+                       fmt.Println("私钥:")
+                       fmt.Println(string(pri))
+                       fmt.Println("请复制以上公私钥并另存为文件,可以在cookie加密公钥、cookie解密私钥中使用")
+                       os.Exit(0)
+               }
+       }
+
        t.Roomid = *roomIdP
 
        if e := t.loadConf(*ckv); e != nil {
index 7a154b04d152aef8d2208f766420cf4e36dea3d1..1af41db6c31486bca31d092a0ebc5deac9adcc39 100644 (file)
@@ -2,6 +2,8 @@ package F
 
 import (
        "fmt"
+       "io"
+       "os"
        "sync"
 
        c "github.com/qydysky/bili_danmu/CV"
@@ -25,7 +27,7 @@ func CookieGet() []byte {
 
        if len(pri) == 0 {
                if priS, ok := c.C.K_v.LoadV(`cookie解密私钥`).(string); ok && priS != `` {
-                       if d, e := crypto.FileLoad(priS); e != nil {
+                       if d, e := FileLoad(priS); e != nil {
                                clog.L(`E: `, e)
                                return []byte{}
                        } else {
@@ -39,14 +41,14 @@ func CookieGet() []byte {
                                clog.L(`E: `, "输入错误", err)
                                return []byte{}
                        }
-                       if d, e := crypto.FileLoad(priS); e != nil {
+                       if d, e := FileLoad(priS); e != nil {
                                clog.L(`E: `, e)
                                return []byte{}
                        } else {
                                pri = d
                        }
                } else {
-                       if d, e := crypto.FileLoad(`cookie.txt`); e != nil {
+                       if d, e := FileLoad(`cookie.txt`); e != nil {
                                clog.L(`E: `, e, `cookie保存格式`)
                                return []byte{}
                        } else if string(d[:6]) == `t=nol;` {
@@ -59,7 +61,7 @@ func CookieGet() []byte {
                        }
                }
        }
-       if d, e := crypto.FileLoad(`cookie.txt`); e != nil {
+       if d, e := FileLoad(`cookie.txt`); e != nil {
                clog.L(`E: `, e, `cookie保存格式`)
                return []byte{}
        } else if string(d[:6]) == `t=pem;` {
@@ -90,7 +92,7 @@ func CookieSet(source []byte) {
 
        if len(pub) == 0 {
                if pubS, ok := c.C.K_v.LoadV(`cookie加密公钥`).(string); ok && pubS != `` {
-                       if d, e := crypto.FileLoad(pubS); e != nil {
+                       if d, e := FileLoad(pubS); e != nil {
                                clog.L(`E: `, e)
                                return
                        } else {
@@ -112,3 +114,18 @@ func CookieSet(source []byte) {
                _, _ = f.Write(append([]byte("t=pem;"), source...), true)
        }
 }
+
+func FileLoad(path string) (data []byte, err error) {
+       fileObject, e := os.OpenFile(path, os.O_RDONLY, 0644)
+       if e != nil {
+               err = e
+               return
+       }
+       defer fileObject.Close()
+       data, e = io.ReadAll(fileObject)
+       if e != nil {
+               err = e
+               return
+       }
+       return
+}
index e548623dc705a9339818fcd1434157880df0add1..2c4cef3ccce9a21a9127dd78e2fbc488f963df5d 100644 (file)
--- a/README.md
+++ b/README.md
 
 保持期间,可能会频繁发送弹幕(间隔5秒/条),此时可能会影响其他使用。
 
-由于bilibili粉丝牌策略调整,目前当配置项`保持牌子亮着`为`true`时,将会
-
-- 正在直播的直播间:点赞
-- 未直播的直播间:发送弹幕
-
-从而获取每日亲密度。
-
 #### 直播回放显示表情
 配置文件中添加配置项`弹幕表情`(>v0.14.9)。默认为true,当为true时,将会保存弹幕中的表情png到emots目录下,并在回放时显示表情。
 
@@ -697,7 +690,7 @@ Asaki大人 开心鸭鸭杀 直播中
 还支持登录、搜索主播直播间、查看历史记录、查看关注的直播间、保存直播流等功能
 
 #### cookie加密
-保护cookie.txt
+*使用X25519和chacha20poly1305*(>v0.14.15) 保护cookie.txt
 
 在`demo/config/config_K_v.json`中可找到配置项
 ```
@@ -712,8 +705,20 @@ Asaki大人 开心鸭鸭杀 直播中
 
 附:创建公(public.pem)私(private.pem)钥
 ```
-openssl genrsa -out private.pem 2048
-openssl rsa -in private.pem -pubout -out public.pem
+使用 -genKey 生成(>v0.14.15)
+main(main.exe) -genKey
+
+公钥:
+-----BEGIN ECDH PUBLIC KEY-----
+tvdVdbI7DTlRcyE44va7zXhi5rewxcm44/Dmp8DMnGY=
+-----END ECDH PUBLIC KEY-----
+
+私钥:
+-----BEGIN ECDH PRIVATE KEY-----
+xrWweTO5upvzDha6WrEBQKkToUYLyMCI7An2btRqop0=
+-----END ECDH PRIVATE KEY-----
+
+请复制以上公私钥并另存为文件,可以在cookie加密公钥、cookie解密私钥中使用
 ```
 
 #### 私信
@@ -832,8 +837,8 @@ windows: set CGO_ENABLED=0;go build .
 
 clone/下载本项目。进入`demo`目录(文件夹),运行:
 ```
-linux: CGO_ENABLED=0 go run . [-r 房间ID] [-ckv 自定义config_K_v.json]
-windows: set CGO_ENABLED=0;go run . [-r 房间ID] [-ckv 自定义config_K_v.json]
+linux: CGO_ENABLED=0 go run . [-r 房间ID] [-ckv 自定义config_K_v.json] [-genKey]
+windows: set CGO_ENABLED=0;go run . [-r 房间ID] [-ckv 自定义config_K_v.json] [-genKey]
 ```
 
 3. docker部署
@@ -860,8 +865,8 @@ go build .
 
 前往[releases](https://github.com/qydysky/bili_danmu/releases)页下载对应系统版本。解压后进入`demo`目录(文件夹),运行`main`(`main.exe`)。
 ```
-./main [-r 房间ID] [-ckv 自定义config_K_v.json]
-./main.exe [-r 房间ID] [-ckv 自定义config_K_v.json]
+./main [-r 房间ID] [-ckv 自定义config_K_v.json] [-genKey]
+./main.exe [-r 房间ID] [-ckv 自定义config_K_v.json] [-genKey]
 ```
 
 #### 注意事项
index 405cef0b3161efe871f7e24b8e29ac7dc86e019e..efbbd95b14f57adfa6af4cba635c07cd1669d7a2 100644 (file)
@@ -275,7 +275,6 @@ func entryRoom(mainCtx context.Context, danmulog *part.Log_interface, common *c.
                u, _ := url.Parse(v)
                ws_c, err := ws.New_client(&ws.Client{
                        Url:               v,
-                       BufSize:           10,
                        TO:                (heartinterval + 5) * 1000,
                        Proxy:             common.Proxy,
                        Func_abort_close:  func() { danmulog.L(`I: `, `服务器连接中断`) },
index 860625d97a2960cccfe3ff4a840ef73a58fd7102..679fb4c238f83f3f1215bd136c9e6e4852cdbb6d 100644 (file)
@@ -1,27 +1,3 @@
------BEGIN RSA PRIVATE KEY-----
-MIIEpAIBAAKCAQEAthnXhQH/5+JfT/imXP58C0ysFMMyxYpJrkDZVCaS9IKIe+DC
-iVtTKvQHDpkLCivogMpxXyN8Dx4PD+0/ZObLICsCSMyPsq+59ly1H8CBuYauOlbJ
-ihux6+qF38FX54lGulANN2bU8LzrxqY2CuWtZNeDZZ7XJOPqal9oQ6U/F57+gqgY
-VJZf4Qu0pfmvQkjMa77u4a+EaMzaIPCj6Els/6y7W0BBE1FRexzgh+ypVq5NeKx2
-m5bLm405zOSWzlOGAjRMT3upV3rAi6AzpUdcDjIbFiKT/SpLzaYkbO6PX92Wu2t9
-+rhwB0ZurFrheh8RHy6j0/EZkrAfkw/gte5+vwIDAQABAoIBAQCdg1zYwBILEdQ/
-6GR+q+HAJGH006NnG2cAQze5gmQ6+23zOUcMaOJXlR1FkzvpYHGMdY/7K0Z0DRwa
-Oq1LKhcpjAo9zjO97CJ+51IEVQ/g2o56B/fsbmhIGGQUV7khnayAHB5SfbBTTBbl
-jX/RjTmesIwHqo2Oa1apDD2zxYv9cSQ86+62mDjseq/vwV3HPU9hp1HRv/O03ctQ
-ym1ftabwsjOF3+MRHSMI99UrP8KM9VVoPDmkV30AGqVjhDypRVWfVv1REgxOwqXB
-liZTkJgRETMwCZH7FFZpAd4Er/1Mix94HYB//aXc3J3Nw9i2TLy3YACP8t957GvL
-T7ea/2qBAoGBANwqiJqQzRqak+SGPbIEh41yrHRPrb2da035wSRVf6sHPFK5vNpW
-s+8VvgpWK5e3Q9Yxud8AvaFUntQhZMC8ibJ8ZYg2xIvmJvWoSLNfSgC/VQ0TVK3E
-ayOscZsVEhxo+HHz2MXiJilUHe0faEGIvC/PtLWzOc0HA/7ETG3xpLlLAoGBANO9
-R4pTZewE2BKyMIxEfyzE8ipBADwK9XP0OD/e7m7rrk/0l2AoM6gFulH0GShl3XxG
-Ery90I+LZQPqwFv4M3fhzcT/3MWTpzoR0gKT6/aBLvkNJsOXJ9kFtfxqgw98GHZ8
-TAPCKZ/QswsT1zX4lk/qHfxcvplwheEdr7WgavvdAoGAKpV/foXrZe3oFRdx73C4
-1z8K5CRVMou0KYzZMrHm06m+nTGXuZNzkhbefxlTrTChSlir3tpB02aOofEjj7Pn
-3kH5UXNmaLjHaFR4W1le8u4PAUxv4HxRTMEZ6CkXK6+R/lhv4TZwsyW19BtTCvnr
-jEPcbBiSYXmt6CUHs2w9tCkCgYBAVEZS8UmK7mHTNE3pn7nfmSpVyg/PLikqhG0+
-gnWAP5xi8FW5Qh2Hk83qrjWif2hOJF/29dhSdDBJg13T01GXv4OrsWyanmR1EQrz
-+4r6Bn+F7Qf07oyNs915hcaxwqsP/G1/ytKomlh7Khj9bbwFJYTcsjS6G2ShY0qJ
-7OX0BQKBgQDTmEJEZfUxKi866C3hPlml4uhKEvOLGDKPsEjy6t7Spz6paM6zr4By
-xOmkXXhfOudhgzsOpIiKuzG+D/7q0MCoDIwrW1EiB3IiMS0aSeN3UTffDAhDnnMu
-q+xXywYgDO4/tI4eckasLdEoIjYeM9lBK08EN1tSeEEAyLXDPcO6/A==
------END RSA PRIVATE KEY-----
+-----BEGIN ECDH PRIVATE KEY-----
+wmVxRqMp4bs+4xvOOlW0p2tyF2VGykhVqncxDo/IsKo=
+-----END ECDH PRIVATE KEY-----
\ No newline at end of file
index a40171da97c58472592959493dd35e8bd2c0fdb7..2780b61358763923c6738a9bf4b15ce591ff083c 100644 (file)
@@ -1,9 +1,3 @@
------BEGIN PUBLIC KEY-----
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAthnXhQH/5+JfT/imXP58
-C0ysFMMyxYpJrkDZVCaS9IKIe+DCiVtTKvQHDpkLCivogMpxXyN8Dx4PD+0/ZObL
-ICsCSMyPsq+59ly1H8CBuYauOlbJihux6+qF38FX54lGulANN2bU8LzrxqY2CuWt
-ZNeDZZ7XJOPqal9oQ6U/F57+gqgYVJZf4Qu0pfmvQkjMa77u4a+EaMzaIPCj6Els
-/6y7W0BBE1FRexzgh+ypVq5NeKx2m5bLm405zOSWzlOGAjRMT3upV3rAi6AzpUdc
-DjIbFiKT/SpLzaYkbO6PX92Wu2t9+rhwB0ZurFrheh8RHy6j0/EZkrAfkw/gte5+
-vwIDAQAB
------END PUBLIC KEY-----
+-----BEGIN ECDH PUBLIC KEY-----
+JAyDXPJ2jNouYCC1xp51RRvAhCYrohCN/5ZhOgDbW2c=
+-----END ECDH PUBLIC KEY-----
\ No newline at end of file
diff --git a/go.mod b/go.mod
index c64609a783510f22a33c9f67b5133c8f9f23d9a7..e38d58231a404db1527b1ef8a0eced5e16d7df76 100644 (file)
--- a/go.mod
+++ b/go.mod
@@ -1,14 +1,14 @@
 module github.com/qydysky/bili_danmu
 
-go 1.22.2
+go 1.23
 
 require (
        github.com/gotk3/gotk3 v0.6.4
        github.com/mdp/qrterminal/v3 v3.2.0
-       github.com/qydysky/part v0.28.20240811150311
+       github.com/qydysky/part v0.28.20240821214546
        github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e
        github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966
-       golang.org/x/text v0.16.0
+       golang.org/x/text v0.17.0
 )
 
 require (
@@ -26,11 +26,11 @@ require (
        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.25.0 // indirect
-       golang.org/x/sync v0.7.0 // indirect
-       golang.org/x/term v0.22.0 // indirect
-       modernc.org/gc/v3 v3.0.0-20240304020402-f0dba7c97c2b // indirect
-       modernc.org/libc v1.53.3 // indirect
+       golang.org/x/crypto v0.26.0 // indirect
+       golang.org/x/sync v0.8.0 // indirect
+       golang.org/x/term v0.23.0 // indirect
+       modernc.org/gc/v3 v3.0.0-20240801135723-a856999a2e4a // indirect
+       modernc.org/libc v1.59.9 // indirect
        modernc.org/mathutil v1.6.0 // indirect
        modernc.org/memory v1.8.0 // indirect
        modernc.org/strutil v1.2.0 // indirect
@@ -46,16 +46,16 @@ require (
        github.com/jackc/pgx/v5 v5.6.0
        github.com/klauspost/compress v1.17.9 // indirect
        github.com/lib/pq v1.10.9
-       github.com/miekg/dns v1.1.61 // indirect
+       github.com/miekg/dns v1.1.62 // indirect
        github.com/shirou/gopsutil v3.21.11+incompatible // indirect
        github.com/tklauser/go-sysconf v0.3.14 // indirect
        github.com/tklauser/numcpus v0.8.0 // indirect
        github.com/yusufpapurcu/wmi v1.2.4 // indirect
-       golang.org/x/mod v0.19.0 // indirect
-       golang.org/x/net v0.27.0 // indirect
-       golang.org/x/sys v0.22.0 // indirect
-       golang.org/x/tools v0.22.0 // indirect
-       modernc.org/sqlite v1.30.1
+       golang.org/x/mod v0.20.0 // indirect
+       golang.org/x/net v0.28.0 // indirect
+       golang.org/x/sys v0.24.0 // indirect
+       golang.org/x/tools v0.24.0 // indirect
+       modernc.org/sqlite v1.32.0
        rsc.io/qr v0.2.0 // indirect
 )
 
diff --git a/go.sum b/go.sum
index 9e69165b0e8562f55ad130a9eae6ef8330198f92..ec666ce852b1f8ef8434c80bfa0d3c8626c1b77b 100644 (file)
--- a/go.sum
+++ b/go.sum
@@ -38,16 +38,16 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE
 github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
 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.61 h1:nLxbwF3XxhwVSm8g9Dghm9MHPaUZuqhPiGL+675ZmEs=
-github.com/miekg/dns v1.1.61/go.mod h1:mnAarhS3nWaW+NVP2wTkYVIZyHNJ098SJZUki3eykwQ=
+github.com/miekg/dns v1.1.62 h1:cN8OuEF1/x5Rq6Np+h1epln8OiyPWV+lROx9LxcGgIQ=
+github.com/miekg/dns v1.1.62/go.mod h1:mvDlcItzm+br7MToIKqkglaGhlFMHJ9DTNNWONWXbNQ=
 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-20240725184407-15076dddb6fb h1:dtSpNF9hLQa09TUfR+xbYFkHcx2breAFsXeU7e599gE=
 github.com/qydysky/biliApi v0.0.0-20240725184407-15076dddb6fb/go.mod h1:om024vfxALQ5vxsbaGoMm8IS0esLYBnEOpJI8FsGoDg=
-github.com/qydysky/part v0.28.20240811150311 h1:I72L/Sv9IssdOs9Tp1BYyjmXDdmXUlz78QU9c80nzMM=
-github.com/qydysky/part v0.28.20240811150311/go.mod h1:dgagZnPYRFZDbt7XJf7nADOJLoYwlebD9B8Z8g5aHhI=
+github.com/qydysky/part v0.28.20240821214546 h1:MtOxggPvVKa9t24QhxxDuIxuuSjJUCaAwVCJRsN+gWs=
+github.com/qydysky/part v0.28.20240821214546/go.mod h1:lv0lIlm2keVMdwnOzXdRCUL8Ky8HoAAYw8coaBW6rb8=
 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,43 +67,43 @@ github.com/tklauser/numcpus v0.8.0 h1:Mx4Wwe/FjZLeQsK/6kt2EOepwwSl7SmJrK5bV/dXYg
 github.com/tklauser/numcpus v0.8.0/go.mod h1:ZJZlAY+dmR4eut8epnzf0u/VwodKmryxR8txiloSqBE=
 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.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30=
-golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M=
+golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw=
+golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54=
 golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 h1:yixxcjnhBmY0nkL253HFVIm0JsFHwrHdT3Yh6szTnfY=
 golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI=
-golang.org/x/mod v0.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8=
-golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
-golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys=
-golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE=
-golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
-golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0=
+golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
+golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE=
+golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg=
+golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
+golang.org/x/sync v0.8.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.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
-golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk=
-golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4=
-golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
-golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
-golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA=
-golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c=
+golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg=
+golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/term v0.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU=
+golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk=
+golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc=
+golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
+golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24=
+golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ=
 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.21.3 h1:2mhBdWKtivdFlLR1ecKXTljPG1mfvbByX7QKztAIJl8=
-modernc.org/cc/v4 v4.21.3/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ=
-modernc.org/ccgo/v4 v4.18.1 h1:1zF5kPBFq/ZVTulBOKgQPQITdOzzyBUfC51gVYP62E4=
-modernc.org/ccgo/v4 v4.18.1/go.mod h1:ao1fAxf9a2KEOL15WY8+yP3wnpaOpP/QuyFOZ9HJolM=
+modernc.org/cc/v4 v4.21.4 h1:3Be/Rdo1fpr8GrQ7IVw9OHtplU4gWbb+wNgeoBMmGLQ=
+modernc.org/cc/v4 v4.21.4/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ=
+modernc.org/ccgo/v4 v4.20.7 h1:skrinQsjxWfvj6nbC3ztZPJy+NuwmB3hV9zX/pthNYQ=
+modernc.org/ccgo/v4 v4.20.7/go.mod h1:UOkI3JSG2zT4E2ioHlncSOZsXbuDCZLvPi3uMlZT5GY=
 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.53.3 h1:9O0aSLZuHPgp49we24NoFFteRgXNLGBAQ3TODrW3XLg=
-modernc.org/libc v1.53.3/go.mod h1:kb+Erju4FfHNE59xd2fNpv5CBeAeej6fHbx8p8xaiyI=
+modernc.org/gc/v2 v2.5.0 h1:bJ9ChznK1L1mUtAQtxi0wi5AtAs5jQuw4PrPHO5pb6M=
+modernc.org/gc/v2 v2.5.0/go.mod h1:wzN5dK1AzVGoH6XOzc3YZ+ey/jPgYHLuVckd62P0GYU=
+modernc.org/gc/v3 v3.0.0-20240801135723-a856999a2e4a h1:CfbpOLEo2IwNzJdMvE8aiRbPMxoTpgAJeyePh0SmO8M=
+modernc.org/gc/v3 v3.0.0-20240801135723-a856999a2e4a/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4=
+modernc.org/libc v1.59.9 h1:k+nNDDakwipimgmJ1D9H466LhFeSkaPPycAs1OZiDmY=
+modernc.org/libc v1.59.9/go.mod h1:EY/egGEU7Ju66eU6SBqCNYaFUDuc4npICkMWnU5EE3A=
 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.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E=
@@ -112,8 +112,8 @@ 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.30.1 h1:YFhPVfu2iIgUf9kuA1CR7iiHdcEEsI2i+yjRYHscyxk=
-modernc.org/sqlite v1.30.1/go.mod h1:DUmsiWQDaAvU4abhc/N+djlom/L2o8f7gZ95RCvyoLU=
+modernc.org/sqlite v1.32.0 h1:6BM4uGza7bWypsw4fdLRsLxut6bHe4c58VeqjRgST8s=
+modernc.org/sqlite v1.32.0/go.mod h1:UqoylwmTb9F+IqXERT8bW9zzOWN8qwAIcLdzeBZs4hA=
 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=