diff --git a/.github/update.log b/.github/update.log index 05ce1f3671..38a87e275e 100644 --- a/.github/update.log +++ b/.github/update.log @@ -814,3 +814,4 @@ Update On Thu Oct 31 19:36:27 CET 2024 Update On Fri Nov 1 19:37:29 CET 2024 Update On Sat Nov 2 19:33:00 CET 2024 Update On Sun Nov 3 19:35:10 CET 2024 +Update On Mon Nov 4 19:35:56 CET 2024 diff --git a/clash-meta/component/mmdb/reader.go b/clash-meta/component/mmdb/reader.go index e76e993986..42e500c9dc 100644 --- a/clash-meta/component/mmdb/reader.go +++ b/clash-meta/component/mmdb/reader.go @@ -5,6 +5,7 @@ import ( "net" "strings" + "github.com/metacubex/mihomo/log" "github.com/oschwald/maxminddb-golang" ) @@ -23,11 +24,16 @@ type ASNReader struct { *maxminddb.Reader } -type ASNResult struct { +type GeoLite2 struct { AutonomousSystemNumber uint32 `maxminddb:"autonomous_system_number"` AutonomousSystemOrganization string `maxminddb:"autonomous_system_organization"` } +type IPInfo struct { + ASN string `maxminddb:"asn"` + Name string `maxminddb:"name"` +} + func (r IPReader) LookupCode(ipAddress net.IP) []string { switch r.databaseType { case typeMaxmind: @@ -66,8 +72,18 @@ func (r IPReader) LookupCode(ipAddress net.IP) []string { } } -func (r ASNReader) LookupASN(ip net.IP) ASNResult { - var result ASNResult - r.Lookup(ip, &result) - return result +func (r ASNReader) LookupASN(ip net.IP) (string, string) { + switch r.Metadata.DatabaseType { + case "GeoLite2-ASN", "DBIP-ASN-Lite (compat=GeoLite2-ASN)": + var result GeoLite2 + _ = r.Lookup(ip, &result) + return fmt.Sprint(result.AutonomousSystemNumber), result.AutonomousSystemOrganization + case "ipinfo generic_asn_free.mmdb": + var result IPInfo + _ = r.Lookup(ip, &result) + return result.ASN[2:], result.Name + default: + log.Warnln("Unsupported ASN type: %s", r.Metadata.DatabaseType) + } + return "", "" } diff --git a/clash-meta/rules/common/ipasn.go b/clash-meta/rules/common/ipasn.go index 813923ac1f..7d554103f3 100644 --- a/clash-meta/rules/common/ipasn.go +++ b/clash-meta/rules/common/ipasn.go @@ -1,8 +1,6 @@ package common import ( - "strconv" - "github.com/metacubex/mihomo/component/geodata" "github.com/metacubex/mihomo/component/mmdb" C "github.com/metacubex/mihomo/constant" @@ -26,17 +24,14 @@ func (a *ASN) Match(metadata *C.Metadata) (bool, string) { return false, "" } - result := mmdb.ASNInstance().LookupASN(ip.AsSlice()) - asnNumber := strconv.FormatUint(uint64(result.AutonomousSystemNumber), 10) - ipASN := asnNumber + " " + result.AutonomousSystemOrganization + asn, aso := mmdb.ASNInstance().LookupASN(ip.AsSlice()) if a.isSourceIP { - metadata.SrcIPASN = ipASN + metadata.SrcIPASN = asn + " " + aso } else { - metadata.DstIPASN = ipASN + metadata.DstIPASN = asn + " " + aso } - match := a.asn == asnNumber - return match, a.adapter + return a.asn == asn, a.adapter } func (a *ASN) RuleType() C.RuleType { diff --git a/clash-nyanpasu/.github/workflows/ci.yml b/clash-nyanpasu/.github/workflows/ci.yml index 9755ba81dc..e51780b8a3 100644 --- a/clash-nyanpasu/.github/workflows/ci.yml +++ b/clash-nyanpasu/.github/workflows/ci.yml @@ -84,6 +84,8 @@ jobs: - name: Prepare fronend run: pnpm -r build # Build frontend + env: + NODE_OPTIONS: "--max_old_space_size=4096" - name: Prepare sidecar and resources run: pnpm check - name: Lint @@ -92,7 +94,8 @@ jobs: - name: Lint if: startsWith(matrix.targets.os, 'ubuntu-') == false run: pnpm run-p lint:clippy lint:rustfmt # Lint - + env: + NODE_OPTIONS: "--max_old_space_size=4096" # 以后完善了新的测试套件后再添加 # test_unit: diff --git a/clash-nyanpasu/backend/tauri/src/enhance/script/lua/mod.rs b/clash-nyanpasu/backend/tauri/src/enhance/script/lua/mod.rs index 7d40cf1438..9f60854a54 100644 --- a/clash-nyanpasu/backend/tauri/src/enhance/script/lua/mod.rs +++ b/clash-nyanpasu/backend/tauri/src/enhance/script/lua/mod.rs @@ -192,42 +192,568 @@ mod tests { } #[test] - // TODO: use more common test case fn test_correct_original_mapping_order() { use super::*; use serde_yaml::Mapping; let mut target = serde_yaml::from_str::( - r#" - proxies: - - 123 - - 12312 - - asdxxx - shoud_remove: 123 - "#, - ) - .unwrap(); - let original = serde_yaml::from_str::( - r#" - shoud_remove: 123 - proxies: - - 123 - - 12312 - - asdxxx + r#" ######### 锚点 start ####### +TroxyInPort: &TroxyInPort 65535 +ShareInPort: &ShareInPort 65534 +# TailscaleOutPort: &TailscaleOutPort 65528 +ReqableOutPort: &ReqableOutPort 9000 +DNSSocket: &DNSSocket 127.0.0.1:65533 +UISocket: &UISocket 127.0.0.1:65532 +direct_dns: &direct_dns + - 114.114.114.114#直连DNS + - https://doh.pub/dns-query#直连DNS + - https://dns.alidns.com/dns-query#直连DNS + - system +cn_dns: &cn_dns + - 114.114.114.114#中国DNS + - https://doh.pub/dns-query#中国DNS + - https://dns.alidns.com/dns-query#中国DNS + - system +international_dns: &international_dns + - "https://dns.cloudflare.com/dns-query#国际DNS" + - "https://doh.opendns.com/dns-query#国际DNS" + - "https://dns.w3ctag.org/dns-query#国际DNS" + - "https://dns.google/dns-query#国际DNS" +us_dns: &us_dns + - "https://dns.koala.us.to/dns-query#美国" + - "https://dns.dns-53.us/dns-query#美国" + - "https://cloudflare-dns.com/dns-query#美国" + - "https://doh.opendns.com/dns-query#美国" + - "https://dns.google/dns-query#美国" +uk_dns: &uk_dns + - "https://dns.aa.net.uk/dns-query#英国" + - "https://princez.uk/dns-query#英国" + - "https://dns.dns-53.uk/dns-query#英国" +de_dns: &de_dns + - "https://doh.ffmuc.net/dns-query#德国" + - "https://dns.dnshome.de/dns-query#德国" + - "https://dnsforge.de/dns-query#德国" + - "https://bahopir188.dnshome.de/dns-query#德国" + - "https://dns.csa-rz.de/dns-query#德国" + - "https://dns.datenquark.de/dns-query#德国" + - "https://doh-de.blahdns.com/dns-query#德国" + - "https://dns.telekom.de/dns-query#德国" + - "https://dns.csaonline.de/dns-query#德国" +fr_dns: &fr_dns + - "https://ns0.fdn.fr/dns-query#法国" + - "https://qlf-doh.inria.fr/dns-query#法国" + - "https://dns.k3nny.fr/dns-query#法国" + - "https://doh.ffmuc.net/dns-query#法国" +jp_dns: &jp_dns + - "https://public.dns.iij.jp/dns-query#日本" + - "https://dns.google/dns-query#日本" +hk_dns: &hk_dns + - "https://dns.cloudflare.com/dns-query#香港" + - "https://doh.opendns.com/dns-query#香港" + - "https://dns.w3ctag.org/dns-query#香港" + - "https://dns.google/dns-query#香港" +mo_dns: &mo_dns + - "https://dns.cloudflare.com/dns-query#澳门" + - "https://doh.opendns.com/dns-query#澳门" + - "https://dns.w3ctag.org/dns-query#澳门" + - "https://dns.google/dns-query#澳门" +tw_dns: &tw_dns + - "https://dns.cloudflare.com/dns-query#台湾" + - "https://doh.opendns.com/dns-query#台湾" + - "https://dns.w3ctag.org/dns-query#台湾" + - "https://dns.google/dns-query#台湾" +sg_dns: &sg_dns + - "https://dns.cloudflare.com/dns-query#新加坡" + - "https://doh.opendns.com/dns-query#新加坡" + - "https://dns.w3ctag.org/dns-query#新加坡" + - "https://dns.google/dns-query#新加坡" +ru_dns: &ru_dns + - "https://dns.ch295.ru/dns-query#俄国" + - "https://dns.yandex.com/dns-query#俄国" + - "https://unfiltered.adguard-dns.com/dns-query#俄国" +in_dns: &in_dns + - "https://dns.gutwe.in/dns-query#印度" + - "https://dns.brahma.world/dns-query#印度" +br_dns: &br_dns + - "https://adguard.frutuozo.com.br/dns-query#巴西" + - "https://dns.google/dns-query#巴西" +ca_dns: &ca_dns + - "https://dns1.dnscrypt.ca/dns-query#加拿大" + - "https://dns.cloudflare.com/dns-query#加拿大" +au_dns: &au_dns + - "https://dns.netraptor.com.au/dns-query#澳大利亚" + - "https://dns.quad9.net/dns-query#澳大利亚" +it_dns: &it_dns + - "https://doh.libredns.gr/dns-query#意大利" +nl_dns: &nl_dns + - "https://doh.nl.ahadns.net/dns-query#荷兰" + - "https://dns.melvin2204.nl/dns-query#荷兰" + - "https://dns.quad9.net/dns-query#荷兰" +se_dns: &se_dns + - "https://dns.mullvad.net/dns-query#瑞典" + - "https://resolver.sunet.se/dns-query#瑞典" + - "https://dns.haka.se/dns-query#瑞典" +ch_dns: &ch_dns + - "https://dns10.quad9.net/dns-query#瑞士" + - "https://doh.immerda.ch/dns-query#瑞士" + - "https://c.cicitt.ch/dns-query#瑞士" + - "https://dns.digitale-gesellschaft.ch/dns-query#瑞士" + - "https://doh.li/dns-query#瑞士" + +dns: + enable: true + listen: *DNSSocket + ipv6: true + enhanced-mode: redir-host + default-nameserver: # proxy-server-nameserver,nameserver-policy,nameserver、fallback域名的解析 + - 223.5.5.5#DNSDNS + - 114.114.114.114#DNSDNS + - 8.8.8.8#DNSDNS + - https://120.53.53.53/dns-query#DNSDNS + - https://223.5.5.5/dns-query#DNSDNS + - https://1.12.12.12/dns-query#DNSDNS + - system + + proxy-server-nameserver: # 节点域名的解析 + - https://120.53.53.53/dns-query#节点直连DNS + - https://223.5.5.5/dns-query#节点直连DNS + - https://1.1.1.1/dns-query#节点直连DNS + - https://dns.google/dns-query#节点直连DNS + - https://1.1.1.1/dns-query#节点国际DNS + - https://dns.google/dns-query#节点国际DNS + + prefer-h3: false + + direct-nameserver-follow-policy: false + direct-nameserver: # [动态回环出口:direct,中国:direct出站]时 + *direct_dns + + respect-rules: true # [中国非direct,其他地区,不出站]时,依据[nameserver-policy,nameserver、fallback]分类,使用不同dns + nameserver-policy: + "rule-set:loopback_classical": *direct_dns #动态回环出口 + "rule-set:firewall_classical": rcode://success #个人文件 + "rule-set:international_classical": *international_dns #个人文件 + "rule-set:domestic_classical": *cn_dns #个人文件 + "rule-set:category-ads-all_classical": rcode://success #广告拦截 + "rule-set:download_domain,bing_domain,openai_domain,github_domain,twitter_domain,instagram_domain,facebook_domain,youtube_domain,netflix_domain,spotify_domain,apple_domain,adobe_domain,telegram_domain,discord_domain,reddit_domain,biliintl_domain,bahamut_domain,ehentai_domain,pixiv_domain,steam_domain,epic_domain,microsoft_domain,google_domain": + *international_dns + #中国 + "+.cn": *cn_dns + #美国 + "+.us": *us_dns + #英国 + "+.uk": *uk_dns + #德国 + "+.de,+.eu": *de_dns + #法国 + "+.fr": *fr_dns + #日本 + "+.jp,+.nico": *jp_dns + #香港 + "+.hk": *hk_dns + #澳门 + "+.mo": *mo_dns + #台湾 + "+.tw": *tw_dns + #新加坡 + "+.sg": *sg_dns + #俄罗斯 + "+.ru": *ru_dns + #印度 + "+.in": *in_dns + #巴西 + "+.br": *br_dns + #加拿大 + "+.ca": *ca_dns + #澳大利亚 + "+.au": *au_dns + #意大利 + "+.it": *it_dns + #荷兰 + "+.nl": *nl_dns + #瑞士 + "+.ch": *ch_dns + #瑞典 + "+.se": *se_dns + #国际 + "rule-set:geolocation-!cn,tld-!cn": *international_dns + "rule-set:cn_domain,private_domain": *cn_dns"#, + ) + .unwrap(); + let mut original = serde_yaml::from_str::( + r#"######### 锚点 start ####### +TroxyInPort: &TroxyInPort 65535 +ShareInPort: &ShareInPort 65534 +# TailscaleOutPort: &TailscaleOutPort 65528 +ReqableOutPort: &ReqableOutPort 9000 +DNSSocket: &DNSSocket 127.0.0.1:65533 +UISocket: &UISocket 127.0.0.1:65532 +direct_dns: &direct_dns + - 114.114.114.114#直连DNS + - https://doh.pub/dns-query#直连DNS + - https://dns.alidns.com/dns-query#直连DNS + - system +cn_dns: &cn_dns + - 114.114.114.114#中国DNS + - https://doh.pub/dns-query#中国DNS + - https://dns.alidns.com/dns-query#中国DNS + - system +international_dns: &international_dns + - "https://dns.cloudflare.com/dns-query#国际DNS" + - "https://doh.opendns.com/dns-query#国际DNS" + - "https://dns.w3ctag.org/dns-query#国际DNS" + - "https://dns.google/dns-query#国际DNS" +us_dns: &us_dns + - "https://dns.koala.us.to/dns-query#美国" + - "https://dns.dns-53.us/dns-query#美国" + - "https://cloudflare-dns.com/dns-query#美国" + - "https://doh.opendns.com/dns-query#美国" + - "https://dns.google/dns-query#美国" +uk_dns: &uk_dns + - "https://dns.aa.net.uk/dns-query#英国" + - "https://princez.uk/dns-query#英国" + - "https://dns.dns-53.uk/dns-query#英国" +de_dns: &de_dns + - "https://doh.ffmuc.net/dns-query#德国" + - "https://dns.dnshome.de/dns-query#德国" + - "https://dnsforge.de/dns-query#德国" + - "https://bahopir188.dnshome.de/dns-query#德国" + - "https://dns.csa-rz.de/dns-query#德国" + - "https://dns.datenquark.de/dns-query#德国" + - "https://doh-de.blahdns.com/dns-query#德国" + - "https://dns.telekom.de/dns-query#德国" + - "https://dns.csaonline.de/dns-query#德国" +fr_dns: &fr_dns + - "https://ns0.fdn.fr/dns-query#法国" + - "https://qlf-doh.inria.fr/dns-query#法国" + - "https://dns.k3nny.fr/dns-query#法国" + - "https://doh.ffmuc.net/dns-query#法国" +jp_dns: &jp_dns + - "https://public.dns.iij.jp/dns-query#日本" + - "https://dns.google/dns-query#日本" +hk_dns: &hk_dns + - "https://dns.cloudflare.com/dns-query#香港" + - "https://doh.opendns.com/dns-query#香港" + - "https://dns.w3ctag.org/dns-query#香港" + - "https://dns.google/dns-query#香港" +mo_dns: &mo_dns + - "https://dns.cloudflare.com/dns-query#澳门" + - "https://doh.opendns.com/dns-query#澳门" + - "https://dns.w3ctag.org/dns-query#澳门" + - "https://dns.google/dns-query#澳门" +tw_dns: &tw_dns + - "https://dns.cloudflare.com/dns-query#台湾" + - "https://doh.opendns.com/dns-query#台湾" + - "https://dns.w3ctag.org/dns-query#台湾" + - "https://dns.google/dns-query#台湾" +sg_dns: &sg_dns + - "https://dns.cloudflare.com/dns-query#新加坡" + - "https://doh.opendns.com/dns-query#新加坡" + - "https://dns.w3ctag.org/dns-query#新加坡" + - "https://dns.google/dns-query#新加坡" +ru_dns: &ru_dns + - "https://dns.ch295.ru/dns-query#俄国" + - "https://dns.yandex.com/dns-query#俄国" + - "https://unfiltered.adguard-dns.com/dns-query#俄国" +in_dns: &in_dns + - "https://dns.gutwe.in/dns-query#印度" + - "https://dns.brahma.world/dns-query#印度" +br_dns: &br_dns + - "https://adguard.frutuozo.com.br/dns-query#巴西" + - "https://dns.google/dns-query#巴西" +ca_dns: &ca_dns + - "https://dns1.dnscrypt.ca/dns-query#加拿大" + - "https://dns.cloudflare.com/dns-query#加拿大" +au_dns: &au_dns + - "https://dns.netraptor.com.au/dns-query#澳大利亚" + - "https://dns.quad9.net/dns-query#澳大利亚" +it_dns: &it_dns + - "https://doh.libredns.gr/dns-query#意大利" +nl_dns: &nl_dns + - "https://doh.nl.ahadns.net/dns-query#荷兰" + - "https://dns.melvin2204.nl/dns-query#荷兰" + - "https://dns.quad9.net/dns-query#荷兰" +se_dns: &se_dns + - "https://dns.mullvad.net/dns-query#瑞典" + - "https://resolver.sunet.se/dns-query#瑞典" + - "https://dns.haka.se/dns-query#瑞典" +ch_dns: &ch_dns + - "https://dns10.quad9.net/dns-query#瑞士" + - "https://doh.immerda.ch/dns-query#瑞士" + - "https://c.cicitt.ch/dns-query#瑞士" + - "https://dns.digitale-gesellschaft.ch/dns-query#瑞士" + - "https://doh.li/dns-query#瑞士" + +dns: + enable: true + listen: *DNSSocket + ipv6: true + enhanced-mode: redir-host + default-nameserver: # proxy-server-nameserver,nameserver-policy,nameserver、fallback域名的解析 + - 223.5.5.5#DNSDNS + - 114.114.114.114#DNSDNS + - 8.8.8.8#DNSDNS + - https://120.53.53.53/dns-query#DNSDNS + - https://223.5.5.5/dns-query#DNSDNS + - https://1.12.12.12/dns-query#DNSDNS + - system + + proxy-server-nameserver: # 节点域名的解析 + - https://120.53.53.53/dns-query#节点直连DNS + - https://223.5.5.5/dns-query#节点直连DNS + - https://1.1.1.1/dns-query#节点直连DNS + - https://dns.google/dns-query#节点直连DNS + - https://1.1.1.1/dns-query#节点国际DNS + - https://dns.google/dns-query#节点国际DNS + + prefer-h3: false + + direct-nameserver-follow-policy: false + direct-nameserver: # [动态回环出口:direct,中国:direct出站]时 + *direct_dns + + respect-rules: true # [中国非direct,其他地区,不出站]时,依据[nameserver-policy,nameserver、fallback]分类,使用不同dns + nameserver-policy: + "rule-set:loopback_classical": *direct_dns #动态回环出口 + "rule-set:firewall_classical": rcode://success #个人文件 + "rule-set:international_classical": *international_dns #个人文件 + "rule-set:domestic_classical": *cn_dns #个人文件 + "rule-set:category-ads-all_classical": rcode://success #广告拦截 + "rule-set:download_domain,bing_domain,openai_domain,github_domain,twitter_domain,instagram_domain,facebook_domain,youtube_domain,netflix_domain,spotify_domain,apple_domain,adobe_domain,telegram_domain,discord_domain,reddit_domain,biliintl_domain,bahamut_domain,ehentai_domain,pixiv_domain,steam_domain,epic_domain,microsoft_domain,google_domain": + *international_dns + #中国 + "+.cn": *cn_dns + #美国 + "+.us": *us_dns + #英国 + "+.uk": *uk_dns + #德国 + "+.de,+.eu": *de_dns + #法国 + "+.fr": *fr_dns + #日本 + "+.jp,+.nico": *jp_dns + #香港 + "+.hk": *hk_dns + #澳门 + "+.mo": *mo_dns + #台湾 + "+.tw": *tw_dns + #新加坡 + "+.sg": *sg_dns + #俄罗斯 + "+.ru": *ru_dns + #印度 + "+.in": *in_dns + #巴西 + "+.br": *br_dns + #加拿大 + "+.ca": *ca_dns + #澳大利亚 + "+.au": *au_dns + #意大利 + "+.it": *it_dns + #荷兰 + "+.nl": *nl_dns + #瑞典 + "+.se": *se_dns + #瑞士 + "+.ch": *ch_dns + #国际 + "rule-set:geolocation-!cn,tld-!cn": *international_dns + "rule-set:cn_domain,private_domain": *cn_dns "#, ) .unwrap(); + original.apply_merge().unwrap(); + target.apply_merge().unwrap(); correct_original_mapping_order(&mut target, &original); - let expected = serde_yaml::from_str::( - r#" - shoud_remove: 123 - proxies: - - 123 - - 12312 - - asdxxx + let mut expected = serde_yaml::from_str::( + r#"######### 锚点 start ####### +TroxyInPort: &TroxyInPort 65535 +ShareInPort: &ShareInPort 65534 +# TailscaleOutPort: &TailscaleOutPort 65528 +ReqableOutPort: &ReqableOutPort 9000 +DNSSocket: &DNSSocket 127.0.0.1:65533 +UISocket: &UISocket 127.0.0.1:65532 +direct_dns: &direct_dns + - 114.114.114.114#直连DNS + - https://doh.pub/dns-query#直连DNS + - https://dns.alidns.com/dns-query#直连DNS + - system +cn_dns: &cn_dns + - 114.114.114.114#中国DNS + - https://doh.pub/dns-query#中国DNS + - https://dns.alidns.com/dns-query#中国DNS + - system +international_dns: &international_dns + - "https://dns.cloudflare.com/dns-query#国际DNS" + - "https://doh.opendns.com/dns-query#国际DNS" + - "https://dns.w3ctag.org/dns-query#国际DNS" + - "https://dns.google/dns-query#国际DNS" +us_dns: &us_dns + - "https://dns.koala.us.to/dns-query#美国" + - "https://dns.dns-53.us/dns-query#美国" + - "https://cloudflare-dns.com/dns-query#美国" + - "https://doh.opendns.com/dns-query#美国" + - "https://dns.google/dns-query#美国" +uk_dns: &uk_dns + - "https://dns.aa.net.uk/dns-query#英国" + - "https://princez.uk/dns-query#英国" + - "https://dns.dns-53.uk/dns-query#英国" +de_dns: &de_dns + - "https://doh.ffmuc.net/dns-query#德国" + - "https://dns.dnshome.de/dns-query#德国" + - "https://dnsforge.de/dns-query#德国" + - "https://bahopir188.dnshome.de/dns-query#德国" + - "https://dns.csa-rz.de/dns-query#德国" + - "https://dns.datenquark.de/dns-query#德国" + - "https://doh-de.blahdns.com/dns-query#德国" + - "https://dns.telekom.de/dns-query#德国" + - "https://dns.csaonline.de/dns-query#德国" +fr_dns: &fr_dns + - "https://ns0.fdn.fr/dns-query#法国" + - "https://qlf-doh.inria.fr/dns-query#法国" + - "https://dns.k3nny.fr/dns-query#法国" + - "https://doh.ffmuc.net/dns-query#法国" +jp_dns: &jp_dns + - "https://public.dns.iij.jp/dns-query#日本" + - "https://dns.google/dns-query#日本" +hk_dns: &hk_dns + - "https://dns.cloudflare.com/dns-query#香港" + - "https://doh.opendns.com/dns-query#香港" + - "https://dns.w3ctag.org/dns-query#香港" + - "https://dns.google/dns-query#香港" +mo_dns: &mo_dns + - "https://dns.cloudflare.com/dns-query#澳门" + - "https://doh.opendns.com/dns-query#澳门" + - "https://dns.w3ctag.org/dns-query#澳门" + - "https://dns.google/dns-query#澳门" +tw_dns: &tw_dns + - "https://dns.cloudflare.com/dns-query#台湾" + - "https://doh.opendns.com/dns-query#台湾" + - "https://dns.w3ctag.org/dns-query#台湾" + - "https://dns.google/dns-query#台湾" +sg_dns: &sg_dns + - "https://dns.cloudflare.com/dns-query#新加坡" + - "https://doh.opendns.com/dns-query#新加坡" + - "https://dns.w3ctag.org/dns-query#新加坡" + - "https://dns.google/dns-query#新加坡" +ru_dns: &ru_dns + - "https://dns.ch295.ru/dns-query#俄国" + - "https://dns.yandex.com/dns-query#俄国" + - "https://unfiltered.adguard-dns.com/dns-query#俄国" +in_dns: &in_dns + - "https://dns.gutwe.in/dns-query#印度" + - "https://dns.brahma.world/dns-query#印度" +br_dns: &br_dns + - "https://adguard.frutuozo.com.br/dns-query#巴西" + - "https://dns.google/dns-query#巴西" +ca_dns: &ca_dns + - "https://dns1.dnscrypt.ca/dns-query#加拿大" + - "https://dns.cloudflare.com/dns-query#加拿大" +au_dns: &au_dns + - "https://dns.netraptor.com.au/dns-query#澳大利亚" + - "https://dns.quad9.net/dns-query#澳大利亚" +it_dns: &it_dns + - "https://doh.libredns.gr/dns-query#意大利" +nl_dns: &nl_dns + - "https://doh.nl.ahadns.net/dns-query#荷兰" + - "https://dns.melvin2204.nl/dns-query#荷兰" + - "https://dns.quad9.net/dns-query#荷兰" +se_dns: &se_dns + - "https://dns.mullvad.net/dns-query#瑞典" + - "https://resolver.sunet.se/dns-query#瑞典" + - "https://dns.haka.se/dns-query#瑞典" +ch_dns: &ch_dns + - "https://dns10.quad9.net/dns-query#瑞士" + - "https://doh.immerda.ch/dns-query#瑞士" + - "https://c.cicitt.ch/dns-query#瑞士" + - "https://dns.digitale-gesellschaft.ch/dns-query#瑞士" + - "https://doh.li/dns-query#瑞士" + +dns: + enable: true + listen: *DNSSocket + ipv6: true + enhanced-mode: redir-host + default-nameserver: # proxy-server-nameserver,nameserver-policy,nameserver、fallback域名的解析 + - 223.5.5.5#DNSDNS + - 114.114.114.114#DNSDNS + - 8.8.8.8#DNSDNS + - https://120.53.53.53/dns-query#DNSDNS + - https://223.5.5.5/dns-query#DNSDNS + - https://1.12.12.12/dns-query#DNSDNS + - system + + proxy-server-nameserver: # 节点域名的解析 + - https://120.53.53.53/dns-query#节点直连DNS + - https://223.5.5.5/dns-query#节点直连DNS + - https://1.1.1.1/dns-query#节点直连DNS + - https://dns.google/dns-query#节点直连DNS + - https://1.1.1.1/dns-query#节点国际DNS + - https://dns.google/dns-query#节点国际DNS + + prefer-h3: false + + direct-nameserver-follow-policy: false + direct-nameserver: # [动态回环出口:direct,中国:direct出站]时 + *direct_dns + + respect-rules: true # [中国非direct,其他地区,不出站]时,依据[nameserver-policy,nameserver、fallback]分类,使用不同dns + nameserver-policy: + "rule-set:loopback_classical": *direct_dns #动态回环出口 + "rule-set:firewall_classical": rcode://success #个人文件 + "rule-set:international_classical": *international_dns #个人文件 + "rule-set:domestic_classical": *cn_dns #个人文件 + "rule-set:category-ads-all_classical": rcode://success #广告拦截 + "rule-set:download_domain,bing_domain,openai_domain,github_domain,twitter_domain,instagram_domain,facebook_domain,youtube_domain,netflix_domain,spotify_domain,apple_domain,adobe_domain,telegram_domain,discord_domain,reddit_domain,biliintl_domain,bahamut_domain,ehentai_domain,pixiv_domain,steam_domain,epic_domain,microsoft_domain,google_domain": + *international_dns + #中国 + "+.cn": *cn_dns + #美国 + "+.us": *us_dns + #英国 + "+.uk": *uk_dns + #德国 + "+.de,+.eu": *de_dns + #法国 + "+.fr": *fr_dns + #日本 + "+.jp,+.nico": *jp_dns + #香港 + "+.hk": *hk_dns + #澳门 + "+.mo": *mo_dns + #台湾 + "+.tw": *tw_dns + #新加坡 + "+.sg": *sg_dns + #俄罗斯 + "+.ru": *ru_dns + #印度 + "+.in": *in_dns + #巴西 + "+.br": *br_dns + #加拿大 + "+.ca": *ca_dns + #澳大利亚 + "+.au": *au_dns + #意大利 + "+.it": *it_dns + #荷兰 + "+.nl": *nl_dns + #瑞典 + "+.se": *se_dns + #瑞士 + "+.ch": *ch_dns + #国际 + "rule-set:geolocation-!cn,tld-!cn": *international_dns + "rule-set:cn_domain,private_domain": *cn_dns "#, ) .unwrap(); + expected.apply_merge().unwrap(); assert_eq!(expected, target); } } diff --git a/clash-nyanpasu/backend/tauri/tauri.conf.json b/clash-nyanpasu/backend/tauri/tauri.conf.json index f890a3fc1b..fe7567930e 100644 --- a/clash-nyanpasu/backend/tauri/tauri.conf.json +++ b/clash-nyanpasu/backend/tauri/tauri.conf.json @@ -46,7 +46,7 @@ "longDescription": "Clash Nyanpasu! (∠・ω< )⌒☆", "macOS": { "frameworks": [], - "minimumSystemVersion": "11.0", + "minimumSystemVersion": "12.6", "exceptionDomain": "", "signingIdentity": null, "entitlements": null diff --git a/clash-nyanpasu/frontend/nyanpasu/package.json b/clash-nyanpasu/frontend/nyanpasu/package.json index f4c36548b9..c4124c12f7 100644 --- a/clash-nyanpasu/frontend/nyanpasu/package.json +++ b/clash-nyanpasu/frontend/nyanpasu/package.json @@ -68,7 +68,7 @@ "@types/react": "18.3.12", "@types/react-dom": "18.3.1", "@types/validator": "13.12.2", - "@vitejs/plugin-legacy": "^5.4.3", + "@vitejs/plugin-legacy": "5.4.3", "@vitejs/plugin-react": "4.3.3", "@vitejs/plugin-react-swc": "3.7.1", "change-case": "5.4.4", @@ -86,7 +86,7 @@ "validator": "13.12.0", "vite": "5.4.10", "vite-plugin-sass-dts": "1.3.29", - "vite-plugin-svgr": "4.2.0", + "vite-plugin-svgr": "4.3.0", "vite-tsconfig-paths": "5.0.1", "zod": "3.23.8" } diff --git a/clash-nyanpasu/manifest/version.json b/clash-nyanpasu/manifest/version.json index bb67b65f2f..2258237c12 100644 --- a/clash-nyanpasu/manifest/version.json +++ b/clash-nyanpasu/manifest/version.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "latest": { - "mihomo": "v1.18.9", + "mihomo": "v1.18.10", "mihomo_alpha": "alpha-3e966e8", "clash_rs": "v0.7.0", "clash_premium": "2023-09-05-gdcc8d87", @@ -69,5 +69,5 @@ "linux-armv7hf": "clash-armv7-unknown-linux-gnueabihf" } }, - "updated_at": "2024-11-02T22:20:39.008Z" + "updated_at": "2024-11-03T22:20:51.763Z" } diff --git a/clash-nyanpasu/pnpm-lock.yaml b/clash-nyanpasu/pnpm-lock.yaml index 37c87453b2..8a0f62c5c5 100644 --- a/clash-nyanpasu/pnpm-lock.yaml +++ b/clash-nyanpasu/pnpm-lock.yaml @@ -166,16 +166,16 @@ importers: version: 2.0.3 ahooks: specifier: 3.8.1 - version: 3.8.1(react@19.0.0-rc-603e6108-20241029) + version: 3.8.1(react@19.0.0-rc-7c8e5e7a-20241101) ofetch: specifier: 1.4.1 version: 1.4.1 react: specifier: rc - version: 19.0.0-rc-603e6108-20241029 + version: 19.0.0-rc-7c8e5e7a-20241101 swr: specifier: 2.2.5 - version: 2.2.5(react@19.0.0-rc-603e6108-20241029) + version: 2.2.5(react@19.0.0-rc-7c8e5e7a-20241101) devDependencies: '@types/react': specifier: npm:types-react@rc @@ -185,16 +185,16 @@ importers: dependencies: '@dnd-kit/core': specifier: 6.1.0 - version: 6.1.0(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029) + version: 6.1.0(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101) '@dnd-kit/sortable': specifier: 8.0.0 - version: 8.0.0(@dnd-kit/core@6.1.0(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029) + version: 8.0.0(@dnd-kit/core@6.1.0(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101) '@dnd-kit/utilities': specifier: 3.2.2 - version: 3.2.2(react@19.0.0-rc-603e6108-20241029) + version: 3.2.2(react@19.0.0-rc-7c8e5e7a-20241101) '@emotion/styled': specifier: 11.13.0 - version: 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) + version: 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) '@juggle/resize-observer': specifier: 3.4.0 version: 3.4.0 @@ -203,13 +203,13 @@ importers: version: 0.3.0 '@mui/icons-material': specifier: 6.1.6 - version: 6.1.6(@mui/material@6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) + version: 6.1.6(@mui/material@6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) '@mui/lab': specifier: 6.0.0-beta.14 - version: 6.0.0-beta.14(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@mui/material@6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) + version: 6.0.0-beta.14(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@mui/material@6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) '@mui/material': specifier: 6.1.6 - version: 6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) + version: 6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) '@nyanpasu/interface': specifier: workspace:^ version: link:../interface @@ -218,7 +218,7 @@ importers: version: link:../ui '@tanstack/router-zod-adapter': specifier: 1.77.8 - version: 1.77.8(@tanstack/react-router@1.77.8(@tanstack/router-generator@1.77.7)(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029))(zod@3.23.8) + version: 1.77.8(@tanstack/react-router@1.77.8(@tanstack/router-generator@1.77.7)(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101))(zod@3.23.8) '@tauri-apps/api': specifier: 2.0.3 version: 2.0.3 @@ -227,10 +227,10 @@ importers: version: 7.0.15 ahooks: specifier: 3.8.1 - version: 3.8.1(react@19.0.0-rc-603e6108-20241029) + version: 3.8.1(react@19.0.0-rc-7c8e5e7a-20241101) allotment: specifier: 1.20.2 - version: 1.20.2(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029) + version: 1.20.2(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101) country-code-emoji: specifier: 2.3.0 version: 2.3.0 @@ -239,58 +239,58 @@ importers: version: 1.11.13 framer-motion: specifier: 12.0.0-alpha.1 - version: 12.0.0-alpha.1(@emotion/is-prop-valid@1.3.0)(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029) + version: 12.0.0-alpha.1(@emotion/is-prop-valid@1.3.0)(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101) i18next: specifier: 23.16.4 version: 23.16.4 jotai: specifier: 2.10.1 - version: 2.10.1(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) + version: 2.10.1(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) json-schema: specifier: 0.4.0 version: 0.4.0 material-react-table: specifier: 3.0.1 - version: 3.0.1(vybetslxtenb2ma2y3xyhpoduy) + version: 3.0.1(aj55layx47tmcqspgfiw576n6a) monaco-editor: specifier: 0.52.0 version: 0.52.0 mui-color-input: specifier: 4.0.2 - version: 4.0.2(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@mui/material@6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) + version: 4.0.2(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@mui/material@6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) react: specifier: rc - version: 19.0.0-rc-603e6108-20241029 + version: 19.0.0-rc-7c8e5e7a-20241101 react-dom: specifier: rc - version: 19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029) + version: 19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101) react-error-boundary: specifier: 4.1.2 - version: 4.1.2(react@19.0.0-rc-603e6108-20241029) + version: 4.1.2(react@19.0.0-rc-7c8e5e7a-20241101) react-fast-marquee: specifier: 1.6.5 - version: 1.6.5(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029) + version: 1.6.5(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101) react-hook-form-mui: specifier: 7.4.0 - version: 7.4.0(lkuz4teyi27zwlpfthwl7u73x4) + version: 7.4.0(5zqd7ykoykgwu464xkenqqb5nu) react-i18next: specifier: 15.1.0 - version: 15.1.0(i18next@23.16.4)(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029) + version: 15.1.0(i18next@23.16.4)(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101) react-markdown: specifier: 9.0.1 - version: 9.0.1(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) + version: 9.0.1(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) react-split-grid: specifier: 1.0.4 - version: 1.0.4(react@19.0.0-rc-603e6108-20241029) + version: 1.0.4(react@19.0.0-rc-7c8e5e7a-20241101) react-use: specifier: 17.5.1 - version: 17.5.1(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029) + version: 17.5.1(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101) swr: specifier: 2.2.5 - version: 2.2.5(react@19.0.0-rc-603e6108-20241029) + version: 2.2.5(react@19.0.0-rc-7c8e5e7a-20241101) virtua: specifier: 0.36.1 - version: 0.36.1(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029) + version: 0.36.1(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101) vite-bundle-visualizer: specifier: 1.2.1 version: 1.2.1(rollup@4.21.0) @@ -303,19 +303,19 @@ importers: version: 11.12.0 '@emotion/react': specifier: 11.13.3 - version: 11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) + version: 11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) '@iconify/json': specifier: 2.2.266 version: 2.2.266 '@monaco-editor/react': specifier: 4.6.0 - version: 4.6.0(monaco-editor@0.52.0)(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029) + version: 4.6.0(monaco-editor@0.52.0)(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101) '@tanstack/react-router': specifier: 1.77.8 - version: 1.77.8(@tanstack/router-generator@1.77.7)(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029) + version: 1.77.8(@tanstack/router-generator@1.77.7)(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101) '@tanstack/router-devtools': specifier: 1.77.8 - version: 1.77.8(@tanstack/react-router@1.77.8(@tanstack/router-generator@1.77.7)(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029))(csstype@3.1.3)(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029) + version: 1.77.8(@tanstack/react-router@1.77.8(@tanstack/router-generator@1.77.7)(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101))(csstype@3.1.3)(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101) '@tanstack/router-plugin': specifier: 1.77.7 version: 1.77.7(vite@5.4.10(@types/node@22.8.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.80.5)(stylus@0.62.0)(terser@5.36.0))(webpack-sources@3.2.3) @@ -353,7 +353,7 @@ importers: specifier: 13.12.2 version: 13.12.2 '@vitejs/plugin-legacy': - specifier: ^5.4.3 + specifier: 5.4.3 version: 5.4.3(terser@5.36.0)(vite@5.4.10(@types/node@22.8.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.80.5)(stylus@0.62.0)(terser@5.36.0)) '@vitejs/plugin-react': specifier: 4.3.3 @@ -407,8 +407,8 @@ importers: specifier: 1.3.29 version: 1.3.29(postcss@8.4.47)(prettier@3.3.3)(sass-embedded@1.78.0)(vite@5.4.10(@types/node@22.8.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.80.5)(stylus@0.62.0)(terser@5.36.0)) vite-plugin-svgr: - specifier: 4.2.0 - version: 4.2.0(rollup@4.21.0)(typescript@5.6.3)(vite@5.4.10(@types/node@22.8.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.80.5)(stylus@0.62.0)(terser@5.36.0)) + specifier: 4.3.0 + version: 4.3.0(rollup@4.21.0)(typescript@5.6.3)(vite@5.4.10(@types/node@22.8.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.80.5)(stylus@0.62.0)(terser@5.36.0)) vite-tsconfig-paths: specifier: 5.0.1 version: 5.0.1(typescript@5.6.3)(vite@5.4.10(@types/node@22.8.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.80.5)(stylus@0.62.0)(terser@5.36.0)) @@ -423,19 +423,19 @@ importers: version: 0.3.0 '@mui/icons-material': specifier: 6.1.6 - version: 6.1.6(@mui/material@6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) + version: 6.1.6(@mui/material@6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) '@mui/lab': specifier: 6.0.0-beta.14 - version: 6.0.0-beta.14(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@mui/material@6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) + version: 6.0.0-beta.14(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@mui/material@6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) '@mui/material': specifier: 6.1.6 - version: 6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) + version: 6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) '@radix-ui/react-portal': specifier: 1.1.2 - version: 1.1.2(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) + version: 1.1.2(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) '@radix-ui/react-scroll-area': specifier: 1.2.0 - version: 1.2.0(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) + version: 1.2.0(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) '@tauri-apps/api': specifier: 2.0.3 version: 2.0.3 @@ -450,28 +450,28 @@ importers: version: 4.3.3(vite@5.4.10(@types/node@22.8.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.80.5)(stylus@0.62.0)(terser@5.36.0)) ahooks: specifier: 3.8.1 - version: 3.8.1(react@19.0.0-rc-603e6108-20241029) + version: 3.8.1(react@19.0.0-rc-7c8e5e7a-20241101) d3: specifier: 7.9.0 version: 7.9.0 framer-motion: specifier: 12.0.0-alpha.1 - version: 12.0.0-alpha.1(@emotion/is-prop-valid@1.3.0)(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029) + version: 12.0.0-alpha.1(@emotion/is-prop-valid@1.3.0)(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101) react: specifier: rc - version: 19.0.0-rc-603e6108-20241029 + version: 19.0.0-rc-7c8e5e7a-20241101 react-dom: specifier: rc - version: 19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029) + version: 19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101) react-error-boundary: specifier: 4.1.2 - version: 4.1.2(react@19.0.0-rc-603e6108-20241029) + version: 4.1.2(react@19.0.0-rc-7c8e5e7a-20241101) react-i18next: specifier: 15.1.0 - version: 15.1.0(i18next@23.16.4)(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029) + version: 15.1.0(i18next@23.16.4)(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101) react-use: specifier: 17.5.1 - version: 17.5.1(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029) + version: 17.5.1(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101) vite: specifier: 5.4.10 version: 5.4.10(@types/node@22.8.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.80.5)(stylus@0.62.0)(terser@5.36.0) @@ -481,7 +481,7 @@ importers: devDependencies: '@emotion/react': specifier: 11.13.3 - version: 11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) + version: 11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) '@types/d3-interpolate-path': specifier: 2.0.3 version: 2.0.3 @@ -602,14 +602,6 @@ packages: resolution: {integrity: sha512-INCKxTtbXtcNbUZ3YXutwMpEleqttcswhAdee7dhuoVrD2cnuc3PqtERBtxkX5nziX9vnBL8WXmSGwv8CuPV6g==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.25.4': - resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.25.7': - resolution: {integrity: sha512-9ickoLz+hcXCeh7jrcin+/SLWm+GkxE2kTvoYyp38p4WkdFXfQJxDFGWp/YHjiKLPx06z2A7W8XKuqbReXDzsw==} - engines: {node: '>=6.9.0'} - '@babel/compat-data@7.26.0': resolution: {integrity: sha512-qETICbZSLe7uXv9VE8T/RWOdIE5qqyTucOt4zLYMafj2MRO271VGgLd4RACJMeBO37UPWhXiKMBk7YlJ0fOzQA==} engines: {node: '>=6.9.0'} @@ -825,14 +817,6 @@ packages: resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.24.8': - resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-option@7.25.7': - resolution: {integrity: sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.25.9': resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} engines: {node: '>=6.9.0'} @@ -1441,8 +1425,8 @@ packages: '@dnd-kit/core@6.1.0': resolution: {integrity: sha512-J3cQBClB4TVxwGo3KEjssGEXNJqGVWx17aRTZ1ob0FliR5IjYgTxl5YJbKTzA6IzrtelotH19v6y7uoIRUZPSg==} peerDependencies: - react: npm:react@rc - react-dom: npm:react-dom@rc + react: '>=16.8.0' + react-dom: '>=16.8.0' '@dnd-kit/sortable@8.0.0': resolution: {integrity: sha512-U3jk5ebVXe1Lr7c2wU7SBZjcWdQP+j7peHJfCspnA81enlu88Mgd7CC8Q+pub9ubP7eKVETzJW+IBAhsqbSu/g==} @@ -1481,7 +1465,7 @@ packages: resolution: {integrity: sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg==} peerDependencies: '@types/react': '*' - react: npm:react@rc + react: '>=16.8.0' peerDependenciesMeta: '@types/react': optional: true @@ -2127,8 +2111,8 @@ packages: moment: ^2.29.4 moment-hijri: ^2.1.2 moment-jalaali: ^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0 - react: npm:react@rc - react-dom: npm:react-dom@rc + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 peerDependenciesMeta: '@emotion/react': optional: true @@ -2342,35 +2326,30 @@ packages: engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - libc: [glibc] '@parcel/watcher-linux-arm64-glibc@2.4.1': resolution: {integrity: sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - libc: [glibc] '@parcel/watcher-linux-arm64-musl@2.4.1': resolution: {integrity: sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - libc: [musl] '@parcel/watcher-linux-x64-glibc@2.4.1': resolution: {integrity: sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - libc: [glibc] '@parcel/watcher-linux-x64-musl@2.4.1': resolution: {integrity: sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - libc: [musl] '@parcel/watcher-win32-arm64@2.4.1': resolution: {integrity: sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==} @@ -2469,8 +2448,8 @@ packages: peerDependencies: '@types/react': npm:types-react@rc '@types/react-dom': npm:types-react-dom@rc - react: npm:react@rc - react-dom: npm:react-dom@rc + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true @@ -2512,7 +2491,7 @@ packages: resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} peerDependencies: '@types/react': npm:types-react@rc - react: npm:react@rc + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true @@ -2526,6 +2505,15 @@ packages: rollup: optional: true + '@rollup/pluginutils@5.1.3': + resolution: {integrity: sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + '@rollup/rollup-android-arm-eabi@4.21.0': resolution: {integrity: sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA==} cpu: [arm] @@ -2550,55 +2538,46 @@ packages: resolution: {integrity: sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA==} cpu: [arm] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.21.0': resolution: {integrity: sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w==} cpu: [arm] os: [linux] - libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.21.0': resolution: {integrity: sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w==} cpu: [arm64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.21.0': resolution: {integrity: sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw==} cpu: [arm64] os: [linux] - libc: [musl] '@rollup/rollup-linux-powerpc64le-gnu@4.21.0': resolution: {integrity: sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg==} cpu: [ppc64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.21.0': resolution: {integrity: sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg==} cpu: [riscv64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-s390x-gnu@4.21.0': resolution: {integrity: sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw==} cpu: [s390x] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.21.0': resolution: {integrity: sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg==} cpu: [x64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-musl@4.21.0': resolution: {integrity: sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==} cpu: [x64] os: [linux] - libc: [musl] '@rollup/rollup-win32-arm64-msvc@4.21.0': resolution: {integrity: sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ==} @@ -2755,28 +2734,24 @@ packages: engines: {node: '>=10'} cpu: [arm64] os: [linux] - libc: [glibc] '@swc/core-linux-arm64-musl@1.7.26': resolution: {integrity: sha512-3w8iZICMkQQON0uIcvz7+Q1MPOW6hJ4O5ETjA0LSP/tuKqx30hIniCGOgPDnv3UTMruLUnQbtBwVCZTBKR3Rkg==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - libc: [musl] '@swc/core-linux-x64-gnu@1.7.26': resolution: {integrity: sha512-c+pp9Zkk2lqb06bNGkR2Looxrs7FtGDMA4/aHjZcCqATgp348hOKH5WPvNLBl+yPrISuWjbKDVn3NgAvfvpH4w==} engines: {node: '>=10'} cpu: [x64] os: [linux] - libc: [glibc] '@swc/core-linux-x64-musl@1.7.26': resolution: {integrity: sha512-PgtyfHBF6xG87dUSSdTJHwZ3/8vWZfNIXQV2GlwEpslrOkGqy+WaiiyE7Of7z9AvDILfBBBcJvJ/r8u980wAfQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] - libc: [musl] '@swc/core-win32-arm64-msvc@1.7.26': resolution: {integrity: sha512-9TNXPIJqFynlAOrRD6tUQjMq7KApSklK3R/tXgIxc7Qx+lWu8hlDQ/kVPLpU7PWvMMwC/3hKBW+p5f+Tms1hmA==} @@ -2933,28 +2908,24 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] '@tauri-apps/cli-linux-arm64-musl@2.0.4': resolution: {integrity: sha512-hntF1V8e3V1hlrESm93PsghDhf3lA5pbvFrRfYxU1c+fVD/jRXGVw8BH3O1lW8MWwhEg1YdhKk01oAgsuHLuig==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] '@tauri-apps/cli-linux-x64-gnu@2.0.4': resolution: {integrity: sha512-Iq1GGJb+oT1T0ZV8izrgf0cBtlzPCJaWcNueRbf1ZXquMf+FSTyQv+/Lo8rq5T6buOIJOH7cAOTuEWWqiCZteg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] '@tauri-apps/cli-linux-x64-musl@2.0.4': resolution: {integrity: sha512-9NTk6Pf0bSwXqCBdAA+PDYts9HeHebZzIo8mbRzRyUbER6QngG5HZb9Ka36Z1QWtJjdRy6uxSb4zb/9NuTeHfA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] '@tauri-apps/cli-win32-arm64-msvc@2.0.4': resolution: {integrity: sha512-OF2e9oxiBFR8A8wVMOhUx9QGN/I1ZkquWC7gVQBnA56nx9PabJlDT08QBy5UD8USqZFVznnfNr2ehlheQahb3g==} @@ -3614,11 +3585,6 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - browserslist@4.24.0: - resolution: {integrity: sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - browserslist@4.24.2: resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -3679,9 +3645,6 @@ packages: caniuse-lite@1.0.30001658: resolution: {integrity: sha512-N2YVqWbJELVdrnsW5p+apoQyYt51aBMSsBZki1XZEfeBCexcM/sf4xiAHcXQBkuOwJBXtWF7aW1sYX6tKebPHw==} - caniuse-lite@1.0.30001667: - resolution: {integrity: sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw==} - caniuse-lite@1.0.30001676: resolution: {integrity: sha512-Qz6zwGCiPghQXGJvgQAem79esjitvJ+CxSbSQkW9H/UX5hg8XM88d4lp2W+MEQ81j+Hip58Il+jGVdazk1z9cw==} @@ -4307,9 +4270,6 @@ packages: electron-to-chromium@1.5.16: resolution: {integrity: sha512-2gQpi2WYobXmz2q23FrOBYTLcI1O/P4heW3eqX+ldmPVDQELRqhiebV380EhlGG12NtnX1qbK/FHpN0ba+7bLA==} - electron-to-chromium@1.5.35: - resolution: {integrity: sha512-hOSRInrIDm0Brzp4IHW2F/VM+638qOL2CzE0DgpnGzKW27C95IqqeqgKz/hxHGnvPxvQGpHUGD5qRVC9EZY2+A==} - electron-to-chromium@1.5.49: resolution: {integrity: sha512-ZXfs1Of8fDb6z7WEYZjXpgIRF6MEu8JdeGA0A40aZq6OQbS+eJpnnV49epZRna2DU/YsEjSQuGtQPPtvt6J65A==} @@ -4721,8 +4681,8 @@ packages: resolution: {integrity: sha512-WpMrDfk6I5Q4T/7+LEjQOVbAD5Yb/cGbbV+LLllFEg+dHi8XZ7QecJ9aYS9bn12cWuF7gGy+uqskyAkGTWHs3w==} peerDependencies: '@emotion/is-prop-valid': '*' - react: npm:react@rc - react-dom: npm:react-dom@rc + react: ^18.0.0 + react-dom: ^18.0.0 peerDependenciesMeta: '@emotion/is-prop-valid': optional: true @@ -6470,10 +6430,10 @@ packages: resolution: {integrity: sha512-B5XGOnOfwH4B7m0chzE1Cv5jlnfbbxF0LoBI+lacQuNj9PMvZ6JS5NCFnDw3zzy7zpOo6leyJNAED8sN3CgLVA==} hasBin: true - react-dom@19.0.0-rc-603e6108-20241029: - resolution: {integrity: sha512-1jaWZcv3V6R39ZnDU3FtGSXtEm/z/lCRFnWmvbp019wPffFGKoXDv+i5KoyQ5yUBpwumImFrKTWXYQluOnm7Jw==} + react-dom@19.0.0-rc-7c8e5e7a-20241101: + resolution: {integrity: sha512-p2d+9xTM1xifv0VJd8WJ6WkdaWKaJfOcVIcHKskgaEic+bktU+SvdSzF5K7KpnUdgU9fZA0EAqurLMyqZaheYg==} peerDependencies: - react: 19.0.0-rc-603e6108-20241029 + react: 19.0.0-rc-7c8e5e7a-20241101 react-error-boundary@4.1.2: resolution: {integrity: sha512-GQDxZ5Jd+Aq/qUxbCm1UtzmL/s++V7zKgE8yMktJiCQXCCFZnMZh9ng+6/Ne6PjNSXH0L9CjeOEREfRnq6Duag==} @@ -6562,8 +6522,8 @@ packages: react: '*' react-dom: '*' - react@19.0.0-rc-603e6108-20241029: - resolution: {integrity: sha512-NXn7GRnAqiL12ZxUJCUjKT5T7jtqHzYp/4moEYZ4Uv0mUhBT4kFbuYQcPSAJTuP67kENUw79DgWfGbqg5qnh1w==} + react@19.0.0-rc-7c8e5e7a-20241101: + resolution: {integrity: sha512-oinEuyXWHxS9R7lfvdXcW1K3KgN9b7QQeKmO3M/mJZVMutvAYotRjiMKZjlEz0XsomWl/JZb4EYIO1JfcltL2w==} engines: {node: '>=0.10.0'} read-cache@1.0.0: @@ -6883,8 +6843,8 @@ packages: sax@1.3.0: resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} - scheduler@0.25.0-rc-603e6108-20241029: - resolution: {integrity: sha512-pFwF6H1XrSdYYNLfOcGlM28/j8CGLu8IvdrxqhjWULe2bPcKiKW4CV+OWqR/9fT52mywx65l7ysNkjLKBda7eA==} + scheduler@0.25.0-rc-7c8e5e7a-20241101: + resolution: {integrity: sha512-6mc2ctXvVbpv4oEFIPjCacS+f+NaydfjptZx+8BK4aFr5WsqwcZYYekwCFnbACkcROBH1yeqOy/WilmCdMKw8A==} screenfull@5.2.0: resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==} @@ -7690,10 +7650,10 @@ packages: sass-embedded: ^1.78.0 vite: '>=3' - vite-plugin-svgr@4.2.0: - resolution: {integrity: sha512-SC7+FfVtNQk7So0XMjrrtLAbEC8qjFPifyD7+fs/E6aaNdVde6umlVVh0QuwDLdOMu7vp5RiGFsB70nj5yo0XA==} + vite-plugin-svgr@4.3.0: + resolution: {integrity: sha512-Jy9qLB2/PyWklpYy0xk0UU3TlU0t2UMpJXZvf+hWII1lAmRHrOUKi11Uw8N3rxoNk7atZNYO3pR3vI1f7oi+6w==} peerDependencies: - vite: ^2.6.0 || 3 || 4 || 5 + vite: '>=2.6.0' vite-tsconfig-paths@5.0.1: resolution: {integrity: sha512-yqwv+LstU7NwPeNqajZzLEBVpUFU6Dugtb2P84FXuvaoYA+/70l9MHE+GYfYAycVyPSDYZ7mjOFuYBRqlEpTig==} @@ -7971,10 +7931,6 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.25.4': {} - - '@babel/compat-data@7.25.7': {} - '@babel/compat-data@7.26.0': {} '@babel/core@7.25.2': @@ -8083,17 +8039,17 @@ snapshots: '@babel/helper-compilation-targets@7.25.2': dependencies: - '@babel/compat-data': 7.25.4 - '@babel/helper-validator-option': 7.24.8 - browserslist: 4.24.0 + '@babel/compat-data': 7.26.0 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.2 lru-cache: 5.1.1 semver: 6.3.1 '@babel/helper-compilation-targets@7.25.7': dependencies: - '@babel/compat-data': 7.25.7 - '@babel/helper-validator-option': 7.25.7 - browserslist: 4.24.0 + '@babel/compat-data': 7.26.0 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.2 lru-cache: 5.1.1 semver: 6.3.1 @@ -8101,7 +8057,7 @@ snapshots: dependencies: '@babel/compat-data': 7.26.0 '@babel/helper-validator-option': 7.25.9 - browserslist: 4.24.0 + browserslist: 4.24.2 lru-cache: 5.1.1 semver: 6.3.1 @@ -8324,10 +8280,6 @@ snapshots: '@babel/helper-validator-identifier@7.25.9': {} - '@babel/helper-validator-option@7.24.8': {} - - '@babel/helper-validator-option@7.25.7': {} - '@babel/helper-validator-option@7.25.9': {} '@babel/helper-wrap-function@7.25.9': @@ -8355,14 +8307,14 @@ snapshots: '@babel/highlight@7.24.7': dependencies: - '@babel/helper-validator-identifier': 7.25.7 + '@babel/helper-validator-identifier': 7.25.9 chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.1.1 '@babel/highlight@7.25.7': dependencies: - '@babel/helper-validator-identifier': 7.25.7 + '@babel/helper-validator-identifier': 7.25.9 chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.1.1 @@ -9103,29 +9055,29 @@ snapshots: '@ctrl/tinycolor@4.1.0': {} - '@dnd-kit/accessibility@3.1.0(react@19.0.0-rc-603e6108-20241029)': + '@dnd-kit/accessibility@3.1.0(react@19.0.0-rc-7c8e5e7a-20241101)': dependencies: - react: 19.0.0-rc-603e6108-20241029 + react: 19.0.0-rc-7c8e5e7a-20241101 tslib: 2.7.0 - '@dnd-kit/core@6.1.0(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)': + '@dnd-kit/core@6.1.0(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)': dependencies: - '@dnd-kit/accessibility': 3.1.0(react@19.0.0-rc-603e6108-20241029) - '@dnd-kit/utilities': 3.2.2(react@19.0.0-rc-603e6108-20241029) - react: 19.0.0-rc-603e6108-20241029 - react-dom: 19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029) + '@dnd-kit/accessibility': 3.1.0(react@19.0.0-rc-7c8e5e7a-20241101) + '@dnd-kit/utilities': 3.2.2(react@19.0.0-rc-7c8e5e7a-20241101) + react: 19.0.0-rc-7c8e5e7a-20241101 + react-dom: 19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101) tslib: 2.7.0 - '@dnd-kit/sortable@8.0.0(@dnd-kit/core@6.1.0(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)': + '@dnd-kit/sortable@8.0.0(@dnd-kit/core@6.1.0(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)': dependencies: - '@dnd-kit/core': 6.1.0(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029) - '@dnd-kit/utilities': 3.2.2(react@19.0.0-rc-603e6108-20241029) - react: 19.0.0-rc-603e6108-20241029 + '@dnd-kit/core': 6.1.0(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101) + '@dnd-kit/utilities': 3.2.2(react@19.0.0-rc-7c8e5e7a-20241101) + react: 19.0.0-rc-7c8e5e7a-20241101 tslib: 2.7.0 - '@dnd-kit/utilities@3.2.2(react@19.0.0-rc-603e6108-20241029)': + '@dnd-kit/utilities@3.2.2(react@19.0.0-rc-7c8e5e7a-20241101)': dependencies: - react: 19.0.0-rc-603e6108-20241029 + react: 19.0.0-rc-7c8e5e7a-20241101 tslib: 2.7.0 '@dual-bundle/import-meta-resolve@4.1.0': {} @@ -9174,17 +9126,17 @@ snapshots: '@emotion/memoize@0.9.0': {} - '@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1)': + '@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.25.6 '@emotion/babel-plugin': 11.12.0 '@emotion/cache': 11.13.1 '@emotion/serialize': 1.3.1 - '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@19.0.0-rc-603e6108-20241029) + '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@19.0.0-rc-7c8e5e7a-20241101) '@emotion/utils': 1.4.0 '@emotion/weak-memoize': 0.4.0 hoist-non-react-statics: 3.3.2 - react: 19.0.0-rc-603e6108-20241029 + react: 19.0.0-rc-7c8e5e7a-20241101 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 @@ -9214,16 +9166,16 @@ snapshots: '@emotion/sheet@1.4.0': {} - '@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1)': + '@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.25.6 '@emotion/babel-plugin': 11.12.0 '@emotion/is-prop-valid': 1.3.0 - '@emotion/react': 11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) + '@emotion/react': 11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) '@emotion/serialize': 1.3.1 - '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@19.0.0-rc-603e6108-20241029) + '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@19.0.0-rc-7c8e5e7a-20241101) '@emotion/utils': 1.4.0 - react: 19.0.0-rc-603e6108-20241029 + react: 19.0.0-rc-7c8e5e7a-20241101 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 @@ -9231,9 +9183,9 @@ snapshots: '@emotion/unitless@0.9.0': {} - '@emotion/use-insertion-effect-with-fallbacks@1.1.0(react@19.0.0-rc-603e6108-20241029)': + '@emotion/use-insertion-effect-with-fallbacks@1.1.0(react@19.0.0-rc-7c8e5e7a-20241101)': dependencies: - react: 19.0.0-rc-603e6108-20241029 + react: 19.0.0-rc-7c8e5e7a-20241101 '@emotion/utils@1.4.0': {} @@ -9416,11 +9368,11 @@ snapshots: '@floating-ui/core': 1.6.1 '@floating-ui/utils': 0.2.2 - '@floating-ui/react-dom@2.1.2(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)': + '@floating-ui/react-dom@2.1.2(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)': dependencies: '@floating-ui/dom': 1.6.5 - react: 19.0.0-rc-603e6108-20241029 - react-dom: 19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029) + react: 19.0.0-rc-7c8e5e7a-20241101 + react-dom: 19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101) '@floating-ui/utils@0.2.2': {} @@ -9551,105 +9503,105 @@ snapshots: monaco-editor: 0.52.0 state-local: 1.0.7 - '@monaco-editor/react@4.6.0(monaco-editor@0.52.0)(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)': + '@monaco-editor/react@4.6.0(monaco-editor@0.52.0)(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)': dependencies: '@monaco-editor/loader': 1.4.0(monaco-editor@0.52.0) monaco-editor: 0.52.0 - react: 19.0.0-rc-603e6108-20241029 - react-dom: 19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029) + react: 19.0.0-rc-7c8e5e7a-20241101 + react-dom: 19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101) - '@mui/base@5.0.0-beta.61(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1)': + '@mui/base@5.0.0-beta.61(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.26.0 - '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029) + '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101) '@mui/types': 7.2.19(types-react@19.0.0-rc.1) - '@mui/utils': 6.1.6(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) + '@mui/utils': 6.1.6(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) '@popperjs/core': 2.11.8 clsx: 2.1.1 prop-types: 15.8.1 - react: 19.0.0-rc-603e6108-20241029 - react-dom: 19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029) + react: 19.0.0-rc-7c8e5e7a-20241101 + react-dom: 19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101) optionalDependencies: '@types/react': types-react@19.0.0-rc.1 '@mui/core-downloads-tracker@6.1.6': {} - '@mui/icons-material@6.1.6(@mui/material@6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1)': + '@mui/icons-material@6.1.6(@mui/material@6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.26.0 - '@mui/material': 6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) - react: 19.0.0-rc-603e6108-20241029 + '@mui/material': 6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) + react: 19.0.0-rc-7c8e5e7a-20241101 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@mui/lab@6.0.0-beta.14(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@mui/material@6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1)': + '@mui/lab@6.0.0-beta.14(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@mui/material@6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.26.0 - '@mui/base': 5.0.0-beta.61(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) - '@mui/material': 6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) - '@mui/system': 6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) + '@mui/base': 5.0.0-beta.61(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) + '@mui/material': 6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) + '@mui/system': 6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) '@mui/types': 7.2.19(types-react@19.0.0-rc.1) - '@mui/utils': 6.1.6(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) + '@mui/utils': 6.1.6(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) clsx: 2.1.1 prop-types: 15.8.1 - react: 19.0.0-rc-603e6108-20241029 - react-dom: 19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029) + react: 19.0.0-rc-7c8e5e7a-20241101 + react-dom: 19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101) optionalDependencies: - '@emotion/react': 11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) + '@emotion/react': 11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) '@types/react': types-react@19.0.0-rc.1 - '@mui/material@6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1)': + '@mui/material@6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.26.0 '@mui/core-downloads-tracker': 6.1.6 - '@mui/system': 6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) + '@mui/system': 6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) '@mui/types': 7.2.19(types-react@19.0.0-rc.1) - '@mui/utils': 6.1.6(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) + '@mui/utils': 6.1.6(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) '@popperjs/core': 2.11.8 '@types/react-transition-group': 4.4.11 clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 - react: 19.0.0-rc-603e6108-20241029 - react-dom: 19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029) + react: 19.0.0-rc-7c8e5e7a-20241101 + react-dom: 19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101) react-is: 18.3.1 - react-transition-group: 4.4.5(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029) + react-transition-group: 4.4.5(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101) optionalDependencies: - '@emotion/react': 11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) + '@emotion/react': 11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) '@types/react': types-react@19.0.0-rc.1 - '@mui/private-theming@5.16.6(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1)': + '@mui/private-theming@5.16.6(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.26.0 - '@mui/utils': 5.16.6(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) + '@mui/utils': 5.16.6(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) prop-types: 15.8.1 - react: 19.0.0-rc-603e6108-20241029 + react: 19.0.0-rc-7c8e5e7a-20241101 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@mui/private-theming@6.1.6(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1)': + '@mui/private-theming@6.1.6(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.26.0 - '@mui/utils': 6.1.6(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) + '@mui/utils': 6.1.6(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) prop-types: 15.8.1 - react: 19.0.0-rc-603e6108-20241029 + react: 19.0.0-rc-7c8e5e7a-20241101 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@mui/styled-engine@5.16.6(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)': + '@mui/styled-engine@5.16.6(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)': dependencies: '@babel/runtime': 7.26.0 '@emotion/cache': 11.13.1 csstype: 3.1.3 prop-types: 15.8.1 - react: 19.0.0-rc-603e6108-20241029 + react: 19.0.0-rc-7c8e5e7a-20241101 optionalDependencies: - '@emotion/react': 11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) + '@emotion/react': 11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) - '@mui/styled-engine@6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)': + '@mui/styled-engine@6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)': dependencies: '@babel/runtime': 7.26.0 '@emotion/cache': 11.13.1 @@ -9657,87 +9609,87 @@ snapshots: '@emotion/sheet': 1.4.0 csstype: 3.1.3 prop-types: 15.8.1 - react: 19.0.0-rc-603e6108-20241029 + react: 19.0.0-rc-7c8e5e7a-20241101 optionalDependencies: - '@emotion/react': 11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) + '@emotion/react': 11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) - '@mui/system@5.16.7(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1)': + '@mui/system@5.16.7(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.26.0 - '@mui/private-theming': 5.16.6(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) - '@mui/styled-engine': 5.16.6(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029) + '@mui/private-theming': 5.16.6(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) + '@mui/styled-engine': 5.16.6(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101) '@mui/types': 7.2.19(types-react@19.0.0-rc.1) - '@mui/utils': 5.16.6(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) + '@mui/utils': 5.16.6(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 - react: 19.0.0-rc-603e6108-20241029 + react: 19.0.0-rc-7c8e5e7a-20241101 optionalDependencies: - '@emotion/react': 11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) + '@emotion/react': 11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) '@types/react': types-react@19.0.0-rc.1 - '@mui/system@6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1)': + '@mui/system@6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.26.0 - '@mui/private-theming': 6.1.6(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) - '@mui/styled-engine': 6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029) + '@mui/private-theming': 6.1.6(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) + '@mui/styled-engine': 6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101) '@mui/types': 7.2.19(types-react@19.0.0-rc.1) - '@mui/utils': 6.1.6(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) + '@mui/utils': 6.1.6(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 - react: 19.0.0-rc-603e6108-20241029 + react: 19.0.0-rc-7c8e5e7a-20241101 optionalDependencies: - '@emotion/react': 11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) + '@emotion/react': 11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) '@types/react': types-react@19.0.0-rc.1 '@mui/types@7.2.19(types-react@19.0.0-rc.1)': optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@mui/utils@5.16.6(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1)': + '@mui/utils@5.16.6(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.26.0 '@mui/types': 7.2.19(types-react@19.0.0-rc.1) '@types/prop-types': 15.7.13 clsx: 2.1.1 prop-types: 15.8.1 - react: 19.0.0-rc-603e6108-20241029 + react: 19.0.0-rc-7c8e5e7a-20241101 react-is: 18.3.1 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@mui/utils@6.1.6(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1)': + '@mui/utils@6.1.6(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.26.0 '@mui/types': 7.2.19(types-react@19.0.0-rc.1) '@types/prop-types': 15.7.13 clsx: 2.1.1 prop-types: 15.8.1 - react: 19.0.0-rc-603e6108-20241029 + react: 19.0.0-rc-7c8e5e7a-20241101 react-is: 18.3.1 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@mui/x-date-pickers@7.9.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@mui/material@6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(dayjs@1.11.13)(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1)': + '@mui/x-date-pickers@7.9.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@mui/material@6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(dayjs@1.11.13)(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.26.0 - '@mui/base': 5.0.0-beta.61(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) - '@mui/material': 6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) - '@mui/system': 5.16.7(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) - '@mui/utils': 5.16.6(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) + '@mui/base': 5.0.0-beta.61(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) + '@mui/material': 6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) + '@mui/system': 5.16.7(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) + '@mui/utils': 5.16.6(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) '@types/react-transition-group': 4.4.11 clsx: 2.1.1 prop-types: 15.8.1 - react: 19.0.0-rc-603e6108-20241029 - react-dom: 19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029) - react-transition-group: 4.4.5(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029) + react: 19.0.0-rc-7c8e5e7a-20241101 + react-dom: 19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101) + react-transition-group: 4.4.5(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101) optionalDependencies: - '@emotion/react': 11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) + '@emotion/react': 11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) dayjs: 1.11.13 transitivePeerDependencies: - '@types/react' @@ -10024,82 +9976,82 @@ snapshots: '@radix-ui/primitive@1.1.0': {} - '@radix-ui/react-compose-refs@1.1.0(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1)': + '@radix-ui/react-compose-refs@1.1.0(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1)': dependencies: - react: 19.0.0-rc-603e6108-20241029 + react: 19.0.0-rc-7c8e5e7a-20241101 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@radix-ui/react-context@1.1.1(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1)': + '@radix-ui/react-context@1.1.1(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1)': dependencies: - react: 19.0.0-rc-603e6108-20241029 + react: 19.0.0-rc-7c8e5e7a-20241101 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@radix-ui/react-direction@1.1.0(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1)': + '@radix-ui/react-direction@1.1.0(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1)': dependencies: - react: 19.0.0-rc-603e6108-20241029 + react: 19.0.0-rc-7c8e5e7a-20241101 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@radix-ui/react-portal@1.1.2(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1)': + '@radix-ui/react-portal@1.1.2(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1)': dependencies: - '@radix-ui/react-primitive': 2.0.0(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) - '@radix-ui/react-use-layout-effect': 1.1.0(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) - react: 19.0.0-rc-603e6108-20241029 - react-dom: 19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029) + '@radix-ui/react-primitive': 2.0.0(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) + '@radix-ui/react-use-layout-effect': 1.1.0(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) + react: 19.0.0-rc-7c8e5e7a-20241101 + react-dom: 19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101) optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@radix-ui/react-presence@1.1.1(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1)': + '@radix-ui/react-presence@1.1.1(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) - '@radix-ui/react-use-layout-effect': 1.1.0(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) - react: 19.0.0-rc-603e6108-20241029 - react-dom: 19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029) + '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) + '@radix-ui/react-use-layout-effect': 1.1.0(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) + react: 19.0.0-rc-7c8e5e7a-20241101 + react-dom: 19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101) optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@radix-ui/react-primitive@2.0.0(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1)': + '@radix-ui/react-primitive@2.0.0(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1)': dependencies: - '@radix-ui/react-slot': 1.1.0(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) - react: 19.0.0-rc-603e6108-20241029 - react-dom: 19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029) + '@radix-ui/react-slot': 1.1.0(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) + react: 19.0.0-rc-7c8e5e7a-20241101 + react-dom: 19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101) optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@radix-ui/react-scroll-area@1.2.0(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1)': + '@radix-ui/react-scroll-area@1.2.0(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1)': dependencies: '@radix-ui/number': 1.1.0 '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) - '@radix-ui/react-context': 1.1.1(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) - '@radix-ui/react-direction': 1.1.0(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) - '@radix-ui/react-presence': 1.1.1(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) - '@radix-ui/react-primitive': 2.0.0(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) - '@radix-ui/react-use-callback-ref': 1.1.0(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) - '@radix-ui/react-use-layout-effect': 1.1.0(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) - react: 19.0.0-rc-603e6108-20241029 - react-dom: 19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029) + '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) + '@radix-ui/react-context': 1.1.1(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) + '@radix-ui/react-direction': 1.1.0(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) + '@radix-ui/react-presence': 1.1.1(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) + '@radix-ui/react-primitive': 2.0.0(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) + '@radix-ui/react-use-callback-ref': 1.1.0(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) + '@radix-ui/react-use-layout-effect': 1.1.0(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) + react: 19.0.0-rc-7c8e5e7a-20241101 + react-dom: 19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101) optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@radix-ui/react-slot@1.1.0(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1)': + '@radix-ui/react-slot@1.1.0(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) - react: 19.0.0-rc-603e6108-20241029 + '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) + react: 19.0.0-rc-7c8e5e7a-20241101 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@radix-ui/react-use-callback-ref@1.1.0(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1)': + '@radix-ui/react-use-callback-ref@1.1.0(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1)': dependencies: - react: 19.0.0-rc-603e6108-20241029 + react: 19.0.0-rc-7c8e5e7a-20241101 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@radix-ui/react-use-layout-effect@1.1.0(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1)': + '@radix-ui/react-use-layout-effect@1.1.0(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1)': dependencies: - react: 19.0.0-rc-603e6108-20241029 + react: 19.0.0-rc-7c8e5e7a-20241101 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 @@ -10111,6 +10063,14 @@ snapshots: optionalDependencies: rollup: 4.21.0 + '@rollup/pluginutils@5.1.3(rollup@4.21.0)': + dependencies: + '@types/estree': 1.0.5 + estree-walker: 2.0.2 + picomatch: 4.0.2 + optionalDependencies: + rollup: 4.21.0 + '@rollup/rollup-android-arm-eabi@4.21.0': optional: true @@ -10230,54 +10190,54 @@ snapshots: ignore: 5.3.2 p-map: 4.0.0 - '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.25.8)': + '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.8 + '@babel/core': 7.26.0 - '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.25.8)': + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.8 + '@babel/core': 7.26.0 - '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.25.8)': + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.8 + '@babel/core': 7.26.0 - '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.25.8)': + '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.8 + '@babel/core': 7.26.0 - '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.25.8)': + '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.8 + '@babel/core': 7.26.0 - '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.25.8)': + '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.8 + '@babel/core': 7.26.0 - '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.25.8)': + '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.8 + '@babel/core': 7.26.0 - '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.25.8)': + '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.8 + '@babel/core': 7.26.0 - '@svgr/babel-preset@8.1.0(@babel/core@7.25.8)': + '@svgr/babel-preset@8.1.0(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.8 - '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.25.8) - '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.25.8) - '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.25.8) - '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.25.8) - '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.25.8) - '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.25.8) - '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.25.8) - '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.25.8) + '@babel/core': 7.26.0 + '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.26.0) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.26.0) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.26.0) + '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.26.0) + '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.26.0) + '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.26.0) + '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.26.0) + '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.26.0) '@svgr/core@8.1.0(typescript@5.6.3)': dependencies: - '@babel/core': 7.25.8 - '@svgr/babel-preset': 8.1.0(@babel/core@7.25.8) + '@babel/core': 7.26.0 + '@svgr/babel-preset': 8.1.0(@babel/core@7.26.0) camelcase: 6.3.0 cosmiconfig: 8.3.6(typescript@5.6.3) snake-case: 3.0.4 @@ -10287,13 +10247,13 @@ snapshots: '@svgr/hast-util-to-babel-ast@8.0.0': dependencies: - '@babel/types': 7.25.8 + '@babel/types': 7.26.0 entities: 4.5.0 '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.6.3))': dependencies: - '@babel/core': 7.25.8 - '@svgr/babel-preset': 8.1.0(@babel/core@7.25.8) + '@babel/core': 7.26.0 + '@svgr/babel-preset': 8.1.0(@babel/core@7.26.0) '@svgr/core': 8.1.0(typescript@5.6.3) '@svgr/hast-util-to-babel-ast': 8.0.0 svg-parser: 2.0.4 @@ -10362,43 +10322,43 @@ snapshots: dependencies: remove-accents: 0.5.0 - '@tanstack/react-router@1.77.8(@tanstack/router-generator@1.77.7)(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)': + '@tanstack/react-router@1.77.8(@tanstack/router-generator@1.77.7)(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)': dependencies: '@tanstack/history': 1.61.1 - '@tanstack/react-store': 0.5.6(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029) - react: 19.0.0-rc-603e6108-20241029 - react-dom: 19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029) + '@tanstack/react-store': 0.5.6(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101) + react: 19.0.0-rc-7c8e5e7a-20241101 + react-dom: 19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 optionalDependencies: '@tanstack/router-generator': 1.77.7 - '@tanstack/react-store@0.5.6(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)': + '@tanstack/react-store@0.5.6(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)': dependencies: '@tanstack/store': 0.5.5 - react: 19.0.0-rc-603e6108-20241029 - react-dom: 19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029) - use-sync-external-store: 1.2.2(react@19.0.0-rc-603e6108-20241029) + react: 19.0.0-rc-7c8e5e7a-20241101 + react-dom: 19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101) + use-sync-external-store: 1.2.2(react@19.0.0-rc-7c8e5e7a-20241101) - '@tanstack/react-table@8.20.5(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)': + '@tanstack/react-table@8.20.5(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)': dependencies: '@tanstack/table-core': 8.20.5 - react: 19.0.0-rc-603e6108-20241029 - react-dom: 19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029) + react: 19.0.0-rc-7c8e5e7a-20241101 + react-dom: 19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101) - '@tanstack/react-virtual@3.10.6(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)': + '@tanstack/react-virtual@3.10.6(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)': dependencies: '@tanstack/virtual-core': 3.10.6 - react: 19.0.0-rc-603e6108-20241029 - react-dom: 19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029) + react: 19.0.0-rc-7c8e5e7a-20241101 + react-dom: 19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101) - '@tanstack/router-devtools@1.77.8(@tanstack/react-router@1.77.8(@tanstack/router-generator@1.77.7)(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029))(csstype@3.1.3)(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)': + '@tanstack/router-devtools@1.77.8(@tanstack/react-router@1.77.8(@tanstack/router-generator@1.77.7)(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101))(csstype@3.1.3)(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)': dependencies: - '@tanstack/react-router': 1.77.8(@tanstack/router-generator@1.77.7)(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029) + '@tanstack/react-router': 1.77.8(@tanstack/router-generator@1.77.7)(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101) clsx: 2.1.1 goober: 2.1.16(csstype@3.1.3) - react: 19.0.0-rc-603e6108-20241029 - react-dom: 19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029) + react: 19.0.0-rc-7c8e5e7a-20241101 + react-dom: 19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101) transitivePeerDependencies: - csstype @@ -10435,9 +10395,9 @@ snapshots: - supports-color - webpack-sources - '@tanstack/router-zod-adapter@1.77.8(@tanstack/react-router@1.77.8(@tanstack/router-generator@1.77.7)(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029))(zod@3.23.8)': + '@tanstack/router-zod-adapter@1.77.8(@tanstack/react-router@1.77.8(@tanstack/router-generator@1.77.7)(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101))(zod@3.23.8)': dependencies: - '@tanstack/react-router': 1.77.8(@tanstack/router-generator@1.77.7)(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029) + '@tanstack/react-router': 1.77.8(@tanstack/router-generator@1.77.7)(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101) zod: 3.23.8 '@tanstack/store@0.5.5': {} @@ -10884,8 +10844,8 @@ snapshots: dependencies: '@babel/core': 7.26.0 '@babel/preset-env': 7.26.0(@babel/core@7.26.0) - browserslist: 4.24.0 - browserslist-to-esbuild: 2.1.1(browserslist@4.24.0) + browserslist: 4.24.2 + browserslist-to-esbuild: 2.1.1(browserslist@4.24.2) core-js: 3.39.0 magic-string: 0.30.12 regenerator-runtime: 0.14.1 @@ -10999,14 +10959,14 @@ snapshots: clean-stack: 5.2.0 indent-string: 5.0.0 - ahooks@3.8.1(react@19.0.0-rc-603e6108-20241029): + ahooks@3.8.1(react@19.0.0-rc-7c8e5e7a-20241101): dependencies: '@babel/runtime': 7.25.6 dayjs: 1.11.13 intersection-observer: 0.12.2 js-cookie: 3.0.5 lodash: 4.17.21 - react: 19.0.0-rc-603e6108-20241029 + react: 19.0.0-rc-7c8e5e7a-20241101 react-fast-compare: 3.2.2 resize-observer-polyfill: 1.5.1 screenfull: 5.2.0 @@ -11048,16 +11008,16 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - allotment@1.20.2(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029): + allotment@1.20.2(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101): dependencies: classnames: 2.5.1 eventemitter3: 5.0.1 lodash.clamp: 4.0.3 lodash.debounce: 4.0.8 lodash.isequal: 4.5.0 - react: 19.0.0-rc-603e6108-20241029 - react-dom: 19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029) - use-resize-observer: 9.1.0(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029) + react: 19.0.0-rc-7c8e5e7a-20241101 + react-dom: 19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101) + use-resize-observer: 9.1.0(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101) ansi-align@2.0.0: dependencies: @@ -11185,7 +11145,7 @@ snapshots: autoprefixer@9.8.8: dependencies: - browserslist: 4.24.0 + browserslist: 4.24.2 caniuse-lite: 1.0.30001658 normalize-range: 0.1.2 num2fraction: 1.2.2 @@ -11280,9 +11240,9 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist-to-esbuild@2.1.1(browserslist@4.24.0): + browserslist-to-esbuild@2.1.1(browserslist@4.24.2): dependencies: - browserslist: 4.24.0 + browserslist: 4.24.2 meow: 13.2.0 browserslist@4.23.0: @@ -11299,13 +11259,6 @@ snapshots: node-releases: 2.0.18 update-browserslist-db: 1.1.0(browserslist@4.23.3) - browserslist@4.24.0: - dependencies: - caniuse-lite: 1.0.30001667 - electron-to-chromium: 1.5.35 - node-releases: 2.0.18 - update-browserslist-db: 1.1.0(browserslist@4.24.0) - browserslist@4.24.2: dependencies: caniuse-lite: 1.0.30001676 @@ -11362,8 +11315,6 @@ snapshots: caniuse-lite@1.0.30001658: {} - caniuse-lite@1.0.30001667: {} - caniuse-lite@1.0.30001676: {} capture-stack-trace@1.0.2: {} @@ -11982,8 +11933,6 @@ snapshots: electron-to-chromium@1.5.16: {} - electron-to-chromium@1.5.35: {} - electron-to-chromium@1.5.49: {} electron@23.3.13: @@ -12579,13 +12528,13 @@ snapshots: fraction.js@4.3.7: {} - framer-motion@12.0.0-alpha.1(@emotion/is-prop-valid@1.3.0)(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029): + framer-motion@12.0.0-alpha.1(@emotion/is-prop-valid@1.3.0)(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101): dependencies: tslib: 2.7.0 optionalDependencies: '@emotion/is-prop-valid': 1.3.0 - react: 19.0.0-rc-603e6108-20241029 - react-dom: 19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029) + react: 19.0.0-rc-7c8e5e7a-20241101 + react-dom: 19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101) fs-extra@11.2.0: dependencies: @@ -13207,10 +13156,10 @@ snapshots: jju@1.4.0: {} - jotai@2.10.1(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1): + jotai@2.10.1(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1): optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - react: 19.0.0-rc-603e6108-20241029 + react: 19.0.0-rc-7c8e5e7a-20241101 js-cookie@2.2.1: {} @@ -13463,19 +13412,19 @@ snapshots: escape-string-regexp: 4.0.0 optional: true - material-react-table@3.0.1(vybetslxtenb2ma2y3xyhpoduy): + material-react-table@3.0.1(aj55layx47tmcqspgfiw576n6a): dependencies: - '@emotion/react': 11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) - '@mui/icons-material': 6.1.6(@mui/material@6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) - '@mui/material': 6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) - '@mui/x-date-pickers': 7.9.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@mui/material@6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(dayjs@1.11.13)(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) + '@emotion/react': 11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) + '@mui/icons-material': 6.1.6(@mui/material@6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) + '@mui/material': 6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) + '@mui/x-date-pickers': 7.9.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@mui/material@6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(dayjs@1.11.13)(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) '@tanstack/match-sorter-utils': 8.19.4 - '@tanstack/react-table': 8.20.5(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029) - '@tanstack/react-virtual': 3.10.6(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029) + '@tanstack/react-table': 8.20.5(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101) + '@tanstack/react-virtual': 3.10.6(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101) highlight-words: 1.2.2 - react: 19.0.0-rc-603e6108-20241029 - react-dom: 19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029) + react: 19.0.0-rc-7c8e5e7a-20241101 + react-dom: 19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101) mathml-tag-names@2.1.3: {} @@ -13810,14 +13759,14 @@ snapshots: muggle-string@0.4.1: {} - mui-color-input@4.0.2(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@mui/material@6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1): + mui-color-input@4.0.2(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@mui/material@6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1): dependencies: '@ctrl/tinycolor': 4.1.0 - '@emotion/react': 11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) - '@mui/material': 6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) - react: 19.0.0-rc-603e6108-20241029 - react-dom: 19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029) + '@emotion/react': 11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) + '@mui/material': 6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) + react: 19.0.0-rc-7c8e5e7a-20241101 + react-dom: 19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101) optionalDependencies: '@types/react': types-react@19.0.0-rc.1 @@ -13827,15 +13776,15 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nano-css@5.6.2(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029): + nano-css@5.6.2(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101): dependencies: '@jridgewell/sourcemap-codec': 1.5.0 css-tree: 1.1.3 csstype: 3.1.3 fastest-stable-stringify: 2.0.2 inline-style-prefixer: 7.0.1 - react: 19.0.0-rc-603e6108-20241029 - react-dom: 19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029) + react: 19.0.0-rc-7c8e5e7a-20241101 + react-dom: 19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101) rtl-css-js: 1.16.1 stacktrace-js: 2.0.2 stylis: 4.3.2 @@ -14376,50 +14325,50 @@ snapshots: - supports-color - utf-8-validate - react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029): + react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101): dependencies: - react: 19.0.0-rc-603e6108-20241029 - scheduler: 0.25.0-rc-603e6108-20241029 + react: 19.0.0-rc-7c8e5e7a-20241101 + scheduler: 0.25.0-rc-7c8e5e7a-20241101 - react-error-boundary@4.1.2(react@19.0.0-rc-603e6108-20241029): + react-error-boundary@4.1.2(react@19.0.0-rc-7c8e5e7a-20241101): dependencies: '@babel/runtime': 7.25.7 - react: 19.0.0-rc-603e6108-20241029 + react: 19.0.0-rc-7c8e5e7a-20241101 react-fast-compare@3.2.2: {} - react-fast-marquee@1.6.5(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029): + react-fast-marquee@1.6.5(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101): dependencies: - react: 19.0.0-rc-603e6108-20241029 - react-dom: 19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029) + react: 19.0.0-rc-7c8e5e7a-20241101 + react-dom: 19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101) - react-hook-form-mui@7.4.0(lkuz4teyi27zwlpfthwl7u73x4): + react-hook-form-mui@7.4.0(5zqd7ykoykgwu464xkenqqb5nu): dependencies: - '@mui/material': 6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) - react: 19.0.0-rc-603e6108-20241029 - react-hook-form: 7.52.1(react@19.0.0-rc-603e6108-20241029) + '@mui/material': 6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) + react: 19.0.0-rc-7c8e5e7a-20241101 + react-hook-form: 7.52.1(react@19.0.0-rc-7c8e5e7a-20241101) optionalDependencies: - '@mui/icons-material': 6.1.6(@mui/material@6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) - '@mui/x-date-pickers': 7.9.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@mui/material@6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1))(dayjs@1.11.13)(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1) + '@mui/icons-material': 6.1.6(@mui/material@6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) + '@mui/x-date-pickers': 7.9.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@mui/material@6.1.6(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1))(dayjs@1.11.13)(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1) - react-hook-form@7.52.1(react@19.0.0-rc-603e6108-20241029): + react-hook-form@7.52.1(react@19.0.0-rc-7c8e5e7a-20241101): dependencies: - react: 19.0.0-rc-603e6108-20241029 + react: 19.0.0-rc-7c8e5e7a-20241101 - react-i18next@15.1.0(i18next@23.16.4)(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029): + react-i18next@15.1.0(i18next@23.16.4)(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101): dependencies: '@babel/runtime': 7.25.7 html-parse-stringify: 3.0.1 i18next: 23.16.4 - react: 19.0.0-rc-603e6108-20241029 + react: 19.0.0-rc-7c8e5e7a-20241101 optionalDependencies: - react-dom: 19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029) + react-dom: 19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101) react-is@16.13.1: {} react-is@18.3.1: {} - react-markdown@9.0.1(react@19.0.0-rc-603e6108-20241029)(types-react@19.0.0-rc.1): + react-markdown@9.0.1(react@19.0.0-rc-7c8e5e7a-20241101)(types-react@19.0.0-rc.1): dependencies: '@types/hast': 3.0.4 '@types/react': types-react@19.0.0-rc.1 @@ -14427,7 +14376,7 @@ snapshots: hast-util-to-jsx-runtime: 2.3.0 html-url-attributes: 3.0.0 mdast-util-to-hast: 13.1.0 - react: 19.0.0-rc-603e6108-20241029 + react: 19.0.0-rc-7c8e5e7a-20241101 remark-parse: 11.0.0 remark-rehype: 11.1.0 unified: 11.0.4 @@ -14438,27 +14387,27 @@ snapshots: react-refresh@0.14.2: {} - react-split-grid@1.0.4(react@19.0.0-rc-603e6108-20241029): + react-split-grid@1.0.4(react@19.0.0-rc-7c8e5e7a-20241101): dependencies: prop-types: 15.8.1 - react: 19.0.0-rc-603e6108-20241029 + react: 19.0.0-rc-7c8e5e7a-20241101 split-grid: 1.0.11 - react-transition-group@4.4.5(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029): + react-transition-group@4.4.5(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101): dependencies: '@babel/runtime': 7.26.0 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 - react: 19.0.0-rc-603e6108-20241029 - react-dom: 19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029) + react: 19.0.0-rc-7c8e5e7a-20241101 + react-dom: 19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101) - react-universal-interface@0.6.2(react@19.0.0-rc-603e6108-20241029)(tslib@2.7.0): + react-universal-interface@0.6.2(react@19.0.0-rc-7c8e5e7a-20241101)(tslib@2.7.0): dependencies: - react: 19.0.0-rc-603e6108-20241029 + react: 19.0.0-rc-7c8e5e7a-20241101 tslib: 2.7.0 - react-use@17.5.1(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029): + react-use@17.5.1(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101): dependencies: '@types/js-cookie': 2.2.7 '@xobotyi/scrollbar-width': 1.9.5 @@ -14466,10 +14415,10 @@ snapshots: fast-deep-equal: 3.1.3 fast-shallow-equal: 1.0.0 js-cookie: 2.2.1 - nano-css: 5.6.2(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029) - react: 19.0.0-rc-603e6108-20241029 - react-dom: 19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029) - react-universal-interface: 0.6.2(react@19.0.0-rc-603e6108-20241029)(tslib@2.7.0) + nano-css: 5.6.2(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101) + react: 19.0.0-rc-7c8e5e7a-20241101 + react-dom: 19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101) + react-universal-interface: 0.6.2(react@19.0.0-rc-7c8e5e7a-20241101)(tslib@2.7.0) resize-observer-polyfill: 1.5.1 screenfull: 5.2.0 set-harmonic-interval: 1.0.1 @@ -14477,7 +14426,7 @@ snapshots: ts-easing: 0.2.0 tslib: 2.7.0 - react@19.0.0-rc-603e6108-20241029: {} + react@19.0.0-rc-7c8e5e7a-20241101: {} read-cache@1.0.0: dependencies: @@ -14799,7 +14748,7 @@ snapshots: sax@1.3.0: {} - scheduler@0.25.0-rc-603e6108-20241029: {} + scheduler@0.25.0-rc-7c8e5e7a-20241101: {} screenfull@5.2.0: {} @@ -15210,11 +15159,11 @@ snapshots: svg-tags@1.0.0: {} - swr@2.2.5(react@19.0.0-rc-603e6108-20241029): + swr@2.2.5(react@19.0.0-rc-7c8e5e7a-20241101): dependencies: client-only: 0.0.1 - react: 19.0.0-rc-603e6108-20241029 - use-sync-external-store: 1.2.2(react@19.0.0-rc-603e6108-20241029) + react: 19.0.0-rc-7c8e5e7a-20241101 + use-sync-external-store: 1.2.2(react@19.0.0-rc-7c8e5e7a-20241101) synckit@0.9.1: dependencies: @@ -15644,12 +15593,6 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 - update-browserslist-db@1.1.0(browserslist@4.24.0): - dependencies: - browserslist: 4.24.0 - escalade: 3.2.0 - picocolors: 1.1.1 - update-browserslist-db@1.1.1(browserslist@4.24.2): dependencies: browserslist: 4.24.2 @@ -15677,15 +15620,15 @@ snapshots: dependencies: prepend-http: 1.0.4 - use-resize-observer@9.1.0(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029): + use-resize-observer@9.1.0(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101): dependencies: '@juggle/resize-observer': 3.4.0 - react: 19.0.0-rc-603e6108-20241029 - react-dom: 19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029) + react: 19.0.0-rc-7c8e5e7a-20241101 + react-dom: 19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101) - use-sync-external-store@1.2.2(react@19.0.0-rc-603e6108-20241029): + use-sync-external-store@1.2.2(react@19.0.0-rc-7c8e5e7a-20241101): dependencies: - react: 19.0.0-rc-603e6108-20241029 + react: 19.0.0-rc-7c8e5e7a-20241101 utf-8-validate@5.0.10: dependencies: @@ -15708,10 +15651,10 @@ snapshots: unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - virtua@0.36.1(react-dom@19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029))(react@19.0.0-rc-603e6108-20241029): + virtua@0.36.1(react-dom@19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101))(react@19.0.0-rc-7c8e5e7a-20241101): optionalDependencies: - react: 19.0.0-rc-603e6108-20241029 - react-dom: 19.0.0-rc-603e6108-20241029(react@19.0.0-rc-603e6108-20241029) + react: 19.0.0-rc-7c8e5e7a-20241101 + react-dom: 19.0.0-rc-7c8e5e7a-20241101(react@19.0.0-rc-7c8e5e7a-20241101) vite-bundle-visualizer@1.2.1(rollup@4.21.0): dependencies: @@ -15750,9 +15693,9 @@ snapshots: sass-embedded: 1.78.0 vite: 5.4.10(@types/node@22.8.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.80.5)(stylus@0.62.0)(terser@5.36.0) - vite-plugin-svgr@4.2.0(rollup@4.21.0)(typescript@5.6.3)(vite@5.4.10(@types/node@22.8.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.80.5)(stylus@0.62.0)(terser@5.36.0)): + vite-plugin-svgr@4.3.0(rollup@4.21.0)(typescript@5.6.3)(vite@5.4.10(@types/node@22.8.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.80.5)(stylus@0.62.0)(terser@5.36.0)): dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.21.0) + '@rollup/pluginutils': 5.1.3(rollup@4.21.0) '@svgr/core': 8.1.0(typescript@5.6.3) '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.6.3)) vite: 5.4.10(@types/node@22.8.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.80.5)(stylus@0.62.0)(terser@5.36.0) diff --git a/geoip/README.md b/geoip/README.md index 43bea759ac..64b8f7bad2 100644 --- a/geoip/README.md +++ b/geoip/README.md @@ -156,7 +156,7 @@ MaxMind 官方版**国家/地区**类型 mmdb 文件: > 适用于 [Clash](https://github.com/Dreamacro/clash)、[mihomo](https://github.com/MetaCubeX/mihomo/tree/Meta)、[Shadowrocket](https://apps.apple.com/us/app/id932747118)、[Quantumult X](https://apps.apple.com/us/app/id1443988620)、[Surge](https://nssurge.com)、[Leaf](https://github.com/eycorsican/leaf)。 -> 适用于 [Nginx](https://nginx.org),需要配合 [ngx_http_geoip2_module](https://github.com/leev/ngx_http_geoip2_module) 模块使用。只保留了 `country` 下的 `iso_code`(两位英文字母表示的国家/地区代码)字段。 +> 适用于 [Nginx](https://nginx.org),需要配合 [ngx_http_geoip2_module](https://github.com/leev/ngx_http_geoip2_module) 模块使用。 - **GeoLite2-Country.mmdb**: - [https://raw.githubusercontent.com/Loyalsoldier/geoip/release/GeoLite2-Country.mmdb](https://raw.githubusercontent.com/Loyalsoldier/geoip/release/GeoLite2-Country.mmdb) @@ -180,7 +180,9 @@ MaxMind 官方版 **ASN** 类型 mmdb 文件: > 适用于 [Clash](https://github.com/Dreamacro/clash)、[mihomo](https://github.com/MetaCubeX/mihomo/tree/Meta)、[Shadowrocket](https://apps.apple.com/us/app/id932747118)、[Quantumult X](https://apps.apple.com/us/app/id1443988620)、[Surge](https://nssurge.com)、[Leaf](https://github.com/eycorsican/leaf)。 -> 适用于 [Nginx](https://nginx.org),需要配合 [ngx_http_geoip2_module](https://github.com/leev/ngx_http_geoip2_module) 模块使用。只保留了 `country` 下的 `iso_code`(两位英文字母表示的国家/地区代码)字段。 +> 适用于 [Nginx](https://nginx.org),需要配合 [ngx_http_geoip2_module](https://github.com/leev/ngx_http_geoip2_module) 模块使用。 + +> **国家/地区**类别保留了 `Continent` 和 `Country` 里的所有字段。**新增类别**和 **geoip:private** 类别只保留了 `Country` 里的 `iso_code`(两位英文字母表示的国家/地区代号)字段。关于 Maxmind 官方 country MMDB 格式文件完整字段,请[查看代码](https://github.com/oschwald/geoip2-golang/blob/576a46d19bb59f32d0215cb43285b8928891b6bc/reader.go#L139-L171)。 - **Country-without-asn.mmdb**(传统版 GeoIP,只包含国家/地区类别,不包含上述新增类别。建议优先使用): - [https://raw.githubusercontent.com/Loyalsoldier/geoip/release/Country-without-asn.mmdb](https://raw.githubusercontent.com/Loyalsoldier/geoip/release/Country-without-asn.mmdb) diff --git a/geoip/config.json b/geoip/config.json index b7352e9f7a..8f4e806a1d 100644 --- a/geoip/config.json +++ b/geoip/config.json @@ -238,6 +238,7 @@ "args": { "outputDir": "./output", "outputName": "Country.mmdb", + "sourceMMDBURI": "./output/GeoLite2-Country.mmdb", "overwriteList": [ "cn", "cloudflare", @@ -259,6 +260,7 @@ "args": { "outputDir": "./output", "outputName": "Country-without-asn.mmdb", + "sourceMMDBURI": "./output/GeoLite2-Country.mmdb", "overwriteList": ["cn", "private"], "excludedList": [ "cloudflare", @@ -279,6 +281,7 @@ "args": { "outputDir": "./output", "outputName": "Country-only-cn-private.mmdb", + "sourceMMDBURI": "./output/GeoLite2-Country.mmdb", "wantedList": ["cn", "private"] } }, diff --git a/geoip/configuration.md b/geoip/configuration.md index ee248607c4..da1bfaaef0 100644 --- a/geoip/configuration.md +++ b/geoip/configuration.md @@ -973,6 +973,7 @@ - **wantedList**:(可选,数组)指定需要输出的类别 - **excludedList**:(可选,数组)指定不需要输出的类别 - **overwriteList**:(可选,数组)指定最后写入的类别(原因见👇) + - **sourceMMDBURI**:(可选)指定用于补全本项目生成的 MMDB 格式文件所缺失的额外信息的 DB-IP 官方 country MMDB 格式文件路径,可为本地文件路径或远程 `http`、`https` 文件 URL(原因见👇) > 由于 DB-IP mmdb 文件格式的限制,当不同列表的 IP 或 CIDR 数据有交集或重复项时,后写入的列表的 IP 或 CIDR 数据会覆盖(overwrite)之前已写入的列表的数据。譬如,IP `1.1.1.1` 同属于列表 `AU` 和列表 `Cloudflare`。如果 `Cloudflare` 在 `AU` 之后写入,则 IP `1.1.1.1` 最终归属于列表 `Cloudflare`。 > @@ -980,6 +981,10 @@ > > `wantedList`、`overwriteList`、`excludedList` 三者中,`excludedList` 优先级最高。即:若设置了选项 `excludedList`,最终不会输出存在于 `excludedList` 中的列表。 +> 由于本项目软件架构的限制,默认输出的 MMDB 格式文件只包含基本信息(`country.iso_code` 字段,即国家/地区两位英文字母代号),不包含其他额外信息(如 IP 或 CIDR 所属的国家/地区多语种名称、所属大洲及大洲多语种名称等)。为了跟官方提供的 MMDB 格式文件保持同样丰富的信息(字段),可通过配置选项 `sourceMMDBURI` 来指定 DB-IP 官方 country MMDB 格式文件路径,为本项目生成的 MMDB 格式文件补全缺失的额外信息。 +> +> 只能补全国家/地区类别的额外信息。新增类别不属于国家/地区类别,不存在于 DB-IP 官方 country MMDB 格式文件中,无法补全。 + ```jsonc // 默认输出目录 ./output/db-ip { @@ -1059,6 +1064,19 @@ } ``` +```jsonc +{ + "type": "dbipCountryMMDB", + "action": "output", + "args": { + "outputName": "Country.mmdb", // 输出文件名为 Country.mmdb + "excludedList": ["private"], // 最终不输出 private 类别 + "overwriteList": ["private" ,"cn", "google"], // 确保 cn、google 类别最后写入,且 google 比 cn 后写入。但由于 private 存在于 excludedList 中,最终不输出 private 类别 + "sourceMMDBURI": "./db-ip/dbip-country-lite.mmdb" // 用于补全生成的 MMDB 格式文件额外信息的 DB-IP 官方 country MMDB 格式文件。由于 private、google 类别不属于国家/地区类别,无法补全额外信息。 + } +} +``` + ### **ipinfoCountryMMDB** - **type**:(必须)输入格式的名称 @@ -1070,6 +1088,7 @@ - **wantedList**:(可选,数组)指定需要输出的类别 - **excludedList**:(可选,数组)指定不需要输出的类别 - **overwriteList**:(可选,数组)指定最后写入的类别(原因见👇) + - **sourceMMDBURI**:(可选)指定用于补全本项目生成的 MMDB 格式文件所缺失的额外信息的 IPInfo 官方 country MMDB 格式文件路径,可为本地文件路径或远程 `http`、`https` 文件 URL(原因见👇) > 由于 IPInfo mmdb 文件格式的限制,当不同列表的 IP 或 CIDR 数据有交集或重复项时,后写入的列表的 IP 或 CIDR 数据会覆盖(overwrite)之前已写入的列表的数据。譬如,IP `1.1.1.1` 同属于列表 `AU` 和列表 `Cloudflare`。如果 `Cloudflare` 在 `AU` 之后写入,则 IP `1.1.1.1` 最终归属于列表 `Cloudflare`。 > @@ -1077,6 +1096,10 @@ > > `wantedList`、`overwriteList`、`excludedList` 三者中,`excludedList` 优先级最高。即:若设置了选项 `excludedList`,最终不会输出存在于 `excludedList` 中的列表。 +> 由于本项目软件架构的限制,默认输出的 MMDB 格式文件只包含基本信息(`country` 字段,即国家/地区两位英文字母代号),不包含其他额外信息(如 IP 或 CIDR 所属的国家/地区多语种名称、所属大洲及大洲多语种名称等)。为了跟官方提供的 MMDB 格式文件保持同样丰富的信息(字段),可通过配置选项 `sourceMMDBURI` 来指定 IPInfo 官方 country MMDB 格式文件路径,为本项目生成的 MMDB 格式文件补全缺失的额外信息。 +> +> 只能补全国家/地区类别的额外信息。新增类别不属于国家/地区类别,不存在于 IPInfo 官方 country MMDB 格式文件中,无法补全。 + ```jsonc // 默认输出目录 ./output/ipinfo { @@ -1156,6 +1179,19 @@ } ``` +```jsonc +{ + "type": "ipinfoCountryMMDB", + "action": "output", + "args": { + "outputName": "Country.mmdb", // 输出文件名为 Country.mmdb + "excludedList": ["private"], // 最终不输出 private 类别 + "overwriteList": ["private" ,"cn", "google"], // 确保 cn、google 类别最后写入,且 google 比 cn 后写入。但由于 private 存在于 excludedList 中,最终不输出 private 类别 + "sourceMMDBURI": "./ipinfo/country.mmdb" // 用于补全生成的 MMDB 格式文件额外信息的 IPInfo 官方 country MMDB 格式文件。由于 private、google 类别不属于国家/地区类别,无法补全额外信息。 + } +} +``` + ### **lookup** - **type**:(必须)输入格式的名称 @@ -1198,6 +1234,7 @@ - **wantedList**:(可选,数组)指定需要输出的类别 - **excludedList**:(可选,数组)指定不需要输出的类别 - **overwriteList**:(可选,数组)指定最后写入的类别(原因见👇) + - **sourceMMDBURI**:(可选)指定用于补全本项目生成的 MMDB 格式文件所缺失的额外信息的 Maxmind 官方 country MMDB 格式文件路径,可为本地文件路径或远程 `http`、`https` 文件 URL(原因见👇) > 由于 MaxMind mmdb 文件格式的限制,当不同列表的 IP 或 CIDR 数据有交集或重复项时,后写入的列表的 IP 或 CIDR 数据会覆盖(overwrite)之前已写入的列表的数据。譬如,IP `1.1.1.1` 同属于列表 `AU` 和列表 `Cloudflare`。如果 `Cloudflare` 在 `AU` 之后写入,则 IP `1.1.1.1` 最终归属于列表 `Cloudflare`。 > @@ -1205,6 +1242,10 @@ > > `wantedList`、`overwriteList`、`excludedList` 三者中,`excludedList` 优先级最高。即:若设置了选项 `excludedList`,最终不会输出存在于 `excludedList` 中的列表。 +> 由于本项目软件架构的限制,默认输出的 MMDB 格式文件只包含基本信息(`country.iso_code` 字段,即国家/地区两位英文字母代号),不包含其他额外信息(如 IP 或 CIDR 所属的国家/地区多语种名称、所属大洲及大洲多语种名称等)。为了跟官方提供的 MMDB 格式文件保持同样丰富的信息(字段),可通过配置选项 `sourceMMDBURI` 来指定 Maxmind 官方 country MMDB 格式文件路径,为本项目生成的 MMDB 格式文件补全缺失的额外信息。 +> +> 只能补全国家/地区类别的额外信息。新增类别不属于国家/地区类别,不存在于 Maxmind 官方 country MMDB 格式文件中,无法补全。 + ```jsonc // 默认输出目录 ./output/maxmind { @@ -1284,6 +1325,19 @@ } ``` +```jsonc +{ + "type": "maxmindMMDB", + "action": "output", + "args": { + "outputName": "Country.mmdb", // 输出文件名为 Country.mmdb + "excludedList": ["private"], // 最终不输出 private 类别 + "overwriteList": ["private" ,"cn", "google"], // 确保 cn、google 类别最后写入,且 google 比 cn 后写入。但由于 private 存在于 excludedList 中,最终不输出 private 类别 + "sourceMMDBURI": "./geolite2/GeoLite2-Country.mmdb" // 用于补全生成的 MMDB 格式文件额外信息的 Maxmind 官方 country MMDB 格式文件。由于 private、google 类别不属于国家/地区类别,无法补全额外信息。 + } +} +``` + ### **mihomoMRS** - **type**:(必须)输入格式的名称 diff --git a/geoip/plugin/maxmind/common_out.go b/geoip/plugin/maxmind/common_out.go index 28b18c3c31..ad5edce645 100644 --- a/geoip/plugin/maxmind/common_out.go +++ b/geoip/plugin/maxmind/common_out.go @@ -2,9 +2,14 @@ package maxmind import ( "encoding/json" + "fmt" + "os" "path/filepath" + "strings" "github.com/Loyalsoldier/geoip/lib" + "github.com/oschwald/geoip2-golang" + "github.com/oschwald/maxminddb-golang" ) var ( @@ -22,6 +27,8 @@ func newMMDBOut(iType string, iDesc string, action lib.Action, data json.RawMess Overwrite []string `json:"overwriteList"` Exclude []string `json:"excludedList"` OnlyIPType lib.IPType `json:"onlyIPType"` + + SourceMMDBURI string `json:"sourceMMDBURI"` } if len(data) > 0 { @@ -57,5 +64,114 @@ func newMMDBOut(iType string, iDesc string, action lib.Action, data json.RawMess Overwrite: tmp.Overwrite, Exclude: tmp.Exclude, OnlyIPType: tmp.OnlyIPType, + + SourceMMDBURI: tmp.SourceMMDBURI, }, nil } + +func (m *MMDBOut) GetExtraInfo() (map[string]interface{}, error) { + if strings.TrimSpace(m.SourceMMDBURI) == "" { + return nil, nil + } + + var content []byte + var err error + switch { + case strings.HasPrefix(strings.ToLower(m.SourceMMDBURI), "http://"), strings.HasPrefix(strings.ToLower(m.SourceMMDBURI), "https://"): + content, err = lib.GetRemoteURLContent(m.SourceMMDBURI) + default: + content, err = os.ReadFile(m.SourceMMDBURI) + } + if err != nil { + return nil, err + } + + db, err := maxminddb.FromBytes(content) + if err != nil { + return nil, err + } + defer db.Close() + + infoList := make(map[string]interface{}) + networks := db.Networks(maxminddb.SkipAliasedNetworks) + for networks.Next() { + switch m.Type { + case TypeMaxmindMMDBOut, TypeDBIPCountryMMDBOut: + var record geoip2.Country + _, err := networks.Network(&record) + if err != nil { + return nil, err + } + + switch { + case strings.TrimSpace(record.Country.IsoCode) != "": + countryCode := strings.ToUpper(strings.TrimSpace(record.Country.IsoCode)) + if _, found := infoList[countryCode]; !found { + infoList[countryCode] = geoip2.Country{ + Continent: record.Continent, + Country: record.Country, + } + } + + case strings.TrimSpace(record.RegisteredCountry.IsoCode) != "": + countryCode := strings.ToUpper(strings.TrimSpace(record.RegisteredCountry.IsoCode)) + if _, found := infoList[countryCode]; !found { + infoList[countryCode] = geoip2.Country{ + Continent: record.Continent, + Country: record.RegisteredCountry, + } + } + + case strings.TrimSpace(record.RepresentedCountry.IsoCode) != "": + countryCode := strings.ToUpper(strings.TrimSpace(record.RepresentedCountry.IsoCode)) + if _, found := infoList[countryCode]; !found { + infoList[countryCode] = geoip2.Country{ + Continent: record.Continent, + Country: struct { + Names map[string]string `maxminddb:"names"` + IsoCode string `maxminddb:"iso_code"` + GeoNameID uint `maxminddb:"geoname_id"` + IsInEuropeanUnion bool `maxminddb:"is_in_european_union"` + }{ + Names: record.RepresentedCountry.Names, + IsoCode: record.RepresentedCountry.IsoCode, + GeoNameID: record.RepresentedCountry.GeoNameID, + IsInEuropeanUnion: record.RepresentedCountry.IsInEuropeanUnion, + }, + } + } + } + + case TypeIPInfoCountryMMDBOut: + record := struct { + Continent string `maxminddb:"continent"` + ContinentName string `maxminddb:"continent_name"` + Country string `maxminddb:"country"` + CountryName string `maxminddb:"country_name"` + }{} + + _, err := networks.Network(&record) + if err != nil { + return nil, err + } + countryCode := strings.ToUpper(strings.TrimSpace(record.Country)) + if _, found := infoList[countryCode]; !found { + infoList[countryCode] = record + } + + default: + return nil, lib.ErrNotSupportedFormat + } + + } + + if networks.Err() != nil { + return nil, networks.Err() + } + + if len(infoList) == 0 { + return nil, fmt.Errorf("❌ [type %s | action %s] no extra info found in the source MMDB file: %s", m.Type, m.Action, m.SourceMMDBURI) + } + + return infoList, nil +} diff --git a/geoip/plugin/maxmind/maxmind_country_mmdb_out.go b/geoip/plugin/maxmind/maxmind_country_mmdb_out.go index 46883f909c..fbcd9b3f52 100644 --- a/geoip/plugin/maxmind/maxmind_country_mmdb_out.go +++ b/geoip/plugin/maxmind/maxmind_country_mmdb_out.go @@ -12,6 +12,7 @@ import ( "github.com/Loyalsoldier/geoip/lib" "github.com/maxmind/mmdbwriter" "github.com/maxmind/mmdbwriter/mmdbtype" + "github.com/oschwald/geoip2-golang" ) const ( @@ -38,6 +39,8 @@ type MMDBOut struct { Overwrite []string Exclude []string OnlyIPType lib.IPType + + SourceMMDBURI string } func (m *MMDBOut) GetType() string { @@ -84,6 +87,12 @@ func (m *MMDBOut) Output(container lib.Container) error { return err } + // Get extra info + extraInfo, err := m.GetExtraInfo() + if err != nil { + return err + } + updated := false for _, name := range m.filterAndSortList(container) { entry, found := container.GetEntry(name) @@ -92,7 +101,7 @@ func (m *MMDBOut) Output(container lib.Container) error { continue } - if err := m.marshalData(writer, entry); err != nil { + if err := m.marshalData(writer, entry, extraInfo); err != nil { return err } @@ -162,7 +171,7 @@ func (m *MMDBOut) filterAndSortList(container lib.Container) []string { return list } -func (m *MMDBOut) marshalData(writer *mmdbwriter.Tree, entry *lib.Entry) error { +func (m *MMDBOut) marshalData(writer *mmdbwriter.Tree, entry *lib.Entry, extraInfo map[string]interface{}) error { var entryCidr []string var err error switch m.OnlyIPType { @@ -178,17 +187,182 @@ func (m *MMDBOut) marshalData(writer *mmdbwriter.Tree, entry *lib.Entry) error { } var record mmdbtype.DataType - switch m.Type { - case TypeMaxmindMMDBOut, TypeDBIPCountryMMDBOut: - record = mmdbtype.Map{ - "country": mmdbtype.Map{ - "iso_code": mmdbtype.String(entry.GetName()), - }, + switch strings.TrimSpace(m.SourceMMDBURI) { + case "": // No need to get extra info + switch m.Type { + case TypeMaxmindMMDBOut, TypeDBIPCountryMMDBOut: + record = mmdbtype.Map{ + "country": mmdbtype.Map{ + "iso_code": mmdbtype.String(entry.GetName()), + }, + } + + case TypeIPInfoCountryMMDBOut: + record = mmdbtype.Map{ + "country": mmdbtype.String(entry.GetName()), + } + + default: + return lib.ErrNotSupportedFormat } - case TypeIPInfoCountryMMDBOut: - record = mmdbtype.Map{ - "country": mmdbtype.String(entry.GetName()), + default: // Get extra info + switch m.Type { + case TypeMaxmindMMDBOut: + info, found := extraInfo[entry.GetName()].(geoip2.Country) + if !found { + log.Printf("⚠️ [type %s | action %s] not found extra info for list %s\n", m.Type, m.Action, entry.GetName()) + + record = mmdbtype.Map{ + "country": mmdbtype.Map{ + "iso_code": mmdbtype.String(entry.GetName()), + }, + } + } else if info.Continent.Code != "" { + record = mmdbtype.Map{ + "continent": mmdbtype.Map{ + "names": mmdbtype.Map{ + "de": mmdbtype.String(info.Continent.Names["de"]), + "en": mmdbtype.String(info.Continent.Names["en"]), + "es": mmdbtype.String(info.Continent.Names["es"]), + "fr": mmdbtype.String(info.Continent.Names["fr"]), + "ja": mmdbtype.String(info.Continent.Names["ja"]), + "pt-BR": mmdbtype.String(info.Continent.Names["pt-BR"]), + "ru": mmdbtype.String(info.Continent.Names["ru"]), + "zh-CN": mmdbtype.String(info.Continent.Names["zh-CN"]), + }, + "code": mmdbtype.String(info.Continent.Code), + "geoname_id": mmdbtype.Uint32(info.Continent.GeoNameID), + }, + "country": mmdbtype.Map{ + "names": mmdbtype.Map{ + "de": mmdbtype.String(info.Country.Names["de"]), + "en": mmdbtype.String(info.Country.Names["en"]), + "es": mmdbtype.String(info.Country.Names["es"]), + "fr": mmdbtype.String(info.Country.Names["fr"]), + "ja": mmdbtype.String(info.Country.Names["ja"]), + "pt-BR": mmdbtype.String(info.Country.Names["pt-BR"]), + "ru": mmdbtype.String(info.Country.Names["ru"]), + "zh-CN": mmdbtype.String(info.Country.Names["zh-CN"]), + }, + "iso_code": mmdbtype.String(entry.GetName()), + "geoname_id": mmdbtype.Uint32(info.Country.GeoNameID), + "is_in_european_union": mmdbtype.Bool(info.Country.IsInEuropeanUnion), + }, + } + } else { + record = mmdbtype.Map{ + "country": mmdbtype.Map{ + "names": mmdbtype.Map{ + "de": mmdbtype.String(info.Country.Names["de"]), + "en": mmdbtype.String(info.Country.Names["en"]), + "es": mmdbtype.String(info.Country.Names["es"]), + "fr": mmdbtype.String(info.Country.Names["fr"]), + "ja": mmdbtype.String(info.Country.Names["ja"]), + "pt-BR": mmdbtype.String(info.Country.Names["pt-BR"]), + "ru": mmdbtype.String(info.Country.Names["ru"]), + "zh-CN": mmdbtype.String(info.Country.Names["zh-CN"]), + }, + "iso_code": mmdbtype.String(entry.GetName()), + "geoname_id": mmdbtype.Uint32(info.Country.GeoNameID), + "is_in_european_union": mmdbtype.Bool(info.Country.IsInEuropeanUnion), + }, + } + } + + case TypeDBIPCountryMMDBOut: + info, found := extraInfo[entry.GetName()].(geoip2.Country) + if !found { + log.Printf("⚠️ [type %s | action %s] not found extra info for list %s\n", m.Type, m.Action, entry.GetName()) + + record = mmdbtype.Map{ + "country": mmdbtype.Map{ + "iso_code": mmdbtype.String(entry.GetName()), + }, + } + } else if info.Continent.Code != "" { + record = mmdbtype.Map{ + "continent": mmdbtype.Map{ + "names": mmdbtype.Map{ + "de": mmdbtype.String(info.Continent.Names["de"]), + "en": mmdbtype.String(info.Continent.Names["en"]), + "es": mmdbtype.String(info.Continent.Names["es"]), + "fa": mmdbtype.String(info.Continent.Names["fa"]), + "fr": mmdbtype.String(info.Continent.Names["fr"]), + "ja": mmdbtype.String(info.Continent.Names["ja"]), + "ko": mmdbtype.String(info.Continent.Names["ko"]), + "pt-BR": mmdbtype.String(info.Continent.Names["pt-BR"]), + "ru": mmdbtype.String(info.Continent.Names["ru"]), + "zh-CN": mmdbtype.String(info.Continent.Names["zh-CN"]), + }, + "code": mmdbtype.String(info.Continent.Code), + "geoname_id": mmdbtype.Uint32(info.Continent.GeoNameID), + }, + "country": mmdbtype.Map{ + "names": mmdbtype.Map{ + "de": mmdbtype.String(info.Country.Names["de"]), + "en": mmdbtype.String(info.Country.Names["en"]), + "es": mmdbtype.String(info.Country.Names["es"]), + "fa": mmdbtype.String(info.Country.Names["fa"]), + "fr": mmdbtype.String(info.Country.Names["fr"]), + "ja": mmdbtype.String(info.Country.Names["ja"]), + "ko": mmdbtype.String(info.Country.Names["ko"]), + "pt-BR": mmdbtype.String(info.Country.Names["pt-BR"]), + "ru": mmdbtype.String(info.Country.Names["ru"]), + "zh-CN": mmdbtype.String(info.Country.Names["zh-CN"]), + }, + "iso_code": mmdbtype.String(entry.GetName()), + "geoname_id": mmdbtype.Uint32(info.Country.GeoNameID), + "is_in_european_union": mmdbtype.Bool(info.Country.IsInEuropeanUnion), + }, + } + } else { + record = mmdbtype.Map{ + "country": mmdbtype.Map{ + "names": mmdbtype.Map{ + "de": mmdbtype.String(info.Country.Names["de"]), + "en": mmdbtype.String(info.Country.Names["en"]), + "es": mmdbtype.String(info.Country.Names["es"]), + "fa": mmdbtype.String(info.Country.Names["fa"]), + "fr": mmdbtype.String(info.Country.Names["fr"]), + "ja": mmdbtype.String(info.Country.Names["ja"]), + "ko": mmdbtype.String(info.Country.Names["ko"]), + "pt-BR": mmdbtype.String(info.Country.Names["pt-BR"]), + "ru": mmdbtype.String(info.Country.Names["ru"]), + "zh-CN": mmdbtype.String(info.Country.Names["zh-CN"]), + }, + "iso_code": mmdbtype.String(entry.GetName()), + "geoname_id": mmdbtype.Uint32(info.Country.GeoNameID), + "is_in_european_union": mmdbtype.Bool(info.Country.IsInEuropeanUnion), + }, + } + } + + case TypeIPInfoCountryMMDBOut: + info, found := extraInfo[entry.GetName()].(struct { + Continent string `maxminddb:"continent"` + ContinentName string `maxminddb:"continent_name"` + Country string `maxminddb:"country"` + CountryName string `maxminddb:"country_name"` + }) + + if !found { + log.Printf("⚠️ [type %s | action %s] not found extra info for list %s\n", m.Type, m.Action, entry.GetName()) + + record = mmdbtype.Map{ + "country": mmdbtype.String(entry.GetName()), + } + } else { + record = mmdbtype.Map{ + "continent": mmdbtype.String(info.Continent), + "continent_name": mmdbtype.String(info.ContinentName), + "country": mmdbtype.String(entry.GetName()), + "country_name": mmdbtype.String(info.CountryName), + } + } + + default: + return lib.ErrNotSupportedFormat } } diff --git a/lede/package/lean/leigod-acc/Makefile b/lede/package/lean/leigod-acc/Makefile index becc1224c1..82ec394995 100644 --- a/lede/package/lean/leigod-acc/Makefile +++ b/lede/package/lean/leigod-acc/Makefile @@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=leigod-acc PKG_VERSION:=1.3.0.30 -PKG_RELEASE:=1 +PKG_RELEASE:=2 include $(INCLUDE_DIR)/package.mk @@ -26,18 +26,32 @@ endef ifeq ($(ARCH),x86_64) acc-arch:=amd64 -endif -ifeq ($(ARCH),mipsel) - acc-arch:=mipsle -endif -ifeq ($(ARCH),arm) - acc-arch:=arm -endif -ifeq ($(ARCH),aarch64) - acc-arch:=arm64 + PKG_HASH:=c26e2cde79ef21991834a94232520d1e5ac2df88a6382cb436a61865a8d9c15e endif +ifeq ($(ARCH),mipsel) + acc-arch:=mipsle + PKG_HASH:=ac35cf6e19fc5028ac1da9921456726a14e0726339e89fe3e14c01a713140e57 +endif + +ifeq ($(ARCH),arm) + acc-arch:=arm + PKG_HASH:=c904bb3f41910d50ae6e8abc1e2a0b73eed6d74fb5c3b55274b82e9d4662a426 +endif + +ifeq ($(ARCH),aarch64) + acc-arch:=arm64 + PKG_HASH:=316a604645f4216276dc5642d5f638a005b342771fb436a3c63826d85c5b5c1b +endif + +PKG_SOURCE_URL:=http://119.3.40.126/router_plugin/ +PKG_SOURCE:=acc-gw.linux.$(acc-arch) + define Build/Prepare + $(call Build/Prepare/Default) + mkdir -p $(PKG_BUILD_DIR)/bin + wget -O $(PKG_BUILD_DIR)/bin/acc-gw.linux.$(acc-arch) $(PKG_SOURCE_URL)$(PKG_SOURCE) + chmod +x $(PKG_BUILD_DIR)/bin/acc-gw.linux.$(acc-arch) endef define Build/Configure @@ -48,7 +62,7 @@ endef define Package/$(PKG_NAME)/install $(INSTALL_DIR) $(1)/usr/sbin/leigod - $(INSTALL_BIN) ./files/acc-gw.linux.$(acc-arch) $(1)/usr/sbin/leigod/acc-gw.linux.$(acc-arch) + $(INSTALL_BIN) $(PKG_BUILD_DIR)/bin/acc-gw.linux.$(acc-arch) $(1)/usr/sbin/leigod/acc-gw.linux.$(acc-arch) $(INSTALL_BIN) ./files/leigod_uninstall.sh $(1)/usr/sbin/leigod/leigod_uninstall.sh $(INSTALL_BIN) ./files/plugin_common.sh $(1)/usr/sbin/leigod/plugin_common.sh $(INSTALL_BIN) ./files/leigod-helper.sh $(1)/usr/sbin/leigod/leigod-helper.sh diff --git a/lede/package/lean/leigod-acc/files/acc-gw.linux.amd64 b/lede/package/lean/leigod-acc/files/acc-gw.linux.amd64 deleted file mode 100644 index d4ddab9020..0000000000 Binary files a/lede/package/lean/leigod-acc/files/acc-gw.linux.amd64 and /dev/null differ diff --git a/lede/package/lean/leigod-acc/files/acc-gw.linux.arm b/lede/package/lean/leigod-acc/files/acc-gw.linux.arm deleted file mode 100644 index 7b72e853dc..0000000000 Binary files a/lede/package/lean/leigod-acc/files/acc-gw.linux.arm and /dev/null differ diff --git a/lede/package/lean/leigod-acc/files/acc-gw.linux.arm64 b/lede/package/lean/leigod-acc/files/acc-gw.linux.arm64 deleted file mode 100644 index 7f9d692663..0000000000 Binary files a/lede/package/lean/leigod-acc/files/acc-gw.linux.arm64 and /dev/null differ diff --git a/lede/package/lean/leigod-acc/files/acc-gw.linux.mipsle b/lede/package/lean/leigod-acc/files/acc-gw.linux.mipsle deleted file mode 100644 index d0fe35884e..0000000000 Binary files a/lede/package/lean/leigod-acc/files/acc-gw.linux.mipsle and /dev/null differ diff --git a/lede/target/linux/mediatek/files-6.6/arch/arm64/boot/dts/mediatek/mt7988a.dtsi b/lede/target/linux/mediatek/files-6.6/arch/arm64/boot/dts/mediatek/mt7988a.dtsi index c894253fed..39f8fd2ab1 100644 --- a/lede/target/linux/mediatek/files-6.6/arch/arm64/boot/dts/mediatek/mt7988a.dtsi +++ b/lede/target/linux/mediatek/files-6.6/arch/arm64/boot/dts/mediatek/mt7988a.dtsi @@ -806,7 +806,7 @@ <&infracfg CLK_INFRA_104M_SPI0>, <&infracfg CLK_INFRA_66M_SPI0_HCK>; clock-names = "parent-clk", "sel-clk", "spi-clk", - "spi-hclk"; + "hclk"; #address-cells = <1>; #size-cells = <0>; status = "disabled"; @@ -817,11 +817,11 @@ reg = <0 0x11008000 0 0x100>; interrupts = ; clocks = <&topckgen CLK_TOP_MPLL_D2>, - <&topckgen CLK_TOP_SPI_SEL>, + <&topckgen CLK_TOP_SPIM_MST_SEL>, <&infracfg CLK_INFRA_104M_SPI1>, <&infracfg CLK_INFRA_66M_SPI1_HCK>; clock-names = "parent-clk", "sel-clk", "spi-clk", - "spi-hclk"; + "hclk"; #address-cells = <1>; #size-cells = <0>; pinctrl-names = "default"; @@ -838,7 +838,7 @@ <&infracfg CLK_INFRA_104M_SPI2_BCK>, <&infracfg CLK_INFRA_66M_SPI2_HCK>; clock-names = "parent-clk", "sel-clk", "spi-clk", - "spi-hclk"; + "hclk"; #address-cells = <1>; #size-cells = <0>; status = "disabled"; diff --git a/lede/target/linux/mediatek/patches-6.6/255-clk-mediatek-mt7988-infracfg-SPI0-clocks-are-not-critical.patch b/lede/target/linux/mediatek/patches-6.6/255-clk-mediatek-mt7988-infracfg-SPI0-clocks-are-not-critical.patch new file mode 100644 index 0000000000..ed3471933c --- /dev/null +++ b/lede/target/linux/mediatek/patches-6.6/255-clk-mediatek-mt7988-infracfg-SPI0-clocks-are-not-critical.patch @@ -0,0 +1,65 @@ +From patchwork Fri Nov 1 03:19:39 2024 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +X-Patchwork-Submitter: Daniel Golle +X-Patchwork-Id: 13858671 +Return-Path: + +Date: Fri, 1 Nov 2024 03:19:39 +0000 +From: Daniel Golle +To: linux-mediatek@lists.infradead.org, linux-arm-kernel@lists.infradead.org, + linux-kernel@vger.kernel.org, linux-clk@vger.kernel.org, Uwe + =?iso-8859-1?q?Kleine-K=F6nig?= , + Sam Shih , Frank Wunderlich , + Daniel Golle , + AngeloGioacchino Del Regno , + Matthias Brugger , Stephen Boyd , + Michael Turquette +Subject: [PATCH] clk: mediatek: mt7988-infracfg: SPI0 clocks are not critical +Message-ID: +MIME-Version: 1.0 +Content-Disposition: inline +X-BeenThere: linux-mediatek@lists.infradead.org +X-Mailman-Version: 2.1.34 +Precedence: list +List-Id: +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +Sender: "Linux-mediatek" +Errors-To: + linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org + +SPI0 clocks have wrongly been marked as critical while, probably due +to the SPI driver not requesting them. This can (and should) be addressed +in device tree instead. +Remove CLK_IS_CRITICAL flag from clocks related to SPI0. + +Fixes: 4b4719437d85 ("clk: mediatek: add drivers for MT7988 SoC") +Signed-off-by: Daniel Golle +--- + drivers/clk/mediatek/clk-mt7988-infracfg.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +--- a/drivers/clk/mediatek/clk-mt7988-infracfg.c ++++ b/drivers/clk/mediatek/clk-mt7988-infracfg.c +@@ -196,12 +196,10 @@ static const struct mtk_gate infra_clks[ + GATE_INFRA2(CLK_INFRA_SPINFI, "infra_f_fspinfi", "spinfi_sel", 10), + GATE_INFRA2_FLAGS(CLK_INFRA_66M_NFI_HCK, "infra_hf_66m_nfi_hck", "sysaxi_sel", 11, + CLK_IS_CRITICAL), +- GATE_INFRA2_FLAGS(CLK_INFRA_104M_SPI0, "infra_hf_104m_spi0", "infra_mux_spi0_sel", 12, +- CLK_IS_CRITICAL), ++ GATE_INFRA2(CLK_INFRA_104M_SPI0, "infra_hf_104m_spi0", "infra_mux_spi0_sel", 12), + GATE_INFRA2(CLK_INFRA_104M_SPI1, "infra_hf_104m_spi1", "infra_mux_spi1_sel", 13), + GATE_INFRA2(CLK_INFRA_104M_SPI2_BCK, "infra_hf_104m_spi2_bck", "infra_mux_spi2_sel", 14), +- GATE_INFRA2_FLAGS(CLK_INFRA_66M_SPI0_HCK, "infra_hf_66m_spi0_hck", "sysaxi_sel", 15, +- CLK_IS_CRITICAL), ++ GATE_INFRA2(CLK_INFRA_66M_SPI0_HCK, "infra_hf_66m_spi0_hck", "sysaxi_sel", 15), + GATE_INFRA2(CLK_INFRA_66M_SPI1_HCK, "infra_hf_66m_spi1_hck", "sysaxi_sel", 16), + GATE_INFRA2(CLK_INFRA_66M_SPI2_HCK, "infra_hf_66m_spi2_hck", "sysaxi_sel", 17), + GATE_INFRA2(CLK_INFRA_66M_FLASHIF_AXI, "infra_hf_66m_flashif_axi", "sysaxi_sel", 18), diff --git a/mihomo/component/mmdb/reader.go b/mihomo/component/mmdb/reader.go index e76e993986..42e500c9dc 100644 --- a/mihomo/component/mmdb/reader.go +++ b/mihomo/component/mmdb/reader.go @@ -5,6 +5,7 @@ import ( "net" "strings" + "github.com/metacubex/mihomo/log" "github.com/oschwald/maxminddb-golang" ) @@ -23,11 +24,16 @@ type ASNReader struct { *maxminddb.Reader } -type ASNResult struct { +type GeoLite2 struct { AutonomousSystemNumber uint32 `maxminddb:"autonomous_system_number"` AutonomousSystemOrganization string `maxminddb:"autonomous_system_organization"` } +type IPInfo struct { + ASN string `maxminddb:"asn"` + Name string `maxminddb:"name"` +} + func (r IPReader) LookupCode(ipAddress net.IP) []string { switch r.databaseType { case typeMaxmind: @@ -66,8 +72,18 @@ func (r IPReader) LookupCode(ipAddress net.IP) []string { } } -func (r ASNReader) LookupASN(ip net.IP) ASNResult { - var result ASNResult - r.Lookup(ip, &result) - return result +func (r ASNReader) LookupASN(ip net.IP) (string, string) { + switch r.Metadata.DatabaseType { + case "GeoLite2-ASN", "DBIP-ASN-Lite (compat=GeoLite2-ASN)": + var result GeoLite2 + _ = r.Lookup(ip, &result) + return fmt.Sprint(result.AutonomousSystemNumber), result.AutonomousSystemOrganization + case "ipinfo generic_asn_free.mmdb": + var result IPInfo + _ = r.Lookup(ip, &result) + return result.ASN[2:], result.Name + default: + log.Warnln("Unsupported ASN type: %s", r.Metadata.DatabaseType) + } + return "", "" } diff --git a/mihomo/rules/common/ipasn.go b/mihomo/rules/common/ipasn.go index 813923ac1f..7d554103f3 100644 --- a/mihomo/rules/common/ipasn.go +++ b/mihomo/rules/common/ipasn.go @@ -1,8 +1,6 @@ package common import ( - "strconv" - "github.com/metacubex/mihomo/component/geodata" "github.com/metacubex/mihomo/component/mmdb" C "github.com/metacubex/mihomo/constant" @@ -26,17 +24,14 @@ func (a *ASN) Match(metadata *C.Metadata) (bool, string) { return false, "" } - result := mmdb.ASNInstance().LookupASN(ip.AsSlice()) - asnNumber := strconv.FormatUint(uint64(result.AutonomousSystemNumber), 10) - ipASN := asnNumber + " " + result.AutonomousSystemOrganization + asn, aso := mmdb.ASNInstance().LookupASN(ip.AsSlice()) if a.isSourceIP { - metadata.SrcIPASN = ipASN + metadata.SrcIPASN = asn + " " + aso } else { - metadata.DstIPASN = ipASN + metadata.DstIPASN = asn + " " + aso } - match := a.asn == asnNumber - return match, a.adapter + return a.asn == asn, a.adapter } func (a *ASN) RuleType() C.RuleType { diff --git a/openwrt-passwall/luci-app-passwall/Makefile b/openwrt-passwall/luci-app-passwall/Makefile index 3a668e2ffd..db3778313e 100644 --- a/openwrt-passwall/luci-app-passwall/Makefile +++ b/openwrt-passwall/luci-app-passwall/Makefile @@ -174,6 +174,12 @@ define Package/$(PKG_NAME)/conffiles /www/luci-static/resources/qrcode.min.js endef +define Package/$(PKG_NAME)/postrm +#!/bin/sh +rm -f $${IPKG_INSTROOT}/usr/share/passwall/rules/*.nft +exit 0 +endef + include $(TOPDIR)/feeds/luci/luci.mk # call BuildPackage - OpenWrt buildroot signature diff --git a/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/app.sh b/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/app.sh index 49d2ad575e..406ccab923 100755 --- a/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/app.sh +++ b/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/app.sh @@ -544,141 +544,18 @@ run_dns2socks() { run_chinadns_ng() { local _flag _listen_port _dns_local _dns_trust _no_ipv6_trust _use_direct_list _use_proxy_list _gfwlist _chnlist _default_mode _default_tag + local _extra_param="" eval_set_val $@ - lua $APP_PATH/helper_chinadns_add.lua -FLAG $_flag -USE_DIRECT_LIST $_use_direct_list -USE_PROXY_LIST $_use_proxy_list - local _CONF_FILE=$TMP_ACL_PATH/$_flag/chinadns_ng.conf local _LOG_FILE=$TMP_ACL_PATH/$_flag/chinadns_ng.log _LOG_FILE="/dev/null" - cat <<-EOF > ${_CONF_FILE} - verbose - bind-addr 127.0.0.1 - bind-port ${_listen_port} - china-dns ${_dns_local} - trust-dns ${_dns_trust} - filter-qtype 65 - EOF - - # This function may be called multiple times, so add a condition here to avoid repeated execution. - [ ! -f "${TMP_PATH}/vpslist" ] && { - servers=$(uci show "${CONFIG}" | grep ".address=" | cut -d "'" -f 2 | grep -v "engage.cloudflareclient.com") - hosts_foreach "servers" host_from_url | grep '[a-zA-Z]$' | sort -u > "${TMP_PATH}/vpslist" - } - [ -s "${TMP_PATH}/vpslist" ] && { - local vpslist4_set="passwall_vpslist" - local vpslist6_set="passwall_vpslist6" - [ "$nftflag" = "1" ] && { - vpslist4_set="inet@passwall@${vpslist4_set}" - vpslist6_set="inet@passwall@${vpslist6_set}" - } - cat <<-EOF >> ${_CONF_FILE} - group vpslist - group-dnl ${TMP_PATH}/vpslist - group-upstream ${_dns_local} - group-ipset ${vpslist4_set},${vpslist6_set} - EOF - } - - [ "${_use_direct_list}" = "1" ] && [ -s "${TMP_PATH}/direct_host" ] && { - local whitelist4_set="passwall_whitelist" - local whitelist6_set="passwall_whitelist6" - [ "$nftflag" = "1" ] && { - whitelist4_set="inet@passwall@${whitelist4_set}" - whitelist6_set="inet@passwall@${whitelist6_set}" - } - cat <<-EOF >> ${_CONF_FILE} - group directlist - group-dnl ${TMP_PATH}/direct_host - group-upstream ${_dns_local} - group-ipset ${whitelist4_set},${whitelist6_set} - EOF - } - - [ "${_use_proxy_list}" = "1" ] && [ -s "${TMP_PATH}/proxy_host" ] && { - local blacklist4_set="passwall_blacklist" - local blacklist6_set="passwall_blacklist6" - [ "$nftflag" = "1" ] && { - blacklist4_set="inet@passwall@${blacklist4_set}" - blacklist6_set="inet@passwall@${blacklist6_set}" - } - cat <<-EOF >> ${_CONF_FILE} - group proxylist - group-dnl ${TMP_PATH}/proxy_host - group-upstream ${_dns_trust} - group-ipset ${blacklist4_set},${blacklist6_set} - EOF - [ "${_no_ipv6_trust}" = "1" ] && echo "no-ipv6 tag:proxylist" >> ${_CONF_FILE} - } - - [ "${_gfwlist}" = "1" ] && [ -s "${RULES_PATH}/gfwlist" ] && { - local gfwlist4_set="passwall_gfwlist" - local gfwlist6_set="passwall_gfwlist6" - [ "$nftflag" = "1" ] && { - gfwlist4_set="inet@passwall@${gfwlist4_set}" - gfwlist6_set="inet@passwall@${gfwlist6_set}" - } - cat <<-EOF >> ${_CONF_FILE} - gfwlist-file ${RULES_PATH}/gfwlist - add-taggfw-ip ${gfwlist4_set},${gfwlist6_set} - EOF - [ "${_no_ipv6_trust}" = "1" ] && echo "no-ipv6 tag:gfw" >> ${_CONF_FILE} - } - - [ "${_chnlist}" != "0" ] && [ -s "${RULES_PATH}/chnlist" ] && { - local chnroute4_set="passwall_chnroute" - local chnroute6_set="passwall_chnroute6" - [ "$nftflag" = "1" ] && { - chnroute4_set="inet@passwall@${chnroute4_set}" - chnroute6_set="inet@passwall@${chnroute6_set}" - } - - [ "${_chnlist}" = "direct" ] && { - cat <<-EOF >> ${_CONF_FILE} - chnlist-file ${RULES_PATH}/chnlist - ipset-name4 ${chnroute4_set} - ipset-name6 ${chnroute6_set} - add-tagchn-ip - chnlist-first - EOF - } - - #回中国模式 - [ "${_chnlist}" = "proxy" ] && { - cat <<-EOF >> ${_CONF_FILE} - group chn_proxy - group-dnl ${RULES_PATH}/chnlist - group-upstream ${_dns_trust} - group-ipset ${chnroute4_set},${chnroute6_set} - EOF - [ "${_no_ipv6_trust}" = "1" ] && echo "no-ipv6 tag:chn_proxy" >> ${_CONF_FILE} - } - } - - #只使用gfwlist模式,GFW列表以外的域名及默认使用本地DNS - [ "${_gfwlist}" = "1" ] && [ "${_chnlist}" = "0" ] && _default_tag="chn" - #回中国模式,中国列表以外的域名及默认使用本地DNS - [ "${_chnlist}" = "proxy" ] && _default_tag="chn" - #全局模式,默认使用远程DNS - [ "${_default_mode}" = "proxy" ] && [ "${_chnlist}" = "0" ] && [ "${_gfwlist}" = "0" ] && { - _default_tag="gfw" - [ "${_no_ipv6_trust}" = "1" ] && echo "no-ipv6" >> ${_CONF_FILE} - } - - # 是否接受直连 DNS 空响应 - [ "${_default_tag}" = "none_noip" ] && echo "noip-as-chnip" >> ${_CONF_FILE} - - ([ -z "${_default_tag}" ] || [ "${_default_tag}" = "smart" ] || [ "${_default_tag}" = "none_noip" ]) && _default_tag="none" - echo "default-tag ${_default_tag}" >> ${_CONF_FILE} - - echo "cache 4096" >> ${_CONF_FILE} - echo "cache-stale 3600" >> ${_CONF_FILE} - - [ "${_flag}" = "default" ] && [ "${_default_tag}" = "none" ] && { - echo "verdict-cache 5000" >> ${_CONF_FILE} - } + _extra_param="-FLAG ${_flag} -LISTEN_PORT ${_listen_port} -DNS_LOCAL ${_dns_local} -DNS_TRUST ${_dns_trust}" + _extra_param="${_extra_param} -USE_DIRECT_LIST ${_use_direct_list} -USE_PROXY_LIST ${_use_proxy_list} -GFWLIST ${_gfwlist} -CHNLIST ${_chnlist}" + _extra_param="${_extra_param} -NO_IPV6_TRUST ${_no_ipv6_trust} -DEFAULT_MODE ${_default_mode} -DEFAULT_TAG ${_default_tag} -NFTFLAG ${nftflag}" + lua $APP_PATH/helper_chinadns_add.lua ${_extra_param} > ${_CONF_FILE} ln_run "$(first_type chinadns-ng)" chinadns-ng "${_LOG_FILE}" -C ${_CONF_FILE} } diff --git a/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/helper_chinadns_add.lua b/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/helper_chinadns_add.lua index b45ad507b6..e4a7354208 100644 --- a/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/helper_chinadns_add.lua +++ b/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/helper_chinadns_add.lua @@ -1,50 +1,206 @@ -require 'nixio' +local sys = require "luci.sys" local api = require "luci.passwall.api" local appname = "passwall" local var = api.get_args(arg) local FLAG = var["-FLAG"] +local LISTEN_PORT = var["-LISTEN_PORT"] +local DNS_LOCAL = var["-DNS_LOCAL"] +local DNS_TRUST = var["-DNS_TRUST"] local USE_DIRECT_LIST = var["-USE_DIRECT_LIST"] local USE_PROXY_LIST = var["-USE_PROXY_LIST"] +local GFWLIST = var["-GFWLIST"] +local CHNLIST = var["-CHNLIST"] +local NO_IPV6_TRUST = var["-NO_IPV6_TRUST"] +local DEFAULT_MODE = var["-DEFAULT_MODE"] +local DEFAULT_TAG = var["-DEFAULT_TAG"] +local NFTFLAG = var["-NFTFLAG"] + +local uci = api.uci +local sys = api.sys +local fs = api.fs +local datatypes = api.datatypes local TMP_PATH = "/tmp/etc/" .. appname +local TMP_ACL_PATH = TMP_PATH .. "/acl" +local RULES_PATH = "/usr/share/" .. appname .. "/rules" +local config_lines = {} +local tmp_lines = {} -if not nixio.fs.access(TMP_PATH) then - nixio.fs.mkdir(TMP_PATH, 493) +local function is_file_nonzero(path) + if path and #path > 1 then + if sys.exec('[ -s "%s" ] && echo -n 1' % path) == "1" then + return true + end + end + return nil end -local tmp_direct_host = TMP_PATH .. "/direct_host" -if USE_DIRECT_LIST == "1" and not nixio.fs.access(tmp_direct_host) then +local function merge_array(lines1, lines2) + for i, line in ipairs(lines2) do + table.insert(lines1, #lines1 + 1, line) + end +end + +if not fs.access(TMP_ACL_PATH) then + fs.mkdir(TMP_ACL_PATH, 493) +end + +local setflag= (NFTFLAG == "1") and "inet@passwall@" or "" + +config_lines = { + --"verbose", + "bind-addr 127.0.0.1", + "bind-port " .. LISTEN_PORT, + "china-dns " .. DNS_LOCAL, + "trust-dns " .. DNS_TRUST, + "filter-qtype 65" +} + +--始终用国内DNS解析节点域名 +local file_vpslist = TMP_ACL_PATH .. "/vpslist" +if not is_file_nonzero(file_vpslist) then + local vpslist_out = io.open(file_vpslist, "w") + uci:foreach(appname, "nodes", function(t) + local address = t.address + if address == "engage.cloudflareclient.com" then return end + if datatypes.hostname(address) then + vpslist_out:write(address .. "\n") + end + end) + vpslist_out:close() +end +if is_file_nonzero(file_vpslist) then + tmp_lines = { + "group vpslist", + "group-dnl " .. file_vpslist, + "group-upstream " .. DNS_LOCAL, + "group-ipset " .. setflag .. "passwall_vpslist," .. setflag .. "passwall_vpslist6" + } + merge_array(config_lines, tmp_lines) +end + +--直连(白名单)列表 +local file_direct_host = TMP_ACL_PATH .. "/direct_host" +if USE_DIRECT_LIST == "1" and not fs.access(file_direct_host) then --对自定义列表进行清洗 local direct_domain = {} - for line in io.lines("/usr/share/passwall/rules/direct_host") do + for line in io.lines(RULES_PATH .. "/direct_host") do line = api.get_std_domain(line) if line ~= "" and not line:find("#") then table.insert(direct_domain, line) end end if #direct_domain > 0 then - local direct_out = io.open(tmp_direct_host, "a") + local direct_out = io.open(file_direct_host, "w") for i = 1, #direct_domain do direct_out:write(direct_domain[i] .. "\n") end direct_out:close() end end +if USE_DIRECT_LIST == "1" and is_file_nonzero(file_direct_host) then + tmp_lines = { + "group directlist", + "group-dnl " .. file_direct_host, + "group-upstream " .. DNS_LOCAL, + "group-ipset " .. setflag .. "passwall_whitelist," .. setflag .. "passwall_whitelist6" + } + merge_array(config_lines, tmp_lines) +end -local tmp_proxy_host = TMP_PATH .. "/proxy_host" -if USE_PROXY_LIST == "1" and not nixio.fs.access(tmp_proxy_host) then +--代理(黑名单)列表 +local file_proxy_host = TMP_ACL_PATH .. "/proxy_host" +if USE_PROXY_LIST == "1" and not fs.access(file_proxy_host) then --对自定义列表进行清洗 local proxy_domain = {} - for line in io.lines("/usr/share/passwall/rules/proxy_host") do + for line in io.lines(RULES_PATH .. "/proxy_host") do line = api.get_std_domain(line) if line ~= "" and not line:find("#") then table.insert(proxy_domain, line) end end if #proxy_domain > 0 then - local proxy_out = io.open(tmp_proxy_host, "a") + local proxy_out = io.open(file_proxy_host, "w") for i = 1, #proxy_domain do proxy_out:write(proxy_domain[i] .. "\n") end proxy_out:close() end end +if USE_PROXY_LIST == "1" and is_file_nonzero(file_proxy_host) then + tmp_lines = { + "group proxylist", + "group-dnl " .. file_proxy_host, + "group-upstream " .. DNS_TRUST, + "group-ipset " .. setflag .. "passwall_blacklist," .. setflag .. "passwall_blacklist6" + } + merge_array(config_lines, tmp_lines) + if NO_IPV6_TRUST == "1" then table.insert(config_lines, "no-ipv6 tag:proxylist") end +end + +--GFW列表 +if GFWLIST == "1" and is_file_nonzero(RULES_PATH .. "/gfwlist") then + tmp_lines = { + "gfwlist-file " .. RULES_PATH .. "/gfwlist", + "add-taggfw-ip " .. setflag .. "passwall_gfwlist," .. setflag .. "passwall_gfwlist6" + } + merge_array(config_lines, tmp_lines) + if NO_IPV6_TRUST == "1" then table.insert(config_lines, "no-ipv6 tag:gfw") end +end + +--中国列表 +if CHNLIST ~= "0" and is_file_nonzero(RULES_PATH .. "/chnlist") then + if CHNLIST == "direct" then + tmp_lines = { + "chnlist-file " .. RULES_PATH .. "/chnlist", + "ipset-name4 " .. setflag .. "passwall_chnroute", + "ipset-name6 " .. setflag .. "passwall_chnroute6", + "add-tagchn-ip", + "chnlist-first" + } + merge_array(config_lines, tmp_lines) + end + + --回中国模式 + if CHNLIST == "proxy" then + tmp_lines = { + "group chn_proxy", + "group-dnl " .. RULES_PATH .. "/chnlist", + "group-upstream " .. DNS_TRUST, + "group-ipset " .. setflag .. "passwall_chnroute," .. setflag .. "passwall_chnroute6" + } + merge_array(config_lines, tmp_lines) + if NO_IPV6_TRUST == "1" then table.insert(config_lines, "no-ipv6 tag:chn_proxy") end + end +end + +--只使用gfwlist模式,GFW列表以外的域名及默认使用本地DNS +if GFWLIST == "1" and CHNLIST == "0" then DEFAULT_TAG = "chn" end + +--回中国模式,中国列表以外的域名及默认使用本地DNS +if CHNLIST == "proxy" then DEFAULT_TAG = "chn" end + +--全局模式,默认使用远程DNS +if DEFAULT_MODE == "proxy" and CHNLIST == "0" and GFWLIST == "0" then + DEFAULT_TAG = "gfw" + if NO_IPV6_TRUST == "1" then table.insert(config_lines, "no-ipv6") end +end + +--是否接受直连 DNS 空响应 +if DEFAULT_TAG == "none_noip" then table.insert(config_lines, "noip-as-chnip") end + +if DEFAULT_TAG == nil or DEFAULT_TAG == "smart" or DEFAULT_TAG == "none_noip" then DEFAULT_TAG = "none" end + +table.insert(config_lines, "default-tag " .. DEFAULT_TAG) +table.insert(config_lines, "cache 4096") +table.insert(config_lines, "cache-stale 3600") + +if DEFAULT_TAG == "none" then + table.insert(config_lines, "verdict-cache 5000") +end + +--输出配置文件 +if #config_lines > 0 then + for i = 1, #config_lines do + print(config_lines[i]) + end +end diff --git a/shadowsocks-rust/Cargo.lock b/shadowsocks-rust/Cargo.lock index aa83eff43a..67babe84e1 100644 --- a/shadowsocks-rust/Cargo.lock +++ b/shadowsocks-rust/Cargo.lock @@ -218,7 +218,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -406,7 +406,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -725,7 +725,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -813,7 +813,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -873,7 +873,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -1113,7 +1113,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -1685,7 +1685,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -1710,14 +1710,23 @@ dependencies = [ [[package]] name = "idna" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd69211b9b519e98303c015e21a007e293db403b6c85b9b124e133d25e242cdd" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" dependencies = [ "icu_normalizer", "icu_properties", - "smallvec", - "utf8_iter", ] [[package]] @@ -2214,7 +2223,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -2378,7 +2387,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -2409,7 +2418,7 @@ checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -3157,7 +3166,7 @@ checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -3348,7 +3357,7 @@ dependencies = [ "http-body-util", "httparse", "hyper", - "idna 1.0.2", + "idna 1.0.3", "ipnet", "iprange", "json5", @@ -3557,9 +3566,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.86" +version = "2.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89275301d38033efb81a6e60e3497e734dfcc62571f2854bf4b16690398824c" +checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" dependencies = [ "proc-macro2", "quote", @@ -3583,7 +3592,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -3659,22 +3668,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.66" +version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d171f59dbaa811dbbb1aee1e73db92ec2b122911a48e1390dfe327a821ddede" +checksum = "3b3c6efbfc763e64eb85c11c25320f0737cb7364c4b6336db90aa9ebe27a0bbd" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.66" +version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b08be0f17bd307950653ce45db00cd31200d82b624b36e181337d9c7d92765b5" +checksum = "b607164372e89797d78b8e23a6d67d5d1038c1c65efd52e1389ef8b77caba2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -3781,7 +3790,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -3871,7 +3880,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -4125,7 +4134,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", "wasm-bindgen-shared", ] @@ -4159,7 +4168,7 @@ checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4502,7 +4511,7 @@ checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", "synstructure", ] @@ -4524,7 +4533,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -4544,7 +4553,7 @@ checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", "synstructure", ] @@ -4573,7 +4582,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] diff --git a/shadowsocks-rust/deny.toml b/shadowsocks-rust/deny.toml index 11e01f2678..ff831b533b 100644 --- a/shadowsocks-rust/deny.toml +++ b/shadowsocks-rust/deny.toml @@ -231,10 +231,10 @@ skip-tree = [ [sources] # Lint level for what to happen when a crate from a crate registry that is not # in the allow list is encountered -unknown-registry = "warn" +unknown-registry = "deny" # Lint level for what to happen when a crate from a git repository that is not # in the allow list is encountered -unknown-git = "warn" +unknown-git = "deny" # List of URLs for allowed crate registries. Defaults to the crates.io index # if not specified. If it is specified but empty, no registries are allowed. allow-registry = ["https://github.com/rust-lang/crates.io-index"] diff --git a/sing-box/docs/changelog.md b/sing-box/docs/changelog.md index 0a4e1c1550..f71e769a6e 100644 --- a/sing-box/docs/changelog.md +++ b/sing-box/docs/changelog.md @@ -2,8 +2,10 @@ icon: material/alert-decagram --- -#### 1.11.0-alpha.5 +#### 1.11.0-alpha.6 +* Update quic-go to v0.48.1 +* Set gateway for tun correctly * Fixes and improvements #### 1.11.0-alpha.2 @@ -47,7 +49,7 @@ Important changes since 1.9: The new auto-redirect feature allows TUN to automatically configure connection redirection to improve proxy performance. -When auto-redirect is enabled, new route address set options will allow you to +When auto-redirect is enabled, new route address set options will allow you to automatically configure destination IP CIDR rules from a specified rule set to the firewall. Specified or unspecified destinations will bypass the sing-box routes to get better performance diff --git a/sing-box/experimental/libbox/link_flags_linux.go b/sing-box/experimental/libbox/link_flags_linux.go new file mode 100644 index 0000000000..aa9ad46d20 --- /dev/null +++ b/sing-box/experimental/libbox/link_flags_linux.go @@ -0,0 +1,30 @@ +package libbox + +import ( + "net" + "syscall" +) + +// copied from net.linkFlags +func linkFlags(rawFlags uint32) net.Flags { + var f net.Flags + if rawFlags&syscall.IFF_UP != 0 { + f |= net.FlagUp + } + if rawFlags&syscall.IFF_RUNNING != 0 { + f |= net.FlagRunning + } + if rawFlags&syscall.IFF_BROADCAST != 0 { + f |= net.FlagBroadcast + } + if rawFlags&syscall.IFF_LOOPBACK != 0 { + f |= net.FlagLoopback + } + if rawFlags&syscall.IFF_POINTOPOINT != 0 { + f |= net.FlagPointToPoint + } + if rawFlags&syscall.IFF_MULTICAST != 0 { + f |= net.FlagMulticast + } + return f +} diff --git a/sing-box/experimental/libbox/link_flags_stub.go b/sing-box/experimental/libbox/link_flags_stub.go new file mode 100644 index 0000000000..306754f3f2 --- /dev/null +++ b/sing-box/experimental/libbox/link_flags_stub.go @@ -0,0 +1,11 @@ +//go:build !linux + +package libbox + +import ( + "net" +) + +func linkFlags(rawFlags uint32) net.Flags { + panic("stub!") +} diff --git a/sing-box/experimental/libbox/platform.go b/sing-box/experimental/libbox/platform.go index 4078140f8c..e2bf8e8eba 100644 --- a/sing-box/experimental/libbox/platform.go +++ b/sing-box/experimental/libbox/platform.go @@ -38,6 +38,7 @@ type NetworkInterface struct { MTU int32 Name string Addresses StringIterator + Flags int32 } type WIFIState struct { diff --git a/sing-box/experimental/libbox/service.go b/sing-box/experimental/libbox/service.go index 7e2e141487..53ca168cfa 100644 --- a/sing-box/experimental/libbox/service.go +++ b/sing-box/experimental/libbox/service.go @@ -181,6 +181,7 @@ func (w *platformInterfaceWrapper) Interfaces() ([]control.Interface, error) { MTU: int(netInterface.MTU), Name: netInterface.Name, Addresses: common.Map(iteratorToArray[string](netInterface.Addresses), netip.MustParsePrefix), + Flags: linkFlags(uint32(netInterface.Flags)), }) } return interfaces, nil diff --git a/sing-box/experimental/libbox/setup.go b/sing-box/experimental/libbox/setup.go index ac67db38f2..eb5d7c4e3f 100644 --- a/sing-box/experimental/libbox/setup.go +++ b/sing-box/experimental/libbox/setup.go @@ -24,7 +24,6 @@ var ( func init() { debug.SetPanicOnFault(true) - debug.SetTraceback("all") } func Setup(basePath string, workingPath string, tempPath string, isTVOS bool) { diff --git a/sing-box/go.mod b/sing-box/go.mod index 23c7abbd2b..cd23034f9b 100644 --- a/sing-box/go.mod +++ b/sing-box/go.mod @@ -25,16 +25,16 @@ require ( github.com/sagernet/fswatch v0.1.1 github.com/sagernet/gomobile v0.1.4 github.com/sagernet/gvisor v0.0.0-20240428053021-e691de28565f - github.com/sagernet/quic-go v0.48.0-beta.1 + github.com/sagernet/quic-go v0.48.1-beta.1 github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691 - github.com/sagernet/sing v0.5.0-rc.2 - github.com/sagernet/sing-dns v0.3.0-rc.2 + github.com/sagernet/sing v0.5.0 + github.com/sagernet/sing-dns v0.3.0 github.com/sagernet/sing-mux v0.2.0 - github.com/sagernet/sing-quic v0.3.0-rc.1 + github.com/sagernet/sing-quic v0.3.0-rc.2 github.com/sagernet/sing-shadowsocks v0.2.7 github.com/sagernet/sing-shadowsocks2 v0.2.0 github.com/sagernet/sing-shadowtls v0.1.4 - github.com/sagernet/sing-tun v0.4.0-rc.4 + github.com/sagernet/sing-tun v0.4.0-rc.5 github.com/sagernet/sing-vmess v0.1.12 github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7 github.com/sagernet/utls v1.6.7 diff --git a/sing-box/go.sum b/sing-box/go.sum index c989fe47ca..5406c74650 100644 --- a/sing-box/go.sum +++ b/sing-box/go.sum @@ -110,27 +110,27 @@ github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a h1:ObwtHN2VpqE0ZN github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a/go.mod h1:xLnfdiJbSp8rNqYEdIW/6eDO4mVoogml14Bh2hSiFpM= github.com/sagernet/nftables v0.3.0-beta.4 h1:kbULlAwAC3jvdGAC1P5Fa3GSxVwQJibNenDW2zaXr8I= github.com/sagernet/nftables v0.3.0-beta.4/go.mod h1:OQXAjvjNGGFxaTgVCSTRIhYB5/llyVDeapVoENYBDS8= -github.com/sagernet/quic-go v0.48.0-beta.1 h1:86hQZrmuoARI3BpDRkQaP0iAVpywA4YsRrzJPYuPKWg= -github.com/sagernet/quic-go v0.48.0-beta.1/go.mod h1:1WgdDIVD1Gybp40JTWketeSfKA/+or9YMLaG5VeTk4k= +github.com/sagernet/quic-go v0.48.1-beta.1 h1:ElPaV5yzlXIKZpqFMAcUGax6vddi3zt4AEpT94Z0vwo= +github.com/sagernet/quic-go v0.48.1-beta.1/go.mod h1:1WgdDIVD1Gybp40JTWketeSfKA/+or9YMLaG5VeTk4k= github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691 h1:5Th31OC6yj8byLGkEnIYp6grlXfo1QYUfiYFGjewIdc= github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691/go.mod h1:B8lp4WkQ1PwNnrVMM6KyuFR20pU8jYBD+A4EhJovEXU= github.com/sagernet/sing v0.2.18/go.mod h1:OL6k2F0vHmEzXz2KW19qQzu172FDgSbUSODylighuVo= -github.com/sagernet/sing v0.5.0-rc.2 h1:tIrs6pRbjJWvI0ITRSg47P1wosY+iSuHpw9t5/hBx+Q= -github.com/sagernet/sing v0.5.0-rc.2/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak= -github.com/sagernet/sing-dns v0.3.0-rc.2 h1:z1yROBxd/6wik5h53Sz5df1DSmbPTaOu/Z0wAmyXGoQ= -github.com/sagernet/sing-dns v0.3.0-rc.2/go.mod h1:TqLIelI+FAbVEdiTRolhGLOwvhVjY7oT+wezlOJUQ7M= +github.com/sagernet/sing v0.5.0 h1:soo2wVwLcieKWWKIksFNK6CCAojUgAppqQVwyRYGkEM= +github.com/sagernet/sing v0.5.0/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak= +github.com/sagernet/sing-dns v0.3.0 h1:uHCIlbCwBxALJwXcEK1d75d7t3vzCSVEQsPfZR1cxQE= +github.com/sagernet/sing-dns v0.3.0/go.mod h1:TqLIelI+FAbVEdiTRolhGLOwvhVjY7oT+wezlOJUQ7M= github.com/sagernet/sing-mux v0.2.0 h1:4C+vd8HztJCWNYfufvgL49xaOoOHXty2+EAjnzN3IYo= github.com/sagernet/sing-mux v0.2.0/go.mod h1:khzr9AOPocLa+g53dBplwNDz4gdsyx/YM3swtAhlkHQ= -github.com/sagernet/sing-quic v0.3.0-rc.1 h1:SlzL1yfEAKJyRduub8vzOVtbyTLAX7RZEEBZxO5utts= -github.com/sagernet/sing-quic v0.3.0-rc.1/go.mod h1:uX+aUHA0fgIN6U3WViseDpSdTQriViZ7qz0Wbsf1mNQ= +github.com/sagernet/sing-quic v0.3.0-rc.2 h1:7vcC4bdS1GBJzHZhfmJiH0CfzQ4mYLUW51Z2RNHcGwc= +github.com/sagernet/sing-quic v0.3.0-rc.2/go.mod h1:3UOq51WVqzra7eCgod7t4hqnTaOiZzFUci9avMrtOqs= github.com/sagernet/sing-shadowsocks v0.2.7 h1:zaopR1tbHEw5Nk6FAkM05wCslV6ahVegEZaKMv9ipx8= github.com/sagernet/sing-shadowsocks v0.2.7/go.mod h1:0rIKJZBR65Qi0zwdKezt4s57y/Tl1ofkaq6NlkzVuyE= github.com/sagernet/sing-shadowsocks2 v0.2.0 h1:wpZNs6wKnR7mh1wV9OHwOyUr21VkS3wKFHi+8XwgADg= github.com/sagernet/sing-shadowsocks2 v0.2.0/go.mod h1:RnXS0lExcDAovvDeniJ4IKa2IuChrdipolPYWBv9hWQ= github.com/sagernet/sing-shadowtls v0.1.4 h1:aTgBSJEgnumzFenPvc+kbD9/W0PywzWevnVpEx6Tw3k= github.com/sagernet/sing-shadowtls v0.1.4/go.mod h1:F8NBgsY5YN2beQavdgdm1DPlhaKQlaL6lpDdcBglGK4= -github.com/sagernet/sing-tun v0.4.0-rc.4 h1:EFz+UjLZTm+YS3ob1vpqjOga67wyvnxWcbQKfe5wE3Y= -github.com/sagernet/sing-tun v0.4.0-rc.4/go.mod h1:+lQdWhqD4atzrCgRhoyrxBCg1OBru/hAv2BT3kdgmGM= +github.com/sagernet/sing-tun v0.4.0-rc.5 h1:d4o36GbVZtsucpt5On7CjTFSx4zx82DL8OlGR7rX7vY= +github.com/sagernet/sing-tun v0.4.0-rc.5/go.mod h1:rWu1ZC2lj4+UOOSNiUWjsY0y2fJcOHnLTMGna2n5P2o= github.com/sagernet/sing-vmess v0.1.12 h1:2gFD8JJb+eTFMoa8FIVMnknEi+vCSfaiTXTfEYAYAPg= github.com/sagernet/sing-vmess v0.1.12/go.mod h1:luTSsfyBGAc9VhtCqwjR+dt1QgqBhuYBCONB/POhF8I= github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7 h1:DImB4lELfQhplLTxeq2z31Fpv8CQqqrUwTbrIRumZqQ= diff --git a/small/luci-app-mihomo/Makefile b/small/luci-app-mihomo/Makefile index 8e91bda1c3..a7d67d0d05 100644 --- a/small/luci-app-mihomo/Makefile +++ b/small/luci-app-mihomo/Makefile @@ -1,6 +1,6 @@ include $(TOPDIR)/rules.mk -PKG_VERSION:=1.9.2 +PKG_VERSION:=1.9.3 LUCI_TITLE:=LuCI Support for mihomo LUCI_DEPENDS:=+luci-base +mihomo diff --git a/small/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js b/small/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js index 816a618aa8..0fce5aad27 100644 --- a/small/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js +++ b/small/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js @@ -102,6 +102,10 @@ return view.extend({ o = s.option(form.Flag, 'enabled', _('Enable')); o.rmempty = false; + o = s.option(form.Value, 'start_delay', _('Start Delay')); + o.datatype = 'uinteger'; + o.placeholder = '0'; + o = s.option(form.Flag, 'scheduled_restart', _('Scheduled Restart')); o.rmempty = false; @@ -260,7 +264,7 @@ return view.extend({ o.value('info'); o.value('debug'); - o = s.taboption('general', form.ListValue, 'mode', _('Proxy Mode')); + o = s.taboption('general', form.ListValue, 'mode', _('Mode')); o.value('global', _('Global Mode')); o.value('rule', _('Rule Mode')); o.value('direct', _('Direct Mode')); @@ -511,7 +515,7 @@ return view.extend({ o = s.taboption('geox', form.Flag, 'geox_auto_update', _('GeoX Auto Update')); o.rmempty = false; - o = s.taboption('geox', form.Value, 'geox_update_interval', _('GeoX Update Interval'), _('Hour')); + o = s.taboption('geox', form.Value, 'geox_update_interval', _('GeoX Update Interval')); o.datatype = 'uinteger'; o.placeholder = '24'; o.retain = true; diff --git a/small/luci-app-mihomo/po/templates/mihomo.pot b/small/luci-app-mihomo/po/templates/mihomo.pot new file mode 100644 index 0000000000..c4eb1d5b71 --- /dev/null +++ b/small/luci-app-mihomo/po/templates/mihomo.pot @@ -0,0 +1,576 @@ +msgid "" +msgstr "Content-Type: text/plain; charset=UTF-8" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:302 +msgid "API Port" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:306 +msgid "API Secret" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:174 +msgid "Access Control" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:177 +msgid "All Mode" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:228 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:233 +msgid "All Port" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:314 +msgid "Allow Lan" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:178 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:409 +msgid "Allow Mode" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:27 +msgid "App Log" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:49 +msgid "App Version" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:273 +msgid "Auto" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:100 +msgid "Basic Config" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:179 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:408 +msgid "Block Mode" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:221 +msgid "Bypass" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:223 +msgid "Bypass China Mainland IP" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:117 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/editor.js:24 +msgid "Choose Profile" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:31 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:64 +msgid "Clear Log" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:229 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:234 +msgid "Commonly Used Port" +msgstr "" + +#: mihomo/luci-app-mihomo/root/usr/share/luci/menu.d/luci-app-mihomo.json:14 +msgid "Config" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:60 +msgid "Core Log" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:63 +msgid "Core Status" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:56 +msgid "Core Version" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:112 +msgid "Cron Expression" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:380 +msgid "DNS Config" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:386 +msgid "DNS Mode" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:382 +msgid "DNS Port" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:226 +msgid "Destination TCP Port to Proxy" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:231 +msgid "Destination UDP Port to Proxy" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:270 +msgid "Direct Mode" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:275 +msgid "Disable" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:420 +msgid "DoH Prefer HTTP/3" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:446 +msgid "Domain Name" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:340 +msgid "Edit Authentications" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:402 +msgid "Edit Fake-IP Filters" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:435 +msgid "Edit Hosts" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:477 +msgid "Edit Nameserver Policies" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:454 +msgid "Edit Nameservers" +msgstr "" + +#: mihomo/luci-app-mihomo/root/usr/share/luci/menu.d/luci-app-mihomo.json:22 +msgid "Editor" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:102 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:144 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:274 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:348 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:443 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:462 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:485 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:526 +msgid "Enable" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:377 +msgid "Endpoint Independent NAT" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:291 +msgid "External Control Config" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:412 +msgid "Fake-IP Cache" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:406 +msgid "Fake-IP Filter Mode" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:391 +msgid "Fake-IP Range" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:137 +msgid "Fast Reload" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/editor.js:30 +msgid "File for Mixin" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/editor.js:32 +msgid "File for Reserved IP" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/editor.js:33 +msgid "File for Reserved IP6" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:121 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/editor.js:28 +msgid "File:" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:368 +msgid "GSO" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:371 +msgid "GSO Max Size" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:258 +msgid "General Config" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:499 +msgid "GeoData Loader" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:495 +msgid "GeoIP Format" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:512 +msgid "GeoIP(ASN) Url" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:509 +msgid "GeoIP(DAT) Url" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:506 +msgid "GeoIP(MMDB) Url" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:503 +msgid "GeoSite Url" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:515 +msgid "GeoX Auto Update" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:493 +msgid "GeoX Config" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:518 +msgid "GeoX Update Interval" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:268 +msgid "Global Mode" +msgstr "" + +#: mihomo/luci-app-mihomo/root/usr/share/rpcd/acl.d/luci-app-mihomo.json:3 +msgid "Grant access to mihomo procedures" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:317 +msgid "HTTP Port" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:45 +msgid "How To Use" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:449 +msgid "IP" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:156 +msgid "IPv4 DNS Hijack" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:162 +msgid "IPv4 Proxy" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:280 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:423 +msgid "IPv6" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:159 +msgid "IPv6 DNS Hijack" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:165 +msgid "IPv6 Proxy" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:312 +msgid "Inbound Config" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:171 +msgid "Lan Proxy" +msgstr "" + +#: mihomo/luci-app-mihomo/root/usr/share/luci/menu.d/luci-app-mihomo.json:30 +msgid "Log" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:260 +msgid "Log Level" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:364 +msgid "MTU" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:272 +msgid "Match Process" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:488 +msgid "Matcher" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:501 +msgid "Memory Conservative Loader" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:45 +#: mihomo/luci-app-mihomo/root/usr/share/luci/menu.d/luci-app-mihomo.json:3 +msgid "MihomoTProxy" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:325 +msgid "Mixed Port" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:131 +msgid "Mixin" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:256 +msgid "Mixin Config" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:524 +msgid "Mixin File Content" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:176 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:267 +msgid "Mode" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:472 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:491 +msgid "Nameserver" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:19 +msgid "Not Running" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:95 +msgid "Open Dashboard" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:277 +msgid "Outbound Interface" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:337 +msgid "Overwrite Authentication" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:397 +msgid "Overwrite Fake-IP Filter" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:432 +msgid "Overwrite Hosts" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:451 +msgid "Overwrite Nameserver" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:474 +msgid "Overwrite Nameserver Policy" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:354 +msgid "Password" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:526 +msgid "Please go to the editor tab to edit the file for mixin" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/editor.js:31 +msgid "Profile for Startup" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:140 +msgid "Proxy Config" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:148 +msgid "Redirect Mode" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:329 +msgid "Redirect Port" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:75 +msgid "Reload Service" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:417 +msgid "Respect Rules" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:82 +msgid "Restart Service" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:168 +msgid "Router Proxy" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:269 +msgid "Rule Mode" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:19 +msgid "Running" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:321 +msgid "SOCKS Port" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:309 +msgid "Save Proxy Selection" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:109 +msgid "Scheduled Restart" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:54 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:87 +msgid "Scroll To Bottom" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/tools/mihomo.js:93 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/tools/mihomo.js:111 +msgid "Service is not running." +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:359 +msgid "Stack" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:500 +msgid "Standard Loader" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:105 +msgid "Start Delay" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:47 +msgid "Status" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:236 +msgid "Subscription Config" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:241 +msgid "Subscription Name" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:245 +msgid "Subscription Url" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:125 +msgid "Subscription:" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:283 +msgid "TCP Keep Alive Idle" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:287 +msgid "TCP Keep Alive Interval" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:147 +msgid "TCP Proxy Mode" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:149 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:153 +msgid "TPROXY Mode" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:333 +msgid "TPROXY Port" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:357 +msgid "TUN Config" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:150 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:154 +msgid "TUN Mode" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:134 +msgid "Test Profile" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:142 +msgid "Transparent Proxy" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:45 +msgid "Transparent Proxy with Mihomo on OpenWrt." +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:465 +msgid "Type" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:152 +msgid "UDP Proxy Mode" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:293 +msgid "UI Name" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:296 +msgid "UI Url" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:89 +msgid "Update Dashboard" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:128 +msgid "Upload Profile" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:429 +msgid "Use Hosts" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:426 +msgid "Use System Hosts" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:248 +msgid "User Agent" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:351 +msgid "Username" +msgstr "" diff --git a/small/luci-app-mihomo/po/zh_Hans/mihomo.po b/small/luci-app-mihomo/po/zh_Hans/mihomo.po index 9368fba442..9a597d7d1c 100644 --- a/small/luci-app-mihomo/po/zh_Hans/mihomo.po +++ b/small/luci-app-mihomo/po/zh_Hans/mihomo.po @@ -1,419 +1,583 @@ -msgid "MihomoTProxy" -msgstr "MihomoTProxy" - -msgid "Transparent Proxy with Mihomo on OpenWrt." -msgstr "在 OpenWrt 上使用 Mihomo 进行透明代理。" - -msgid "How To Use" -msgstr "使用说明" - -msgid "Config" -msgstr "配置" - -msgid "Status" -msgstr "状态" - -msgid "App Version" -msgstr "插件版本" - -msgid "Core Version" -msgstr "核心版本" - -msgid "Core Status" -msgstr "核心状态" - -msgid "Running" -msgstr "运行中" - -msgid "Not Running" -msgstr "未在运行" - -msgid "Reload Service" -msgstr "重载服务" - -msgid "Restart Service" -msgstr "重启服务" - -msgid "Update Dashboard" -msgstr "更新面板" - -msgid "Open Dashboard" -msgstr "打开面板" - -msgid "Basic Config" -msgstr "基础配置" - -msgid "Enable" -msgstr "启用" - -msgid "Disable" -msgstr "禁用" - -msgid "Auto" -msgstr "自动" - -msgid "Mode" -msgstr "模式" - -msgid "Type" -msgstr "类型" - -msgid "Value" -msgstr "值" - -msgid "Scheduled Restart" -msgstr "定时重启" - -msgid "Cron Expression" -msgstr "Cron 表达式" - -msgid "Choose Profile" -msgstr "选择配置文件" - -msgid "File:" -msgstr "文件:" - -msgid "Subscription:" -msgstr "订阅:" - -msgid "Upload Profile" -msgstr "上传配置文件" - -msgid "Mixin" -msgstr "混入" - -msgid "Test Profile" -msgstr "检查配置文件" - -msgid "Fast Reload" -msgstr "快速重载" - -msgid "Proxy Config" -msgstr "代理配置" - -msgid "Transparent Proxy" -msgstr "透明代理" - -msgid "TCP Proxy Mode" -msgstr "TCP 代理模式" - -msgid "UDP Proxy Mode" -msgstr "UDP 代理模式" - -msgid "Redirect Mode" -msgstr "Redirect 模式" - -msgid "TPROXY Mode" -msgstr "TPROXY 模式" - -msgid "TUN Mode" -msgstr "TUN 模式" - -msgid "IPv4 DNS Hijack" -msgstr "IPv4 DNS 劫持" - -msgid "IPv6 DNS Hijack" -msgstr "IPv6 DNS 劫持" - -msgid "IPv4 Proxy" -msgstr "IPv4 代理" - -msgid "IPv6 Proxy" -msgstr "IPv6 代理" - -msgid "Router Proxy" -msgstr "路由器代理" - -msgid "Lan Proxy" -msgstr "局域网代理" - -msgid "Access Control" -msgstr "访问控制" - -msgid "All Mode" -msgstr "全部模式" - -msgid "Allow Mode" -msgstr "白名单模式" - -msgid "Block Mode" -msgstr "黑名单模式" - -msgid "Bypass" -msgstr "绕过" - -msgid "Bypass China Mainland IP" -msgstr "绕过中国大陆 IP" - -msgid "Destination TCP Port to Proxy" -msgstr "要代理的 TCP 目标端口" - -msgid "Destination UDP Port to Proxy" -msgstr "要代理的 UDP 目标端口" - -msgid "All Port" -msgstr "全部端口" - -msgid "Commonly Used Port" -msgstr "常用端口" - -msgid "Subscription Config" -msgstr "订阅配置" - -msgid "Subscription Name" -msgstr "订阅名称" - -msgid "Subscription Url" -msgstr "订阅链接" - -msgid "User Agent" -msgstr "用户代理(UA)" - -msgid "Mixin Config" -msgstr "混入配置" - -msgid "General Config" -msgstr "全局配置" - -msgid "Proxy Mode" -msgstr "代理模式" - -msgid "Global Mode" -msgstr "全局模式" - -msgid "Rule Mode" -msgstr "规则模式" - -msgid "Direct Mode" -msgstr "直连模式" - -msgid "Match Process" -msgstr "匹配进程" - -msgid "Outbound Interface" -msgstr "出站接口" - -msgid "TCP Keep Alive Idle" -msgstr "TCP Keep Alive 空闲" - -msgid "TCP Keep Alive Interval" -msgstr "TCP Keep Alive 间隔" - -msgid "Log Level" -msgstr "日志级别" - -msgid "External Control Config" -msgstr "外部控制配置" - -msgid "UI Name" -msgstr "UI 名称" - -msgid "UI Url" -msgstr "UI 下载地址" - -msgid "Service is not running." -msgstr "服务未在运行。" - +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"Project-Id-Version: PACKAGE VERSION\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: zh_Hans\n" +"MIME-Version: 1.0\n" +"Content-Transfer-Encoding: 8bit\n" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:302 msgid "API Port" msgstr "API 端口" +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:306 msgid "API Secret" msgstr "API 密钥" -msgid "Save Proxy Selection" -msgstr "保存节点/策略组选择" +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:174 +msgid "Access Control" +msgstr "访问控制" -msgid "Inbound Config" -msgstr "入站配置" +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:177 +msgid "All Mode" +msgstr "全部模式" +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:228 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:233 +msgid "All Port" +msgstr "全部端口" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:314 msgid "Allow Lan" msgstr "允许局域网访问" -msgid "HTTP Port" -msgstr "HTTP 端口" - -msgid "SOCKS Port" -msgstr "SOCKS 端口" - -msgid "Mixed Port" -msgstr "混合端口" - -msgid "Redirect Port" -msgstr "Redirect 端口" - -msgid "TPROXY Port" -msgstr "TPROXY 端口" - -msgid "Overwrite Authentication" -msgstr "覆盖身份验证" - -msgid "Edit Authentications" -msgstr "编辑身份验证" - -msgid "username" -msgstr "用户名" - -msgid "password" -msgstr "密码" - -msgid "TUN Config" -msgstr "TUN 配置" - -msgid "Stack" -msgstr "栈" - -msgid "Device" -msgstr "设备" - -msgid "MTU" -msgstr "最大传输单元" - -msgid "GSO" -msgstr "通用分段卸载" - -msgid "GSO Max Size" -msgstr "分段最大长度" - -msgid "Endpoint Independent NAT" -msgstr "独立于端点的 NAT" - -msgid "DNS Config" -msgstr "DNS 配置" - -msgid "DNS Port" -msgstr "DNS 端口" - -msgid "DNS Mode" -msgstr "DNS 模式" - -msgid "Fake-IP Range" -msgstr "Fake-IP 范围" - -msgid "Overwrite Fake-IP Filter" -msgstr "覆盖 Fake-IP 过滤列表" - -msgid "Edit Fake-IP Filters" -msgstr "编辑 Fake-IP 过滤列表" - -msgid "Fake-IP Filter Mode" -msgstr "Fake-IP 过滤模式" - -msgid "Fake-IP Cache" -msgstr "Fake-IP 缓存" - -msgid "Respect Rules" -msgstr "遵循分流规则" - -msgid "DoH Prefer HTTP/3" -msgstr "DoH 优先 HTTP/3" - -msgid "Use System Hosts" -msgstr "使用系统的 Hosts" - -msgid "Use Hosts" -msgstr "使用 Hosts" - -msgid "Overwrite Hosts" -msgstr "覆盖 Hosts" - -msgid "Edit Hosts" -msgstr "编辑 Hosts" - -msgid "Domain Name" -msgstr "域名" - -msgid "Overwrite Nameserver" -msgstr "覆盖 DNS 服务器" - -msgid "Edit Nameservers" -msgstr "编辑 DNS 服务器" - -msgid "Nameserver" -msgstr "DNS 服务器" - -msgid "Overwrite Fallback Filter" -msgstr "覆盖 Fallback 过滤列表" - -msgid "Edit Fallback Filters" -msgstr "编辑 Fallback 过滤列表" - -msgid "Overwrite Nameserver Policy" -msgstr "覆盖 DNS 服务器查询策略" - -msgid "Edit Nameserver Policies" -msgstr "编辑 DNS 服务器查询策略" - -msgid "Matcher" -msgstr "匹配" - -msgid "GeoX Config" -msgstr "GeoX 配置" - -msgid "GeoIP Format" -msgstr "GeoIP 格式" - -msgid "GeoData Loader" -msgstr "GeoData 加载器" - -msgid "Standard Loader" -msgstr "标准加载器" - -msgid "Memory Conservative Loader" -msgstr "为内存受限设备优化的加载器" - -msgid "GeoSite Url" -msgstr "GeoSite 下载地址" - -msgid "GeoIP(MMDB) Url" -msgstr "GeoIP(MMDB) 下载地址" - -msgid "GeoIP(DAT) Url" -msgstr "GeoIP(DAT) 下载地址" - -msgid "GeoIP(ASN) Url" -msgstr "GeoIP(ASN) 下载地址" - -msgid "GeoX Auto Update" -msgstr "定时更新GeoX文件" - -msgid "GeoX Update Interval" -msgstr "GeoX 文件更新间隔" - -msgid "Hour" -msgstr "小时" - -msgid "Mixin File Content" -msgstr "混入文件内容" - -msgid "Please go to the editor tab to edit the file for mixin" -msgstr "请前往编辑器标签编辑用于混入的文件" - -msgid "Editor" -msgstr "编辑器" - -msgid "File for Mixin" -msgstr "用于混入的文件" - -msgid "Profile for Startup" -msgstr "用于启动的配置文件" - -msgid "File for Reserved IP" -msgstr "IPv4 保留地址" - -msgid "File for Reserved IP6" -msgstr "IPv6 保留地址" - -msgid "Log" -msgstr "日志" +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:178 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:409 +msgid "Allow Mode" +msgstr "白名单模式" +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:27 msgid "App Log" -msgstr "应用日志" +msgstr "插件日志" -msgid "Core Log" -msgstr "核心日志" +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:49 +msgid "App Version" +msgstr "插件版本" +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:273 +msgid "Auto" +msgstr "自动" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:100 +msgid "Basic Config" +msgstr "基础配置" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:179 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:408 +msgid "Block Mode" +msgstr "黑名单模式" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:221 +msgid "Bypass" +msgstr "绕过" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:223 +msgid "Bypass China Mainland IP" +msgstr "绕过中国大陆 IP" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:117 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/editor.js:24 +msgid "Choose Profile" +msgstr "选择配置文件" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:31 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:64 msgid "Clear Log" msgstr "清空日志" +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:229 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:234 +msgid "Commonly Used Port" +msgstr "常用端口" + +#: mihomo/luci-app-mihomo/root/usr/share/luci/menu.d/luci-app-mihomo.json:14 +msgid "Config" +msgstr "配置" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:60 +msgid "Core Log" +msgstr "核心日志" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:63 +msgid "Core Status" +msgstr "核心状态" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:56 +msgid "Core Version" +msgstr "核心版本" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:112 +msgid "Cron Expression" +msgstr "Cron 表达式" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:380 +msgid "DNS Config" +msgstr "DNS 配置" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:386 +msgid "DNS Mode" +msgstr "DNS 模式" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:382 +msgid "DNS Port" +msgstr "DNS 端口" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:226 +msgid "Destination TCP Port to Proxy" +msgstr "要代理的 TCP 目标端口" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:231 +msgid "Destination UDP Port to Proxy" +msgstr "要代理的 UDP 目标端口" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:270 +msgid "Direct Mode" +msgstr "直连模式" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:275 +msgid "Disable" +msgstr "禁用" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:420 +msgid "DoH Prefer HTTP/3" +msgstr "DoH 优先 HTTP/3" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:446 +msgid "Domain Name" +msgstr "域名" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:340 +msgid "Edit Authentications" +msgstr "编辑身份验证" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:402 +msgid "Edit Fake-IP Filters" +msgstr "编辑 Fake-IP 过滤列表" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:435 +msgid "Edit Hosts" +msgstr "编辑 Hosts" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:477 +msgid "Edit Nameserver Policies" +msgstr "编辑 DNS 服务器查询策略" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:454 +msgid "Edit Nameservers" +msgstr "编辑 DNS 服务器" + +#: mihomo/luci-app-mihomo/root/usr/share/luci/menu.d/luci-app-mihomo.json:22 +msgid "Editor" +msgstr "编辑器" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:102 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:144 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:274 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:348 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:443 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:462 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:485 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:526 +msgid "Enable" +msgstr "启用" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:377 +msgid "Endpoint Independent NAT" +msgstr "独立于端点的 NAT" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:291 +msgid "External Control Config" +msgstr "外部控制配置" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:412 +msgid "Fake-IP Cache" +msgstr "Fake-IP 缓存" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:406 +msgid "Fake-IP Filter Mode" +msgstr "Fake-IP 过滤模式" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:391 +msgid "Fake-IP Range" +msgstr "Fake-IP 范围" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:137 +msgid "Fast Reload" +msgstr "快速重载" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/editor.js:30 +msgid "File for Mixin" +msgstr "用于混入的文件" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/editor.js:32 +msgid "File for Reserved IP" +msgstr "IPv4 保留地址" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/editor.js:33 +msgid "File for Reserved IP6" +msgstr "IPv6 保留地址" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:121 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/editor.js:28 +msgid "File:" +msgstr "文件:" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:368 +msgid "GSO" +msgstr "通用分段卸载" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:371 +msgid "GSO Max Size" +msgstr "分段最大长度" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:258 +msgid "General Config" +msgstr "全局配置" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:499 +msgid "GeoData Loader" +msgstr "GeoData 加载器" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:495 +msgid "GeoIP Format" +msgstr "GeoIP 格式" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:512 +msgid "GeoIP(ASN) Url" +msgstr "GeoIP(ASN) 下载地址" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:509 +msgid "GeoIP(DAT) Url" +msgstr "GeoIP(DAT) 下载地址" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:506 +msgid "GeoIP(MMDB) Url" +msgstr "GeoIP(MMDB) 下载地址" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:503 +msgid "GeoSite Url" +msgstr "GeoSite 下载地址" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:515 +msgid "GeoX Auto Update" +msgstr "定时更新GeoX文件" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:493 +msgid "GeoX Config" +msgstr "GeoX 配置" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:518 +msgid "GeoX Update Interval" +msgstr "GeoX 文件更新间隔" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:268 +msgid "Global Mode" +msgstr "全局模式" + +#: mihomo/luci-app-mihomo/root/usr/share/rpcd/acl.d/luci-app-mihomo.json:3 +msgid "Grant access to mihomo procedures" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:317 +msgid "HTTP Port" +msgstr "HTTP 端口" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:45 +msgid "How To Use" +msgstr "使用说明" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:449 +msgid "IP" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:156 +msgid "IPv4 DNS Hijack" +msgstr "IPv4 DNS 劫持" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:162 +msgid "IPv4 Proxy" +msgstr "IPv4 代理" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:280 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:423 +msgid "IPv6" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:159 +msgid "IPv6 DNS Hijack" +msgstr "IPv6 DNS 劫持" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:165 +msgid "IPv6 Proxy" +msgstr "IPv6 代理" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:312 +msgid "Inbound Config" +msgstr "入站配置" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:171 +msgid "Lan Proxy" +msgstr "局域网代理" + +#: mihomo/luci-app-mihomo/root/usr/share/luci/menu.d/luci-app-mihomo.json:30 +msgid "Log" +msgstr "日志" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:260 +msgid "Log Level" +msgstr "日志级别" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:364 +msgid "MTU" +msgstr "最大传输单元" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:272 +msgid "Match Process" +msgstr "匹配进程" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:488 +msgid "Matcher" +msgstr "匹配" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:501 +msgid "Memory Conservative Loader" +msgstr "为内存受限设备优化的加载器" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:45 +#: mihomo/luci-app-mihomo/root/usr/share/luci/menu.d/luci-app-mihomo.json:3 +msgid "MihomoTProxy" +msgstr "" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:325 +msgid "Mixed Port" +msgstr "混合端口" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:131 +msgid "Mixin" +msgstr "混入" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:256 +msgid "Mixin Config" +msgstr "混入配置" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:524 +msgid "Mixin File Content" +msgstr "混入文件内容" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:176 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:267 +msgid "Mode" +msgstr "模式" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:472 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:491 +msgid "Nameserver" +msgstr "DNS 服务器" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:19 +msgid "Not Running" +msgstr "未在运行" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:95 +msgid "Open Dashboard" +msgstr "打开面板" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:277 +msgid "Outbound Interface" +msgstr "出站接口" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:337 +msgid "Overwrite Authentication" +msgstr "覆盖身份验证" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:397 +msgid "Overwrite Fake-IP Filter" +msgstr "覆盖 Fake-IP 过滤列表" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:432 +msgid "Overwrite Hosts" +msgstr "覆盖 Hosts" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:451 +msgid "Overwrite Nameserver" +msgstr "覆盖 DNS 服务器" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:474 +msgid "Overwrite Nameserver Policy" +msgstr "覆盖 DNS 服务器查询策略" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:354 +msgid "Password" +msgstr "密码" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:526 +msgid "Please go to the editor tab to edit the file for mixin" +msgstr "请前往编辑器标签编辑用于混入的文件" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/editor.js:31 +msgid "Profile for Startup" +msgstr "用于启动的配置文件" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:140 +msgid "Proxy Config" +msgstr "代理配置" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:148 +msgid "Redirect Mode" +msgstr "Redirect 模式" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:329 +msgid "Redirect Port" +msgstr "Redirect 端口" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:75 +msgid "Reload Service" +msgstr "重载服务" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:417 +msgid "Respect Rules" +msgstr "遵循分流规则" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:82 +msgid "Restart Service" +msgstr "重启服务" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:168 +msgid "Router Proxy" +msgstr "路由器代理" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:269 +msgid "Rule Mode" +msgstr "规则模式" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:19 +msgid "Running" +msgstr "运行中" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:321 +msgid "SOCKS Port" +msgstr "SOCKS 端口" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:309 +msgid "Save Proxy Selection" +msgstr "保存节点/策略组选择" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:109 +msgid "Scheduled Restart" +msgstr "定时重启" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:54 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:87 msgid "Scroll To Bottom" msgstr "滚动到底部" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/tools/mihomo.js:93 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/tools/mihomo.js:111 +msgid "Service is not running." +msgstr "服务未在运行。" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:359 +msgid "Stack" +msgstr "栈" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:500 +msgid "Standard Loader" +msgstr "标准加载器" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:105 +msgid "Start Delay" +msgstr "启动延迟" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:47 +msgid "Status" +msgstr "状态" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:236 +msgid "Subscription Config" +msgstr "订阅配置" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:241 +msgid "Subscription Name" +msgstr "订阅名称" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:245 +msgid "Subscription Url" +msgstr "订阅链接" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:125 +msgid "Subscription:" +msgstr "订阅:" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:283 +msgid "TCP Keep Alive Idle" +msgstr "TCP Keep Alive 空闲" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:287 +msgid "TCP Keep Alive Interval" +msgstr "TCP Keep Alive 间隔" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:147 +msgid "TCP Proxy Mode" +msgstr "TCP 代理模式" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:149 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:153 +msgid "TPROXY Mode" +msgstr "TPROXY 模式" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:333 +msgid "TPROXY Port" +msgstr "TPROXY 端口" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:357 +msgid "TUN Config" +msgstr "TUN 配置" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:150 +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:154 +msgid "TUN Mode" +msgstr "TUN 模式" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:134 +msgid "Test Profile" +msgstr "检查配置文件" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:142 +msgid "Transparent Proxy" +msgstr "透明代理" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:45 +msgid "Transparent Proxy with Mihomo on OpenWrt." +msgstr "在 OpenWrt 上使用 Mihomo 进行透明代理。" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:465 +msgid "Type" +msgstr "类型" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:152 +msgid "UDP Proxy Mode" +msgstr "UDP 代理模式" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:293 +msgid "UI Name" +msgstr "UI 名称" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:296 +msgid "UI Url" +msgstr "UI 下载地址" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:89 +msgid "Update Dashboard" +msgstr "更新面板" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:128 +msgid "Upload Profile" +msgstr "上传配置文件" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:429 +msgid "Use Hosts" +msgstr "使用 Hosts" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:426 +msgid "Use System Hosts" +msgstr "使用系统的 Hosts" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:248 +msgid "User Agent" +msgstr "用户代理(UA)" + +#: mihomo/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:351 +msgid "Username" +msgstr "用户名" diff --git a/small/luci-app-passwall/Makefile b/small/luci-app-passwall/Makefile index 3a668e2ffd..db3778313e 100644 --- a/small/luci-app-passwall/Makefile +++ b/small/luci-app-passwall/Makefile @@ -174,6 +174,12 @@ define Package/$(PKG_NAME)/conffiles /www/luci-static/resources/qrcode.min.js endef +define Package/$(PKG_NAME)/postrm +#!/bin/sh +rm -f $${IPKG_INSTROOT}/usr/share/passwall/rules/*.nft +exit 0 +endef + include $(TOPDIR)/feeds/luci/luci.mk # call BuildPackage - OpenWrt buildroot signature diff --git a/small/luci-app-passwall/root/usr/share/passwall/app.sh b/small/luci-app-passwall/root/usr/share/passwall/app.sh index 49d2ad575e..406ccab923 100755 --- a/small/luci-app-passwall/root/usr/share/passwall/app.sh +++ b/small/luci-app-passwall/root/usr/share/passwall/app.sh @@ -544,141 +544,18 @@ run_dns2socks() { run_chinadns_ng() { local _flag _listen_port _dns_local _dns_trust _no_ipv6_trust _use_direct_list _use_proxy_list _gfwlist _chnlist _default_mode _default_tag + local _extra_param="" eval_set_val $@ - lua $APP_PATH/helper_chinadns_add.lua -FLAG $_flag -USE_DIRECT_LIST $_use_direct_list -USE_PROXY_LIST $_use_proxy_list - local _CONF_FILE=$TMP_ACL_PATH/$_flag/chinadns_ng.conf local _LOG_FILE=$TMP_ACL_PATH/$_flag/chinadns_ng.log _LOG_FILE="/dev/null" - cat <<-EOF > ${_CONF_FILE} - verbose - bind-addr 127.0.0.1 - bind-port ${_listen_port} - china-dns ${_dns_local} - trust-dns ${_dns_trust} - filter-qtype 65 - EOF - - # This function may be called multiple times, so add a condition here to avoid repeated execution. - [ ! -f "${TMP_PATH}/vpslist" ] && { - servers=$(uci show "${CONFIG}" | grep ".address=" | cut -d "'" -f 2 | grep -v "engage.cloudflareclient.com") - hosts_foreach "servers" host_from_url | grep '[a-zA-Z]$' | sort -u > "${TMP_PATH}/vpslist" - } - [ -s "${TMP_PATH}/vpslist" ] && { - local vpslist4_set="passwall_vpslist" - local vpslist6_set="passwall_vpslist6" - [ "$nftflag" = "1" ] && { - vpslist4_set="inet@passwall@${vpslist4_set}" - vpslist6_set="inet@passwall@${vpslist6_set}" - } - cat <<-EOF >> ${_CONF_FILE} - group vpslist - group-dnl ${TMP_PATH}/vpslist - group-upstream ${_dns_local} - group-ipset ${vpslist4_set},${vpslist6_set} - EOF - } - - [ "${_use_direct_list}" = "1" ] && [ -s "${TMP_PATH}/direct_host" ] && { - local whitelist4_set="passwall_whitelist" - local whitelist6_set="passwall_whitelist6" - [ "$nftflag" = "1" ] && { - whitelist4_set="inet@passwall@${whitelist4_set}" - whitelist6_set="inet@passwall@${whitelist6_set}" - } - cat <<-EOF >> ${_CONF_FILE} - group directlist - group-dnl ${TMP_PATH}/direct_host - group-upstream ${_dns_local} - group-ipset ${whitelist4_set},${whitelist6_set} - EOF - } - - [ "${_use_proxy_list}" = "1" ] && [ -s "${TMP_PATH}/proxy_host" ] && { - local blacklist4_set="passwall_blacklist" - local blacklist6_set="passwall_blacklist6" - [ "$nftflag" = "1" ] && { - blacklist4_set="inet@passwall@${blacklist4_set}" - blacklist6_set="inet@passwall@${blacklist6_set}" - } - cat <<-EOF >> ${_CONF_FILE} - group proxylist - group-dnl ${TMP_PATH}/proxy_host - group-upstream ${_dns_trust} - group-ipset ${blacklist4_set},${blacklist6_set} - EOF - [ "${_no_ipv6_trust}" = "1" ] && echo "no-ipv6 tag:proxylist" >> ${_CONF_FILE} - } - - [ "${_gfwlist}" = "1" ] && [ -s "${RULES_PATH}/gfwlist" ] && { - local gfwlist4_set="passwall_gfwlist" - local gfwlist6_set="passwall_gfwlist6" - [ "$nftflag" = "1" ] && { - gfwlist4_set="inet@passwall@${gfwlist4_set}" - gfwlist6_set="inet@passwall@${gfwlist6_set}" - } - cat <<-EOF >> ${_CONF_FILE} - gfwlist-file ${RULES_PATH}/gfwlist - add-taggfw-ip ${gfwlist4_set},${gfwlist6_set} - EOF - [ "${_no_ipv6_trust}" = "1" ] && echo "no-ipv6 tag:gfw" >> ${_CONF_FILE} - } - - [ "${_chnlist}" != "0" ] && [ -s "${RULES_PATH}/chnlist" ] && { - local chnroute4_set="passwall_chnroute" - local chnroute6_set="passwall_chnroute6" - [ "$nftflag" = "1" ] && { - chnroute4_set="inet@passwall@${chnroute4_set}" - chnroute6_set="inet@passwall@${chnroute6_set}" - } - - [ "${_chnlist}" = "direct" ] && { - cat <<-EOF >> ${_CONF_FILE} - chnlist-file ${RULES_PATH}/chnlist - ipset-name4 ${chnroute4_set} - ipset-name6 ${chnroute6_set} - add-tagchn-ip - chnlist-first - EOF - } - - #回中国模式 - [ "${_chnlist}" = "proxy" ] && { - cat <<-EOF >> ${_CONF_FILE} - group chn_proxy - group-dnl ${RULES_PATH}/chnlist - group-upstream ${_dns_trust} - group-ipset ${chnroute4_set},${chnroute6_set} - EOF - [ "${_no_ipv6_trust}" = "1" ] && echo "no-ipv6 tag:chn_proxy" >> ${_CONF_FILE} - } - } - - #只使用gfwlist模式,GFW列表以外的域名及默认使用本地DNS - [ "${_gfwlist}" = "1" ] && [ "${_chnlist}" = "0" ] && _default_tag="chn" - #回中国模式,中国列表以外的域名及默认使用本地DNS - [ "${_chnlist}" = "proxy" ] && _default_tag="chn" - #全局模式,默认使用远程DNS - [ "${_default_mode}" = "proxy" ] && [ "${_chnlist}" = "0" ] && [ "${_gfwlist}" = "0" ] && { - _default_tag="gfw" - [ "${_no_ipv6_trust}" = "1" ] && echo "no-ipv6" >> ${_CONF_FILE} - } - - # 是否接受直连 DNS 空响应 - [ "${_default_tag}" = "none_noip" ] && echo "noip-as-chnip" >> ${_CONF_FILE} - - ([ -z "${_default_tag}" ] || [ "${_default_tag}" = "smart" ] || [ "${_default_tag}" = "none_noip" ]) && _default_tag="none" - echo "default-tag ${_default_tag}" >> ${_CONF_FILE} - - echo "cache 4096" >> ${_CONF_FILE} - echo "cache-stale 3600" >> ${_CONF_FILE} - - [ "${_flag}" = "default" ] && [ "${_default_tag}" = "none" ] && { - echo "verdict-cache 5000" >> ${_CONF_FILE} - } + _extra_param="-FLAG ${_flag} -LISTEN_PORT ${_listen_port} -DNS_LOCAL ${_dns_local} -DNS_TRUST ${_dns_trust}" + _extra_param="${_extra_param} -USE_DIRECT_LIST ${_use_direct_list} -USE_PROXY_LIST ${_use_proxy_list} -GFWLIST ${_gfwlist} -CHNLIST ${_chnlist}" + _extra_param="${_extra_param} -NO_IPV6_TRUST ${_no_ipv6_trust} -DEFAULT_MODE ${_default_mode} -DEFAULT_TAG ${_default_tag} -NFTFLAG ${nftflag}" + lua $APP_PATH/helper_chinadns_add.lua ${_extra_param} > ${_CONF_FILE} ln_run "$(first_type chinadns-ng)" chinadns-ng "${_LOG_FILE}" -C ${_CONF_FILE} } diff --git a/small/luci-app-passwall/root/usr/share/passwall/helper_chinadns_add.lua b/small/luci-app-passwall/root/usr/share/passwall/helper_chinadns_add.lua index b45ad507b6..e4a7354208 100644 --- a/small/luci-app-passwall/root/usr/share/passwall/helper_chinadns_add.lua +++ b/small/luci-app-passwall/root/usr/share/passwall/helper_chinadns_add.lua @@ -1,50 +1,206 @@ -require 'nixio' +local sys = require "luci.sys" local api = require "luci.passwall.api" local appname = "passwall" local var = api.get_args(arg) local FLAG = var["-FLAG"] +local LISTEN_PORT = var["-LISTEN_PORT"] +local DNS_LOCAL = var["-DNS_LOCAL"] +local DNS_TRUST = var["-DNS_TRUST"] local USE_DIRECT_LIST = var["-USE_DIRECT_LIST"] local USE_PROXY_LIST = var["-USE_PROXY_LIST"] +local GFWLIST = var["-GFWLIST"] +local CHNLIST = var["-CHNLIST"] +local NO_IPV6_TRUST = var["-NO_IPV6_TRUST"] +local DEFAULT_MODE = var["-DEFAULT_MODE"] +local DEFAULT_TAG = var["-DEFAULT_TAG"] +local NFTFLAG = var["-NFTFLAG"] + +local uci = api.uci +local sys = api.sys +local fs = api.fs +local datatypes = api.datatypes local TMP_PATH = "/tmp/etc/" .. appname +local TMP_ACL_PATH = TMP_PATH .. "/acl" +local RULES_PATH = "/usr/share/" .. appname .. "/rules" +local config_lines = {} +local tmp_lines = {} -if not nixio.fs.access(TMP_PATH) then - nixio.fs.mkdir(TMP_PATH, 493) +local function is_file_nonzero(path) + if path and #path > 1 then + if sys.exec('[ -s "%s" ] && echo -n 1' % path) == "1" then + return true + end + end + return nil end -local tmp_direct_host = TMP_PATH .. "/direct_host" -if USE_DIRECT_LIST == "1" and not nixio.fs.access(tmp_direct_host) then +local function merge_array(lines1, lines2) + for i, line in ipairs(lines2) do + table.insert(lines1, #lines1 + 1, line) + end +end + +if not fs.access(TMP_ACL_PATH) then + fs.mkdir(TMP_ACL_PATH, 493) +end + +local setflag= (NFTFLAG == "1") and "inet@passwall@" or "" + +config_lines = { + --"verbose", + "bind-addr 127.0.0.1", + "bind-port " .. LISTEN_PORT, + "china-dns " .. DNS_LOCAL, + "trust-dns " .. DNS_TRUST, + "filter-qtype 65" +} + +--始终用国内DNS解析节点域名 +local file_vpslist = TMP_ACL_PATH .. "/vpslist" +if not is_file_nonzero(file_vpslist) then + local vpslist_out = io.open(file_vpslist, "w") + uci:foreach(appname, "nodes", function(t) + local address = t.address + if address == "engage.cloudflareclient.com" then return end + if datatypes.hostname(address) then + vpslist_out:write(address .. "\n") + end + end) + vpslist_out:close() +end +if is_file_nonzero(file_vpslist) then + tmp_lines = { + "group vpslist", + "group-dnl " .. file_vpslist, + "group-upstream " .. DNS_LOCAL, + "group-ipset " .. setflag .. "passwall_vpslist," .. setflag .. "passwall_vpslist6" + } + merge_array(config_lines, tmp_lines) +end + +--直连(白名单)列表 +local file_direct_host = TMP_ACL_PATH .. "/direct_host" +if USE_DIRECT_LIST == "1" and not fs.access(file_direct_host) then --对自定义列表进行清洗 local direct_domain = {} - for line in io.lines("/usr/share/passwall/rules/direct_host") do + for line in io.lines(RULES_PATH .. "/direct_host") do line = api.get_std_domain(line) if line ~= "" and not line:find("#") then table.insert(direct_domain, line) end end if #direct_domain > 0 then - local direct_out = io.open(tmp_direct_host, "a") + local direct_out = io.open(file_direct_host, "w") for i = 1, #direct_domain do direct_out:write(direct_domain[i] .. "\n") end direct_out:close() end end +if USE_DIRECT_LIST == "1" and is_file_nonzero(file_direct_host) then + tmp_lines = { + "group directlist", + "group-dnl " .. file_direct_host, + "group-upstream " .. DNS_LOCAL, + "group-ipset " .. setflag .. "passwall_whitelist," .. setflag .. "passwall_whitelist6" + } + merge_array(config_lines, tmp_lines) +end -local tmp_proxy_host = TMP_PATH .. "/proxy_host" -if USE_PROXY_LIST == "1" and not nixio.fs.access(tmp_proxy_host) then +--代理(黑名单)列表 +local file_proxy_host = TMP_ACL_PATH .. "/proxy_host" +if USE_PROXY_LIST == "1" and not fs.access(file_proxy_host) then --对自定义列表进行清洗 local proxy_domain = {} - for line in io.lines("/usr/share/passwall/rules/proxy_host") do + for line in io.lines(RULES_PATH .. "/proxy_host") do line = api.get_std_domain(line) if line ~= "" and not line:find("#") then table.insert(proxy_domain, line) end end if #proxy_domain > 0 then - local proxy_out = io.open(tmp_proxy_host, "a") + local proxy_out = io.open(file_proxy_host, "w") for i = 1, #proxy_domain do proxy_out:write(proxy_domain[i] .. "\n") end proxy_out:close() end end +if USE_PROXY_LIST == "1" and is_file_nonzero(file_proxy_host) then + tmp_lines = { + "group proxylist", + "group-dnl " .. file_proxy_host, + "group-upstream " .. DNS_TRUST, + "group-ipset " .. setflag .. "passwall_blacklist," .. setflag .. "passwall_blacklist6" + } + merge_array(config_lines, tmp_lines) + if NO_IPV6_TRUST == "1" then table.insert(config_lines, "no-ipv6 tag:proxylist") end +end + +--GFW列表 +if GFWLIST == "1" and is_file_nonzero(RULES_PATH .. "/gfwlist") then + tmp_lines = { + "gfwlist-file " .. RULES_PATH .. "/gfwlist", + "add-taggfw-ip " .. setflag .. "passwall_gfwlist," .. setflag .. "passwall_gfwlist6" + } + merge_array(config_lines, tmp_lines) + if NO_IPV6_TRUST == "1" then table.insert(config_lines, "no-ipv6 tag:gfw") end +end + +--中国列表 +if CHNLIST ~= "0" and is_file_nonzero(RULES_PATH .. "/chnlist") then + if CHNLIST == "direct" then + tmp_lines = { + "chnlist-file " .. RULES_PATH .. "/chnlist", + "ipset-name4 " .. setflag .. "passwall_chnroute", + "ipset-name6 " .. setflag .. "passwall_chnroute6", + "add-tagchn-ip", + "chnlist-first" + } + merge_array(config_lines, tmp_lines) + end + + --回中国模式 + if CHNLIST == "proxy" then + tmp_lines = { + "group chn_proxy", + "group-dnl " .. RULES_PATH .. "/chnlist", + "group-upstream " .. DNS_TRUST, + "group-ipset " .. setflag .. "passwall_chnroute," .. setflag .. "passwall_chnroute6" + } + merge_array(config_lines, tmp_lines) + if NO_IPV6_TRUST == "1" then table.insert(config_lines, "no-ipv6 tag:chn_proxy") end + end +end + +--只使用gfwlist模式,GFW列表以外的域名及默认使用本地DNS +if GFWLIST == "1" and CHNLIST == "0" then DEFAULT_TAG = "chn" end + +--回中国模式,中国列表以外的域名及默认使用本地DNS +if CHNLIST == "proxy" then DEFAULT_TAG = "chn" end + +--全局模式,默认使用远程DNS +if DEFAULT_MODE == "proxy" and CHNLIST == "0" and GFWLIST == "0" then + DEFAULT_TAG = "gfw" + if NO_IPV6_TRUST == "1" then table.insert(config_lines, "no-ipv6") end +end + +--是否接受直连 DNS 空响应 +if DEFAULT_TAG == "none_noip" then table.insert(config_lines, "noip-as-chnip") end + +if DEFAULT_TAG == nil or DEFAULT_TAG == "smart" or DEFAULT_TAG == "none_noip" then DEFAULT_TAG = "none" end + +table.insert(config_lines, "default-tag " .. DEFAULT_TAG) +table.insert(config_lines, "cache 4096") +table.insert(config_lines, "cache-stale 3600") + +if DEFAULT_TAG == "none" then + table.insert(config_lines, "verdict-cache 5000") +end + +--输出配置文件 +if #config_lines > 0 then + for i = 1, #config_lines do + print(config_lines[i]) + end +end diff --git a/small/luci-app-ssr-plus/root/usr/bin/ssr-rules b/small/luci-app-ssr-plus/root/usr/bin/ssr-rules index e0e0e8f5e0..547d910ae7 100755 --- a/small/luci-app-ssr-plus/root/usr/bin/ssr-rules +++ b/small/luci-app-ssr-plus/root/usr/bin/ssr-rules @@ -103,7 +103,6 @@ ipset_r() { $IPT -A SS_SPEC_WAN_AC -m set --match-set china dst -j RETURN $IPT -A SS_SPEC_WAN_AC -m set --match-set gfwlist dst -j SS_SPEC_WAN_FW $IPT -A SS_SPEC_WAN_AC -m set --match-set gmlan src -m set ! --match-set china dst -j SS_SPEC_WAN_FW - $IPT -A SS_SPEC_WAN_AC -j SS_SPEC_WAN_FW ;; oversea) ipset -N oversea hash:net 2>/dev/null diff --git a/small/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua b/small/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua index e95b96ba37..59cee0808f 100755 --- a/small/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua +++ b/small/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua @@ -324,7 +324,8 @@ if xray_fragment.fragment ~= "0" or (xray_fragment.noise ~= "0" and xray_noise.e }, streamSettings = { sockopt = { - tcpNoDelay = true + tcpMptcp = (server.mptcp == "1") and true or false, -- MPTCP + tcpNoDelay = (server.mptcp == "1") and true or false -- MPTCP } } }) diff --git a/small/mihomo/Makefile b/small/mihomo/Makefile index a540896dcf..0d361e73e9 100644 --- a/small/mihomo/Makefile +++ b/small/mihomo/Makefile @@ -1,7 +1,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=mihomo -PKG_RELEASE:=3 +PKG_RELEASE:=4 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL:=https://github.com/MetaCubeX/mihomo.git diff --git a/small/mihomo/files/mihomo.conf b/small/mihomo/files/mihomo.conf index 1128dc9422..ef265ccc70 100644 --- a/small/mihomo/files/mihomo.conf +++ b/small/mihomo/files/mihomo.conf @@ -3,6 +3,7 @@ config status 'status' config config 'config' option 'init' '1' option 'enabled' '0' + option 'start_delay' '0' option 'scheduled_restart' '0' option 'cron_expression' '0 3 * * *' option 'profile' 'subscription:subscription' diff --git a/small/mihomo/files/mihomo.init b/small/mihomo/files/mihomo.init index e06f72e406..01c2790b1e 100644 --- a/small/mihomo/files/mihomo.init +++ b/small/mihomo/files/mihomo.init @@ -7,6 +7,23 @@ USE_PROCD=1 . "$IPKG_INSTROOT/lib/functions/network.sh" . "$IPKG_INSTROOT/etc/mihomo/scripts/constants.sh" +boot() { + # init log + init_log + # load config + config_load mihomo + # start delay + local enabled start_delay + config_get_bool enabled "config" "enabled" 0 + config_get start_delay "config" "start_delay" 0 + if [[ "$enabled" == 1 && "$start_delay" > 0 ]]; then + log "App will start after $start_delay seconds." + sleep "$start_delay" + fi + # start + start +} + start_service() { # clear log clear_log @@ -20,6 +37,7 @@ start_service() { log "Exiting..." return fi + # start log "App is enabled." log "Starting..." # get config @@ -462,18 +480,21 @@ cleanup() { /etc/init.d/cron restart } -log() { - echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$APP_LOG_PATH" +init_log() { + mkdir "$LOG_DIR" + touch "$APP_LOG_PATH" + touch "$CORE_LOG_PATH" } clear_log() { - if [ ! -d "$LOG_DIR" ]; then - mkdir "$LOG_DIR" - fi echo -n > "$APP_LOG_PATH" echo -n > "$CORE_LOG_PATH" } +log() { + echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$APP_LOG_PATH" +} + mixin_authentications() { local section="$1" diff --git a/small/mihomo/files/uci-defaults/migrate.sh b/small/mihomo/files/uci-defaults/migrate.sh index 9a566cf942..a993228b40 100644 --- a/small/mihomo/files/uci-defaults/migrate.sh +++ b/small/mihomo/files/uci-defaults/migrate.sh @@ -10,6 +10,10 @@ dns_doh_prefer_http3=$(uci -q get mihomo.mixin.dns_doh_prefer_http3); [ -z "$dns mixin_file_content=$(uci -q get mihomo.mixin.mixin_file_content); [ -z "$mixin_file_content" ] && uci set mihomo.mixin.mixin_file_content=$(uci -q get mihomo.config.mixin) +# since v1.9.3 + +start_delay=$(uci -q get mihomo.config.start_delay); [ -z "$start_delay" ] && uci set mihomo.config.start_delay=0 + # commit uci commit mihomo diff --git a/small/v2ray-geodata/Makefile b/small/v2ray-geodata/Makefile index 0179b07a89..909f3d7ab3 100644 --- a/small/v2ray-geodata/Makefile +++ b/small/v2ray-geodata/Makefile @@ -21,22 +21,22 @@ define Download/geoip HASH:=2762fa0a7d1728089b7723b7796cb5ca955330a3fa2e4407fa40e480fbf9cea7 endef -GEOSITE_VER:=20241013063848 +GEOSITE_VER:=20241104071109 GEOSITE_FILE:=dlc.dat.$(GEOSITE_VER) define Download/geosite URL:=https://github.com/v2fly/domain-list-community/releases/download/$(GEOSITE_VER)/ URL_FILE:=dlc.dat FILE:=$(GEOSITE_FILE) - HASH:=f820556ed3aa02eb7eadba7a3743d7e6df8e9234785d0d82d2d1edce20fe4b3c + HASH:=dbda1fe2eeea9cf0ea02f69be0e1db27a5034d331d78f84a1ea6770c1e9f0166 endef -GEOSITE_IRAN_VER:=202410280036 +GEOSITE_IRAN_VER:=202411040035 GEOSITE_IRAN_FILE:=iran.dat.$(GEOSITE_IRAN_VER) define Download/geosite-ir URL:=https://github.com/bootmortis/iran-hosted-domains/releases/download/$(GEOSITE_IRAN_VER)/ URL_FILE:=iran.dat FILE:=$(GEOSITE_IRAN_FILE) - HASH:=5059e9d5ffcc80a8e2d7824dde704e8f086e41ccfc90ae36c355b49564a7ce68 + HASH:=57ebf16e74ef4baaaa2e39c7489784f5ae7f2bf87bc1c7fe9a3f9d1c5e4026a9 endef define Package/v2ray-geodata/template diff --git a/v2rayn/v2rayN/ServiceLib/Global.cs b/v2rayn/v2rayN/ServiceLib/Global.cs index 90f23a569a..3e37913657 100644 --- a/v2rayn/v2rayN/ServiceLib/Global.cs +++ b/v2rayn/v2rayN/ServiceLib/Global.cs @@ -105,9 +105,9 @@ public static readonly List SpeedTestUrls = new() { @"https://speed.cloudflare.com/__down?bytes=100000000", + @"https://speed.cloudflare.com/__down?bytes=50000000", @"https://speed.cloudflare.com/__down?bytes=10000000", - @"http://cachefly.cachefly.net/50mb.test", - @"http://cachefly.cachefly.net/10mb.test" + @"https://cachefly.cachefly.net/50mb.test", }; public static readonly List SpeedPingTestUrls = new() { diff --git a/v2rayn/v2rayN/ServiceLib/Handler/ConfigHandler.cs b/v2rayn/v2rayN/ServiceLib/Handler/ConfigHandler.cs index e2cc4c4522..87030e41fa 100644 --- a/v2rayn/v2rayN/ServiceLib/Handler/ConfigHandler.cs +++ b/v2rayn/v2rayN/ServiceLib/Handler/ConfigHandler.cs @@ -162,6 +162,7 @@ namespace ServiceLib.Handler config.ClashUIItem ??= new(); config.SystemProxyItem ??= new(); config.WebDavItem ??= new(); + config.CheckUpdateItem ??= new(); return config; } @@ -1358,6 +1359,7 @@ namespace ServiceLib.Handler item.PrevProfile = subItem.PrevProfile; item.NextProfile = subItem.NextProfile; item.PreSocksPort = subItem.PreSocksPort; + item.Memo = subItem.Memo; } if (Utils.IsNullOrEmpty(item.Id)) diff --git a/v2rayn/v2rayN/ServiceLib/Models/CheckUpdateItem.cs b/v2rayn/v2rayN/ServiceLib/Models/CheckUpdateModel.cs similarity index 88% rename from v2rayn/v2rayN/ServiceLib/Models/CheckUpdateItem.cs rename to v2rayn/v2rayN/ServiceLib/Models/CheckUpdateModel.cs index 4ce1c74f42..03080c7958 100644 --- a/v2rayn/v2rayN/ServiceLib/Models/CheckUpdateItem.cs +++ b/v2rayn/v2rayN/ServiceLib/Models/CheckUpdateModel.cs @@ -1,6 +1,6 @@ namespace ServiceLib.Models { - public class CheckUpdateItem + public class CheckUpdateModel { public bool? IsSelected { get; set; } public string? CoreType { get; set; } diff --git a/v2rayn/v2rayN/ServiceLib/Models/Config.cs b/v2rayn/v2rayN/ServiceLib/Models/Config.cs index fce5730019..075f5049c4 100644 --- a/v2rayn/v2rayN/ServiceLib/Models/Config.cs +++ b/v2rayn/v2rayN/ServiceLib/Models/Config.cs @@ -15,15 +15,14 @@ public bool IsRunningCore(ECoreType type) { - if (type == ECoreType.Xray && RunningCoreType is ECoreType.Xray or ECoreType.v2fly or ECoreType.v2fly_v5) + switch (type) { - return true; + case ECoreType.Xray when RunningCoreType is ECoreType.Xray or ECoreType.v2fly or ECoreType.v2fly_v5: + case ECoreType.sing_box when RunningCoreType is ECoreType.sing_box or ECoreType.mihomo: + return true; + default: + return false; } - if (type == ECoreType.sing_box && RunningCoreType is ECoreType.sing_box or ECoreType.mihomo) - { - return true; - } - return false; } #endregion property @@ -46,6 +45,7 @@ public ClashUIItem ClashUIItem { get; set; } public SystemProxyItem SystemProxyItem { get; set; } public WebDavItem WebDavItem { get; set; } + public CheckUpdateItem CheckUpdateItem { get; set; } public List Inbound { get; set; } public List GlobalHotkeys { get; set; } public List CoreTypeItem { get; set; } diff --git a/v2rayn/v2rayN/ServiceLib/Models/ConfigItems.cs b/v2rayn/v2rayN/ServiceLib/Models/ConfigItems.cs index 0841408175..84c9ff3fe8 100644 --- a/v2rayn/v2rayN/ServiceLib/Models/ConfigItems.cs +++ b/v2rayn/v2rayN/ServiceLib/Models/ConfigItems.cs @@ -80,9 +80,7 @@ public bool IgnoreGeoUpdateCore { get; set; } = true; public int AutoUpdateInterval { get; set; } - - public bool CheckPreReleaseUpdate { get; set; } = false; - + public bool EnableSecurityProtocolTls13 { get; set; } public int TrayMenuServersLimit { get; set; } = 20; @@ -245,4 +243,11 @@ public string? Password { get; set; } public string? DirName { get; set; } } + + [Serializable] + public class CheckUpdateItem + { + public bool CheckPreReleaseUpdate { get; set; } + public List? SelectedCoreTypes { get; set; } + } } \ No newline at end of file diff --git a/v2rayn/v2rayN/ServiceLib/Models/SubItem.cs b/v2rayn/v2rayN/ServiceLib/Models/SubItem.cs index 851733bfc8..b6caa374f6 100644 --- a/v2rayn/v2rayN/ServiceLib/Models/SubItem.cs +++ b/v2rayn/v2rayN/ServiceLib/Models/SubItem.cs @@ -33,5 +33,7 @@ namespace ServiceLib.Models public string? NextProfile { get; set; } public int? PreSocksPort { get; set; } + + public string? Memo { get; set; } } } \ No newline at end of file diff --git a/v2rayn/v2rayN/ServiceLib/Resx/ResUI.Designer.cs b/v2rayn/v2rayN/ServiceLib/Resx/ResUI.Designer.cs index 45fdab2f33..26864bef19 100644 --- a/v2rayn/v2rayN/ServiceLib/Resx/ResUI.Designer.cs +++ b/v2rayn/v2rayN/ServiceLib/Resx/ResUI.Designer.cs @@ -447,6 +447,15 @@ namespace ServiceLib.Resx { } } + /// + /// 查找类似 Remarks Memo 的本地化字符串。 + /// + public static string LvMemo { + get { + return ResourceManager.GetString("LvMemo", resourceCulture); + } + } + /// /// 查找类似 More URLs, separated by commas; Subscription conversion will be invalid 的本地化字符串。 /// diff --git a/v2rayn/v2rayN/ServiceLib/Resx/ResUI.resx b/v2rayn/v2rayN/ServiceLib/Resx/ResUI.resx index 2b3ea35308..0ef7eaefb2 100644 --- a/v2rayn/v2rayN/ServiceLib/Resx/ResUI.resx +++ b/v2rayn/v2rayN/ServiceLib/Resx/ResUI.resx @@ -1366,4 +1366,7 @@ Are you sure to exit? + + Remarks Memo + \ No newline at end of file diff --git a/v2rayn/v2rayN/ServiceLib/Resx/ResUI.zh-Hans.resx b/v2rayn/v2rayN/ServiceLib/Resx/ResUI.zh-Hans.resx index 304bb38763..549517883f 100644 --- a/v2rayn/v2rayN/ServiceLib/Resx/ResUI.zh-Hans.resx +++ b/v2rayn/v2rayN/ServiceLib/Resx/ResUI.zh-Hans.resx @@ -1363,4 +1363,7 @@ 是否确定退出? + + 备注备忘 + \ No newline at end of file diff --git a/v2rayn/v2rayN/ServiceLib/Resx/ResUI.zh-Hant.resx b/v2rayn/v2rayN/ServiceLib/Resx/ResUI.zh-Hant.resx index 7811319559..6f12242641 100644 --- a/v2rayn/v2rayN/ServiceLib/Resx/ResUI.zh-Hant.resx +++ b/v2rayn/v2rayN/ServiceLib/Resx/ResUI.zh-Hant.resx @@ -1243,4 +1243,7 @@ 是否確定退出? + + 備註備忘 + \ No newline at end of file diff --git a/v2rayn/v2rayN/ServiceLib/Services/UpdateService.cs b/v2rayn/v2rayN/ServiceLib/Services/UpdateService.cs index 1a8e8d64e4..c02666140f 100644 --- a/v2rayn/v2rayN/ServiceLib/Services/UpdateService.cs +++ b/v2rayn/v2rayN/ServiceLib/Services/UpdateService.cs @@ -228,7 +228,7 @@ namespace ServiceLib.Services } _updateFunc?.Invoke(false, "-------------------------------------------------------"); - await ConfigHandler.DedupServerList(config, id); + //await ConfigHandler.DedupServerList(config, id); } _updateFunc?.Invoke(true, $"{ResUI.MsgUpdateSubscriptionEnd}"); diff --git a/v2rayn/v2rayN/ServiceLib/ViewModels/CheckUpdateViewModel.cs b/v2rayn/v2rayN/ServiceLib/ViewModels/CheckUpdateViewModel.cs index a467f7465e..a62c3f2a02 100644 --- a/v2rayn/v2rayN/ServiceLib/ViewModels/CheckUpdateViewModel.cs +++ b/v2rayn/v2rayN/ServiceLib/ViewModels/CheckUpdateViewModel.cs @@ -12,10 +12,10 @@ namespace ServiceLib.ViewModels { private const string _geo = "GeoFiles"; private string _v2rayN = ECoreType.v2rayN.ToString(); - private List _lstUpdated = []; + private List _lstUpdated = []; - private IObservableCollection _checkUpdateItem = new ObservableCollectionExtended(); - public IObservableCollection CheckUpdateItems => _checkUpdateItem; + private IObservableCollection _checkUpdateModel = new ObservableCollectionExtended(); + public IObservableCollection CheckUpdateModels => _checkUpdateModel; public ReactiveCommand CheckUpdateCmd { get; } [Reactive] public bool EnableCheckPreReleaseUpdate { get; set; } @@ -29,65 +29,56 @@ namespace ServiceLib.ViewModels await CheckUpdate(); }); - EnableCheckPreReleaseUpdate = _config.GuiItem.CheckPreReleaseUpdate; + EnableCheckPreReleaseUpdate = _config.CheckUpdateItem.CheckPreReleaseUpdate; this.WhenAnyValue( x => x.EnableCheckPreReleaseUpdate, y => y == true) - .Subscribe(c => { _config.GuiItem.CheckPreReleaseUpdate = EnableCheckPreReleaseUpdate; }); + .Subscribe(c => { _config.CheckUpdateItem.CheckPreReleaseUpdate = EnableCheckPreReleaseUpdate; }); - RefreshSubItems(); + RefreshCheckUpdateItems(); } - private void RefreshSubItems() + private void RefreshCheckUpdateItems() { - _checkUpdateItem.Clear(); + _checkUpdateModel.Clear(); if (RuntimeInformation.ProcessArchitecture != Architecture.X86) { - _checkUpdateItem.Add(new CheckUpdateItem() - { - IsSelected = false, - CoreType = _v2rayN, - Remarks = ResUI.menuCheckUpdate, - }); - _checkUpdateItem.Add(new CheckUpdateItem() - { - IsSelected = true, - CoreType = ECoreType.Xray.ToString(), - Remarks = ResUI.menuCheckUpdate, - }); - _checkUpdateItem.Add(new CheckUpdateItem() - { - IsSelected = true, - CoreType = ECoreType.mihomo.ToString(), - Remarks = ResUI.menuCheckUpdate, - }); - _checkUpdateItem.Add(new CheckUpdateItem() - { - IsSelected = true, - CoreType = ECoreType.sing_box.ToString(), - Remarks = ResUI.menuCheckUpdate, - }); + _checkUpdateModel.Add(GetCheckUpdateModel(_v2rayN)); + _checkUpdateModel.Add(GetCheckUpdateModel(ECoreType.Xray.ToString())); + _checkUpdateModel.Add(GetCheckUpdateModel(ECoreType.mihomo.ToString())); + _checkUpdateModel.Add(GetCheckUpdateModel(ECoreType.sing_box.ToString())); } + _checkUpdateModel.Add(GetCheckUpdateModel(_geo)); + } - _checkUpdateItem.Add(new CheckUpdateItem() + private CheckUpdateModel GetCheckUpdateModel(string coreType) + { + return new() { - IsSelected = true, - CoreType = _geo, + IsSelected = _config.CheckUpdateItem.SelectedCoreTypes?.Contains(coreType) ?? true, + CoreType = coreType, Remarks = ResUI.menuCheckUpdate, - }); + }; + } + + private async Task SaveSelectedCoreTypes() + { + _config.CheckUpdateItem.SelectedCoreTypes = _checkUpdateModel.Where(t => t.IsSelected == true).Select(t => t.CoreType ?? "").ToList(); + await ConfigHandler.SaveConfig(_config); } private async Task CheckUpdate() { _lstUpdated.Clear(); - _lstUpdated = _checkUpdateItem.Where(x => x.IsSelected == true) - .Select(x => new CheckUpdateItem() { CoreType = x.CoreType }).ToList(); + _lstUpdated = _checkUpdateModel.Where(x => x.IsSelected == true) + .Select(x => new CheckUpdateModel() { CoreType = x.CoreType }).ToList(); + await SaveSelectedCoreTypes(); - for (var k = _checkUpdateItem.Count - 1; k >= 0; k--) + for (var k = _checkUpdateModel.Count - 1; k >= 0; k--) { - var item = _checkUpdateItem[k]; + var item = _checkUpdateModel[k]; if (item.IsSelected != true) continue; UpdateView(item.CoreType, "..."); @@ -161,23 +152,23 @@ namespace ServiceLib.ViewModels }); } - private async Task CheckUpdateCore(CheckUpdateItem item, bool preRelease) + private async Task CheckUpdateCore(CheckUpdateModel model, bool preRelease) { void _updateUI(bool success, string msg) { - UpdateView(item.CoreType, msg); + UpdateView(model.CoreType, msg); if (success) { - UpdateView(item.CoreType, ResUI.MsgUpdateV2rayCoreSuccessfullyMore); + UpdateView(model.CoreType, ResUI.MsgUpdateV2rayCoreSuccessfullyMore); - UpdatedPlusPlus(item.CoreType, msg); + UpdatedPlusPlus(model.CoreType, msg); } } - var type = (ECoreType)Enum.Parse(typeof(ECoreType), item.CoreType); + var type = (ECoreType)Enum.Parse(typeof(ECoreType), model.CoreType); await (new UpdateService()).CheckUpdateCore(type, _config, _updateUI, preRelease) .ContinueWith(t => { - UpdatedPlusPlus(item.CoreType, ""); + UpdatedPlusPlus(model.CoreType, ""); }); } @@ -291,7 +282,7 @@ namespace ServiceLib.ViewModels private void UpdateView(string coreType, string msg) { - var item = new CheckUpdateItem() + var item = new CheckUpdateModel() { CoreType = coreType, Remarks = msg, @@ -299,13 +290,13 @@ namespace ServiceLib.ViewModels _updateView?.Invoke(EViewAction.DispatcherCheckUpdate, item); } - public void UpdateViewResult(CheckUpdateItem item) + public void UpdateViewResult(CheckUpdateModel model) { - var found = _checkUpdateItem.FirstOrDefault(t => t.CoreType == item.CoreType); + var found = _checkUpdateModel.FirstOrDefault(t => t.CoreType == model.CoreType); if (found == null) return; var itemCopy = JsonUtils.DeepCopy(found); - itemCopy.Remarks = item.Remarks; - _checkUpdateItem.Replace(found, itemCopy); + itemCopy.Remarks = model.Remarks; + _checkUpdateModel.Replace(found, itemCopy); } } } \ No newline at end of file diff --git a/v2rayn/v2rayN/ServiceLib/ViewModels/OptionSettingViewModel.cs b/v2rayn/v2rayN/ServiceLib/ViewModels/OptionSettingViewModel.cs index 26a7815299..65369944ec 100644 --- a/v2rayn/v2rayN/ServiceLib/ViewModels/OptionSettingViewModel.cs +++ b/v2rayn/v2rayN/ServiceLib/ViewModels/OptionSettingViewModel.cs @@ -53,7 +53,6 @@ namespace ServiceLib.ViewModels [Reactive] public bool EnableUpdateSubOnlyRemarksExist { get; set; } [Reactive] public bool EnableSecurityProtocolTls13 { get; set; } [Reactive] public bool AutoHideStartup { get; set; } - [Reactive] public bool EnableCheckPreReleaseUpdate { get; set; } [Reactive] public bool EnableDragDropSort { get; set; } [Reactive] public bool DoubleClick2Activate { get; set; } [Reactive] public int AutoUpdateInterval { get; set; } @@ -166,7 +165,6 @@ namespace ServiceLib.ViewModels EnableUpdateSubOnlyRemarksExist = _config.UiItem.EnableUpdateSubOnlyRemarksExist; EnableSecurityProtocolTls13 = _config.GuiItem.EnableSecurityProtocolTls13; AutoHideStartup = _config.UiItem.AutoHideStartup; - EnableCheckPreReleaseUpdate = _config.GuiItem.CheckPreReleaseUpdate; EnableDragDropSort = _config.UiItem.EnableDragDropSort; DoubleClick2Activate = _config.UiItem.DoubleClick2Activate; AutoUpdateInterval = _config.GuiItem.AutoUpdateInterval; @@ -317,7 +315,6 @@ namespace ServiceLib.ViewModels _config.GuiItem.EnableSecurityProtocolTls13 = EnableSecurityProtocolTls13; _config.UiItem.AutoHideStartup = AutoHideStartup; _config.GuiItem.AutoUpdateInterval = AutoUpdateInterval; - _config.GuiItem.CheckPreReleaseUpdate = EnableCheckPreReleaseUpdate; _config.UiItem.EnableDragDropSort = EnableDragDropSort; _config.UiItem.DoubleClick2Activate = DoubleClick2Activate; _config.GuiItem.TrayMenuServersLimit = TrayMenuServersLimit; diff --git a/v2rayn/v2rayN/v2rayN.Desktop/Views/CheckUpdateView.axaml b/v2rayn/v2rayN/v2rayN.Desktop/Views/CheckUpdateView.axaml index cd6f384336..8ccd0f0716 100644 --- a/v2rayn/v2rayN/v2rayN.Desktop/Views/CheckUpdateView.axaml +++ b/v2rayn/v2rayN/v2rayN.Desktop/Views/CheckUpdateView.axaml @@ -39,7 +39,7 @@ + ItemsSource="{Binding CheckUpdateModels}"> diff --git a/v2rayn/v2rayN/v2rayN.Desktop/Views/CheckUpdateView.axaml.cs b/v2rayn/v2rayN/v2rayN.Desktop/Views/CheckUpdateView.axaml.cs index 6859b5776e..5395b1c376 100644 --- a/v2rayn/v2rayN/v2rayN.Desktop/Views/CheckUpdateView.axaml.cs +++ b/v2rayn/v2rayN/v2rayN.Desktop/Views/CheckUpdateView.axaml.cs @@ -15,7 +15,7 @@ namespace v2rayN.Desktop.Views this.WhenActivated(disposables => { - this.OneWayBind(ViewModel, vm => vm.CheckUpdateItems, v => v.lstCheckUpdates.ItemsSource).DisposeWith(disposables); + this.OneWayBind(ViewModel, vm => vm.CheckUpdateModels, v => v.lstCheckUpdates.ItemsSource).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.EnableCheckPreReleaseUpdate, v => v.togEnableCheckPreReleaseUpdate.IsChecked).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.CheckUpdateCmd, v => v.btnCheckUpdate).DisposeWith(disposables); @@ -29,7 +29,7 @@ namespace v2rayN.Desktop.Views case EViewAction.DispatcherCheckUpdate: if (obj is null) return false; Dispatcher.UIThread.Post(() => - ViewModel?.UpdateViewResult((CheckUpdateItem)obj), + ViewModel?.UpdateViewResult((CheckUpdateModel)obj), DispatcherPriority.Default); break; diff --git a/v2rayn/v2rayN/v2rayN.Desktop/Views/OptionSettingWindow.axaml b/v2rayn/v2rayN/v2rayN.Desktop/Views/OptionSettingWindow.axaml index 8ac6dedc23..e56e6c5696 100644 --- a/v2rayn/v2rayN/v2rayN.Desktop/Views/OptionSettingWindow.axaml +++ b/v2rayn/v2rayN/v2rayN.Desktop/Views/OptionSettingWindow.axaml @@ -489,18 +489,7 @@ HorizontalAlignment="Left" Classes="Margin8" /> - - + vm.EnableUpdateSubOnlyRemarksExist, v => v.togEnableUpdateSubOnlyRemarksExist.IsChecked).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.EnableSecurityProtocolTls13, v => v.togEnableSecurityProtocolTls13.IsChecked).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.AutoHideStartup, v => v.togAutoHideStartup.IsChecked).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.EnableCheckPreReleaseUpdate, v => v.togEnableCheckPreReleaseUpdate.IsChecked).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.DoubleClick2Activate, v => v.togDoubleClick2Activate.IsChecked).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.AutoUpdateInterval, v => v.txtautoUpdateInterval.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.CurrentFontFamily, v => v.cmbcurrentFontFamily.SelectedValue).DisposeWith(disposables); diff --git a/v2rayn/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml.cs b/v2rayn/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml.cs index e03edc46d1..83a5e32ab6 100644 --- a/v2rayn/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml.cs +++ b/v2rayn/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml.cs @@ -189,6 +189,8 @@ namespace v2rayN.Desktop.Views private void LstProfiles_DoubleTapped(object? sender, Avalonia.Input.TappedEventArgs e) { + var source = e.Source as Border; + if (source == null || source.Name != "CellBorder") return; if (_config.UiItem.DoubleClick2Activate) { ViewModel?.SetDefaultServer(); diff --git a/v2rayn/v2rayN/v2rayN.Desktop/Views/SubEditWindow.axaml b/v2rayn/v2rayN/v2rayN.Desktop/Views/SubEditWindow.axaml index c5d22cfdb1..bd7e01f08c 100644 --- a/v2rayn/v2rayN/v2rayN.Desktop/Views/SubEditWindow.axaml +++ b/v2rayn/v2rayN/v2rayN.Desktop/Views/SubEditWindow.axaml @@ -52,6 +52,7 @@ + @@ -114,7 +115,7 @@ + + + vm.SelectedSource.PrevProfile, v => v.txtPrevProfile.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.SelectedSource.NextProfile, v => v.txtNextProfile.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.SelectedSource.PreSocksPort, v => v.txtPreSocksPort.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.Memo, v => v.txtMemo.Text).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.SaveCmd, v => v.btnSave).DisposeWith(disposables); }); diff --git a/v2rayn/v2rayN/v2rayN/Views/CheckUpdateView.xaml.cs b/v2rayn/v2rayN/v2rayN/Views/CheckUpdateView.xaml.cs index ad676092f5..27200ee9e9 100644 --- a/v2rayn/v2rayN/v2rayN/Views/CheckUpdateView.xaml.cs +++ b/v2rayn/v2rayN/v2rayN/Views/CheckUpdateView.xaml.cs @@ -15,7 +15,7 @@ namespace v2rayN.Views this.WhenActivated(disposables => { - this.OneWayBind(ViewModel, vm => vm.CheckUpdateItems, v => v.lstCheckUpdates.ItemsSource).DisposeWith(disposables); + this.OneWayBind(ViewModel, vm => vm.CheckUpdateModels, v => v.lstCheckUpdates.ItemsSource).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.EnableCheckPreReleaseUpdate, v => v.togEnableCheckPreReleaseUpdate.IsChecked).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.CheckUpdateCmd, v => v.btnCheckUpdate).DisposeWith(disposables); @@ -30,7 +30,7 @@ namespace v2rayN.Views if (obj is null) return false; Application.Current?.Dispatcher.Invoke((() => { - ViewModel?.UpdateViewResult((CheckUpdateItem)obj); + ViewModel?.UpdateViewResult((CheckUpdateModel)obj); }), DispatcherPriority.Normal); break; diff --git a/v2rayn/v2rayN/v2rayN/Views/OptionSettingWindow.xaml b/v2rayn/v2rayN/v2rayN/Views/OptionSettingWindow.xaml index a9e5185916..61ce6d2c02 100644 --- a/v2rayn/v2rayN/v2rayN/Views/OptionSettingWindow.xaml +++ b/v2rayn/v2rayN/v2rayN/Views/OptionSettingWindow.xaml @@ -661,20 +661,6 @@ Margin="{StaticResource Margin8}" HorizontalAlignment="Left" /> - - - vm.EnableUpdateSubOnlyRemarksExist, v => v.togEnableUpdateSubOnlyRemarksExist.IsChecked).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.EnableSecurityProtocolTls13, v => v.togEnableSecurityProtocolTls13.IsChecked).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.AutoHideStartup, v => v.togAutoHideStartup.IsChecked).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.EnableCheckPreReleaseUpdate, v => v.togEnableCheckPreReleaseUpdate.IsChecked).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.EnableDragDropSort, v => v.togEnableDragDropSort.IsChecked).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.DoubleClick2Activate, v => v.togDoubleClick2Activate.IsChecked).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.AutoUpdateInterval, v => v.txtautoUpdateInterval.Text).DisposeWith(disposables); diff --git a/v2rayn/v2rayN/v2rayN/Views/SubEditWindow.xaml b/v2rayn/v2rayN/v2rayN/Views/SubEditWindow.xaml index d6594e7098..3853afd8b1 100644 --- a/v2rayn/v2rayN/v2rayN/Views/SubEditWindow.xaml +++ b/v2rayn/v2rayN/v2rayN/Views/SubEditWindow.xaml @@ -1,14 +1,14 @@  + @@ -165,7 +166,7 @@ + + + + diff --git a/v2rayn/v2rayN/v2rayN/Views/SubEditWindow.xaml.cs b/v2rayn/v2rayN/v2rayN/Views/SubEditWindow.xaml.cs index 18ff5da134..f070af78fd 100644 --- a/v2rayn/v2rayN/v2rayN/Views/SubEditWindow.xaml.cs +++ b/v2rayn/v2rayN/v2rayN/Views/SubEditWindow.xaml.cs @@ -34,6 +34,7 @@ namespace v2rayN.Views this.Bind(ViewModel, vm => vm.SelectedSource.PrevProfile, v => v.txtPrevProfile.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.SelectedSource.NextProfile, v => v.txtNextProfile.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.SelectedSource.PreSocksPort, v => v.txtPreSocksPort.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.Memo, v => v.txtMemo.Text).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.SaveCmd, v => v.btnSave).DisposeWith(disposables); }); diff --git a/v2rayng/.github/workflows/build.yml b/v2rayng/.github/workflows/build.yml index 777d9fad72..7638b198f1 100644 --- a/v2rayng/.github/workflows/build.yml +++ b/v2rayng/.github/workflows/build.yml @@ -15,10 +15,10 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v4.2.2 + uses: actions/checkout@v4 - name: Setup Java - uses: actions/setup-java@v4.5.0 + uses: actions/setup-java@v4 with: distribution: 'temurin' java-version: '21' @@ -26,16 +26,22 @@ jobs: - name: Setup Golang uses: actions/setup-go@v5 with: - go-version: '1.22.4' + go-version: '1.23.2' cache: false + - name: Patch Go use 600296 + #https://go-review.googlesource.com/c/go/+/600296 + run: | + cd "$(go env GOROOT)" + curl "https://go-review.googlesource.com/changes/go~600296/revisions/5/patch" | base64 -d | patch --verbose -p 1 + - name: Install gomobile run: | go install golang.org/x/mobile/cmd/gomobile@v0.0.0-20240806205939-81131f6468ab echo "$(go env GOPATH)/bin" >> $GITHUB_PATH - name: Setup Android environment - uses: android-actions/setup-android@v3.2.1 + uses: android-actions/setup-android@v3 - name: Build dependencies run: | @@ -56,28 +62,28 @@ jobs: ./gradlew assembleDebug - name: Upload arm64-v8a APK - uses: actions/upload-artifact@v4.4.3 + uses: actions/upload-artifact@v4 if: ${{ success() }} with: name: arm64-v8a path: ${{ github.workspace }}/V2rayNG/app/build/outputs/apk/debug/*arm64-v8a*.apk - name: Upload armeabi-v7a APK - uses: actions/upload-artifact@v4.4.3 + uses: actions/upload-artifact@v4 if: ${{ success() }} with: name: armeabi-v7a path: ${{ github.workspace }}/V2rayNG/app/build/outputs/apk/debug/*armeabi-v7a*.apk - name: Upload x86 APK - uses: actions/upload-artifact@v4.4.3 + uses: actions/upload-artifact@v4 if: ${{ success() }} with: name: x86-apk path: ${{ github.workspace }}/V2rayNG/app/build/outputs/apk/debug/*x86*.apk - name: Upload Other APKs - uses: actions/upload-artifact@v4.4.3 + uses: actions/upload-artifact@v4 with: name: others-apk path: | diff --git a/v2rayng/V2rayNG/app/build.gradle.kts b/v2rayng/V2rayNG/app/build.gradle.kts index 6f965c3eb9..a6e1f59c57 100644 --- a/v2rayng/V2rayNG/app/build.gradle.kts +++ b/v2rayng/V2rayNG/app/build.gradle.kts @@ -11,8 +11,8 @@ android { applicationId = "com.v2ray.ang" minSdk = 21 targetSdk = 35 - versionCode = 603 - versionName = "1.9.9" + versionCode = 605 + versionName = "1.9.11" multiDexEnabled = true splits { abi { diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/handler/AngConfigManager.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/handler/AngConfigManager.kt index 7488ba7b53..d3eb675103 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/handler/AngConfigManager.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/handler/AngConfigManager.kt @@ -277,7 +277,7 @@ object AngConfigManager { if (serverList.isNotEmpty()) { var count = 0 for (srv in serverList.reversed()) { - val config = CustomFmt.parse(server) ?: continue + val config = CustomFmt.parse(JsonUtil.toJson(srv)) ?: continue config.subscriptionId = subid val key = MmkvManager.encodeServerConfig("", config) MmkvManager.encodeServerRaw(key, JsonUtil.toJsonPretty(srv)) diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/handler/MigrateManager.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/handler/MigrateManager.kt index 3509ac1a0e..9437de5a51 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/handler/MigrateManager.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/handler/MigrateManager.kt @@ -36,7 +36,7 @@ object MigrateManager { //check and remove old decodeServerConfig(guid) ?: continue - serverStorage.remove(guid) + //serverStorage.remove(guid) Log.d(ANG_PACKAGE, "migrateServerConfig2Profile-" + config.remarks) } Log.d(ANG_PACKAGE, "migrateServerConfig2Profile-end") diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/handler/SettingsManager.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/handler/SettingsManager.kt index 3c0bb5f1b4..29ebfb8e8e 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/handler/SettingsManager.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/handler/SettingsManager.kt @@ -1,8 +1,11 @@ package com.v2ray.ang.handler import android.content.Context +import android.content.res.AssetManager import android.text.TextUtils +import android.util.Log import com.v2ray.ang.AppConfig +import com.v2ray.ang.AppConfig.ANG_PACKAGE import com.v2ray.ang.AppConfig.GEOIP_PRIVATE import com.v2ray.ang.AppConfig.GEOSITE_PRIVATE import com.v2ray.ang.AppConfig.TAG_DIRECT @@ -14,6 +17,8 @@ import com.v2ray.ang.handler.MmkvManager.decodeServerList import com.v2ray.ang.util.JsonUtil import com.v2ray.ang.util.Utils import com.v2ray.ang.util.Utils.parseInt +import java.io.File +import java.io.FileOutputStream import java.util.Collections import kotlin.Int @@ -153,4 +158,29 @@ object SettingsManager { return parseInt(MmkvManager.decodeSettingsString(AppConfig.PREF_HTTP_PORT), AppConfig.PORT_HTTP.toInt()) } + fun initAssets(context: Context, assets: AssetManager) { + val extFolder = Utils.userAssetPath(context) + + try { + val geo = arrayOf("geosite.dat", "geoip.dat") + assets.list("") + ?.filter { geo.contains(it) } + ?.filter { !File(extFolder, it).exists() } + ?.forEach { + val target = File(extFolder, it) + assets.open(it).use { input -> + FileOutputStream(target).use { output -> + input.copyTo(output) + } + } + Log.i( + ANG_PACKAGE, + "Copied from apk assets folder to ${target.absolutePath}" + ) + } + } catch (e: Exception) { + Log.e(ANG_PACKAGE, "asset copy failed", e) + } + + } } diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/handler/V2rayConfigManager.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/handler/V2rayConfigManager.kt index f95e6ff99e..5379b5d1d1 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/handler/V2rayConfigManager.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/handler/V2rayConfigManager.kt @@ -334,9 +334,7 @@ object V2rayConfigManager { servers.add( V2rayConfig.DnsBean.ServersBean( address = remoteDns.first(), - port = 53, domains = proxyDomain, - expectIPs = null ) ) } @@ -350,7 +348,6 @@ object V2rayConfigManager { servers.add( V2rayConfig.DnsBean.ServersBean( address = domesticDns.first(), - port = 53, domains = directDomain, expectIPs = if (isCnRoutingMode) geoipCn else null, skipFallback = true @@ -522,7 +519,7 @@ object V2rayConfigManager { noises = listOf( V2rayConfig.OutboundBean.OutSettingsBean.NoiseBean( type = "rand", - packet = "50-150", + packet = "10-20", delay = "10-16", ) ), diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/ProcessService.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/ProcessService.kt index e88f7a2949..c73fe2b940 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/ProcessService.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/ProcessService.kt @@ -9,7 +9,7 @@ import kotlinx.coroutines.launch class ProcessService { private val TAG = ANG_PACKAGE - private lateinit var process: Process + private var process: Process? = null fun runProcess(context: Context, cmd: MutableList) { Log.d(TAG, cmd.toString()) @@ -24,7 +24,7 @@ class ProcessService { CoroutineScope(Dispatchers.IO).launch { Thread.sleep(50L) Log.d(TAG, "runProcess check") - process.waitFor() + process?.waitFor() Log.d(TAG, "runProcess exited") } Log.d(TAG, process.toString()) @@ -42,4 +42,4 @@ class ProcessService { Log.d(TAG, e.toString()) } } -} \ No newline at end of file +} diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayServiceManager.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayServiceManager.kt index a0fcf27c1d..7518163fc5 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayServiceManager.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayServiceManager.kt @@ -65,7 +65,7 @@ object V2RayServiceManager { if (v2rayPoint.isRunning) return val guid = MmkvManager.getSelectServer() ?: return val config = MmkvManager.decodeServerConfig(guid) ?: return - if (!Utils.isValidUrl(config.server) && !Utils.isValidUrl(config.server)) return + if (!Utils.isValidUrl(config.server) && !Utils.isIpAddress(config.server)) return // val result = V2rayConfigUtil.getV2rayConfig(context, guid) // if (!result.status) return diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt index 9edcdc4af9..8b38b368ea 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt @@ -173,7 +173,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList } } mainViewModel.startListenBroadcast() - mainViewModel.copyAssets(assets) + mainViewModel.initAssets(assets) } private fun migrateLegacy() { diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/UserAssetActivity.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/UserAssetActivity.kt index 8a4ab68dde..b9d7ffd73d 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/UserAssetActivity.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/UserAssetActivity.kt @@ -34,6 +34,7 @@ import com.v2ray.ang.handler.SettingsManager import com.v2ray.ang.util.Utils import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import java.io.File import java.io.FileOutputStream import java.net.HttpURLConnection @@ -239,6 +240,15 @@ class UserAssetActivity : BaseActivity() { return list + assets } + fun initAssets() { + lifecycleScope.launch(Dispatchers.Default) { + SettingsManager.initAssets(this@UserAssetActivity, assets) + withContext(Dispatchers.Main) { + binding.recyclerView.adapter?.notifyDataSetChanged() + } + } + } + inner class UserAssetAdapter : RecyclerView.Adapter() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): UserAssetViewHolder { return UserAssetViewHolder( @@ -270,10 +280,10 @@ class UserAssetActivity : BaseActivity() { if (item.second.remarks in builtInGeoFiles && item.second.url == AppConfig.GeoUrl + item.second.remarks) { holder.itemUserAssetBinding.layoutEdit.visibility = GONE - holder.itemUserAssetBinding.layoutRemove.visibility = GONE + //holder.itemUserAssetBinding.layoutRemove.visibility = GONE } else { holder.itemUserAssetBinding.layoutEdit.visibility = item.second.url.let { if (it == "file") GONE else VISIBLE } - holder.itemUserAssetBinding.layoutRemove.visibility = VISIBLE + //holder.itemUserAssetBinding.layoutRemove.visibility = VISIBLE } holder.itemUserAssetBinding.layoutEdit.setOnClickListener { @@ -282,9 +292,16 @@ class UserAssetActivity : BaseActivity() { startActivity(intent) } holder.itemUserAssetBinding.layoutRemove.setOnClickListener { - file?.delete() - MmkvManager.removeAssetUrl(item.first) - binding.recyclerView.adapter?.notifyItemRemoved(position) + AlertDialog.Builder(this@UserAssetActivity).setMessage(R.string.del_config_comfirm) + .setPositiveButton(android.R.string.ok) { _, _ -> + file?.delete() + MmkvManager.removeAssetUrl(item.first) + initAssets() + } + .setNegativeButton(android.R.string.no) { _, _ -> + //do noting + } + .show() } } diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/PluginUtil.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/PluginUtil.kt index 5c68c223b8..a7566076b3 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/PluginUtil.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/PluginUtil.kt @@ -14,7 +14,9 @@ object PluginUtil { //private const val HYSTERIA2 = "hysteria2-plugin" private const val HYSTERIA2 = "libhysteria2.so" private const val TAG = ANG_PACKAGE - private lateinit var procService: ProcessService + private val procService: ProcessService by lazy { + ProcessService() + } // fun initPlugin(name: String): PluginManager.InitResult { // return PluginManager.init(name)!! @@ -27,7 +29,6 @@ object PluginUtil { val configFile = genConfigHy2(context, config, domainPort) ?: return val cmd = genCmdHy2(context, configFile) - procService = ProcessService() procService.runProcess(context, cmd) } } @@ -94,4 +95,4 @@ object PluginUtil { Log.d(TAG, e.toString()) } } -} \ No newline at end of file +} diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/Utils.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/Utils.kt index 25efc675d1..aab069639d 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/Utils.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/Utils.kt @@ -159,8 +159,11 @@ object Utils { /** * is ip address */ - fun isIpAddress(value: String): Boolean { + fun isIpAddress(value: String?): Boolean { try { + if (value.isNullOrEmpty()) { + return false + } var addr = value if (addr.isEmpty() || addr.isBlank()) { return false diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/MainViewModel.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/MainViewModel.kt index aa6f34131c..a62be1facd 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/MainViewModel.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/MainViewModel.kt @@ -22,16 +22,14 @@ import com.v2ray.ang.extension.toast import com.v2ray.ang.fmt.CustomFmt import com.v2ray.ang.handler.AngConfigManager import com.v2ray.ang.handler.MmkvManager +import com.v2ray.ang.handler.SettingsManager import com.v2ray.ang.util.MessageUtil import com.v2ray.ang.util.SpeedtestUtil -import com.v2ray.ang.util.Utils import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.cancelChildren import kotlinx.coroutines.launch -import java.io.File -import java.io.FileOutputStream import java.util.Collections class MainViewModel(application: Application) : AndroidViewModel(application) { @@ -320,30 +318,9 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { MmkvManager.encodeServerList(serverList) } - - fun copyAssets(assets: AssetManager) { - val extFolder = Utils.userAssetPath(getApplication()) + fun initAssets(assets: AssetManager) { viewModelScope.launch(Dispatchers.Default) { - try { - val geo = arrayOf("geosite.dat", "geoip.dat") - assets.list("") - ?.filter { geo.contains(it) } - ?.filter { !File(extFolder, it).exists() } - ?.forEach { - val target = File(extFolder, it) - assets.open(it).use { input -> - FileOutputStream(target).use { output -> - input.copyTo(output) - } - } - Log.i( - ANG_PACKAGE, - "Copied from apk assets folder to ${target.absolutePath}" - ) - } - } catch (e: Exception) { - Log.e(ANG_PACKAGE, "asset copy failed", e) - } + SettingsManager.initAssets(getApplication(), assets) } } diff --git a/vue-color-avatar/.npmrc b/vue-color-avatar/.npmrc new file mode 100644 index 0000000000..214c29d139 --- /dev/null +++ b/vue-color-avatar/.npmrc @@ -0,0 +1 @@ +registry=https://registry.npmjs.org/ diff --git a/xray-core/app/dns/dnscommon_test.go b/xray-core/app/dns/dnscommon_test.go index 6530d1a00c..d11f863269 100644 --- a/xray-core/app/dns/dnscommon_test.go +++ b/xray-core/app/dns/dnscommon_test.go @@ -88,7 +88,7 @@ func Test_parseResponse(t *testing.T) { got.Expire = time.Time{} } if cmp.Diff(got, tt.want) != "" { - t.Errorf(cmp.Diff(got, tt.want)) + t.Error(cmp.Diff(got, tt.want)) // t.Errorf("handleResponse() = %#v, want %#v", got, tt.want) } }) diff --git a/xray-core/app/proxyman/inbound/worker.go b/xray-core/app/proxyman/inbound/worker.go index a14a338f45..14df725dc6 100644 --- a/xray-core/app/proxyman/inbound/worker.go +++ b/xray-core/app/proxyman/inbound/worker.go @@ -464,7 +464,8 @@ func (w *dsWorker) callback(conn stat.Connection) { } } ctx = session.ContextWithInbound(ctx, &session.Inbound{ - Source: net.DestinationFromAddr(conn.RemoteAddr()), + // Unix have no source addr, so we use gateway as source for log. + Source: net.UnixDestination(w.address), Gateway: net.UnixDestination(w.address), Tag: w.tag, Conn: conn, diff --git a/xray-core/common/net/destination.go b/xray-core/common/net/destination.go index 90f8298b3d..952dcc6b4e 100644 --- a/xray-core/common/net/destination.go +++ b/xray-core/common/net/destination.go @@ -89,10 +89,12 @@ func UnixDestination(address Address) Destination { // NetAddr returns the network address in this Destination in string form. func (d Destination) NetAddr() string { addr := "" - if d.Network == Network_TCP || d.Network == Network_UDP { - addr = d.Address.String() + ":" + d.Port.String() - } else if d.Network == Network_UNIX { - addr = d.Address.String() + if d.Address != nil { + if d.Network == Network_TCP || d.Network == Network_UDP { + addr = d.Address.String() + ":" + d.Port.String() + } else if d.Network == Network_UNIX { + addr = d.Address.String() + } } return addr } diff --git a/xray-core/transport/internet/memory_settings.go b/xray-core/transport/internet/memory_settings.go index 5add530c54..a46fc297b4 100644 --- a/xray-core/transport/internet/memory_settings.go +++ b/xray-core/transport/internet/memory_settings.go @@ -1,7 +1,10 @@ package internet +import "github.com/xtls/xray-core/common/net" + // MemoryStreamConfig is a parsed form of StreamConfig. This is used to reduce the number of Protobuf parsings. type MemoryStreamConfig struct { + Destination *net.Destination ProtocolName string ProtocolSettings interface{} SecurityType string @@ -23,6 +26,13 @@ func ToMemoryStreamConfig(s *StreamConfig) (*MemoryStreamConfig, error) { } if s != nil { + if s.Address != nil { + mss.Destination = &net.Destination{ + Address: s.Address.AsAddress(), + Port: net.Port(s.Port), + Network: net.Network_TCP, + } + } mss.SocketSettings = s.SocketSettings } diff --git a/xray-core/transport/internet/splithttp/dialer.go b/xray-core/transport/internet/splithttp/dialer.go index 43ba0a46a0..ea935198da 100644 --- a/xray-core/transport/internet/splithttp/dialer.go +++ b/xray-core/transport/internet/splithttp/dialer.go @@ -264,12 +264,7 @@ func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.Me } globalDialerAccess.Unlock() memory2 := streamSettings.DownloadSettings - dest2 := net.Destination{ - Address: transportConfiguration.DownloadSettings.Address.AsAddress(), // just panic - Port: net.Port(transportConfiguration.DownloadSettings.Port), - Network: net.Network_TCP, - } - httpClient2, muxRes2 = getHTTPClient(ctx, dest2, memory2) + httpClient2, muxRes2 = getHTTPClient(ctx, *memory2.Destination, memory2) // just panic if tls.ConfigFromStreamSettings(memory2) != nil || reality.ConfigFromStreamSettings(memory2) != nil { requestURL2.Scheme = "https" } else { @@ -278,7 +273,7 @@ func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.Me config2 := memory2.ProtocolSettings.(*Config) requestURL2.Host = config2.Host if requestURL2.Host == "" { - requestURL2.Host = dest2.NetAddr() + requestURL2.Host = memory2.Destination.NetAddr() } requestURL2.Path = requestURL.Path // the same requestURL2.RawQuery = config2.GetNormalizedQuery() diff --git a/yt-dlp/.github/ISSUE_TEMPLATE/1_broken_site.yml b/yt-dlp/.github/ISSUE_TEMPLATE/1_broken_site.yml index 3b0ef323d7..20e5e944fc 100644 --- a/yt-dlp/.github/ISSUE_TEMPLATE/1_broken_site.yml +++ b/yt-dlp/.github/ISSUE_TEMPLATE/1_broken_site.yml @@ -63,14 +63,15 @@ body: placeholder: | [debug] Command-line config: ['-vU', 'https://www.youtube.com/watch?v=BaW_jenozKc'] [debug] Encodings: locale cp65001, fs utf-8, pref cp65001, out utf-8, error utf-8, screen utf-8 - [debug] yt-dlp version nightly@... from yt-dlp/yt-dlp [b634ba742] (win_exe) - [debug] Python 3.8.10 (CPython 64bit) - Windows-10-10.0.22000-SP0 - [debug] exe versions: ffmpeg N-106550-g072101bd52-20220410 (fdk,setts), ffprobe N-106624-g391ce570c8-20220415, phantomjs 2.1.1 - [debug] Optional libraries: Cryptodome-3.15.0, brotli-1.0.9, certifi-2022.06.15, mutagen-1.45.1, sqlite3-2.6.0, websockets-10.3 + [debug] yt-dlp version nightly@... from yt-dlp/yt-dlp-nightly-builds [1a176d874] (win_exe) + [debug] Python 3.10.11 (CPython AMD64 64bit) - Windows-10-10.0.20348-SP0 (OpenSSL 1.1.1t 7 Feb 2023) + [debug] exe versions: ffmpeg 7.0.2 (setts), ffprobe 7.0.2 + [debug] Optional libraries: Cryptodome-3.21.0, brotli-1.1.0, certifi-2024.08.30, curl_cffi-0.5.10, mutagen-1.47.0, requests-2.32.3, sqlite3-3.40.1, urllib3-2.2.3, websockets-13.1 [debug] Proxy map: {} - [debug] Request Handlers: urllib, requests - [debug] Loaded 1893 extractors - [debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp-nightly-builds/releases/latest + [debug] Request Handlers: urllib, requests, websockets, curl_cffi + [debug] Loaded 1838 extractors + [debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest + Latest version: nightly@... from yt-dlp/yt-dlp-nightly-builds yt-dlp is up to date (nightly@... from yt-dlp/yt-dlp-nightly-builds) [youtube] Extracting URL: https://www.youtube.com/watch?v=BaW_jenozKc diff --git a/yt-dlp/.github/ISSUE_TEMPLATE/2_site_support_request.yml b/yt-dlp/.github/ISSUE_TEMPLATE/2_site_support_request.yml index c8702c3569..4aeff7dc64 100644 --- a/yt-dlp/.github/ISSUE_TEMPLATE/2_site_support_request.yml +++ b/yt-dlp/.github/ISSUE_TEMPLATE/2_site_support_request.yml @@ -75,14 +75,15 @@ body: placeholder: | [debug] Command-line config: ['-vU', 'https://www.youtube.com/watch?v=BaW_jenozKc'] [debug] Encodings: locale cp65001, fs utf-8, pref cp65001, out utf-8, error utf-8, screen utf-8 - [debug] yt-dlp version nightly@... from yt-dlp/yt-dlp [b634ba742] (win_exe) - [debug] Python 3.8.10 (CPython 64bit) - Windows-10-10.0.22000-SP0 - [debug] exe versions: ffmpeg N-106550-g072101bd52-20220410 (fdk,setts), ffprobe N-106624-g391ce570c8-20220415, phantomjs 2.1.1 - [debug] Optional libraries: Cryptodome-3.15.0, brotli-1.0.9, certifi-2022.06.15, mutagen-1.45.1, sqlite3-2.6.0, websockets-10.3 + [debug] yt-dlp version nightly@... from yt-dlp/yt-dlp-nightly-builds [1a176d874] (win_exe) + [debug] Python 3.10.11 (CPython AMD64 64bit) - Windows-10-10.0.20348-SP0 (OpenSSL 1.1.1t 7 Feb 2023) + [debug] exe versions: ffmpeg 7.0.2 (setts), ffprobe 7.0.2 + [debug] Optional libraries: Cryptodome-3.21.0, brotli-1.1.0, certifi-2024.08.30, curl_cffi-0.5.10, mutagen-1.47.0, requests-2.32.3, sqlite3-3.40.1, urllib3-2.2.3, websockets-13.1 [debug] Proxy map: {} - [debug] Request Handlers: urllib, requests - [debug] Loaded 1893 extractors - [debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp-nightly-builds/releases/latest + [debug] Request Handlers: urllib, requests, websockets, curl_cffi + [debug] Loaded 1838 extractors + [debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest + Latest version: nightly@... from yt-dlp/yt-dlp-nightly-builds yt-dlp is up to date (nightly@... from yt-dlp/yt-dlp-nightly-builds) [youtube] Extracting URL: https://www.youtube.com/watch?v=BaW_jenozKc diff --git a/yt-dlp/.github/ISSUE_TEMPLATE/3_site_feature_request.yml b/yt-dlp/.github/ISSUE_TEMPLATE/3_site_feature_request.yml index 5a6d2b0fbd..2f516ebb71 100644 --- a/yt-dlp/.github/ISSUE_TEMPLATE/3_site_feature_request.yml +++ b/yt-dlp/.github/ISSUE_TEMPLATE/3_site_feature_request.yml @@ -71,14 +71,15 @@ body: placeholder: | [debug] Command-line config: ['-vU', 'https://www.youtube.com/watch?v=BaW_jenozKc'] [debug] Encodings: locale cp65001, fs utf-8, pref cp65001, out utf-8, error utf-8, screen utf-8 - [debug] yt-dlp version nightly@... from yt-dlp/yt-dlp [b634ba742] (win_exe) - [debug] Python 3.8.10 (CPython 64bit) - Windows-10-10.0.22000-SP0 - [debug] exe versions: ffmpeg N-106550-g072101bd52-20220410 (fdk,setts), ffprobe N-106624-g391ce570c8-20220415, phantomjs 2.1.1 - [debug] Optional libraries: Cryptodome-3.15.0, brotli-1.0.9, certifi-2022.06.15, mutagen-1.45.1, sqlite3-2.6.0, websockets-10.3 + [debug] yt-dlp version nightly@... from yt-dlp/yt-dlp-nightly-builds [1a176d874] (win_exe) + [debug] Python 3.10.11 (CPython AMD64 64bit) - Windows-10-10.0.20348-SP0 (OpenSSL 1.1.1t 7 Feb 2023) + [debug] exe versions: ffmpeg 7.0.2 (setts), ffprobe 7.0.2 + [debug] Optional libraries: Cryptodome-3.21.0, brotli-1.1.0, certifi-2024.08.30, curl_cffi-0.5.10, mutagen-1.47.0, requests-2.32.3, sqlite3-3.40.1, urllib3-2.2.3, websockets-13.1 [debug] Proxy map: {} - [debug] Request Handlers: urllib, requests - [debug] Loaded 1893 extractors - [debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp-nightly-builds/releases/latest + [debug] Request Handlers: urllib, requests, websockets, curl_cffi + [debug] Loaded 1838 extractors + [debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest + Latest version: nightly@... from yt-dlp/yt-dlp-nightly-builds yt-dlp is up to date (nightly@... from yt-dlp/yt-dlp-nightly-builds) [youtube] Extracting URL: https://www.youtube.com/watch?v=BaW_jenozKc diff --git a/yt-dlp/.github/ISSUE_TEMPLATE/4_bug_report.yml b/yt-dlp/.github/ISSUE_TEMPLATE/4_bug_report.yml index a17770f614..201586e9dc 100644 --- a/yt-dlp/.github/ISSUE_TEMPLATE/4_bug_report.yml +++ b/yt-dlp/.github/ISSUE_TEMPLATE/4_bug_report.yml @@ -56,14 +56,15 @@ body: placeholder: | [debug] Command-line config: ['-vU', 'https://www.youtube.com/watch?v=BaW_jenozKc'] [debug] Encodings: locale cp65001, fs utf-8, pref cp65001, out utf-8, error utf-8, screen utf-8 - [debug] yt-dlp version nightly@... from yt-dlp/yt-dlp [b634ba742] (win_exe) - [debug] Python 3.8.10 (CPython 64bit) - Windows-10-10.0.22000-SP0 - [debug] exe versions: ffmpeg N-106550-g072101bd52-20220410 (fdk,setts), ffprobe N-106624-g391ce570c8-20220415, phantomjs 2.1.1 - [debug] Optional libraries: Cryptodome-3.15.0, brotli-1.0.9, certifi-2022.06.15, mutagen-1.45.1, sqlite3-2.6.0, websockets-10.3 + [debug] yt-dlp version nightly@... from yt-dlp/yt-dlp-nightly-builds [1a176d874] (win_exe) + [debug] Python 3.10.11 (CPython AMD64 64bit) - Windows-10-10.0.20348-SP0 (OpenSSL 1.1.1t 7 Feb 2023) + [debug] exe versions: ffmpeg 7.0.2 (setts), ffprobe 7.0.2 + [debug] Optional libraries: Cryptodome-3.21.0, brotli-1.1.0, certifi-2024.08.30, curl_cffi-0.5.10, mutagen-1.47.0, requests-2.32.3, sqlite3-3.40.1, urllib3-2.2.3, websockets-13.1 [debug] Proxy map: {} - [debug] Request Handlers: urllib, requests - [debug] Loaded 1893 extractors - [debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp-nightly-builds/releases/latest + [debug] Request Handlers: urllib, requests, websockets, curl_cffi + [debug] Loaded 1838 extractors + [debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest + Latest version: nightly@... from yt-dlp/yt-dlp-nightly-builds yt-dlp is up to date (nightly@... from yt-dlp/yt-dlp-nightly-builds) [youtube] Extracting URL: https://www.youtube.com/watch?v=BaW_jenozKc diff --git a/yt-dlp/.github/ISSUE_TEMPLATE/5_feature_request.yml b/yt-dlp/.github/ISSUE_TEMPLATE/5_feature_request.yml index c600a9dcb6..765de86a29 100644 --- a/yt-dlp/.github/ISSUE_TEMPLATE/5_feature_request.yml +++ b/yt-dlp/.github/ISSUE_TEMPLATE/5_feature_request.yml @@ -52,14 +52,15 @@ body: placeholder: | [debug] Command-line config: ['-vU', 'https://www.youtube.com/watch?v=BaW_jenozKc'] [debug] Encodings: locale cp65001, fs utf-8, pref cp65001, out utf-8, error utf-8, screen utf-8 - [debug] yt-dlp version nightly@... from yt-dlp/yt-dlp [b634ba742] (win_exe) - [debug] Python 3.8.10 (CPython 64bit) - Windows-10-10.0.22000-SP0 - [debug] exe versions: ffmpeg N-106550-g072101bd52-20220410 (fdk,setts), ffprobe N-106624-g391ce570c8-20220415, phantomjs 2.1.1 - [debug] Optional libraries: Cryptodome-3.15.0, brotli-1.0.9, certifi-2022.06.15, mutagen-1.45.1, sqlite3-2.6.0, websockets-10.3 + [debug] yt-dlp version nightly@... from yt-dlp/yt-dlp-nightly-builds [1a176d874] (win_exe) + [debug] Python 3.10.11 (CPython AMD64 64bit) - Windows-10-10.0.20348-SP0 (OpenSSL 1.1.1t 7 Feb 2023) + [debug] exe versions: ffmpeg 7.0.2 (setts), ffprobe 7.0.2 + [debug] Optional libraries: Cryptodome-3.21.0, brotli-1.1.0, certifi-2024.08.30, curl_cffi-0.5.10, mutagen-1.47.0, requests-2.32.3, sqlite3-3.40.1, urllib3-2.2.3, websockets-13.1 [debug] Proxy map: {} - [debug] Request Handlers: urllib, requests - [debug] Loaded 1893 extractors - [debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp-nightly-builds/releases/latest + [debug] Request Handlers: urllib, requests, websockets, curl_cffi + [debug] Loaded 1838 extractors + [debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest + Latest version: nightly@... from yt-dlp/yt-dlp-nightly-builds yt-dlp is up to date (nightly@... from yt-dlp/yt-dlp-nightly-builds) [youtube] Extracting URL: https://www.youtube.com/watch?v=BaW_jenozKc diff --git a/yt-dlp/.github/ISSUE_TEMPLATE/6_question.yml b/yt-dlp/.github/ISSUE_TEMPLATE/6_question.yml index 57bc9daf51..198e21bec2 100644 --- a/yt-dlp/.github/ISSUE_TEMPLATE/6_question.yml +++ b/yt-dlp/.github/ISSUE_TEMPLATE/6_question.yml @@ -58,14 +58,15 @@ body: placeholder: | [debug] Command-line config: ['-vU', 'https://www.youtube.com/watch?v=BaW_jenozKc'] [debug] Encodings: locale cp65001, fs utf-8, pref cp65001, out utf-8, error utf-8, screen utf-8 - [debug] yt-dlp version nightly@... from yt-dlp/yt-dlp [b634ba742] (win_exe) - [debug] Python 3.8.10 (CPython 64bit) - Windows-10-10.0.22000-SP0 - [debug] exe versions: ffmpeg N-106550-g072101bd52-20220410 (fdk,setts), ffprobe N-106624-g391ce570c8-20220415, phantomjs 2.1.1 - [debug] Optional libraries: Cryptodome-3.15.0, brotli-1.0.9, certifi-2022.06.15, mutagen-1.45.1, sqlite3-2.6.0, websockets-10.3 + [debug] yt-dlp version nightly@... from yt-dlp/yt-dlp-nightly-builds [1a176d874] (win_exe) + [debug] Python 3.10.11 (CPython AMD64 64bit) - Windows-10-10.0.20348-SP0 (OpenSSL 1.1.1t 7 Feb 2023) + [debug] exe versions: ffmpeg 7.0.2 (setts), ffprobe 7.0.2 + [debug] Optional libraries: Cryptodome-3.21.0, brotli-1.1.0, certifi-2024.08.30, curl_cffi-0.5.10, mutagen-1.47.0, requests-2.32.3, sqlite3-3.40.1, urllib3-2.2.3, websockets-13.1 [debug] Proxy map: {} - [debug] Request Handlers: urllib, requests - [debug] Loaded 1893 extractors - [debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp-nightly-builds/releases/latest + [debug] Request Handlers: urllib, requests, websockets, curl_cffi + [debug] Loaded 1838 extractors + [debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest + Latest version: nightly@... from yt-dlp/yt-dlp-nightly-builds yt-dlp is up to date (nightly@... from yt-dlp/yt-dlp-nightly-builds) [youtube] Extracting URL: https://www.youtube.com/watch?v=BaW_jenozKc diff --git a/yt-dlp/CONTRIBUTORS b/yt-dlp/CONTRIBUTORS index 949bc89c47..a9a0557426 100644 --- a/yt-dlp/CONTRIBUTORS +++ b/yt-dlp/CONTRIBUTORS @@ -688,3 +688,10 @@ KarboniteKream mikkovedru pktiuk rubyevadestaxes +avagordon01 +CounterPillow +JoseAngelB +KBelmin +kesor +MellowKyler +Wesley107772 diff --git a/yt-dlp/Changelog.md b/yt-dlp/Changelog.md index 0efccadd10..2648b9fe22 100644 --- a/yt-dlp/Changelog.md +++ b/yt-dlp/Changelog.md @@ -4,6 +4,62 @@ # To create a release, dispatch the https://github.com/yt-dlp/yt-dlp/actions/workflows/release.yml workflow on master --> +### 2024.11.04 + +#### Important changes +- **Beginning with this release, yt-dlp's Python dependencies *must* be installed using the `default` group** +If you're installing yt-dlp with pip/pipx or requiring yt-dlp in your own Python project, you'll need to specify `yt-dlp[default]` if you want to also install yt-dlp's optional dependencies (which were previously included by default). [Read more](https://github.com/yt-dlp/yt-dlp/pull/11255) +- **The minimum *required* Python version has been raised to 3.9** +Python 3.8 reached its end-of-life on 2024.10.07, and yt-dlp has now removed support for it. As an unfortunate side effect, the official `yt-dlp.exe` and `yt-dlp_x86.exe` binaries are no longer supported on Windows 7. [Read more](https://github.com/yt-dlp/yt-dlp/issues/10086) + +#### Core changes +- [Allow thumbnails with `.jpe` extension](https://github.com/yt-dlp/yt-dlp/commit/5bc5fb2835ea59bdf326bd12176d74d2c7348a95) ([#11408](https://github.com/yt-dlp/yt-dlp/issues/11408)) by [bashonly](https://github.com/bashonly) +- [Expand paths in `--plugin-dirs`](https://github.com/yt-dlp/yt-dlp/commit/914af9a0cf51c9a3f74aa88d952bee8334c67511) ([#11334](https://github.com/yt-dlp/yt-dlp/issues/11334)) by [bashonly](https://github.com/bashonly) +- [Fix `--netrc` empty string parsing for Python <=3.10](https://github.com/yt-dlp/yt-dlp/commit/88402b714ec124633933737bc156b172a3dec3d6) ([#11414](https://github.com/yt-dlp/yt-dlp/issues/11414)) by [bashonly](https://github.com/bashonly), [Grub4K](https://github.com/Grub4K) +- [Populate format sorting fields before dependent fields](https://github.com/yt-dlp/yt-dlp/commit/5c880ef42e9c2b2fc412f6d69dad37d34fb75a62) ([#11353](https://github.com/yt-dlp/yt-dlp/issues/11353)) by [Grub4K](https://github.com/Grub4K) +- [Prioritize AV1](https://github.com/yt-dlp/yt-dlp/commit/3945677a75e94a1fecc085432d791e1c21220cd3) ([#11153](https://github.com/yt-dlp/yt-dlp/issues/11153)) by [seproDev](https://github.com/seproDev) +- [Remove Python 3.8 support](https://github.com/yt-dlp/yt-dlp/commit/d784464399b600ba9516bbcec6286f11d68974dd) ([#11321](https://github.com/yt-dlp/yt-dlp/issues/11321)) by [bashonly](https://github.com/bashonly) +- **aes**: [Fix GCM pad length calculation](https://github.com/yt-dlp/yt-dlp/commit/beae2db127d3b5017cbcf685da9de7a9ef496541) ([#11438](https://github.com/yt-dlp/yt-dlp/issues/11438)) by [seproDev](https://github.com/seproDev) +- **cookies**: [Support chrome table version 24](https://github.com/yt-dlp/yt-dlp/commit/4613096f2e6eab9dcbac0e98b6cec760bbc99375) ([#11425](https://github.com/yt-dlp/yt-dlp/issues/11425)) by [kesor](https://github.com/kesor), [seproDev](https://github.com/seproDev) +- **utils** + - [Allow partial application for more functions](https://github.com/yt-dlp/yt-dlp/commit/b6dc2c49e8793c6dfa21275e61caf49ec1148b81) ([#11391](https://github.com/yt-dlp/yt-dlp/issues/11391)) by [bashonly](https://github.com/bashonly), [Grub4K](https://github.com/Grub4K) (With fixes in [422195e](https://github.com/yt-dlp/yt-dlp/commit/422195ec70a00b0d2002b238cacbae7790c57fdf) by [Grub4K](https://github.com/Grub4K)) + - [Fix `find_element` by class](https://github.com/yt-dlp/yt-dlp/commit/f93c16395cea1fe9ffc3c594d3e019c3b214544c) ([#11402](https://github.com/yt-dlp/yt-dlp/issues/11402)) by [bashonly](https://github.com/bashonly) + - [Fix and improve `find_element` and `find_elements`](https://github.com/yt-dlp/yt-dlp/commit/b103aca24d35b72b405c340357dc01a0ed534281) ([#11443](https://github.com/yt-dlp/yt-dlp/issues/11443)) by [bashonly](https://github.com/bashonly), [Grub4K](https://github.com/Grub4K) + +#### Extractor changes +- [Resolve `language` to ISO639-2 for ISM formats](https://github.com/yt-dlp/yt-dlp/commit/21cdcf03a237a0c4979c941d5a5385cae44c7906) ([#11359](https://github.com/yt-dlp/yt-dlp/issues/11359)) by [bashonly](https://github.com/bashonly) +- **ardmediathek**: [Extract chapters](https://github.com/yt-dlp/yt-dlp/commit/59f8dd8239c31f00b708da53b39b1e2e9409b6e6) ([#11442](https://github.com/yt-dlp/yt-dlp/issues/11442)) by [iw0nderhow](https://github.com/iw0nderhow) +- **bfmtv**: [Fix extractors](https://github.com/yt-dlp/yt-dlp/commit/754940e9a558565d6bd3c0c529802569b1d0ae4e) ([#11444](https://github.com/yt-dlp/yt-dlp/issues/11444)) by [seproDev](https://github.com/seproDev) +- **bluesky**: [Add extractor](https://github.com/yt-dlp/yt-dlp/commit/5c7a5aaab27e9c3cb367b663a6136ca58866e547) ([#11055](https://github.com/yt-dlp/yt-dlp/issues/11055)) by [MellowKyler](https://github.com/MellowKyler), [seproDev](https://github.com/seproDev) +- **ccma**: [Support new 3cat.cat domain](https://github.com/yt-dlp/yt-dlp/commit/330335386d4f7603d92d6796798375336005275e) ([#11222](https://github.com/yt-dlp/yt-dlp/issues/11222)) by [JoseAngelB](https://github.com/JoseAngelB) +- **chzzk**: video: [Fix extraction](https://github.com/yt-dlp/yt-dlp/commit/9c6534da81e485b2325b3489ee4128943e6d3e4b) ([#11228](https://github.com/yt-dlp/yt-dlp/issues/11228)) by [hui1601](https://github.com/hui1601) +- **cnn**: [Fix extractor](https://github.com/yt-dlp/yt-dlp/commit/9acf79c91a8c6c55ca972747c6858e784e2da351) ([#10185](https://github.com/yt-dlp/yt-dlp/issues/10185)) by [kylegustavo](https://github.com/kylegustavo), [seproDev](https://github.com/seproDev) +- **dailymotion** + - [Improve embed extraction](https://github.com/yt-dlp/yt-dlp/commit/a403dcf9be20b49cbb3017328f4aaa352fb6d685) ([#10843](https://github.com/yt-dlp/yt-dlp/issues/10843)) by [bashonly](https://github.com/bashonly), [pzhlkj6612](https://github.com/pzhlkj6612) + - [Support shortened URLs](https://github.com/yt-dlp/yt-dlp/commit/d1358231371f20fa23020fa9176be3b56119873e) ([#11374](https://github.com/yt-dlp/yt-dlp/issues/11374)) by [bashonly](https://github.com/bashonly), [seproDev](https://github.com/seproDev) +- **facebook**: [Fix formats extraction](https://github.com/yt-dlp/yt-dlp/commit/ec9b25043f399de6a591d8370d32bf0e66c117f2) ([#11343](https://github.com/yt-dlp/yt-dlp/issues/11343)) by [kclauhk](https://github.com/kclauhk) +- **generic**: [Do not impersonate by default](https://github.com/yt-dlp/yt-dlp/commit/c29f5a7fae93a08f3cfbb6127b2faa75145b06a0) ([#11336](https://github.com/yt-dlp/yt-dlp/issues/11336)) by [bashonly](https://github.com/bashonly) +- **nfl**: [Fix extractors](https://github.com/yt-dlp/yt-dlp/commit/838f4385de8300a4dd4e7ffbbf0e5b7b85fb52c2) ([#11409](https://github.com/yt-dlp/yt-dlp/issues/11409)) by [bashonly](https://github.com/bashonly) +- **niconicouser**: [Fix extractor](https://github.com/yt-dlp/yt-dlp/commit/6abef74232c0fc695cd803c18ae446cacb129389) ([#11324](https://github.com/yt-dlp/yt-dlp/issues/11324)) by [Wesley107772](https://github.com/Wesley107772) +- **soundcloud**: [Extract artists](https://github.com/yt-dlp/yt-dlp/commit/f101e5d34c97c608156ad5396714c2a2edca966a) ([#11377](https://github.com/yt-dlp/yt-dlp/issues/11377)) by [seproDev](https://github.com/seproDev) +- **tumblr**: [Support more URLs](https://github.com/yt-dlp/yt-dlp/commit/b03267bf0675eeb8df5baf1daac7cf67840c91a5) ([#6057](https://github.com/yt-dlp/yt-dlp/issues/6057)) by [selfisekai](https://github.com/selfisekai), [seproDev](https://github.com/seproDev) +- **twitter**: [Remove cookies migration workaround](https://github.com/yt-dlp/yt-dlp/commit/76802f461332d444e596437c42374fa237fa5174) ([#11392](https://github.com/yt-dlp/yt-dlp/issues/11392)) by [bashonly](https://github.com/bashonly) +- **vimeo**: [Fix API retries](https://github.com/yt-dlp/yt-dlp/commit/57212a5f97ce367590aaa5c3e9a135eead8f81f7) ([#11351](https://github.com/yt-dlp/yt-dlp/issues/11351)) by [bashonly](https://github.com/bashonly) +- **yle_areena**: [Support live events](https://github.com/yt-dlp/yt-dlp/commit/a6783a3b9905e547f6c1d4df9d7c7999feda8afa) ([#11358](https://github.com/yt-dlp/yt-dlp/issues/11358)) by [bashonly](https://github.com/bashonly), [CounterPillow](https://github.com/CounterPillow) +- **youtube**: [Adjust OAuth refresh token handling](https://github.com/yt-dlp/yt-dlp/commit/d569a8845254d90ce13ad74ae76695e8d6441068) ([#11414](https://github.com/yt-dlp/yt-dlp/issues/11414)) by [bashonly](https://github.com/bashonly) + +#### Misc. changes +- **build** + - [Disable attestations for trusted publishing](https://github.com/yt-dlp/yt-dlp/commit/428ffb75aa3534b275cf54de42693a4d261519da) ([#11418](https://github.com/yt-dlp/yt-dlp/issues/11418)) by [bashonly](https://github.com/bashonly) + - [Move optional dependencies to the `default` group](https://github.com/yt-dlp/yt-dlp/commit/87884f15580910e4e0fe0e1db73508debc657471) ([#11255](https://github.com/yt-dlp/yt-dlp/issues/11255)) by [bashonly](https://github.com/bashonly) + - [Use Ubuntu 20.04 and Python 3.9 for Linux ARM builds](https://github.com/yt-dlp/yt-dlp/commit/dd2e24446954246a2ec4d4a7e95531f52a14b351) ([#8638](https://github.com/yt-dlp/yt-dlp/issues/8638)) by [bashonly](https://github.com/bashonly) +- **cleanup** + - Miscellaneous + - [ea9e35d](https://github.com/yt-dlp/yt-dlp/commit/ea9e35d85fba5eab341cdcaf1eaed69b57f7e465) by [bashonly](https://github.com/bashonly) + - [c998238](https://github.com/yt-dlp/yt-dlp/commit/c998238c2e76c62d1d29962c6e8ebe916cc7913b) by [bashonly](https://github.com/bashonly), [KBelmin](https://github.com/KBelmin) + - [197d0b0](https://github.com/yt-dlp/yt-dlp/commit/197d0b03b6a3c8fe4fa5ace630eeffec629bf72c) by [avagordon01](https://github.com/avagordon01), [bashonly](https://github.com/bashonly), [grqz](https://github.com/grqz), [Grub4K](https://github.com/Grub4K), [seproDev](https://github.com/seproDev) +- **devscripts**: `make_changelog`: [Parse full commit message for fixes](https://github.com/yt-dlp/yt-dlp/commit/0a3991edae0e10f2ea41ece9fdea5e48f789f1de) ([#11366](https://github.com/yt-dlp/yt-dlp/issues/11366)) by [bashonly](https://github.com/bashonly), [Grub4K](https://github.com/Grub4K) + ### 2024.10.22 #### Important changes diff --git a/yt-dlp/README.md b/yt-dlp/README.md index 418203eea9..2df72b7498 100644 --- a/yt-dlp/README.md +++ b/yt-dlp/README.md @@ -479,7 +479,8 @@ If you fork the project on GitHub, you can run your fork's [build workflow](.git --no-download-archive Do not use archive file (default) --max-downloads NUMBER Abort after downloading NUMBER files --break-on-existing Stop the download process when encountering - a file that is in the archive + a file that is in the archive supplied with + the --download-archive option --no-break-on-existing Do not stop the download process when encountering a file that is in the archive (default) @@ -1553,9 +1554,9 @@ The available fields are: All fields, unless specified otherwise, are sorted in descending order. To reverse this, prefix the field with a `+`. E.g. `+res` prefers format with the smallest resolution. Additionally, you can suffix a preferred value for the fields, separated by a `:`. E.g. `res:720` prefers larger videos, but no larger than 720p and the smallest video if there are no videos less than 720p. For `codec` and `ext`, you can provide two preferred values, the first for video and the second for audio. E.g. `+codec:avc:m4a` (equivalent to `+vcodec:avc,+acodec:m4a`) sets the video codec preference to `h264` > `h265` > `vp9` > `vp9.2` > `av01` > `vp8` > `h263` > `theora` and audio codec preference to `mp4a` > `aac` > `vorbis` > `opus` > `mp3` > `ac3` > `dts`. You can also make the sorting prefer the nearest values to the provided by using `~` as the delimiter. E.g. `filesize~1G` prefers the format with filesize closest to 1 GiB. -The fields `hasvid` and `ie_pref` are always given highest priority in sorting, irrespective of the user-defined order. This behavior can be changed by using `--format-sort-force`. Apart from these, the default order used is: `lang,quality,res,fps,hdr:12,vcodec:vp9.2,channels,acodec,size,br,asr,proto,ext,hasaud,source,id`. The extractors may override this default order, but they cannot override the user-provided order. +The fields `hasvid` and `ie_pref` are always given highest priority in sorting, irrespective of the user-defined order. This behavior can be changed by using `--format-sort-force`. Apart from these, the default order used is: `lang,quality,res,fps,hdr:12,vcodec,channels,acodec,size,br,asr,proto,ext,hasaud,source,id`. The extractors may override this default order, but they cannot override the user-provided order. -Note that the default has `vcodec:vp9.2`; i.e. `av1` is not preferred. Similarly, the default for hdr is `hdr:12`; i.e. Dolby Vision is not preferred. These choices are made since DV and AV1 formats are not yet fully compatible with most devices. This may be changed in the future as more devices become capable of smoothly playing back these formats. +Note that the default for hdr is `hdr:12`; i.e. Dolby Vision is not preferred. This choice was made since DV formats are not yet fully compatible with most devices. This may be changed in the future. If your format selector is `worst`, the last item is selected after sorting. This means it will select the format that is worst in all respects. Most of the time, what you actually want is the video with the smallest filesize instead. So it is generally better to use `-f best -S +size,+br,+res,+fps`. @@ -2205,7 +2206,7 @@ Some of yt-dlp's default options are different from that of youtube-dl and youtu * `avconv` is not supported as an alternative to `ffmpeg` * yt-dlp stores config files in slightly different locations to youtube-dl. See [CONFIGURATION](#configuration) for a list of correct locations * The default [output template](#output-template) is `%(title)s [%(id)s].%(ext)s`. There is no real reason for this change. This was changed before yt-dlp was ever made public and now there are no plans to change it back to `%(title)s-%(id)s.%(ext)s`. Instead, you may use `--compat-options filename` -* The default [format sorting](#sorting-formats) is different from youtube-dl and prefers higher resolution and better codecs rather than higher bitrates. You can use the `--format-sort` option to change this to any order you prefer, or use `--compat-options format-sort` to use youtube-dl's sorting order +* The default [format sorting](#sorting-formats) is different from youtube-dl and prefers higher resolution and better codecs rather than higher bitrates. You can use the `--format-sort` option to change this to any order you prefer, or use `--compat-options format-sort` to use youtube-dl's sorting order. Older versions of yt-dlp preferred VP9 due to its broader compatibility; you can use `--compat-options prefer-vp9-sort` to revert to that format sorting preference. These two compat options cannot be used together * The default format selector is `bv*+ba/b`. This means that if a combined video + audio format that is better than the best video-only format is found, the former will be preferred. Use `-f bv+ba/b` or `--compat-options format-spec` to revert this * Unlike youtube-dlc, yt-dlp does not allow merging multiple audio/video streams into one file by default (since this conflicts with the use of `-f bv*+ba`). If needed, this feature must be enabled using `--audio-multistreams` and `--video-multistreams`. You can also use `--compat-options multistreams` to enable both * `--no-abort-on-error` is enabled by default. Use `--abort-on-error` or `--compat-options abort-on-error` to abort on errors instead @@ -2234,11 +2235,11 @@ Some of yt-dlp's default options are different from that of youtube-dl and youtu For ease of use, a few more compat options are available: * `--compat-options all`: Use all compat options (**Do NOT use this!**) -* `--compat-options youtube-dl`: Same as `--compat-options all,-multistreams,-playlist-match-filter,-manifest-filesize-approx,-allow-unsafe-ext` -* `--compat-options youtube-dlc`: Same as `--compat-options all,-no-live-chat,-no-youtube-channel-redirect,-playlist-match-filter,-manifest-filesize-approx,-allow-unsafe-ext` +* `--compat-options youtube-dl`: Same as `--compat-options all,-multistreams,-playlist-match-filter,-manifest-filesize-approx,-allow-unsafe-ext,-prefer-vp9-sort` +* `--compat-options youtube-dlc`: Same as `--compat-options all,-no-live-chat,-no-youtube-channel-redirect,-playlist-match-filter,-manifest-filesize-approx,-allow-unsafe-ext,-prefer-vp9-sort` * `--compat-options 2021`: Same as `--compat-options 2022,no-certifi,filename-sanitization,no-youtube-prefer-utc-upload-date` * `--compat-options 2022`: Same as `--compat-options 2023,playlist-match-filter,no-external-downloader-progress,prefer-legacy-http-handler,manifest-filesize-approx` -* `--compat-options 2023`: Currently does nothing. Use this to enable all future compat options +* `--compat-options 2023`: Same as `--compat-options prefer-vp9-sort`. Use this to enable all future compat options The following compat options restore vulnerable behavior from before security patches: diff --git a/yt-dlp/supportedsites.md b/yt-dlp/supportedsites.md index 7b22e8c6fa..fc79e4ae61 100644 --- a/yt-dlp/supportedsites.md +++ b/yt-dlp/supportedsites.md @@ -190,6 +190,7 @@ - **blerp** - **blogger.com** - **Bloomberg** + - **Bluesky** - **BokeCC** - **BongaCams** - **Boosty** @@ -247,7 +248,7 @@ - **cbsnews:livevideo**: CBS News Live Videos - **cbssports**: (**Currently broken**) - **cbssports:embed**: (**Currently broken**) - - **CCMA** + - **CCMA**: 3Cat, TV3 and Catalunya Ràdio - **CCTV**: 央视网 - **CDA**: [*cdapl*](## "netrc machine") - **CDAFolder** @@ -280,8 +281,6 @@ - **cmt.com**: (**Currently broken**) - **CNBCVideo** - **CNN** - - **CNNArticle** - - **CNNBlogs** - **CNNIndonesia** - **ComedyCentral** - **ComedyCentralTV** @@ -685,9 +684,9 @@ - **LastFMPlaylist** - **LastFMUser** - **LaXarxaMes**: [*laxarxames*](## "netrc machine") - - **lbry** - - **lbry:channel** - - **lbry:playlist** + - **lbry**: odysee.com + - **lbry:channel**: odysee.com channels + - **lbry:playlist**: odysee.com playlists - **LCI** - **Lcp** - **LcpPlay** @@ -1446,7 +1445,7 @@ - **TeleQuebecSquat** - **TeleQuebecVideo** - **TeleTask**: (**Currently broken**) - - **Telewebion** + - **Telewebion**: (**Currently broken**) - **Tempo** - **TennisTV**: [*tennistv*](## "netrc machine") - **TenPlay**: [*10play*](## "netrc machine") diff --git a/yt-dlp/test/test_aes.py b/yt-dlp/test/test_aes.py index 5f975efecf..6fe6059a17 100644 --- a/yt-dlp/test/test_aes.py +++ b/yt-dlp/test/test_aes.py @@ -83,6 +83,18 @@ class TestAES(unittest.TestCase): data, intlist_to_bytes(self.key), authentication_tag, intlist_to_bytes(self.iv[:12])) self.assertEqual(decrypted.rstrip(b'\x08'), self.secret_msg) + def test_gcm_aligned_decrypt(self): + data = b'\x159Y\xcf5eud\x90\x9c\x85&]\x14\x1d\x0f' + authentication_tag = b'\x08\xb1\x9d!&\x98\xd0\xeaRq\x90\xe6;\xb5]\xd8' + + decrypted = intlist_to_bytes(aes_gcm_decrypt_and_verify( + list(data), self.key, list(authentication_tag), self.iv[:12])) + self.assertEqual(decrypted.rstrip(b'\x08'), self.secret_msg[:16]) + if Cryptodome.AES: + decrypted = aes_gcm_decrypt_and_verify_bytes( + data, bytes(self.key), authentication_tag, bytes(self.iv[:12])) + self.assertEqual(decrypted.rstrip(b'\x08'), self.secret_msg[:16]) + def test_decrypt_text(self): password = intlist_to_bytes(self.key).decode() encrypted = base64.b64encode( diff --git a/yt-dlp/test/test_cookies.py b/yt-dlp/test/test_cookies.py index e1271f67eb..4b9b9b5a91 100644 --- a/yt-dlp/test/test_cookies.py +++ b/yt-dlp/test/test_cookies.py @@ -105,6 +105,13 @@ class TestCookies(unittest.TestCase): decryptor = LinuxChromeCookieDecryptor('Chrome', Logger()) self.assertEqual(decryptor.decrypt(encrypted_value), value) + def test_chrome_cookie_decryptor_linux_v10_meta24(self): + with MonkeyPatch(cookies, {'_get_linux_keyring_password': lambda *args, **kwargs: b''}): + encrypted_value = b'v10\x1f\xe4\x0e[\x83\x0c\xcc*kPi \xce\x8d\x1d\xbb\x80\r\x11\t\xbb\x9e^Hy\x94\xf4\x963\x9f\x82\xba\xfe\xa1\xed\xb9\xf1)\x00710\x92\xc8/<\x96B' + value = 'DE' + decryptor = LinuxChromeCookieDecryptor('Chrome', Logger(), meta_version=24) + self.assertEqual(decryptor.decrypt(encrypted_value), value) + def test_chrome_cookie_decryptor_windows_v10(self): with MonkeyPatch(cookies, { '_get_windows_v10_key': lambda *args, **kwargs: b'Y\xef\xad\xad\xeerp\xf0Y\xe6\x9b\x12\xc2= 24) elif version == b'v11': self._cookie_counts['v11'] += 1 if self._v11_key is None: self._logger.warning('cannot decrypt v11 cookies: no key found', only_once=True) return None - return _decrypt_aes_cbc_multi(ciphertext, (self._v11_key, self._empty_key), self._logger) + return _decrypt_aes_cbc_multi( + ciphertext, (self._v11_key, self._empty_key), self._logger, + hash_prefix=self._meta_version >= 24) else: self._logger.warning(f'unknown cookie version: "{version}"', only_once=True) @@ -465,11 +476,12 @@ class LinuxChromeCookieDecryptor(ChromeCookieDecryptor): class MacChromeCookieDecryptor(ChromeCookieDecryptor): - def __init__(self, browser_keyring_name, logger): + def __init__(self, browser_keyring_name, logger, meta_version=None): self._logger = logger password = _get_mac_keyring_password(browser_keyring_name, logger) self._v10_key = None if password is None else self.derive_key(password) self._cookie_counts = {'v10': 0, 'other': 0} + self._meta_version = meta_version or 0 @staticmethod def derive_key(password): @@ -487,7 +499,8 @@ class MacChromeCookieDecryptor(ChromeCookieDecryptor): self._logger.warning('cannot decrypt v10 cookies: no key found', only_once=True) return None - return _decrypt_aes_cbc_multi(ciphertext, (self._v10_key,), self._logger) + return _decrypt_aes_cbc_multi( + ciphertext, (self._v10_key,), self._logger, hash_prefix=self._meta_version >= 24) else: self._cookie_counts['other'] += 1 @@ -497,10 +510,11 @@ class MacChromeCookieDecryptor(ChromeCookieDecryptor): class WindowsChromeCookieDecryptor(ChromeCookieDecryptor): - def __init__(self, browser_root, logger): + def __init__(self, browser_root, logger, meta_version=None): self._logger = logger self._v10_key = _get_windows_v10_key(browser_root, logger) self._cookie_counts = {'v10': 0, 'other': 0} + self._meta_version = meta_version or 0 def decrypt(self, encrypted_value): version = encrypted_value[:3] @@ -524,7 +538,9 @@ class WindowsChromeCookieDecryptor(ChromeCookieDecryptor): ciphertext = raw_ciphertext[nonce_length:-authentication_tag_length] authentication_tag = raw_ciphertext[-authentication_tag_length:] - return _decrypt_aes_gcm(ciphertext, self._v10_key, nonce, authentication_tag, self._logger) + return _decrypt_aes_gcm( + ciphertext, self._v10_key, nonce, authentication_tag, self._logger, + hash_prefix=self._meta_version >= 24) else: self._cookie_counts['other'] += 1 @@ -1010,10 +1026,12 @@ def pbkdf2_sha1(password, salt, iterations, key_length): return hashlib.pbkdf2_hmac('sha1', password, salt, iterations, key_length) -def _decrypt_aes_cbc_multi(ciphertext, keys, logger, initialization_vector=b' ' * 16): +def _decrypt_aes_cbc_multi(ciphertext, keys, logger, initialization_vector=b' ' * 16, hash_prefix=False): for key in keys: plaintext = unpad_pkcs7(aes_cbc_decrypt_bytes(ciphertext, key, initialization_vector)) try: + if hash_prefix: + return plaintext[32:].decode() return plaintext.decode() except UnicodeDecodeError: pass @@ -1021,7 +1039,7 @@ def _decrypt_aes_cbc_multi(ciphertext, keys, logger, initialization_vector=b' ' return None -def _decrypt_aes_gcm(ciphertext, key, nonce, authentication_tag, logger): +def _decrypt_aes_gcm(ciphertext, key, nonce, authentication_tag, logger, hash_prefix=False): try: plaintext = aes_gcm_decrypt_and_verify_bytes(ciphertext, key, authentication_tag, nonce) except ValueError: @@ -1029,6 +1047,8 @@ def _decrypt_aes_gcm(ciphertext, key, nonce, authentication_tag, logger): return None try: + if hash_prefix: + return plaintext[32:].decode() return plaintext.decode() except UnicodeDecodeError: logger.warning('failed to decrypt cookie (AES-GCM) because UTF-8 decoding failed. Possibly the key is wrong?', only_once=True) diff --git a/yt-dlp/yt_dlp/extractor/afreecatv.py b/yt-dlp/yt_dlp/extractor/afreecatv.py index 83e510d1a2..6682a89817 100644 --- a/yt-dlp/yt_dlp/extractor/afreecatv.py +++ b/yt-dlp/yt_dlp/extractor/afreecatv.py @@ -154,7 +154,7 @@ class AfreecaTVIE(AfreecaTVBaseIE): 'title': ('title', {str}), 'uploader': ('writer_nick', {str}), 'uploader_id': ('bj_id', {str}), - 'duration': ('total_file_duration', {functools.partial(int_or_none, scale=1000)}), + 'duration': ('total_file_duration', {int_or_none(scale=1000)}), 'thumbnail': ('thumb', {url_or_none}), }) @@ -178,7 +178,7 @@ class AfreecaTVIE(AfreecaTVBaseIE): 'title': f'{common_info.get("title") or "Untitled"} (part {file_num})', 'formats': formats, **traverse_obj(file_element, { - 'duration': ('duration', {functools.partial(int_or_none, scale=1000)}), + 'duration': ('duration', {int_or_none(scale=1000)}), 'timestamp': ('file_start', {unified_timestamp}), }), }) @@ -234,7 +234,7 @@ class AfreecaTVCatchStoryIE(AfreecaTVBaseIE): 'catch_list', lambda _, v: v['files'][0]['file'], { 'id': ('files', 0, 'file_info_key', {str}), 'url': ('files', 0, 'file', {url_or_none}), - 'duration': ('files', 0, 'duration', {functools.partial(int_or_none, scale=1000)}), + 'duration': ('files', 0, 'duration', {int_or_none(scale=1000)}), 'title': ('title', {str}), 'uploader': ('writer_nick', {str}), 'uploader_id': ('writer_id', {str}), diff --git a/yt-dlp/yt_dlp/extractor/allstar.py b/yt-dlp/yt_dlp/extractor/allstar.py index 5ea1c30e3d..697d83c1e5 100644 --- a/yt-dlp/yt_dlp/extractor/allstar.py +++ b/yt-dlp/yt_dlp/extractor/allstar.py @@ -71,7 +71,7 @@ class AllstarBaseIE(InfoExtractor): 'thumbnails': (('clipImageThumb', 'clipImageSource'), {'url': {media_url_or_none}}), 'duration': ('clipLength', {int_or_none}), 'filesize': ('clipSizeBytes', {int_or_none}), - 'timestamp': ('createdDate', {functools.partial(int_or_none, scale=1000)}), + 'timestamp': ('createdDate', {int_or_none(scale=1000)}), 'uploader': ('username', {str}), 'uploader_id': ('user', '_id', {str}), 'view_count': ('views', {int_or_none}), diff --git a/yt-dlp/yt_dlp/extractor/anvato.py b/yt-dlp/yt_dlp/extractor/anvato.py index bf3d60b5ee..ba1d7df372 100644 --- a/yt-dlp/yt_dlp/extractor/anvato.py +++ b/yt-dlp/yt_dlp/extractor/anvato.py @@ -33,24 +33,6 @@ class AnvatoIE(InfoExtractor): _AUTH_KEY = b'\x31\xc2\x42\x84\x9e\x73\xa0\xce' # from anvplayer.min.js _TESTS = [{ - # from https://www.nfl.com/videos/baker-mayfield-s-game-changing-plays-from-3-td-game-week-14 - 'url': 'anvato:GXvEgwyJeWem8KCYXfeoHWknwP48Mboj:899441', - 'md5': '921919dab3cd0b849ff3d624831ae3e2', - 'info_dict': { - 'id': '899441', - 'ext': 'mp4', - 'title': 'Baker Mayfield\'s game-changing plays from 3-TD game Week 14', - 'description': 'md5:85e05a3cc163f8c344340f220521136d', - 'upload_date': '20201215', - 'timestamp': 1608009755, - 'thumbnail': r're:^https?://.*\.jpg', - 'uploader': 'NFL', - 'tags': ['Baltimore Ravens at Cleveland Browns (2020-REG-14)', 'Baker Mayfield', 'Game Highlights', - 'Player Highlights', 'Cleveland Browns', 'league'], - 'duration': 157, - 'categories': ['Entertainment', 'Game', 'Highlights'], - }, - }, { # from https://ktla.com/news/99-year-old-woman-learns-to-fly-in-torrance-checks-off-bucket-list-dream/ 'url': 'anvato:X8POa4zpGZMmeiq0wqiO8IP5rMqQM9VN:8032455', 'md5': '837718bcfb3a7778d022f857f7a9b19e', @@ -241,31 +223,6 @@ class AnvatoIE(InfoExtractor): 'telemundo': 'anvato_mcp_telemundo_web_prod_c5278d51ad46fda4b6ca3d0ea44a7846a054f582', } - def _generate_nfl_token(self, anvack, mcp_id): - reroute = self._download_json( - 'https://api.nfl.com/v1/reroute', mcp_id, data=b'grant_type=client_credentials', - headers={'X-Domain-Id': 100}, note='Fetching token info') - token_type = reroute.get('token_type') or 'Bearer' - auth_token = f'{token_type} {reroute["access_token"]}' - response = self._download_json( - 'https://api.nfl.com/v3/shield/', mcp_id, data=json.dumps({ - 'query': '''{ - viewer { - mediaToken(anvack: "%s", id: %s) { - token - } - } -}''' % (anvack, mcp_id), # noqa: UP031 - }).encode(), headers={ - 'Authorization': auth_token, - 'Content-Type': 'application/json', - }, note='Fetching NFL API token') - return traverse_obj(response, ('data', 'viewer', 'mediaToken', 'token')) - - _TOKEN_GENERATORS = { - 'GXvEgwyJeWem8KCYXfeoHWknwP48Mboj': _generate_nfl_token, - } - def _server_time(self, access_key, video_id): return int_or_none(traverse_obj(self._download_json( f'{self._API_BASE_URL}/server_time', video_id, query={'anvack': access_key}, @@ -290,8 +247,6 @@ class AnvatoIE(InfoExtractor): } if extracted_token is not None: api['anvstk2'] = extracted_token - elif self._TOKEN_GENERATORS.get(access_key) is not None: - api['anvstk2'] = self._TOKEN_GENERATORS[access_key](self, access_key, video_id) elif self._ANVACK_TABLE.get(access_key) is not None: api['anvstk'] = md5_text(f'{access_key}|{anvrid}|{server_time}|{self._ANVACK_TABLE[access_key]}') else: diff --git a/yt-dlp/yt_dlp/extractor/ard.py b/yt-dlp/yt_dlp/extractor/ard.py index efc79dd141..89d3299213 100644 --- a/yt-dlp/yt_dlp/extractor/ard.py +++ b/yt-dlp/yt_dlp/extractor/ard.py @@ -299,7 +299,7 @@ class ARDBetaMediathekIE(InfoExtractor): 'info_dict': { 'id': '94834686', 'ext': 'mp4', - 'duration': 2700, + 'duration': 2670, 'episode': '7 Tage ... unter harten Jungs', 'description': 'md5:0f215470dcd2b02f59f4bd10c963f072', 'upload_date': '20231005', @@ -307,10 +307,28 @@ class ARDBetaMediathekIE(InfoExtractor): 'display_id': 'N2I2YmM5MzgtNWFlOS00ZGFlLTg2NzMtYzNjM2JlNjk4MDg3', 'series': '7 Tage ...', 'channel': 'HR', - 'thumbnail': 'https://api.ardmediathek.de/image-service/images/urn:ard:image:f6e6d5ffac41925c?w=960&ch=fa32ba69bc87989a', + 'thumbnail': 'https://api.ardmediathek.de/image-service/images/urn:ard:image:430c86d233afa42d?w=960&ch=fa32ba69bc87989a', 'title': '7 Tage ... unter harten Jungs', '_old_archive_ids': ['ardbetamediathek N2I2YmM5MzgtNWFlOS00ZGFlLTg2NzMtYzNjM2JlNjk4MDg3'], }, + }, { + 'url': 'https://www.ardmediathek.de/video/lokalzeit-aus-duesseldorf/lokalzeit-aus-duesseldorf-oder-31-10-2024/wdr-duesseldorf/Y3JpZDovL3dkci5kZS9CZWl0cmFnLXNvcGhvcmEtOWFkMTc0ZWMtMDA5ZS00ZDEwLWFjYjctMGNmNTdhNzVmNzUz', + 'info_dict': { + 'id': '13847165', + 'chapters': 'count:8', + 'ext': 'mp4', + 'channel': 'WDR', + 'display_id': 'Y3JpZDovL3dkci5kZS9CZWl0cmFnLXNvcGhvcmEtOWFkMTc0ZWMtMDA5ZS00ZDEwLWFjYjctMGNmNTdhNzVmNzUz', + 'episode': 'Lokalzeit aus Düsseldorf | 31.10.2024', + 'series': 'Lokalzeit aus Düsseldorf', + 'thumbnail': 'https://api.ardmediathek.de/image-service/images/urn:ard:image:f02ec9bd9b7bd5f6?w=960&ch=612491dcd5e09b0c', + 'title': 'Lokalzeit aus Düsseldorf | 31.10.2024', + 'upload_date': '20241031', + 'timestamp': 1730399400, + 'description': 'md5:12db30b3b706314efe3778b8df1a7058', + 'duration': 1759, + '_old_archive_ids': ['ardbetamediathek Y3JpZDovL3dkci5kZS9CZWl0cmFnLXNvcGhvcmEtOWFkMTc0ZWMtMDA5ZS00ZDEwLWFjYjctMGNmNTdhNzVmNzUz'], + }, }, { 'url': 'https://beta.ardmediathek.de/ard/video/Y3JpZDovL2Rhc2Vyc3RlLmRlL3RhdG9ydC9mYmM4NGM1NC0xNzU4LTRmZGYtYWFhZS0wYzcyZTIxNGEyMDE', 'only_matching': True, @@ -455,6 +473,12 @@ class ARDBetaMediathekIE(InfoExtractor): 'subtitles': subtitles, 'is_live': is_live, 'age_limit': age_limit, + **traverse_obj(media_data, { + 'chapters': ('pluginData', 'jumpmarks@all', 'chapterArray', lambda _, v: int_or_none(v['chapterTime']), { + 'start_time': ('chapterTime', {int_or_none}), + 'title': ('chapterTitle', {str}), + }), + }), **traverse_obj(media_data, ('meta', { 'title': 'title', 'description': 'synopsis', diff --git a/yt-dlp/yt_dlp/extractor/bandcamp.py b/yt-dlp/yt_dlp/extractor/bandcamp.py index 0abe059829..939c2800e6 100644 --- a/yt-dlp/yt_dlp/extractor/bandcamp.py +++ b/yt-dlp/yt_dlp/extractor/bandcamp.py @@ -1,4 +1,3 @@ -import functools import json import random import re @@ -10,7 +9,6 @@ from ..utils import ( ExtractorError, extract_attributes, float_or_none, - get_element_html_by_id, int_or_none, parse_filesize, str_or_none, @@ -21,7 +19,7 @@ from ..utils import ( url_or_none, urljoin, ) -from ..utils.traversal import traverse_obj +from ..utils.traversal import find_element, traverse_obj class BandcampIE(InfoExtractor): @@ -45,6 +43,8 @@ class BandcampIE(InfoExtractor): 'uploader_url': 'https://youtube-dl.bandcamp.com', 'uploader_id': 'youtube-dl', 'thumbnail': 'https://f4.bcbits.com/img/a3216802731_5.jpg', + 'artists': ['youtube-dl "\'/\\ä↭'], + 'album_artists': ['youtube-dl "\'/\\ä↭'], }, 'skip': 'There is a limit of 200 free downloads / month for the test song', }, { @@ -271,6 +271,18 @@ class BandcampAlbumIE(BandcampIE): # XXX: Do not subclass from concrete IE 'timestamp': 1311756226, 'upload_date': '20110727', 'uploader': 'Blazo', + 'thumbnail': 'https://f4.bcbits.com/img/a1721150828_5.jpg', + 'album_artists': ['Blazo'], + 'uploader_url': 'https://blazo.bandcamp.com', + 'release_date': '20110727', + 'release_timestamp': 1311724800.0, + 'track': 'Intro', + 'uploader_id': 'blazo', + 'track_number': 1, + 'album': 'Jazz Format Mixtape vol.1', + 'artists': ['Blazo'], + 'duration': 19.335, + 'track_id': '1353101989', }, }, { @@ -282,6 +294,18 @@ class BandcampAlbumIE(BandcampIE): # XXX: Do not subclass from concrete IE 'timestamp': 1311757238, 'upload_date': '20110727', 'uploader': 'Blazo', + 'track': 'Kero One - Keep It Alive (Blazo remix)', + 'release_date': '20110727', + 'track_id': '38097443', + 'track_number': 2, + 'duration': 181.467, + 'uploader_url': 'https://blazo.bandcamp.com', + 'album': 'Jazz Format Mixtape vol.1', + 'uploader_id': 'blazo', + 'album_artists': ['Blazo'], + 'artists': ['Blazo'], + 'thumbnail': 'https://f4.bcbits.com/img/a1721150828_5.jpg', + 'release_timestamp': 1311724800.0, }, }, ], @@ -289,6 +313,7 @@ class BandcampAlbumIE(BandcampIE): # XXX: Do not subclass from concrete IE 'title': 'Jazz Format Mixtape vol.1', 'id': 'jazz-format-mixtape-vol-1', 'uploader_id': 'blazo', + 'description': 'md5:38052a93217f3ffdc033cd5dbbce2989', }, 'params': { 'playlistend': 2, @@ -363,10 +388,10 @@ class BandcampWeeklyIE(BandcampIE): # XXX: Do not subclass from concrete IE _VALID_URL = r'https?://(?:www\.)?bandcamp\.com/?\?(?:.*?&)?show=(?P\d+)' _TESTS = [{ 'url': 'https://bandcamp.com/?show=224', - 'md5': 'b00df799c733cf7e0c567ed187dea0fd', + 'md5': '61acc9a002bed93986b91168aa3ab433', 'info_dict': { 'id': '224', - 'ext': 'opus', + 'ext': 'mp3', 'title': 'BC Weekly April 4th 2017 - Magic Moments', 'description': 'md5:5d48150916e8e02d030623a48512c874', 'duration': 5829.77, @@ -376,7 +401,7 @@ class BandcampWeeklyIE(BandcampIE): # XXX: Do not subclass from concrete IE 'episode_id': '224', }, 'params': { - 'format': 'opus-lo', + 'format': 'mp3-128', }, }, { 'url': 'https://bandcamp.com/?blah/blah@&show=228', @@ -484,7 +509,7 @@ class BandcampUserIE(InfoExtractor): or re.findall(r']+trackTitle["\'][^"\']+["\']([^"\']+)', webpage)) yield from traverse_obj(webpage, ( - {functools.partial(get_element_html_by_id, 'music-grid')}, {extract_attributes}, + {find_element(id='music-grid', html=True)}, {extract_attributes}, 'data-client-items', {json.loads}, ..., 'page_url', {str})) def _real_extract(self, url): @@ -493,4 +518,4 @@ class BandcampUserIE(InfoExtractor): return self.playlist_from_matches( self._yield_items(webpage), uploader, f'Discography of {uploader}', - getter=functools.partial(urljoin, url)) + getter=urljoin(url)) diff --git a/yt-dlp/yt_dlp/extractor/bbc.py b/yt-dlp/yt_dlp/extractor/bbc.py index 3af923f958..89fcf4425d 100644 --- a/yt-dlp/yt_dlp/extractor/bbc.py +++ b/yt-dlp/yt_dlp/extractor/bbc.py @@ -1284,9 +1284,9 @@ class BBCIE(BBCCoUkIE): # XXX: Do not subclass from concrete IE **traverse_obj(model, { 'title': ('title', {str}), 'thumbnail': ('imageUrl', {lambda u: urljoin(url, u.replace('$recipe', 'raw'))}), - 'description': ('synopses', ('long', 'medium', 'short'), {str}, {lambda x: x or None}, any), + 'description': ('synopses', ('long', 'medium', 'short'), {str}, filter, any), 'duration': ('versions', 0, 'duration', {int}), - 'timestamp': ('versions', 0, 'availableFrom', {functools.partial(int_or_none, scale=1000)}), + 'timestamp': ('versions', 0, 'availableFrom', {int_or_none(scale=1000)}), }), } @@ -1386,7 +1386,7 @@ class BBCIE(BBCCoUkIE): # XXX: Do not subclass from concrete IE formats = traverse_obj(media_data, ('playlist', lambda _, v: url_or_none(v['url']), { 'url': ('url', {url_or_none}), 'ext': ('format', {str}), - 'tbr': ('bitrate', {functools.partial(int_or_none, scale=1000)}), + 'tbr': ('bitrate', {int_or_none(scale=1000)}), })) if formats: entry = { @@ -1398,7 +1398,7 @@ class BBCIE(BBCCoUkIE): # XXX: Do not subclass from concrete IE 'title': ('title', {str}), 'thumbnail': ('imageUrl', {lambda u: urljoin(url, u.replace('$recipe', 'raw'))}), 'description': ('synopses', ('long', 'medium', 'short'), {str}, any), - 'timestamp': ('firstPublished', {functools.partial(int_or_none, scale=1000)}), + 'timestamp': ('firstPublished', {int_or_none(scale=1000)}), }), } done = True @@ -1428,7 +1428,7 @@ class BBCIE(BBCCoUkIE): # XXX: Do not subclass from concrete IE if not entry.get('timestamp'): entry['timestamp'] = traverse_obj(next_data, ( ..., 'contents', is_type('timestamp'), 'model', - 'timestamp', {functools.partial(int_or_none, scale=1000)}, any)) + 'timestamp', {int_or_none(scale=1000)}, any)) entries.append(entry) return self.playlist_result( entries, playlist_id, playlist_title, playlist_description) diff --git a/yt-dlp/yt_dlp/extractor/bfmtv.py b/yt-dlp/yt_dlp/extractor/bfmtv.py index 87f011783b..49d4819a3d 100644 --- a/yt-dlp/yt_dlp/extractor/bfmtv.py +++ b/yt-dlp/yt_dlp/extractor/bfmtv.py @@ -1,18 +1,33 @@ import re from .common import InfoExtractor -from ..utils import extract_attributes +from ..utils import ExtractorError, extract_attributes class BFMTVBaseIE(InfoExtractor): _VALID_URL_BASE = r'https?://(?:www\.|rmc\.)?bfmtv\.com/' _VALID_URL_TMPL = _VALID_URL_BASE + r'(?:[^/]+/)*[^/?&#]+_%s[A-Z]-(?P\d{12})\.html' - _VIDEO_BLOCK_REGEX = r'(]+class="video_block[^"]*"[^>]*>)' + _VIDEO_BLOCK_REGEX = r'(]+class="video_block[^"]*"[^>]*>.*?)' + _VIDEO_ELEMENT_REGEX = r'(]+>)' BRIGHTCOVE_URL_TEMPLATE = 'http://players.brightcove.net/%s/%s_default/index.html?videoId=%s' - def _brightcove_url_result(self, video_id, video_block): - account_id = video_block.get('accountid') or '876450612001' - player_id = video_block.get('playerid') or 'I2qBTln4u' + def _extract_video(self, video_block): + video_element = self._search_regex( + self._VIDEO_ELEMENT_REGEX, video_block, 'video element', default=None) + if video_element: + video_element_attrs = extract_attributes(video_element) + video_id = video_element_attrs.get('data-video-id') + if not video_id: + return + account_id = video_element_attrs.get('data-account') or '876450610001' + player_id = video_element_attrs.get('adjustplayer') or '19dszYXgm' + else: + video_block_attrs = extract_attributes(video_block) + video_id = video_block_attrs.get('videoid') + if not video_id: + return + account_id = video_block_attrs.get('accountid') or '876630703001' + player_id = video_block_attrs.get('playerid') or 'KbPwEbuHx' return self.url_result( self.BRIGHTCOVE_URL_TEMPLATE % (account_id, player_id, video_id), 'BrightcoveNew', video_id) @@ -40,23 +55,25 @@ class BFMTVIE(BFMTVBaseIE): def _real_extract(self, url): bfmtv_id = self._match_id(url) webpage = self._download_webpage(url, bfmtv_id) - video_block = extract_attributes(self._search_regex( + video = self._extract_video(self._search_regex( self._VIDEO_BLOCK_REGEX, webpage, 'video block')) - return self._brightcove_url_result(video_block['videoid'], video_block) + if not video: + raise ExtractorError('Failed to extract video') + return video -class BFMTVLiveIE(BFMTVIE): # XXX: Do not subclass from concrete IE +class BFMTVLiveIE(BFMTVBaseIE): IE_NAME = 'bfmtv:live' _VALID_URL = BFMTVBaseIE._VALID_URL_BASE + '(?P(?:[^/]+/)?en-direct)' _TESTS = [{ 'url': 'https://www.bfmtv.com/en-direct/', 'info_dict': { - 'id': '5615950982001', + 'id': '6346069778112', 'ext': 'mp4', - 'title': r're:^le direct BFMTV WEB \d{4}-\d{2}-\d{2} \d{2}:\d{2}$', + 'title': r're:^Le Live BFM TV \d{4}-\d{2}-\d{2} \d{2}:\d{2}$', 'uploader_id': '876450610001', - 'upload_date': '20220926', - 'timestamp': 1664207191, + 'upload_date': '20240202', + 'timestamp': 1706887572, 'live_status': 'is_live', 'thumbnail': r're:https://.+/image\.jpg', 'tags': [], @@ -69,6 +86,15 @@ class BFMTVLiveIE(BFMTVIE): # XXX: Do not subclass from concrete IE 'only_matching': True, }] + def _real_extract(self, url): + bfmtv_id = self._match_id(url) + webpage = self._download_webpage(url, bfmtv_id) + video = self._extract_video(self._search_regex( + self._VIDEO_BLOCK_REGEX, webpage, 'video block')) + if not video: + raise ExtractorError('Failed to extract video') + return video + class BFMTVArticleIE(BFMTVBaseIE): IE_NAME = 'bfmtv:article' @@ -102,18 +128,16 @@ class BFMTVArticleIE(BFMTVBaseIE): }, }] + def _entries(self, webpage): + for video_block_el in re.findall(self._VIDEO_BLOCK_REGEX, webpage): + video = self._extract_video(video_block_el) + if video: + yield video + def _real_extract(self, url): bfmtv_id = self._match_id(url) webpage = self._download_webpage(url, bfmtv_id) - entries = [] - for video_block_el in re.findall(self._VIDEO_BLOCK_REGEX, webpage): - video_block = extract_attributes(video_block_el) - video_id = video_block.get('videoid') - if not video_id: - continue - entries.append(self._brightcove_url_result(video_id, video_block)) - return self.playlist_result( - entries, bfmtv_id, self._og_search_title(webpage, fatal=False), + self._entries(webpage), bfmtv_id, self._og_search_title(webpage, fatal=False), self._html_search_meta(['og:description', 'description'], webpage)) diff --git a/yt-dlp/yt_dlp/extractor/bibeltv.py b/yt-dlp/yt_dlp/extractor/bibeltv.py index 666b51c56a..ad00245def 100644 --- a/yt-dlp/yt_dlp/extractor/bibeltv.py +++ b/yt-dlp/yt_dlp/extractor/bibeltv.py @@ -1,4 +1,3 @@ -import functools from .common import InfoExtractor from ..utils import ( @@ -50,7 +49,7 @@ class BibelTVBaseIE(InfoExtractor): **traverse_obj(data, { 'title': 'title', 'description': 'description', - 'duration': ('duration', {functools.partial(int_or_none, scale=1000)}), + 'duration': ('duration', {int_or_none(scale=1000)}), 'timestamp': ('schedulingStart', {parse_iso8601}), 'season_number': 'seasonNumber', 'episode_number': 'episodeNumber', diff --git a/yt-dlp/yt_dlp/extractor/bilibili.py b/yt-dlp/yt_dlp/extractor/bilibili.py index 62f68fbc6d..02ea67707f 100644 --- a/yt-dlp/yt_dlp/extractor/bilibili.py +++ b/yt-dlp/yt_dlp/extractor/bilibili.py @@ -109,7 +109,7 @@ class BilibiliBaseIE(InfoExtractor): fragments = traverse_obj(play_info, ('durl', lambda _, v: url_or_none(v['url']), { 'url': ('url', {url_or_none}), - 'duration': ('length', {functools.partial(float_or_none, scale=1000)}), + 'duration': ('length', {float_or_none(scale=1000)}), 'filesize': ('size', {int_or_none}), })) if fragments: @@ -124,7 +124,7 @@ class BilibiliBaseIE(InfoExtractor): 'quality': ('quality', {int_or_none}), 'format_id': ('quality', {str_or_none}), 'format_note': ('quality', {lambda x: format_names.get(x)}), - 'duration': ('timelength', {functools.partial(float_or_none, scale=1000)}), + 'duration': ('timelength', {float_or_none(scale=1000)}), }), **parse_resolution(format_names.get(play_info.get('quality'))), }) @@ -1585,7 +1585,7 @@ class BilibiliPlaylistIE(BilibiliSpaceListBaseIE): 'title': ('title', {str}), 'uploader': ('upper', 'name', {str}), 'uploader_id': ('upper', 'mid', {str_or_none}), - 'timestamp': ('ctime', {int_or_none}, {lambda x: x or None}), + 'timestamp': ('ctime', {int_or_none}, filter), 'thumbnail': ('cover', {url_or_none}), })), } diff --git a/yt-dlp/yt_dlp/extractor/bluesky.py b/yt-dlp/yt_dlp/extractor/bluesky.py index 42edd1107a..0e58a0932d 100644 --- a/yt-dlp/yt_dlp/extractor/bluesky.py +++ b/yt-dlp/yt_dlp/extractor/bluesky.py @@ -382,7 +382,7 @@ class BlueskyIE(InfoExtractor): 'age_limit': ( 'labels', ..., 'val', {lambda x: 18 if x in ('sexual', 'porn', 'graphic-media') else None}, any), 'description': (*record_path, 'text', {str}, filter), - 'title': (*record_path, 'text', {lambda x: x.replace('\n', '')}, {truncate_string(left=50)}), + 'title': (*record_path, 'text', {lambda x: x.replace('\n', ' ')}, {truncate_string(left=50)}), }), }) return entries diff --git a/yt-dlp/yt_dlp/extractor/bpb.py b/yt-dlp/yt_dlp/extractor/bpb.py index 7fe0899449..d7bf58b366 100644 --- a/yt-dlp/yt_dlp/extractor/bpb.py +++ b/yt-dlp/yt_dlp/extractor/bpb.py @@ -1,35 +1,20 @@ -import functools import re from .common import InfoExtractor from ..utils import ( clean_html, extract_attributes, - get_element_text_and_html_by_tag, - get_elements_by_class, join_nonempty, js_to_json, mimetype2ext, unified_strdate, url_or_none, urljoin, - variadic, ) -from ..utils.traversal import traverse_obj - - -def html_get_element(tag=None, cls=None): - assert tag or cls, 'One of tag or class is required' - - if cls: - func = functools.partial(get_elements_by_class, cls, tag=tag) - else: - func = functools.partial(get_element_text_and_html_by_tag, tag) - - def html_get_element_wrapper(html): - return variadic(func(html))[0] - - return html_get_element_wrapper +from ..utils.traversal import ( + find_element, + traverse_obj, +) class BpbIE(InfoExtractor): @@ -41,12 +26,12 @@ class BpbIE(InfoExtractor): 'info_dict': { 'id': '297', 'ext': 'mp4', - 'creator': 'Kooperative Berlin', - 'description': 'md5:f4f75885ba009d3e2b156247a8941ce6', - 'release_date': '20160115', + 'creators': ['Kooperative Berlin'], + 'description': r're:Joachim Gauck, .*\n\nKamera: .*', + 'release_date': '20150716', 'series': 'Interview auf dem Geschichtsforum 1989 | 2009', - 'tags': ['Friedliche Revolution', 'Erinnerungskultur', 'Vergangenheitspolitik', 'DDR 1949 - 1990', 'Freiheitsrecht', 'BStU', 'Deutschland'], - 'thumbnail': 'https://www.bpb.de/cache/images/7/297_teaser_16x9_1240.jpg?8839D', + 'tags': [], + 'thumbnail': r're:https?://www\.bpb\.de/cache/images/7/297_teaser_16x9_1240\.jpg.*', 'title': 'Joachim Gauck zu 1989 und die Erinnerung an die DDR', 'uploader': 'Bundeszentrale für politische Bildung', }, @@ -55,11 +40,12 @@ class BpbIE(InfoExtractor): 'info_dict': { 'id': '522184', 'ext': 'mp4', - 'creator': 'Institute for Strategic Dialogue Germany gGmbH (ISD)', + 'creators': ['Institute for Strategic Dialogue Germany gGmbH (ISD)'], 'description': 'md5:f83c795ff8f825a69456a9e51fc15903', 'release_date': '20230621', - 'tags': ['Desinformation', 'Ukraine', 'Russland', 'Geflüchtete'], - 'thumbnail': 'https://www.bpb.de/cache/images/4/522184_teaser_16x9_1240.png?EABFB', + 'series': 'Narrative über den Krieg Russlands gegen die Ukraine (NUK)', + 'tags': [], + 'thumbnail': r're:https://www\.bpb\.de/cache/images/4/522184_teaser_16x9_1240\.png.*', 'title': 'md5:9b01ccdbf58dbf9e5c9f6e771a803b1c', 'uploader': 'Bundeszentrale für politische Bildung', }, @@ -68,11 +54,12 @@ class BpbIE(InfoExtractor): 'info_dict': { 'id': '518789', 'ext': 'mp4', - 'creator': 'Institute for Strategic Dialogue Germany gGmbH (ISD)', + 'creators': ['Institute for Strategic Dialogue Germany gGmbH (ISD)'], 'description': 'md5:85228aed433e84ff0ff9bc582abd4ea8', 'release_date': '20230302', - 'tags': ['Desinformation', 'Ukraine', 'Russland', 'Geflüchtete'], - 'thumbnail': 'https://www.bpb.de/cache/images/9/518789_teaser_16x9_1240.jpeg?56D0D', + 'series': 'Narrative über den Krieg Russlands gegen die Ukraine (NUK)', + 'tags': [], + 'thumbnail': r're:https://www\.bpb\.de/cache/images/9/518789_teaser_16x9_1240\.jpeg.*', 'title': 'md5:3e956f264bb501f6383f10495a401da4', 'uploader': 'Bundeszentrale für politische Bildung', }, @@ -84,12 +71,12 @@ class BpbIE(InfoExtractor): 'info_dict': { 'id': '315813', 'ext': 'mp3', - 'creator': 'Axel Schröder', + 'creators': ['Axel Schröder'], 'description': 'md5:eda9d1af34e5912efef5baf54fba4427', 'release_date': '20200921', 'series': 'Auf Endlagersuche. Der deutsche Weg zu einem sicheren Atommülllager', 'tags': ['Atomenergie', 'Endlager', 'hoch-radioaktiver Abfall', 'Endlagersuche', 'Atommüll', 'Atomendlager', 'Gorleben', 'Deutschland'], - 'thumbnail': 'https://www.bpb.de/cache/images/3/315813_teaser_16x9_1240.png?92A94', + 'thumbnail': r're:https://www\.bpb\.de/cache/images/3/315813_teaser_16x9_1240\.png.*', 'title': 'Folge 1: Eine Einführung', 'uploader': 'Bundeszentrale für politische Bildung', }, @@ -98,12 +85,12 @@ class BpbIE(InfoExtractor): 'info_dict': { 'id': '517806', 'ext': 'mp3', - 'creator': 'Bundeszentrale für politische Bildung', + 'creators': ['Bundeszentrale für politische Bildung'], 'description': 'md5:594689600e919912aade0b2871cc3fed', 'release_date': '20230127', 'series': 'Vorträge des Fachtags "Modernisierer. Grenzgänger. Anstifter. Sechs Jahrzehnte \'Neue Rechte\'"', 'tags': ['Rechtsextremismus', 'Konservatismus', 'Konservativismus', 'neue Rechte', 'Rechtspopulismus', 'Schnellroda', 'Deutschland'], - 'thumbnail': 'https://www.bpb.de/cache/images/6/517806_teaser_16x9_1240.png?7A7A0', + 'thumbnail': r're:https://www\.bpb\.de/cache/images/6/517806_teaser_16x9_1240\.png.*', 'title': 'Die Weltanschauung der "Neuen Rechten"', 'uploader': 'Bundeszentrale für politische Bildung', }, @@ -147,7 +134,7 @@ class BpbIE(InfoExtractor): video_id = self._match_id(url) webpage = self._download_webpage(url, video_id) - title_result = traverse_obj(webpage, ({html_get_element(cls='opening-header__title')}, {self._TITLE_RE.match})) + title_result = traverse_obj(webpage, ({find_element(cls='opening-header__title')}, {self._TITLE_RE.match})) json_lds = list(self._yield_json_ld(webpage, video_id, fatal=False)) return { @@ -156,15 +143,15 @@ class BpbIE(InfoExtractor): # This metadata could be interpreted otherwise, but it fits "series" the most 'series': traverse_obj(title_result, ('series', {str.strip})) or None, 'description': join_nonempty(*traverse_obj(webpage, [( - {html_get_element(cls='opening-intro')}, - [{html_get_element(tag='bpb-accordion-item')}, {html_get_element(cls='text-content')}], + {find_element(cls='opening-intro')}, + [{find_element(tag='bpb-accordion-item')}, {find_element(cls='text-content')}], ), {clean_html}]), delim='\n\n') or None, - 'creator': self._html_search_meta('author', webpage), + 'creators': traverse_obj(self._html_search_meta('author', webpage), all), 'uploader': self._html_search_meta('publisher', webpage), 'release_date': unified_strdate(self._html_search_meta('date', webpage)), 'tags': traverse_obj(json_lds, (..., 'keywords', {lambda x: x.split(',')}, ...)), **traverse_obj(self._parse_vue_attributes('bpb-player', webpage, video_id), { 'formats': (':sources', ..., {self._process_source}), - 'thumbnail': ('poster', {lambda x: urljoin(url, x)}), + 'thumbnail': ('poster', {urljoin(url)}), }), } diff --git a/yt-dlp/yt_dlp/extractor/bravotv.py b/yt-dlp/yt_dlp/extractor/bravotv.py index ec72f0d884..0b2c447987 100644 --- a/yt-dlp/yt_dlp/extractor/bravotv.py +++ b/yt-dlp/yt_dlp/extractor/bravotv.py @@ -145,10 +145,9 @@ class BravoTVIE(AdobePassIE): tp_metadata = self._download_json( update_url_query(tp_url, {'format': 'preview'}), video_id, fatal=False) - seconds_or_none = lambda x: float_or_none(x, 1000) chapters = traverse_obj(tp_metadata, ('chapters', ..., { - 'start_time': ('startTime', {seconds_or_none}), - 'end_time': ('endTime', {seconds_or_none}), + 'start_time': ('startTime', {float_or_none(scale=1000)}), + 'end_time': ('endTime', {float_or_none(scale=1000)}), })) # prune pointless single chapters that span the entire duration from short videos if len(chapters) == 1 and not traverse_obj(chapters, (0, 'end_time')): @@ -168,8 +167,8 @@ class BravoTVIE(AdobePassIE): **merge_dicts(traverse_obj(tp_metadata, { 'title': 'title', 'description': 'description', - 'duration': ('duration', {seconds_or_none}), - 'timestamp': ('pubDate', {seconds_or_none}), + 'duration': ('duration', {float_or_none(scale=1000)}), + 'timestamp': ('pubDate', {float_or_none(scale=1000)}), 'season_number': (('pl1$seasonNumber', 'nbcu$seasonNumber'), {int_or_none}), 'episode_number': (('pl1$episodeNumber', 'nbcu$episodeNumber'), {int_or_none}), 'series': (('pl1$show', 'nbcu$show'), (None, ...), {str}), diff --git a/yt-dlp/yt_dlp/extractor/bundestag.py b/yt-dlp/yt_dlp/extractor/bundestag.py index 71f7726659..3dacbbd24a 100644 --- a/yt-dlp/yt_dlp/extractor/bundestag.py +++ b/yt-dlp/yt_dlp/extractor/bundestag.py @@ -8,11 +8,13 @@ from ..utils import ( bug_reports_message, clean_html, format_field, - get_element_text_and_html_by_tag, int_or_none, url_or_none, ) -from ..utils.traversal import traverse_obj +from ..utils.traversal import ( + find_element, + traverse_obj, +) class BundestagIE(InfoExtractor): @@ -115,9 +117,8 @@ class BundestagIE(InfoExtractor): note='Downloading metadata overlay', fatal=False, ), { 'title': ( - {functools.partial(get_element_text_and_html_by_tag, 'h3')}, 0, - {functools.partial(re.sub, r']*>[^<]+', '')}, {clean_html}), - 'description': ({functools.partial(get_element_text_and_html_by_tag, 'p')}, 0, {clean_html}), + {find_element(tag='h3')}, {functools.partial(re.sub, r']*>[^<]+', '')}, {clean_html}), + 'description': ({find_element(tag='p')}, {clean_html}), })) return result diff --git a/yt-dlp/yt_dlp/extractor/caffeinetv.py b/yt-dlp/yt_dlp/extractor/caffeinetv.py index aa107f8585..ea5134d2f3 100644 --- a/yt-dlp/yt_dlp/extractor/caffeinetv.py +++ b/yt-dlp/yt_dlp/extractor/caffeinetv.py @@ -53,7 +53,7 @@ class CaffeineTVIE(InfoExtractor): 'like_count': ('like_count', {int_or_none}), 'view_count': ('view_count', {int_or_none}), 'comment_count': ('comment_count', {int_or_none}), - 'tags': ('tags', ..., {str}, {lambda x: x or None}), + 'tags': ('tags', ..., {str}, filter), 'uploader': ('user', 'name', {str}), 'uploader_id': (((None, 'user'), 'username'), {str}, any), 'is_live': ('is_live', {bool}), @@ -62,7 +62,7 @@ class CaffeineTVIE(InfoExtractor): 'title': ('broadcast_title', {str}), 'duration': ('content_duration', {int_or_none}), 'timestamp': ('broadcast_start_time', {parse_iso8601}), - 'thumbnail': ('preview_image_path', {lambda x: urljoin(url, x)}), + 'thumbnail': ('preview_image_path', {urljoin(url)}), }), 'age_limit': { # assume Apple Store ratings: https://en.wikipedia.org/wiki/Mobile_software_content_rating_system diff --git a/yt-dlp/yt_dlp/extractor/cbc.py b/yt-dlp/yt_dlp/extractor/cbc.py index b44c23fa10..c0cf3da3de 100644 --- a/yt-dlp/yt_dlp/extractor/cbc.py +++ b/yt-dlp/yt_dlp/extractor/cbc.py @@ -453,8 +453,8 @@ class CBCPlayerIE(InfoExtractor): chapters = traverse_obj(data, ( 'media', 'chapters', lambda _, v: float(v['startTime']) is not None, { - 'start_time': ('startTime', {functools.partial(float_or_none, scale=1000)}), - 'end_time': ('endTime', {functools.partial(float_or_none, scale=1000)}), + 'start_time': ('startTime', {float_or_none(scale=1000)}), + 'end_time': ('endTime', {float_or_none(scale=1000)}), 'title': ('name', {str}), })) # Filter out pointless single chapters with start_time==0 and no end_time @@ -465,8 +465,8 @@ class CBCPlayerIE(InfoExtractor): **traverse_obj(data, { 'title': ('title', {str}), 'description': ('description', {str.strip}), - 'thumbnail': ('image', 'url', {url_or_none}, {functools.partial(update_url, query=None)}), - 'timestamp': ('publishedAt', {functools.partial(float_or_none, scale=1000)}), + 'thumbnail': ('image', 'url', {url_or_none}, {update_url(query=None)}), + 'timestamp': ('publishedAt', {float_or_none(scale=1000)}), 'media_type': ('media', 'clipType', {str}), 'series': ('showName', {str}), 'season_number': ('media', 'season', {int_or_none}), diff --git a/yt-dlp/yt_dlp/extractor/cbsnews.py b/yt-dlp/yt_dlp/extractor/cbsnews.py index 972e111190..b01c0efd5d 100644 --- a/yt-dlp/yt_dlp/extractor/cbsnews.py +++ b/yt-dlp/yt_dlp/extractor/cbsnews.py @@ -96,7 +96,7 @@ class CBSNewsBaseIE(InfoExtractor): **traverse_obj(item, { 'title': (None, ('fulltitle', 'title')), 'description': 'dek', - 'timestamp': ('timestamp', {lambda x: float_or_none(x, 1000)}), + 'timestamp': ('timestamp', {float_or_none(scale=1000)}), 'duration': ('duration', {float_or_none}), 'subtitles': ('captions', {get_subtitles}), 'thumbnail': ('images', ('hd', 'sd'), {url_or_none}), diff --git a/yt-dlp/yt_dlp/extractor/chzzk.py b/yt-dlp/yt_dlp/extractor/chzzk.py index e0b9980afd..aec77ac454 100644 --- a/yt-dlp/yt_dlp/extractor/chzzk.py +++ b/yt-dlp/yt_dlp/extractor/chzzk.py @@ -1,5 +1,3 @@ -import functools - from .common import InfoExtractor from ..utils import ( UserNotLive, @@ -77,7 +75,7 @@ class CHZZKLiveIE(InfoExtractor): 'thumbnails': thumbnails, **traverse_obj(live_detail, { 'title': ('liveTitle', {str}), - 'timestamp': ('openDate', {functools.partial(parse_iso8601, delimiter=' ')}), + 'timestamp': ('openDate', {parse_iso8601(delimiter=' ')}), 'concurrent_view_count': ('concurrentUserCount', {int_or_none}), 'view_count': ('accumulateCount', {int_or_none}), 'channel': ('channel', 'channelName', {str}), @@ -146,23 +144,37 @@ class CHZZKVideoIE(InfoExtractor): video_meta = self._download_json( f'https://api.chzzk.naver.com/service/v3/videos/{video_id}', video_id, note='Downloading video info', errnote='Unable to download video info')['content'] - formats, subtitles = self._extract_mpd_formats_and_subtitles( - f'https://apis.naver.com/neonplayer/vodplay/v1/playback/{video_meta["videoId"]}', video_id, - query={ - 'key': video_meta['inKey'], - 'env': 'real', - 'lc': 'en_US', - 'cpl': 'en_US', - }, note='Downloading video playback', errnote='Unable to download video playback') + + live_status = 'was_live' if video_meta.get('liveOpenDate') else 'not_live' + video_status = video_meta.get('vodStatus') + if video_status == 'UPLOAD': + playback = self._parse_json(video_meta['liveRewindPlaybackJson'], video_id) + formats, subtitles = self._extract_m3u8_formats_and_subtitles( + playback['media'][0]['path'], video_id, 'mp4', m3u8_id='hls') + elif video_status == 'ABR_HLS': + formats, subtitles = self._extract_mpd_formats_and_subtitles( + f'https://apis.naver.com/neonplayer/vodplay/v1/playback/{video_meta["videoId"]}', + video_id, query={ + 'key': video_meta['inKey'], + 'env': 'real', + 'lc': 'en_US', + 'cpl': 'en_US', + }) + else: + self.raise_no_formats( + f'Unknown video status detected: "{video_status}"', expected=True, video_id=video_id) + formats, subtitles = [], {} + live_status = 'post_live' if live_status == 'was_live' else None return { 'id': video_id, 'formats': formats, 'subtitles': subtitles, + 'live_status': live_status, **traverse_obj(video_meta, { 'title': ('videoTitle', {str}), 'thumbnail': ('thumbnailImageUrl', {url_or_none}), - 'timestamp': ('publishDateAt', {functools.partial(float_or_none, scale=1000)}), + 'timestamp': ('publishDateAt', {float_or_none(scale=1000)}), 'view_count': ('readCount', {int_or_none}), 'duration': ('duration', {int_or_none}), 'channel': ('channel', 'channelName', {str}), diff --git a/yt-dlp/yt_dlp/extractor/cineverse.py b/yt-dlp/yt_dlp/extractor/cineverse.py index c8c6c48c27..124c874e2c 100644 --- a/yt-dlp/yt_dlp/extractor/cineverse.py +++ b/yt-dlp/yt_dlp/extractor/cineverse.py @@ -3,6 +3,7 @@ import re from .common import InfoExtractor from ..utils import ( filter_dict, + float_or_none, int_or_none, parse_age_limit, smuggle_url, @@ -85,7 +86,7 @@ class CineverseIE(CineverseBaseIE): 'title': 'title', 'id': ('details', 'item_id'), 'description': ('details', 'description'), - 'duration': ('duration', {lambda x: x / 1000}), + 'duration': ('duration', {float_or_none(scale=1000)}), 'cast': ('details', 'cast', {lambda x: x.split(', ')}), 'modified_timestamp': ('details', 'updated_by', 0, 'update_time', 'time', {int_or_none}), 'season_number': ('details', 'season', {int_or_none}), diff --git a/yt-dlp/yt_dlp/extractor/cnn.py b/yt-dlp/yt_dlp/extractor/cnn.py index cfcec9d1fd..8148762c54 100644 --- a/yt-dlp/yt_dlp/extractor/cnn.py +++ b/yt-dlp/yt_dlp/extractor/cnn.py @@ -1,4 +1,3 @@ -import functools import json import re @@ -199,7 +198,7 @@ class CNNIE(InfoExtractor): 'timestamp': ('data-publish-date', {parse_iso8601}), 'thumbnail': ( 'data-poster-image-override', {json.loads}, 'big', 'uri', {url_or_none}, - {functools.partial(update_url, query='c=original')}), + {update_url(query='c=original')}), 'display_id': 'data-video-slug', }), **traverse_obj(video_data, { diff --git a/yt-dlp/yt_dlp/extractor/common.py b/yt-dlp/yt_dlp/extractor/common.py index 7e6e6227d3..01915acf23 100644 --- a/yt-dlp/yt_dlp/extractor/common.py +++ b/yt-dlp/yt_dlp/extractor/common.py @@ -1578,7 +1578,9 @@ class InfoExtractor: if default is not NO_DEFAULT: fatal = False for mobj in re.finditer(JSON_LD_RE, html): - json_ld_item = self._parse_json(mobj.group('json_ld'), video_id, fatal=fatal) + json_ld_item = self._parse_json( + mobj.group('json_ld'), video_id, fatal=fatal, + errnote=False if default is not NO_DEFAULT else None) for json_ld in variadic(json_ld_item): if isinstance(json_ld, dict): yield json_ld diff --git a/yt-dlp/yt_dlp/extractor/condenast.py b/yt-dlp/yt_dlp/extractor/condenast.py index 9c02cd3429..0c84cfdab7 100644 --- a/yt-dlp/yt_dlp/extractor/condenast.py +++ b/yt-dlp/yt_dlp/extractor/condenast.py @@ -12,6 +12,7 @@ from ..utils import ( parse_iso8601, strip_or_none, try_get, + urljoin, ) @@ -112,8 +113,7 @@ class CondeNastIE(InfoExtractor): m_paths = re.finditer( r'(?s)

.*?playlist))= ) - [/=](?P[^/?_&]+)(?:.+?\bplaylist=(?Px[0-9a-z]+))? - ''' + ) + (?P[^/?_&#]+)(?:[\w-]*\?playlist=(?Px[0-9a-z]+))? + ''' IE_NAME = 'dailymotion' _EMBED_REGEX = [r'<(?:(?:embed|iframe)[^>]+?src=|input[^>]+id=[\'"]dmcloudUrlEmissionSelect[\'"][^>]+value=)(["\'])(?P(?:https?:)?//(?:www\.)?dailymotion\.com/(?:embed|swf)/video/.+?)\1'] _TESTS = [{ @@ -123,7 +134,7 @@ class DailymotionIE(DailymotionBaseInfoExtractor): 'view_count': int, 'like_count': int, 'tags': ['hollywood', 'celeb', 'celebrity', 'movies', 'red carpet'], - 'thumbnail': r're:https://(?:s[12]\.)dmcdn\.net/v/K456B1aXqIx58LKWQ/x1080', + 'thumbnail': r're:https://(?:s[12]\.)dmcdn\.net/v/K456B1cmt4ZcZ9KiM/x1080', }, }, { 'url': 'https://geo.dailymotion.com/player.html?video=x89eyek&mute=true', @@ -142,7 +153,7 @@ class DailymotionIE(DailymotionBaseInfoExtractor): 'view_count': int, 'like_count': int, 'tags': ['en_quete_d_esprit'], - 'thumbnail': r're:https://(?:s[12]\.)dmcdn\.net/v/Tncwi1YNg_RUl7ueu/x1080', + 'thumbnail': r're:https://(?:s[12]\.)dmcdn\.net/v/Tncwi1clTH6StrxMP/x1080', }, }, { 'url': 'https://www.dailymotion.com/video/x2iuewm_steam-machine-models-pricing-listed-on-steam-store-ign-news_videogames', @@ -217,6 +228,66 @@ class DailymotionIE(DailymotionBaseInfoExtractor): }, { 'url': 'https://geo.dailymotion.com/player/xakln.html?video=x8mjju4&customConfig%5BcustomParams%5D=%2Ffr-fr%2Ftennis%2Fwimbledon-mens-singles%2Farticles-video', 'only_matching': True, + }, { # playlist-only + 'url': 'https://geo.dailymotion.com/player/xf7zn.html?playlist=x7wdsj', + 'only_matching': True, + }, { + 'url': 'https://geo.dailymotion.com/player/xmyye.html?video=x93blhi', + 'only_matching': True, + }, { + 'url': 'https://www.dailymotion.com/crawler/video/x8u4owg', + 'only_matching': True, + }, { + 'url': 'https://www.dailymotion.com/embed/video/x8u4owg', + 'only_matching': True, + }, { + 'url': 'https://dai.ly/x94cnnk', + 'only_matching': True, + }] + _WEBPAGE_TESTS = [{ + # https://geo.dailymotion.com/player/xmyye.html?video=x93blhi + 'url': 'https://www.financialounge.com/video/2024/08/01/borse-europee-in-rosso-dopo-la-fed-a-milano-volano-mediobanca-e-tim-edizione-del-1-agosto/', + 'info_dict': { + 'id': 'x93blhi', + 'ext': 'mp4', + 'title': 'OnAir - 01/08/24', + 'description': '', + 'duration': 217, + 'timestamp': 1722505658, + 'upload_date': '20240801', + 'uploader': 'Financialounge', + 'uploader_id': 'x2vtgmm', + 'age_limit': 0, + 'tags': [], + 'view_count': int, + 'like_count': int, + }, + }, { + # https://geo.dailymotion.com/player/xf7zn.html?playlist=x7wdsj + 'url': 'https://www.cycleworld.com/blogs/ask-kevin/ducati-continues-to-evolve-with-v4/', + 'info_dict': { + 'id': 'x7wdsj', + }, + 'playlist_mincount': 50, + }, { + # https://www.dailymotion.com/crawler/video/x8u4owg + 'url': 'https://www.leparisien.fr/environnement/video-le-veloto-la-voiture-a-pedales-qui-aimerait-se-faire-une-place-sur-les-routes-09-03-2024-KCYMCPM4WFHJXMSKBUI66UNFPU.php', + 'info_dict': { + 'id': 'x8u4owg', + 'ext': 'mp4', + 'like_count': int, + 'uploader': 'Le Parisien', + 'thumbnail': 'https://www.leparisien.fr/resizer/ho_GwveeYftNkLwg_cEta--5Bv4=/1200x675/cloudfront-eu-central-1.images.arcpublishing.com/leparisien/BFXJNEBN75EUNHGYJLORUC3TX4.jpg', + 'upload_date': '20240309', + 'view_count': int, + 'timestamp': 1709997866, + 'age_limit': 0, + 'uploader_id': 'x32f7b', + 'title': 'VIDÉO. Le «\xa0véloto\xa0», la voiture à pédales qui aimerait se faire une place sur les routes', + 'duration': 428.0, + 'description': 'À bord du « véloto », l’alternative à la voiture pour la campagne', + 'tags': ['biclou', 'vélo', 'véloto', 'campagne', 'voiture', 'environnement', 'véhicules intermédiaires'], + }, }] _GEO_BYPASS = False _COMMON_MEDIA_FIELDS = '''description @@ -232,16 +303,35 @@ class DailymotionIE(DailymotionBaseInfoExtractor): for mobj in re.finditer( r'(?s)DM\.player\([^,]+,\s*{.*?video[\'"]?\s*:\s*["\']?(?P[0-9a-zA-Z]+).+?}\s*\);', webpage): yield from 'https://www.dailymotion.com/embed/video/' + mobj.group('id') + for mobj in re.finditer( + r'(?s)