diff --git a/package/ntlf9t/luci-app-clash/Makefile b/package/ntlf9t/luci-app-clash/Makefile index 47b3489fe6..b75ab8bab1 100644 --- a/package/ntlf9t/luci-app-clash/Makefile +++ b/package/ntlf9t/luci-app-clash/Makefile @@ -1,7 +1,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-clash -PKG_VERSION:=1.6.0 +PKG_VERSION:=1.6.1 PKG_MAINTAINER:=frainzy1477 @@ -12,7 +12,7 @@ define Package/luci-app-clash CATEGORY:=LuCI SUBMENU:=3. Applications TITLE:=LuCI app for clash - DEPENDS:=+luci-compat +luci-base +wget +iptables +coreutils-base64 +coreutils +coreutils-nohup +bash +ipset +libustream-openssl +libopenssl +openssl-util +curl +jsonfilter +ca-certificates + DEPENDS:=+luci-compat +luci-base +wget +iptables +coreutils-base64 +coreutils +coreutils-nohup +bash +ipset +libustream-openssl +libopenssl +openssl-util +curl +jsonfilter +ca-certificates +iptables-mod-tproxy PKGARCH:=all MAINTAINER:=frainzy1477 endef @@ -141,10 +141,10 @@ define Package/$(PKG_NAME)/install $(INSTALL_BIN) ./root/usr/share/clash/clash.txt $(1)/usr/share/clash/ $(INSTALL_BIN) ./root/usr/share/clash/dashboard/index.html $(1)/usr/share/clash/dashboard/ - $(INSTALL_BIN) ./root/usr/share/clash/dashboard/main.f302eae39f433a9c3fa1.css $(1)/usr/share/clash/dashboard/ + $(INSTALL_BIN) ./root/usr/share/clash/dashboard/main.f42e08fe49cdc3329278.css $(1)/usr/share/clash/dashboard/ $(INSTALL_BIN) ./root/usr/share/clash/dashboard/img/33343e6117c37aaef8886179007ba6b5.png $(1)/usr/share/clash/dashboard/img/ - $(INSTALL_BIN) ./root/usr/share/clash/dashboard/js/1.bundle.f302eae39f433a9c3fa1.min.js $(1)/usr/share/clash/dashboard/js/ - $(INSTALL_BIN) ./root/usr/share/clash/dashboard/js/bundle.f302eae39f433a9c3fa1.min.js $(1)/usr/share/clash/dashboard/js/ + $(INSTALL_BIN) ./root/usr/share/clash/dashboard/js/1.bundle.f42e08fe49cdc3329278.min.js $(1)/usr/share/clash/dashboard/js/ + $(INSTALL_BIN) ./root/usr/share/clash/dashboard/js/bundle.f42e08fe49cdc3329278.min.js $(1)/usr/share/clash/dashboard/js/ $(INSTALL_BIN) ./root/usr/share/clash/yacd/* $(1)/usr/share/clash/yacd/ $(INSTALL_DATA) ./luasrc/clash.lua $(1)/usr/lib/lua/luci/ diff --git a/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/client.lua b/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/client.lua index 46d49ce5a2..9d29852012 100644 --- a/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/client.lua +++ b/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/client.lua @@ -29,6 +29,12 @@ o:value("4", translate("Clash(dTun)")) end o.description = translate("Select core, clashr support ssr while clash does not.") + +o = s:option(ListValue, "new_conf", translate("New Config(Rename fields)")) +o:value("0", translate("Disable")) +o:value("1", translate("Enable")) +o.description = translate("https://github.com/Dreamacro/clash/commit/88d8f937938d7aba774b1af638df6910b1a1a14d") + o = s:option(ListValue, "g_rules", translate("Game Rules")) o.default = "0" o:value("0", translate("Disable")) diff --git a/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/create.lua b/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/create.lua index 831a92acd7..a86811ef7a 100644 --- a/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/create.lua +++ b/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/create.lua @@ -71,6 +71,11 @@ o.title = translate("Config Name") o.rmempty = true o.description = translate("Give a name for your config") +o = s:option(ListValue, "new_conff", translate("New Config(Rename fields)")) +o:value("0", translate("Disable")) +o:value("1", translate("Enable")) +o.description = translate("https://github.com/Dreamacro/clash/commit/88d8f937938d7aba774b1af638df6910b1a1a14d") + cc = s:option(Flag, "same_tag", translate("Force Same Name")) cc.default = 1 cc.description = translate("Enable to overwrite config file") diff --git a/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/dns.lua b/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/dns.lua index 912a237673..564c740a14 100644 --- a/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/dns.lua +++ b/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/dns.lua @@ -21,6 +21,11 @@ y:value("0", translate("disabled")) y:value("1", translate("enabled")) y.description = translate("Set custom DNS forwarder in DHCP and DNS Settings and forward all dns traffic to clash") +y = s:option(ListValue, "enable_udp", translate("Enable UDP")) +y:value("0", translate("disabled")) +y:value("1", translate("enabled")) +y.description = translate("Enable udp traffic ,make sure your server support udp") + deldns = s:option(Flag, "delan", translate("Remove Lan DNS")) deldns.description = translate("Remove Lan custom DNS Servers when client is disabled") @@ -35,17 +40,16 @@ dns.datatype = "ipaddr" dns.cast = "string" dns:depends("culan", 1) -y = s:option(ListValue, "ipv6", translate("Enable ipv6")) -y:value("0", translate("disabled")) -y:value("1", translate("enabled")) -y.description = translate("Allow ipv6 traffic through clash") - md = s:option(Flag, "tun_mode", translate("Tun Mode DNS")) md.default = 0 md.description = translate("Enable Tun custom DNS and make sure you are using tun supported core") md:depends("mode", 0) +y = s:option(ListValue, "ipv6", translate("Enable ipv6")) +y:value("0", translate("disabled")) +y:value("1", translate("enabled")) +y.description = translate("Allow ipv6 traffic through clash") md = s:option(Flag, "mode", translate("Custom DNS")) md.default = 1 diff --git a/package/ntlf9t/luci-app-clash/luasrc/view/clash/status.htm b/package/ntlf9t/luci-app-clash/luasrc/view/clash/status.htm index 6fdf276f23..09b3216899 100644 --- a/package/ntlf9t/luci-app-clash/luasrc/view/clash/status.htm +++ b/package/ntlf9t/luci-app-clash/luasrc/view/clash/status.htm @@ -161,7 +161,7 @@ var HTTP = { XHR.poll(1, '<%=luci.dispatcher.build_url("admin", "services", "clash", "status")%>', null, function(x, status) { if ( x && x.status == 200 ) { web.innerHTML = status.clash ? '<%:DASHBOARD%>' : '<%:NOT RUNNING%>'; - webb.innerHTML = status.clash ? '<%:DASHBOARD%>' : '<%:NOT RUNNING%>'; + webb.innerHTML = status.clash ? '<%:DASHBOARD%>' : '<%:NOT RUNNING%>'; clash.innerHTML = status.clash ? '<%:RUNNING%> ' : '<%:NOT RUNNING%>'; ip.innerHTML = status.localip ? ''+status.localip+' ' : '<%:NOT SET%>'; port.innerHTML = status.dash_port ? ''+status.dash_port+' ' : '<%:NOT SET%>'; diff --git a/package/ntlf9t/luci-app-clash/po/zh_Hans/clash.po b/package/ntlf9t/luci-app-clash/po/zh_Hans/clash.po index 97ac893b52..f437afd98a 100644 --- a/package/ntlf9t/luci-app-clash/po/zh_Hans/clash.po +++ b/package/ntlf9t/luci-app-clash/po/zh_Hans/clash.po @@ -1025,5 +1025,11 @@ msgstr "Yacd控制面板" msgid "Enable Ping Servers" msgstr "启用Ping服务器" -msgid "DISABLED" -msgstr "禁用" +msgid "New Config(Rename fields)" +msgstr "新配置(重命名字段)" + +msgid "Enable UDP" +msgstr "启用UDP" + +msgid "Enable udp traffic ,make sure your server support udp" +msgstr "启用udp流量,服务器必须支持udp" diff --git a/package/ntlf9t/luci-app-clash/root/etc/config/clash b/package/ntlf9t/luci-app-clash/root/etc/config/clash index 586652edd2..dfaa6e22e1 100644 --- a/package/ntlf9t/luci-app-clash/root/etc/config/clash +++ b/package/ntlf9t/luci-app-clash/root/etc/config/clash @@ -28,6 +28,9 @@ config clash 'config' option auto_update_time '12' option clear_time '12' option append_rules '0' + option enable_udp '0' + option new_conf '0' + option ping_enable '1' config groups @@ -57,27 +60,11 @@ config groups option name '🔑Proxy' list other_group 'ALL' + config addtype - option type 'SRC-IP-CIDR' - option pgroup 'DIRECT' - list ipaaddr '192.168.1.4/30' + option type 'IP-CIDR' + option pgroup 'REJECT' + option ipaaddr '198.18.0.1/16' + option res '1' + -config addtype - option type 'SRC-IP-CIDR' - option pgroup 'DIRECT' - option ipaaddr '192.168.1.2/31' - -config addtype - option type 'DOMAIN-KEYWORD' - option pgroup 'DIRECT' - option ipaaddr 'baidu' - -config addtype - option type 'SRC-PORT' - option pgroup 'DIRECT' - option ipaaddr '22' - -config addtype - option type 'DST-PORT' - option pgroup 'DIRECT' - option ipaaddr '443' diff --git a/package/ntlf9t/luci-app-clash/root/etc/init.d/clash b/package/ntlf9t/luci-app-clash/root/etc/init.d/clash index 01340b8c82..2c7af64b7f 100644 --- a/package/ntlf9t/luci-app-clash/root/etc/init.d/clash +++ b/package/ntlf9t/luci-app-clash/root/etc/init.d/clash @@ -33,7 +33,7 @@ revert_dns() { add_cron(){ config_type=$(uci get clash.config.config_type 2>/dev/null) #=========================================================================================================================== - [ -z "$(grep -w "/usr/share/clash/clash-watchdog.sh" $CRON_FILE)" ] && echo "*/1 * * * * /usr/share/clash/clash-watchdog.sh" >> $CRON_FILE + [ -z "$(grep -w "/usr/share/clash/clash-watchdog.sh" $CRON_FILE)" ] && echo "*/2 * * * * /usr/share/clash/clash-watchdog.sh" >> $CRON_FILE [ -z "$(grep -w "/usr/share/clash/kill_watchdog.sh" $CRON_FILE)" ] && echo "*/1 * * * * /usr/share/clash/kill_watchdog.sh" >> $CRON_FILE clear=$(uci get clash.config.auto_clear_log 2>/dev/null) if [ "${clear}" -eq 1 ]; then @@ -208,6 +208,16 @@ yml_dns_change(){ #=========================================================================================================================== } + +check(){ + + sed -i 's/Proxy Group:/proxy-groups:/g' "$CONFIG_YAML" + sed -i 's/proxy-provider:/proxy-providers:/g' "$CONFIG_YAML" + sed -i 's/Proxy:/proxies:/g' "$CONFIG_YAML" + sed -i 's/Rule:/rules:/g' "$CONFIG_YAML" + +} + rules(){ #=========================================================================================================================== @@ -218,9 +228,12 @@ rules(){ core=$(uci get clash.config.core 2>/dev/null) tun_mode=$(uci get clash.config.tun_mode 2>/dev/null) lan_ip=$(uci get network.lan.ipaddr 2>/dev/null |awk -F '/' '{print $1}' 2>/dev/null) - wan=$(ubus call network.interface.wan status 2>/dev/null | grep \"address\" | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' 2>/dev/null) + wan=$(ifconfig | grep 'inet addr' | awk '{print $2}' | cut -d: -f2 2>/dev/null) + ip6=$(ifconfig | grep 'inet6 addr' | awk '{print $3}' 2>/dev/null) + enable_udp=$(uci get clash.config.enable_udp 2>/dev/null) + if [ "${core}" -eq 1 ] || [ "${core}" -eq 2 ];then - iptables -t nat -N clash + iptables -t nat -N clash iptables -t nat -A clash -d 0.0.0.0/8 -j RETURN iptables -t nat -A clash -d 10.0.0.0/8 -j RETURN iptables -t nat -A clash -d 127.0.0.0/8 -j RETURN @@ -230,18 +243,57 @@ rules(){ iptables -t nat -A clash -d 224.0.0.0/4 -j RETURN iptables -t nat -A clash -d 240.0.0.0/4 -j RETURN iptables -t nat -A clash -d "${lan_ip}" -j RETURN - if [ ! -z "${wan}" ]; then - iptables -t nat -A clash -d "${wan}" -j RETURN + if [ ! -z "${wan}" ]; then + for wan_ip in $wan; do + iptables -t mangle -A clash -d "$wan_ip" -j RETURN 2>/dev/null + done fi - iptables -t nat -A clash -p tcp -j REDIRECT --to-ports "${redir_port}" - iptables -t nat -A PREROUTING -p tcp -j clash - + + iptables -t nat -A clash -p tcp -j REDIRECT --to-ports "${redir_port}" + iptables -t nat -A PREROUTING -p tcp -j clash + + + + if [ "${enable_udp}" -eq 1 ]; then + + ip rule add fwmark 1 table 100 + ip route add local default dev lo table 100 + + iptables -t mangle -N clash + iptables -t mangle -A clash -d 0.0.0.0/8 -j RETURN + iptables -t mangle -A clash -d 10.0.0.0/8 -j RETURN + iptables -t mangle -A clash -d 127.0.0.0/8 -j RETURN + iptables -t mangle -A clash -d 169.254.0.0/16 -j RETURN + iptables -t mangle -A clash -d 172.16.0.0/12 -j RETURN + iptables -t mangle -A clash -d 192.168.0.0/16 -j RETURN + iptables -t mangle -A clash -d 224.0.0.0/4 -j RETURN + iptables -t mangle -A clash -d 240.0.0.0/4 -j RETURN + if [ ! -z "${wan}" ]; then + for wan_ip in $wan; do + iptables -t mangle -A clash -d "$wan_ip" -j RETURN 2>/dev/null + done + fi + + iptables -t mangle -A clash -p udp -j TPROXY --on-port "${redir_port}" --tproxy-mark 1 + #iptables -t mangle -A clash -p udp --dport 53 -j TPROXY --on-port "${redir_port}" --tproxy-mark 0x01/0x01 + iptables -t mangle -A PREROUTING -p udp -j clash + + fi + + + fake_ip_range=$(egrep '^ {0,}fake-ip-range' /etc/clash/config.yaml |grep fake-ip-range: |awk -F ': ' '{print $2}') if [ ! -z "${fake_ip_range}" ];then iptables -t nat -A OUTPUT -p tcp -d $fake_ip_range -j REDIRECT --to-ports "${redir_port}" + if [ "${enable_udp}" -eq 1 ]; then + iptables -t mangle -A OUTPUT -p udp -d $fake_ip_range -j MARK --set-mark 1 + fi else iptables -t nat -A OUTPUT -p tcp -d 198.18.0.1/16 -j REDIRECT --to-ports "${redir_port}" + if [ "${enable_udp}" -eq 1 ]; then + iptables -t mangle -A OUTPUT -p udp -d 198.18.0.1/16 -j MARK --set-mark 1 + fi fi @@ -250,6 +302,20 @@ rules(){ ip6tables -t nat -A clash_ipv6 -p tcp -j REDIRECT --to-ports "${redir_port}" ip6tables -t nat -A PREROUTING -p tcp -j clash_ipv6 + + if [ "${enable_udp}" -eq 1 ]; then + ip6tables -t mangle -N clash + if [ ! -z "${ip6}" ]; then + for lan_ip6 in $ip6; do + if [ "$enable_udp" -eq 1 ]; then + ip6tables -t mangle -A clash -d "$lan_ip6" -j RETURN 2>/dev/null + fi + done + fi + ip6tables -t mangle -A clash -p udp -j TPROXY --on-port "$proxy_port" --tproxy-mark 1 + ip6tables -t mangle -A PREROUTING -p udp -j clash + fi + fi elif [ "${core}" -eq 3 ] || [ "${core}" -eq 4 ];then @@ -281,6 +347,7 @@ rules(){ ip link set $TUN_DEVICE_NAME up ip address replace 198.18.0.0/16 dev $TUN_DEVICE_NAME ip route replace default dev $TUN_DEVICE_NAME table "$PROXY_ROUTE_TABLE" + iptables -t nat -I PREROUTING -p tcp --dport 53 -j ACCEPT elif [ "${core}" -eq 4 ];then ip route replace default dev utun table "$PROXY_ROUTE_TABLE" fi @@ -293,6 +360,7 @@ rules(){ iptables -t mangle -A clash -m set --match-set localnetwork dst -j RETURN iptables -t mangle -I OUTPUT -j clash iptables -t mangle -I PREROUTING -m set ! --match-set localnetwork dst -j MARK --set-mark "$PROXY_FWMARK" + iptables -t nat -I PREROUTING -p tcp --dport 53 -j ACCEPT if [ -f /usr/sbin/ip6tables ] && [ "${ipv6}" -eq 1 ]; then ip6tables -t mangle -I PREROUTING -j MARK --set-mark "$PROXY_FWMARK" @@ -321,6 +389,7 @@ enable=$(uci get clash.config.enable 2>/dev/null) core=$(uci get clash.config.core 2>/dev/null) tun_mode=$(uci get clash.config.tun_mode 2>/dev/null) + if [ -f /etc/clash/config.yaml ];then rm -rf /etc/clash/config.yaml >/dev/null 2>&1 fi @@ -370,11 +439,14 @@ elif [ "${core}" -eq 3 ] && [ ! -f /etc/clash/clashtun/clash ]; then exit 0 else if [ -f $CONFIG_YAML ] && [ "$(ls -l $CONFIG_YAML|awk '{print int($5/1024)}')" -ne 0 ] ; then - + new_conf=$(uci get clash.config.new_conf 2>/dev/null) yml_change >/dev/null 2>&1 + if [ "$new_conf" -eq 1 ];then + check >/dev/null 2>&1 + fi checktype=$(grep -c "type: ssr" /etc/clash/config.yaml 2>/dev/null) - if [ "${checktype}" -gt 0 ] && [ "${core}" -eq 1 ] || [ "${checktype}" -gt 0 ] && [ "${core}" -eq 3 ]; then + if [ "${checktype}" -gt 0 ] && [ "${core}" -ne 2 ]; then if [ "${lang}" == "en" ] || [ $lang == "auto" ];then echo "Clash Core does not Support Config, use clashr core" >$REAL_LOG @@ -632,23 +704,53 @@ stop(){ echo "删除clash iptables规则" >$REAL_LOG fi - iptables -t nat -F clash >/dev/null 2>&1 && iptables -t nat -X clash >/dev/null 2>&1 + nat_indexs=$(iptables -nvL PREROUTING -t nat | sed 1,2d | sed -n '/clash/=' | sort -r) + for nat_index in $nat_indexs; do + iptables -t nat -D PREROUTING $nat_index >/dev/null 2>&1 + iptables -t nat -F clash >/dev/null 2>&1 && iptables -t nat -X clash >/dev/null 2>&1 + iptables -t mangle -F clash >/dev/null 2>&1 && iptables -t mangle -D PREROUTING -p udp -j clash >/dev/null 2>&1 && iptables -t mangle -X clash >/dev/null 2>&1 + done + sleep 1 + + ip rule del fwmark 1 table 100 >/dev/null 2>&1 + ip route del local default dev lo table 100 >/dev/null 2>&1 + + iptables -t nat -D PREROUTING -p tcp --dport 53 -j ACCEPT >/dev/null 2>&1 + + sleep 1 + + ip6tables -t mangle -F clash >/dev/null 2>&1 + ip6tables -t mangle -D PREROUTING -p udp -j clash >/dev/null 2>&1 + ip6tables -t mangle -X clash >/dev/null 2>&1 + + + out_linese=$(iptables -nvL OUTPUT -t mangle |sed 1,2d |sed -n '/198.18.0.1\/16/=' 2>/dev/null |sort -rn) + for out_linee in $out_linese; do + iptables -t mangle -D OUTPUT "$out_linee" >/dev/null 2>&1 + done + + out_linesee=$(iptables -nvL OUTPUT -t mangle |sed 1,2d |sed -n '/198.18.0.0\/16/=' 2>/dev/null |sort -rn) + for out_linees in $out_linesee; do + iptables -t mangle -D OUTPUT "$out_linees" >/dev/null 2>&1 + done + nat_indexs=$(iptables -nvL PREROUTING -t nat | sed 1,2d | sed -n '/clash/=' | sort -r) for nat_index in $nat_indexs; do iptables -t nat -D PREROUTING $nat_index >/dev/null 2>&1 done + fake=$(iptables -nvL OUTPUT -t nat |sed 1,2d |sed -n '/198.18.0.0\/16/=' |sort -r) - for fake in $fake; do - iptables -t nat -D OUTPUT $fake >/dev/null 2>&1 - done + for fake in $fake; do + iptables -t nat -D OUTPUT $fake >/dev/null 2>&1 + done fake2=$(iptables -nvL OUTPUT -t nat |sed 1,2d |sed -n '/198.18.0.1\/16/=' |sort -r) - for fake2 in $fake2; do - iptables -t nat -D OUTPUT $fake2 >/dev/null 2>&1 - done + for fake2 in $fake2; do + iptables -t nat -D OUTPUT $fake2 >/dev/null 2>&1 + done remove_mark >/dev/null 2>&1 diff --git a/package/ntlf9t/luci-app-clash/root/usr/share/clash/custom_rule.yaml b/package/ntlf9t/luci-app-clash/root/usr/share/clash/custom_rule.yaml index fbfe8a8d76..32f0cb940c 100644 --- a/package/ntlf9t/luci-app-clash/root/usr/share/clash/custom_rule.yaml +++ b/package/ntlf9t/luci-app-clash/root/usr/share/clash/custom_rule.yaml @@ -1,4 +1,4 @@ -Rule: +rules: # (GlobalTV) # > ABC - DOMAIN-SUFFIX,edgedatg.com,📺GlobalTV diff --git a/package/ntlf9t/luci-app-clash/root/usr/share/clash/dashboard/index.html b/package/ntlf9t/luci-app-clash/root/usr/share/clash/dashboard/index.html index ad630255e7..08e7119b2e 100644 --- a/package/ntlf9t/luci-app-clash/root/usr/share/clash/dashboard/index.html +++ b/package/ntlf9t/luci-app-clash/root/usr/share/clash/dashboard/index.html @@ -4,9 +4,9 @@ - Clash - + Clash Dashboard +
- + diff --git a/package/ntlf9t/luci-app-clash/root/usr/share/clash/dashboard/js/1.bundle.f302eae39f433a9c3fa1.min.js b/package/ntlf9t/luci-app-clash/root/usr/share/clash/dashboard/js/1.bundle.f302eae39f433a9c3fa1.min.js deleted file mode 100644 index bad63ddbfb..0000000000 --- a/package/ntlf9t/luci-app-clash/root/usr/share/clash/dashboard/js/1.bundle.f302eae39f433a9c3fa1.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see 1.bundle.f302eae39f433a9c3fa1.min.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[1],[function(e,t,n){"use strict";e.exports=n(52)},function(e,t,n){e.exports=n(56)()},function(e,t,n){var r;!function(){"use strict";var n={}.hasOwnProperty;function o(){for(var e=[],t=0;t=0||(o[n]=e[n]);return o}n.d(t,"a",(function(){return r}))},,,,function(e,t,n){"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE){0;try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}}(),e.exports=n(53)},function(e,t,n){var r=n(41)(Object,"create");e.exports=r},function(e,t,n){var r=n(111);e.exports=function(e,t){for(var n=e.length;n--;)if(r(e[n][0],t))return n;return-1}},function(e,t,n){var r=n(117);e.exports=function(e,t){var n=e.__data__;return r(t)?n["string"==typeof t?"string":"hash"]:n.map}},,function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(r){"object"==typeof window&&(n=window)}e.exports=n},function(e,t){var n=Array.isArray;e.exports=n},function(e,t,n){var r=n(40),o=n(90);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},function(e,t,n){var r=n(22).Symbol;e.exports=r},function(e,t,n){var r=n(87),o="object"==typeof self&&self&&self.Object===Object&&self,i=r||o||Function("return this")();e.exports=i},function(e,t,n){e.exports=function(){"use strict";var e="millisecond",t="second",n="minute",r="hour",o="day",i="week",a="month",u="quarter",l="year",c=/^(\d{4})-?(\d{1,2})-?(\d{0,2})[^0-9]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?.?(\d{1,3})?$/,s=/\[([^\]]+)]|Y{2,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,f=function(e,t,n){var r=String(e);return!r||r.length>=t?e:""+Array(t+1-r.length).join(n)+e},d={s:f,z:function(e){var t=-e.utcOffset(),n=Math.abs(t),r=Math.floor(n/60),o=n%60;return(t<=0?"+":"-")+f(r,2,"0")+":"+f(o,2,"0")},m:function(e,t){var n=12*(t.year()-e.year())+(t.month()-e.month()),r=e.clone().add(n,a),o=t-r<0,i=e.clone().add(n+(o?-1:1),a);return Number(-(n+(t-r)/(o?r-i:i-r))||0)},a:function(e){return e<0?Math.ceil(e)||0:Math.floor(e)},p:function(c){return{M:a,y:l,w:i,d:o,h:r,m:n,s:t,ms:e,Q:u}[c]||String(c||"").toLowerCase().replace(/s$/,"")},u:function(e){return void 0===e}},p={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_")},h="en",m={};m[h]=p;var v=function(e){return e instanceof w},g=function(e,t,n){var r;if(!e)return h;if("string"==typeof e)m[e]&&(r=e),t&&(m[e]=t,r=e);else{var o=e.name;m[o]=e,r=o}return n||(h=r),r},y=function(e,t,n){if(v(e))return e.clone();var r=t?"string"==typeof t?{format:t,pl:n}:t:{};return r.date=e,new w(r)},b=d;b.l=g,b.i=v,b.w=function(e,t){return y(e,{locale:t.$L,utc:t.$u,$offset:t.$offset})};var w=function(){function f(e){this.$L=this.$L||g(e.locale,null,!0),this.parse(e)}var d=f.prototype;return d.parse=function(e){this.$d=function(e){var t=e.date,n=e.utc;if(null===t)return new Date(NaN);if(b.u(t))return new Date;if(t instanceof Date)return new Date(t);if("string"==typeof t&&!/Z$/i.test(t)){var r=t.match(c);if(r)return n?new Date(Date.UTC(r[1],r[2]-1,r[3]||1,r[4]||0,r[5]||0,r[6]||0,r[7]||0)):new Date(r[1],r[2]-1,r[3]||1,r[4]||0,r[5]||0,r[6]||0,r[7]||0)}return new Date(t)}(e),this.init()},d.init=function(){var e=this.$d;this.$y=e.getFullYear(),this.$M=e.getMonth(),this.$D=e.getDate(),this.$W=e.getDay(),this.$H=e.getHours(),this.$m=e.getMinutes(),this.$s=e.getSeconds(),this.$ms=e.getMilliseconds()},d.$utils=function(){return b},d.isValid=function(){return!("Invalid Date"===this.$d.toString())},d.isSame=function(e,t){var n=y(e);return this.startOf(t)<=n&&n<=this.endOf(t)},d.isAfter=function(e,t){return y(e)=0;d--){var p=o[d];"."===p?s(o,d):".."===p?(s(o,d),f++):f&&(s(o,d),f--)}if(!u)for(;f--;f)o.unshift("..");!u||""===o[0]||o[0]&&c(o[0])||o.unshift("");var h=o.join("/");return n&&"/"!==h.substr(-1)&&(h+="/"),h};function d(e){return e.valueOf?e.valueOf():Object.prototype.valueOf.call(e)}var p=function e(t,n){if(t===n)return!0;if(null==t||null==n)return!1;if(Array.isArray(t))return Array.isArray(n)&&t.length===n.length&&t.every((function(t,r){return e(t,n[r])}));if("object"==typeof t||"object"==typeof n){var r=d(t),o=d(n);return r!==t||o!==n?e(r,o):Object.keys(Object.assign({},t,n)).every((function(r){return e(t[r],n[r])}))}return!1};var h=function(e,t){if(!e)throw new Error("Invariant failed")};function m(e){return"/"===e.charAt(0)?e:"/"+e}function v(e){return"/"===e.charAt(0)?e.substr(1):e}function g(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function y(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function b(e){var t=e.pathname,n=e.search,r=e.hash,o=t||"/";return n&&"?"!==n&&(o+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(o+="#"===r.charAt(0)?r:"#"+r),o}function w(e,t,n,r){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",o=t.indexOf("#");-1!==o&&(r=t.substr(o),t=t.substr(0,o));var i=t.indexOf("?");return-1!==i&&(n=t.substr(i),t=t.substr(0,i)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e)).state=t:(void 0===(o=Object(l.a)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(i){throw i instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):i}return n&&(o.key=n),r?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=f(o.pathname,r.pathname)):o.pathname=r.pathname:o.pathname||(o.pathname="/"),o}function x(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,o){if(null!=e){var i="function"==typeof e?e(t,n):e;"string"==typeof i?"function"==typeof r?r(i,o):o(!0):o(!1!==i)}else o(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,r):n.push(r),f({action:"PUSH",location:r,index:t,entries:n})}}))},replace:function(e,t){var r=w(e,t,d(),g.location);s.confirmTransitionTo(r,"REPLACE",n,(function(e){e&&(g.entries[g.index]=r,f({action:"REPLACE",location:r}))}))},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=g.index+e;return t>=0&&ts&&a[f-1]===l[f+c-1];)--f;for(var d=s;d=f;--d){p=t.concat([d]);n[h+d-f]={op:"add",path:p,value:l[d]},r.push({op:"remove",path:p})}}(e,t,n,r);case o.Set:(function(e,t,n,r){var o=e.base,i=e.copy,a=0;o.forEach((function(e){if(!i.has(e)){var o=t.concat([a]);n.push({op:"remove",path:o,value:e}),r.unshift({op:"add",path:o,value:e})}a++})),a=0,i.forEach((function(e){if(!o.has(e)){var i=t.concat([a]);n.push({op:"add",path:i,value:e}),r.unshift({op:"remove",path:i,value:e})}a++}))})(e,t,n,r)}}(i,r,n.patches,n.inversePatches)}return i.copy}function z(e,t,n,i){var a=t[s];return a&&(a.type!==o.ES5Object&&a.type!==o.ES5Array||(a.copy=_(a.draft,!0)),t=a.copy),g(t,(function(o,u){return function e(t,n,o,i,a,u,l,c){if(l===a)throw Error("Immer forbids circular references");var s=!!i&&a===o,f=E(a);if(h(l)){var d=c&&s&&!f&&!b(i.assigned,u)?c.concat(u):void 0;l=I(t,l,n,d),function(e,t,n){switch(y(e)){case r.Map:e.set(t,n);break;case r.Set:e.delete(t),e.add(n);break;default:e[t]=n}}(a,u,l),h(l)&&(n.canAutoFreeze=!1)}else{if(s&&x(l,w(i.base,u)))return;m(l)&&(g(l,(function(r,a){return e(t,n,o,i,l,r,a,c)})),n.parent||j(t,l))}s&&t.onAssign&&!f&&t.onAssign(i,u,l)}(e,n,t,a,t,o,u,i)})),t}function j(e,t,n){void 0===n&&(n=!1),e.autoFreeze&&!h(t)&&T(t,n)}var A={get:function(e,t){if(t===s)return e;var n=e.drafts;if(!e.modified&&b(n,t))return n[t];var r=k(e)[t];if(e.finalized||!m(r))return r;if(e.modified){if(r!==L(e.base,t))return r;n=e.copy}return n[t]=e.scope.immer.createProxy(r,e)},has:function(e,t){return t in k(e)},ownKeys:function(e){return Reflect.ownKeys(k(e))},set:function(e,t,n){if(!e.modified){var r=L(e.base,t);if(n?x(r,n)||n===e.drafts[t]:x(r,n)&&t in e.base)return!0;F(e),D(e)}return e.assigned[t]=!0,e.copy[t]=n,!0},deleteProperty:function(e,t){return void 0!==L(e.base,t)||t in e.base?(e.assigned[t]=!1,F(e),D(e)):e.assigned[t]&&delete e.assigned[t],e.copy&&delete e.copy[t],!0},getOwnPropertyDescriptor:function(e,t){var n=k(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r&&(r.writable=!0,r.configurable=e.type!==o.ProxyArray||"length"!==t),r},defineProperty:function(){throw new Error("Object.defineProperty() cannot be used on an Immer draft")},getPrototypeOf:function(e){return Object.getPrototypeOf(e.base)},setPrototypeOf:function(){throw new Error("Object.setPrototypeOf() cannot be used on an Immer draft")}},N={};function L(e,t){var n=e[s],r=Reflect.getOwnPropertyDescriptor(n?k(n):e,t);return r&&r.value}function D(e){if(!e.modified){if(e.modified=!0,e.type===o.ProxyObject||e.type===o.ProxyArray){var t=e.copy=_(e.base);g(e.drafts,(function(e,n){t[e]=n})),e.drafts=void 0}e.parent&&D(e.parent)}}function F(e){e.copy||(e.copy=_(e.base))}function U(e,t,n){e.drafts.forEach((function(e){e[s].finalizing=!0})),n?h(t)&&t[s].scope===e&&G(e.drafts):(e.patches&&function e(t){if(!t||"object"!=typeof t)return;var n=t[s];if(!n)return;var r=n.base,i=n.draft,a=n.assigned,u=n.type;if(u===o.ES5Object)g(i,(function(t){t!==s&&(void 0!==r[t]||b(r,t)?a[t]||e(i[t]):(a[t]=!0,B(n)))})),g(r,(function(e){void 0!==i[e]||b(i,e)||(a[e]=!1,B(n))}));else if(u===o.ES5Array){if(Q(n)&&(B(n),a.length=!0),i.length=0;t--){var n=e[t][s];if(!n.modified)switch(n.type){case o.ES5Array:Q(n)&&B(n);break;case o.ES5Object:K(n)&&B(n)}}}function K(e){for(var t=e.base,n=e.draft,r=Object.keys(n),o=r.length-1;o>=0;o--){var i=r[o],a=t[i];if(void 0===a&&!b(t,i))return!0;var u=n[i],l=u&&u[s];if(l?l.base!==a:!x(u,a))return!0}return r.length!==Object.keys(t).length}function Q(e){var t=e.draft;if(t.length!==e.base.length)return!0;var n=Object.getOwnPropertyDescriptor(t,t.length-1);return!(!n||n.get)}var X=function(e){if(!e)throw new Error("Map is not polyfilled");function t(e,t){return this[s]={type:o.Map,parent:t,scope:t?t.scope:O.current,modified:!1,finalized:!1,copy:void 0,assigned:void 0,base:e,draft:this,isManual:!1,revoked:!1},this}p(t,e);var n=t.prototype;return Object.defineProperty(n,"size",{get:function(){return k(this[s]).size},enumerable:!0,configurable:!0}),n.has=function(e){return k(this[s]).has(e)},n.set=function(e,t){var n=this[s];return Y(n),k(n).get(e)!==t&&(J(n),n.scope.immer.markChanged(n),n.assigned.set(e,!0),n.copy.set(e,t),n.assigned.set(e,!0)),this},n.delete=function(e){if(!this.has(e))return!1;var t=this[s];return Y(t),J(t),t.scope.immer.markChanged(t),t.assigned.set(e,!1),t.copy.delete(e),!0},n.clear=function(){var e=this[s];return Y(e),J(e),e.scope.immer.markChanged(e),e.assigned=new Map,e.copy.clear()},n.forEach=function(e,t){var n=this;k(this[s]).forEach((function(r,o,i){e.call(t,n.get(o),o,n)}))},n.get=function(e){var t=this[s];Y(t);var n=k(t).get(e);if(t.finalized||!m(n))return n;if(n!==t.base.get(e))return n;var r=t.scope.immer.createProxy(n,t);return J(t),t.copy.set(e,r),r},n.keys=function(){return k(this[s]).keys()},n.values=function(){var e,t=this,n=this.keys();return(e={})[f]=function(){return t.values()},e.next=function(){var e=n.next();return e.done?e:{done:!1,value:t.get(e.value)}},e},n.entries=function(){var e,t=this,n=this.keys();return(e={})[f]=function(){return t.entries()},e.next=function(){var e=n.next();if(e.done)return e;var r=t.get(e.value);return{done:!1,value:[e.value,r]}},e},n[f]=function(){return this.entries()},t}(Map);function J(e){e.copy||(e.assigned=new Map,e.copy=new Map(e.base))}var Z=function(e){if(!e)throw new Error("Set is not polyfilled");function t(e,t){return this[s]={type:o.Set,parent:t,scope:t?t.scope:O.current,modified:!1,finalized:!1,copy:void 0,base:e,draft:this,drafts:new Map,revoked:!1,isManual:!1},this}p(t,e);var n=t.prototype;return Object.defineProperty(n,"size",{get:function(){return k(this[s]).size},enumerable:!0,configurable:!0}),n.has=function(e){var t=this[s];return Y(t),t.copy?!!t.copy.has(e)||!(!t.drafts.has(e)||!t.copy.has(t.drafts.get(e))):t.base.has(e)},n.add=function(e){var t=this[s];return Y(t),t.copy?t.copy.add(e):t.base.has(e)||(ee(t),t.scope.immer.markChanged(t),t.copy.add(e)),this},n.delete=function(e){if(!this.has(e))return!1;var t=this[s];return Y(t),ee(t),t.scope.immer.markChanged(t),t.copy.delete(e)||!!t.drafts.has(e)&&t.copy.delete(t.drafts.get(e))},n.clear=function(){var e=this[s];return Y(e),ee(e),e.scope.immer.markChanged(e),e.copy.clear()},n.values=function(){var e=this[s];return Y(e),ee(e),e.copy.values()},n.entries=function(){var e=this[s];return Y(e),ee(e),e.copy.entries()},n.keys=function(){return this.values()},n[f]=function(){return this.values()},n.forEach=function(e,t){for(var n=this.values(),r=n.next();!r.done;)e.call(t,r.value,r.value,this),r=n.next()},t}(Set);function ee(e){e.copy||(e.copy=new Set,e.base.forEach((function(t){if(m(t)){var n=e.scope.immer.createProxy(t,e);e.drafts.set(t,n),e.copy.add(n)}else e.copy.add(t)})))}function te(e,t){return t.forEach((function(t){var n=t.path,o=t.op;n.length||P();for(var i=e,a=0;a=0;n--){var r=t[n];if(0===r.path.length&&"replace"===r.op){e=r.value;break}}return h(e)?te(e,t):this.produce(e,(function(e){return te(e,t.slice(n+1))}))},e.prototype.createProxy=function(e,t){var n=S(e)?function(e,t){return new X(e,t)}(e,t):E(e)?function(e,t){return new Z(e,t)}(e,t):this.useProxies?function(e,t){var n=Array.isArray(e),r={type:n?o.ProxyArray:o.ProxyObject,scope:t?t.scope:O.current,modified:!1,finalized:!1,assigned:{},parent:t,base:e,draft:null,drafts:{},copy:null,revoke:null,isManual:!1},i=r,a=A;n&&(i=[r],a=N);var u=Proxy.revocable(i,a),l=u.revoke,c=u.proxy;return r.draft=c,r.revoke=l,c}(e,t):$(e,t);return(t?t.scope:O.current).drafts.push(n),n},e.prototype.willFinalize=function(e,t,n){this.useProxies||U(e,t,n)},e.prototype.markChanged=function(e){this.useProxies?D(e):B(e)},e}()),ae=ie.produce;ie.produceWithPatches.bind(ie),ie.setAutoFreeze.bind(ie),ie.setUseProxies.bind(ie),ie.applyPatches.bind(ie),ie.createDraft.bind(ie),ie.finishDraft.bind(ie);t.a=ae}).call(this,n(34))},function(e,t,n){"use strict";var r=Object.getOwnPropertySymbols,o=Object.prototype.hasOwnProperty,i=Object.prototype.propertyIsEnumerable;function a(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(o){return!1}}()?Object.assign:function(e,t){for(var n,u,l=a(e),c=1;c=200&&e<300}};l.headers={common:{Accept:"application/json, text/plain, */*"}},r.forEach(["delete","get","head"],(function(e){l.headers[e]={}})),r.forEach(["post","put","patch"],(function(e){l.headers[e]=r.merge(i)})),e.exports=l}).call(this,n(34))},function(e,t){var n,r,o=e.exports={};function i(){throw new Error("setTimeout has not been defined")}function a(){throw new Error("clearTimeout has not been defined")}function u(e){if(n===setTimeout)return setTimeout(e,0);if((n===i||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:i}catch(e){n=i}try{r="function"==typeof clearTimeout?clearTimeout:a}catch(e){r=a}}();var l,c=[],s=!1,f=-1;function d(){s&&l&&(s=!1,l.length?c=l.concat(c):f=-1,c.length&&p())}function p(){if(!s){var e=u(d);s=!0;for(var t=c.length;t;){for(l=c,c=[];++f1)for(var n=1;nM.length&&M.push(e)}function j(e,t,n){return null==e?0:function e(t,n,r,o){var u=typeof t;"undefined"!==u&&"boolean"!==u||(t=null);var l=!1;if(null===t)l=!0;else switch(u){case"string":case"number":l=!0;break;case"object":switch(t.$$typeof){case i:case a:l=!0}}if(l)return r(o,t,""===n?"."+A(t,0):n),1;if(l=0,n=""===n?".":n+":",Array.isArray(t))for(var c=0;c